From a961bc029201b72fc4923490aeb3d82781853e6a Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:51:56 +0500 Subject: [PATCH] feat: [Many APIs] Add REST Interceptors which support reading metadata (#13494) BEGIN_COMMIT_OVERRIDE feat: Add REST Interceptors which support reading metadata feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 END_COMMIT_OVERRIDE - [ ] Regenerate this pull request now. feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 PiperOrigin-RevId: 724026024 Source-Link: https://github.com/googleapis/googleapis/commit/ad9963857109513e77eed153a66264481789109f Source-Link: https://github.com/googleapis/googleapis-gen/commit/e291c4dd1d670eda19998de76f967e1603a48993 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFkcy1hZG1hbmFnZXIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFkcy1tYXJrZXRpbmdwbGF0Zm9ybS1hZG1pbi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFpLWdlbmVyYXRpdmVsYW5ndWFnZS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFuYWx5dGljcy1kYXRhLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFwcHMtY2FyZC8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFwcHMtY2hhdC8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFwcHMtZXZlbnRzLXN1YnNjcmlwdGlvbnMvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFwcHMtbWVldC8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFwcHMtc2NyaXB0LXR5cGUvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWFyZWExMjAtdGFibGVzLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFjY2Vzcy1hcHByb3ZhbC8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFkdmlzb3J5bm90aWZpY2F0aW9ucy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFsbG95ZGItY29ubmVjdG9ycy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFsbG95ZGIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFwaS1nYXRld2F5Ly5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFwaS1rZXlzLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFwaWdlZS1jb25uZWN0Ly5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFwaWdlZS1yZWdpc3RyeS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFwaWh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLWFwcGVuZ2luZS1hZG1pbi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 --------- Co-authored-by: Owl Bot Co-authored-by: ohmayr --- .../google/ads/admanager/gapic_version.py | 2 +- .../google/ads/admanager_v1/gapic_version.py | 2 +- .../services/ad_unit_service/client.py | 51 +- .../ad_unit_service/transports/rest.py | 97 +- .../services/company_service/client.py | 51 +- .../company_service/transports/rest.py | 64 +- .../services/custom_field_service/client.py | 51 +- .../custom_field_service/transports/rest.py | 67 +- .../custom_targeting_key_service/client.py | 51 +- .../transports/rest.py | 68 +- .../custom_targeting_value_service/client.py | 51 +- .../transports/rest.py | 68 +- .../entity_signals_mapping_service/client.py | 51 +- .../transports/rest.py | 216 +++- .../services/network_service/client.py | 51 +- .../network_service/transports/rest.py | 64 +- .../services/order_service/client.py | 51 +- .../services/order_service/transports/rest.py | 64 +- .../services/placement_service/client.py | 51 +- .../placement_service/transports/rest.py | 65 +- .../services/report_service/client.py | 51 +- .../report_service/transports/rest.py | 191 ++- .../services/role_service/client.py | 51 +- .../services/role_service/transports/rest.py | 62 +- .../taxonomy_category_service/client.py | 51 +- .../transports/rest.py | 68 +- .../services/user_service/client.py | 51 +- .../services/user_service/transports/rest.py | 31 +- ...ppet_metadata_google.ads.admanager.v1.json | 2 +- .../admanager_v1/test_ad_unit_service.py | 71 ++ .../admanager_v1/test_company_service.py | 63 + .../admanager_v1/test_custom_field_service.py | 65 + .../test_custom_targeting_key_service.py | 68 ++ .../test_custom_targeting_value_service.py | 68 ++ .../test_entity_signals_mapping_service.py | 104 ++ .../admanager_v1/test_network_service.py | 63 + .../gapic/admanager_v1/test_order_service.py | 60 + .../admanager_v1/test_placement_service.py | 63 + .../gapic/admanager_v1/test_report_service.py | 84 ++ .../gapic/admanager_v1/test_role_service.py | 60 + .../test_taxonomy_category_service.py | 68 ++ .../gapic/admanager_v1/test_user_service.py | 55 + .../marketingplatform_admin/gapic_version.py | 2 +- .../gapic_version.py | 2 +- .../marketingplatform_admin_service/client.py | 29 + .../transports/rest.py | 133 ++- ...oogle.marketingplatform.admin.v1alpha.json | 2 +- .../test_marketingplatform_admin_service.py | 80 ++ .../ai/generativelanguage/gapic_version.py | 2 +- .../ai/generativelanguage_v1/gapic_version.py | 2 +- .../services/generative_service/client.py | 73 +- .../generative_service/transports/rest.py | 167 ++- .../services/model_service/client.py | 73 +- .../services/model_service/transports/rest.py | 62 +- .../gapic_version.py | 2 +- .../services/cache_service/client.py | 73 +- .../services/cache_service/transports/rest.py | 131 +- .../services/discuss_service/client.py | 73 +- .../discuss_service/transports/rest.py | 67 +- .../services/file_service/client.py | 73 +- .../services/file_service/transports/rest.py | 93 +- .../services/generative_service/client.py | 73 +- .../generative_service/transports/rest.py | 201 +++- .../services/model_service/client.py | 73 +- .../services/model_service/transports/rest.py | 188 ++- .../services/permission_service/client.py | 73 +- .../permission_service/transports/rest.py | 161 ++- .../services/prediction_service/client.py | 73 +- .../prediction_service/transports/rest.py | 33 +- .../services/retriever_service/client.py | 73 +- .../retriever_service/transports/rest.py | 512 +++++++- .../services/text_service/client.py | 73 +- .../services/text_service/transports/rest.py | 130 +- .../gapic_version.py | 2 +- .../services/cache_service/client.py | 73 +- .../services/cache_service/transports/rest.py | 131 +- .../services/discuss_service/client.py | 73 +- .../discuss_service/transports/rest.py | 67 +- .../services/file_service/client.py | 73 +- .../services/file_service/transports/rest.py | 93 +- .../services/generative_service/client.py | 73 +- .../generative_service/transports/rest.py | 201 +++- .../services/model_service/client.py | 73 +- .../services/model_service/transports/rest.py | 188 ++- .../services/permission_service/client.py | 73 +- .../permission_service/transports/rest.py | 161 ++- .../services/prediction_service/client.py | 73 +- .../prediction_service/transports/rest.py | 33 +- .../services/retriever_service/client.py | 73 +- .../retriever_service/transports/rest.py | 512 +++++++- .../services/text_service/client.py | 73 +- .../services/text_service/transports/rest.py | 130 +- .../gapic_version.py | 2 +- .../services/discuss_service/client.py | 29 + .../discuss_service/transports/rest.py | 67 +- .../services/model_service/client.py | 29 + .../services/model_service/transports/rest.py | 62 +- .../services/text_service/client.py | 29 + .../services/text_service/transports/rest.py | 64 +- .../gapic_version.py | 2 +- .../services/discuss_service/client.py | 29 + .../discuss_service/transports/rest.py | 67 +- .../services/model_service/client.py | 29 + .../services/model_service/transports/rest.py | 188 ++- .../services/permission_service/client.py | 29 + .../permission_service/transports/rest.py | 161 ++- .../services/text_service/client.py | 29 + .../services/text_service/transports/rest.py | 130 +- ...adata_google.ai.generativelanguage.v1.json | 2 +- ..._google.ai.generativelanguage.v1alpha.json | 2 +- ...a_google.ai.generativelanguage.v1beta.json | 2 +- ..._google.ai.generativelanguage.v1beta2.json | 2 +- ..._google.ai.generativelanguage.v1beta3.json | 2 +- .../test_generative_service.py | 93 ++ .../test_model_service.py | 60 + .../test_cache_service.py | 76 ++ .../test_discuss_service.py | 67 ++ .../test_file_service.py | 65 + .../test_generative_service.py | 102 ++ .../test_model_service.py | 83 ++ .../test_permission_service.py | 85 ++ .../test_prediction_service.py | 55 + .../test_retriever_service.py | 153 +++ .../test_text_service.py | 76 ++ .../test_cache_service.py | 76 ++ .../test_discuss_service.py | 67 ++ .../test_file_service.py | 65 + .../test_generative_service.py | 102 ++ .../test_model_service.py | 83 ++ .../test_permission_service.py | 85 ++ .../test_prediction_service.py | 55 + .../test_retriever_service.py | 153 +++ .../test_text_service.py | 76 ++ .../test_discuss_service.py | 67 ++ .../test_model_service.py | 60 + .../test_text_service.py | 60 + .../test_discuss_service.py | 67 ++ .../test_model_service.py | 83 ++ .../test_permission_service.py | 85 ++ .../test_text_service.py | 76 ++ .../google/analytics/data/gapic_version.py | 2 +- .../analytics/data_v1alpha/gapic_version.py | 2 +- .../services/alpha_analytics_data/client.py | 29 + .../alpha_analytics_data/transports/rest.py | 472 +++++++- .../analytics/data_v1beta/gapic_version.py | 2 +- .../services/beta_analytics_data/client.py | 29 + .../beta_analytics_data/transports/rest.py | 366 +++++- ...etadata_google.analytics.data.v1alpha.json | 2 +- ...metadata_google.analytics.data.v1beta.json | 2 +- .../data_v1alpha/test_alpha_analytics_data.py | 164 +++ .../data_v1beta/test_beta_analytics_data.py | 138 +++ .../google/apps/card/gapic_version.py | 2 +- .../google/apps/card_v1/gapic_version.py | 2 +- .../google/apps/chat/gapic_version.py | 2 +- .../google/apps/chat_v1/gapic_version.py | 2 +- .../chat_v1/services/chat_service/client.py | 29 + .../services/chat_service/transports/rest.py | 814 ++++++++++++- .../snippet_metadata_google.chat.v1.json | 2 +- .../unit/gapic/chat_v1/test_chat_service.py | 189 +++ .../events_subscriptions/gapic_version.py | 2 +- .../events_subscriptions_v1/gapic_version.py | 2 +- .../services/subscriptions_service/client.py | 51 +- .../subscriptions_service/transports/rest.py | 191 ++- ...a_google.apps.events.subscriptions.v1.json | 2 +- .../test_subscriptions_service.py | 89 ++ .../google/apps/meet/gapic_version.py | 2 +- .../google/apps/meet_v2/gapic_version.py | 2 +- .../conference_records_service/client.py | 29 + .../transports/rest.py | 382 +++++- .../meet_v2/services/spaces_service/client.py | 29 + .../spaces_service/transports/rest.py | 93 +- .../google/apps/meet_v2beta/gapic_version.py | 2 +- .../conference_records_service/client.py | 29 + .../transports/rest.py | 382 +++++- .../services/spaces_service/client.py | 29 + .../spaces_service/transports/rest.py | 186 ++- .../snippet_metadata_google.apps.meet.v2.json | 2 +- ...ppet_metadata_google.apps.meet.v2beta.json | 2 +- .../test_conference_records_service.py | 131 ++ .../unit/gapic/meet_v2/test_spaces_service.py | 65 + .../test_conference_records_service.py | 131 ++ .../gapic/meet_v2beta/test_spaces_service.py | 80 ++ .../script/type/calendar/gapic_version.py | 2 +- .../apps/script/type/docs/gapic_version.py | 2 +- .../apps/script/type/drive/gapic_version.py | 2 +- .../google/apps/script/type/gapic_version.py | 2 +- .../apps/script/type/gmail/gapic_version.py | 2 +- .../apps/script/type/sheets/gapic_version.py | 2 +- .../apps/script/type/slides/gapic_version.py | 2 +- .../google/area120/tables/gapic_version.py | 2 +- .../area120/tables_v1alpha1/gapic_version.py | 2 +- .../services/tables_service/client.py | 29 + .../tables_service/transports/rest.py | 302 ++++- ...tadata_google.area120.tables.v1alpha1.json | 2 +- .../tables_v1alpha1/test_tables_service.py | 100 ++ .../cloud/accessapproval/gapic_version.py | 2 +- .../cloud/accessapproval_v1/gapic_version.py | 2 +- .../services/access_approval/client.py | 29 + .../access_approval/transports/rest.py | 264 +++- ...tadata_google.cloud.accessapproval.v1.json | 2 +- .../accessapproval_v1/test_access_approval.py | 110 ++ .../advisorynotifications/gapic_version.py | 2 +- .../advisorynotifications_v1/gapic_version.py | 2 +- .../advisory_notifications_service/client.py | 29 + .../transports/rest.py | 126 +- ...google.cloud.advisorynotifications.v1.json | 2 +- .../test_advisory_notifications_service.py | 74 ++ .../cloud/alloydb/connectors/gapic_version.py | 2 +- .../alloydb/connectors_v1/gapic_version.py | 2 +- .../google/cloud/alloydb/gapic_version.py | 2 +- .../google/cloud/alloydb_v1/gapic_version.py | 2 +- .../services/alloy_db_admin/client.py | 117 +- .../alloy_db_admin/transports/rest.py | 1032 +++++++++++++++- .../cloud/alloydb_v1alpha/gapic_version.py | 2 +- .../services/alloy_db_admin/client.py | 117 +- .../alloy_db_admin/transports/rest.py | 1063 +++++++++++++++-- .../cloud/alloydb_v1beta/gapic_version.py | 2 +- .../services/alloy_db_admin/client.py | 117 +- .../alloy_db_admin/transports/rest.py | 1063 +++++++++++++++-- ...ppet_metadata_google.cloud.alloydb.v1.json | 2 +- ...metadata_google.cloud.alloydb.v1alpha.json | 2 +- ..._metadata_google.cloud.alloydb.v1beta.json | 2 +- .../gapic/alloydb_v1/test_alloy_db_admin.py | 226 ++++ .../alloydb_v1alpha/test_alloy_db_admin.py | 231 ++++ .../alloydb_v1beta/test_alloy_db_admin.py | 231 ++++ .../google/cloud/apigateway/gapic_version.py | 2 +- .../cloud/apigateway_v1/gapic_version.py | 2 +- .../services/api_gateway_service/client.py | 29 + .../api_gateway_service/transports/rest.py | 469 +++++++- ...t_metadata_google.cloud.apigateway.v1.json | 2 +- .../apigateway_v1/test_api_gateway_service.py | 129 ++ .../google/cloud/api_keys/gapic_version.py | 2 +- .../google/cloud/api_keys_v2/gapic_version.py | 2 +- .../api_keys_v2/services/api_keys/client.py | 51 +- .../services/api_keys/transports/rest.py | 246 +++- ...nippet_metadata_google.api.apikeys.v2.json | 2 +- .../unit/gapic/api_keys_v2/test_api_keys.py | 90 ++ .../cloud/apigeeconnect/gapic_version.py | 2 +- .../cloud/apigeeconnect_v1/gapic_version.py | 2 +- .../services/connection_service/client.py | 29 + .../services/tether/client.py | 29 + ...etadata_google.cloud.apigeeconnect.v1.json | 2 +- .../test_connection_service.py | 51 + .../gapic/apigeeconnect_v1/test_tether.py | 51 + .../cloud/apigee_registry/gapic_version.py | 2 +- .../cloud/apigee_registry_v1/gapic_version.py | 2 +- .../services/provisioning/client.py | 183 ++- .../services/provisioning/transports/rest.py | 93 +- .../services/registry/client.py | 183 ++- .../services/registry/transports/rest.py | 954 ++++++++++++++- ...tadata_google.cloud.apigeeregistry.v1.json | 2 +- .../apigee_registry_v1/test_provisioning.py | 65 + .../gapic/apigee_registry_v1/test_registry.py | 222 ++++ .../google/cloud/apihub/gapic_version.py | 2 +- .../google/cloud/apihub_v1/gapic_version.py | 2 +- .../apihub_v1/services/api_hub/client.py | 117 +- .../services/api_hub/transports/rest.py | 916 +++++++++++++- .../services/api_hub_dependencies/client.py | 117 +- .../api_hub_dependencies/transports/rest.py | 126 +- .../services/api_hub_plugin/client.py | 117 +- .../api_hub_plugin/transports/rest.py | 93 +- .../client.py | 117 +- .../transports/rest.py | 111 +- .../services/linting_service/client.py | 117 +- .../linting_service/transports/rest.py | 95 +- .../apihub_v1/services/provisioning/client.py | 117 +- .../services/provisioning/transports/rest.py | 96 +- .../client.py | 117 +- .../transports/rest.py | 148 ++- ...ippet_metadata_google.cloud.apihub.v1.json | 2 +- .../unit/gapic/apihub_v1/test_api_hub.py | 213 ++++ .../apihub_v1/test_api_hub_dependencies.py | 77 ++ .../gapic/apihub_v1/test_api_hub_plugin.py | 65 + .../test_host_project_registration_service.py | 77 ++ .../gapic/apihub_v1/test_linting_service.py | 67 ++ .../unit/gapic/apihub_v1/test_provisioning.py | 71 ++ ...test_runtime_project_attachment_service.py | 86 ++ .../cloud/appengine_admin/gapic_version.py | 2 +- .../cloud/appengine_admin_v1/gapic_version.py | 2 +- .../services/applications/client.py | 29 + .../services/applications/transports/rest.py | 124 +- .../authorized_certificates/client.py | 29 + .../transports/rest.py | 139 ++- .../services/authorized_domains/client.py | 29 + .../authorized_domains/transports/rest.py | 33 +- .../services/domain_mappings/client.py | 29 + .../domain_mappings/transports/rest.py | 157 ++- .../services/firewall/client.py | 29 + .../services/firewall/transports/rest.py | 160 ++- .../services/instances/client.py | 29 + .../services/instances/transports/rest.py | 126 +- .../services/services/client.py | 29 + .../services/services/transports/rest.py | 124 +- .../services/versions/client.py | 29 + .../services/versions/transports/rest.py | 155 ++- .../snippet_metadata_google.appengine.v1.json | 2 +- .../appengine_admin_v1/test_applications.py | 70 ++ .../test_authorized_certificates.py | 77 ++ .../test_authorized_domains.py | 59 + .../test_domain_mappings.py | 83 ++ .../gapic/appengine_admin_v1/test_firewall.py | 79 ++ .../appengine_admin_v1/test_instances.py | 70 ++ .../gapic/appengine_admin_v1/test_services.py | 70 ++ .../gapic/appengine_admin_v1/test_versions.py | 75 ++ 304 files changed, 25987 insertions(+), 2083 deletions(-) diff --git a/packages/google-ads-admanager/google/ads/admanager/gapic_version.py b/packages/google-ads-admanager/google/ads/admanager/gapic_version.py index 355df6b536f8..558c8aab67c5 100644 --- a/packages/google-ads-admanager/google/ads/admanager/gapic_version.py +++ b/packages/google-ads-admanager/google/ads/admanager/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.3" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/gapic_version.py b/packages/google-ads-admanager/google/ads/admanager_v1/gapic_version.py index 355df6b536f8..558c8aab67c5 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/gapic_version.py +++ b/packages/google-ads-admanager/google/ads/admanager_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.3" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/client.py index e64a74862298..0f390bb76c34 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_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. @@ -1126,16 +1155,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-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/transports/rest.py index e82b2eb5f252..f5e70c65d36d 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/ad_unit_service/transports/rest.py @@ -118,12 +118,35 @@ def post_get_ad_unit( ) -> ad_unit_messages.AdUnit: """Post-rpc interceptor for get_ad_unit - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ad_unit_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdUnitService server but before - it is returned to user code. + it is returned to user code. This `post_get_ad_unit` interceptor runs + before the `post_get_ad_unit_with_metadata` interceptor. """ return response + def post_get_ad_unit_with_metadata( + self, + response: ad_unit_messages.AdUnit, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ad_unit_messages.AdUnit, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ad_unit + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdUnitService server but before it is returned to user code. + + We recommend only using this `post_get_ad_unit_with_metadata` + interceptor in new development instead of the `post_get_ad_unit` interceptor. + When both interceptors are used, this `post_get_ad_unit_with_metadata` interceptor runs after the + `post_get_ad_unit` interceptor. The (possibly modified) response returned by + `post_get_ad_unit` will be passed to + `post_get_ad_unit_with_metadata`. + """ + return response, metadata + def pre_list_ad_units( self, request: ad_unit_service.ListAdUnitsRequest, @@ -143,12 +166,37 @@ def post_list_ad_units( ) -> ad_unit_service.ListAdUnitsResponse: """Post-rpc interceptor for list_ad_units - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_ad_units_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdUnitService server but before - it is returned to user code. + it is returned to user code. This `post_list_ad_units` interceptor runs + before the `post_list_ad_units_with_metadata` interceptor. """ return response + def post_list_ad_units_with_metadata( + self, + response: ad_unit_service.ListAdUnitsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + ad_unit_service.ListAdUnitsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_ad_units + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdUnitService server but before it is returned to user code. + + We recommend only using this `post_list_ad_units_with_metadata` + interceptor in new development instead of the `post_list_ad_units` interceptor. + When both interceptors are used, this `post_list_ad_units_with_metadata` interceptor runs after the + `post_list_ad_units` interceptor. The (possibly modified) response returned by + `post_list_ad_units` will be passed to + `post_list_ad_units_with_metadata`. + """ + return response, metadata + def pre_list_ad_unit_sizes( self, request: ad_unit_service.ListAdUnitSizesRequest, @@ -168,12 +216,37 @@ def post_list_ad_unit_sizes( ) -> ad_unit_service.ListAdUnitSizesResponse: """Post-rpc interceptor for list_ad_unit_sizes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_ad_unit_sizes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdUnitService server but before - it is returned to user code. + it is returned to user code. This `post_list_ad_unit_sizes` interceptor runs + before the `post_list_ad_unit_sizes_with_metadata` interceptor. """ return response + def post_list_ad_unit_sizes_with_metadata( + self, + response: ad_unit_service.ListAdUnitSizesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + ad_unit_service.ListAdUnitSizesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_ad_unit_sizes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdUnitService server but before it is returned to user code. + + We recommend only using this `post_list_ad_unit_sizes_with_metadata` + interceptor in new development instead of the `post_list_ad_unit_sizes` interceptor. + When both interceptors are used, this `post_list_ad_unit_sizes_with_metadata` interceptor runs after the + `post_list_ad_unit_sizes` interceptor. The (possibly modified) response returned by + `post_list_ad_unit_sizes` will be passed to + `post_list_ad_unit_sizes_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -407,6 +480,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ad_unit(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ad_unit_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -553,6 +630,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_ad_units(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_ad_units_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -701,6 +782,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_ad_unit_sizes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_ad_unit_sizes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/company_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/company_service/client.py index 6ae632c4105b..87775fc8661a 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/company_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/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 @@ -554,6 +556,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. @@ -1028,16 +1057,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-ads-admanager/google/ads/admanager_v1/services/company_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/company_service/transports/rest.py index 99607ae444c1..268351452a69 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/company_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/company_service/transports/rest.py @@ -110,12 +110,35 @@ def post_get_company( ) -> company_messages.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_messages.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[company_messages.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, @@ -135,12 +158,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_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -372,6 +420,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 @@ -514,6 +566,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 diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_service/client.py index 70d1153c5851..93528e67de0d 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_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 @@ -498,6 +500,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. @@ -983,16 +1012,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-ads-admanager/google/ads/admanager_v1/services/custom_field_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_service/transports/rest.py index 4f302464ca68..5c619820e4ee 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_field_service/transports/rest.py @@ -111,12 +111,37 @@ def post_get_custom_field( ) -> custom_field_messages.CustomField: """Post-rpc interceptor for get_custom_field - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_custom_field_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CustomFieldService server but before - it is returned to user code. + it is returned to user code. This `post_get_custom_field` interceptor runs + before the `post_get_custom_field_with_metadata` interceptor. """ return response + def post_get_custom_field_with_metadata( + self, + response: custom_field_messages.CustomField, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + custom_field_messages.CustomField, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_custom_field + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CustomFieldService server but before it is returned to user code. + + We recommend only using this `post_get_custom_field_with_metadata` + interceptor in new development instead of the `post_get_custom_field` interceptor. + When both interceptors are used, this `post_get_custom_field_with_metadata` interceptor runs after the + `post_get_custom_field` interceptor. The (possibly modified) response returned by + `post_get_custom_field` will be passed to + `post_get_custom_field_with_metadata`. + """ + return response, metadata + def pre_list_custom_fields( self, request: custom_field_service.ListCustomFieldsRequest, @@ -137,12 +162,38 @@ def post_list_custom_fields( ) -> custom_field_service.ListCustomFieldsResponse: """Post-rpc interceptor for list_custom_fields - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_custom_fields_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CustomFieldService server but before - it is returned to user code. + it is returned to user code. This `post_list_custom_fields` interceptor runs + before the `post_list_custom_fields_with_metadata` interceptor. """ return response + def post_list_custom_fields_with_metadata( + self, + response: custom_field_service.ListCustomFieldsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + custom_field_service.ListCustomFieldsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_custom_fields + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CustomFieldService server but before it is returned to user code. + + We recommend only using this `post_list_custom_fields_with_metadata` + interceptor in new development instead of the `post_list_custom_fields` interceptor. + When both interceptors are used, this `post_list_custom_fields_with_metadata` interceptor runs after the + `post_list_custom_fields` interceptor. The (possibly modified) response returned by + `post_list_custom_fields` will be passed to + `post_list_custom_fields_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -377,6 +428,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_custom_field(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_custom_field_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -524,6 +579,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_custom_fields(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_custom_fields_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/client.py index fd79c9e1f297..7a3022f44e7b 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_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 @@ -503,6 +505,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. @@ -997,16 +1026,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-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/transports/rest.py index cfb4d42815d2..61e566af21c2 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_key_service/transports/rest.py @@ -114,12 +114,38 @@ def post_get_custom_targeting_key( ) -> custom_targeting_key_messages.CustomTargetingKey: """Post-rpc interceptor for get_custom_targeting_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_custom_targeting_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CustomTargetingKeyService server but before - it is returned to user code. + it is returned to user code. This `post_get_custom_targeting_key` interceptor runs + before the `post_get_custom_targeting_key_with_metadata` interceptor. """ return response + def post_get_custom_targeting_key_with_metadata( + self, + response: custom_targeting_key_messages.CustomTargetingKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + custom_targeting_key_messages.CustomTargetingKey, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_custom_targeting_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CustomTargetingKeyService server but before it is returned to user code. + + We recommend only using this `post_get_custom_targeting_key_with_metadata` + interceptor in new development instead of the `post_get_custom_targeting_key` interceptor. + When both interceptors are used, this `post_get_custom_targeting_key_with_metadata` interceptor runs after the + `post_get_custom_targeting_key` interceptor. The (possibly modified) response returned by + `post_get_custom_targeting_key` will be passed to + `post_get_custom_targeting_key_with_metadata`. + """ + return response, metadata + def pre_list_custom_targeting_keys( self, request: custom_targeting_key_service.ListCustomTargetingKeysRequest, @@ -140,12 +166,38 @@ def post_list_custom_targeting_keys( ) -> custom_targeting_key_service.ListCustomTargetingKeysResponse: """Post-rpc interceptor for list_custom_targeting_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_custom_targeting_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CustomTargetingKeyService server but before - it is returned to user code. + it is returned to user code. This `post_list_custom_targeting_keys` interceptor runs + before the `post_list_custom_targeting_keys_with_metadata` interceptor. """ return response + def post_list_custom_targeting_keys_with_metadata( + self, + response: custom_targeting_key_service.ListCustomTargetingKeysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + custom_targeting_key_service.ListCustomTargetingKeysResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_custom_targeting_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CustomTargetingKeyService server but before it is returned to user code. + + We recommend only using this `post_list_custom_targeting_keys_with_metadata` + interceptor in new development instead of the `post_list_custom_targeting_keys` interceptor. + When both interceptors are used, this `post_list_custom_targeting_keys_with_metadata` interceptor runs after the + `post_list_custom_targeting_keys` interceptor. The (possibly modified) response returned by + `post_list_custom_targeting_keys` will be passed to + `post_list_custom_targeting_keys_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -380,6 +432,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_custom_targeting_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_custom_targeting_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -534,6 +590,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_custom_targeting_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_custom_targeting_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/client.py index eb982112d026..881de1ec24e3 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_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 @@ -512,6 +514,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. @@ -1013,16 +1042,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-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/transports/rest.py index 1528b6133e5e..1177b344ce46 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/custom_targeting_value_service/transports/rest.py @@ -114,12 +114,38 @@ def post_get_custom_targeting_value( ) -> custom_targeting_value_messages.CustomTargetingValue: """Post-rpc interceptor for get_custom_targeting_value - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_custom_targeting_value_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CustomTargetingValueService server but before - it is returned to user code. + it is returned to user code. This `post_get_custom_targeting_value` interceptor runs + before the `post_get_custom_targeting_value_with_metadata` interceptor. """ return response + def post_get_custom_targeting_value_with_metadata( + self, + response: custom_targeting_value_messages.CustomTargetingValue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + custom_targeting_value_messages.CustomTargetingValue, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_custom_targeting_value + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CustomTargetingValueService server but before it is returned to user code. + + We recommend only using this `post_get_custom_targeting_value_with_metadata` + interceptor in new development instead of the `post_get_custom_targeting_value` interceptor. + When both interceptors are used, this `post_get_custom_targeting_value_with_metadata` interceptor runs after the + `post_get_custom_targeting_value` interceptor. The (possibly modified) response returned by + `post_get_custom_targeting_value` will be passed to + `post_get_custom_targeting_value_with_metadata`. + """ + return response, metadata + def pre_list_custom_targeting_values( self, request: custom_targeting_value_service.ListCustomTargetingValuesRequest, @@ -140,12 +166,38 @@ def post_list_custom_targeting_values( ) -> custom_targeting_value_service.ListCustomTargetingValuesResponse: """Post-rpc interceptor for list_custom_targeting_values - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_custom_targeting_values_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CustomTargetingValueService server but before - it is returned to user code. + it is returned to user code. This `post_list_custom_targeting_values` interceptor runs + before the `post_list_custom_targeting_values_with_metadata` interceptor. """ return response + def post_list_custom_targeting_values_with_metadata( + self, + response: custom_targeting_value_service.ListCustomTargetingValuesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + custom_targeting_value_service.ListCustomTargetingValuesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_custom_targeting_values + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CustomTargetingValueService server but before it is returned to user code. + + We recommend only using this `post_list_custom_targeting_values_with_metadata` + interceptor in new development instead of the `post_list_custom_targeting_values` interceptor. + When both interceptors are used, this `post_list_custom_targeting_values_with_metadata` interceptor runs after the + `post_list_custom_targeting_values` interceptor. The (possibly modified) response returned by + `post_list_custom_targeting_values` will be passed to + `post_list_custom_targeting_values_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -383,6 +435,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_custom_targeting_value(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_custom_targeting_value_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -539,6 +595,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_custom_targeting_values(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_custom_targeting_values_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/client.py index f8a09d16a91a..7a84529a19c4 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_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 @@ -503,6 +505,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 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-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/transports/rest.py index 7883b1005e15..43d89cdcce16 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/entity_signals_mapping_service/transports/rest.py @@ -147,12 +147,38 @@ def post_batch_create_entity_signals_mappings( ) -> entity_signals_mapping_service.BatchCreateEntitySignalsMappingsResponse: """Post-rpc interceptor for batch_create_entity_signals_mappings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_entity_signals_mappings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EntitySignalsMappingService server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_entity_signals_mappings` interceptor runs + before the `post_batch_create_entity_signals_mappings_with_metadata` interceptor. """ return response + def post_batch_create_entity_signals_mappings_with_metadata( + self, + response: entity_signals_mapping_service.BatchCreateEntitySignalsMappingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + entity_signals_mapping_service.BatchCreateEntitySignalsMappingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_create_entity_signals_mappings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EntitySignalsMappingService server but before it is returned to user code. + + We recommend only using this `post_batch_create_entity_signals_mappings_with_metadata` + interceptor in new development instead of the `post_batch_create_entity_signals_mappings` interceptor. + When both interceptors are used, this `post_batch_create_entity_signals_mappings_with_metadata` interceptor runs after the + `post_batch_create_entity_signals_mappings` interceptor. The (possibly modified) response returned by + `post_batch_create_entity_signals_mappings` will be passed to + `post_batch_create_entity_signals_mappings_with_metadata`. + """ + return response, metadata + def pre_batch_update_entity_signals_mappings( self, request: entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsRequest, @@ -174,12 +200,38 @@ def post_batch_update_entity_signals_mappings( ) -> entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsResponse: """Post-rpc interceptor for batch_update_entity_signals_mappings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_entity_signals_mappings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EntitySignalsMappingService server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_entity_signals_mappings` interceptor runs + before the `post_batch_update_entity_signals_mappings_with_metadata` interceptor. """ return response + def post_batch_update_entity_signals_mappings_with_metadata( + self, + response: entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_update_entity_signals_mappings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EntitySignalsMappingService server but before it is returned to user code. + + We recommend only using this `post_batch_update_entity_signals_mappings_with_metadata` + interceptor in new development instead of the `post_batch_update_entity_signals_mappings` interceptor. + When both interceptors are used, this `post_batch_update_entity_signals_mappings_with_metadata` interceptor runs after the + `post_batch_update_entity_signals_mappings` interceptor. The (possibly modified) response returned by + `post_batch_update_entity_signals_mappings` will be passed to + `post_batch_update_entity_signals_mappings_with_metadata`. + """ + return response, metadata + def pre_create_entity_signals_mapping( self, request: entity_signals_mapping_service.CreateEntitySignalsMappingRequest, @@ -200,12 +252,38 @@ def post_create_entity_signals_mapping( ) -> entity_signals_mapping_messages.EntitySignalsMapping: """Post-rpc interceptor for create_entity_signals_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_entity_signals_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EntitySignalsMappingService server but before - it is returned to user code. + it is returned to user code. This `post_create_entity_signals_mapping` interceptor runs + before the `post_create_entity_signals_mapping_with_metadata` interceptor. """ return response + def post_create_entity_signals_mapping_with_metadata( + self, + response: entity_signals_mapping_messages.EntitySignalsMapping, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + entity_signals_mapping_messages.EntitySignalsMapping, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_entity_signals_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EntitySignalsMappingService server but before it is returned to user code. + + We recommend only using this `post_create_entity_signals_mapping_with_metadata` + interceptor in new development instead of the `post_create_entity_signals_mapping` interceptor. + When both interceptors are used, this `post_create_entity_signals_mapping_with_metadata` interceptor runs after the + `post_create_entity_signals_mapping` interceptor. The (possibly modified) response returned by + `post_create_entity_signals_mapping` will be passed to + `post_create_entity_signals_mapping_with_metadata`. + """ + return response, metadata + def pre_get_entity_signals_mapping( self, request: entity_signals_mapping_service.GetEntitySignalsMappingRequest, @@ -226,12 +304,38 @@ def post_get_entity_signals_mapping( ) -> entity_signals_mapping_messages.EntitySignalsMapping: """Post-rpc interceptor for get_entity_signals_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_entity_signals_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EntitySignalsMappingService server but before - it is returned to user code. + it is returned to user code. This `post_get_entity_signals_mapping` interceptor runs + before the `post_get_entity_signals_mapping_with_metadata` interceptor. """ return response + def post_get_entity_signals_mapping_with_metadata( + self, + response: entity_signals_mapping_messages.EntitySignalsMapping, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + entity_signals_mapping_messages.EntitySignalsMapping, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_entity_signals_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EntitySignalsMappingService server but before it is returned to user code. + + We recommend only using this `post_get_entity_signals_mapping_with_metadata` + interceptor in new development instead of the `post_get_entity_signals_mapping` interceptor. + When both interceptors are used, this `post_get_entity_signals_mapping_with_metadata` interceptor runs after the + `post_get_entity_signals_mapping` interceptor. The (possibly modified) response returned by + `post_get_entity_signals_mapping` will be passed to + `post_get_entity_signals_mapping_with_metadata`. + """ + return response, metadata + def pre_list_entity_signals_mappings( self, request: entity_signals_mapping_service.ListEntitySignalsMappingsRequest, @@ -252,12 +356,38 @@ def post_list_entity_signals_mappings( ) -> entity_signals_mapping_service.ListEntitySignalsMappingsResponse: """Post-rpc interceptor for list_entity_signals_mappings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_entity_signals_mappings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EntitySignalsMappingService server but before - it is returned to user code. + it is returned to user code. This `post_list_entity_signals_mappings` interceptor runs + before the `post_list_entity_signals_mappings_with_metadata` interceptor. """ return response + def post_list_entity_signals_mappings_with_metadata( + self, + response: entity_signals_mapping_service.ListEntitySignalsMappingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + entity_signals_mapping_service.ListEntitySignalsMappingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_entity_signals_mappings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EntitySignalsMappingService server but before it is returned to user code. + + We recommend only using this `post_list_entity_signals_mappings_with_metadata` + interceptor in new development instead of the `post_list_entity_signals_mappings` interceptor. + When both interceptors are used, this `post_list_entity_signals_mappings_with_metadata` interceptor runs after the + `post_list_entity_signals_mappings` interceptor. The (possibly modified) response returned by + `post_list_entity_signals_mappings` will be passed to + `post_list_entity_signals_mappings_with_metadata`. + """ + return response, metadata + def pre_update_entity_signals_mapping( self, request: entity_signals_mapping_service.UpdateEntitySignalsMappingRequest, @@ -278,12 +408,38 @@ def post_update_entity_signals_mapping( ) -> entity_signals_mapping_messages.EntitySignalsMapping: """Post-rpc interceptor for update_entity_signals_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_entity_signals_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EntitySignalsMappingService server but before - it is returned to user code. + it is returned to user code. This `post_update_entity_signals_mapping` interceptor runs + before the `post_update_entity_signals_mapping_with_metadata` interceptor. """ return response + def post_update_entity_signals_mapping_with_metadata( + self, + response: entity_signals_mapping_messages.EntitySignalsMapping, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + entity_signals_mapping_messages.EntitySignalsMapping, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_entity_signals_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EntitySignalsMappingService server but before it is returned to user code. + + We recommend only using this `post_update_entity_signals_mapping_with_metadata` + interceptor in new development instead of the `post_update_entity_signals_mapping` interceptor. + When both interceptors are used, this `post_update_entity_signals_mapping_with_metadata` interceptor runs after the + `post_update_entity_signals_mapping` interceptor. The (possibly modified) response returned by + `post_update_entity_signals_mapping` will be passed to + `post_update_entity_signals_mapping_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -537,6 +693,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_entity_signals_mappings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_batch_create_entity_signals_mappings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -701,6 +864,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_entity_signals_mappings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_batch_update_entity_signals_mappings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -856,6 +1026,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_entity_signals_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_entity_signals_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1006,6 +1183,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_entity_signals_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_entity_signals_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1162,6 +1343,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_entity_signals_mappings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_entity_signals_mappings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1317,6 +1502,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_entity_signals_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_entity_signals_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/network_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/network_service/client.py index a55f2e1974bc..4d030db58f3c 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/network_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/network_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. @@ -921,16 +950,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-ads-admanager/google/ads/admanager_v1/services/network_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/network_service/transports/rest.py index 3546c7b0022b..a5963cc724e2 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/network_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/network_service/transports/rest.py @@ -110,12 +110,35 @@ def post_get_network( ) -> network_messages.Network: """Post-rpc interceptor for get_network - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_network_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkService server but before - it is returned to user code. + it is returned to user code. This `post_get_network` interceptor runs + before the `post_get_network_with_metadata` interceptor. """ return response + def post_get_network_with_metadata( + self, + response: network_messages.Network, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[network_messages.Network, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_network + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkService server but before it is returned to user code. + + We recommend only using this `post_get_network_with_metadata` + interceptor in new development instead of the `post_get_network` interceptor. + When both interceptors are used, this `post_get_network_with_metadata` interceptor runs after the + `post_get_network` interceptor. The (possibly modified) response returned by + `post_get_network` will be passed to + `post_get_network_with_metadata`. + """ + return response, metadata + def pre_list_networks( self, request: network_service.ListNetworksRequest, @@ -135,12 +158,37 @@ def post_list_networks( ) -> network_service.ListNetworksResponse: """Post-rpc interceptor for list_networks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_networks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkService server but before - it is returned to user code. + it is returned to user code. This `post_list_networks` interceptor runs + before the `post_list_networks_with_metadata` interceptor. """ return response + def post_list_networks_with_metadata( + self, + response: network_service.ListNetworksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + network_service.ListNetworksResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_networks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkService server but before it is returned to user code. + + We recommend only using this `post_list_networks_with_metadata` + interceptor in new development instead of the `post_list_networks` interceptor. + When both interceptors are used, this `post_list_networks_with_metadata` interceptor runs after the + `post_list_networks` interceptor. The (possibly modified) response returned by + `post_list_networks` will be passed to + `post_list_networks_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -372,6 +420,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_network(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_network_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -512,6 +564,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_networks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_networks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/client.py index 9f0bd4093669..6ea148703b63 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -605,6 +607,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1082,16 +1111,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-ads-admanager/google/ads/admanager_v1/services/order_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/transports/rest.py index 8e683e62aca0..8a02a4452efd 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/order_service/transports/rest.py @@ -106,12 +106,35 @@ def pre_get_order( def post_get_order(self, response: order_messages.Order) -> order_messages.Order: """Post-rpc interceptor for get_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the OrderService server but before - it is returned to user code. + it is returned to user code. This `post_get_order` interceptor runs + before the `post_get_order_with_metadata` interceptor. """ return response + def post_get_order_with_metadata( + self, + response: order_messages.Order, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[order_messages.Order, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the OrderService server but before it is returned to user code. + + We recommend only using this `post_get_order_with_metadata` + interceptor in new development instead of the `post_get_order` interceptor. + When both interceptors are used, this `post_get_order_with_metadata` interceptor runs after the + `post_get_order` interceptor. The (possibly modified) response returned by + `post_get_order` will be passed to + `post_get_order_with_metadata`. + """ + return response, metadata + def pre_list_orders( self, request: order_service.ListOrdersRequest, @@ -131,12 +154,37 @@ def post_list_orders( ) -> order_service.ListOrdersResponse: """Post-rpc interceptor for list_orders - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_orders_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the OrderService server but before - it is returned to user code. + it is returned to user code. This `post_list_orders` interceptor runs + before the `post_list_orders_with_metadata` interceptor. """ return response + def post_list_orders_with_metadata( + self, + response: order_service.ListOrdersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + order_service.ListOrdersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_orders + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the OrderService server but before it is returned to user code. + + We recommend only using this `post_list_orders_with_metadata` + interceptor in new development instead of the `post_list_orders` interceptor. + When both interceptors are used, this `post_list_orders_with_metadata` interceptor runs after the + `post_list_orders` interceptor. The (possibly modified) response returned by + `post_list_orders` will be passed to + `post_list_orders_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -368,6 +416,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -514,6 +566,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_orders(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_orders_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/client.py index df86540e30dd..ecaea412ee2b 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -516,6 +518,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -993,16 +1022,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-ads-admanager/google/ads/admanager_v1/services/placement_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/transports/rest.py index 8e8f883e3453..194b9216f16e 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/placement_service/transports/rest.py @@ -110,12 +110,35 @@ def post_get_placement( ) -> placement_messages.Placement: """Post-rpc interceptor for get_placement - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_placement_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PlacementService server but before - it is returned to user code. + it is returned to user code. This `post_get_placement` interceptor runs + before the `post_get_placement_with_metadata` interceptor. """ return response + def post_get_placement_with_metadata( + self, + response: placement_messages.Placement, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[placement_messages.Placement, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_placement + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PlacementService server but before it is returned to user code. + + We recommend only using this `post_get_placement_with_metadata` + interceptor in new development instead of the `post_get_placement` interceptor. + When both interceptors are used, this `post_get_placement_with_metadata` interceptor runs after the + `post_get_placement` interceptor. The (possibly modified) response returned by + `post_get_placement` will be passed to + `post_get_placement_with_metadata`. + """ + return response, metadata + def pre_list_placements( self, request: placement_service.ListPlacementsRequest, @@ -135,12 +158,38 @@ def post_list_placements( ) -> placement_service.ListPlacementsResponse: """Post-rpc interceptor for list_placements - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_placements_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PlacementService server but before - it is returned to user code. + it is returned to user code. This `post_list_placements` interceptor runs + before the `post_list_placements_with_metadata` interceptor. """ return response + def post_list_placements_with_metadata( + self, + response: placement_service.ListPlacementsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + placement_service.ListPlacementsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_placements + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PlacementService server but before it is returned to user code. + + We recommend only using this `post_list_placements_with_metadata` + interceptor in new development instead of the `post_list_placements` interceptor. + When both interceptors are used, this `post_list_placements_with_metadata` interceptor runs after the + `post_list_placements` interceptor. The (possibly modified) response returned by + `post_list_placements` will be passed to + `post_list_placements_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -370,6 +419,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_placement(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_placement_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -512,6 +565,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_placements(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_placements_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/report_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/report_service/client.py index 8fcc1028591a..fc8ef970aa63 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/report_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/report_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 @@ -494,6 +496,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1453,16 +1482,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-ads-admanager/google/ads/admanager_v1/services/report_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/report_service/transports/rest.py index 96bd9a927d92..928527f8565a 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/report_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/report_service/transports/rest.py @@ -142,12 +142,35 @@ def post_create_report( ) -> report_service.Report: """Post-rpc interceptor for create_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReportService server but before - it is returned to user code. + it is returned to user code. This `post_create_report` interceptor runs + before the `post_create_report_with_metadata` interceptor. """ return response + def post_create_report_with_metadata( + self, + response: report_service.Report, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[report_service.Report, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReportService server but before it is returned to user code. + + We recommend only using this `post_create_report_with_metadata` + interceptor in new development instead of the `post_create_report` interceptor. + When both interceptors are used, this `post_create_report_with_metadata` interceptor runs after the + `post_create_report` interceptor. The (possibly modified) response returned by + `post_create_report` will be passed to + `post_create_report_with_metadata`. + """ + return response, metadata + def pre_fetch_report_result_rows( self, request: report_service.FetchReportResultRowsRequest, @@ -168,12 +191,38 @@ def post_fetch_report_result_rows( ) -> report_service.FetchReportResultRowsResponse: """Post-rpc interceptor for fetch_report_result_rows - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_report_result_rows_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReportService server but before - it is returned to user code. + it is returned to user code. This `post_fetch_report_result_rows` interceptor runs + before the `post_fetch_report_result_rows_with_metadata` interceptor. """ return response + def post_fetch_report_result_rows_with_metadata( + self, + response: report_service.FetchReportResultRowsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + report_service.FetchReportResultRowsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for fetch_report_result_rows + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReportService server but before it is returned to user code. + + We recommend only using this `post_fetch_report_result_rows_with_metadata` + interceptor in new development instead of the `post_fetch_report_result_rows` interceptor. + When both interceptors are used, this `post_fetch_report_result_rows_with_metadata` interceptor runs after the + `post_fetch_report_result_rows` interceptor. The (possibly modified) response returned by + `post_fetch_report_result_rows` will be passed to + `post_fetch_report_result_rows_with_metadata`. + """ + return response, metadata + def pre_get_report( self, request: report_service.GetReportRequest, @@ -191,12 +240,35 @@ def pre_get_report( def post_get_report(self, response: report_service.Report) -> report_service.Report: """Post-rpc interceptor for get_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReportService server but before - it is returned to user code. + it is returned to user code. This `post_get_report` interceptor runs + before the `post_get_report_with_metadata` interceptor. """ return response + def post_get_report_with_metadata( + self, + response: report_service.Report, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[report_service.Report, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReportService server but before it is returned to user code. + + We recommend only using this `post_get_report_with_metadata` + interceptor in new development instead of the `post_get_report` interceptor. + When both interceptors are used, this `post_get_report_with_metadata` interceptor runs after the + `post_get_report` interceptor. The (possibly modified) response returned by + `post_get_report` will be passed to + `post_get_report_with_metadata`. + """ + return response, metadata + def pre_list_reports( self, request: report_service.ListReportsRequest, @@ -216,12 +288,37 @@ def post_list_reports( ) -> report_service.ListReportsResponse: """Post-rpc interceptor for list_reports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_reports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReportService server but before - it is returned to user code. + it is returned to user code. This `post_list_reports` interceptor runs + before the `post_list_reports_with_metadata` interceptor. """ return response + def post_list_reports_with_metadata( + self, + response: report_service.ListReportsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + report_service.ListReportsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_reports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReportService server but before it is returned to user code. + + We recommend only using this `post_list_reports_with_metadata` + interceptor in new development instead of the `post_list_reports` interceptor. + When both interceptors are used, this `post_list_reports_with_metadata` interceptor runs after the + `post_list_reports` interceptor. The (possibly modified) response returned by + `post_list_reports` will be passed to + `post_list_reports_with_metadata`. + """ + return response, metadata + def pre_run_report( self, request: report_service.RunReportRequest, @@ -241,12 +338,35 @@ def post_run_report( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReportService server but before - it is returned to user code. + it is returned to user code. This `post_run_report` interceptor runs + before the `post_run_report_with_metadata` interceptor. """ return response + def post_run_report_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_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReportService server but before it is returned to user code. + + We recommend only using this `post_run_report_with_metadata` + interceptor in new development instead of the `post_run_report` interceptor. + When both interceptors are used, this `post_run_report_with_metadata` interceptor runs after the + `post_run_report` interceptor. The (possibly modified) response returned by + `post_run_report` will be passed to + `post_run_report_with_metadata`. + """ + return response, metadata + def pre_update_report( self, request: report_service.UpdateReportRequest, @@ -266,12 +386,35 @@ def post_update_report( ) -> report_service.Report: """Post-rpc interceptor for update_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReportService server but before - it is returned to user code. + it is returned to user code. This `post_update_report` interceptor runs + before the `post_update_report_with_metadata` interceptor. """ return response + def post_update_report_with_metadata( + self, + response: report_service.Report, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[report_service.Report, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReportService server but before it is returned to user code. + + We recommend only using this `post_update_report_with_metadata` + interceptor in new development instead of the `post_update_report` interceptor. + When both interceptors are used, this `post_update_report_with_metadata` interceptor runs after the + `post_update_report` interceptor. The (possibly modified) response returned by + `post_update_report` will be passed to + `post_update_report_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -546,6 +689,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -692,6 +839,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_report_result_rows(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_report_result_rows_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -838,6 +989,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -982,6 +1137,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_reports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_reports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1138,6 +1297,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1284,6 +1447,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/role_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/role_service/client.py index 9b00a7dcfc53..99268a57bfbb 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/role_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/role_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. @@ -961,16 +990,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-ads-admanager/google/ads/admanager_v1/services/role_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/role_service/transports/rest.py index f2f0211e46f0..32daa99c54d4 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/role_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/role_service/transports/rest.py @@ -106,12 +106,35 @@ def pre_get_role( def post_get_role(self, response: role_messages.Role) -> role_messages.Role: """Post-rpc interceptor for get_role - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_role_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RoleService server but before - it is returned to user code. + it is returned to user code. This `post_get_role` interceptor runs + before the `post_get_role_with_metadata` interceptor. """ return response + def post_get_role_with_metadata( + self, + response: role_messages.Role, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[role_messages.Role, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_role + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RoleService server but before it is returned to user code. + + We recommend only using this `post_get_role_with_metadata` + interceptor in new development instead of the `post_get_role` interceptor. + When both interceptors are used, this `post_get_role_with_metadata` interceptor runs after the + `post_get_role` interceptor. The (possibly modified) response returned by + `post_get_role` will be passed to + `post_get_role_with_metadata`. + """ + return response, metadata + def pre_list_roles( self, request: role_service.ListRolesRequest, @@ -129,12 +152,35 @@ def post_list_roles( ) -> role_service.ListRolesResponse: """Post-rpc interceptor for list_roles - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_roles_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RoleService server but before - it is returned to user code. + it is returned to user code. This `post_list_roles` interceptor runs + before the `post_list_roles_with_metadata` interceptor. """ return response + def post_list_roles_with_metadata( + self, + response: role_service.ListRolesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[role_service.ListRolesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_roles + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RoleService server but before it is returned to user code. + + We recommend only using this `post_list_roles_with_metadata` + interceptor in new development instead of the `post_list_roles` interceptor. + When both interceptors are used, this `post_list_roles_with_metadata` interceptor runs after the + `post_list_roles` interceptor. The (possibly modified) response returned by + `post_list_roles` will be passed to + `post_list_roles_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -366,6 +412,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_role(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_role_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -510,6 +560,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_roles(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_roles_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/client.py index 831d3ae1ddcc..6eaf76b731ba 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_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 @@ -501,6 +503,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -991,16 +1020,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-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/transports/rest.py index 4e32840d3ddd..ec40c279205d 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/taxonomy_category_service/transports/rest.py @@ -114,12 +114,38 @@ def post_get_taxonomy_category( ) -> taxonomy_category_messages.TaxonomyCategory: """Post-rpc interceptor for get_taxonomy_category - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_taxonomy_category_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TaxonomyCategoryService server but before - it is returned to user code. + it is returned to user code. This `post_get_taxonomy_category` interceptor runs + before the `post_get_taxonomy_category_with_metadata` interceptor. """ return response + def post_get_taxonomy_category_with_metadata( + self, + response: taxonomy_category_messages.TaxonomyCategory, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + taxonomy_category_messages.TaxonomyCategory, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_taxonomy_category + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TaxonomyCategoryService server but before it is returned to user code. + + We recommend only using this `post_get_taxonomy_category_with_metadata` + interceptor in new development instead of the `post_get_taxonomy_category` interceptor. + When both interceptors are used, this `post_get_taxonomy_category_with_metadata` interceptor runs after the + `post_get_taxonomy_category` interceptor. The (possibly modified) response returned by + `post_get_taxonomy_category` will be passed to + `post_get_taxonomy_category_with_metadata`. + """ + return response, metadata + def pre_list_taxonomy_categories( self, request: taxonomy_category_service.ListTaxonomyCategoriesRequest, @@ -140,12 +166,38 @@ def post_list_taxonomy_categories( ) -> taxonomy_category_service.ListTaxonomyCategoriesResponse: """Post-rpc interceptor for list_taxonomy_categories - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_taxonomy_categories_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TaxonomyCategoryService server but before - it is returned to user code. + it is returned to user code. This `post_list_taxonomy_categories` interceptor runs + before the `post_list_taxonomy_categories_with_metadata` interceptor. """ return response + def post_list_taxonomy_categories_with_metadata( + self, + response: taxonomy_category_service.ListTaxonomyCategoriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + taxonomy_category_service.ListTaxonomyCategoriesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_taxonomy_categories + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TaxonomyCategoryService server but before it is returned to user code. + + We recommend only using this `post_list_taxonomy_categories_with_metadata` + interceptor in new development instead of the `post_list_taxonomy_categories` interceptor. + When both interceptors are used, this `post_list_taxonomy_categories_with_metadata` interceptor runs after the + `post_list_taxonomy_categories` interceptor. The (possibly modified) response returned by + `post_list_taxonomy_categories` will be passed to + `post_list_taxonomy_categories_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -380,6 +432,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_taxonomy_category(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_taxonomy_category_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -527,6 +583,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_taxonomy_categories(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_taxonomy_categories_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/google/ads/admanager_v1/services/user_service/client.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/user_service/client.py index fbd1b70e7d1d..fc99625902d7 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/user_service/client.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/user_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. @@ -846,16 +875,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-ads-admanager/google/ads/admanager_v1/services/user_service/transports/rest.py b/packages/google-ads-admanager/google/ads/admanager_v1/services/user_service/transports/rest.py index 294fbf1cd532..33d60cefd300 100644 --- a/packages/google-ads-admanager/google/ads/admanager_v1/services/user_service/transports/rest.py +++ b/packages/google-ads-admanager/google/ads/admanager_v1/services/user_service/transports/rest.py @@ -98,12 +98,35 @@ def pre_get_user( def post_get_user(self, response: user_messages.User) -> user_messages.User: """Post-rpc interceptor for get_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UserService server but before - it is returned to user code. + it is returned to user code. This `post_get_user` interceptor runs + before the `post_get_user_with_metadata` interceptor. """ return response + def post_get_user_with_metadata( + self, + response: user_messages.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[user_messages.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UserService server but before it is returned to user code. + + We recommend only using this `post_get_user_with_metadata` + interceptor in new development instead of the `post_get_user` interceptor. + When both interceptors are used, this `post_get_user_with_metadata` interceptor runs after the + `post_get_user` interceptor. The (possibly modified) response returned by + `post_get_user` will be passed to + `post_get_user_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -335,6 +358,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-admanager/samples/generated_samples/snippet_metadata_google.ads.admanager.v1.json b/packages/google-ads-admanager/samples/generated_samples/snippet_metadata_google.ads.admanager.v1.json index a3d2acec31ba..e616c7d90ec3 100644 --- a/packages/google-ads-admanager/samples/generated_samples/snippet_metadata_google.ads.admanager.v1.json +++ b/packages/google-ads-admanager/samples/generated_samples/snippet_metadata_google.ads.admanager.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ads-admanager", - "version": "0.2.3" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_ad_unit_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_ad_unit_service.py index cbbc892a654a..c32e26f6eebc 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_ad_unit_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_ad_unit_service.py @@ -67,6 +67,13 @@ applied_label, ) +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 = AdUnitServiceClient(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 = AdUnitServiceClient(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", [ @@ -1804,10 +1854,13 @@ def test_get_ad_unit_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdUnitServiceRestInterceptor, "post_get_ad_unit" ) as post, mock.patch.object( + transports.AdUnitServiceRestInterceptor, "post_get_ad_unit_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdUnitServiceRestInterceptor, "pre_get_ad_unit" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ad_unit_service.GetAdUnitRequest.pb( ad_unit_service.GetAdUnitRequest() ) @@ -1831,6 +1884,7 @@ def test_get_ad_unit_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ad_unit_messages.AdUnit() + post_with_metadata.return_value = ad_unit_messages.AdUnit(), metadata client.get_ad_unit( request, @@ -1842,6 +1896,7 @@ def test_get_ad_unit_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_ad_units_rest_bad_request( @@ -1928,10 +1983,13 @@ def test_list_ad_units_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdUnitServiceRestInterceptor, "post_list_ad_units" ) as post, mock.patch.object( + transports.AdUnitServiceRestInterceptor, "post_list_ad_units_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdUnitServiceRestInterceptor, "pre_list_ad_units" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ad_unit_service.ListAdUnitsRequest.pb( ad_unit_service.ListAdUnitsRequest() ) @@ -1957,6 +2015,10 @@ def test_list_ad_units_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ad_unit_service.ListAdUnitsResponse() + post_with_metadata.return_value = ( + ad_unit_service.ListAdUnitsResponse(), + metadata, + ) client.list_ad_units( request, @@ -1968,6 +2030,7 @@ def test_list_ad_units_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_ad_unit_sizes_rest_bad_request( @@ -2054,10 +2117,13 @@ def test_list_ad_unit_sizes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdUnitServiceRestInterceptor, "post_list_ad_unit_sizes" ) as post, mock.patch.object( + transports.AdUnitServiceRestInterceptor, "post_list_ad_unit_sizes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdUnitServiceRestInterceptor, "pre_list_ad_unit_sizes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ad_unit_service.ListAdUnitSizesRequest.pb( ad_unit_service.ListAdUnitSizesRequest() ) @@ -2083,6 +2149,10 @@ def test_list_ad_unit_sizes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ad_unit_service.ListAdUnitSizesResponse() + post_with_metadata.return_value = ( + ad_unit_service.ListAdUnitSizesResponse(), + metadata, + ) client.list_ad_unit_sizes( request, @@ -2094,6 +2164,7 @@ def test_list_ad_unit_sizes_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-ads-admanager/tests/unit/gapic/admanager_v1/test_company_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_company_service.py index ea9adbde0902..9338a6c3d62a 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_company_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_company_service.py @@ -67,6 +67,13 @@ company_type_enum, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -320,6 +327,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = 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", [ @@ -1530,10 +1580,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() ) @@ -1557,6 +1610,7 @@ def test_get_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = company_messages.Company() + post_with_metadata.return_value = company_messages.Company(), metadata client.get_company( request, @@ -1568,6 +1622,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_list_companies_rest_bad_request( @@ -1654,10 +1709,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() ) @@ -1683,6 +1741,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, @@ -1694,6 +1756,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-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_field_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_field_service.py index cf1494107490..4f4473d90db4 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_field_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_field_service.py @@ -64,6 +64,13 @@ custom_field_service, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -330,6 +337,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CustomFieldServiceClient(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 = CustomFieldServiceClient(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", [ @@ -1566,10 +1616,14 @@ def test_get_custom_field_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CustomFieldServiceRestInterceptor, "post_get_custom_field" ) as post, mock.patch.object( + transports.CustomFieldServiceRestInterceptor, + "post_get_custom_field_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CustomFieldServiceRestInterceptor, "pre_get_custom_field" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = custom_field_service.GetCustomFieldRequest.pb( custom_field_service.GetCustomFieldRequest() ) @@ -1595,6 +1649,7 @@ def test_get_custom_field_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = custom_field_messages.CustomField() + post_with_metadata.return_value = custom_field_messages.CustomField(), metadata client.get_custom_field( request, @@ -1606,6 +1661,7 @@ def test_get_custom_field_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_custom_fields_rest_bad_request( @@ -1692,10 +1748,14 @@ def test_list_custom_fields_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CustomFieldServiceRestInterceptor, "post_list_custom_fields" ) as post, mock.patch.object( + transports.CustomFieldServiceRestInterceptor, + "post_list_custom_fields_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CustomFieldServiceRestInterceptor, "pre_list_custom_fields" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = custom_field_service.ListCustomFieldsRequest.pb( custom_field_service.ListCustomFieldsRequest() ) @@ -1721,6 +1781,10 @@ def test_list_custom_fields_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = custom_field_service.ListCustomFieldsResponse() + post_with_metadata.return_value = ( + custom_field_service.ListCustomFieldsResponse(), + metadata, + ) client.list_custom_fields( request, @@ -1732,6 +1796,7 @@ def test_list_custom_fields_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-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_key_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_key_service.py index 4aed3143f97d..5a552ec6ed77 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_key_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_key_service.py @@ -64,6 +64,13 @@ custom_targeting_key_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 @@ -338,6 +345,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 = CustomTargetingKeyServiceClient(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 = CustomTargetingKeyServiceClient(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", [ @@ -1602,11 +1652,15 @@ def test_get_custom_targeting_key_rest_interceptors(null_interceptor): transports.CustomTargetingKeyServiceRestInterceptor, "post_get_custom_targeting_key", ) as post, mock.patch.object( + transports.CustomTargetingKeyServiceRestInterceptor, + "post_get_custom_targeting_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CustomTargetingKeyServiceRestInterceptor, "pre_get_custom_targeting_key", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = custom_targeting_key_service.GetCustomTargetingKeyRequest.pb( custom_targeting_key_service.GetCustomTargetingKeyRequest() ) @@ -1632,6 +1686,10 @@ def test_get_custom_targeting_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = custom_targeting_key_messages.CustomTargetingKey() + post_with_metadata.return_value = ( + custom_targeting_key_messages.CustomTargetingKey(), + metadata, + ) client.get_custom_targeting_key( request, @@ -1643,6 +1701,7 @@ def test_get_custom_targeting_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_custom_targeting_keys_rest_bad_request( @@ -1732,11 +1791,15 @@ def test_list_custom_targeting_keys_rest_interceptors(null_interceptor): transports.CustomTargetingKeyServiceRestInterceptor, "post_list_custom_targeting_keys", ) as post, mock.patch.object( + transports.CustomTargetingKeyServiceRestInterceptor, + "post_list_custom_targeting_keys_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CustomTargetingKeyServiceRestInterceptor, "pre_list_custom_targeting_keys", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = custom_targeting_key_service.ListCustomTargetingKeysRequest.pb( custom_targeting_key_service.ListCustomTargetingKeysRequest() ) @@ -1766,6 +1829,10 @@ def test_list_custom_targeting_keys_rest_interceptors(null_interceptor): post.return_value = ( custom_targeting_key_service.ListCustomTargetingKeysResponse() ) + post_with_metadata.return_value = ( + custom_targeting_key_service.ListCustomTargetingKeysResponse(), + metadata, + ) client.list_custom_targeting_keys( request, @@ -1777,6 +1844,7 @@ def test_list_custom_targeting_keys_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-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_value_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_value_service.py index 7012ac0c2344..d61a340e705f 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_value_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_custom_targeting_value_service.py @@ -64,6 +64,13 @@ custom_targeting_value_service, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -342,6 +349,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CustomTargetingValueServiceClient(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 = CustomTargetingValueServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1615,11 +1665,15 @@ def test_get_custom_targeting_value_rest_interceptors(null_interceptor): transports.CustomTargetingValueServiceRestInterceptor, "post_get_custom_targeting_value", ) as post, mock.patch.object( + transports.CustomTargetingValueServiceRestInterceptor, + "post_get_custom_targeting_value_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CustomTargetingValueServiceRestInterceptor, "pre_get_custom_targeting_value", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = custom_targeting_value_service.GetCustomTargetingValueRequest.pb( custom_targeting_value_service.GetCustomTargetingValueRequest() ) @@ -1645,6 +1699,10 @@ def test_get_custom_targeting_value_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = custom_targeting_value_messages.CustomTargetingValue() + post_with_metadata.return_value = ( + custom_targeting_value_messages.CustomTargetingValue(), + metadata, + ) client.get_custom_targeting_value( request, @@ -1656,6 +1714,7 @@ def test_get_custom_targeting_value_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_custom_targeting_values_rest_bad_request( @@ -1747,11 +1806,15 @@ def test_list_custom_targeting_values_rest_interceptors(null_interceptor): transports.CustomTargetingValueServiceRestInterceptor, "post_list_custom_targeting_values", ) as post, mock.patch.object( + transports.CustomTargetingValueServiceRestInterceptor, + "post_list_custom_targeting_values_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CustomTargetingValueServiceRestInterceptor, "pre_list_custom_targeting_values", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = custom_targeting_value_service.ListCustomTargetingValuesRequest.pb( custom_targeting_value_service.ListCustomTargetingValuesRequest() ) @@ -1781,6 +1844,10 @@ def test_list_custom_targeting_values_rest_interceptors(null_interceptor): post.return_value = ( custom_targeting_value_service.ListCustomTargetingValuesResponse() ) + post_with_metadata.return_value = ( + custom_targeting_value_service.ListCustomTargetingValuesResponse(), + metadata, + ) client.list_custom_targeting_values( request, @@ -1792,6 +1859,7 @@ def test_list_custom_targeting_values_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-ads-admanager/tests/unit/gapic/admanager_v1/test_entity_signals_mapping_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_entity_signals_mapping_service.py index 2368f1e1d2e5..48c875d6ead0 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_entity_signals_mapping_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_entity_signals_mapping_service.py @@ -64,6 +64,13 @@ entity_signals_mapping_service, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -342,6 +349,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = EntitySignalsMappingServiceClient(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 = EntitySignalsMappingServiceClient(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", [ @@ -2442,11 +2492,15 @@ def test_get_entity_signals_mapping_rest_interceptors(null_interceptor): transports.EntitySignalsMappingServiceRestInterceptor, "post_get_entity_signals_mapping", ) as post, mock.patch.object( + transports.EntitySignalsMappingServiceRestInterceptor, + "post_get_entity_signals_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EntitySignalsMappingServiceRestInterceptor, "pre_get_entity_signals_mapping", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = entity_signals_mapping_service.GetEntitySignalsMappingRequest.pb( entity_signals_mapping_service.GetEntitySignalsMappingRequest() ) @@ -2472,6 +2526,10 @@ def test_get_entity_signals_mapping_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = entity_signals_mapping_messages.EntitySignalsMapping() + post_with_metadata.return_value = ( + entity_signals_mapping_messages.EntitySignalsMapping(), + metadata, + ) client.get_entity_signals_mapping( request, @@ -2483,6 +2541,7 @@ def test_get_entity_signals_mapping_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_entity_signals_mappings_rest_bad_request( @@ -2574,11 +2633,15 @@ def test_list_entity_signals_mappings_rest_interceptors(null_interceptor): transports.EntitySignalsMappingServiceRestInterceptor, "post_list_entity_signals_mappings", ) as post, mock.patch.object( + transports.EntitySignalsMappingServiceRestInterceptor, + "post_list_entity_signals_mappings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EntitySignalsMappingServiceRestInterceptor, "pre_list_entity_signals_mappings", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = entity_signals_mapping_service.ListEntitySignalsMappingsRequest.pb( entity_signals_mapping_service.ListEntitySignalsMappingsRequest() ) @@ -2608,6 +2671,10 @@ def test_list_entity_signals_mappings_rest_interceptors(null_interceptor): post.return_value = ( entity_signals_mapping_service.ListEntitySignalsMappingsResponse() ) + post_with_metadata.return_value = ( + entity_signals_mapping_service.ListEntitySignalsMappingsResponse(), + metadata, + ) client.list_entity_signals_mappings( request, @@ -2619,6 +2686,7 @@ def test_list_entity_signals_mappings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_entity_signals_mapping_rest_bad_request( @@ -2792,11 +2860,15 @@ def test_create_entity_signals_mapping_rest_interceptors(null_interceptor): transports.EntitySignalsMappingServiceRestInterceptor, "post_create_entity_signals_mapping", ) as post, mock.patch.object( + transports.EntitySignalsMappingServiceRestInterceptor, + "post_create_entity_signals_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EntitySignalsMappingServiceRestInterceptor, "pre_create_entity_signals_mapping", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( entity_signals_mapping_service.CreateEntitySignalsMappingRequest.pb( entity_signals_mapping_service.CreateEntitySignalsMappingRequest() @@ -2824,6 +2896,10 @@ def test_create_entity_signals_mapping_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = entity_signals_mapping_messages.EntitySignalsMapping() + post_with_metadata.return_value = ( + entity_signals_mapping_messages.EntitySignalsMapping(), + metadata, + ) client.create_entity_signals_mapping( request, @@ -2835,6 +2911,7 @@ def test_create_entity_signals_mapping_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_entity_signals_mapping_rest_bad_request( @@ -3016,11 +3093,15 @@ def test_update_entity_signals_mapping_rest_interceptors(null_interceptor): transports.EntitySignalsMappingServiceRestInterceptor, "post_update_entity_signals_mapping", ) as post, mock.patch.object( + transports.EntitySignalsMappingServiceRestInterceptor, + "post_update_entity_signals_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EntitySignalsMappingServiceRestInterceptor, "pre_update_entity_signals_mapping", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( entity_signals_mapping_service.UpdateEntitySignalsMappingRequest.pb( entity_signals_mapping_service.UpdateEntitySignalsMappingRequest() @@ -3048,6 +3129,10 @@ def test_update_entity_signals_mapping_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = entity_signals_mapping_messages.EntitySignalsMapping() + post_with_metadata.return_value = ( + entity_signals_mapping_messages.EntitySignalsMapping(), + metadata, + ) client.update_entity_signals_mapping( request, @@ -3059,6 +3144,7 @@ def test_update_entity_signals_mapping_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_entity_signals_mappings_rest_bad_request( @@ -3150,11 +3236,15 @@ def test_batch_create_entity_signals_mappings_rest_interceptors(null_interceptor transports.EntitySignalsMappingServiceRestInterceptor, "post_batch_create_entity_signals_mappings", ) as post, mock.patch.object( + transports.EntitySignalsMappingServiceRestInterceptor, + "post_batch_create_entity_signals_mappings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EntitySignalsMappingServiceRestInterceptor, "pre_batch_create_entity_signals_mappings", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( entity_signals_mapping_service.BatchCreateEntitySignalsMappingsRequest.pb( entity_signals_mapping_service.BatchCreateEntitySignalsMappingsRequest() @@ -3186,6 +3276,10 @@ def test_batch_create_entity_signals_mappings_rest_interceptors(null_interceptor post.return_value = ( entity_signals_mapping_service.BatchCreateEntitySignalsMappingsResponse() ) + post_with_metadata.return_value = ( + entity_signals_mapping_service.BatchCreateEntitySignalsMappingsResponse(), + metadata, + ) client.batch_create_entity_signals_mappings( request, @@ -3197,6 +3291,7 @@ def test_batch_create_entity_signals_mappings_rest_interceptors(null_interceptor pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_entity_signals_mappings_rest_bad_request( @@ -3288,11 +3383,15 @@ def test_batch_update_entity_signals_mappings_rest_interceptors(null_interceptor transports.EntitySignalsMappingServiceRestInterceptor, "post_batch_update_entity_signals_mappings", ) as post, mock.patch.object( + transports.EntitySignalsMappingServiceRestInterceptor, + "post_batch_update_entity_signals_mappings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EntitySignalsMappingServiceRestInterceptor, "pre_batch_update_entity_signals_mappings", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsRequest.pb( entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsRequest() @@ -3324,6 +3423,10 @@ def test_batch_update_entity_signals_mappings_rest_interceptors(null_interceptor post.return_value = ( entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsResponse() ) + post_with_metadata.return_value = ( + entity_signals_mapping_service.BatchUpdateEntitySignalsMappingsResponse(), + metadata, + ) client.batch_update_entity_signals_mappings( request, @@ -3335,6 +3438,7 @@ def test_batch_update_entity_signals_mappings_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-ads-admanager/tests/unit/gapic/admanager_v1/test_network_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_network_service.py index 2ca64e50c3ee..6524641e689f 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_network_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_network_service.py @@ -59,6 +59,13 @@ ) from google.ads.admanager_v1.types import network_messages, network_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 @@ -312,6 +319,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = NetworkServiceClient(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 = NetworkServiceClient(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", [ @@ -1287,10 +1337,13 @@ def test_get_network_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkServiceRestInterceptor, "post_get_network" ) as post, mock.patch.object( + transports.NetworkServiceRestInterceptor, "post_get_network_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkServiceRestInterceptor, "pre_get_network" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = network_service.GetNetworkRequest.pb( network_service.GetNetworkRequest() ) @@ -1314,6 +1367,7 @@ def test_get_network_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = network_messages.Network() + post_with_metadata.return_value = network_messages.Network(), metadata client.get_network( request, @@ -1325,6 +1379,7 @@ def test_get_network_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_networks_rest_bad_request( @@ -1406,10 +1461,13 @@ def test_list_networks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkServiceRestInterceptor, "post_list_networks" ) as post, mock.patch.object( + transports.NetworkServiceRestInterceptor, "post_list_networks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkServiceRestInterceptor, "pre_list_networks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = network_service.ListNetworksRequest.pb( network_service.ListNetworksRequest() ) @@ -1435,6 +1493,10 @@ def test_list_networks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = network_service.ListNetworksResponse() + post_with_metadata.return_value = ( + network_service.ListNetworksResponse(), + metadata, + ) client.list_networks( request, @@ -1446,6 +1508,7 @@ def test_list_networks_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-ads-admanager/tests/unit/gapic/admanager_v1/test_order_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_order_service.py index 62013e27fa51..a214e33fab4c 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_order_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_order_service.py @@ -67,6 +67,13 @@ order_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 @@ -305,6 +312,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 = OrderServiceClient(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 = OrderServiceClient(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", [ @@ -1522,10 +1572,13 @@ def test_get_order_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrderServiceRestInterceptor, "post_get_order" ) as post, mock.patch.object( + transports.OrderServiceRestInterceptor, "post_get_order_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.OrderServiceRestInterceptor, "pre_get_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = order_service.GetOrderRequest.pb(order_service.GetOrderRequest()) transcode.return_value = { "method": "post", @@ -1547,6 +1600,7 @@ def test_get_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = order_messages.Order() + post_with_metadata.return_value = order_messages.Order(), metadata client.get_order( request, @@ -1558,6 +1612,7 @@ def test_get_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_orders_rest_bad_request(request_type=order_service.ListOrdersRequest): @@ -1642,10 +1697,13 @@ def test_list_orders_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrderServiceRestInterceptor, "post_list_orders" ) as post, mock.patch.object( + transports.OrderServiceRestInterceptor, "post_list_orders_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.OrderServiceRestInterceptor, "pre_list_orders" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = order_service.ListOrdersRequest.pb( order_service.ListOrdersRequest() ) @@ -1671,6 +1729,7 @@ def test_list_orders_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = order_service.ListOrdersResponse() + post_with_metadata.return_value = order_service.ListOrdersResponse(), metadata client.list_orders( request, @@ -1682,6 +1741,7 @@ def test_list_orders_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_placement_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_placement_service.py index aeb3edbe704e..79f8c74f31e1 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_placement_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_placement_service.py @@ -65,6 +65,13 @@ placement_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 @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PlacementServiceClient(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 = PlacementServiceClient(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", [ @@ -1533,10 +1583,13 @@ def test_get_placement_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PlacementServiceRestInterceptor, "post_get_placement" ) as post, mock.patch.object( + transports.PlacementServiceRestInterceptor, "post_get_placement_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PlacementServiceRestInterceptor, "pre_get_placement" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = placement_service.GetPlacementRequest.pb( placement_service.GetPlacementRequest() ) @@ -1562,6 +1615,7 @@ def test_get_placement_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = placement_messages.Placement() + post_with_metadata.return_value = placement_messages.Placement(), metadata client.get_placement( request, @@ -1573,6 +1627,7 @@ def test_get_placement_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_placements_rest_bad_request( @@ -1659,10 +1714,13 @@ def test_list_placements_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PlacementServiceRestInterceptor, "post_list_placements" ) as post, mock.patch.object( + transports.PlacementServiceRestInterceptor, "post_list_placements_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PlacementServiceRestInterceptor, "pre_list_placements" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = placement_service.ListPlacementsRequest.pb( placement_service.ListPlacementsRequest() ) @@ -1688,6 +1746,10 @@ def test_list_placements_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = placement_service.ListPlacementsResponse() + post_with_metadata.return_value = ( + placement_service.ListPlacementsResponse(), + metadata, + ) client.list_placements( request, @@ -1699,6 +1761,7 @@ def test_list_placements_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-ads-admanager/tests/unit/gapic/admanager_v1/test_report_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_report_service.py index 53295bb95d07..412dd291ae78 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_report_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_report_service.py @@ -74,6 +74,13 @@ ) from google.ads.admanager_v1.types import report_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -323,6 +330,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ReportServiceClient(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 = ReportServiceClient(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", [ @@ -2217,10 +2267,13 @@ def test_get_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReportServiceRestInterceptor, "post_get_report" ) as post, mock.patch.object( + transports.ReportServiceRestInterceptor, "post_get_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReportServiceRestInterceptor, "pre_get_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = report_service.GetReportRequest.pb( report_service.GetReportRequest() ) @@ -2244,6 +2297,7 @@ def test_get_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = report_service.Report() + post_with_metadata.return_value = report_service.Report(), metadata client.get_report( request, @@ -2255,6 +2309,7 @@ def test_get_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_reports_rest_bad_request(request_type=report_service.ListReportsRequest): @@ -2339,10 +2394,13 @@ def test_list_reports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReportServiceRestInterceptor, "post_list_reports" ) as post, mock.patch.object( + transports.ReportServiceRestInterceptor, "post_list_reports_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReportServiceRestInterceptor, "pre_list_reports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = report_service.ListReportsRequest.pb( report_service.ListReportsRequest() ) @@ -2368,6 +2426,7 @@ def test_list_reports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = report_service.ListReportsResponse() + post_with_metadata.return_value = report_service.ListReportsResponse(), metadata client.list_reports( request, @@ -2379,6 +2438,7 @@ def test_list_reports_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_report_rest_bad_request( @@ -2621,10 +2681,13 @@ def test_create_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReportServiceRestInterceptor, "post_create_report" ) as post, mock.patch.object( + transports.ReportServiceRestInterceptor, "post_create_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReportServiceRestInterceptor, "pre_create_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = report_service.CreateReportRequest.pb( report_service.CreateReportRequest() ) @@ -2648,6 +2711,7 @@ def test_create_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = report_service.Report() + post_with_metadata.return_value = report_service.Report(), metadata client.create_report( request, @@ -2659,6 +2723,7 @@ def test_create_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_report_rest_bad_request( @@ -2901,10 +2966,13 @@ def test_update_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReportServiceRestInterceptor, "post_update_report" ) as post, mock.patch.object( + transports.ReportServiceRestInterceptor, "post_update_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReportServiceRestInterceptor, "pre_update_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = report_service.UpdateReportRequest.pb( report_service.UpdateReportRequest() ) @@ -2928,6 +2996,7 @@ def test_update_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = report_service.Report() + post_with_metadata.return_value = report_service.Report(), metadata client.update_report( request, @@ -2939,6 +3008,7 @@ def test_update_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_report_rest_bad_request(request_type=report_service.RunReportRequest): @@ -3017,10 +3087,13 @@ def test_run_report_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ReportServiceRestInterceptor, "post_run_report" ) as post, mock.patch.object( + transports.ReportServiceRestInterceptor, "post_run_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReportServiceRestInterceptor, "pre_run_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = report_service.RunReportRequest.pb( report_service.RunReportRequest() ) @@ -3044,6 +3117,7 @@ def test_run_report_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_report( request, @@ -3055,6 +3129,7 @@ def test_run_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_report_result_rows_rest_bad_request( @@ -3141,10 +3216,14 @@ def test_fetch_report_result_rows_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReportServiceRestInterceptor, "post_fetch_report_result_rows" ) as post, mock.patch.object( + transports.ReportServiceRestInterceptor, + "post_fetch_report_result_rows_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReportServiceRestInterceptor, "pre_fetch_report_result_rows" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = report_service.FetchReportResultRowsRequest.pb( report_service.FetchReportResultRowsRequest() ) @@ -3170,6 +3249,10 @@ def test_fetch_report_result_rows_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = report_service.FetchReportResultRowsResponse() + post_with_metadata.return_value = ( + report_service.FetchReportResultRowsResponse(), + metadata, + ) client.fetch_report_result_rows( request, @@ -3181,6 +3264,7 @@ def test_fetch_report_result_rows_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-ads-admanager/tests/unit/gapic/admanager_v1/test_role_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_role_service.py index 539557e51834..e6ad78ef2745 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_role_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_role_service.py @@ -60,6 +60,13 @@ ) from google.ads.admanager_v1.types import role_enums, role_messages, role_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 @@ -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 = RoleServiceClient(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 = RoleServiceClient(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", [ @@ -1477,10 +1527,13 @@ def test_get_role_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoleServiceRestInterceptor, "post_get_role" ) as post, mock.patch.object( + transports.RoleServiceRestInterceptor, "post_get_role_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoleServiceRestInterceptor, "pre_get_role" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = role_service.GetRoleRequest.pb(role_service.GetRoleRequest()) transcode.return_value = { "method": "post", @@ -1502,6 +1555,7 @@ def test_get_role_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = role_messages.Role() + post_with_metadata.return_value = role_messages.Role(), metadata client.get_role( request, @@ -1513,6 +1567,7 @@ def test_get_role_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_roles_rest_bad_request(request_type=role_service.ListRolesRequest): @@ -1597,10 +1652,13 @@ def test_list_roles_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoleServiceRestInterceptor, "post_list_roles" ) as post, mock.patch.object( + transports.RoleServiceRestInterceptor, "post_list_roles_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoleServiceRestInterceptor, "pre_list_roles" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = role_service.ListRolesRequest.pb(role_service.ListRolesRequest()) transcode.return_value = { "method": "post", @@ -1624,6 +1682,7 @@ def test_list_roles_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = role_service.ListRolesResponse() + post_with_metadata.return_value = role_service.ListRolesResponse(), metadata client.list_roles( request, @@ -1635,6 +1694,7 @@ def test_list_roles_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-ads-admanager/tests/unit/gapic/admanager_v1/test_taxonomy_category_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_taxonomy_category_service.py index b8dfaa8586f0..e17de5923ede 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_taxonomy_category_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_taxonomy_category_service.py @@ -64,6 +64,13 @@ taxonomy_type_enum, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -334,6 +341,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TaxonomyCategoryServiceClient(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 = TaxonomyCategoryServiceClient(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", [ @@ -1582,10 +1632,14 @@ def test_get_taxonomy_category_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TaxonomyCategoryServiceRestInterceptor, "post_get_taxonomy_category" ) as post, mock.patch.object( + transports.TaxonomyCategoryServiceRestInterceptor, + "post_get_taxonomy_category_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TaxonomyCategoryServiceRestInterceptor, "pre_get_taxonomy_category" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = taxonomy_category_service.GetTaxonomyCategoryRequest.pb( taxonomy_category_service.GetTaxonomyCategoryRequest() ) @@ -1611,6 +1665,10 @@ def test_get_taxonomy_category_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = taxonomy_category_messages.TaxonomyCategory() + post_with_metadata.return_value = ( + taxonomy_category_messages.TaxonomyCategory(), + metadata, + ) client.get_taxonomy_category( request, @@ -1622,6 +1680,7 @@ def test_get_taxonomy_category_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_taxonomy_categories_rest_bad_request( @@ -1711,11 +1770,15 @@ def test_list_taxonomy_categories_rest_interceptors(null_interceptor): transports.TaxonomyCategoryServiceRestInterceptor, "post_list_taxonomy_categories", ) as post, mock.patch.object( + transports.TaxonomyCategoryServiceRestInterceptor, + "post_list_taxonomy_categories_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TaxonomyCategoryServiceRestInterceptor, "pre_list_taxonomy_categories", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = taxonomy_category_service.ListTaxonomyCategoriesRequest.pb( taxonomy_category_service.ListTaxonomyCategoriesRequest() ) @@ -1741,6 +1804,10 @@ def test_list_taxonomy_categories_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = taxonomy_category_service.ListTaxonomyCategoriesResponse() + post_with_metadata.return_value = ( + taxonomy_category_service.ListTaxonomyCategoriesResponse(), + metadata, + ) client.list_taxonomy_categories( request, @@ -1752,6 +1819,7 @@ def test_list_taxonomy_categories_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-ads-admanager/tests/unit/gapic/admanager_v1/test_user_service.py b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_user_service.py index e7c70abf8365..7819d3308ae5 100644 --- a/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_user_service.py +++ b/packages/google-ads-admanager/tests/unit/gapic/admanager_v1/test_user_service.py @@ -56,6 +56,13 @@ from google.ads.admanager_v1.services.user_service import UserServiceClient, transports from google.ads.admanager_v1.types import user_messages, user_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 @@ -290,6 +297,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 = UserServiceClient(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 = UserServiceClient(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", [ @@ -1223,10 +1273,13 @@ def test_get_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UserServiceRestInterceptor, "post_get_user" ) as post, mock.patch.object( + transports.UserServiceRestInterceptor, "post_get_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UserServiceRestInterceptor, "pre_get_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = user_service.GetUserRequest.pb(user_service.GetUserRequest()) transcode.return_value = { "method": "post", @@ -1248,6 +1301,7 @@ def test_get_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = user_messages.User() + post_with_metadata.return_value = user_messages.User(), metadata client.get_user( request, @@ -1259,6 +1313,7 @@ def test_get_user_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-ads-marketingplatform-admin/google/ads/marketingplatform_admin/gapic_version.py b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin/gapic_version.py index 114e40645800..558c8aab67c5 100644 --- a/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin/gapic_version.py +++ b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.3" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/gapic_version.py b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/gapic_version.py index 114e40645800..558c8aab67c5 100644 --- a/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/gapic_version.py +++ b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.3" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/client.py b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/client.py index 15e600d41a85..35c9a48b8075 100644 --- a/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/client.py +++ b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -540,6 +542,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-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/transports/rest.py b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/transports/rest.py index 517279fa52d3..53f2ab002944 100644 --- a/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/transports/rest.py +++ b/packages/google-ads-marketingplatform-admin/google/ads/marketingplatform_admin_v1alpha/services/marketingplatform_admin_service/transports/rest.py @@ -134,12 +134,35 @@ def post_create_analytics_account_link( ) -> resources.AnalyticsAccountLink: """Post-rpc interceptor for create_analytics_account_link - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_analytics_account_link_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MarketingplatformAdminService server but before - it is returned to user code. + it is returned to user code. This `post_create_analytics_account_link` interceptor runs + before the `post_create_analytics_account_link_with_metadata` interceptor. """ return response + def post_create_analytics_account_link_with_metadata( + self, + response: resources.AnalyticsAccountLink, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.AnalyticsAccountLink, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_analytics_account_link + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MarketingplatformAdminService server but before it is returned to user code. + + We recommend only using this `post_create_analytics_account_link_with_metadata` + interceptor in new development instead of the `post_create_analytics_account_link` interceptor. + When both interceptors are used, this `post_create_analytics_account_link_with_metadata` interceptor runs after the + `post_create_analytics_account_link` interceptor. The (possibly modified) response returned by + `post_create_analytics_account_link` will be passed to + `post_create_analytics_account_link_with_metadata`. + """ + return response, metadata + def pre_delete_analytics_account_link( self, request: marketingplatform_admin.DeleteAnalyticsAccountLinkRequest, @@ -175,12 +198,35 @@ def post_get_organization( ) -> resources.Organization: """Post-rpc interceptor for get_organization - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_organization_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MarketingplatformAdminService server but before - it is returned to user code. + it is returned to user code. This `post_get_organization` interceptor runs + before the `post_get_organization_with_metadata` interceptor. """ return response + def post_get_organization_with_metadata( + self, + response: resources.Organization, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Organization, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_organization + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MarketingplatformAdminService server but before it is returned to user code. + + We recommend only using this `post_get_organization_with_metadata` + interceptor in new development instead of the `post_get_organization` interceptor. + When both interceptors are used, this `post_get_organization_with_metadata` interceptor runs after the + `post_get_organization` interceptor. The (possibly modified) response returned by + `post_get_organization` will be passed to + `post_get_organization_with_metadata`. + """ + return response, metadata + def pre_list_analytics_account_links( self, request: marketingplatform_admin.ListAnalyticsAccountLinksRequest, @@ -201,12 +247,38 @@ def post_list_analytics_account_links( ) -> marketingplatform_admin.ListAnalyticsAccountLinksResponse: """Post-rpc interceptor for list_analytics_account_links - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_analytics_account_links_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MarketingplatformAdminService server but before - it is returned to user code. + it is returned to user code. This `post_list_analytics_account_links` interceptor runs + before the `post_list_analytics_account_links_with_metadata` interceptor. """ return response + def post_list_analytics_account_links_with_metadata( + self, + response: marketingplatform_admin.ListAnalyticsAccountLinksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + marketingplatform_admin.ListAnalyticsAccountLinksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_analytics_account_links + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MarketingplatformAdminService server but before it is returned to user code. + + We recommend only using this `post_list_analytics_account_links_with_metadata` + interceptor in new development instead of the `post_list_analytics_account_links` interceptor. + When both interceptors are used, this `post_list_analytics_account_links_with_metadata` interceptor runs after the + `post_list_analytics_account_links` interceptor. The (possibly modified) response returned by + `post_list_analytics_account_links` will be passed to + `post_list_analytics_account_links_with_metadata`. + """ + return response, metadata + def pre_set_property_service_level( self, request: marketingplatform_admin.SetPropertyServiceLevelRequest, @@ -227,12 +299,38 @@ def post_set_property_service_level( ) -> marketingplatform_admin.SetPropertyServiceLevelResponse: """Post-rpc interceptor for set_property_service_level - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_property_service_level_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MarketingplatformAdminService server but before - it is returned to user code. + it is returned to user code. This `post_set_property_service_level` interceptor runs + before the `post_set_property_service_level_with_metadata` interceptor. """ return response + def post_set_property_service_level_with_metadata( + self, + response: marketingplatform_admin.SetPropertyServiceLevelResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + marketingplatform_admin.SetPropertyServiceLevelResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for set_property_service_level + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MarketingplatformAdminService server but before it is returned to user code. + + We recommend only using this `post_set_property_service_level_with_metadata` + interceptor in new development instead of the `post_set_property_service_level` interceptor. + When both interceptors are used, this `post_set_property_service_level_with_metadata` interceptor runs after the + `post_set_property_service_level` interceptor. The (possibly modified) response returned by + `post_set_property_service_level` will be passed to + `post_set_property_service_level_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class MarketingplatformAdminServiceRestStub: @@ -459,6 +557,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_analytics_account_link(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_analytics_account_link_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -718,6 +823,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_organization(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_organization_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -867,6 +976,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_analytics_account_links(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_analytics_account_links_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1024,6 +1137,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_property_service_level(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_property_service_level_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ads-marketingplatform-admin/samples/generated_samples/snippet_metadata_google.marketingplatform.admin.v1alpha.json b/packages/google-ads-marketingplatform-admin/samples/generated_samples/snippet_metadata_google.marketingplatform.admin.v1alpha.json index c4d2a89fac50..86c76465c9d5 100644 --- a/packages/google-ads-marketingplatform-admin/samples/generated_samples/snippet_metadata_google.marketingplatform.admin.v1alpha.json +++ b/packages/google-ads-marketingplatform-admin/samples/generated_samples/snippet_metadata_google.marketingplatform.admin.v1alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ads-marketingplatform-admin", - "version": "0.1.3" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ads-marketingplatform-admin/tests/unit/gapic/marketingplatform_admin_v1alpha/test_marketingplatform_admin_service.py b/packages/google-ads-marketingplatform-admin/tests/unit/gapic/marketingplatform_admin_v1alpha/test_marketingplatform_admin_service.py index 09189bc7f2a3..76e2117fc452 100644 --- a/packages/google-ads-marketingplatform-admin/tests/unit/gapic/marketingplatform_admin_v1alpha/test_marketingplatform_admin_service.py +++ b/packages/google-ads-marketingplatform-admin/tests/unit/gapic/marketingplatform_admin_v1alpha/test_marketingplatform_admin_service.py @@ -63,6 +63,13 @@ resources, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -350,6 +357,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = MarketingplatformAdminServiceClient(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 = MarketingplatformAdminServiceClient(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", [ @@ -4560,10 +4610,14 @@ def test_get_organization_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MarketingplatformAdminServiceRestInterceptor, "post_get_organization" ) as post, mock.patch.object( + transports.MarketingplatformAdminServiceRestInterceptor, + "post_get_organization_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.MarketingplatformAdminServiceRestInterceptor, "pre_get_organization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = marketingplatform_admin.GetOrganizationRequest.pb( marketingplatform_admin.GetOrganizationRequest() ) @@ -4587,6 +4641,7 @@ def test_get_organization_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Organization() + post_with_metadata.return_value = resources.Organization(), metadata client.get_organization( request, @@ -4598,6 +4653,7 @@ def test_get_organization_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_analytics_account_links_rest_bad_request( @@ -4685,11 +4741,15 @@ def test_list_analytics_account_links_rest_interceptors(null_interceptor): transports.MarketingplatformAdminServiceRestInterceptor, "post_list_analytics_account_links", ) as post, mock.patch.object( + transports.MarketingplatformAdminServiceRestInterceptor, + "post_list_analytics_account_links_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.MarketingplatformAdminServiceRestInterceptor, "pre_list_analytics_account_links", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = marketingplatform_admin.ListAnalyticsAccountLinksRequest.pb( marketingplatform_admin.ListAnalyticsAccountLinksRequest() ) @@ -4717,6 +4777,10 @@ def test_list_analytics_account_links_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = marketingplatform_admin.ListAnalyticsAccountLinksResponse() + post_with_metadata.return_value = ( + marketingplatform_admin.ListAnalyticsAccountLinksResponse(), + metadata, + ) client.list_analytics_account_links( request, @@ -4728,6 +4792,7 @@ def test_list_analytics_account_links_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_analytics_account_link_rest_bad_request( @@ -4899,11 +4964,15 @@ def test_create_analytics_account_link_rest_interceptors(null_interceptor): transports.MarketingplatformAdminServiceRestInterceptor, "post_create_analytics_account_link", ) as post, mock.patch.object( + transports.MarketingplatformAdminServiceRestInterceptor, + "post_create_analytics_account_link_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.MarketingplatformAdminServiceRestInterceptor, "pre_create_analytics_account_link", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = marketingplatform_admin.CreateAnalyticsAccountLinkRequest.pb( marketingplatform_admin.CreateAnalyticsAccountLinkRequest() ) @@ -4929,6 +4998,7 @@ def test_create_analytics_account_link_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.AnalyticsAccountLink() + post_with_metadata.return_value = resources.AnalyticsAccountLink(), metadata client.create_analytics_account_link( request, @@ -4940,6 +5010,7 @@ def test_create_analytics_account_link_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_analytics_account_link_rest_bad_request( @@ -5138,11 +5209,15 @@ def test_set_property_service_level_rest_interceptors(null_interceptor): transports.MarketingplatformAdminServiceRestInterceptor, "post_set_property_service_level", ) as post, mock.patch.object( + transports.MarketingplatformAdminServiceRestInterceptor, + "post_set_property_service_level_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.MarketingplatformAdminServiceRestInterceptor, "pre_set_property_service_level", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = marketingplatform_admin.SetPropertyServiceLevelRequest.pb( marketingplatform_admin.SetPropertyServiceLevelRequest() ) @@ -5168,6 +5243,10 @@ def test_set_property_service_level_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = marketingplatform_admin.SetPropertyServiceLevelResponse() + post_with_metadata.return_value = ( + marketingplatform_admin.SetPropertyServiceLevelResponse(), + metadata, + ) client.set_property_service_level( request, @@ -5179,6 +5258,7 @@ def test_set_property_service_level_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-ai-generativelanguage/google/ai/generativelanguage/gapic_version.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage/gapic_version.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/gapic_version.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/gapic_version.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/client.py index 5ad720e8cf2e..0b0f0af5c846 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_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. @@ -1399,16 +1428,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, @@ -1454,16 +1487,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-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/transports/rest.py index 152a68d02151..e659cd0e866e 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/generative_service/transports/rest.py @@ -135,12 +135,38 @@ def post_batch_embed_contents( ) -> generative_service.BatchEmbedContentsResponse: """Post-rpc interceptor for batch_embed_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_embed_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_batch_embed_contents` interceptor runs + before the `post_batch_embed_contents_with_metadata` interceptor. """ return response + def post_batch_embed_contents_with_metadata( + self, + response: generative_service.BatchEmbedContentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.BatchEmbedContentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_embed_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_batch_embed_contents_with_metadata` + interceptor in new development instead of the `post_batch_embed_contents` interceptor. + When both interceptors are used, this `post_batch_embed_contents_with_metadata` interceptor runs after the + `post_batch_embed_contents` interceptor. The (possibly modified) response returned by + `post_batch_embed_contents` will be passed to + `post_batch_embed_contents_with_metadata`. + """ + return response, metadata + def pre_count_tokens( self, request: generative_service.CountTokensRequest, @@ -160,12 +186,37 @@ def post_count_tokens( ) -> generative_service.CountTokensResponse: """Post-rpc interceptor for count_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_count_tokens` interceptor runs + before the `post_count_tokens_with_metadata` interceptor. """ return response + def post_count_tokens_with_metadata( + self, + response: generative_service.CountTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.CountTokensResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for count_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_count_tokens_with_metadata` + interceptor in new development instead of the `post_count_tokens` interceptor. + When both interceptors are used, this `post_count_tokens_with_metadata` interceptor runs after the + `post_count_tokens` interceptor. The (possibly modified) response returned by + `post_count_tokens` will be passed to + `post_count_tokens_with_metadata`. + """ + return response, metadata + def pre_embed_content( self, request: generative_service.EmbedContentRequest, @@ -185,12 +236,37 @@ def post_embed_content( ) -> generative_service.EmbedContentResponse: """Post-rpc interceptor for embed_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_embed_content` interceptor runs + before the `post_embed_content_with_metadata` interceptor. """ return response + def post_embed_content_with_metadata( + self, + response: generative_service.EmbedContentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.EmbedContentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for embed_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_embed_content_with_metadata` + interceptor in new development instead of the `post_embed_content` interceptor. + When both interceptors are used, this `post_embed_content_with_metadata` interceptor runs after the + `post_embed_content` interceptor. The (possibly modified) response returned by + `post_embed_content` will be passed to + `post_embed_content_with_metadata`. + """ + return response, metadata + def pre_generate_content( self, request: generative_service.GenerateContentRequest, @@ -211,12 +287,38 @@ def post_generate_content( ) -> generative_service.GenerateContentResponse: """Post-rpc interceptor for generate_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_generate_content` interceptor runs + before the `post_generate_content_with_metadata` interceptor. """ return response + def post_generate_content_with_metadata( + self, + response: generative_service.GenerateContentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.GenerateContentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_generate_content_with_metadata` + interceptor in new development instead of the `post_generate_content` interceptor. + When both interceptors are used, this `post_generate_content_with_metadata` interceptor runs after the + `post_generate_content` interceptor. The (possibly modified) response returned by + `post_generate_content` will be passed to + `post_generate_content_with_metadata`. + """ + return response, metadata + def pre_stream_generate_content( self, request: generative_service.GenerateContentRequest, @@ -237,12 +339,37 @@ def post_stream_generate_content( ) -> rest_streaming.ResponseIterator: """Post-rpc interceptor for stream_generate_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stream_generate_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_stream_generate_content` interceptor runs + before the `post_stream_generate_content_with_metadata` interceptor. """ return response + def post_stream_generate_content_with_metadata( + self, + response: rest_streaming.ResponseIterator, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + rest_streaming.ResponseIterator, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for stream_generate_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_stream_generate_content_with_metadata` + interceptor in new development instead of the `post_stream_generate_content` interceptor. + When both interceptors are used, this `post_stream_generate_content_with_metadata` interceptor runs after the + `post_stream_generate_content` interceptor. The (possibly modified) response returned by + `post_stream_generate_content` will be passed to + `post_stream_generate_content_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -531,6 +658,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_embed_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_embed_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -687,6 +818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -836,6 +971,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1004,6 +1143,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1174,6 +1317,10 @@ def __call__( ) resp = self._interceptor.post_stream_generate_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stream_generate_content_with_metadata( + resp, response_metadata + ) return resp @property diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/client.py index 8eb5853bd189..b3c62cd5cfac 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_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. @@ -977,16 +1006,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, @@ -1032,16 +1065,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-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/transports/rest.py index 99e1125ccde2..55fe63d2c8cc 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1/services/model_service/transports/rest.py @@ -106,12 +106,33 @@ def pre_get_model( def post_get_model(self, response: model.Model) -> model.Model: """Post-rpc interceptor for get_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_model` interceptor runs + before the `post_get_model_with_metadata` interceptor. """ return response + def post_get_model_with_metadata( + self, response: model.Model, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[model.Model, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_model_with_metadata` + interceptor in new development instead of the `post_get_model` interceptor. + When both interceptors are used, this `post_get_model_with_metadata` interceptor runs after the + `post_get_model` interceptor. The (possibly modified) response returned by + `post_get_model` will be passed to + `post_get_model_with_metadata`. + """ + return response, metadata + def pre_list_models( self, request: model_service.ListModelsRequest, @@ -131,12 +152,37 @@ def post_list_models( ) -> model_service.ListModelsResponse: """Post-rpc interceptor for list_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_models` interceptor runs + before the `post_list_models_with_metadata` interceptor. """ return response + def post_list_models_with_metadata( + self, + response: model_service.ListModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_models_with_metadata` + interceptor in new development instead of the `post_list_models` interceptor. + When both interceptors are used, this `post_list_models_with_metadata` interceptor runs after the + `post_list_models` interceptor. The (possibly modified) response returned by + `post_list_models` will be passed to + `post_list_models_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -420,6 +466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -566,6 +616,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/gapic_version.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/gapic_version.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/client.py index ef87e6cbf854..131318a9c1e1 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_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. @@ -1265,16 +1294,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, @@ -1320,16 +1353,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/transports/rest.py index e89f49ec8994..9ca15b4f12e0 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/cache_service/transports/rest.py @@ -136,12 +136,37 @@ def post_create_cached_content( ) -> gag_cached_content.CachedContent: """Post-rpc interceptor for create_cached_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_cached_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_create_cached_content` interceptor runs + before the `post_create_cached_content_with_metadata` interceptor. """ return response + def post_create_cached_content_with_metadata( + self, + response: gag_cached_content.CachedContent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gag_cached_content.CachedContent, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_cached_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_create_cached_content_with_metadata` + interceptor in new development instead of the `post_create_cached_content` interceptor. + When both interceptors are used, this `post_create_cached_content_with_metadata` interceptor runs after the + `post_create_cached_content` interceptor. The (possibly modified) response returned by + `post_create_cached_content` will be passed to + `post_create_cached_content_with_metadata`. + """ + return response, metadata + def pre_delete_cached_content( self, request: cache_service.DeleteCachedContentRequest, @@ -176,12 +201,35 @@ def post_get_cached_content( ) -> cached_content.CachedContent: """Post-rpc interceptor for get_cached_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_cached_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_get_cached_content` interceptor runs + before the `post_get_cached_content_with_metadata` interceptor. """ return response + def post_get_cached_content_with_metadata( + self, + response: cached_content.CachedContent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cached_content.CachedContent, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_cached_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_get_cached_content_with_metadata` + interceptor in new development instead of the `post_get_cached_content` interceptor. + When both interceptors are used, this `post_get_cached_content_with_metadata` interceptor runs after the + `post_get_cached_content` interceptor. The (possibly modified) response returned by + `post_get_cached_content` will be passed to + `post_get_cached_content_with_metadata`. + """ + return response, metadata + def pre_list_cached_contents( self, request: cache_service.ListCachedContentsRequest, @@ -201,12 +249,38 @@ def post_list_cached_contents( ) -> cache_service.ListCachedContentsResponse: """Post-rpc interceptor for list_cached_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_cached_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_list_cached_contents` interceptor runs + before the `post_list_cached_contents_with_metadata` interceptor. """ return response + def post_list_cached_contents_with_metadata( + self, + response: cache_service.ListCachedContentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cache_service.ListCachedContentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_cached_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_list_cached_contents_with_metadata` + interceptor in new development instead of the `post_list_cached_contents` interceptor. + When both interceptors are used, this `post_list_cached_contents_with_metadata` interceptor runs after the + `post_list_cached_contents` interceptor. The (possibly modified) response returned by + `post_list_cached_contents` will be passed to + `post_list_cached_contents_with_metadata`. + """ + return response, metadata + def pre_update_cached_content( self, request: cache_service.UpdateCachedContentRequest, @@ -227,12 +301,37 @@ def post_update_cached_content( ) -> gag_cached_content.CachedContent: """Post-rpc interceptor for update_cached_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_cached_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_update_cached_content` interceptor runs + before the `post_update_cached_content_with_metadata` interceptor. """ return response + def post_update_cached_content_with_metadata( + self, + response: gag_cached_content.CachedContent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gag_cached_content.CachedContent, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_cached_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_update_cached_content_with_metadata` + interceptor in new development instead of the `post_update_cached_content` interceptor. + When both interceptors are used, this `post_update_cached_content_with_metadata` interceptor runs after the + `post_update_cached_content` interceptor. The (possibly modified) response returned by + `post_update_cached_content` will be passed to + `post_update_cached_content_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -505,6 +604,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_cached_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_cached_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -763,6 +866,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_cached_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_cached_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -905,6 +1012,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_cached_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_cached_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1061,6 +1172,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_cached_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_cached_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/client.py index b68a0d415f6a..57e764cb37c2 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_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 @@ -482,6 +484,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. @@ -1053,16 +1082,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, @@ -1108,16 +1141,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/transports/rest.py index f8b214dd0ac0..e0d416b9d02d 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/discuss_service/transports/rest.py @@ -111,12 +111,38 @@ def post_count_message_tokens( ) -> discuss_service.CountMessageTokensResponse: """Post-rpc interceptor for count_message_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_message_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_count_message_tokens` interceptor runs + before the `post_count_message_tokens_with_metadata` interceptor. """ return response + def post_count_message_tokens_with_metadata( + self, + response: discuss_service.CountMessageTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.CountMessageTokensResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for count_message_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_count_message_tokens_with_metadata` + interceptor in new development instead of the `post_count_message_tokens` interceptor. + When both interceptors are used, this `post_count_message_tokens_with_metadata` interceptor runs after the + `post_count_message_tokens` interceptor. The (possibly modified) response returned by + `post_count_message_tokens` will be passed to + `post_count_message_tokens_with_metadata`. + """ + return response, metadata + def pre_generate_message( self, request: discuss_service.GenerateMessageRequest, @@ -136,12 +162,37 @@ def post_generate_message( ) -> discuss_service.GenerateMessageResponse: """Post-rpc interceptor for generate_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_generate_message` interceptor runs + before the `post_generate_message_with_metadata` interceptor. """ return response + def post_generate_message_with_metadata( + self, + response: discuss_service.GenerateMessageResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.GenerateMessageResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_generate_message_with_metadata` + interceptor in new development instead of the `post_generate_message` interceptor. + When both interceptors are used, this `post_generate_message_with_metadata` interceptor runs after the + `post_generate_message` interceptor. The (possibly modified) response returned by + `post_generate_message` will be passed to + `post_generate_message_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -415,6 +466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_message_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_message_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -571,6 +626,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/client.py index 84e6918cdba4..f5c535a4bb8a 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_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. @@ -1090,16 +1119,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, @@ -1145,16 +1178,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/transports/rest.py index 4c47868cd4ca..62059fbfb08a 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/file_service/transports/rest.py @@ -121,12 +121,37 @@ def post_create_file( ) -> file_service.CreateFileResponse: """Post-rpc interceptor for create_file - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_file_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FileService server but before - it is returned to user code. + it is returned to user code. This `post_create_file` interceptor runs + before the `post_create_file_with_metadata` interceptor. """ return response + def post_create_file_with_metadata( + self, + response: file_service.CreateFileResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + file_service.CreateFileResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_file + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FileService server but before it is returned to user code. + + We recommend only using this `post_create_file_with_metadata` + interceptor in new development instead of the `post_create_file` interceptor. + When both interceptors are used, this `post_create_file_with_metadata` interceptor runs after the + `post_create_file` interceptor. The (possibly modified) response returned by + `post_create_file` will be passed to + `post_create_file_with_metadata`. + """ + return response, metadata + def pre_delete_file( self, request: file_service.DeleteFileRequest, @@ -154,12 +179,33 @@ def pre_get_file( def post_get_file(self, response: file.File) -> file.File: """Post-rpc interceptor for get_file - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_file_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FileService server but before - it is returned to user code. + it is returned to user code. This `post_get_file` interceptor runs + before the `post_get_file_with_metadata` interceptor. """ return response + def post_get_file_with_metadata( + self, response: file.File, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[file.File, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_file + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FileService server but before it is returned to user code. + + We recommend only using this `post_get_file_with_metadata` + interceptor in new development instead of the `post_get_file` interceptor. + When both interceptors are used, this `post_get_file_with_metadata` interceptor runs after the + `post_get_file` interceptor. The (possibly modified) response returned by + `post_get_file` will be passed to + `post_get_file_with_metadata`. + """ + return response, metadata + def pre_list_files( self, request: file_service.ListFilesRequest, @@ -177,12 +223,35 @@ def post_list_files( ) -> file_service.ListFilesResponse: """Post-rpc interceptor for list_files - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_files_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FileService server but before - it is returned to user code. + it is returned to user code. This `post_list_files` interceptor runs + before the `post_list_files_with_metadata` interceptor. """ return response + def post_list_files_with_metadata( + self, + response: file_service.ListFilesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[file_service.ListFilesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_files + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FileService server but before it is returned to user code. + + We recommend only using this `post_list_files_with_metadata` + interceptor in new development instead of the `post_list_files` interceptor. + When both interceptors are used, this `post_list_files_with_metadata` interceptor runs after the + `post_list_files` interceptor. The (possibly modified) response returned by + `post_list_files` will be passed to + `post_list_files_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -447,6 +516,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_file(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_file_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -701,6 +774,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_file(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_file_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -843,6 +920,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_files(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_files_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/client.py index 767855b5befb..60be25f450c8 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_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 @@ -499,6 +501,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. @@ -1676,16 +1705,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, @@ -1731,16 +1764,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/transports/rest.py index 0c4361c7704c..97a44bb5c61c 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/generative_service/transports/rest.py @@ -143,12 +143,38 @@ def post_batch_embed_contents( ) -> generative_service.BatchEmbedContentsResponse: """Post-rpc interceptor for batch_embed_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_embed_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_batch_embed_contents` interceptor runs + before the `post_batch_embed_contents_with_metadata` interceptor. """ return response + def post_batch_embed_contents_with_metadata( + self, + response: generative_service.BatchEmbedContentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.BatchEmbedContentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_embed_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_batch_embed_contents_with_metadata` + interceptor in new development instead of the `post_batch_embed_contents` interceptor. + When both interceptors are used, this `post_batch_embed_contents_with_metadata` interceptor runs after the + `post_batch_embed_contents` interceptor. The (possibly modified) response returned by + `post_batch_embed_contents` will be passed to + `post_batch_embed_contents_with_metadata`. + """ + return response, metadata + def pre_count_tokens( self, request: generative_service.CountTokensRequest, @@ -168,12 +194,37 @@ def post_count_tokens( ) -> generative_service.CountTokensResponse: """Post-rpc interceptor for count_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_count_tokens` interceptor runs + before the `post_count_tokens_with_metadata` interceptor. """ return response + def post_count_tokens_with_metadata( + self, + response: generative_service.CountTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.CountTokensResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for count_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_count_tokens_with_metadata` + interceptor in new development instead of the `post_count_tokens` interceptor. + When both interceptors are used, this `post_count_tokens_with_metadata` interceptor runs after the + `post_count_tokens` interceptor. The (possibly modified) response returned by + `post_count_tokens` will be passed to + `post_count_tokens_with_metadata`. + """ + return response, metadata + def pre_embed_content( self, request: generative_service.EmbedContentRequest, @@ -193,12 +244,37 @@ def post_embed_content( ) -> generative_service.EmbedContentResponse: """Post-rpc interceptor for embed_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_embed_content` interceptor runs + before the `post_embed_content_with_metadata` interceptor. """ return response + def post_embed_content_with_metadata( + self, + response: generative_service.EmbedContentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.EmbedContentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for embed_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_embed_content_with_metadata` + interceptor in new development instead of the `post_embed_content` interceptor. + When both interceptors are used, this `post_embed_content_with_metadata` interceptor runs after the + `post_embed_content` interceptor. The (possibly modified) response returned by + `post_embed_content` will be passed to + `post_embed_content_with_metadata`. + """ + return response, metadata + def pre_generate_answer( self, request: generative_service.GenerateAnswerRequest, @@ -219,12 +295,38 @@ def post_generate_answer( ) -> generative_service.GenerateAnswerResponse: """Post-rpc interceptor for generate_answer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_answer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_generate_answer` interceptor runs + before the `post_generate_answer_with_metadata` interceptor. """ return response + def post_generate_answer_with_metadata( + self, + response: generative_service.GenerateAnswerResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.GenerateAnswerResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_answer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_generate_answer_with_metadata` + interceptor in new development instead of the `post_generate_answer` interceptor. + When both interceptors are used, this `post_generate_answer_with_metadata` interceptor runs after the + `post_generate_answer` interceptor. The (possibly modified) response returned by + `post_generate_answer` will be passed to + `post_generate_answer_with_metadata`. + """ + return response, metadata + def pre_generate_content( self, request: generative_service.GenerateContentRequest, @@ -245,12 +347,38 @@ def post_generate_content( ) -> generative_service.GenerateContentResponse: """Post-rpc interceptor for generate_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_generate_content` interceptor runs + before the `post_generate_content_with_metadata` interceptor. """ return response + def post_generate_content_with_metadata( + self, + response: generative_service.GenerateContentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.GenerateContentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_generate_content_with_metadata` + interceptor in new development instead of the `post_generate_content` interceptor. + When both interceptors are used, this `post_generate_content_with_metadata` interceptor runs after the + `post_generate_content` interceptor. The (possibly modified) response returned by + `post_generate_content` will be passed to + `post_generate_content_with_metadata`. + """ + return response, metadata + def pre_stream_generate_content( self, request: generative_service.GenerateContentRequest, @@ -271,12 +399,37 @@ def post_stream_generate_content( ) -> rest_streaming.ResponseIterator: """Post-rpc interceptor for stream_generate_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stream_generate_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_stream_generate_content` interceptor runs + before the `post_stream_generate_content_with_metadata` interceptor. """ return response + def post_stream_generate_content_with_metadata( + self, + response: rest_streaming.ResponseIterator, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + rest_streaming.ResponseIterator, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for stream_generate_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_stream_generate_content_with_metadata` + interceptor in new development instead of the `post_stream_generate_content` interceptor. + When both interceptors are used, this `post_stream_generate_content_with_metadata` interceptor runs after the + `post_stream_generate_content` interceptor. The (possibly modified) response returned by + `post_stream_generate_content` will be passed to + `post_stream_generate_content_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -542,6 +695,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_embed_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_embed_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -717,6 +874,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -866,6 +1027,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1018,6 +1183,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_answer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_answer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1186,6 +1355,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1356,6 +1529,10 @@ def __call__( ) resp = self._interceptor.post_stream_generate_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stream_generate_content_with_metadata( + resp, response_metadata + ) return resp @property diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/client.py index 41e770b7d4ba..3973fb52d16e 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_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 @@ -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. @@ -1571,16 +1600,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, @@ -1626,16 +1659,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/transports/rest.py index 8f3079a1e97d..da30e2ee76f2 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/model_service/transports/rest.py @@ -149,12 +149,35 @@ def post_create_tuned_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_create_tuned_model` interceptor runs + before the `post_create_tuned_model_with_metadata` interceptor. """ return response + def post_create_tuned_model_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_create_tuned_model_with_metadata` + interceptor in new development instead of the `post_create_tuned_model` interceptor. + When both interceptors are used, this `post_create_tuned_model_with_metadata` interceptor runs after the + `post_create_tuned_model` interceptor. The (possibly modified) response returned by + `post_create_tuned_model` will be passed to + `post_create_tuned_model_with_metadata`. + """ + return response, metadata + def pre_delete_tuned_model( self, request: model_service.DeleteTunedModelRequest, @@ -184,12 +207,33 @@ def pre_get_model( def post_get_model(self, response: model.Model) -> model.Model: """Post-rpc interceptor for get_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_model` interceptor runs + before the `post_get_model_with_metadata` interceptor. """ return response + def post_get_model_with_metadata( + self, response: model.Model, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[model.Model, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_model_with_metadata` + interceptor in new development instead of the `post_get_model` interceptor. + When both interceptors are used, this `post_get_model_with_metadata` interceptor runs after the + `post_get_model` interceptor. The (possibly modified) response returned by + `post_get_model` will be passed to + `post_get_model_with_metadata`. + """ + return response, metadata + def pre_get_tuned_model( self, request: model_service.GetTunedModelRequest, @@ -209,12 +253,35 @@ def post_get_tuned_model( ) -> tuned_model.TunedModel: """Post-rpc interceptor for get_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_tuned_model` interceptor runs + before the `post_get_tuned_model_with_metadata` interceptor. """ return response + def post_get_tuned_model_with_metadata( + self, + response: tuned_model.TunedModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tuned_model.TunedModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_tuned_model_with_metadata` + interceptor in new development instead of the `post_get_tuned_model` interceptor. + When both interceptors are used, this `post_get_tuned_model_with_metadata` interceptor runs after the + `post_get_tuned_model` interceptor. The (possibly modified) response returned by + `post_get_tuned_model` will be passed to + `post_get_tuned_model_with_metadata`. + """ + return response, metadata + def pre_list_models( self, request: model_service.ListModelsRequest, @@ -234,12 +301,37 @@ def post_list_models( ) -> model_service.ListModelsResponse: """Post-rpc interceptor for list_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_models` interceptor runs + before the `post_list_models_with_metadata` interceptor. """ return response + def post_list_models_with_metadata( + self, + response: model_service.ListModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_models_with_metadata` + interceptor in new development instead of the `post_list_models` interceptor. + When both interceptors are used, this `post_list_models_with_metadata` interceptor runs after the + `post_list_models` interceptor. The (possibly modified) response returned by + `post_list_models` will be passed to + `post_list_models_with_metadata`. + """ + return response, metadata + def pre_list_tuned_models( self, request: model_service.ListTunedModelsRequest, @@ -259,12 +351,37 @@ def post_list_tuned_models( ) -> model_service.ListTunedModelsResponse: """Post-rpc interceptor for list_tuned_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tuned_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_tuned_models` interceptor runs + before the `post_list_tuned_models_with_metadata` interceptor. """ return response + def post_list_tuned_models_with_metadata( + self, + response: model_service.ListTunedModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListTunedModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tuned_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_tuned_models_with_metadata` + interceptor in new development instead of the `post_list_tuned_models` interceptor. + When both interceptors are used, this `post_list_tuned_models_with_metadata` interceptor runs after the + `post_list_tuned_models` interceptor. The (possibly modified) response returned by + `post_list_tuned_models` will be passed to + `post_list_tuned_models_with_metadata`. + """ + return response, metadata + def pre_update_tuned_model( self, request: model_service.UpdateTunedModelRequest, @@ -284,12 +401,35 @@ def post_update_tuned_model( ) -> gag_tuned_model.TunedModel: """Post-rpc interceptor for update_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_update_tuned_model` interceptor runs + before the `post_update_tuned_model_with_metadata` interceptor. """ return response + def post_update_tuned_model_with_metadata( + self, + response: gag_tuned_model.TunedModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_tuned_model.TunedModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_update_tuned_model_with_metadata` + interceptor in new development instead of the `post_update_tuned_model` interceptor. + When both interceptors are used, this `post_update_tuned_model_with_metadata` interceptor runs after the + `post_update_tuned_model` interceptor. The (possibly modified) response returned by + `post_update_tuned_model` will be passed to + `post_update_tuned_model_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -607,6 +747,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -860,6 +1004,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1003,6 +1151,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1149,6 +1301,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1295,6 +1451,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tuned_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tuned_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1447,6 +1607,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/client.py index cf608eece1b1..fcd82480e9d3 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_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 @@ -488,6 +490,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. @@ -1457,16 +1486,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, @@ -1512,16 +1545,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/transports/rest.py index 559cf0c08038..4043914bb97a 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/permission_service/transports/rest.py @@ -142,12 +142,35 @@ def post_create_permission( ) -> gag_permission.Permission: """Post-rpc interceptor for create_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_create_permission` interceptor runs + before the `post_create_permission_with_metadata` interceptor. """ return response + def post_create_permission_with_metadata( + self, + response: gag_permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_create_permission_with_metadata` + interceptor in new development instead of the `post_create_permission` interceptor. + When both interceptors are used, this `post_create_permission_with_metadata` interceptor runs after the + `post_create_permission` interceptor. The (possibly modified) response returned by + `post_create_permission` will be passed to + `post_create_permission_with_metadata`. + """ + return response, metadata + def pre_delete_permission( self, request: permission_service.DeletePermissionRequest, @@ -182,12 +205,35 @@ def post_get_permission( ) -> permission.Permission: """Post-rpc interceptor for get_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_get_permission` interceptor runs + before the `post_get_permission_with_metadata` interceptor. """ return response + def post_get_permission_with_metadata( + self, + response: permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_get_permission_with_metadata` + interceptor in new development instead of the `post_get_permission` interceptor. + When both interceptors are used, this `post_get_permission_with_metadata` interceptor runs after the + `post_get_permission` interceptor. The (possibly modified) response returned by + `post_get_permission` will be passed to + `post_get_permission_with_metadata`. + """ + return response, metadata + def pre_list_permissions( self, request: permission_service.ListPermissionsRequest, @@ -208,12 +254,38 @@ def post_list_permissions( ) -> permission_service.ListPermissionsResponse: """Post-rpc interceptor for list_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_list_permissions` interceptor runs + before the `post_list_permissions_with_metadata` interceptor. """ return response + def post_list_permissions_with_metadata( + self, + response: permission_service.ListPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + permission_service.ListPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_list_permissions_with_metadata` + interceptor in new development instead of the `post_list_permissions` interceptor. + When both interceptors are used, this `post_list_permissions_with_metadata` interceptor runs after the + `post_list_permissions` interceptor. The (possibly modified) response returned by + `post_list_permissions` will be passed to + `post_list_permissions_with_metadata`. + """ + return response, metadata + def pre_transfer_ownership( self, request: permission_service.TransferOwnershipRequest, @@ -234,12 +306,38 @@ def post_transfer_ownership( ) -> permission_service.TransferOwnershipResponse: """Post-rpc interceptor for transfer_ownership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_transfer_ownership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_transfer_ownership` interceptor runs + before the `post_transfer_ownership_with_metadata` interceptor. """ return response + def post_transfer_ownership_with_metadata( + self, + response: permission_service.TransferOwnershipResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + permission_service.TransferOwnershipResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for transfer_ownership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_transfer_ownership_with_metadata` + interceptor in new development instead of the `post_transfer_ownership` interceptor. + When both interceptors are used, this `post_transfer_ownership_with_metadata` interceptor runs after the + `post_transfer_ownership` interceptor. The (possibly modified) response returned by + `post_transfer_ownership` will be passed to + `post_transfer_ownership_with_metadata`. + """ + return response, metadata + def pre_update_permission( self, request: permission_service.UpdatePermissionRequest, @@ -260,12 +358,35 @@ def post_update_permission( ) -> gag_permission.Permission: """Post-rpc interceptor for update_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_update_permission` interceptor runs + before the `post_update_permission_with_metadata` interceptor. """ return response + def post_update_permission_with_metadata( + self, + response: gag_permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_update_permission_with_metadata` + interceptor in new development instead of the `post_update_permission` interceptor. + When both interceptors are used, this `post_update_permission_with_metadata` interceptor runs after the + `post_update_permission` interceptor. The (possibly modified) response returned by + `post_update_permission` will be passed to + `post_update_permission_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -553,6 +674,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -827,6 +952,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -972,6 +1101,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1124,6 +1257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_transfer_ownership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_transfer_ownership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1298,6 +1435,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/client.py index 622ce9970e2d..229e599a4943 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_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. @@ -854,16 +883,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, @@ -909,16 +942,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/transports/rest.py index 7dbce1753a9b..3b01905389b6 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/prediction_service/transports/rest.py @@ -102,12 +102,37 @@ def post_predict( ) -> prediction_service.PredictResponse: """Post-rpc interceptor for predict - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_predict_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PredictionService server but before - it is returned to user code. + it is returned to user code. This `post_predict` interceptor runs + before the `post_predict_with_metadata` interceptor. """ return response + def post_predict_with_metadata( + self, + response: prediction_service.PredictResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + prediction_service.PredictResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for predict + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PredictionService server but before it is returned to user code. + + We recommend only using this `post_predict_with_metadata` + interceptor in new development instead of the `post_predict` interceptor. + When both interceptors are used, this `post_predict_with_metadata` interceptor runs after the + `post_predict` interceptor. The (possibly modified) response returned by + `post_predict` will be passed to + `post_predict_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -373,6 +398,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_predict(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_predict_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/client.py index bfc549edba33..d36942c0641e 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_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 @@ -522,6 +524,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. @@ -2800,16 +2829,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, @@ -2855,16 +2888,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/transports/rest.py index a53b3ac01460..6ee1d5ae4c83 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/retriever_service/transports/rest.py @@ -240,12 +240,38 @@ def post_batch_create_chunks( ) -> retriever_service.BatchCreateChunksResponse: """Post-rpc interceptor for batch_create_chunks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_chunks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_chunks` interceptor runs + before the `post_batch_create_chunks_with_metadata` interceptor. """ return response + def post_batch_create_chunks_with_metadata( + self, + response: retriever_service.BatchCreateChunksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.BatchCreateChunksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_create_chunks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_batch_create_chunks_with_metadata` + interceptor in new development instead of the `post_batch_create_chunks` interceptor. + When both interceptors are used, this `post_batch_create_chunks_with_metadata` interceptor runs after the + `post_batch_create_chunks` interceptor. The (possibly modified) response returned by + `post_batch_create_chunks` will be passed to + `post_batch_create_chunks_with_metadata`. + """ + return response, metadata + def pre_batch_delete_chunks( self, request: retriever_service.BatchDeleteChunksRequest, @@ -281,12 +307,38 @@ def post_batch_update_chunks( ) -> retriever_service.BatchUpdateChunksResponse: """Post-rpc interceptor for batch_update_chunks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_chunks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_chunks` interceptor runs + before the `post_batch_update_chunks_with_metadata` interceptor. """ return response + def post_batch_update_chunks_with_metadata( + self, + response: retriever_service.BatchUpdateChunksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.BatchUpdateChunksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_update_chunks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_batch_update_chunks_with_metadata` + interceptor in new development instead of the `post_batch_update_chunks` interceptor. + When both interceptors are used, this `post_batch_update_chunks_with_metadata` interceptor runs after the + `post_batch_update_chunks` interceptor. The (possibly modified) response returned by + `post_batch_update_chunks` will be passed to + `post_batch_update_chunks_with_metadata`. + """ + return response, metadata + def pre_create_chunk( self, request: retriever_service.CreateChunkRequest, @@ -304,12 +356,35 @@ def pre_create_chunk( def post_create_chunk(self, response: retriever.Chunk) -> retriever.Chunk: """Post-rpc interceptor for create_chunk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_chunk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_create_chunk` interceptor runs + before the `post_create_chunk_with_metadata` interceptor. """ return response + def post_create_chunk_with_metadata( + self, + response: retriever.Chunk, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Chunk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_chunk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_create_chunk_with_metadata` + interceptor in new development instead of the `post_create_chunk` interceptor. + When both interceptors are used, this `post_create_chunk_with_metadata` interceptor runs after the + `post_create_chunk` interceptor. The (possibly modified) response returned by + `post_create_chunk` will be passed to + `post_create_chunk_with_metadata`. + """ + return response, metadata + def pre_create_corpus( self, request: retriever_service.CreateCorpusRequest, @@ -327,12 +402,35 @@ def pre_create_corpus( def post_create_corpus(self, response: retriever.Corpus) -> retriever.Corpus: """Post-rpc interceptor for create_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_create_corpus` interceptor runs + before the `post_create_corpus_with_metadata` interceptor. """ return response + def post_create_corpus_with_metadata( + self, + response: retriever.Corpus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Corpus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_create_corpus_with_metadata` + interceptor in new development instead of the `post_create_corpus` interceptor. + When both interceptors are used, this `post_create_corpus_with_metadata` interceptor runs after the + `post_create_corpus` interceptor. The (possibly modified) response returned by + `post_create_corpus` will be passed to + `post_create_corpus_with_metadata`. + """ + return response, metadata + def pre_create_document( self, request: retriever_service.CreateDocumentRequest, @@ -350,12 +448,35 @@ def pre_create_document( def post_create_document(self, response: retriever.Document) -> retriever.Document: """Post-rpc interceptor for create_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_create_document` interceptor runs + before the `post_create_document_with_metadata` interceptor. """ return response + def post_create_document_with_metadata( + self, + response: retriever.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_create_document_with_metadata` + interceptor in new development instead of the `post_create_document` interceptor. + When both interceptors are used, this `post_create_document_with_metadata` interceptor runs after the + `post_create_document` interceptor. The (possibly modified) response returned by + `post_create_document` will be passed to + `post_create_document_with_metadata`. + """ + return response, metadata + def pre_delete_chunk( self, request: retriever_service.DeleteChunkRequest, @@ -415,12 +536,35 @@ def pre_get_chunk( def post_get_chunk(self, response: retriever.Chunk) -> retriever.Chunk: """Post-rpc interceptor for get_chunk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_chunk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_get_chunk` interceptor runs + before the `post_get_chunk_with_metadata` interceptor. """ return response + def post_get_chunk_with_metadata( + self, + response: retriever.Chunk, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Chunk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_chunk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_get_chunk_with_metadata` + interceptor in new development instead of the `post_get_chunk` interceptor. + When both interceptors are used, this `post_get_chunk_with_metadata` interceptor runs after the + `post_get_chunk` interceptor. The (possibly modified) response returned by + `post_get_chunk` will be passed to + `post_get_chunk_with_metadata`. + """ + return response, metadata + def pre_get_corpus( self, request: retriever_service.GetCorpusRequest, @@ -438,12 +582,35 @@ def pre_get_corpus( def post_get_corpus(self, response: retriever.Corpus) -> retriever.Corpus: """Post-rpc interceptor for get_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_get_corpus` interceptor runs + before the `post_get_corpus_with_metadata` interceptor. """ return response + def post_get_corpus_with_metadata( + self, + response: retriever.Corpus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Corpus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_get_corpus_with_metadata` + interceptor in new development instead of the `post_get_corpus` interceptor. + When both interceptors are used, this `post_get_corpus_with_metadata` interceptor runs after the + `post_get_corpus` interceptor. The (possibly modified) response returned by + `post_get_corpus` will be passed to + `post_get_corpus_with_metadata`. + """ + return response, metadata + def pre_get_document( self, request: retriever_service.GetDocumentRequest, @@ -461,12 +628,35 @@ def pre_get_document( def post_get_document(self, response: retriever.Document) -> retriever.Document: """Post-rpc interceptor for get_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_get_document` interceptor runs + before the `post_get_document_with_metadata` interceptor. """ return response + def post_get_document_with_metadata( + self, + response: retriever.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_get_document_with_metadata` + interceptor in new development instead of the `post_get_document` interceptor. + When both interceptors are used, this `post_get_document_with_metadata` interceptor runs after the + `post_get_document` interceptor. The (possibly modified) response returned by + `post_get_document` will be passed to + `post_get_document_with_metadata`. + """ + return response, metadata + def pre_list_chunks( self, request: retriever_service.ListChunksRequest, @@ -486,12 +676,37 @@ def post_list_chunks( ) -> retriever_service.ListChunksResponse: """Post-rpc interceptor for list_chunks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_chunks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_list_chunks` interceptor runs + before the `post_list_chunks_with_metadata` interceptor. """ return response + def post_list_chunks_with_metadata( + self, + response: retriever_service.ListChunksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.ListChunksResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_chunks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_list_chunks_with_metadata` + interceptor in new development instead of the `post_list_chunks` interceptor. + When both interceptors are used, this `post_list_chunks_with_metadata` interceptor runs after the + `post_list_chunks` interceptor. The (possibly modified) response returned by + `post_list_chunks` will be passed to + `post_list_chunks_with_metadata`. + """ + return response, metadata + def pre_list_corpora( self, request: retriever_service.ListCorporaRequest, @@ -511,12 +726,37 @@ def post_list_corpora( ) -> retriever_service.ListCorporaResponse: """Post-rpc interceptor for list_corpora - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_corpora_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_list_corpora` interceptor runs + before the `post_list_corpora_with_metadata` interceptor. """ return response + def post_list_corpora_with_metadata( + self, + response: retriever_service.ListCorporaResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.ListCorporaResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_corpora + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_list_corpora_with_metadata` + interceptor in new development instead of the `post_list_corpora` interceptor. + When both interceptors are used, this `post_list_corpora_with_metadata` interceptor runs after the + `post_list_corpora` interceptor. The (possibly modified) response returned by + `post_list_corpora` will be passed to + `post_list_corpora_with_metadata`. + """ + return response, metadata + def pre_list_documents( self, request: retriever_service.ListDocumentsRequest, @@ -536,12 +776,37 @@ def post_list_documents( ) -> retriever_service.ListDocumentsResponse: """Post-rpc interceptor for list_documents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_documents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_list_documents` interceptor runs + before the `post_list_documents_with_metadata` interceptor. """ return response + def post_list_documents_with_metadata( + self, + response: retriever_service.ListDocumentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.ListDocumentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_documents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_list_documents_with_metadata` + interceptor in new development instead of the `post_list_documents` interceptor. + When both interceptors are used, this `post_list_documents_with_metadata` interceptor runs after the + `post_list_documents` interceptor. The (possibly modified) response returned by + `post_list_documents` will be passed to + `post_list_documents_with_metadata`. + """ + return response, metadata + def pre_query_corpus( self, request: retriever_service.QueryCorpusRequest, @@ -561,12 +826,37 @@ def post_query_corpus( ) -> retriever_service.QueryCorpusResponse: """Post-rpc interceptor for query_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_query_corpus` interceptor runs + before the `post_query_corpus_with_metadata` interceptor. """ return response + def post_query_corpus_with_metadata( + self, + response: retriever_service.QueryCorpusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.QueryCorpusResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for query_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_query_corpus_with_metadata` + interceptor in new development instead of the `post_query_corpus` interceptor. + When both interceptors are used, this `post_query_corpus_with_metadata` interceptor runs after the + `post_query_corpus` interceptor. The (possibly modified) response returned by + `post_query_corpus` will be passed to + `post_query_corpus_with_metadata`. + """ + return response, metadata + def pre_query_document( self, request: retriever_service.QueryDocumentRequest, @@ -586,12 +876,37 @@ def post_query_document( ) -> retriever_service.QueryDocumentResponse: """Post-rpc interceptor for query_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_query_document` interceptor runs + before the `post_query_document_with_metadata` interceptor. """ return response + def post_query_document_with_metadata( + self, + response: retriever_service.QueryDocumentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.QueryDocumentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for query_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_query_document_with_metadata` + interceptor in new development instead of the `post_query_document` interceptor. + When both interceptors are used, this `post_query_document_with_metadata` interceptor runs after the + `post_query_document` interceptor. The (possibly modified) response returned by + `post_query_document` will be passed to + `post_query_document_with_metadata`. + """ + return response, metadata + def pre_update_chunk( self, request: retriever_service.UpdateChunkRequest, @@ -609,12 +924,35 @@ def pre_update_chunk( def post_update_chunk(self, response: retriever.Chunk) -> retriever.Chunk: """Post-rpc interceptor for update_chunk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_chunk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_update_chunk` interceptor runs + before the `post_update_chunk_with_metadata` interceptor. """ return response + def post_update_chunk_with_metadata( + self, + response: retriever.Chunk, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Chunk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_chunk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_update_chunk_with_metadata` + interceptor in new development instead of the `post_update_chunk` interceptor. + When both interceptors are used, this `post_update_chunk_with_metadata` interceptor runs after the + `post_update_chunk` interceptor. The (possibly modified) response returned by + `post_update_chunk` will be passed to + `post_update_chunk_with_metadata`. + """ + return response, metadata + def pre_update_corpus( self, request: retriever_service.UpdateCorpusRequest, @@ -632,12 +970,35 @@ def pre_update_corpus( def post_update_corpus(self, response: retriever.Corpus) -> retriever.Corpus: """Post-rpc interceptor for update_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_update_corpus` interceptor runs + before the `post_update_corpus_with_metadata` interceptor. """ return response + def post_update_corpus_with_metadata( + self, + response: retriever.Corpus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Corpus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_update_corpus_with_metadata` + interceptor in new development instead of the `post_update_corpus` interceptor. + When both interceptors are used, this `post_update_corpus_with_metadata` interceptor runs after the + `post_update_corpus` interceptor. The (possibly modified) response returned by + `post_update_corpus` will be passed to + `post_update_corpus_with_metadata`. + """ + return response, metadata + def pre_update_document( self, request: retriever_service.UpdateDocumentRequest, @@ -655,12 +1016,35 @@ def pre_update_document( def post_update_document(self, response: retriever.Document) -> retriever.Document: """Post-rpc interceptor for update_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_update_document` interceptor runs + before the `post_update_document_with_metadata` interceptor. """ return response + def post_update_document_with_metadata( + self, + response: retriever.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_update_document_with_metadata` + interceptor in new development instead of the `post_update_document` interceptor. + When both interceptors are used, this `post_update_document_with_metadata` interceptor runs after the + `post_update_document` interceptor. The (possibly modified) response returned by + `post_update_document` will be passed to + `post_update_document_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -927,6 +1311,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_chunks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_chunks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1195,6 +1583,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_chunks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_update_chunks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1347,6 +1739,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_chunk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_chunk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1495,6 +1891,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1643,6 +2043,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2108,6 +2512,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_chunk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_chunk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2251,6 +2659,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2394,6 +2806,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2537,6 +2953,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_chunks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_chunks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2682,6 +3102,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_corpora(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_corpora_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2827,6 +3251,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_documents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_documents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2977,6 +3405,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3127,6 +3559,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3279,6 +3715,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_chunk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_chunk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3427,6 +3867,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3575,6 +4019,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/client.py index 39955a0126e3..239868ef37e4 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -480,6 +482,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1311,16 +1340,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, @@ -1366,16 +1399,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-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/transports/rest.py index 87f2c2bc093c..8eae9d59a7c1 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1alpha/services/text_service/transports/rest.py @@ -126,12 +126,37 @@ def post_batch_embed_text( ) -> text_service.BatchEmbedTextResponse: """Post-rpc interceptor for batch_embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_batch_embed_text` interceptor runs + before the `post_batch_embed_text_with_metadata` interceptor. """ return response + def post_batch_embed_text_with_metadata( + self, + response: text_service.BatchEmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.BatchEmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for batch_embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_batch_embed_text_with_metadata` + interceptor in new development instead of the `post_batch_embed_text` interceptor. + When both interceptors are used, this `post_batch_embed_text_with_metadata` interceptor runs after the + `post_batch_embed_text` interceptor. The (possibly modified) response returned by + `post_batch_embed_text` will be passed to + `post_batch_embed_text_with_metadata`. + """ + return response, metadata + def pre_count_text_tokens( self, request: text_service.CountTextTokensRequest, @@ -151,12 +176,37 @@ def post_count_text_tokens( ) -> text_service.CountTextTokensResponse: """Post-rpc interceptor for count_text_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_text_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_count_text_tokens` interceptor runs + before the `post_count_text_tokens_with_metadata` interceptor. """ return response + def post_count_text_tokens_with_metadata( + self, + response: text_service.CountTextTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.CountTextTokensResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for count_text_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_count_text_tokens_with_metadata` + interceptor in new development instead of the `post_count_text_tokens` interceptor. + When both interceptors are used, this `post_count_text_tokens_with_metadata` interceptor runs after the + `post_count_text_tokens` interceptor. The (possibly modified) response returned by + `post_count_text_tokens` will be passed to + `post_count_text_tokens_with_metadata`. + """ + return response, metadata + def pre_embed_text( self, request: text_service.EmbedTextRequest, @@ -174,12 +224,35 @@ def post_embed_text( ) -> text_service.EmbedTextResponse: """Post-rpc interceptor for embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_embed_text` interceptor runs + before the `post_embed_text_with_metadata` interceptor. """ return response + def post_embed_text_with_metadata( + self, + response: text_service.EmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[text_service.EmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_embed_text_with_metadata` + interceptor in new development instead of the `post_embed_text` interceptor. + When both interceptors are used, this `post_embed_text_with_metadata` interceptor runs after the + `post_embed_text` interceptor. The (possibly modified) response returned by + `post_embed_text` will be passed to + `post_embed_text_with_metadata`. + """ + return response, metadata + def pre_generate_text( self, request: text_service.GenerateTextRequest, @@ -199,12 +272,37 @@ def post_generate_text( ) -> text_service.GenerateTextResponse: """Post-rpc interceptor for generate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_generate_text` interceptor runs + before the `post_generate_text_with_metadata` interceptor. """ return response + def post_generate_text_with_metadata( + self, + response: text_service.GenerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.GenerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_generate_text_with_metadata` + interceptor in new development instead of the `post_generate_text` interceptor. + When both interceptors are used, this `post_generate_text_with_metadata` interceptor runs after the + `post_generate_text` interceptor. The (possibly modified) response returned by + `post_generate_text` will be passed to + `post_generate_text_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -471,6 +569,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -629,6 +731,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_text_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_text_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -780,6 +886,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -935,6 +1045,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/gapic_version.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/gapic_version.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/client.py index 86d3bd0e8ad7..c0091e864644 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_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. @@ -1265,16 +1294,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, @@ -1320,16 +1353,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/transports/rest.py index 965f16b2493e..f8d9db07a578 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/cache_service/transports/rest.py @@ -136,12 +136,37 @@ def post_create_cached_content( ) -> gag_cached_content.CachedContent: """Post-rpc interceptor for create_cached_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_cached_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_create_cached_content` interceptor runs + before the `post_create_cached_content_with_metadata` interceptor. """ return response + def post_create_cached_content_with_metadata( + self, + response: gag_cached_content.CachedContent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gag_cached_content.CachedContent, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_cached_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_create_cached_content_with_metadata` + interceptor in new development instead of the `post_create_cached_content` interceptor. + When both interceptors are used, this `post_create_cached_content_with_metadata` interceptor runs after the + `post_create_cached_content` interceptor. The (possibly modified) response returned by + `post_create_cached_content` will be passed to + `post_create_cached_content_with_metadata`. + """ + return response, metadata + def pre_delete_cached_content( self, request: cache_service.DeleteCachedContentRequest, @@ -176,12 +201,35 @@ def post_get_cached_content( ) -> cached_content.CachedContent: """Post-rpc interceptor for get_cached_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_cached_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_get_cached_content` interceptor runs + before the `post_get_cached_content_with_metadata` interceptor. """ return response + def post_get_cached_content_with_metadata( + self, + response: cached_content.CachedContent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cached_content.CachedContent, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_cached_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_get_cached_content_with_metadata` + interceptor in new development instead of the `post_get_cached_content` interceptor. + When both interceptors are used, this `post_get_cached_content_with_metadata` interceptor runs after the + `post_get_cached_content` interceptor. The (possibly modified) response returned by + `post_get_cached_content` will be passed to + `post_get_cached_content_with_metadata`. + """ + return response, metadata + def pre_list_cached_contents( self, request: cache_service.ListCachedContentsRequest, @@ -201,12 +249,38 @@ def post_list_cached_contents( ) -> cache_service.ListCachedContentsResponse: """Post-rpc interceptor for list_cached_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_cached_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_list_cached_contents` interceptor runs + before the `post_list_cached_contents_with_metadata` interceptor. """ return response + def post_list_cached_contents_with_metadata( + self, + response: cache_service.ListCachedContentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cache_service.ListCachedContentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_cached_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_list_cached_contents_with_metadata` + interceptor in new development instead of the `post_list_cached_contents` interceptor. + When both interceptors are used, this `post_list_cached_contents_with_metadata` interceptor runs after the + `post_list_cached_contents` interceptor. The (possibly modified) response returned by + `post_list_cached_contents` will be passed to + `post_list_cached_contents_with_metadata`. + """ + return response, metadata + def pre_update_cached_content( self, request: cache_service.UpdateCachedContentRequest, @@ -227,12 +301,37 @@ def post_update_cached_content( ) -> gag_cached_content.CachedContent: """Post-rpc interceptor for update_cached_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_cached_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CacheService server but before - it is returned to user code. + it is returned to user code. This `post_update_cached_content` interceptor runs + before the `post_update_cached_content_with_metadata` interceptor. """ return response + def post_update_cached_content_with_metadata( + self, + response: gag_cached_content.CachedContent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gag_cached_content.CachedContent, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_cached_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CacheService server but before it is returned to user code. + + We recommend only using this `post_update_cached_content_with_metadata` + interceptor in new development instead of the `post_update_cached_content` interceptor. + When both interceptors are used, this `post_update_cached_content_with_metadata` interceptor runs after the + `post_update_cached_content` interceptor. The (possibly modified) response returned by + `post_update_cached_content` will be passed to + `post_update_cached_content_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -505,6 +604,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_cached_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_cached_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -763,6 +866,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_cached_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_cached_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -905,6 +1012,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_cached_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_cached_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1061,6 +1172,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_cached_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_cached_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/client.py index 5d236e1acefe..b9a4a15fc61d 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_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 @@ -482,6 +484,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. @@ -1053,16 +1082,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, @@ -1108,16 +1141,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/transports/rest.py index 80a1cc50d0fc..dbe4b09ab536 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/discuss_service/transports/rest.py @@ -111,12 +111,38 @@ def post_count_message_tokens( ) -> discuss_service.CountMessageTokensResponse: """Post-rpc interceptor for count_message_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_message_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_count_message_tokens` interceptor runs + before the `post_count_message_tokens_with_metadata` interceptor. """ return response + def post_count_message_tokens_with_metadata( + self, + response: discuss_service.CountMessageTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.CountMessageTokensResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for count_message_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_count_message_tokens_with_metadata` + interceptor in new development instead of the `post_count_message_tokens` interceptor. + When both interceptors are used, this `post_count_message_tokens_with_metadata` interceptor runs after the + `post_count_message_tokens` interceptor. The (possibly modified) response returned by + `post_count_message_tokens` will be passed to + `post_count_message_tokens_with_metadata`. + """ + return response, metadata + def pre_generate_message( self, request: discuss_service.GenerateMessageRequest, @@ -136,12 +162,37 @@ def post_generate_message( ) -> discuss_service.GenerateMessageResponse: """Post-rpc interceptor for generate_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_generate_message` interceptor runs + before the `post_generate_message_with_metadata` interceptor. """ return response + def post_generate_message_with_metadata( + self, + response: discuss_service.GenerateMessageResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.GenerateMessageResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_generate_message_with_metadata` + interceptor in new development instead of the `post_generate_message` interceptor. + When both interceptors are used, this `post_generate_message_with_metadata` interceptor runs after the + `post_generate_message` interceptor. The (possibly modified) response returned by + `post_generate_message` will be passed to + `post_generate_message_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -415,6 +466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_message_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_message_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -571,6 +626,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/client.py index f4e97c3210b9..923a9849cdca 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_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. @@ -1090,16 +1119,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, @@ -1145,16 +1178,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/transports/rest.py index 82c4b919bee6..de91eb2dd2ea 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/file_service/transports/rest.py @@ -121,12 +121,37 @@ def post_create_file( ) -> file_service.CreateFileResponse: """Post-rpc interceptor for create_file - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_file_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FileService server but before - it is returned to user code. + it is returned to user code. This `post_create_file` interceptor runs + before the `post_create_file_with_metadata` interceptor. """ return response + def post_create_file_with_metadata( + self, + response: file_service.CreateFileResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + file_service.CreateFileResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_file + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FileService server but before it is returned to user code. + + We recommend only using this `post_create_file_with_metadata` + interceptor in new development instead of the `post_create_file` interceptor. + When both interceptors are used, this `post_create_file_with_metadata` interceptor runs after the + `post_create_file` interceptor. The (possibly modified) response returned by + `post_create_file` will be passed to + `post_create_file_with_metadata`. + """ + return response, metadata + def pre_delete_file( self, request: file_service.DeleteFileRequest, @@ -154,12 +179,33 @@ def pre_get_file( def post_get_file(self, response: file.File) -> file.File: """Post-rpc interceptor for get_file - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_file_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FileService server but before - it is returned to user code. + it is returned to user code. This `post_get_file` interceptor runs + before the `post_get_file_with_metadata` interceptor. """ return response + def post_get_file_with_metadata( + self, response: file.File, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[file.File, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_file + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FileService server but before it is returned to user code. + + We recommend only using this `post_get_file_with_metadata` + interceptor in new development instead of the `post_get_file` interceptor. + When both interceptors are used, this `post_get_file_with_metadata` interceptor runs after the + `post_get_file` interceptor. The (possibly modified) response returned by + `post_get_file` will be passed to + `post_get_file_with_metadata`. + """ + return response, metadata + def pre_list_files( self, request: file_service.ListFilesRequest, @@ -177,12 +223,35 @@ def post_list_files( ) -> file_service.ListFilesResponse: """Post-rpc interceptor for list_files - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_files_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FileService server but before - it is returned to user code. + it is returned to user code. This `post_list_files` interceptor runs + before the `post_list_files_with_metadata` interceptor. """ return response + def post_list_files_with_metadata( + self, + response: file_service.ListFilesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[file_service.ListFilesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_files + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FileService server but before it is returned to user code. + + We recommend only using this `post_list_files_with_metadata` + interceptor in new development instead of the `post_list_files` interceptor. + When both interceptors are used, this `post_list_files_with_metadata` interceptor runs after the + `post_list_files` interceptor. The (possibly modified) response returned by + `post_list_files` will be passed to + `post_list_files_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -447,6 +516,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_file(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_file_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -701,6 +774,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_file(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_file_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -843,6 +920,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_files(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_files_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/client.py index b4588a5cb920..ad896faec13d 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_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 @@ -498,6 +500,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. @@ -1584,16 +1613,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, @@ -1639,16 +1672,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/transports/rest.py index e37b9eeb1a00..e8f00c32dbda 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/generative_service/transports/rest.py @@ -143,12 +143,38 @@ def post_batch_embed_contents( ) -> generative_service.BatchEmbedContentsResponse: """Post-rpc interceptor for batch_embed_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_embed_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_batch_embed_contents` interceptor runs + before the `post_batch_embed_contents_with_metadata` interceptor. """ return response + def post_batch_embed_contents_with_metadata( + self, + response: generative_service.BatchEmbedContentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.BatchEmbedContentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_embed_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_batch_embed_contents_with_metadata` + interceptor in new development instead of the `post_batch_embed_contents` interceptor. + When both interceptors are used, this `post_batch_embed_contents_with_metadata` interceptor runs after the + `post_batch_embed_contents` interceptor. The (possibly modified) response returned by + `post_batch_embed_contents` will be passed to + `post_batch_embed_contents_with_metadata`. + """ + return response, metadata + def pre_count_tokens( self, request: generative_service.CountTokensRequest, @@ -168,12 +194,37 @@ def post_count_tokens( ) -> generative_service.CountTokensResponse: """Post-rpc interceptor for count_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_count_tokens` interceptor runs + before the `post_count_tokens_with_metadata` interceptor. """ return response + def post_count_tokens_with_metadata( + self, + response: generative_service.CountTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.CountTokensResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for count_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_count_tokens_with_metadata` + interceptor in new development instead of the `post_count_tokens` interceptor. + When both interceptors are used, this `post_count_tokens_with_metadata` interceptor runs after the + `post_count_tokens` interceptor. The (possibly modified) response returned by + `post_count_tokens` will be passed to + `post_count_tokens_with_metadata`. + """ + return response, metadata + def pre_embed_content( self, request: generative_service.EmbedContentRequest, @@ -193,12 +244,37 @@ def post_embed_content( ) -> generative_service.EmbedContentResponse: """Post-rpc interceptor for embed_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_embed_content` interceptor runs + before the `post_embed_content_with_metadata` interceptor. """ return response + def post_embed_content_with_metadata( + self, + response: generative_service.EmbedContentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.EmbedContentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for embed_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_embed_content_with_metadata` + interceptor in new development instead of the `post_embed_content` interceptor. + When both interceptors are used, this `post_embed_content_with_metadata` interceptor runs after the + `post_embed_content` interceptor. The (possibly modified) response returned by + `post_embed_content` will be passed to + `post_embed_content_with_metadata`. + """ + return response, metadata + def pre_generate_answer( self, request: generative_service.GenerateAnswerRequest, @@ -219,12 +295,38 @@ def post_generate_answer( ) -> generative_service.GenerateAnswerResponse: """Post-rpc interceptor for generate_answer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_answer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_generate_answer` interceptor runs + before the `post_generate_answer_with_metadata` interceptor. """ return response + def post_generate_answer_with_metadata( + self, + response: generative_service.GenerateAnswerResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.GenerateAnswerResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_answer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_generate_answer_with_metadata` + interceptor in new development instead of the `post_generate_answer` interceptor. + When both interceptors are used, this `post_generate_answer_with_metadata` interceptor runs after the + `post_generate_answer` interceptor. The (possibly modified) response returned by + `post_generate_answer` will be passed to + `post_generate_answer_with_metadata`. + """ + return response, metadata + def pre_generate_content( self, request: generative_service.GenerateContentRequest, @@ -245,12 +347,38 @@ def post_generate_content( ) -> generative_service.GenerateContentResponse: """Post-rpc interceptor for generate_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_generate_content` interceptor runs + before the `post_generate_content_with_metadata` interceptor. """ return response + def post_generate_content_with_metadata( + self, + response: generative_service.GenerateContentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + generative_service.GenerateContentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_generate_content_with_metadata` + interceptor in new development instead of the `post_generate_content` interceptor. + When both interceptors are used, this `post_generate_content_with_metadata` interceptor runs after the + `post_generate_content` interceptor. The (possibly modified) response returned by + `post_generate_content` will be passed to + `post_generate_content_with_metadata`. + """ + return response, metadata + def pre_stream_generate_content( self, request: generative_service.GenerateContentRequest, @@ -271,12 +399,37 @@ def post_stream_generate_content( ) -> rest_streaming.ResponseIterator: """Post-rpc interceptor for stream_generate_content - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stream_generate_content_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GenerativeService server but before - it is returned to user code. + it is returned to user code. This `post_stream_generate_content` interceptor runs + before the `post_stream_generate_content_with_metadata` interceptor. """ return response + def post_stream_generate_content_with_metadata( + self, + response: rest_streaming.ResponseIterator, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + rest_streaming.ResponseIterator, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for stream_generate_content + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GenerativeService server but before it is returned to user code. + + We recommend only using this `post_stream_generate_content_with_metadata` + interceptor in new development instead of the `post_stream_generate_content` interceptor. + When both interceptors are used, this `post_stream_generate_content_with_metadata` interceptor runs after the + `post_stream_generate_content` interceptor. The (possibly modified) response returned by + `post_stream_generate_content` will be passed to + `post_stream_generate_content_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -542,6 +695,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_embed_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_embed_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -698,6 +855,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -847,6 +1008,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -999,6 +1164,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_answer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_answer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1167,6 +1336,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_content_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1337,6 +1510,10 @@ def __call__( ) resp = self._interceptor.post_stream_generate_content(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stream_generate_content_with_metadata( + resp, response_metadata + ) return resp @property diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/client.py index 702523ff103f..490a5900cbff 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_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 @@ -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. @@ -1571,16 +1600,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, @@ -1626,16 +1659,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/transports/rest.py index 88613b2bba21..40ba4b06a086 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/model_service/transports/rest.py @@ -149,12 +149,35 @@ def post_create_tuned_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_create_tuned_model` interceptor runs + before the `post_create_tuned_model_with_metadata` interceptor. """ return response + def post_create_tuned_model_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_create_tuned_model_with_metadata` + interceptor in new development instead of the `post_create_tuned_model` interceptor. + When both interceptors are used, this `post_create_tuned_model_with_metadata` interceptor runs after the + `post_create_tuned_model` interceptor. The (possibly modified) response returned by + `post_create_tuned_model` will be passed to + `post_create_tuned_model_with_metadata`. + """ + return response, metadata + def pre_delete_tuned_model( self, request: model_service.DeleteTunedModelRequest, @@ -184,12 +207,33 @@ def pre_get_model( def post_get_model(self, response: model.Model) -> model.Model: """Post-rpc interceptor for get_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_model` interceptor runs + before the `post_get_model_with_metadata` interceptor. """ return response + def post_get_model_with_metadata( + self, response: model.Model, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[model.Model, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_model_with_metadata` + interceptor in new development instead of the `post_get_model` interceptor. + When both interceptors are used, this `post_get_model_with_metadata` interceptor runs after the + `post_get_model` interceptor. The (possibly modified) response returned by + `post_get_model` will be passed to + `post_get_model_with_metadata`. + """ + return response, metadata + def pre_get_tuned_model( self, request: model_service.GetTunedModelRequest, @@ -209,12 +253,35 @@ def post_get_tuned_model( ) -> tuned_model.TunedModel: """Post-rpc interceptor for get_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_tuned_model` interceptor runs + before the `post_get_tuned_model_with_metadata` interceptor. """ return response + def post_get_tuned_model_with_metadata( + self, + response: tuned_model.TunedModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tuned_model.TunedModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_tuned_model_with_metadata` + interceptor in new development instead of the `post_get_tuned_model` interceptor. + When both interceptors are used, this `post_get_tuned_model_with_metadata` interceptor runs after the + `post_get_tuned_model` interceptor. The (possibly modified) response returned by + `post_get_tuned_model` will be passed to + `post_get_tuned_model_with_metadata`. + """ + return response, metadata + def pre_list_models( self, request: model_service.ListModelsRequest, @@ -234,12 +301,37 @@ def post_list_models( ) -> model_service.ListModelsResponse: """Post-rpc interceptor for list_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_models` interceptor runs + before the `post_list_models_with_metadata` interceptor. """ return response + def post_list_models_with_metadata( + self, + response: model_service.ListModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_models_with_metadata` + interceptor in new development instead of the `post_list_models` interceptor. + When both interceptors are used, this `post_list_models_with_metadata` interceptor runs after the + `post_list_models` interceptor. The (possibly modified) response returned by + `post_list_models` will be passed to + `post_list_models_with_metadata`. + """ + return response, metadata + def pre_list_tuned_models( self, request: model_service.ListTunedModelsRequest, @@ -259,12 +351,37 @@ def post_list_tuned_models( ) -> model_service.ListTunedModelsResponse: """Post-rpc interceptor for list_tuned_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tuned_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_tuned_models` interceptor runs + before the `post_list_tuned_models_with_metadata` interceptor. """ return response + def post_list_tuned_models_with_metadata( + self, + response: model_service.ListTunedModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListTunedModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tuned_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_tuned_models_with_metadata` + interceptor in new development instead of the `post_list_tuned_models` interceptor. + When both interceptors are used, this `post_list_tuned_models_with_metadata` interceptor runs after the + `post_list_tuned_models` interceptor. The (possibly modified) response returned by + `post_list_tuned_models` will be passed to + `post_list_tuned_models_with_metadata`. + """ + return response, metadata + def pre_update_tuned_model( self, request: model_service.UpdateTunedModelRequest, @@ -284,12 +401,35 @@ def post_update_tuned_model( ) -> gag_tuned_model.TunedModel: """Post-rpc interceptor for update_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_update_tuned_model` interceptor runs + before the `post_update_tuned_model_with_metadata` interceptor. """ return response + def post_update_tuned_model_with_metadata( + self, + response: gag_tuned_model.TunedModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_tuned_model.TunedModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_update_tuned_model_with_metadata` + interceptor in new development instead of the `post_update_tuned_model` interceptor. + When both interceptors are used, this `post_update_tuned_model_with_metadata` interceptor runs after the + `post_update_tuned_model` interceptor. The (possibly modified) response returned by + `post_update_tuned_model` will be passed to + `post_update_tuned_model_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -607,6 +747,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -860,6 +1004,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1003,6 +1151,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1149,6 +1301,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1295,6 +1451,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tuned_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tuned_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1447,6 +1607,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/client.py index bc656856e4b8..e5cc68cc691e 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_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 @@ -488,6 +490,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. @@ -1457,16 +1486,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, @@ -1512,16 +1545,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/transports/rest.py index 8c8f5528a444..1c742a7bfbc6 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/permission_service/transports/rest.py @@ -142,12 +142,35 @@ def post_create_permission( ) -> gag_permission.Permission: """Post-rpc interceptor for create_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_create_permission` interceptor runs + before the `post_create_permission_with_metadata` interceptor. """ return response + def post_create_permission_with_metadata( + self, + response: gag_permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_create_permission_with_metadata` + interceptor in new development instead of the `post_create_permission` interceptor. + When both interceptors are used, this `post_create_permission_with_metadata` interceptor runs after the + `post_create_permission` interceptor. The (possibly modified) response returned by + `post_create_permission` will be passed to + `post_create_permission_with_metadata`. + """ + return response, metadata + def pre_delete_permission( self, request: permission_service.DeletePermissionRequest, @@ -182,12 +205,35 @@ def post_get_permission( ) -> permission.Permission: """Post-rpc interceptor for get_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_get_permission` interceptor runs + before the `post_get_permission_with_metadata` interceptor. """ return response + def post_get_permission_with_metadata( + self, + response: permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_get_permission_with_metadata` + interceptor in new development instead of the `post_get_permission` interceptor. + When both interceptors are used, this `post_get_permission_with_metadata` interceptor runs after the + `post_get_permission` interceptor. The (possibly modified) response returned by + `post_get_permission` will be passed to + `post_get_permission_with_metadata`. + """ + return response, metadata + def pre_list_permissions( self, request: permission_service.ListPermissionsRequest, @@ -208,12 +254,38 @@ def post_list_permissions( ) -> permission_service.ListPermissionsResponse: """Post-rpc interceptor for list_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_list_permissions` interceptor runs + before the `post_list_permissions_with_metadata` interceptor. """ return response + def post_list_permissions_with_metadata( + self, + response: permission_service.ListPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + permission_service.ListPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_list_permissions_with_metadata` + interceptor in new development instead of the `post_list_permissions` interceptor. + When both interceptors are used, this `post_list_permissions_with_metadata` interceptor runs after the + `post_list_permissions` interceptor. The (possibly modified) response returned by + `post_list_permissions` will be passed to + `post_list_permissions_with_metadata`. + """ + return response, metadata + def pre_transfer_ownership( self, request: permission_service.TransferOwnershipRequest, @@ -234,12 +306,38 @@ def post_transfer_ownership( ) -> permission_service.TransferOwnershipResponse: """Post-rpc interceptor for transfer_ownership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_transfer_ownership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_transfer_ownership` interceptor runs + before the `post_transfer_ownership_with_metadata` interceptor. """ return response + def post_transfer_ownership_with_metadata( + self, + response: permission_service.TransferOwnershipResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + permission_service.TransferOwnershipResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for transfer_ownership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_transfer_ownership_with_metadata` + interceptor in new development instead of the `post_transfer_ownership` interceptor. + When both interceptors are used, this `post_transfer_ownership_with_metadata` interceptor runs after the + `post_transfer_ownership` interceptor. The (possibly modified) response returned by + `post_transfer_ownership` will be passed to + `post_transfer_ownership_with_metadata`. + """ + return response, metadata + def pre_update_permission( self, request: permission_service.UpdatePermissionRequest, @@ -260,12 +358,35 @@ def post_update_permission( ) -> gag_permission.Permission: """Post-rpc interceptor for update_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_update_permission` interceptor runs + before the `post_update_permission_with_metadata` interceptor. """ return response + def post_update_permission_with_metadata( + self, + response: gag_permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_update_permission_with_metadata` + interceptor in new development instead of the `post_update_permission` interceptor. + When both interceptors are used, this `post_update_permission_with_metadata` interceptor runs after the + `post_update_permission` interceptor. The (possibly modified) response returned by + `post_update_permission` will be passed to + `post_update_permission_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -553,6 +674,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -827,6 +952,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -972,6 +1101,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1124,6 +1257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_transfer_ownership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_transfer_ownership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1298,6 +1435,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/client.py index 38034e60d0d8..64ba1dd39e5c 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_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. @@ -854,16 +883,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, @@ -909,16 +942,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/transports/rest.py index dcd026c2e771..81551293ad63 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/prediction_service/transports/rest.py @@ -102,12 +102,37 @@ def post_predict( ) -> prediction_service.PredictResponse: """Post-rpc interceptor for predict - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_predict_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PredictionService server but before - it is returned to user code. + it is returned to user code. This `post_predict` interceptor runs + before the `post_predict_with_metadata` interceptor. """ return response + def post_predict_with_metadata( + self, + response: prediction_service.PredictResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + prediction_service.PredictResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for predict + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PredictionService server but before it is returned to user code. + + We recommend only using this `post_predict_with_metadata` + interceptor in new development instead of the `post_predict` interceptor. + When both interceptors are used, this `post_predict_with_metadata` interceptor runs after the + `post_predict` interceptor. The (possibly modified) response returned by + `post_predict` will be passed to + `post_predict_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -373,6 +398,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_predict(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_predict_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/client.py index 61d6ebc8278a..5344ea53f35a 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_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 @@ -522,6 +524,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. @@ -2800,16 +2829,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, @@ -2855,16 +2888,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/transports/rest.py index ef7dafcc451e..ec3f85c30308 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/retriever_service/transports/rest.py @@ -240,12 +240,38 @@ def post_batch_create_chunks( ) -> retriever_service.BatchCreateChunksResponse: """Post-rpc interceptor for batch_create_chunks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_chunks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_chunks` interceptor runs + before the `post_batch_create_chunks_with_metadata` interceptor. """ return response + def post_batch_create_chunks_with_metadata( + self, + response: retriever_service.BatchCreateChunksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.BatchCreateChunksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_create_chunks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_batch_create_chunks_with_metadata` + interceptor in new development instead of the `post_batch_create_chunks` interceptor. + When both interceptors are used, this `post_batch_create_chunks_with_metadata` interceptor runs after the + `post_batch_create_chunks` interceptor. The (possibly modified) response returned by + `post_batch_create_chunks` will be passed to + `post_batch_create_chunks_with_metadata`. + """ + return response, metadata + def pre_batch_delete_chunks( self, request: retriever_service.BatchDeleteChunksRequest, @@ -281,12 +307,38 @@ def post_batch_update_chunks( ) -> retriever_service.BatchUpdateChunksResponse: """Post-rpc interceptor for batch_update_chunks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_chunks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_chunks` interceptor runs + before the `post_batch_update_chunks_with_metadata` interceptor. """ return response + def post_batch_update_chunks_with_metadata( + self, + response: retriever_service.BatchUpdateChunksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.BatchUpdateChunksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_update_chunks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_batch_update_chunks_with_metadata` + interceptor in new development instead of the `post_batch_update_chunks` interceptor. + When both interceptors are used, this `post_batch_update_chunks_with_metadata` interceptor runs after the + `post_batch_update_chunks` interceptor. The (possibly modified) response returned by + `post_batch_update_chunks` will be passed to + `post_batch_update_chunks_with_metadata`. + """ + return response, metadata + def pre_create_chunk( self, request: retriever_service.CreateChunkRequest, @@ -304,12 +356,35 @@ def pre_create_chunk( def post_create_chunk(self, response: retriever.Chunk) -> retriever.Chunk: """Post-rpc interceptor for create_chunk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_chunk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_create_chunk` interceptor runs + before the `post_create_chunk_with_metadata` interceptor. """ return response + def post_create_chunk_with_metadata( + self, + response: retriever.Chunk, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Chunk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_chunk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_create_chunk_with_metadata` + interceptor in new development instead of the `post_create_chunk` interceptor. + When both interceptors are used, this `post_create_chunk_with_metadata` interceptor runs after the + `post_create_chunk` interceptor. The (possibly modified) response returned by + `post_create_chunk` will be passed to + `post_create_chunk_with_metadata`. + """ + return response, metadata + def pre_create_corpus( self, request: retriever_service.CreateCorpusRequest, @@ -327,12 +402,35 @@ def pre_create_corpus( def post_create_corpus(self, response: retriever.Corpus) -> retriever.Corpus: """Post-rpc interceptor for create_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_create_corpus` interceptor runs + before the `post_create_corpus_with_metadata` interceptor. """ return response + def post_create_corpus_with_metadata( + self, + response: retriever.Corpus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Corpus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_create_corpus_with_metadata` + interceptor in new development instead of the `post_create_corpus` interceptor. + When both interceptors are used, this `post_create_corpus_with_metadata` interceptor runs after the + `post_create_corpus` interceptor. The (possibly modified) response returned by + `post_create_corpus` will be passed to + `post_create_corpus_with_metadata`. + """ + return response, metadata + def pre_create_document( self, request: retriever_service.CreateDocumentRequest, @@ -350,12 +448,35 @@ def pre_create_document( def post_create_document(self, response: retriever.Document) -> retriever.Document: """Post-rpc interceptor for create_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_create_document` interceptor runs + before the `post_create_document_with_metadata` interceptor. """ return response + def post_create_document_with_metadata( + self, + response: retriever.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_create_document_with_metadata` + interceptor in new development instead of the `post_create_document` interceptor. + When both interceptors are used, this `post_create_document_with_metadata` interceptor runs after the + `post_create_document` interceptor. The (possibly modified) response returned by + `post_create_document` will be passed to + `post_create_document_with_metadata`. + """ + return response, metadata + def pre_delete_chunk( self, request: retriever_service.DeleteChunkRequest, @@ -415,12 +536,35 @@ def pre_get_chunk( def post_get_chunk(self, response: retriever.Chunk) -> retriever.Chunk: """Post-rpc interceptor for get_chunk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_chunk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_get_chunk` interceptor runs + before the `post_get_chunk_with_metadata` interceptor. """ return response + def post_get_chunk_with_metadata( + self, + response: retriever.Chunk, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Chunk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_chunk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_get_chunk_with_metadata` + interceptor in new development instead of the `post_get_chunk` interceptor. + When both interceptors are used, this `post_get_chunk_with_metadata` interceptor runs after the + `post_get_chunk` interceptor. The (possibly modified) response returned by + `post_get_chunk` will be passed to + `post_get_chunk_with_metadata`. + """ + return response, metadata + def pre_get_corpus( self, request: retriever_service.GetCorpusRequest, @@ -438,12 +582,35 @@ def pre_get_corpus( def post_get_corpus(self, response: retriever.Corpus) -> retriever.Corpus: """Post-rpc interceptor for get_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_get_corpus` interceptor runs + before the `post_get_corpus_with_metadata` interceptor. """ return response + def post_get_corpus_with_metadata( + self, + response: retriever.Corpus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Corpus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_get_corpus_with_metadata` + interceptor in new development instead of the `post_get_corpus` interceptor. + When both interceptors are used, this `post_get_corpus_with_metadata` interceptor runs after the + `post_get_corpus` interceptor. The (possibly modified) response returned by + `post_get_corpus` will be passed to + `post_get_corpus_with_metadata`. + """ + return response, metadata + def pre_get_document( self, request: retriever_service.GetDocumentRequest, @@ -461,12 +628,35 @@ def pre_get_document( def post_get_document(self, response: retriever.Document) -> retriever.Document: """Post-rpc interceptor for get_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_get_document` interceptor runs + before the `post_get_document_with_metadata` interceptor. """ return response + def post_get_document_with_metadata( + self, + response: retriever.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_get_document_with_metadata` + interceptor in new development instead of the `post_get_document` interceptor. + When both interceptors are used, this `post_get_document_with_metadata` interceptor runs after the + `post_get_document` interceptor. The (possibly modified) response returned by + `post_get_document` will be passed to + `post_get_document_with_metadata`. + """ + return response, metadata + def pre_list_chunks( self, request: retriever_service.ListChunksRequest, @@ -486,12 +676,37 @@ def post_list_chunks( ) -> retriever_service.ListChunksResponse: """Post-rpc interceptor for list_chunks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_chunks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_list_chunks` interceptor runs + before the `post_list_chunks_with_metadata` interceptor. """ return response + def post_list_chunks_with_metadata( + self, + response: retriever_service.ListChunksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.ListChunksResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_chunks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_list_chunks_with_metadata` + interceptor in new development instead of the `post_list_chunks` interceptor. + When both interceptors are used, this `post_list_chunks_with_metadata` interceptor runs after the + `post_list_chunks` interceptor. The (possibly modified) response returned by + `post_list_chunks` will be passed to + `post_list_chunks_with_metadata`. + """ + return response, metadata + def pre_list_corpora( self, request: retriever_service.ListCorporaRequest, @@ -511,12 +726,37 @@ def post_list_corpora( ) -> retriever_service.ListCorporaResponse: """Post-rpc interceptor for list_corpora - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_corpora_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_list_corpora` interceptor runs + before the `post_list_corpora_with_metadata` interceptor. """ return response + def post_list_corpora_with_metadata( + self, + response: retriever_service.ListCorporaResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.ListCorporaResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_corpora + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_list_corpora_with_metadata` + interceptor in new development instead of the `post_list_corpora` interceptor. + When both interceptors are used, this `post_list_corpora_with_metadata` interceptor runs after the + `post_list_corpora` interceptor. The (possibly modified) response returned by + `post_list_corpora` will be passed to + `post_list_corpora_with_metadata`. + """ + return response, metadata + def pre_list_documents( self, request: retriever_service.ListDocumentsRequest, @@ -536,12 +776,37 @@ def post_list_documents( ) -> retriever_service.ListDocumentsResponse: """Post-rpc interceptor for list_documents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_documents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_list_documents` interceptor runs + before the `post_list_documents_with_metadata` interceptor. """ return response + def post_list_documents_with_metadata( + self, + response: retriever_service.ListDocumentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.ListDocumentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_documents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_list_documents_with_metadata` + interceptor in new development instead of the `post_list_documents` interceptor. + When both interceptors are used, this `post_list_documents_with_metadata` interceptor runs after the + `post_list_documents` interceptor. The (possibly modified) response returned by + `post_list_documents` will be passed to + `post_list_documents_with_metadata`. + """ + return response, metadata + def pre_query_corpus( self, request: retriever_service.QueryCorpusRequest, @@ -561,12 +826,37 @@ def post_query_corpus( ) -> retriever_service.QueryCorpusResponse: """Post-rpc interceptor for query_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_query_corpus` interceptor runs + before the `post_query_corpus_with_metadata` interceptor. """ return response + def post_query_corpus_with_metadata( + self, + response: retriever_service.QueryCorpusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.QueryCorpusResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for query_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_query_corpus_with_metadata` + interceptor in new development instead of the `post_query_corpus` interceptor. + When both interceptors are used, this `post_query_corpus_with_metadata` interceptor runs after the + `post_query_corpus` interceptor. The (possibly modified) response returned by + `post_query_corpus` will be passed to + `post_query_corpus_with_metadata`. + """ + return response, metadata + def pre_query_document( self, request: retriever_service.QueryDocumentRequest, @@ -586,12 +876,37 @@ def post_query_document( ) -> retriever_service.QueryDocumentResponse: """Post-rpc interceptor for query_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_query_document` interceptor runs + before the `post_query_document_with_metadata` interceptor. """ return response + def post_query_document_with_metadata( + self, + response: retriever_service.QueryDocumentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + retriever_service.QueryDocumentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for query_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_query_document_with_metadata` + interceptor in new development instead of the `post_query_document` interceptor. + When both interceptors are used, this `post_query_document_with_metadata` interceptor runs after the + `post_query_document` interceptor. The (possibly modified) response returned by + `post_query_document` will be passed to + `post_query_document_with_metadata`. + """ + return response, metadata + def pre_update_chunk( self, request: retriever_service.UpdateChunkRequest, @@ -609,12 +924,35 @@ def pre_update_chunk( def post_update_chunk(self, response: retriever.Chunk) -> retriever.Chunk: """Post-rpc interceptor for update_chunk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_chunk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_update_chunk` interceptor runs + before the `post_update_chunk_with_metadata` interceptor. """ return response + def post_update_chunk_with_metadata( + self, + response: retriever.Chunk, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Chunk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_chunk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_update_chunk_with_metadata` + interceptor in new development instead of the `post_update_chunk` interceptor. + When both interceptors are used, this `post_update_chunk_with_metadata` interceptor runs after the + `post_update_chunk` interceptor. The (possibly modified) response returned by + `post_update_chunk` will be passed to + `post_update_chunk_with_metadata`. + """ + return response, metadata + def pre_update_corpus( self, request: retriever_service.UpdateCorpusRequest, @@ -632,12 +970,35 @@ def pre_update_corpus( def post_update_corpus(self, response: retriever.Corpus) -> retriever.Corpus: """Post-rpc interceptor for update_corpus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_corpus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_update_corpus` interceptor runs + before the `post_update_corpus_with_metadata` interceptor. """ return response + def post_update_corpus_with_metadata( + self, + response: retriever.Corpus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Corpus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_corpus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_update_corpus_with_metadata` + interceptor in new development instead of the `post_update_corpus` interceptor. + When both interceptors are used, this `post_update_corpus_with_metadata` interceptor runs after the + `post_update_corpus` interceptor. The (possibly modified) response returned by + `post_update_corpus` will be passed to + `post_update_corpus_with_metadata`. + """ + return response, metadata + def pre_update_document( self, request: retriever_service.UpdateDocumentRequest, @@ -655,12 +1016,35 @@ def pre_update_document( def post_update_document(self, response: retriever.Document) -> retriever.Document: """Post-rpc interceptor for update_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RetrieverService server but before - it is returned to user code. + it is returned to user code. This `post_update_document` interceptor runs + before the `post_update_document_with_metadata` interceptor. """ return response + def post_update_document_with_metadata( + self, + response: retriever.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[retriever.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RetrieverService server but before it is returned to user code. + + We recommend only using this `post_update_document_with_metadata` + interceptor in new development instead of the `post_update_document` interceptor. + When both interceptors are used, this `post_update_document_with_metadata` interceptor runs after the + `post_update_document` interceptor. The (possibly modified) response returned by + `post_update_document` will be passed to + `post_update_document_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -927,6 +1311,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_chunks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_chunks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1195,6 +1583,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_chunks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_update_chunks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1347,6 +1739,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_chunk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_chunk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1495,6 +1891,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1643,6 +2043,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2108,6 +2512,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_chunk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_chunk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2251,6 +2659,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2394,6 +2806,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2537,6 +2953,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_chunks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_chunks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2682,6 +3102,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_corpora(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_corpora_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2827,6 +3251,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_documents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_documents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2977,6 +3405,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3127,6 +3559,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3279,6 +3715,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_chunk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_chunk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3427,6 +3867,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_corpus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_corpus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3575,6 +4019,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/client.py index 7043738543b9..cf1830a62280 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -480,6 +482,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1311,16 +1340,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, @@ -1366,16 +1399,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-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/transports/rest.py index 2fdc0c445f2e..260bc5d231ed 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta/services/text_service/transports/rest.py @@ -126,12 +126,37 @@ def post_batch_embed_text( ) -> text_service.BatchEmbedTextResponse: """Post-rpc interceptor for batch_embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_batch_embed_text` interceptor runs + before the `post_batch_embed_text_with_metadata` interceptor. """ return response + def post_batch_embed_text_with_metadata( + self, + response: text_service.BatchEmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.BatchEmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for batch_embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_batch_embed_text_with_metadata` + interceptor in new development instead of the `post_batch_embed_text` interceptor. + When both interceptors are used, this `post_batch_embed_text_with_metadata` interceptor runs after the + `post_batch_embed_text` interceptor. The (possibly modified) response returned by + `post_batch_embed_text` will be passed to + `post_batch_embed_text_with_metadata`. + """ + return response, metadata + def pre_count_text_tokens( self, request: text_service.CountTextTokensRequest, @@ -151,12 +176,37 @@ def post_count_text_tokens( ) -> text_service.CountTextTokensResponse: """Post-rpc interceptor for count_text_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_text_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_count_text_tokens` interceptor runs + before the `post_count_text_tokens_with_metadata` interceptor. """ return response + def post_count_text_tokens_with_metadata( + self, + response: text_service.CountTextTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.CountTextTokensResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for count_text_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_count_text_tokens_with_metadata` + interceptor in new development instead of the `post_count_text_tokens` interceptor. + When both interceptors are used, this `post_count_text_tokens_with_metadata` interceptor runs after the + `post_count_text_tokens` interceptor. The (possibly modified) response returned by + `post_count_text_tokens` will be passed to + `post_count_text_tokens_with_metadata`. + """ + return response, metadata + def pre_embed_text( self, request: text_service.EmbedTextRequest, @@ -174,12 +224,35 @@ def post_embed_text( ) -> text_service.EmbedTextResponse: """Post-rpc interceptor for embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_embed_text` interceptor runs + before the `post_embed_text_with_metadata` interceptor. """ return response + def post_embed_text_with_metadata( + self, + response: text_service.EmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[text_service.EmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_embed_text_with_metadata` + interceptor in new development instead of the `post_embed_text` interceptor. + When both interceptors are used, this `post_embed_text_with_metadata` interceptor runs after the + `post_embed_text` interceptor. The (possibly modified) response returned by + `post_embed_text` will be passed to + `post_embed_text_with_metadata`. + """ + return response, metadata + def pre_generate_text( self, request: text_service.GenerateTextRequest, @@ -199,12 +272,37 @@ def post_generate_text( ) -> text_service.GenerateTextResponse: """Post-rpc interceptor for generate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_generate_text` interceptor runs + before the `post_generate_text_with_metadata` interceptor. """ return response + def post_generate_text_with_metadata( + self, + response: text_service.GenerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.GenerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_generate_text_with_metadata` + interceptor in new development instead of the `post_generate_text` interceptor. + When both interceptors are used, this `post_generate_text_with_metadata` interceptor runs after the + `post_generate_text` interceptor. The (possibly modified) response returned by + `post_generate_text` will be passed to + `post_generate_text_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -471,6 +569,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -629,6 +731,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_text_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_text_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -780,6 +886,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -935,6 +1045,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/gapic_version.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/gapic_version.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/client.py index 4d2db83aacba..8aacad49752f 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -480,6 +482,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/transports/rest.py index a3f6d345ef27..8afd439d6dc1 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/discuss_service/transports/rest.py @@ -110,12 +110,38 @@ def post_count_message_tokens( ) -> discuss_service.CountMessageTokensResponse: """Post-rpc interceptor for count_message_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_message_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_count_message_tokens` interceptor runs + before the `post_count_message_tokens_with_metadata` interceptor. """ return response + def post_count_message_tokens_with_metadata( + self, + response: discuss_service.CountMessageTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.CountMessageTokensResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for count_message_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_count_message_tokens_with_metadata` + interceptor in new development instead of the `post_count_message_tokens` interceptor. + When both interceptors are used, this `post_count_message_tokens_with_metadata` interceptor runs after the + `post_count_message_tokens` interceptor. The (possibly modified) response returned by + `post_count_message_tokens` will be passed to + `post_count_message_tokens_with_metadata`. + """ + return response, metadata + def pre_generate_message( self, request: discuss_service.GenerateMessageRequest, @@ -135,12 +161,37 @@ def post_generate_message( ) -> discuss_service.GenerateMessageResponse: """Post-rpc interceptor for generate_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_generate_message` interceptor runs + before the `post_generate_message_with_metadata` interceptor. """ return response + def post_generate_message_with_metadata( + self, + response: discuss_service.GenerateMessageResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.GenerateMessageResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_generate_message_with_metadata` + interceptor in new development instead of the `post_generate_message` interceptor. + When both interceptors are used, this `post_generate_message_with_metadata` interceptor runs after the + `post_generate_message` interceptor. The (possibly modified) response returned by + `post_generate_message` will be passed to + `post_generate_message_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class DiscussServiceRestStub: @@ -364,6 +415,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_message_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_message_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -520,6 +575,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/client.py index 81b78eb9aebb..f4d592ac197c 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_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 @@ -477,6 +479,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-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/transports/rest.py index 87bc85f49a7e..2ff1f5d178f4 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/model_service/transports/rest.py @@ -105,12 +105,33 @@ def pre_get_model( def post_get_model(self, response: model.Model) -> model.Model: """Post-rpc interceptor for get_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_model` interceptor runs + before the `post_get_model_with_metadata` interceptor. """ return response + def post_get_model_with_metadata( + self, response: model.Model, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[model.Model, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_model_with_metadata` + interceptor in new development instead of the `post_get_model` interceptor. + When both interceptors are used, this `post_get_model_with_metadata` interceptor runs after the + `post_get_model` interceptor. The (possibly modified) response returned by + `post_get_model` will be passed to + `post_get_model_with_metadata`. + """ + return response, metadata + def pre_list_models( self, request: model_service.ListModelsRequest, @@ -130,12 +151,37 @@ def post_list_models( ) -> model_service.ListModelsResponse: """Post-rpc interceptor for list_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_models` interceptor runs + before the `post_list_models_with_metadata` interceptor. """ return response + def post_list_models_with_metadata( + self, + response: model_service.ListModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_models_with_metadata` + interceptor in new development instead of the `post_list_models` interceptor. + When both interceptors are used, this `post_list_models_with_metadata` interceptor runs after the + `post_list_models` interceptor. The (possibly modified) response returned by + `post_list_models` will be passed to + `post_list_models_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ModelServiceRestStub: @@ -346,6 +392,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -492,6 +542,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/client.py index 0fffeee6b68b..21093740f96a 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_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 @@ -478,6 +480,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/transports/rest.py index ece0f776739c..b0af51a7ef65 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta2/services/text_service/transports/rest.py @@ -107,12 +107,35 @@ def post_embed_text( ) -> text_service.EmbedTextResponse: """Post-rpc interceptor for embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_embed_text` interceptor runs + before the `post_embed_text_with_metadata` interceptor. """ return response + def post_embed_text_with_metadata( + self, + response: text_service.EmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[text_service.EmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_embed_text_with_metadata` + interceptor in new development instead of the `post_embed_text` interceptor. + When both interceptors are used, this `post_embed_text_with_metadata` interceptor runs after the + `post_embed_text` interceptor. The (possibly modified) response returned by + `post_embed_text` will be passed to + `post_embed_text_with_metadata`. + """ + return response, metadata + def pre_generate_text( self, request: text_service.GenerateTextRequest, @@ -132,12 +155,37 @@ def post_generate_text( ) -> text_service.GenerateTextResponse: """Post-rpc interceptor for generate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_generate_text` interceptor runs + before the `post_generate_text_with_metadata` interceptor. """ return response + def post_generate_text_with_metadata( + self, + response: text_service.GenerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.GenerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_generate_text_with_metadata` + interceptor in new development instead of the `post_generate_text` interceptor. + When both interceptors are used, this `post_generate_text_with_metadata` interceptor runs after the + `post_generate_text` interceptor. The (possibly modified) response returned by + `post_generate_text` will be passed to + `post_generate_text_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TextServiceRestStub: @@ -354,6 +402,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -509,6 +561,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/gapic_version.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/gapic_version.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/client.py index 8b0c864b00f4..e42243c00e8b 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_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 @@ -482,6 +484,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-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/transports/rest.py index 19d8130c40e8..565a9e6464ce 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/discuss_service/transports/rest.py @@ -111,12 +111,38 @@ def post_count_message_tokens( ) -> discuss_service.CountMessageTokensResponse: """Post-rpc interceptor for count_message_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_message_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_count_message_tokens` interceptor runs + before the `post_count_message_tokens_with_metadata` interceptor. """ return response + def post_count_message_tokens_with_metadata( + self, + response: discuss_service.CountMessageTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.CountMessageTokensResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for count_message_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_count_message_tokens_with_metadata` + interceptor in new development instead of the `post_count_message_tokens` interceptor. + When both interceptors are used, this `post_count_message_tokens_with_metadata` interceptor runs after the + `post_count_message_tokens` interceptor. The (possibly modified) response returned by + `post_count_message_tokens` will be passed to + `post_count_message_tokens_with_metadata`. + """ + return response, metadata + def pre_generate_message( self, request: discuss_service.GenerateMessageRequest, @@ -136,12 +162,37 @@ def post_generate_message( ) -> discuss_service.GenerateMessageResponse: """Post-rpc interceptor for generate_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiscussService server but before - it is returned to user code. + it is returned to user code. This `post_generate_message` interceptor runs + before the `post_generate_message_with_metadata` interceptor. """ return response + def post_generate_message_with_metadata( + self, + response: discuss_service.GenerateMessageResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + discuss_service.GenerateMessageResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiscussService server but before it is returned to user code. + + We recommend only using this `post_generate_message_with_metadata` + interceptor in new development instead of the `post_generate_message` interceptor. + When both interceptors are used, this `post_generate_message_with_metadata` interceptor runs after the + `post_generate_message` interceptor. The (possibly modified) response returned by + `post_generate_message` will be passed to + `post_generate_message_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class DiscussServiceRestStub: @@ -365,6 +416,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_message_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_message_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -521,6 +576,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/client.py index 0f6ab9afaf39..3ae12ebdc147 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_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 @@ -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. diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/transports/rest.py index ba17fc8955bd..0b1be8fa076a 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/model_service/transports/rest.py @@ -149,12 +149,35 @@ def post_create_tuned_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_create_tuned_model` interceptor runs + before the `post_create_tuned_model_with_metadata` interceptor. """ return response + def post_create_tuned_model_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_create_tuned_model_with_metadata` + interceptor in new development instead of the `post_create_tuned_model` interceptor. + When both interceptors are used, this `post_create_tuned_model_with_metadata` interceptor runs after the + `post_create_tuned_model` interceptor. The (possibly modified) response returned by + `post_create_tuned_model` will be passed to + `post_create_tuned_model_with_metadata`. + """ + return response, metadata + def pre_delete_tuned_model( self, request: model_service.DeleteTunedModelRequest, @@ -184,12 +207,33 @@ def pre_get_model( def post_get_model(self, response: model.Model) -> model.Model: """Post-rpc interceptor for get_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_model` interceptor runs + before the `post_get_model_with_metadata` interceptor. """ return response + def post_get_model_with_metadata( + self, response: model.Model, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[model.Model, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_model_with_metadata` + interceptor in new development instead of the `post_get_model` interceptor. + When both interceptors are used, this `post_get_model_with_metadata` interceptor runs after the + `post_get_model` interceptor. The (possibly modified) response returned by + `post_get_model` will be passed to + `post_get_model_with_metadata`. + """ + return response, metadata + def pre_get_tuned_model( self, request: model_service.GetTunedModelRequest, @@ -209,12 +253,35 @@ def post_get_tuned_model( ) -> tuned_model.TunedModel: """Post-rpc interceptor for get_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_get_tuned_model` interceptor runs + before the `post_get_tuned_model_with_metadata` interceptor. """ return response + def post_get_tuned_model_with_metadata( + self, + response: tuned_model.TunedModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tuned_model.TunedModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_get_tuned_model_with_metadata` + interceptor in new development instead of the `post_get_tuned_model` interceptor. + When both interceptors are used, this `post_get_tuned_model_with_metadata` interceptor runs after the + `post_get_tuned_model` interceptor. The (possibly modified) response returned by + `post_get_tuned_model` will be passed to + `post_get_tuned_model_with_metadata`. + """ + return response, metadata + def pre_list_models( self, request: model_service.ListModelsRequest, @@ -234,12 +301,37 @@ def post_list_models( ) -> model_service.ListModelsResponse: """Post-rpc interceptor for list_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_models` interceptor runs + before the `post_list_models_with_metadata` interceptor. """ return response + def post_list_models_with_metadata( + self, + response: model_service.ListModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_models_with_metadata` + interceptor in new development instead of the `post_list_models` interceptor. + When both interceptors are used, this `post_list_models_with_metadata` interceptor runs after the + `post_list_models` interceptor. The (possibly modified) response returned by + `post_list_models` will be passed to + `post_list_models_with_metadata`. + """ + return response, metadata + def pre_list_tuned_models( self, request: model_service.ListTunedModelsRequest, @@ -259,12 +351,37 @@ def post_list_tuned_models( ) -> model_service.ListTunedModelsResponse: """Post-rpc interceptor for list_tuned_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tuned_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_list_tuned_models` interceptor runs + before the `post_list_tuned_models_with_metadata` interceptor. """ return response + def post_list_tuned_models_with_metadata( + self, + response: model_service.ListTunedModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + model_service.ListTunedModelsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tuned_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_list_tuned_models_with_metadata` + interceptor in new development instead of the `post_list_tuned_models` interceptor. + When both interceptors are used, this `post_list_tuned_models_with_metadata` interceptor runs after the + `post_list_tuned_models` interceptor. The (possibly modified) response returned by + `post_list_tuned_models` will be passed to + `post_list_tuned_models_with_metadata`. + """ + return response, metadata + def pre_update_tuned_model( self, request: model_service.UpdateTunedModelRequest, @@ -284,12 +401,35 @@ def post_update_tuned_model( ) -> gag_tuned_model.TunedModel: """Post-rpc interceptor for update_tuned_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tuned_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ModelService server but before - it is returned to user code. + it is returned to user code. This `post_update_tuned_model` interceptor runs + before the `post_update_tuned_model_with_metadata` interceptor. """ return response + def post_update_tuned_model_with_metadata( + self, + response: gag_tuned_model.TunedModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_tuned_model.TunedModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_tuned_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ModelService server but before it is returned to user code. + + We recommend only using this `post_update_tuned_model_with_metadata` + interceptor in new development instead of the `post_update_tuned_model` interceptor. + When both interceptors are used, this `post_update_tuned_model_with_metadata` interceptor runs after the + `post_update_tuned_model` interceptor. The (possibly modified) response returned by + `post_update_tuned_model` will be passed to + `post_update_tuned_model_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ModelServiceRestStub: @@ -532,6 +672,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -785,6 +929,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -928,6 +1076,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1074,6 +1226,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1220,6 +1376,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tuned_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tuned_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1372,6 +1532,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tuned_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tuned_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/client.py index c3ce5cd4cb63..5a418e18d57b 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_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 @@ -503,6 +505,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-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/transports/rest.py index b97f34e8cd62..e011a16734d3 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/permission_service/transports/rest.py @@ -142,12 +142,35 @@ def post_create_permission( ) -> gag_permission.Permission: """Post-rpc interceptor for create_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_create_permission` interceptor runs + before the `post_create_permission_with_metadata` interceptor. """ return response + def post_create_permission_with_metadata( + self, + response: gag_permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_create_permission_with_metadata` + interceptor in new development instead of the `post_create_permission` interceptor. + When both interceptors are used, this `post_create_permission_with_metadata` interceptor runs after the + `post_create_permission` interceptor. The (possibly modified) response returned by + `post_create_permission` will be passed to + `post_create_permission_with_metadata`. + """ + return response, metadata + def pre_delete_permission( self, request: permission_service.DeletePermissionRequest, @@ -182,12 +205,35 @@ def post_get_permission( ) -> permission.Permission: """Post-rpc interceptor for get_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_get_permission` interceptor runs + before the `post_get_permission_with_metadata` interceptor. """ return response + def post_get_permission_with_metadata( + self, + response: permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_get_permission_with_metadata` + interceptor in new development instead of the `post_get_permission` interceptor. + When both interceptors are used, this `post_get_permission_with_metadata` interceptor runs after the + `post_get_permission` interceptor. The (possibly modified) response returned by + `post_get_permission` will be passed to + `post_get_permission_with_metadata`. + """ + return response, metadata + def pre_list_permissions( self, request: permission_service.ListPermissionsRequest, @@ -208,12 +254,38 @@ def post_list_permissions( ) -> permission_service.ListPermissionsResponse: """Post-rpc interceptor for list_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_list_permissions` interceptor runs + before the `post_list_permissions_with_metadata` interceptor. """ return response + def post_list_permissions_with_metadata( + self, + response: permission_service.ListPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + permission_service.ListPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_list_permissions_with_metadata` + interceptor in new development instead of the `post_list_permissions` interceptor. + When both interceptors are used, this `post_list_permissions_with_metadata` interceptor runs after the + `post_list_permissions` interceptor. The (possibly modified) response returned by + `post_list_permissions` will be passed to + `post_list_permissions_with_metadata`. + """ + return response, metadata + def pre_transfer_ownership( self, request: permission_service.TransferOwnershipRequest, @@ -234,12 +306,38 @@ def post_transfer_ownership( ) -> permission_service.TransferOwnershipResponse: """Post-rpc interceptor for transfer_ownership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_transfer_ownership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_transfer_ownership` interceptor runs + before the `post_transfer_ownership_with_metadata` interceptor. """ return response + def post_transfer_ownership_with_metadata( + self, + response: permission_service.TransferOwnershipResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + permission_service.TransferOwnershipResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for transfer_ownership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_transfer_ownership_with_metadata` + interceptor in new development instead of the `post_transfer_ownership` interceptor. + When both interceptors are used, this `post_transfer_ownership_with_metadata` interceptor runs after the + `post_transfer_ownership` interceptor. The (possibly modified) response returned by + `post_transfer_ownership` will be passed to + `post_transfer_ownership_with_metadata`. + """ + return response, metadata + def pre_update_permission( self, request: permission_service.UpdatePermissionRequest, @@ -260,12 +358,35 @@ def post_update_permission( ) -> gag_permission.Permission: """Post-rpc interceptor for update_permission - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_permission_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PermissionService server but before - it is returned to user code. + it is returned to user code. This `post_update_permission` interceptor runs + before the `post_update_permission_with_metadata` interceptor. """ return response + def post_update_permission_with_metadata( + self, + response: gag_permission.Permission, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gag_permission.Permission, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_permission + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PermissionService server but before it is returned to user code. + + We recommend only using this `post_update_permission_with_metadata` + interceptor in new development instead of the `post_update_permission` interceptor. + When both interceptors are used, this `post_update_permission_with_metadata` interceptor runs after the + `post_update_permission` interceptor. The (possibly modified) response returned by + `post_update_permission` will be passed to + `post_update_permission_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class PermissionServiceRestStub: @@ -503,6 +624,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -777,6 +902,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -922,6 +1051,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1074,6 +1207,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_transfer_ownership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_transfer_ownership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1248,6 +1385,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_permission(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_permission_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/client.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/client.py index 7e3cdb3458fe..45b795163bab 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/client.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -480,6 +482,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/transports/rest.py b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/transports/rest.py index 033bddb0f427..9968dbb7677d 100644 --- a/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/transports/rest.py +++ b/packages/google-ai-generativelanguage/google/ai/generativelanguage_v1beta3/services/text_service/transports/rest.py @@ -126,12 +126,37 @@ def post_batch_embed_text( ) -> text_service.BatchEmbedTextResponse: """Post-rpc interceptor for batch_embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_batch_embed_text` interceptor runs + before the `post_batch_embed_text_with_metadata` interceptor. """ return response + def post_batch_embed_text_with_metadata( + self, + response: text_service.BatchEmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.BatchEmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for batch_embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_batch_embed_text_with_metadata` + interceptor in new development instead of the `post_batch_embed_text` interceptor. + When both interceptors are used, this `post_batch_embed_text_with_metadata` interceptor runs after the + `post_batch_embed_text` interceptor. The (possibly modified) response returned by + `post_batch_embed_text` will be passed to + `post_batch_embed_text_with_metadata`. + """ + return response, metadata + def pre_count_text_tokens( self, request: text_service.CountTextTokensRequest, @@ -151,12 +176,37 @@ def post_count_text_tokens( ) -> text_service.CountTextTokensResponse: """Post-rpc interceptor for count_text_tokens - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_count_text_tokens_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_count_text_tokens` interceptor runs + before the `post_count_text_tokens_with_metadata` interceptor. """ return response + def post_count_text_tokens_with_metadata( + self, + response: text_service.CountTextTokensResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.CountTextTokensResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for count_text_tokens + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_count_text_tokens_with_metadata` + interceptor in new development instead of the `post_count_text_tokens` interceptor. + When both interceptors are used, this `post_count_text_tokens_with_metadata` interceptor runs after the + `post_count_text_tokens` interceptor. The (possibly modified) response returned by + `post_count_text_tokens` will be passed to + `post_count_text_tokens_with_metadata`. + """ + return response, metadata + def pre_embed_text( self, request: text_service.EmbedTextRequest, @@ -174,12 +224,35 @@ def post_embed_text( ) -> text_service.EmbedTextResponse: """Post-rpc interceptor for embed_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_embed_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_embed_text` interceptor runs + before the `post_embed_text_with_metadata` interceptor. """ return response + def post_embed_text_with_metadata( + self, + response: text_service.EmbedTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[text_service.EmbedTextResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for embed_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_embed_text_with_metadata` + interceptor in new development instead of the `post_embed_text` interceptor. + When both interceptors are used, this `post_embed_text_with_metadata` interceptor runs after the + `post_embed_text` interceptor. The (possibly modified) response returned by + `post_embed_text` will be passed to + `post_embed_text_with_metadata`. + """ + return response, metadata + def pre_generate_text( self, request: text_service.GenerateTextRequest, @@ -199,12 +272,37 @@ def post_generate_text( ) -> text_service.GenerateTextResponse: """Post-rpc interceptor for generate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextService server but before - it is returned to user code. + it is returned to user code. This `post_generate_text` interceptor runs + before the `post_generate_text_with_metadata` interceptor. """ return response + def post_generate_text_with_metadata( + self, + response: text_service.GenerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + text_service.GenerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextService server but before it is returned to user code. + + We recommend only using this `post_generate_text_with_metadata` + interceptor in new development instead of the `post_generate_text` interceptor. + When both interceptors are used, this `post_generate_text_with_metadata` interceptor runs after the + `post_generate_text` interceptor. The (possibly modified) response returned by + `post_generate_text` will be passed to + `post_generate_text_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TextServiceRestStub: @@ -421,6 +519,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -579,6 +681,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_count_text_tokens(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_count_text_tokens_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -730,6 +836,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_embed_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_embed_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -885,6 +995,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1.json b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1.json index 18221fc895e9..87bcca60fb53 100644 --- a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1.json +++ b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ai-generativelanguage", - "version": "0.6.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1alpha.json b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1alpha.json index 303885125344..a683a40c49c4 100644 --- a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1alpha.json +++ b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ai-generativelanguage", - "version": "0.6.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta.json b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta.json index 19a45559c266..ad4cc6847367 100644 --- a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta.json +++ b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ai-generativelanguage", - "version": "0.6.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta2.json b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta2.json index b5b3ae5db415..8eb2001adab2 100644 --- a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta2.json +++ b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ai-generativelanguage", - "version": "0.6.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta3.json b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta3.json index 3d2205582199..2d108f936e84 100644 --- a/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta3.json +++ b/packages/google-ai-generativelanguage/samples/generated_samples/snippet_metadata_google.ai.generativelanguage.v1beta3.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-ai-generativelanguage", - "version": "0.6.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_generative_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_generative_service.py index 3f811fb7f4af..a684d970a183 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_generative_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_generative_service.py @@ -62,6 +62,13 @@ from google.ai.generativelanguage_v1.types import content as gag_content from google.ai.generativelanguage_v1.types import generative_service, safety +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -329,6 +336,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GenerativeServiceClient(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 = GenerativeServiceClient(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", [ @@ -4193,10 +4243,14 @@ def test_generate_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_generate_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_generate_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_generate_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateContentRequest.pb( generative_service.GenerateContentRequest() ) @@ -4222,6 +4276,10 @@ def test_generate_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateContentResponse() + post_with_metadata.return_value = ( + generative_service.GenerateContentResponse(), + metadata, + ) client.generate_content( request, @@ -4233,6 +4291,7 @@ def test_generate_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stream_generate_content_rest_bad_request( @@ -4321,10 +4380,14 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_stream_generate_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_stream_generate_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_stream_generate_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateContentRequest.pb( generative_service.GenerateContentRequest() ) @@ -4350,6 +4413,10 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateContentResponse() + post_with_metadata.return_value = ( + generative_service.GenerateContentResponse(), + metadata, + ) client.stream_generate_content( request, @@ -4361,6 +4428,7 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_content_rest_bad_request( @@ -4442,10 +4510,13 @@ def test_embed_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_embed_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, "post_embed_content_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_embed_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.EmbedContentRequest.pb( generative_service.EmbedContentRequest() ) @@ -4471,6 +4542,10 @@ def test_embed_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.EmbedContentResponse() + post_with_metadata.return_value = ( + generative_service.EmbedContentResponse(), + metadata, + ) client.embed_content( request, @@ -4482,6 +4557,7 @@ def test_embed_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_embed_contents_rest_bad_request( @@ -4563,10 +4639,14 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_batch_embed_contents" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_batch_embed_contents_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_batch_embed_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.BatchEmbedContentsRequest.pb( generative_service.BatchEmbedContentsRequest() ) @@ -4592,6 +4672,10 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.BatchEmbedContentsResponse() + post_with_metadata.return_value = ( + generative_service.BatchEmbedContentsResponse(), + metadata, + ) client.batch_embed_contents( request, @@ -4603,6 +4687,7 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_tokens_rest_bad_request( @@ -4687,10 +4772,13 @@ def test_count_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_count_tokens" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, "post_count_tokens_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_count_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.CountTokensRequest.pb( generative_service.CountTokensRequest() ) @@ -4716,6 +4804,10 @@ def test_count_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.CountTokensResponse() + post_with_metadata.return_value = ( + generative_service.CountTokensResponse(), + metadata, + ) client.count_tokens( request, @@ -4727,6 +4819,7 @@ def test_count_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_model_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_model_service.py index d2403acffb14..1f65cb794424 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_model_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1/test_model_service.py @@ -61,6 +61,13 @@ ) from google.ai.generativelanguage_v1.types import model, model_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 = ModelServiceClient(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 = ModelServiceClient(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", [ @@ -2531,10 +2581,13 @@ def test_get_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetModelRequest.pb(model_service.GetModelRequest()) transcode.return_value = { "method": "post", @@ -2556,6 +2609,7 @@ def test_get_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model.Model() + post_with_metadata.return_value = model.Model(), metadata client.get_model( request, @@ -2567,6 +2621,7 @@ def test_get_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_models_rest_bad_request(request_type=model_service.ListModelsRequest): @@ -2649,10 +2704,13 @@ def test_list_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListModelsRequest.pb( model_service.ListModelsRequest() ) @@ -2678,6 +2736,7 @@ def test_list_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListModelsResponse() + post_with_metadata.return_value = model_service.ListModelsResponse(), metadata client.list_models( request, @@ -2689,6 +2748,7 @@ def test_list_models_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_cache_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_cache_service.py index 47c544657934..a8015a1afd55 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_cache_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_cache_service.py @@ -70,6 +70,13 @@ from google.ai.generativelanguage_v1alpha.types import cached_content from google.ai.generativelanguage_v1alpha.types import content +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 = CacheServiceClient(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 = CacheServiceClient(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", [ @@ -4078,10 +4128,14 @@ def test_list_cached_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_list_cached_contents" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, + "post_list_cached_contents_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_list_cached_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.ListCachedContentsRequest.pb( cache_service.ListCachedContentsRequest() ) @@ -4107,6 +4161,10 @@ def test_list_cached_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cache_service.ListCachedContentsResponse() + post_with_metadata.return_value = ( + cache_service.ListCachedContentsResponse(), + metadata, + ) client.list_cached_contents( request, @@ -4118,6 +4176,7 @@ def test_list_cached_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_cached_content_rest_bad_request( @@ -4349,10 +4408,14 @@ def test_create_cached_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_create_cached_content" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, + "post_create_cached_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_create_cached_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.CreateCachedContentRequest.pb( cache_service.CreateCachedContentRequest() ) @@ -4378,6 +4441,7 @@ def test_create_cached_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_cached_content.CachedContent() + post_with_metadata.return_value = gag_cached_content.CachedContent(), metadata client.create_cached_content( request, @@ -4389,6 +4453,7 @@ def test_create_cached_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_cached_content_rest_bad_request( @@ -4477,10 +4542,13 @@ def test_get_cached_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_get_cached_content" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, "post_get_cached_content_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_get_cached_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.GetCachedContentRequest.pb( cache_service.GetCachedContentRequest() ) @@ -4506,6 +4574,7 @@ def test_get_cached_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cached_content.CachedContent() + post_with_metadata.return_value = cached_content.CachedContent(), metadata client.get_cached_content( request, @@ -4517,6 +4586,7 @@ def test_get_cached_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_cached_content_rest_bad_request( @@ -4748,10 +4818,14 @@ def test_update_cached_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_update_cached_content" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, + "post_update_cached_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_update_cached_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.UpdateCachedContentRequest.pb( cache_service.UpdateCachedContentRequest() ) @@ -4777,6 +4851,7 @@ def test_update_cached_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_cached_content.CachedContent() + post_with_metadata.return_value = gag_cached_content.CachedContent(), metadata client.update_cached_content( request, @@ -4788,6 +4863,7 @@ def test_update_cached_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_cached_content_rest_bad_request( diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_discuss_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_discuss_service.py index d6f690755511..e85fde131759 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_discuss_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_discuss_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1alpha.types import citation, discuss_service, safety +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 = DiscussServiceClient(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 = DiscussServiceClient(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", [ @@ -2467,10 +2517,13 @@ def test_generate_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_generate_message" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, "post_generate_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_generate_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.GenerateMessageRequest.pb( discuss_service.GenerateMessageRequest() ) @@ -2496,6 +2549,10 @@ def test_generate_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.GenerateMessageResponse() + post_with_metadata.return_value = ( + discuss_service.GenerateMessageResponse(), + metadata, + ) client.generate_message( request, @@ -2507,6 +2564,7 @@ def test_generate_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_message_tokens_rest_bad_request( @@ -2591,10 +2649,14 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_count_message_tokens" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, + "post_count_message_tokens_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_count_message_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.CountMessageTokensRequest.pb( discuss_service.CountMessageTokensRequest() ) @@ -2620,6 +2682,10 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.CountMessageTokensResponse() + post_with_metadata.return_value = ( + discuss_service.CountMessageTokensResponse(), + metadata, + ) client.count_message_tokens( request, @@ -2631,6 +2697,7 @@ def test_count_message_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_file_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_file_service.py index 77b6b85a9506..c1be7c92979c 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_file_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_file_service.py @@ -65,6 +65,13 @@ ) from google.ai.generativelanguage_v1alpha.types import file, file_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 = FileServiceClient(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 = FileServiceClient(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", [ @@ -3091,10 +3141,13 @@ def test_create_file_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FileServiceRestInterceptor, "post_create_file" ) as post, mock.patch.object( + transports.FileServiceRestInterceptor, "post_create_file_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FileServiceRestInterceptor, "pre_create_file" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = file_service.CreateFileRequest.pb(file_service.CreateFileRequest()) transcode.return_value = { "method": "post", @@ -3118,6 +3171,7 @@ def test_create_file_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = file_service.CreateFileResponse() + post_with_metadata.return_value = file_service.CreateFileResponse(), metadata client.create_file( request, @@ -3129,6 +3183,7 @@ def test_create_file_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_files_rest_bad_request(request_type=file_service.ListFilesRequest): @@ -3211,10 +3266,13 @@ def test_list_files_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FileServiceRestInterceptor, "post_list_files" ) as post, mock.patch.object( + transports.FileServiceRestInterceptor, "post_list_files_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FileServiceRestInterceptor, "pre_list_files" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = file_service.ListFilesRequest.pb(file_service.ListFilesRequest()) transcode.return_value = { "method": "post", @@ -3238,6 +3296,7 @@ def test_list_files_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = file_service.ListFilesResponse() + post_with_metadata.return_value = file_service.ListFilesResponse(), metadata client.list_files( request, @@ -3249,6 +3308,7 @@ def test_list_files_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_file_rest_bad_request(request_type=file_service.GetFileRequest): @@ -3343,10 +3403,13 @@ def test_get_file_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FileServiceRestInterceptor, "post_get_file" ) as post, mock.patch.object( + transports.FileServiceRestInterceptor, "post_get_file_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FileServiceRestInterceptor, "pre_get_file" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = file_service.GetFileRequest.pb(file_service.GetFileRequest()) transcode.return_value = { "method": "post", @@ -3368,6 +3431,7 @@ def test_get_file_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = file.File() + post_with_metadata.return_value = file.File(), metadata client.get_file( request, @@ -3379,6 +3443,7 @@ def test_get_file_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_file_rest_bad_request(request_type=file_service.DeleteFileRequest): diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_generative_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_generative_service.py index 43f13f03055e..b5453d1a4246 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_generative_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_generative_service.py @@ -67,6 +67,13 @@ from google.ai.generativelanguage_v1alpha.types import content from google.ai.generativelanguage_v1alpha.types import content as gag_content +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -334,6 +341,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GenerativeServiceClient(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 = GenerativeServiceClient(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", [ @@ -5017,10 +5067,14 @@ def test_generate_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_generate_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_generate_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_generate_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateContentRequest.pb( generative_service.GenerateContentRequest() ) @@ -5046,6 +5100,10 @@ def test_generate_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateContentResponse() + post_with_metadata.return_value = ( + generative_service.GenerateContentResponse(), + metadata, + ) client.generate_content( request, @@ -5057,6 +5115,7 @@ def test_generate_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_answer_rest_bad_request( @@ -5141,10 +5200,14 @@ def test_generate_answer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_generate_answer" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_generate_answer_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_generate_answer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateAnswerRequest.pb( generative_service.GenerateAnswerRequest() ) @@ -5170,6 +5233,10 @@ def test_generate_answer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateAnswerResponse() + post_with_metadata.return_value = ( + generative_service.GenerateAnswerResponse(), + metadata, + ) client.generate_answer( request, @@ -5181,6 +5248,7 @@ def test_generate_answer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stream_generate_content_rest_bad_request( @@ -5269,10 +5337,14 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_stream_generate_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_stream_generate_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_stream_generate_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateContentRequest.pb( generative_service.GenerateContentRequest() ) @@ -5298,6 +5370,10 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateContentResponse() + post_with_metadata.return_value = ( + generative_service.GenerateContentResponse(), + metadata, + ) client.stream_generate_content( request, @@ -5309,6 +5385,7 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_content_rest_bad_request( @@ -5390,10 +5467,13 @@ def test_embed_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_embed_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, "post_embed_content_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_embed_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.EmbedContentRequest.pb( generative_service.EmbedContentRequest() ) @@ -5419,6 +5499,10 @@ def test_embed_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.EmbedContentResponse() + post_with_metadata.return_value = ( + generative_service.EmbedContentResponse(), + metadata, + ) client.embed_content( request, @@ -5430,6 +5514,7 @@ def test_embed_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_embed_contents_rest_bad_request( @@ -5511,10 +5596,14 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_batch_embed_contents" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_batch_embed_contents_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_batch_embed_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.BatchEmbedContentsRequest.pb( generative_service.BatchEmbedContentsRequest() ) @@ -5540,6 +5629,10 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.BatchEmbedContentsResponse() + post_with_metadata.return_value = ( + generative_service.BatchEmbedContentsResponse(), + metadata, + ) client.batch_embed_contents( request, @@ -5551,6 +5644,7 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_tokens_rest_bad_request( @@ -5637,10 +5731,13 @@ def test_count_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_count_tokens" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, "post_count_tokens_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_count_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.CountTokensRequest.pb( generative_service.CountTokensRequest() ) @@ -5666,6 +5763,10 @@ def test_count_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.CountTokensResponse() + post_with_metadata.return_value = ( + generative_service.CountTokensResponse(), + metadata, + ) client.count_tokens( request, @@ -5677,6 +5778,7 @@ def test_count_tokens_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bidi_generate_content_rest_error(): diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_model_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_model_service.py index 8269673af5af..3cc274de06d4 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_model_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_model_service.py @@ -74,6 +74,13 @@ from google.ai.generativelanguage_v1alpha.types import model, model_service from google.ai.generativelanguage_v1alpha.types import tuned_model +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ModelServiceClient(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 = ModelServiceClient(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", [ @@ -5576,10 +5626,13 @@ def test_get_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetModelRequest.pb(model_service.GetModelRequest()) transcode.return_value = { "method": "post", @@ -5601,6 +5654,7 @@ def test_get_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model.Model() + post_with_metadata.return_value = model.Model(), metadata client.get_model( request, @@ -5612,6 +5666,7 @@ def test_get_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_models_rest_bad_request(request_type=model_service.ListModelsRequest): @@ -5694,10 +5749,13 @@ def test_list_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListModelsRequest.pb( model_service.ListModelsRequest() ) @@ -5723,6 +5781,7 @@ def test_list_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListModelsResponse() + post_with_metadata.return_value = model_service.ListModelsResponse(), metadata client.list_models( request, @@ -5734,6 +5793,7 @@ def test_list_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tuned_model_rest_bad_request( @@ -5833,10 +5893,13 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetTunedModelRequest.pb( model_service.GetTunedModelRequest() ) @@ -5860,6 +5923,7 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tuned_model.TunedModel() + post_with_metadata.return_value = tuned_model.TunedModel(), metadata client.get_tuned_model( request, @@ -5871,6 +5935,7 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tuned_models_rest_bad_request( @@ -5955,10 +6020,13 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_tuned_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_tuned_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_tuned_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListTunedModelsRequest.pb( model_service.ListTunedModelsRequest() ) @@ -5984,6 +6052,10 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListTunedModelsResponse() + post_with_metadata.return_value = ( + model_service.ListTunedModelsResponse(), + metadata, + ) client.list_tuned_models( request, @@ -5995,6 +6067,7 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tuned_model_rest_bad_request( @@ -6188,10 +6261,13 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ModelServiceRestInterceptor, "post_create_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_create_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_create_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.CreateTunedModelRequest.pb( model_service.CreateTunedModelRequest() ) @@ -6215,6 +6291,7 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_tuned_model( request, @@ -6226,6 +6303,7 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tuned_model_rest_bad_request( @@ -6438,10 +6516,13 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_update_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_update_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_update_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.UpdateTunedModelRequest.pb( model_service.UpdateTunedModelRequest() ) @@ -6465,6 +6546,7 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_tuned_model.TunedModel() + post_with_metadata.return_value = gag_tuned_model.TunedModel(), metadata client.update_tuned_model( request, @@ -6476,6 +6558,7 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tuned_model_rest_bad_request( diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_permission_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_permission_service.py index 6b6a5579e5e7..388511313893 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_permission_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_permission_service.py @@ -64,6 +64,13 @@ from google.ai.generativelanguage_v1alpha.types import permission from google.ai.generativelanguage_v1alpha.types import permission_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -331,6 +338,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PermissionServiceClient(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 = PermissionServiceClient(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", [ @@ -4980,10 +5030,14 @@ def test_create_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_create_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_create_permission_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_create_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.CreatePermissionRequest.pb( permission_service.CreatePermissionRequest() ) @@ -5007,6 +5061,7 @@ def test_create_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_permission.Permission() + post_with_metadata.return_value = gag_permission.Permission(), metadata client.create_permission( request, @@ -5018,6 +5073,7 @@ def test_create_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_permission_rest_bad_request( @@ -5108,10 +5164,13 @@ def test_get_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_get_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, "post_get_permission_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_get_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.GetPermissionRequest.pb( permission_service.GetPermissionRequest() ) @@ -5135,6 +5194,7 @@ def test_get_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission.Permission() + post_with_metadata.return_value = permission.Permission(), metadata client.get_permission( request, @@ -5146,6 +5206,7 @@ def test_get_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_permissions_rest_bad_request( @@ -5230,10 +5291,14 @@ def test_list_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_list_permissions" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_list_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_list_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.ListPermissionsRequest.pb( permission_service.ListPermissionsRequest() ) @@ -5259,6 +5324,10 @@ def test_list_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission_service.ListPermissionsResponse() + post_with_metadata.return_value = ( + permission_service.ListPermissionsResponse(), + metadata, + ) client.list_permissions( request, @@ -5270,6 +5339,7 @@ def test_list_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_permission_rest_bad_request( @@ -5433,10 +5503,14 @@ def test_update_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_update_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_update_permission_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_update_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.UpdatePermissionRequest.pb( permission_service.UpdatePermissionRequest() ) @@ -5460,6 +5534,7 @@ def test_update_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_permission.Permission() + post_with_metadata.return_value = gag_permission.Permission(), metadata client.update_permission( request, @@ -5471,6 +5546,7 @@ def test_update_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_permission_rest_bad_request( @@ -5661,10 +5737,14 @@ def test_transfer_ownership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_transfer_ownership" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_transfer_ownership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_transfer_ownership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.TransferOwnershipRequest.pb( permission_service.TransferOwnershipRequest() ) @@ -5690,6 +5770,10 @@ def test_transfer_ownership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission_service.TransferOwnershipResponse() + post_with_metadata.return_value = ( + permission_service.TransferOwnershipResponse(), + metadata, + ) client.transfer_ownership( request, @@ -5701,6 +5785,7 @@ def test_transfer_ownership_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_prediction_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_prediction_service.py index 452a4da5caf2..0d29e41c0d55 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_prediction_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_prediction_service.py @@ -61,6 +61,13 @@ ) from google.ai.generativelanguage_v1alpha.types import prediction_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 @@ -328,6 +335,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PredictionServiceClient(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 = PredictionServiceClient(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", [ @@ -1859,10 +1909,13 @@ def test_predict_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PredictionServiceRestInterceptor, "post_predict" ) as post, mock.patch.object( + transports.PredictionServiceRestInterceptor, "post_predict_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PredictionServiceRestInterceptor, "pre_predict" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = prediction_service.PredictRequest.pb( prediction_service.PredictRequest() ) @@ -1888,6 +1941,7 @@ def test_predict_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = prediction_service.PredictResponse() + post_with_metadata.return_value = prediction_service.PredictResponse(), metadata client.predict( request, @@ -1899,6 +1953,7 @@ def test_predict_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_retriever_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_retriever_service.py index 2a80e776b391..3c558a65e1aa 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_retriever_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_retriever_service.py @@ -63,6 +63,13 @@ ) from google.ai.generativelanguage_v1alpha.types import retriever, retriever_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 = RetrieverServiceClient(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 = RetrieverServiceClient(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", [ @@ -12157,10 +12207,13 @@ def test_create_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_create_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_create_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_create_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.CreateCorpusRequest.pb( retriever_service.CreateCorpusRequest() ) @@ -12184,6 +12237,7 @@ def test_create_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Corpus() + post_with_metadata.return_value = retriever.Corpus(), metadata client.create_corpus( request, @@ -12195,6 +12249,7 @@ def test_create_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_corpus_rest_bad_request(request_type=retriever_service.GetCorpusRequest): @@ -12279,10 +12334,13 @@ def test_get_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_get_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_get_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_get_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.GetCorpusRequest.pb( retriever_service.GetCorpusRequest() ) @@ -12306,6 +12364,7 @@ def test_get_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Corpus() + post_with_metadata.return_value = retriever.Corpus(), metadata client.get_corpus( request, @@ -12317,6 +12376,7 @@ def test_get_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_corpus_rest_bad_request( @@ -12476,10 +12536,13 @@ def test_update_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_update_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_update_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_update_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.UpdateCorpusRequest.pb( retriever_service.UpdateCorpusRequest() ) @@ -12503,6 +12566,7 @@ def test_update_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Corpus() + post_with_metadata.return_value = retriever.Corpus(), metadata client.update_corpus( request, @@ -12514,6 +12578,7 @@ def test_update_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_corpus_rest_bad_request( @@ -12707,10 +12772,13 @@ def test_list_corpora_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_list_corpora" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_list_corpora_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_list_corpora" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.ListCorporaRequest.pb( retriever_service.ListCorporaRequest() ) @@ -12736,6 +12804,10 @@ def test_list_corpora_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.ListCorporaResponse() + post_with_metadata.return_value = ( + retriever_service.ListCorporaResponse(), + metadata, + ) client.list_corpora( request, @@ -12747,6 +12819,7 @@ def test_list_corpora_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_corpus_rest_bad_request( @@ -12828,10 +12901,13 @@ def test_query_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_query_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_query_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_query_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.QueryCorpusRequest.pb( retriever_service.QueryCorpusRequest() ) @@ -12857,6 +12933,10 @@ def test_query_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.QueryCorpusResponse() + post_with_metadata.return_value = ( + retriever_service.QueryCorpusResponse(), + metadata, + ) client.query_corpus( request, @@ -12868,6 +12948,7 @@ def test_query_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_document_rest_bad_request( @@ -13035,10 +13116,13 @@ def test_create_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_create_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_create_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_create_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.CreateDocumentRequest.pb( retriever_service.CreateDocumentRequest() ) @@ -13062,6 +13146,7 @@ def test_create_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Document() + post_with_metadata.return_value = retriever.Document(), metadata client.create_document( request, @@ -13073,6 +13158,7 @@ def test_create_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_document_rest_bad_request( @@ -13159,10 +13245,13 @@ def test_get_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_get_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_get_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_get_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.GetDocumentRequest.pb( retriever_service.GetDocumentRequest() ) @@ -13186,6 +13275,7 @@ def test_get_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Document() + post_with_metadata.return_value = retriever.Document(), metadata client.get_document( request, @@ -13197,6 +13287,7 @@ def test_get_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_document_rest_bad_request( @@ -13364,10 +13455,13 @@ def test_update_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_update_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_update_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_update_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.UpdateDocumentRequest.pb( retriever_service.UpdateDocumentRequest() ) @@ -13391,6 +13485,7 @@ def test_update_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Document() + post_with_metadata.return_value = retriever.Document(), metadata client.update_document( request, @@ -13402,6 +13497,7 @@ def test_update_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_document_rest_bad_request( @@ -13595,10 +13691,13 @@ def test_list_documents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_list_documents" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_list_documents_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_list_documents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.ListDocumentsRequest.pb( retriever_service.ListDocumentsRequest() ) @@ -13624,6 +13723,10 @@ def test_list_documents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.ListDocumentsResponse() + post_with_metadata.return_value = ( + retriever_service.ListDocumentsResponse(), + metadata, + ) client.list_documents( request, @@ -13635,6 +13738,7 @@ def test_list_documents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_document_rest_bad_request( @@ -13716,10 +13820,13 @@ def test_query_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_query_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_query_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_query_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.QueryDocumentRequest.pb( retriever_service.QueryDocumentRequest() ) @@ -13745,6 +13852,10 @@ def test_query_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.QueryDocumentResponse() + post_with_metadata.return_value = ( + retriever_service.QueryDocumentResponse(), + metadata, + ) client.query_document( request, @@ -13756,6 +13867,7 @@ def test_query_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_chunk_rest_bad_request( @@ -13924,10 +14036,13 @@ def test_create_chunk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_create_chunk" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_create_chunk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_create_chunk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.CreateChunkRequest.pb( retriever_service.CreateChunkRequest() ) @@ -13951,6 +14066,7 @@ def test_create_chunk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Chunk() + post_with_metadata.return_value = retriever.Chunk(), metadata client.create_chunk( request, @@ -13962,6 +14078,7 @@ def test_create_chunk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_chunks_rest_bad_request( @@ -14043,10 +14160,14 @@ def test_batch_create_chunks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_batch_create_chunks" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, + "post_batch_create_chunks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_batch_create_chunks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.BatchCreateChunksRequest.pb( retriever_service.BatchCreateChunksRequest() ) @@ -14072,6 +14193,10 @@ def test_batch_create_chunks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.BatchCreateChunksResponse() + post_with_metadata.return_value = ( + retriever_service.BatchCreateChunksResponse(), + metadata, + ) client.batch_create_chunks( request, @@ -14083,6 +14208,7 @@ def test_batch_create_chunks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_chunk_rest_bad_request(request_type=retriever_service.GetChunkRequest): @@ -14167,10 +14293,13 @@ def test_get_chunk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_get_chunk" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_get_chunk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_get_chunk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.GetChunkRequest.pb( retriever_service.GetChunkRequest() ) @@ -14194,6 +14323,7 @@ def test_get_chunk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Chunk() + post_with_metadata.return_value = retriever.Chunk(), metadata client.get_chunk( request, @@ -14205,6 +14335,7 @@ def test_get_chunk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_chunk_rest_bad_request( @@ -14377,10 +14508,13 @@ def test_update_chunk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_update_chunk" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_update_chunk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_update_chunk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.UpdateChunkRequest.pb( retriever_service.UpdateChunkRequest() ) @@ -14404,6 +14538,7 @@ def test_update_chunk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Chunk() + post_with_metadata.return_value = retriever.Chunk(), metadata client.update_chunk( request, @@ -14415,6 +14550,7 @@ def test_update_chunk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_chunks_rest_bad_request( @@ -14496,10 +14632,14 @@ def test_batch_update_chunks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_batch_update_chunks" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, + "post_batch_update_chunks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_batch_update_chunks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.BatchUpdateChunksRequest.pb( retriever_service.BatchUpdateChunksRequest() ) @@ -14525,6 +14665,10 @@ def test_batch_update_chunks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.BatchUpdateChunksResponse() + post_with_metadata.return_value = ( + retriever_service.BatchUpdateChunksResponse(), + metadata, + ) client.batch_update_chunks( request, @@ -14536,6 +14680,7 @@ def test_batch_update_chunks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_chunk_rest_bad_request( @@ -14836,10 +14981,13 @@ def test_list_chunks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_list_chunks" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_list_chunks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_list_chunks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.ListChunksRequest.pb( retriever_service.ListChunksRequest() ) @@ -14865,6 +15013,10 @@ def test_list_chunks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.ListChunksResponse() + post_with_metadata.return_value = ( + retriever_service.ListChunksResponse(), + metadata, + ) client.list_chunks( request, @@ -14876,6 +15028,7 @@ def test_list_chunks_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_text_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_text_service.py index aeace4c2095f..c73969a8a3ac 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_text_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1alpha/test_text_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1alpha.types import safety, text_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 @@ -299,6 +306,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 = TextServiceClient(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 = TextServiceClient(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", [ @@ -3537,10 +3587,13 @@ def test_generate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_generate_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_generate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_generate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.GenerateTextRequest.pb( text_service.GenerateTextRequest() ) @@ -3566,6 +3619,7 @@ def test_generate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.GenerateTextResponse() + post_with_metadata.return_value = text_service.GenerateTextResponse(), metadata client.generate_text( request, @@ -3577,6 +3631,7 @@ def test_generate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_text_rest_bad_request(request_type=text_service.EmbedTextRequest): @@ -3656,10 +3711,13 @@ def test_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.EmbedTextRequest.pb(text_service.EmbedTextRequest()) transcode.return_value = { "method": "post", @@ -3683,6 +3741,7 @@ def test_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.EmbedTextResponse() + post_with_metadata.return_value = text_service.EmbedTextResponse(), metadata client.embed_text( request, @@ -3694,6 +3753,7 @@ def test_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_embed_text_rest_bad_request( @@ -3775,10 +3835,13 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_batch_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_batch_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_batch_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.BatchEmbedTextRequest.pb( text_service.BatchEmbedTextRequest() ) @@ -3804,6 +3867,10 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.BatchEmbedTextResponse() + post_with_metadata.return_value = ( + text_service.BatchEmbedTextResponse(), + metadata, + ) client.batch_embed_text( request, @@ -3815,6 +3882,7 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_text_tokens_rest_bad_request( @@ -3899,10 +3967,13 @@ def test_count_text_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_count_text_tokens" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_count_text_tokens_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_count_text_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.CountTextTokensRequest.pb( text_service.CountTextTokensRequest() ) @@ -3928,6 +3999,10 @@ def test_count_text_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.CountTextTokensResponse() + post_with_metadata.return_value = ( + text_service.CountTextTokensResponse(), + metadata, + ) client.count_text_tokens( request, @@ -3939,6 +4014,7 @@ def test_count_text_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_cache_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_cache_service.py index 259ecb2f4470..ba03dc928f5f 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_cache_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_cache_service.py @@ -70,6 +70,13 @@ from google.ai.generativelanguage_v1beta.types import cached_content from google.ai.generativelanguage_v1beta.types import content +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 = CacheServiceClient(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 = CacheServiceClient(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", [ @@ -4077,10 +4127,14 @@ def test_list_cached_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_list_cached_contents" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, + "post_list_cached_contents_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_list_cached_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.ListCachedContentsRequest.pb( cache_service.ListCachedContentsRequest() ) @@ -4106,6 +4160,10 @@ def test_list_cached_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cache_service.ListCachedContentsResponse() + post_with_metadata.return_value = ( + cache_service.ListCachedContentsResponse(), + metadata, + ) client.list_cached_contents( request, @@ -4117,6 +4175,7 @@ def test_list_cached_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_cached_content_rest_bad_request( @@ -4348,10 +4407,14 @@ def test_create_cached_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_create_cached_content" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, + "post_create_cached_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_create_cached_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.CreateCachedContentRequest.pb( cache_service.CreateCachedContentRequest() ) @@ -4377,6 +4440,7 @@ def test_create_cached_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_cached_content.CachedContent() + post_with_metadata.return_value = gag_cached_content.CachedContent(), metadata client.create_cached_content( request, @@ -4388,6 +4452,7 @@ def test_create_cached_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_cached_content_rest_bad_request( @@ -4476,10 +4541,13 @@ def test_get_cached_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_get_cached_content" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, "post_get_cached_content_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_get_cached_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.GetCachedContentRequest.pb( cache_service.GetCachedContentRequest() ) @@ -4505,6 +4573,7 @@ def test_get_cached_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cached_content.CachedContent() + post_with_metadata.return_value = cached_content.CachedContent(), metadata client.get_cached_content( request, @@ -4516,6 +4585,7 @@ def test_get_cached_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_cached_content_rest_bad_request( @@ -4747,10 +4817,14 @@ def test_update_cached_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CacheServiceRestInterceptor, "post_update_cached_content" ) as post, mock.patch.object( + transports.CacheServiceRestInterceptor, + "post_update_cached_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CacheServiceRestInterceptor, "pre_update_cached_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cache_service.UpdateCachedContentRequest.pb( cache_service.UpdateCachedContentRequest() ) @@ -4776,6 +4850,7 @@ def test_update_cached_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_cached_content.CachedContent() + post_with_metadata.return_value = gag_cached_content.CachedContent(), metadata client.update_cached_content( request, @@ -4787,6 +4862,7 @@ def test_update_cached_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_cached_content_rest_bad_request( diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_discuss_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_discuss_service.py index 0f0e41c98c2c..660d8105cd8c 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_discuss_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_discuss_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1beta.types import citation, discuss_service, safety +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 = DiscussServiceClient(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 = DiscussServiceClient(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", [ @@ -2467,10 +2517,13 @@ def test_generate_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_generate_message" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, "post_generate_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_generate_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.GenerateMessageRequest.pb( discuss_service.GenerateMessageRequest() ) @@ -2496,6 +2549,10 @@ def test_generate_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.GenerateMessageResponse() + post_with_metadata.return_value = ( + discuss_service.GenerateMessageResponse(), + metadata, + ) client.generate_message( request, @@ -2507,6 +2564,7 @@ def test_generate_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_message_tokens_rest_bad_request( @@ -2591,10 +2649,14 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_count_message_tokens" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, + "post_count_message_tokens_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_count_message_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.CountMessageTokensRequest.pb( discuss_service.CountMessageTokensRequest() ) @@ -2620,6 +2682,10 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.CountMessageTokensResponse() + post_with_metadata.return_value = ( + discuss_service.CountMessageTokensResponse(), + metadata, + ) client.count_message_tokens( request, @@ -2631,6 +2697,7 @@ def test_count_message_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_file_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_file_service.py index dba74cbfa712..3e5a3f5c4f44 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_file_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_file_service.py @@ -65,6 +65,13 @@ ) from google.ai.generativelanguage_v1beta.types import file, file_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 = FileServiceClient(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 = FileServiceClient(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", [ @@ -3091,10 +3141,13 @@ def test_create_file_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FileServiceRestInterceptor, "post_create_file" ) as post, mock.patch.object( + transports.FileServiceRestInterceptor, "post_create_file_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FileServiceRestInterceptor, "pre_create_file" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = file_service.CreateFileRequest.pb(file_service.CreateFileRequest()) transcode.return_value = { "method": "post", @@ -3118,6 +3171,7 @@ def test_create_file_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = file_service.CreateFileResponse() + post_with_metadata.return_value = file_service.CreateFileResponse(), metadata client.create_file( request, @@ -3129,6 +3183,7 @@ def test_create_file_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_files_rest_bad_request(request_type=file_service.ListFilesRequest): @@ -3211,10 +3266,13 @@ def test_list_files_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FileServiceRestInterceptor, "post_list_files" ) as post, mock.patch.object( + transports.FileServiceRestInterceptor, "post_list_files_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FileServiceRestInterceptor, "pre_list_files" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = file_service.ListFilesRequest.pb(file_service.ListFilesRequest()) transcode.return_value = { "method": "post", @@ -3238,6 +3296,7 @@ def test_list_files_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = file_service.ListFilesResponse() + post_with_metadata.return_value = file_service.ListFilesResponse(), metadata client.list_files( request, @@ -3249,6 +3308,7 @@ def test_list_files_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_file_rest_bad_request(request_type=file_service.GetFileRequest): @@ -3343,10 +3403,13 @@ def test_get_file_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FileServiceRestInterceptor, "post_get_file" ) as post, mock.patch.object( + transports.FileServiceRestInterceptor, "post_get_file_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FileServiceRestInterceptor, "pre_get_file" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = file_service.GetFileRequest.pb(file_service.GetFileRequest()) transcode.return_value = { "method": "post", @@ -3368,6 +3431,7 @@ def test_get_file_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = file.File() + post_with_metadata.return_value = file.File(), metadata client.get_file( request, @@ -3379,6 +3443,7 @@ def test_get_file_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_file_rest_bad_request(request_type=file_service.DeleteFileRequest): diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_generative_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_generative_service.py index 6264482575e5..5bf4b88b7033 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_generative_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_generative_service.py @@ -67,6 +67,13 @@ from google.ai.generativelanguage_v1beta.types import content from google.ai.generativelanguage_v1beta.types import content as gag_content +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -334,6 +341,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GenerativeServiceClient(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 = GenerativeServiceClient(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", [ @@ -4831,10 +4881,14 @@ def test_generate_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_generate_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_generate_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_generate_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateContentRequest.pb( generative_service.GenerateContentRequest() ) @@ -4860,6 +4914,10 @@ def test_generate_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateContentResponse() + post_with_metadata.return_value = ( + generative_service.GenerateContentResponse(), + metadata, + ) client.generate_content( request, @@ -4871,6 +4929,7 @@ def test_generate_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_answer_rest_bad_request( @@ -4955,10 +5014,14 @@ def test_generate_answer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_generate_answer" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_generate_answer_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_generate_answer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateAnswerRequest.pb( generative_service.GenerateAnswerRequest() ) @@ -4984,6 +5047,10 @@ def test_generate_answer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateAnswerResponse() + post_with_metadata.return_value = ( + generative_service.GenerateAnswerResponse(), + metadata, + ) client.generate_answer( request, @@ -4995,6 +5062,7 @@ def test_generate_answer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stream_generate_content_rest_bad_request( @@ -5083,10 +5151,14 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_stream_generate_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_stream_generate_content_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_stream_generate_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.GenerateContentRequest.pb( generative_service.GenerateContentRequest() ) @@ -5112,6 +5184,10 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.GenerateContentResponse() + post_with_metadata.return_value = ( + generative_service.GenerateContentResponse(), + metadata, + ) client.stream_generate_content( request, @@ -5123,6 +5199,7 @@ def test_stream_generate_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_content_rest_bad_request( @@ -5204,10 +5281,13 @@ def test_embed_content_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_embed_content" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, "post_embed_content_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_embed_content" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.EmbedContentRequest.pb( generative_service.EmbedContentRequest() ) @@ -5233,6 +5313,10 @@ def test_embed_content_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.EmbedContentResponse() + post_with_metadata.return_value = ( + generative_service.EmbedContentResponse(), + metadata, + ) client.embed_content( request, @@ -5244,6 +5328,7 @@ def test_embed_content_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_embed_contents_rest_bad_request( @@ -5325,10 +5410,14 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_batch_embed_contents" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, + "post_batch_embed_contents_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_batch_embed_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.BatchEmbedContentsRequest.pb( generative_service.BatchEmbedContentsRequest() ) @@ -5354,6 +5443,10 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.BatchEmbedContentsResponse() + post_with_metadata.return_value = ( + generative_service.BatchEmbedContentsResponse(), + metadata, + ) client.batch_embed_contents( request, @@ -5365,6 +5458,7 @@ def test_batch_embed_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_tokens_rest_bad_request( @@ -5451,10 +5545,13 @@ def test_count_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GenerativeServiceRestInterceptor, "post_count_tokens" ) as post, mock.patch.object( + transports.GenerativeServiceRestInterceptor, "post_count_tokens_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GenerativeServiceRestInterceptor, "pre_count_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = generative_service.CountTokensRequest.pb( generative_service.CountTokensRequest() ) @@ -5480,6 +5577,10 @@ def test_count_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = generative_service.CountTokensResponse() + post_with_metadata.return_value = ( + generative_service.CountTokensResponse(), + metadata, + ) client.count_tokens( request, @@ -5491,6 +5592,7 @@ def test_count_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_model_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_model_service.py index 0a325329ebe4..13fe4958a472 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_model_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_model_service.py @@ -74,6 +74,13 @@ from google.ai.generativelanguage_v1beta.types import model, model_service from google.ai.generativelanguage_v1beta.types import tuned_model +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ModelServiceClient(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 = ModelServiceClient(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", [ @@ -5576,10 +5626,13 @@ def test_get_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetModelRequest.pb(model_service.GetModelRequest()) transcode.return_value = { "method": "post", @@ -5601,6 +5654,7 @@ def test_get_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model.Model() + post_with_metadata.return_value = model.Model(), metadata client.get_model( request, @@ -5612,6 +5666,7 @@ def test_get_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_models_rest_bad_request(request_type=model_service.ListModelsRequest): @@ -5694,10 +5749,13 @@ def test_list_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListModelsRequest.pb( model_service.ListModelsRequest() ) @@ -5723,6 +5781,7 @@ def test_list_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListModelsResponse() + post_with_metadata.return_value = model_service.ListModelsResponse(), metadata client.list_models( request, @@ -5734,6 +5793,7 @@ def test_list_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tuned_model_rest_bad_request( @@ -5833,10 +5893,13 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetTunedModelRequest.pb( model_service.GetTunedModelRequest() ) @@ -5860,6 +5923,7 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tuned_model.TunedModel() + post_with_metadata.return_value = tuned_model.TunedModel(), metadata client.get_tuned_model( request, @@ -5871,6 +5935,7 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tuned_models_rest_bad_request( @@ -5955,10 +6020,13 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_tuned_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_tuned_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_tuned_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListTunedModelsRequest.pb( model_service.ListTunedModelsRequest() ) @@ -5984,6 +6052,10 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListTunedModelsResponse() + post_with_metadata.return_value = ( + model_service.ListTunedModelsResponse(), + metadata, + ) client.list_tuned_models( request, @@ -5995,6 +6067,7 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tuned_model_rest_bad_request( @@ -6179,10 +6252,13 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ModelServiceRestInterceptor, "post_create_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_create_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_create_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.CreateTunedModelRequest.pb( model_service.CreateTunedModelRequest() ) @@ -6206,6 +6282,7 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_tuned_model( request, @@ -6217,6 +6294,7 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tuned_model_rest_bad_request( @@ -6420,10 +6498,13 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_update_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_update_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_update_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.UpdateTunedModelRequest.pb( model_service.UpdateTunedModelRequest() ) @@ -6447,6 +6528,7 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_tuned_model.TunedModel() + post_with_metadata.return_value = gag_tuned_model.TunedModel(), metadata client.update_tuned_model( request, @@ -6458,6 +6540,7 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tuned_model_rest_bad_request( diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_permission_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_permission_service.py index 5d1db613de20..3736995c2bb8 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_permission_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_permission_service.py @@ -64,6 +64,13 @@ from google.ai.generativelanguage_v1beta.types import permission from google.ai.generativelanguage_v1beta.types import permission_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -331,6 +338,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PermissionServiceClient(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 = PermissionServiceClient(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", [ @@ -4980,10 +5030,14 @@ def test_create_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_create_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_create_permission_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_create_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.CreatePermissionRequest.pb( permission_service.CreatePermissionRequest() ) @@ -5007,6 +5061,7 @@ def test_create_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_permission.Permission() + post_with_metadata.return_value = gag_permission.Permission(), metadata client.create_permission( request, @@ -5018,6 +5073,7 @@ def test_create_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_permission_rest_bad_request( @@ -5108,10 +5164,13 @@ def test_get_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_get_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, "post_get_permission_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_get_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.GetPermissionRequest.pb( permission_service.GetPermissionRequest() ) @@ -5135,6 +5194,7 @@ def test_get_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission.Permission() + post_with_metadata.return_value = permission.Permission(), metadata client.get_permission( request, @@ -5146,6 +5206,7 @@ def test_get_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_permissions_rest_bad_request( @@ -5230,10 +5291,14 @@ def test_list_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_list_permissions" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_list_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_list_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.ListPermissionsRequest.pb( permission_service.ListPermissionsRequest() ) @@ -5259,6 +5324,10 @@ def test_list_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission_service.ListPermissionsResponse() + post_with_metadata.return_value = ( + permission_service.ListPermissionsResponse(), + metadata, + ) client.list_permissions( request, @@ -5270,6 +5339,7 @@ def test_list_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_permission_rest_bad_request( @@ -5433,10 +5503,14 @@ def test_update_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_update_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_update_permission_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_update_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.UpdatePermissionRequest.pb( permission_service.UpdatePermissionRequest() ) @@ -5460,6 +5534,7 @@ def test_update_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_permission.Permission() + post_with_metadata.return_value = gag_permission.Permission(), metadata client.update_permission( request, @@ -5471,6 +5546,7 @@ def test_update_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_permission_rest_bad_request( @@ -5661,10 +5737,14 @@ def test_transfer_ownership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_transfer_ownership" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_transfer_ownership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_transfer_ownership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.TransferOwnershipRequest.pb( permission_service.TransferOwnershipRequest() ) @@ -5690,6 +5770,10 @@ def test_transfer_ownership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission_service.TransferOwnershipResponse() + post_with_metadata.return_value = ( + permission_service.TransferOwnershipResponse(), + metadata, + ) client.transfer_ownership( request, @@ -5701,6 +5785,7 @@ def test_transfer_ownership_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_prediction_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_prediction_service.py index 2da4cddf7b82..d2054f044d62 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_prediction_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_prediction_service.py @@ -61,6 +61,13 @@ ) from google.ai.generativelanguage_v1beta.types import prediction_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 @@ -328,6 +335,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PredictionServiceClient(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 = PredictionServiceClient(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", [ @@ -1859,10 +1909,13 @@ def test_predict_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PredictionServiceRestInterceptor, "post_predict" ) as post, mock.patch.object( + transports.PredictionServiceRestInterceptor, "post_predict_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PredictionServiceRestInterceptor, "pre_predict" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = prediction_service.PredictRequest.pb( prediction_service.PredictRequest() ) @@ -1888,6 +1941,7 @@ def test_predict_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = prediction_service.PredictResponse() + post_with_metadata.return_value = prediction_service.PredictResponse(), metadata client.predict( request, @@ -1899,6 +1953,7 @@ def test_predict_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_retriever_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_retriever_service.py index 4ecb0a8c1b04..1fcaccedcbe8 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_retriever_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_retriever_service.py @@ -63,6 +63,13 @@ ) from google.ai.generativelanguage_v1beta.types import retriever, retriever_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 = RetrieverServiceClient(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 = RetrieverServiceClient(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", [ @@ -12157,10 +12207,13 @@ def test_create_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_create_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_create_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_create_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.CreateCorpusRequest.pb( retriever_service.CreateCorpusRequest() ) @@ -12184,6 +12237,7 @@ def test_create_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Corpus() + post_with_metadata.return_value = retriever.Corpus(), metadata client.create_corpus( request, @@ -12195,6 +12249,7 @@ def test_create_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_corpus_rest_bad_request(request_type=retriever_service.GetCorpusRequest): @@ -12279,10 +12334,13 @@ def test_get_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_get_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_get_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_get_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.GetCorpusRequest.pb( retriever_service.GetCorpusRequest() ) @@ -12306,6 +12364,7 @@ def test_get_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Corpus() + post_with_metadata.return_value = retriever.Corpus(), metadata client.get_corpus( request, @@ -12317,6 +12376,7 @@ def test_get_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_corpus_rest_bad_request( @@ -12476,10 +12536,13 @@ def test_update_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_update_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_update_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_update_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.UpdateCorpusRequest.pb( retriever_service.UpdateCorpusRequest() ) @@ -12503,6 +12566,7 @@ def test_update_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Corpus() + post_with_metadata.return_value = retriever.Corpus(), metadata client.update_corpus( request, @@ -12514,6 +12578,7 @@ def test_update_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_corpus_rest_bad_request( @@ -12707,10 +12772,13 @@ def test_list_corpora_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_list_corpora" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_list_corpora_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_list_corpora" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.ListCorporaRequest.pb( retriever_service.ListCorporaRequest() ) @@ -12736,6 +12804,10 @@ def test_list_corpora_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.ListCorporaResponse() + post_with_metadata.return_value = ( + retriever_service.ListCorporaResponse(), + metadata, + ) client.list_corpora( request, @@ -12747,6 +12819,7 @@ def test_list_corpora_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_corpus_rest_bad_request( @@ -12828,10 +12901,13 @@ def test_query_corpus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_query_corpus" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_query_corpus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_query_corpus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.QueryCorpusRequest.pb( retriever_service.QueryCorpusRequest() ) @@ -12857,6 +12933,10 @@ def test_query_corpus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.QueryCorpusResponse() + post_with_metadata.return_value = ( + retriever_service.QueryCorpusResponse(), + metadata, + ) client.query_corpus( request, @@ -12868,6 +12948,7 @@ def test_query_corpus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_document_rest_bad_request( @@ -13035,10 +13116,13 @@ def test_create_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_create_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_create_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_create_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.CreateDocumentRequest.pb( retriever_service.CreateDocumentRequest() ) @@ -13062,6 +13146,7 @@ def test_create_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Document() + post_with_metadata.return_value = retriever.Document(), metadata client.create_document( request, @@ -13073,6 +13158,7 @@ def test_create_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_document_rest_bad_request( @@ -13159,10 +13245,13 @@ def test_get_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_get_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_get_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_get_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.GetDocumentRequest.pb( retriever_service.GetDocumentRequest() ) @@ -13186,6 +13275,7 @@ def test_get_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Document() + post_with_metadata.return_value = retriever.Document(), metadata client.get_document( request, @@ -13197,6 +13287,7 @@ def test_get_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_document_rest_bad_request( @@ -13364,10 +13455,13 @@ def test_update_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_update_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_update_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_update_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.UpdateDocumentRequest.pb( retriever_service.UpdateDocumentRequest() ) @@ -13391,6 +13485,7 @@ def test_update_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Document() + post_with_metadata.return_value = retriever.Document(), metadata client.update_document( request, @@ -13402,6 +13497,7 @@ def test_update_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_document_rest_bad_request( @@ -13595,10 +13691,13 @@ def test_list_documents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_list_documents" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_list_documents_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_list_documents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.ListDocumentsRequest.pb( retriever_service.ListDocumentsRequest() ) @@ -13624,6 +13723,10 @@ def test_list_documents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.ListDocumentsResponse() + post_with_metadata.return_value = ( + retriever_service.ListDocumentsResponse(), + metadata, + ) client.list_documents( request, @@ -13635,6 +13738,7 @@ def test_list_documents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_document_rest_bad_request( @@ -13716,10 +13820,13 @@ def test_query_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_query_document" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_query_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_query_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.QueryDocumentRequest.pb( retriever_service.QueryDocumentRequest() ) @@ -13745,6 +13852,10 @@ def test_query_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.QueryDocumentResponse() + post_with_metadata.return_value = ( + retriever_service.QueryDocumentResponse(), + metadata, + ) client.query_document( request, @@ -13756,6 +13867,7 @@ def test_query_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_chunk_rest_bad_request( @@ -13924,10 +14036,13 @@ def test_create_chunk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_create_chunk" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_create_chunk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_create_chunk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.CreateChunkRequest.pb( retriever_service.CreateChunkRequest() ) @@ -13951,6 +14066,7 @@ def test_create_chunk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Chunk() + post_with_metadata.return_value = retriever.Chunk(), metadata client.create_chunk( request, @@ -13962,6 +14078,7 @@ def test_create_chunk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_chunks_rest_bad_request( @@ -14043,10 +14160,14 @@ def test_batch_create_chunks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_batch_create_chunks" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, + "post_batch_create_chunks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_batch_create_chunks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.BatchCreateChunksRequest.pb( retriever_service.BatchCreateChunksRequest() ) @@ -14072,6 +14193,10 @@ def test_batch_create_chunks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.BatchCreateChunksResponse() + post_with_metadata.return_value = ( + retriever_service.BatchCreateChunksResponse(), + metadata, + ) client.batch_create_chunks( request, @@ -14083,6 +14208,7 @@ def test_batch_create_chunks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_chunk_rest_bad_request(request_type=retriever_service.GetChunkRequest): @@ -14167,10 +14293,13 @@ def test_get_chunk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_get_chunk" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_get_chunk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_get_chunk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.GetChunkRequest.pb( retriever_service.GetChunkRequest() ) @@ -14194,6 +14323,7 @@ def test_get_chunk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Chunk() + post_with_metadata.return_value = retriever.Chunk(), metadata client.get_chunk( request, @@ -14205,6 +14335,7 @@ def test_get_chunk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_chunk_rest_bad_request( @@ -14377,10 +14508,13 @@ def test_update_chunk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_update_chunk" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_update_chunk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_update_chunk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.UpdateChunkRequest.pb( retriever_service.UpdateChunkRequest() ) @@ -14404,6 +14538,7 @@ def test_update_chunk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever.Chunk() + post_with_metadata.return_value = retriever.Chunk(), metadata client.update_chunk( request, @@ -14415,6 +14550,7 @@ def test_update_chunk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_chunks_rest_bad_request( @@ -14496,10 +14632,14 @@ def test_batch_update_chunks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_batch_update_chunks" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, + "post_batch_update_chunks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_batch_update_chunks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.BatchUpdateChunksRequest.pb( retriever_service.BatchUpdateChunksRequest() ) @@ -14525,6 +14665,10 @@ def test_batch_update_chunks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.BatchUpdateChunksResponse() + post_with_metadata.return_value = ( + retriever_service.BatchUpdateChunksResponse(), + metadata, + ) client.batch_update_chunks( request, @@ -14536,6 +14680,7 @@ def test_batch_update_chunks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_chunk_rest_bad_request( @@ -14836,10 +14981,13 @@ def test_list_chunks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RetrieverServiceRestInterceptor, "post_list_chunks" ) as post, mock.patch.object( + transports.RetrieverServiceRestInterceptor, "post_list_chunks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RetrieverServiceRestInterceptor, "pre_list_chunks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = retriever_service.ListChunksRequest.pb( retriever_service.ListChunksRequest() ) @@ -14865,6 +15013,10 @@ def test_list_chunks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = retriever_service.ListChunksResponse() + post_with_metadata.return_value = ( + retriever_service.ListChunksResponse(), + metadata, + ) client.list_chunks( request, @@ -14876,6 +15028,7 @@ def test_list_chunks_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_text_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_text_service.py index f4c3411358f8..53e5ff4d544e 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_text_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta/test_text_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1beta.types import safety, text_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 @@ -299,6 +306,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 = TextServiceClient(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 = TextServiceClient(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", [ @@ -3537,10 +3587,13 @@ def test_generate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_generate_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_generate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_generate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.GenerateTextRequest.pb( text_service.GenerateTextRequest() ) @@ -3566,6 +3619,7 @@ def test_generate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.GenerateTextResponse() + post_with_metadata.return_value = text_service.GenerateTextResponse(), metadata client.generate_text( request, @@ -3577,6 +3631,7 @@ def test_generate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_text_rest_bad_request(request_type=text_service.EmbedTextRequest): @@ -3656,10 +3711,13 @@ def test_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.EmbedTextRequest.pb(text_service.EmbedTextRequest()) transcode.return_value = { "method": "post", @@ -3683,6 +3741,7 @@ def test_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.EmbedTextResponse() + post_with_metadata.return_value = text_service.EmbedTextResponse(), metadata client.embed_text( request, @@ -3694,6 +3753,7 @@ def test_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_embed_text_rest_bad_request( @@ -3775,10 +3835,13 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_batch_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_batch_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_batch_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.BatchEmbedTextRequest.pb( text_service.BatchEmbedTextRequest() ) @@ -3804,6 +3867,10 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.BatchEmbedTextResponse() + post_with_metadata.return_value = ( + text_service.BatchEmbedTextResponse(), + metadata, + ) client.batch_embed_text( request, @@ -3815,6 +3882,7 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_text_tokens_rest_bad_request( @@ -3899,10 +3967,13 @@ def test_count_text_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_count_text_tokens" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_count_text_tokens_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_count_text_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.CountTextTokensRequest.pb( text_service.CountTextTokensRequest() ) @@ -3928,6 +3999,10 @@ def test_count_text_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.CountTextTokensResponse() + post_with_metadata.return_value = ( + text_service.CountTextTokensResponse(), + metadata, + ) client.count_text_tokens( request, @@ -3939,6 +4014,7 @@ def test_count_text_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_discuss_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_discuss_service.py index ae755c101e55..d2d2b1d5372a 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_discuss_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_discuss_service.py @@ -59,6 +59,13 @@ ) from google.ai.generativelanguage_v1beta2.types import citation, discuss_service, safety +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = DiscussServiceClient(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 = DiscussServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -2466,10 +2516,13 @@ def test_generate_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_generate_message" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, "post_generate_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_generate_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.GenerateMessageRequest.pb( discuss_service.GenerateMessageRequest() ) @@ -2495,6 +2548,10 @@ def test_generate_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.GenerateMessageResponse() + post_with_metadata.return_value = ( + discuss_service.GenerateMessageResponse(), + metadata, + ) client.generate_message( request, @@ -2506,6 +2563,7 @@ def test_generate_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_message_tokens_rest_bad_request( @@ -2590,10 +2648,14 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_count_message_tokens" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, + "post_count_message_tokens_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_count_message_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.CountMessageTokensRequest.pb( discuss_service.CountMessageTokensRequest() ) @@ -2619,6 +2681,10 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.CountMessageTokensResponse() + post_with_metadata.return_value = ( + discuss_service.CountMessageTokensResponse(), + metadata, + ) client.count_message_tokens( request, @@ -2630,6 +2696,7 @@ def test_count_message_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_model_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_model_service.py index 344c9b785904..6fd7eff500ef 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_model_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_model_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1beta2.types import model, model_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 @@ -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 = ModelServiceClient(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 = ModelServiceClient(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", [ @@ -2525,10 +2575,13 @@ def test_get_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetModelRequest.pb(model_service.GetModelRequest()) transcode.return_value = { "method": "post", @@ -2550,6 +2603,7 @@ def test_get_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model.Model() + post_with_metadata.return_value = model.Model(), metadata client.get_model( request, @@ -2561,6 +2615,7 @@ def test_get_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_models_rest_bad_request(request_type=model_service.ListModelsRequest): @@ -2643,10 +2698,13 @@ def test_list_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListModelsRequest.pb( model_service.ListModelsRequest() ) @@ -2672,6 +2730,7 @@ def test_list_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListModelsResponse() + post_with_metadata.return_value = model_service.ListModelsResponse(), metadata client.list_models( request, @@ -2683,6 +2742,7 @@ def test_list_models_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_text_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_text_service.py index d0e3e74b6eb9..f372edf9581e 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_text_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta2/test_text_service.py @@ -59,6 +59,13 @@ ) from google.ai.generativelanguage_v1beta2.types import safety, text_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 @@ -298,6 +305,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 = TextServiceClient(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 = TextServiceClient(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", [ @@ -2400,10 +2450,13 @@ def test_generate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_generate_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_generate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_generate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.GenerateTextRequest.pb( text_service.GenerateTextRequest() ) @@ -2429,6 +2482,7 @@ def test_generate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.GenerateTextResponse() + post_with_metadata.return_value = text_service.GenerateTextResponse(), metadata client.generate_text( request, @@ -2440,6 +2494,7 @@ def test_generate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_text_rest_bad_request(request_type=text_service.EmbedTextRequest): @@ -2519,10 +2574,13 @@ def test_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.EmbedTextRequest.pb(text_service.EmbedTextRequest()) transcode.return_value = { "method": "post", @@ -2546,6 +2604,7 @@ def test_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.EmbedTextResponse() + post_with_metadata.return_value = text_service.EmbedTextResponse(), metadata client.embed_text( request, @@ -2557,6 +2616,7 @@ def test_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_discuss_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_discuss_service.py index b0e1f7beddc8..6d167a96bebe 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_discuss_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_discuss_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1beta3.types import citation, discuss_service, safety +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 = DiscussServiceClient(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 = DiscussServiceClient(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", [ @@ -2467,10 +2517,13 @@ def test_generate_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_generate_message" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, "post_generate_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_generate_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.GenerateMessageRequest.pb( discuss_service.GenerateMessageRequest() ) @@ -2496,6 +2549,10 @@ def test_generate_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.GenerateMessageResponse() + post_with_metadata.return_value = ( + discuss_service.GenerateMessageResponse(), + metadata, + ) client.generate_message( request, @@ -2507,6 +2564,7 @@ def test_generate_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_message_tokens_rest_bad_request( @@ -2591,10 +2649,14 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiscussServiceRestInterceptor, "post_count_message_tokens" ) as post, mock.patch.object( + transports.DiscussServiceRestInterceptor, + "post_count_message_tokens_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DiscussServiceRestInterceptor, "pre_count_message_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = discuss_service.CountMessageTokensRequest.pb( discuss_service.CountMessageTokensRequest() ) @@ -2620,6 +2682,10 @@ def test_count_message_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discuss_service.CountMessageTokensResponse() + post_with_metadata.return_value = ( + discuss_service.CountMessageTokensResponse(), + metadata, + ) client.count_message_tokens( request, @@ -2631,6 +2697,7 @@ def test_count_message_tokens_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_model_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_model_service.py index 18414da7feef..bc516fe51427 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_model_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_model_service.py @@ -74,6 +74,13 @@ from google.ai.generativelanguage_v1beta3.types import model, model_service from google.ai.generativelanguage_v1beta3.types import tuned_model +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ModelServiceClient(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 = ModelServiceClient(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", [ @@ -5565,10 +5615,13 @@ def test_get_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetModelRequest.pb(model_service.GetModelRequest()) transcode.return_value = { "method": "post", @@ -5590,6 +5643,7 @@ def test_get_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model.Model() + post_with_metadata.return_value = model.Model(), metadata client.get_model( request, @@ -5601,6 +5655,7 @@ def test_get_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_models_rest_bad_request(request_type=model_service.ListModelsRequest): @@ -5683,10 +5738,13 @@ def test_list_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListModelsRequest.pb( model_service.ListModelsRequest() ) @@ -5712,6 +5770,7 @@ def test_list_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListModelsResponse() + post_with_metadata.return_value = model_service.ListModelsResponse(), metadata client.list_models( request, @@ -5723,6 +5782,7 @@ def test_list_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tuned_model_rest_bad_request( @@ -5820,10 +5880,13 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_get_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_get_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_get_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.GetTunedModelRequest.pb( model_service.GetTunedModelRequest() ) @@ -5847,6 +5910,7 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tuned_model.TunedModel() + post_with_metadata.return_value = tuned_model.TunedModel(), metadata client.get_tuned_model( request, @@ -5858,6 +5922,7 @@ def test_get_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tuned_models_rest_bad_request( @@ -5942,10 +6007,13 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_list_tuned_models" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_list_tuned_models_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_list_tuned_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.ListTunedModelsRequest.pb( model_service.ListTunedModelsRequest() ) @@ -5971,6 +6039,10 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = model_service.ListTunedModelsResponse() + post_with_metadata.return_value = ( + model_service.ListTunedModelsResponse(), + metadata, + ) client.list_tuned_models( request, @@ -5982,6 +6054,7 @@ def test_list_tuned_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tuned_model_rest_bad_request( @@ -6164,10 +6237,13 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ModelServiceRestInterceptor, "post_create_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_create_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_create_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.CreateTunedModelRequest.pb( model_service.CreateTunedModelRequest() ) @@ -6191,6 +6267,7 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_tuned_model( request, @@ -6202,6 +6279,7 @@ def test_create_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tuned_model_rest_bad_request( @@ -6401,10 +6479,13 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ModelServiceRestInterceptor, "post_update_tuned_model" ) as post, mock.patch.object( + transports.ModelServiceRestInterceptor, "post_update_tuned_model_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ModelServiceRestInterceptor, "pre_update_tuned_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = model_service.UpdateTunedModelRequest.pb( model_service.UpdateTunedModelRequest() ) @@ -6428,6 +6509,7 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_tuned_model.TunedModel() + post_with_metadata.return_value = gag_tuned_model.TunedModel(), metadata client.update_tuned_model( request, @@ -6439,6 +6521,7 @@ def test_update_tuned_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tuned_model_rest_bad_request( diff --git a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_permission_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_permission_service.py index b10783b57a84..20a5c4f3311a 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_permission_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_permission_service.py @@ -64,6 +64,13 @@ from google.ai.generativelanguage_v1beta3.types import permission from google.ai.generativelanguage_v1beta3.types import permission_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -331,6 +338,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PermissionServiceClient(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 = PermissionServiceClient(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", [ @@ -4980,10 +5030,14 @@ def test_create_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_create_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_create_permission_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_create_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.CreatePermissionRequest.pb( permission_service.CreatePermissionRequest() ) @@ -5007,6 +5061,7 @@ def test_create_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_permission.Permission() + post_with_metadata.return_value = gag_permission.Permission(), metadata client.create_permission( request, @@ -5018,6 +5073,7 @@ def test_create_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_permission_rest_bad_request( @@ -5108,10 +5164,13 @@ def test_get_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_get_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, "post_get_permission_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_get_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.GetPermissionRequest.pb( permission_service.GetPermissionRequest() ) @@ -5135,6 +5194,7 @@ def test_get_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission.Permission() + post_with_metadata.return_value = permission.Permission(), metadata client.get_permission( request, @@ -5146,6 +5206,7 @@ def test_get_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_permissions_rest_bad_request( @@ -5230,10 +5291,14 @@ def test_list_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_list_permissions" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_list_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_list_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.ListPermissionsRequest.pb( permission_service.ListPermissionsRequest() ) @@ -5259,6 +5324,10 @@ def test_list_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission_service.ListPermissionsResponse() + post_with_metadata.return_value = ( + permission_service.ListPermissionsResponse(), + metadata, + ) client.list_permissions( request, @@ -5270,6 +5339,7 @@ def test_list_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_permission_rest_bad_request( @@ -5433,10 +5503,14 @@ def test_update_permission_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_update_permission" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_update_permission_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_update_permission" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.UpdatePermissionRequest.pb( permission_service.UpdatePermissionRequest() ) @@ -5460,6 +5534,7 @@ def test_update_permission_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gag_permission.Permission() + post_with_metadata.return_value = gag_permission.Permission(), metadata client.update_permission( request, @@ -5471,6 +5546,7 @@ def test_update_permission_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_permission_rest_bad_request( @@ -5661,10 +5737,14 @@ def test_transfer_ownership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PermissionServiceRestInterceptor, "post_transfer_ownership" ) as post, mock.patch.object( + transports.PermissionServiceRestInterceptor, + "post_transfer_ownership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PermissionServiceRestInterceptor, "pre_transfer_ownership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = permission_service.TransferOwnershipRequest.pb( permission_service.TransferOwnershipRequest() ) @@ -5690,6 +5770,10 @@ def test_transfer_ownership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = permission_service.TransferOwnershipResponse() + post_with_metadata.return_value = ( + permission_service.TransferOwnershipResponse(), + metadata, + ) client.transfer_ownership( request, @@ -5701,6 +5785,7 @@ def test_transfer_ownership_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-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_text_service.py b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_text_service.py index 17dce0231d24..060cd7bb739a 100644 --- a/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_text_service.py +++ b/packages/google-ai-generativelanguage/tests/unit/gapic/generativelanguage_v1beta3/test_text_service.py @@ -60,6 +60,13 @@ ) from google.ai.generativelanguage_v1beta3.types import safety, text_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 @@ -299,6 +306,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 = TextServiceClient(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 = TextServiceClient(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", [ @@ -3561,10 +3611,13 @@ def test_generate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_generate_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_generate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_generate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.GenerateTextRequest.pb( text_service.GenerateTextRequest() ) @@ -3590,6 +3643,7 @@ def test_generate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.GenerateTextResponse() + post_with_metadata.return_value = text_service.GenerateTextResponse(), metadata client.generate_text( request, @@ -3601,6 +3655,7 @@ def test_generate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_embed_text_rest_bad_request(request_type=text_service.EmbedTextRequest): @@ -3680,10 +3735,13 @@ def test_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.EmbedTextRequest.pb(text_service.EmbedTextRequest()) transcode.return_value = { "method": "post", @@ -3707,6 +3765,7 @@ def test_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.EmbedTextResponse() + post_with_metadata.return_value = text_service.EmbedTextResponse(), metadata client.embed_text( request, @@ -3718,6 +3777,7 @@ def test_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_embed_text_rest_bad_request( @@ -3799,10 +3859,13 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_batch_embed_text" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_batch_embed_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_batch_embed_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.BatchEmbedTextRequest.pb( text_service.BatchEmbedTextRequest() ) @@ -3828,6 +3891,10 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.BatchEmbedTextResponse() + post_with_metadata.return_value = ( + text_service.BatchEmbedTextResponse(), + metadata, + ) client.batch_embed_text( request, @@ -3839,6 +3906,7 @@ def test_batch_embed_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_count_text_tokens_rest_bad_request( @@ -3923,10 +3991,13 @@ def test_count_text_tokens_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextServiceRestInterceptor, "post_count_text_tokens" ) as post, mock.patch.object( + transports.TextServiceRestInterceptor, "post_count_text_tokens_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextServiceRestInterceptor, "pre_count_text_tokens" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = text_service.CountTextTokensRequest.pb( text_service.CountTextTokensRequest() ) @@ -3952,6 +4023,10 @@ def test_count_text_tokens_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = text_service.CountTextTokensResponse() + post_with_metadata.return_value = ( + text_service.CountTextTokensResponse(), + metadata, + ) client.count_text_tokens( request, @@ -3963,6 +4038,7 @@ def test_count_text_tokens_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-analytics-data/google/analytics/data/gapic_version.py b/packages/google-analytics-data/google/analytics/data/gapic_version.py index e7e0463c8ca1..558c8aab67c5 100644 --- a/packages/google-analytics-data/google/analytics/data/gapic_version.py +++ b/packages/google-analytics-data/google/analytics/data/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.18.16" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-analytics-data/google/analytics/data_v1alpha/gapic_version.py b/packages/google-analytics-data/google/analytics/data_v1alpha/gapic_version.py index e7e0463c8ca1..558c8aab67c5 100644 --- a/packages/google-analytics-data/google/analytics/data_v1alpha/gapic_version.py +++ b/packages/google-analytics-data/google/analytics/data_v1alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.18.16" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/client.py b/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/client.py index 421b316b6c2c..3156f18f5bc6 100644 --- a/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/client.py +++ b/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/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 @@ -540,6 +542,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-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/transports/rest.py b/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/transports/rest.py index faf3c835dd1a..f35081bc2816 100644 --- a/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/transports/rest.py +++ b/packages/google-analytics-data/google/analytics/data_v1alpha/services/alpha_analytics_data/transports/rest.py @@ -207,12 +207,35 @@ def post_create_audience_list( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_audience_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_audience_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_create_audience_list` interceptor runs + before the `post_create_audience_list_with_metadata` interceptor. """ return response + def post_create_audience_list_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_audience_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_create_audience_list_with_metadata` + interceptor in new development instead of the `post_create_audience_list` interceptor. + When both interceptors are used, this `post_create_audience_list_with_metadata` interceptor runs after the + `post_create_audience_list` interceptor. The (possibly modified) response returned by + `post_create_audience_list` will be passed to + `post_create_audience_list_with_metadata`. + """ + return response, metadata + def pre_create_recurring_audience_list( self, request: analytics_data_api.CreateRecurringAudienceListRequest, @@ -233,12 +256,38 @@ def post_create_recurring_audience_list( ) -> analytics_data_api.RecurringAudienceList: """Post-rpc interceptor for create_recurring_audience_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_recurring_audience_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_create_recurring_audience_list` interceptor runs + before the `post_create_recurring_audience_list_with_metadata` interceptor. """ return response + def post_create_recurring_audience_list_with_metadata( + self, + response: analytics_data_api.RecurringAudienceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.RecurringAudienceList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_recurring_audience_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_create_recurring_audience_list_with_metadata` + interceptor in new development instead of the `post_create_recurring_audience_list` interceptor. + When both interceptors are used, this `post_create_recurring_audience_list_with_metadata` interceptor runs after the + `post_create_recurring_audience_list` interceptor. The (possibly modified) response returned by + `post_create_recurring_audience_list` will be passed to + `post_create_recurring_audience_list_with_metadata`. + """ + return response, metadata + def pre_create_report_task( self, request: analytics_data_api.CreateReportTaskRequest, @@ -259,12 +308,35 @@ def post_create_report_task( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_report_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_report_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_create_report_task` interceptor runs + before the `post_create_report_task_with_metadata` interceptor. """ return response + def post_create_report_task_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_report_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_create_report_task_with_metadata` + interceptor in new development instead of the `post_create_report_task` interceptor. + When both interceptors are used, this `post_create_report_task_with_metadata` interceptor runs after the + `post_create_report_task` interceptor. The (possibly modified) response returned by + `post_create_report_task` will be passed to + `post_create_report_task_with_metadata`. + """ + return response, metadata + def pre_get_audience_list( self, request: analytics_data_api.GetAudienceListRequest, @@ -285,12 +357,37 @@ def post_get_audience_list( ) -> analytics_data_api.AudienceList: """Post-rpc interceptor for get_audience_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_audience_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_get_audience_list` interceptor runs + before the `post_get_audience_list_with_metadata` interceptor. """ return response + def post_get_audience_list_with_metadata( + self, + response: analytics_data_api.AudienceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.AudienceList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_audience_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_get_audience_list_with_metadata` + interceptor in new development instead of the `post_get_audience_list` interceptor. + When both interceptors are used, this `post_get_audience_list_with_metadata` interceptor runs after the + `post_get_audience_list` interceptor. The (possibly modified) response returned by + `post_get_audience_list` will be passed to + `post_get_audience_list_with_metadata`. + """ + return response, metadata + def pre_get_property_quotas_snapshot( self, request: analytics_data_api.GetPropertyQuotasSnapshotRequest, @@ -311,12 +408,38 @@ def post_get_property_quotas_snapshot( ) -> analytics_data_api.PropertyQuotasSnapshot: """Post-rpc interceptor for get_property_quotas_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_property_quotas_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_get_property_quotas_snapshot` interceptor runs + before the `post_get_property_quotas_snapshot_with_metadata` interceptor. """ return response + def post_get_property_quotas_snapshot_with_metadata( + self, + response: analytics_data_api.PropertyQuotasSnapshot, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.PropertyQuotasSnapshot, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_property_quotas_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_get_property_quotas_snapshot_with_metadata` + interceptor in new development instead of the `post_get_property_quotas_snapshot` interceptor. + When both interceptors are used, this `post_get_property_quotas_snapshot_with_metadata` interceptor runs after the + `post_get_property_quotas_snapshot` interceptor. The (possibly modified) response returned by + `post_get_property_quotas_snapshot` will be passed to + `post_get_property_quotas_snapshot_with_metadata`. + """ + return response, metadata + def pre_get_recurring_audience_list( self, request: analytics_data_api.GetRecurringAudienceListRequest, @@ -337,12 +460,38 @@ def post_get_recurring_audience_list( ) -> analytics_data_api.RecurringAudienceList: """Post-rpc interceptor for get_recurring_audience_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_recurring_audience_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_get_recurring_audience_list` interceptor runs + before the `post_get_recurring_audience_list_with_metadata` interceptor. """ return response + def post_get_recurring_audience_list_with_metadata( + self, + response: analytics_data_api.RecurringAudienceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.RecurringAudienceList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_recurring_audience_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_get_recurring_audience_list_with_metadata` + interceptor in new development instead of the `post_get_recurring_audience_list` interceptor. + When both interceptors are used, this `post_get_recurring_audience_list_with_metadata` interceptor runs after the + `post_get_recurring_audience_list` interceptor. The (possibly modified) response returned by + `post_get_recurring_audience_list` will be passed to + `post_get_recurring_audience_list_with_metadata`. + """ + return response, metadata + def pre_get_report_task( self, request: analytics_data_api.GetReportTaskRequest, @@ -362,12 +511,35 @@ def post_get_report_task( ) -> analytics_data_api.ReportTask: """Post-rpc interceptor for get_report_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_report_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_get_report_task` interceptor runs + before the `post_get_report_task_with_metadata` interceptor. """ return response + def post_get_report_task_with_metadata( + self, + response: analytics_data_api.ReportTask, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[analytics_data_api.ReportTask, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_report_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_get_report_task_with_metadata` + interceptor in new development instead of the `post_get_report_task` interceptor. + When both interceptors are used, this `post_get_report_task_with_metadata` interceptor runs after the + `post_get_report_task` interceptor. The (possibly modified) response returned by + `post_get_report_task` will be passed to + `post_get_report_task_with_metadata`. + """ + return response, metadata + def pre_list_audience_lists( self, request: analytics_data_api.ListAudienceListsRequest, @@ -388,12 +560,38 @@ def post_list_audience_lists( ) -> analytics_data_api.ListAudienceListsResponse: """Post-rpc interceptor for list_audience_lists - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_audience_lists_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_list_audience_lists` interceptor runs + before the `post_list_audience_lists_with_metadata` interceptor. """ return response + def post_list_audience_lists_with_metadata( + self, + response: analytics_data_api.ListAudienceListsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.ListAudienceListsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_audience_lists + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_list_audience_lists_with_metadata` + interceptor in new development instead of the `post_list_audience_lists` interceptor. + When both interceptors are used, this `post_list_audience_lists_with_metadata` interceptor runs after the + `post_list_audience_lists` interceptor. The (possibly modified) response returned by + `post_list_audience_lists` will be passed to + `post_list_audience_lists_with_metadata`. + """ + return response, metadata + def pre_list_recurring_audience_lists( self, request: analytics_data_api.ListRecurringAudienceListsRequest, @@ -414,12 +612,38 @@ def post_list_recurring_audience_lists( ) -> analytics_data_api.ListRecurringAudienceListsResponse: """Post-rpc interceptor for list_recurring_audience_lists - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_recurring_audience_lists_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_list_recurring_audience_lists` interceptor runs + before the `post_list_recurring_audience_lists_with_metadata` interceptor. """ return response + def post_list_recurring_audience_lists_with_metadata( + self, + response: analytics_data_api.ListRecurringAudienceListsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.ListRecurringAudienceListsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_recurring_audience_lists + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_list_recurring_audience_lists_with_metadata` + interceptor in new development instead of the `post_list_recurring_audience_lists` interceptor. + When both interceptors are used, this `post_list_recurring_audience_lists_with_metadata` interceptor runs after the + `post_list_recurring_audience_lists` interceptor. The (possibly modified) response returned by + `post_list_recurring_audience_lists` will be passed to + `post_list_recurring_audience_lists_with_metadata`. + """ + return response, metadata + def pre_list_report_tasks( self, request: analytics_data_api.ListReportTasksRequest, @@ -440,12 +664,38 @@ def post_list_report_tasks( ) -> analytics_data_api.ListReportTasksResponse: """Post-rpc interceptor for list_report_tasks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_report_tasks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_list_report_tasks` interceptor runs + before the `post_list_report_tasks_with_metadata` interceptor. """ return response + def post_list_report_tasks_with_metadata( + self, + response: analytics_data_api.ListReportTasksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.ListReportTasksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_report_tasks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_list_report_tasks_with_metadata` + interceptor in new development instead of the `post_list_report_tasks` interceptor. + When both interceptors are used, this `post_list_report_tasks_with_metadata` interceptor runs after the + `post_list_report_tasks` interceptor. The (possibly modified) response returned by + `post_list_report_tasks` will be passed to + `post_list_report_tasks_with_metadata`. + """ + return response, metadata + def pre_query_audience_list( self, request: analytics_data_api.QueryAudienceListRequest, @@ -466,12 +716,38 @@ def post_query_audience_list( ) -> analytics_data_api.QueryAudienceListResponse: """Post-rpc interceptor for query_audience_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_audience_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_query_audience_list` interceptor runs + before the `post_query_audience_list_with_metadata` interceptor. """ return response + def post_query_audience_list_with_metadata( + self, + response: analytics_data_api.QueryAudienceListResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.QueryAudienceListResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for query_audience_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_query_audience_list_with_metadata` + interceptor in new development instead of the `post_query_audience_list` interceptor. + When both interceptors are used, this `post_query_audience_list_with_metadata` interceptor runs after the + `post_query_audience_list` interceptor. The (possibly modified) response returned by + `post_query_audience_list` will be passed to + `post_query_audience_list_with_metadata`. + """ + return response, metadata + def pre_query_report_task( self, request: analytics_data_api.QueryReportTaskRequest, @@ -492,12 +768,38 @@ def post_query_report_task( ) -> analytics_data_api.QueryReportTaskResponse: """Post-rpc interceptor for query_report_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_report_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_query_report_task` interceptor runs + before the `post_query_report_task_with_metadata` interceptor. """ return response + def post_query_report_task_with_metadata( + self, + response: analytics_data_api.QueryReportTaskResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.QueryReportTaskResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for query_report_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_query_report_task_with_metadata` + interceptor in new development instead of the `post_query_report_task` interceptor. + When both interceptors are used, this `post_query_report_task_with_metadata` interceptor runs after the + `post_query_report_task` interceptor. The (possibly modified) response returned by + `post_query_report_task` will be passed to + `post_query_report_task_with_metadata`. + """ + return response, metadata + def pre_run_funnel_report( self, request: analytics_data_api.RunFunnelReportRequest, @@ -518,12 +820,38 @@ def post_run_funnel_report( ) -> analytics_data_api.RunFunnelReportResponse: """Post-rpc interceptor for run_funnel_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_funnel_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_run_funnel_report` interceptor runs + before the `post_run_funnel_report_with_metadata` interceptor. """ return response + def post_run_funnel_report_with_metadata( + self, + response: analytics_data_api.RunFunnelReportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.RunFunnelReportResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for run_funnel_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_run_funnel_report_with_metadata` + interceptor in new development instead of the `post_run_funnel_report` interceptor. + When both interceptors are used, this `post_run_funnel_report_with_metadata` interceptor runs after the + `post_run_funnel_report` interceptor. The (possibly modified) response returned by + `post_run_funnel_report` will be passed to + `post_run_funnel_report_with_metadata`. + """ + return response, metadata + def pre_sheet_export_audience_list( self, request: analytics_data_api.SheetExportAudienceListRequest, @@ -544,12 +872,38 @@ def post_sheet_export_audience_list( ) -> analytics_data_api.SheetExportAudienceListResponse: """Post-rpc interceptor for sheet_export_audience_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_sheet_export_audience_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlphaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_sheet_export_audience_list` interceptor runs + before the `post_sheet_export_audience_list_with_metadata` interceptor. """ return response + def post_sheet_export_audience_list_with_metadata( + self, + response: analytics_data_api.SheetExportAudienceListResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.SheetExportAudienceListResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for sheet_export_audience_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlphaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_sheet_export_audience_list_with_metadata` + interceptor in new development instead of the `post_sheet_export_audience_list` interceptor. + When both interceptors are used, this `post_sheet_export_audience_list_with_metadata` interceptor runs after the + `post_sheet_export_audience_list` interceptor. The (possibly modified) response returned by + `post_sheet_export_audience_list` will be passed to + `post_sheet_export_audience_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AlphaAnalyticsDataRestStub: @@ -795,6 +1149,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_audience_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_audience_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -953,6 +1311,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_recurring_audience_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_recurring_audience_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1105,6 +1470,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_report_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_report_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1254,6 +1623,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_audience_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_audience_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1402,6 +1775,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_property_quotas_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_property_quotas_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1559,6 +1936,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_recurring_audience_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_recurring_audience_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1703,6 +2084,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_report_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_report_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1849,6 +2234,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_audience_lists(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_audience_lists_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1998,6 +2387,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_recurring_audience_lists(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_recurring_audience_lists_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2148,6 +2544,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_report_tasks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_report_tasks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2300,6 +2700,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_audience_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_audience_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2454,6 +2858,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_report_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_report_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2609,6 +3017,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_funnel_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_funnel_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2766,6 +3178,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_sheet_export_audience_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_sheet_export_audience_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-analytics-data/google/analytics/data_v1beta/gapic_version.py b/packages/google-analytics-data/google/analytics/data_v1beta/gapic_version.py index e7e0463c8ca1..558c8aab67c5 100644 --- a/packages/google-analytics-data/google/analytics/data_v1beta/gapic_version.py +++ b/packages/google-analytics-data/google/analytics/data_v1beta/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.18.16" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/client.py b/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/client.py index 0e690944ba66..5d22f84deb35 100644 --- a/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/client.py +++ b/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/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 @@ -502,6 +504,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-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/transports/rest.py b/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/transports/rest.py index d0802352956b..1ee31c80866b 100644 --- a/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/transports/rest.py +++ b/packages/google-analytics-data/google/analytics/data_v1beta/services/beta_analytics_data/transports/rest.py @@ -183,12 +183,38 @@ def post_batch_run_pivot_reports( ) -> analytics_data_api.BatchRunPivotReportsResponse: """Post-rpc interceptor for batch_run_pivot_reports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_run_pivot_reports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_batch_run_pivot_reports` interceptor runs + before the `post_batch_run_pivot_reports_with_metadata` interceptor. """ return response + def post_batch_run_pivot_reports_with_metadata( + self, + response: analytics_data_api.BatchRunPivotReportsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.BatchRunPivotReportsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_run_pivot_reports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_batch_run_pivot_reports_with_metadata` + interceptor in new development instead of the `post_batch_run_pivot_reports` interceptor. + When both interceptors are used, this `post_batch_run_pivot_reports_with_metadata` interceptor runs after the + `post_batch_run_pivot_reports` interceptor. The (possibly modified) response returned by + `post_batch_run_pivot_reports` will be passed to + `post_batch_run_pivot_reports_with_metadata`. + """ + return response, metadata + def pre_batch_run_reports( self, request: analytics_data_api.BatchRunReportsRequest, @@ -209,12 +235,38 @@ def post_batch_run_reports( ) -> analytics_data_api.BatchRunReportsResponse: """Post-rpc interceptor for batch_run_reports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_run_reports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_batch_run_reports` interceptor runs + before the `post_batch_run_reports_with_metadata` interceptor. """ return response + def post_batch_run_reports_with_metadata( + self, + response: analytics_data_api.BatchRunReportsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.BatchRunReportsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_run_reports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_batch_run_reports_with_metadata` + interceptor in new development instead of the `post_batch_run_reports` interceptor. + When both interceptors are used, this `post_batch_run_reports_with_metadata` interceptor runs after the + `post_batch_run_reports` interceptor. The (possibly modified) response returned by + `post_batch_run_reports` will be passed to + `post_batch_run_reports_with_metadata`. + """ + return response, metadata + def pre_check_compatibility( self, request: analytics_data_api.CheckCompatibilityRequest, @@ -235,12 +287,38 @@ def post_check_compatibility( ) -> analytics_data_api.CheckCompatibilityResponse: """Post-rpc interceptor for check_compatibility - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_check_compatibility_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_check_compatibility` interceptor runs + before the `post_check_compatibility_with_metadata` interceptor. """ return response + def post_check_compatibility_with_metadata( + self, + response: analytics_data_api.CheckCompatibilityResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.CheckCompatibilityResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for check_compatibility + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_check_compatibility_with_metadata` + interceptor in new development instead of the `post_check_compatibility` interceptor. + When both interceptors are used, this `post_check_compatibility_with_metadata` interceptor runs after the + `post_check_compatibility` interceptor. The (possibly modified) response returned by + `post_check_compatibility` will be passed to + `post_check_compatibility_with_metadata`. + """ + return response, metadata + def pre_create_audience_export( self, request: analytics_data_api.CreateAudienceExportRequest, @@ -261,12 +339,35 @@ def post_create_audience_export( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_audience_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_audience_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_create_audience_export` interceptor runs + before the `post_create_audience_export_with_metadata` interceptor. """ return response + def post_create_audience_export_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_audience_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_create_audience_export_with_metadata` + interceptor in new development instead of the `post_create_audience_export` interceptor. + When both interceptors are used, this `post_create_audience_export_with_metadata` interceptor runs after the + `post_create_audience_export` interceptor. The (possibly modified) response returned by + `post_create_audience_export` will be passed to + `post_create_audience_export_with_metadata`. + """ + return response, metadata + def pre_get_audience_export( self, request: analytics_data_api.GetAudienceExportRequest, @@ -287,12 +388,37 @@ def post_get_audience_export( ) -> analytics_data_api.AudienceExport: """Post-rpc interceptor for get_audience_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_audience_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_get_audience_export` interceptor runs + before the `post_get_audience_export_with_metadata` interceptor. """ return response + def post_get_audience_export_with_metadata( + self, + response: analytics_data_api.AudienceExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.AudienceExport, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_audience_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_get_audience_export_with_metadata` + interceptor in new development instead of the `post_get_audience_export` interceptor. + When both interceptors are used, this `post_get_audience_export_with_metadata` interceptor runs after the + `post_get_audience_export` interceptor. The (possibly modified) response returned by + `post_get_audience_export` will be passed to + `post_get_audience_export_with_metadata`. + """ + return response, metadata + def pre_get_metadata( self, request: analytics_data_api.GetMetadataRequest, @@ -312,12 +438,35 @@ def post_get_metadata( ) -> analytics_data_api.Metadata: """Post-rpc interceptor for get_metadata - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_metadata_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_get_metadata` interceptor runs + before the `post_get_metadata_with_metadata` interceptor. """ return response + def post_get_metadata_with_metadata( + self, + response: analytics_data_api.Metadata, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[analytics_data_api.Metadata, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_metadata + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_get_metadata_with_metadata` + interceptor in new development instead of the `post_get_metadata` interceptor. + When both interceptors are used, this `post_get_metadata_with_metadata` interceptor runs after the + `post_get_metadata` interceptor. The (possibly modified) response returned by + `post_get_metadata` will be passed to + `post_get_metadata_with_metadata`. + """ + return response, metadata + def pre_list_audience_exports( self, request: analytics_data_api.ListAudienceExportsRequest, @@ -338,12 +487,38 @@ def post_list_audience_exports( ) -> analytics_data_api.ListAudienceExportsResponse: """Post-rpc interceptor for list_audience_exports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_audience_exports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_list_audience_exports` interceptor runs + before the `post_list_audience_exports_with_metadata` interceptor. """ return response + def post_list_audience_exports_with_metadata( + self, + response: analytics_data_api.ListAudienceExportsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.ListAudienceExportsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_audience_exports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_list_audience_exports_with_metadata` + interceptor in new development instead of the `post_list_audience_exports` interceptor. + When both interceptors are used, this `post_list_audience_exports_with_metadata` interceptor runs after the + `post_list_audience_exports` interceptor. The (possibly modified) response returned by + `post_list_audience_exports` will be passed to + `post_list_audience_exports_with_metadata`. + """ + return response, metadata + def pre_query_audience_export( self, request: analytics_data_api.QueryAudienceExportRequest, @@ -364,12 +539,38 @@ def post_query_audience_export( ) -> analytics_data_api.QueryAudienceExportResponse: """Post-rpc interceptor for query_audience_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_audience_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_query_audience_export` interceptor runs + before the `post_query_audience_export_with_metadata` interceptor. """ return response + def post_query_audience_export_with_metadata( + self, + response: analytics_data_api.QueryAudienceExportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.QueryAudienceExportResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for query_audience_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_query_audience_export_with_metadata` + interceptor in new development instead of the `post_query_audience_export` interceptor. + When both interceptors are used, this `post_query_audience_export_with_metadata` interceptor runs after the + `post_query_audience_export` interceptor. The (possibly modified) response returned by + `post_query_audience_export` will be passed to + `post_query_audience_export_with_metadata`. + """ + return response, metadata + def pre_run_pivot_report( self, request: analytics_data_api.RunPivotReportRequest, @@ -390,12 +591,38 @@ def post_run_pivot_report( ) -> analytics_data_api.RunPivotReportResponse: """Post-rpc interceptor for run_pivot_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_pivot_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_run_pivot_report` interceptor runs + before the `post_run_pivot_report_with_metadata` interceptor. """ return response + def post_run_pivot_report_with_metadata( + self, + response: analytics_data_api.RunPivotReportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.RunPivotReportResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for run_pivot_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_run_pivot_report_with_metadata` + interceptor in new development instead of the `post_run_pivot_report` interceptor. + When both interceptors are used, this `post_run_pivot_report_with_metadata` interceptor runs after the + `post_run_pivot_report` interceptor. The (possibly modified) response returned by + `post_run_pivot_report` will be passed to + `post_run_pivot_report_with_metadata`. + """ + return response, metadata + def pre_run_realtime_report( self, request: analytics_data_api.RunRealtimeReportRequest, @@ -416,12 +643,38 @@ def post_run_realtime_report( ) -> analytics_data_api.RunRealtimeReportResponse: """Post-rpc interceptor for run_realtime_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_realtime_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_run_realtime_report` interceptor runs + before the `post_run_realtime_report_with_metadata` interceptor. """ return response + def post_run_realtime_report_with_metadata( + self, + response: analytics_data_api.RunRealtimeReportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.RunRealtimeReportResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for run_realtime_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_run_realtime_report_with_metadata` + interceptor in new development instead of the `post_run_realtime_report` interceptor. + When both interceptors are used, this `post_run_realtime_report_with_metadata` interceptor runs after the + `post_run_realtime_report` interceptor. The (possibly modified) response returned by + `post_run_realtime_report` will be passed to + `post_run_realtime_report_with_metadata`. + """ + return response, metadata + def pre_run_report( self, request: analytics_data_api.RunReportRequest, @@ -441,12 +694,37 @@ def post_run_report( ) -> analytics_data_api.RunReportResponse: """Post-rpc interceptor for run_report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BetaAnalyticsData server but before - it is returned to user code. + it is returned to user code. This `post_run_report` interceptor runs + before the `post_run_report_with_metadata` interceptor. """ return response + def post_run_report_with_metadata( + self, + response: analytics_data_api.RunReportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + analytics_data_api.RunReportResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for run_report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BetaAnalyticsData server but before it is returned to user code. + + We recommend only using this `post_run_report_with_metadata` + interceptor in new development instead of the `post_run_report` interceptor. + When both interceptors are used, this `post_run_report_with_metadata` interceptor runs after the + `post_run_report` interceptor. The (possibly modified) response returned by + `post_run_report` will be passed to + `post_run_report_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class BetaAnalyticsDataRestStub: @@ -693,6 +971,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_run_pivot_reports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_run_pivot_reports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -849,6 +1131,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_run_reports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_run_reports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1007,6 +1293,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_check_compatibility(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_check_compatibility_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1162,6 +1452,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_audience_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_audience_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1312,6 +1606,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_audience_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_audience_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1458,6 +1756,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_metadata(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_metadata_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1606,6 +1908,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_audience_exports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_audience_exports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1762,6 +2068,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_audience_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_audience_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1916,6 +2226,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_pivot_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_pivot_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2070,6 +2384,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_realtime_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_realtime_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2220,6 +2538,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1alpha.json b/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1alpha.json index 00bf06f70394..102d88b3e1e4 100644 --- a/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1alpha.json +++ b/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-analytics-data", - "version": "0.18.16" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1beta.json b/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1beta.json index 5a4307966794..0da1d46ae49b 100644 --- a/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1beta.json +++ b/packages/google-analytics-data/samples/generated_samples/snippet_metadata_google.analytics.data.v1beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-analytics-data", - "version": "0.18.16" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-analytics-data/tests/unit/gapic/data_v1alpha/test_alpha_analytics_data.py b/packages/google-analytics-data/tests/unit/gapic/data_v1alpha/test_alpha_analytics_data.py index fb3ad3b3bf7b..c85d5400591f 100644 --- a/packages/google-analytics-data/tests/unit/gapic/data_v1alpha/test_alpha_analytics_data.py +++ b/packages/google-analytics-data/tests/unit/gapic/data_v1alpha/test_alpha_analytics_data.py @@ -72,6 +72,13 @@ ) from google.analytics.data_v1alpha.types import analytics_data_api, data +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -343,6 +350,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AlphaAnalyticsDataClient(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 = AlphaAnalyticsDataClient(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", [ @@ -10164,10 +10214,14 @@ def test_run_funnel_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_run_funnel_report" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_run_funnel_report_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_run_funnel_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.RunFunnelReportRequest.pb( analytics_data_api.RunFunnelReportRequest() ) @@ -10193,6 +10247,10 @@ def test_run_funnel_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.RunFunnelReportResponse() + post_with_metadata.return_value = ( + analytics_data_api.RunFunnelReportResponse(), + metadata, + ) client.run_funnel_report( request, @@ -10204,6 +10262,7 @@ def test_run_funnel_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_audience_list_rest_bad_request( @@ -10370,10 +10429,14 @@ def test_create_audience_list_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_create_audience_list" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_create_audience_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_create_audience_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.CreateAudienceListRequest.pb( analytics_data_api.CreateAudienceListRequest() ) @@ -10397,6 +10460,7 @@ def test_create_audience_list_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_audience_list( request, @@ -10408,6 +10472,7 @@ def test_create_audience_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_audience_list_rest_bad_request( @@ -10492,10 +10557,14 @@ def test_query_audience_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_query_audience_list" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_query_audience_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_query_audience_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.QueryAudienceListRequest.pb( analytics_data_api.QueryAudienceListRequest() ) @@ -10521,6 +10590,10 @@ def test_query_audience_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.QueryAudienceListResponse() + post_with_metadata.return_value = ( + analytics_data_api.QueryAudienceListResponse(), + metadata, + ) client.query_audience_list( request, @@ -10532,6 +10605,7 @@ def test_query_audience_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_sheet_export_audience_list_rest_bad_request( @@ -10622,10 +10696,14 @@ def test_sheet_export_audience_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_sheet_export_audience_list" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_sheet_export_audience_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_sheet_export_audience_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.SheetExportAudienceListRequest.pb( analytics_data_api.SheetExportAudienceListRequest() ) @@ -10651,6 +10729,10 @@ def test_sheet_export_audience_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.SheetExportAudienceListResponse() + post_with_metadata.return_value = ( + analytics_data_api.SheetExportAudienceListResponse(), + metadata, + ) client.sheet_export_audience_list( request, @@ -10662,6 +10744,7 @@ def test_sheet_export_audience_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_audience_list_rest_bad_request( @@ -10762,10 +10845,14 @@ def test_get_audience_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_get_audience_list" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_get_audience_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_get_audience_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.GetAudienceListRequest.pb( analytics_data_api.GetAudienceListRequest() ) @@ -10791,6 +10878,7 @@ def test_get_audience_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.AudienceList() + post_with_metadata.return_value = analytics_data_api.AudienceList(), metadata client.get_audience_list( request, @@ -10802,6 +10890,7 @@ def test_get_audience_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_audience_lists_rest_bad_request( @@ -10886,10 +10975,14 @@ def test_list_audience_lists_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_list_audience_lists" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_list_audience_lists_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_list_audience_lists" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.ListAudienceListsRequest.pb( analytics_data_api.ListAudienceListsRequest() ) @@ -10915,6 +11008,10 @@ def test_list_audience_lists_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.ListAudienceListsResponse() + post_with_metadata.return_value = ( + analytics_data_api.ListAudienceListsResponse(), + metadata, + ) client.list_audience_lists( request, @@ -10926,6 +11023,7 @@ def test_list_audience_lists_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_recurring_audience_list_rest_bad_request( @@ -11102,11 +11200,15 @@ def test_create_recurring_audience_list_rest_interceptors(null_interceptor): transports.AlphaAnalyticsDataRestInterceptor, "post_create_recurring_audience_list", ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_create_recurring_audience_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_create_recurring_audience_list", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.CreateRecurringAudienceListRequest.pb( analytics_data_api.CreateRecurringAudienceListRequest() ) @@ -11132,6 +11234,10 @@ def test_create_recurring_audience_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.RecurringAudienceList() + post_with_metadata.return_value = ( + analytics_data_api.RecurringAudienceList(), + metadata, + ) client.create_recurring_audience_list( request, @@ -11143,6 +11249,7 @@ def test_create_recurring_audience_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_recurring_audience_list_rest_bad_request( @@ -11235,10 +11342,14 @@ def test_get_recurring_audience_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_get_recurring_audience_list" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_get_recurring_audience_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_get_recurring_audience_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.GetRecurringAudienceListRequest.pb( analytics_data_api.GetRecurringAudienceListRequest() ) @@ -11264,6 +11375,10 @@ def test_get_recurring_audience_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.RecurringAudienceList() + post_with_metadata.return_value = ( + analytics_data_api.RecurringAudienceList(), + metadata, + ) client.get_recurring_audience_list( request, @@ -11275,6 +11390,7 @@ def test_get_recurring_audience_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_recurring_audience_lists_rest_bad_request( @@ -11362,11 +11478,15 @@ def test_list_recurring_audience_lists_rest_interceptors(null_interceptor): transports.AlphaAnalyticsDataRestInterceptor, "post_list_recurring_audience_lists", ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_list_recurring_audience_lists_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_list_recurring_audience_lists", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.ListRecurringAudienceListsRequest.pb( analytics_data_api.ListRecurringAudienceListsRequest() ) @@ -11392,6 +11512,10 @@ def test_list_recurring_audience_lists_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.ListRecurringAudienceListsResponse() + post_with_metadata.return_value = ( + analytics_data_api.ListRecurringAudienceListsResponse(), + metadata, + ) client.list_recurring_audience_lists( request, @@ -11403,6 +11527,7 @@ def test_list_recurring_audience_lists_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_property_quotas_snapshot_rest_bad_request( @@ -11488,10 +11613,14 @@ def test_get_property_quotas_snapshot_rest_interceptors(null_interceptor): transports.AlphaAnalyticsDataRestInterceptor, "post_get_property_quotas_snapshot", ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_get_property_quotas_snapshot_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_get_property_quotas_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.GetPropertyQuotasSnapshotRequest.pb( analytics_data_api.GetPropertyQuotasSnapshotRequest() ) @@ -11517,6 +11646,10 @@ def test_get_property_quotas_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.PropertyQuotasSnapshot() + post_with_metadata.return_value = ( + analytics_data_api.PropertyQuotasSnapshot(), + metadata, + ) client.get_property_quotas_snapshot( request, @@ -11528,6 +11661,7 @@ def test_get_property_quotas_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_report_task_rest_bad_request( @@ -11776,10 +11910,14 @@ def test_create_report_task_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_create_report_task" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_create_report_task_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_create_report_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.CreateReportTaskRequest.pb( analytics_data_api.CreateReportTaskRequest() ) @@ -11803,6 +11941,7 @@ def test_create_report_task_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_report_task( request, @@ -11814,6 +11953,7 @@ def test_create_report_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_report_task_rest_bad_request( @@ -11898,10 +12038,14 @@ def test_query_report_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_query_report_task" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_query_report_task_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_query_report_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.QueryReportTaskRequest.pb( analytics_data_api.QueryReportTaskRequest() ) @@ -11927,6 +12071,10 @@ def test_query_report_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.QueryReportTaskResponse() + post_with_metadata.return_value = ( + analytics_data_api.QueryReportTaskResponse(), + metadata, + ) client.query_report_task( request, @@ -11938,6 +12086,7 @@ def test_query_report_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_report_task_rest_bad_request( @@ -12022,10 +12171,14 @@ def test_get_report_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_get_report_task" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_get_report_task_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_get_report_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.GetReportTaskRequest.pb( analytics_data_api.GetReportTaskRequest() ) @@ -12051,6 +12204,7 @@ def test_get_report_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.ReportTask() + post_with_metadata.return_value = analytics_data_api.ReportTask(), metadata client.get_report_task( request, @@ -12062,6 +12216,7 @@ def test_get_report_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_report_tasks_rest_bad_request( @@ -12146,10 +12301,14 @@ def test_list_report_tasks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "post_list_report_tasks" ) as post, mock.patch.object( + transports.AlphaAnalyticsDataRestInterceptor, + "post_list_report_tasks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlphaAnalyticsDataRestInterceptor, "pre_list_report_tasks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.ListReportTasksRequest.pb( analytics_data_api.ListReportTasksRequest() ) @@ -12175,6 +12334,10 @@ def test_list_report_tasks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.ListReportTasksResponse() + post_with_metadata.return_value = ( + analytics_data_api.ListReportTasksResponse(), + metadata, + ) client.list_report_tasks( request, @@ -12186,6 +12349,7 @@ def test_list_report_tasks_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-analytics-data/tests/unit/gapic/data_v1beta/test_beta_analytics_data.py b/packages/google-analytics-data/tests/unit/gapic/data_v1beta/test_beta_analytics_data.py index 0f74b9eed126..dc8aa0324895 100644 --- a/packages/google-analytics-data/tests/unit/gapic/data_v1beta/test_beta_analytics_data.py +++ b/packages/google-analytics-data/tests/unit/gapic/data_v1beta/test_beta_analytics_data.py @@ -71,6 +71,13 @@ ) from google.analytics.data_v1beta.types import analytics_data_api, data +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 @@ -338,6 +345,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 = BetaAnalyticsDataClient(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 = BetaAnalyticsDataClient(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", [ @@ -6568,10 +6618,13 @@ def test_run_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_run_report" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, "post_run_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_run_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.RunReportRequest.pb( analytics_data_api.RunReportRequest() ) @@ -6597,6 +6650,10 @@ def test_run_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.RunReportResponse() + post_with_metadata.return_value = ( + analytics_data_api.RunReportResponse(), + metadata, + ) client.run_report( request, @@ -6608,6 +6665,7 @@ def test_run_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_pivot_report_rest_bad_request( @@ -6692,10 +6750,14 @@ def test_run_pivot_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_run_pivot_report" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_run_pivot_report_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_run_pivot_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.RunPivotReportRequest.pb( analytics_data_api.RunPivotReportRequest() ) @@ -6721,6 +6783,10 @@ def test_run_pivot_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.RunPivotReportResponse() + post_with_metadata.return_value = ( + analytics_data_api.RunPivotReportResponse(), + metadata, + ) client.run_pivot_report( request, @@ -6732,6 +6798,7 @@ def test_run_pivot_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_run_reports_rest_bad_request( @@ -6816,10 +6883,14 @@ def test_batch_run_reports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_batch_run_reports" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_batch_run_reports_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_batch_run_reports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.BatchRunReportsRequest.pb( analytics_data_api.BatchRunReportsRequest() ) @@ -6845,6 +6916,10 @@ def test_batch_run_reports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.BatchRunReportsResponse() + post_with_metadata.return_value = ( + analytics_data_api.BatchRunReportsResponse(), + metadata, + ) client.batch_run_reports( request, @@ -6856,6 +6931,7 @@ def test_batch_run_reports_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_run_pivot_reports_rest_bad_request( @@ -6940,10 +7016,14 @@ def test_batch_run_pivot_reports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_batch_run_pivot_reports" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_batch_run_pivot_reports_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_batch_run_pivot_reports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.BatchRunPivotReportsRequest.pb( analytics_data_api.BatchRunPivotReportsRequest() ) @@ -6969,6 +7049,10 @@ def test_batch_run_pivot_reports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.BatchRunPivotReportsResponse() + post_with_metadata.return_value = ( + analytics_data_api.BatchRunPivotReportsResponse(), + metadata, + ) client.batch_run_pivot_reports( request, @@ -6980,6 +7064,7 @@ def test_batch_run_pivot_reports_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_metadata_rest_bad_request( @@ -7064,10 +7149,13 @@ def test_get_metadata_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_get_metadata" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, "post_get_metadata_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_get_metadata" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.GetMetadataRequest.pb( analytics_data_api.GetMetadataRequest() ) @@ -7093,6 +7181,7 @@ def test_get_metadata_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.Metadata() + post_with_metadata.return_value = analytics_data_api.Metadata(), metadata client.get_metadata( request, @@ -7104,6 +7193,7 @@ def test_get_metadata_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_realtime_report_rest_bad_request( @@ -7190,10 +7280,14 @@ def test_run_realtime_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_run_realtime_report" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_run_realtime_report_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_run_realtime_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.RunRealtimeReportRequest.pb( analytics_data_api.RunRealtimeReportRequest() ) @@ -7219,6 +7313,10 @@ def test_run_realtime_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.RunRealtimeReportResponse() + post_with_metadata.return_value = ( + analytics_data_api.RunRealtimeReportResponse(), + metadata, + ) client.run_realtime_report( request, @@ -7230,6 +7328,7 @@ def test_run_realtime_report_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_check_compatibility_rest_bad_request( @@ -7311,10 +7410,14 @@ def test_check_compatibility_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_check_compatibility" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_check_compatibility_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_check_compatibility" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.CheckCompatibilityRequest.pb( analytics_data_api.CheckCompatibilityRequest() ) @@ -7340,6 +7443,10 @@ def test_check_compatibility_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.CheckCompatibilityResponse() + post_with_metadata.return_value = ( + analytics_data_api.CheckCompatibilityResponse(), + metadata, + ) client.check_compatibility( request, @@ -7351,6 +7458,7 @@ def test_check_compatibility_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_audience_export_rest_bad_request( @@ -7512,10 +7620,14 @@ def test_create_audience_export_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_create_audience_export" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_create_audience_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_create_audience_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.CreateAudienceExportRequest.pb( analytics_data_api.CreateAudienceExportRequest() ) @@ -7539,6 +7651,7 @@ def test_create_audience_export_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_audience_export( request, @@ -7550,6 +7663,7 @@ def test_create_audience_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_query_audience_export_rest_bad_request( @@ -7634,10 +7748,14 @@ def test_query_audience_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_query_audience_export" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_query_audience_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_query_audience_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.QueryAudienceExportRequest.pb( analytics_data_api.QueryAudienceExportRequest() ) @@ -7663,6 +7781,10 @@ def test_query_audience_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.QueryAudienceExportResponse() + post_with_metadata.return_value = ( + analytics_data_api.QueryAudienceExportResponse(), + metadata, + ) client.query_audience_export( request, @@ -7674,6 +7796,7 @@ def test_query_audience_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_audience_export_rest_bad_request( @@ -7772,10 +7895,14 @@ def test_get_audience_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_get_audience_export" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_get_audience_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_get_audience_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.GetAudienceExportRequest.pb( analytics_data_api.GetAudienceExportRequest() ) @@ -7801,6 +7928,7 @@ def test_get_audience_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.AudienceExport() + post_with_metadata.return_value = analytics_data_api.AudienceExport(), metadata client.get_audience_export( request, @@ -7812,6 +7940,7 @@ def test_get_audience_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_audience_exports_rest_bad_request( @@ -7896,10 +8025,14 @@ def test_list_audience_exports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "post_list_audience_exports" ) as post, mock.patch.object( + transports.BetaAnalyticsDataRestInterceptor, + "post_list_audience_exports_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BetaAnalyticsDataRestInterceptor, "pre_list_audience_exports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = analytics_data_api.ListAudienceExportsRequest.pb( analytics_data_api.ListAudienceExportsRequest() ) @@ -7925,6 +8058,10 @@ def test_list_audience_exports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = analytics_data_api.ListAudienceExportsResponse() + post_with_metadata.return_value = ( + analytics_data_api.ListAudienceExportsResponse(), + metadata, + ) client.list_audience_exports( request, @@ -7936,6 +8073,7 @@ def test_list_audience_exports_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-apps-card/google/apps/card/gapic_version.py b/packages/google-apps-card/google/apps/card/gapic_version.py index e9c4bb5650f3..558c8aab67c5 100644 --- a/packages/google-apps-card/google/apps/card/gapic_version.py +++ b/packages/google-apps-card/google/apps/card/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.5" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-card/google/apps/card_v1/gapic_version.py b/packages/google-apps-card/google/apps/card_v1/gapic_version.py index e9c4bb5650f3..558c8aab67c5 100644 --- a/packages/google-apps-card/google/apps/card_v1/gapic_version.py +++ b/packages/google-apps-card/google/apps/card_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.5" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-chat/google/apps/chat/gapic_version.py b/packages/google-apps-chat/google/apps/chat/gapic_version.py index 6d8247638d59..558c8aab67c5 100644 --- a/packages/google-apps-chat/google/apps/chat/gapic_version.py +++ b/packages/google-apps-chat/google/apps/chat/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-chat/google/apps/chat_v1/gapic_version.py b/packages/google-apps-chat/google/apps/chat_v1/gapic_version.py index 6d8247638d59..558c8aab67c5 100644 --- a/packages/google-apps-chat/google/apps/chat_v1/gapic_version.py +++ b/packages/google-apps-chat/google/apps/chat_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.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-chat/google/apps/chat_v1/services/chat_service/client.py b/packages/google-apps-chat/google/apps/chat_v1/services/chat_service/client.py index eec3cd89acc0..78f66a8d2cf6 100644 --- a/packages/google-apps-chat/google/apps/chat_v1/services/chat_service/client.py +++ b/packages/google-apps-chat/google/apps/chat_v1/services/chat_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 @@ -677,6 +679,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-apps-chat/google/apps/chat_v1/services/chat_service/transports/rest.py b/packages/google-apps-chat/google/apps/chat_v1/services/chat_service/transports/rest.py index fe861b816728..01235e4d8427 100644 --- a/packages/google-apps-chat/google/apps/chat_v1/services/chat_service/transports/rest.py +++ b/packages/google-apps-chat/google/apps/chat_v1/services/chat_service/transports/rest.py @@ -326,12 +326,37 @@ def post_complete_import_space( ) -> space.CompleteImportSpaceResponse: """Post-rpc interceptor for complete_import_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_complete_import_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_complete_import_space` interceptor runs + before the `post_complete_import_space_with_metadata` interceptor. """ return response + def post_complete_import_space_with_metadata( + self, + response: space.CompleteImportSpaceResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + space.CompleteImportSpaceResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for complete_import_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_complete_import_space_with_metadata` + interceptor in new development instead of the `post_complete_import_space` interceptor. + When both interceptors are used, this `post_complete_import_space_with_metadata` interceptor runs after the + `post_complete_import_space` interceptor. The (possibly modified) response returned by + `post_complete_import_space` will be passed to + `post_complete_import_space_with_metadata`. + """ + return response, metadata + def pre_create_membership( self, request: gc_membership.CreateMembershipRequest, @@ -351,12 +376,35 @@ def post_create_membership( ) -> gc_membership.Membership: """Post-rpc interceptor for create_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_create_membership` interceptor runs + before the `post_create_membership_with_metadata` interceptor. """ return response + def post_create_membership_with_metadata( + self, + response: gc_membership.Membership, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_membership.Membership, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_create_membership_with_metadata` + interceptor in new development instead of the `post_create_membership` interceptor. + When both interceptors are used, this `post_create_membership_with_metadata` interceptor runs after the + `post_create_membership` interceptor. The (possibly modified) response returned by + `post_create_membership` will be passed to + `post_create_membership_with_metadata`. + """ + return response, metadata + def pre_create_message( self, request: gc_message.CreateMessageRequest, @@ -374,12 +422,35 @@ def pre_create_message( def post_create_message(self, response: gc_message.Message) -> gc_message.Message: """Post-rpc interceptor for create_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_create_message` interceptor runs + before the `post_create_message_with_metadata` interceptor. """ return response + def post_create_message_with_metadata( + self, + response: gc_message.Message, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_message.Message, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_create_message_with_metadata` + interceptor in new development instead of the `post_create_message` interceptor. + When both interceptors are used, this `post_create_message_with_metadata` interceptor runs after the + `post_create_message` interceptor. The (possibly modified) response returned by + `post_create_message` will be passed to + `post_create_message_with_metadata`. + """ + return response, metadata + def pre_create_reaction( self, request: gc_reaction.CreateReactionRequest, @@ -399,12 +470,35 @@ def post_create_reaction( ) -> gc_reaction.Reaction: """Post-rpc interceptor for create_reaction - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_reaction_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_create_reaction` interceptor runs + before the `post_create_reaction_with_metadata` interceptor. """ return response + def post_create_reaction_with_metadata( + self, + response: gc_reaction.Reaction, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_reaction.Reaction, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_reaction + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_create_reaction_with_metadata` + interceptor in new development instead of the `post_create_reaction` interceptor. + When both interceptors are used, this `post_create_reaction_with_metadata` interceptor runs after the + `post_create_reaction` interceptor. The (possibly modified) response returned by + `post_create_reaction` will be passed to + `post_create_reaction_with_metadata`. + """ + return response, metadata + def pre_create_space( self, request: gc_space.CreateSpaceRequest, @@ -420,12 +514,35 @@ def pre_create_space( def post_create_space(self, response: gc_space.Space) -> gc_space.Space: """Post-rpc interceptor for create_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_create_space` interceptor runs + before the `post_create_space_with_metadata` interceptor. """ return response + def post_create_space_with_metadata( + self, + response: gc_space.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_space.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_create_space_with_metadata` + interceptor in new development instead of the `post_create_space` interceptor. + When both interceptors are used, this `post_create_space_with_metadata` interceptor runs after the + `post_create_space` interceptor. The (possibly modified) response returned by + `post_create_space` will be passed to + `post_create_space_with_metadata`. + """ + return response, metadata + def pre_delete_membership( self, request: membership.DeleteMembershipRequest, @@ -445,12 +562,35 @@ def post_delete_membership( ) -> membership.Membership: """Post-rpc interceptor for delete_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_delete_membership` interceptor runs + before the `post_delete_membership_with_metadata` interceptor. """ return response + def post_delete_membership_with_metadata( + self, + response: membership.Membership, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[membership.Membership, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_delete_membership_with_metadata` + interceptor in new development instead of the `post_delete_membership` interceptor. + When both interceptors are used, this `post_delete_membership_with_metadata` interceptor runs after the + `post_delete_membership` interceptor. The (possibly modified) response returned by + `post_delete_membership` will be passed to + `post_delete_membership_with_metadata`. + """ + return response, metadata + def pre_delete_message( self, request: message.DeleteMessageRequest, @@ -502,12 +642,33 @@ def pre_find_direct_message( def post_find_direct_message(self, response: space.Space) -> space.Space: """Post-rpc interceptor for find_direct_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_find_direct_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_find_direct_message` interceptor runs + before the `post_find_direct_message_with_metadata` interceptor. """ return response + def post_find_direct_message_with_metadata( + self, response: space.Space, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[space.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for find_direct_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_find_direct_message_with_metadata` + interceptor in new development instead of the `post_find_direct_message` interceptor. + When both interceptors are used, this `post_find_direct_message_with_metadata` interceptor runs after the + `post_find_direct_message` interceptor. The (possibly modified) response returned by + `post_find_direct_message` will be passed to + `post_find_direct_message_with_metadata`. + """ + return response, metadata + def pre_get_attachment( self, request: attachment.GetAttachmentRequest, @@ -527,12 +688,35 @@ def post_get_attachment( ) -> attachment.Attachment: """Post-rpc interceptor for get_attachment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_attachment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_attachment` interceptor runs + before the `post_get_attachment_with_metadata` interceptor. """ return response + def post_get_attachment_with_metadata( + self, + response: attachment.Attachment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[attachment.Attachment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_attachment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_attachment_with_metadata` + interceptor in new development instead of the `post_get_attachment` interceptor. + When both interceptors are used, this `post_get_attachment_with_metadata` interceptor runs after the + `post_get_attachment` interceptor. The (possibly modified) response returned by + `post_get_attachment` will be passed to + `post_get_attachment_with_metadata`. + """ + return response, metadata + def pre_get_membership( self, request: membership.GetMembershipRequest, @@ -552,12 +736,35 @@ def post_get_membership( ) -> membership.Membership: """Post-rpc interceptor for get_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_membership` interceptor runs + before the `post_get_membership_with_metadata` interceptor. """ return response + def post_get_membership_with_metadata( + self, + response: membership.Membership, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[membership.Membership, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_membership_with_metadata` + interceptor in new development instead of the `post_get_membership` interceptor. + When both interceptors are used, this `post_get_membership_with_metadata` interceptor runs after the + `post_get_membership` interceptor. The (possibly modified) response returned by + `post_get_membership` will be passed to + `post_get_membership_with_metadata`. + """ + return response, metadata + def pre_get_message( self, request: message.GetMessageRequest, @@ -573,12 +780,35 @@ def pre_get_message( def post_get_message(self, response: message.Message) -> message.Message: """Post-rpc interceptor for get_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_message` interceptor runs + before the `post_get_message_with_metadata` interceptor. """ return response + def post_get_message_with_metadata( + self, + response: message.Message, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[message.Message, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_message_with_metadata` + interceptor in new development instead of the `post_get_message` interceptor. + When both interceptors are used, this `post_get_message_with_metadata` interceptor runs after the + `post_get_message` interceptor. The (possibly modified) response returned by + `post_get_message` will be passed to + `post_get_message_with_metadata`. + """ + return response, metadata + def pre_get_space( self, request: space.GetSpaceRequest, @@ -594,12 +824,33 @@ def pre_get_space( def post_get_space(self, response: space.Space) -> space.Space: """Post-rpc interceptor for get_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_space` interceptor runs + before the `post_get_space_with_metadata` interceptor. """ return response + def post_get_space_with_metadata( + self, response: space.Space, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[space.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_space_with_metadata` + interceptor in new development instead of the `post_get_space` interceptor. + When both interceptors are used, this `post_get_space_with_metadata` interceptor runs after the + `post_get_space` interceptor. The (possibly modified) response returned by + `post_get_space` will be passed to + `post_get_space_with_metadata`. + """ + return response, metadata + def pre_get_space_event( self, request: space_event.GetSpaceEventRequest, @@ -619,12 +870,35 @@ def post_get_space_event( ) -> space_event.SpaceEvent: """Post-rpc interceptor for get_space_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_space_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_space_event` interceptor runs + before the `post_get_space_event_with_metadata` interceptor. """ return response + def post_get_space_event_with_metadata( + self, + response: space_event.SpaceEvent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[space_event.SpaceEvent, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_space_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_space_event_with_metadata` + interceptor in new development instead of the `post_get_space_event` interceptor. + When both interceptors are used, this `post_get_space_event_with_metadata` interceptor runs after the + `post_get_space_event` interceptor. The (possibly modified) response returned by + `post_get_space_event` will be passed to + `post_get_space_event_with_metadata`. + """ + return response, metadata + def pre_get_space_read_state( self, request: space_read_state.GetSpaceReadStateRequest, @@ -645,12 +919,37 @@ def post_get_space_read_state( ) -> space_read_state.SpaceReadState: """Post-rpc interceptor for get_space_read_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_space_read_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_space_read_state` interceptor runs + before the `post_get_space_read_state_with_metadata` interceptor. """ return response + def post_get_space_read_state_with_metadata( + self, + response: space_read_state.SpaceReadState, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + space_read_state.SpaceReadState, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_space_read_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_space_read_state_with_metadata` + interceptor in new development instead of the `post_get_space_read_state` interceptor. + When both interceptors are used, this `post_get_space_read_state_with_metadata` interceptor runs after the + `post_get_space_read_state` interceptor. The (possibly modified) response returned by + `post_get_space_read_state` will be passed to + `post_get_space_read_state_with_metadata`. + """ + return response, metadata + def pre_get_thread_read_state( self, request: thread_read_state.GetThreadReadStateRequest, @@ -671,12 +970,37 @@ def post_get_thread_read_state( ) -> thread_read_state.ThreadReadState: """Post-rpc interceptor for get_thread_read_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_thread_read_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_get_thread_read_state` interceptor runs + before the `post_get_thread_read_state_with_metadata` interceptor. """ return response + def post_get_thread_read_state_with_metadata( + self, + response: thread_read_state.ThreadReadState, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + thread_read_state.ThreadReadState, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_thread_read_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_get_thread_read_state_with_metadata` + interceptor in new development instead of the `post_get_thread_read_state` interceptor. + When both interceptors are used, this `post_get_thread_read_state_with_metadata` interceptor runs after the + `post_get_thread_read_state` interceptor. The (possibly modified) response returned by + `post_get_thread_read_state` will be passed to + `post_get_thread_read_state_with_metadata`. + """ + return response, metadata + def pre_list_memberships( self, request: membership.ListMembershipsRequest, @@ -696,12 +1020,37 @@ def post_list_memberships( ) -> membership.ListMembershipsResponse: """Post-rpc interceptor for list_memberships - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_memberships_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_list_memberships` interceptor runs + before the `post_list_memberships_with_metadata` interceptor. """ return response + def post_list_memberships_with_metadata( + self, + response: membership.ListMembershipsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + membership.ListMembershipsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_memberships + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_list_memberships_with_metadata` + interceptor in new development instead of the `post_list_memberships` interceptor. + When both interceptors are used, this `post_list_memberships_with_metadata` interceptor runs after the + `post_list_memberships` interceptor. The (possibly modified) response returned by + `post_list_memberships` will be passed to + `post_list_memberships_with_metadata`. + """ + return response, metadata + def pre_list_messages( self, request: message.ListMessagesRequest, @@ -719,12 +1068,35 @@ def post_list_messages( ) -> message.ListMessagesResponse: """Post-rpc interceptor for list_messages - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_messages_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_list_messages` interceptor runs + before the `post_list_messages_with_metadata` interceptor. """ return response + def post_list_messages_with_metadata( + self, + response: message.ListMessagesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[message.ListMessagesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_messages + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_list_messages_with_metadata` + interceptor in new development instead of the `post_list_messages` interceptor. + When both interceptors are used, this `post_list_messages_with_metadata` interceptor runs after the + `post_list_messages` interceptor. The (possibly modified) response returned by + `post_list_messages` will be passed to + `post_list_messages_with_metadata`. + """ + return response, metadata + def pre_list_reactions( self, request: reaction.ListReactionsRequest, @@ -742,12 +1114,35 @@ def post_list_reactions( ) -> reaction.ListReactionsResponse: """Post-rpc interceptor for list_reactions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_reactions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_list_reactions` interceptor runs + before the `post_list_reactions_with_metadata` interceptor. """ return response + def post_list_reactions_with_metadata( + self, + response: reaction.ListReactionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reaction.ListReactionsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_reactions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_list_reactions_with_metadata` + interceptor in new development instead of the `post_list_reactions` interceptor. + When both interceptors are used, this `post_list_reactions_with_metadata` interceptor runs after the + `post_list_reactions` interceptor. The (possibly modified) response returned by + `post_list_reactions` will be passed to + `post_list_reactions_with_metadata`. + """ + return response, metadata + def pre_list_space_events( self, request: space_event.ListSpaceEventsRequest, @@ -767,12 +1162,37 @@ def post_list_space_events( ) -> space_event.ListSpaceEventsResponse: """Post-rpc interceptor for list_space_events - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_space_events_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_list_space_events` interceptor runs + before the `post_list_space_events_with_metadata` interceptor. """ return response + def post_list_space_events_with_metadata( + self, + response: space_event.ListSpaceEventsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + space_event.ListSpaceEventsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_space_events + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_list_space_events_with_metadata` + interceptor in new development instead of the `post_list_space_events` interceptor. + When both interceptors are used, this `post_list_space_events_with_metadata` interceptor runs after the + `post_list_space_events` interceptor. The (possibly modified) response returned by + `post_list_space_events` will be passed to + `post_list_space_events_with_metadata`. + """ + return response, metadata + def pre_list_spaces( self, request: space.ListSpacesRequest, @@ -790,12 +1210,35 @@ def post_list_spaces( ) -> space.ListSpacesResponse: """Post-rpc interceptor for list_spaces - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_spaces_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_list_spaces` interceptor runs + before the `post_list_spaces_with_metadata` interceptor. """ return response + def post_list_spaces_with_metadata( + self, + response: space.ListSpacesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[space.ListSpacesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_spaces + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_list_spaces_with_metadata` + interceptor in new development instead of the `post_list_spaces` interceptor. + When both interceptors are used, this `post_list_spaces_with_metadata` interceptor runs after the + `post_list_spaces` interceptor. The (possibly modified) response returned by + `post_list_spaces` will be passed to + `post_list_spaces_with_metadata`. + """ + return response, metadata + def pre_search_spaces( self, request: space.SearchSpacesRequest, @@ -813,12 +1256,35 @@ def post_search_spaces( ) -> space.SearchSpacesResponse: """Post-rpc interceptor for search_spaces - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_spaces_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_search_spaces` interceptor runs + before the `post_search_spaces_with_metadata` interceptor. """ return response + def post_search_spaces_with_metadata( + self, + response: space.SearchSpacesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[space.SearchSpacesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for search_spaces + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_search_spaces_with_metadata` + interceptor in new development instead of the `post_search_spaces` interceptor. + When both interceptors are used, this `post_search_spaces_with_metadata` interceptor runs after the + `post_search_spaces` interceptor. The (possibly modified) response returned by + `post_search_spaces` will be passed to + `post_search_spaces_with_metadata`. + """ + return response, metadata + def pre_set_up_space( self, request: space_setup.SetUpSpaceRequest, @@ -834,12 +1300,33 @@ def pre_set_up_space( def post_set_up_space(self, response: space.Space) -> space.Space: """Post-rpc interceptor for set_up_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_up_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_set_up_space` interceptor runs + before the `post_set_up_space_with_metadata` interceptor. """ return response + def post_set_up_space_with_metadata( + self, response: space.Space, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[space.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_up_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_set_up_space_with_metadata` + interceptor in new development instead of the `post_set_up_space` interceptor. + When both interceptors are used, this `post_set_up_space_with_metadata` interceptor runs after the + `post_set_up_space` interceptor. The (possibly modified) response returned by + `post_set_up_space` will be passed to + `post_set_up_space_with_metadata`. + """ + return response, metadata + def pre_update_membership( self, request: gc_membership.UpdateMembershipRequest, @@ -859,12 +1346,35 @@ def post_update_membership( ) -> gc_membership.Membership: """Post-rpc interceptor for update_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_update_membership` interceptor runs + before the `post_update_membership_with_metadata` interceptor. """ return response + def post_update_membership_with_metadata( + self, + response: gc_membership.Membership, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_membership.Membership, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_update_membership_with_metadata` + interceptor in new development instead of the `post_update_membership` interceptor. + When both interceptors are used, this `post_update_membership_with_metadata` interceptor runs after the + `post_update_membership` interceptor. The (possibly modified) response returned by + `post_update_membership` will be passed to + `post_update_membership_with_metadata`. + """ + return response, metadata + def pre_update_message( self, request: gc_message.UpdateMessageRequest, @@ -882,12 +1392,35 @@ def pre_update_message( def post_update_message(self, response: gc_message.Message) -> gc_message.Message: """Post-rpc interceptor for update_message - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_message_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_update_message` interceptor runs + before the `post_update_message_with_metadata` interceptor. """ return response + def post_update_message_with_metadata( + self, + response: gc_message.Message, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_message.Message, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_message + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_update_message_with_metadata` + interceptor in new development instead of the `post_update_message` interceptor. + When both interceptors are used, this `post_update_message_with_metadata` interceptor runs after the + `post_update_message` interceptor. The (possibly modified) response returned by + `post_update_message` will be passed to + `post_update_message_with_metadata`. + """ + return response, metadata + def pre_update_space( self, request: gc_space.UpdateSpaceRequest, @@ -903,12 +1436,35 @@ def pre_update_space( def post_update_space(self, response: gc_space.Space) -> gc_space.Space: """Post-rpc interceptor for update_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_update_space` interceptor runs + before the `post_update_space_with_metadata` interceptor. """ return response + def post_update_space_with_metadata( + self, + response: gc_space.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gc_space.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_update_space_with_metadata` + interceptor in new development instead of the `post_update_space` interceptor. + When both interceptors are used, this `post_update_space_with_metadata` interceptor runs after the + `post_update_space` interceptor. The (possibly modified) response returned by + `post_update_space` will be passed to + `post_update_space_with_metadata`. + """ + return response, metadata + def pre_update_space_read_state( self, request: gc_space_read_state.UpdateSpaceReadStateRequest, @@ -929,12 +1485,37 @@ def post_update_space_read_state( ) -> gc_space_read_state.SpaceReadState: """Post-rpc interceptor for update_space_read_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_space_read_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_update_space_read_state` interceptor runs + before the `post_update_space_read_state_with_metadata` interceptor. """ return response + def post_update_space_read_state_with_metadata( + self, + response: gc_space_read_state.SpaceReadState, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gc_space_read_state.SpaceReadState, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_space_read_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_update_space_read_state_with_metadata` + interceptor in new development instead of the `post_update_space_read_state` interceptor. + When both interceptors are used, this `post_update_space_read_state_with_metadata` interceptor runs after the + `post_update_space_read_state` interceptor. The (possibly modified) response returned by + `post_update_space_read_state` will be passed to + `post_update_space_read_state_with_metadata`. + """ + return response, metadata + def pre_upload_attachment( self, request: attachment.UploadAttachmentRequest, @@ -954,12 +1535,37 @@ def post_upload_attachment( ) -> attachment.UploadAttachmentResponse: """Post-rpc interceptor for upload_attachment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_upload_attachment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ChatService server but before - it is returned to user code. + it is returned to user code. This `post_upload_attachment` interceptor runs + before the `post_upload_attachment_with_metadata` interceptor. """ return response + def post_upload_attachment_with_metadata( + self, + response: attachment.UploadAttachmentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attachment.UploadAttachmentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for upload_attachment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ChatService server but before it is returned to user code. + + We recommend only using this `post_upload_attachment_with_metadata` + interceptor in new development instead of the `post_upload_attachment` interceptor. + When both interceptors are used, this `post_upload_attachment_with_metadata` interceptor runs after the + `post_upload_attachment` interceptor. The (possibly modified) response returned by + `post_upload_attachment` will be passed to + `post_upload_attachment_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ChatServiceRestStub: @@ -1176,6 +1782,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_complete_import_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_complete_import_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1331,6 +1941,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1481,6 +2095,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1627,6 +2245,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_reaction(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_reaction_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1784,6 +2406,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1931,6 +2557,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2402,6 +3032,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_find_direct_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_find_direct_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2544,6 +3178,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_attachment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_attachment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2691,6 +3329,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2835,6 +3477,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2981,6 +3627,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3128,6 +3778,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_space_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_space_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3274,6 +3928,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_space_read_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_space_read_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3420,6 +4078,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_thread_read_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_thread_read_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3567,6 +4229,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_memberships(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_memberships_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3716,6 +4382,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_messages(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_messages_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3858,6 +4528,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_reactions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_reactions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4003,6 +4677,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_space_events(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_space_events_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4152,6 +4830,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_spaces(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_spaces_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4300,6 +4982,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_spaces(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_spaces_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4455,6 +5141,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_up_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_up_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4608,6 +5298,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4758,6 +5452,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_message(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_message_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4914,6 +5612,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5066,6 +5768,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_space_read_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_space_read_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5216,6 +5922,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_upload_attachment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_upload_attachment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-apps-chat/samples/generated_samples/snippet_metadata_google.chat.v1.json b/packages/google-apps-chat/samples/generated_samples/snippet_metadata_google.chat.v1.json index bd51d146199b..55a30ce1c225 100644 --- a/packages/google-apps-chat/samples/generated_samples/snippet_metadata_google.chat.v1.json +++ b/packages/google-apps-chat/samples/generated_samples/snippet_metadata_google.chat.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-apps-chat", - "version": "0.2.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-apps-chat/tests/unit/gapic/chat_v1/test_chat_service.py b/packages/google-apps-chat/tests/unit/gapic/chat_v1/test_chat_service.py index f14e142c3970..8583adbfaaae 100644 --- a/packages/google-apps-chat/tests/unit/gapic/chat_v1/test_chat_service.py +++ b/packages/google-apps-chat/tests/unit/gapic/chat_v1/test_chat_service.py @@ -89,6 +89,13 @@ from google.apps.chat_v1.types import space_read_state from google.apps.chat_v1.types import space_read_state as gc_space_read_state +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -328,6 +335,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ChatServiceClient(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 = ChatServiceClient(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", [ @@ -18907,10 +18957,13 @@ def test_create_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_create_message" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_create_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_create_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_message.CreateMessageRequest.pb( gc_message.CreateMessageRequest() ) @@ -18934,6 +18987,7 @@ def test_create_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_message.Message() + post_with_metadata.return_value = gc_message.Message(), metadata client.create_message( request, @@ -18945,6 +18999,7 @@ def test_create_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_messages_rest_bad_request(request_type=message.ListMessagesRequest): @@ -19027,10 +19082,13 @@ def test_list_messages_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_list_messages" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_list_messages_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_list_messages" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = message.ListMessagesRequest.pb(message.ListMessagesRequest()) transcode.return_value = { "method": "post", @@ -19054,6 +19112,7 @@ def test_list_messages_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = message.ListMessagesResponse() + post_with_metadata.return_value = message.ListMessagesResponse(), metadata client.list_messages( request, @@ -19065,6 +19124,7 @@ def test_list_messages_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_memberships_rest_bad_request( @@ -19149,10 +19209,13 @@ def test_list_memberships_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_list_memberships" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_list_memberships_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_list_memberships" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.ListMembershipsRequest.pb( membership.ListMembershipsRequest() ) @@ -19178,6 +19241,7 @@ def test_list_memberships_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.ListMembershipsResponse() + post_with_metadata.return_value = membership.ListMembershipsResponse(), metadata client.list_memberships( request, @@ -19189,6 +19253,7 @@ def test_list_memberships_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_membership_rest_bad_request(request_type=membership.GetMembershipRequest): @@ -19275,10 +19340,13 @@ def test_get_membership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_membership" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_get_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.GetMembershipRequest.pb( membership.GetMembershipRequest() ) @@ -19302,6 +19370,7 @@ def test_get_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.Membership() + post_with_metadata.return_value = membership.Membership(), metadata client.get_membership( request, @@ -19313,6 +19382,7 @@ def test_get_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_message_rest_bad_request(request_type=message.GetMessageRequest): @@ -19407,10 +19477,13 @@ def test_get_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_message" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_get_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = message.GetMessageRequest.pb(message.GetMessageRequest()) transcode.return_value = { "method": "post", @@ -19432,6 +19505,7 @@ def test_get_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = message.Message() + post_with_metadata.return_value = message.Message(), metadata client.get_message( request, @@ -19443,6 +19517,7 @@ def test_get_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_message_rest_bad_request(request_type=gc_message.UpdateMessageRequest): @@ -19987,10 +20062,13 @@ def test_update_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_update_message" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_update_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_update_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_message.UpdateMessageRequest.pb( gc_message.UpdateMessageRequest() ) @@ -20014,6 +20092,7 @@ def test_update_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_message.Message() + post_with_metadata.return_value = gc_message.Message(), metadata client.update_message( request, @@ -20025,6 +20104,7 @@ def test_update_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_message_rest_bad_request(request_type=message.DeleteMessageRequest): @@ -20222,10 +20302,13 @@ def test_get_attachment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_attachment" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_get_attachment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_attachment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attachment.GetAttachmentRequest.pb( attachment.GetAttachmentRequest() ) @@ -20249,6 +20332,7 @@ def test_get_attachment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = attachment.Attachment() + post_with_metadata.return_value = attachment.Attachment(), metadata client.get_attachment( request, @@ -20260,6 +20344,7 @@ def test_get_attachment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_upload_attachment_rest_bad_request( @@ -20341,10 +20426,13 @@ def test_upload_attachment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_upload_attachment" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_upload_attachment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_upload_attachment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attachment.UploadAttachmentRequest.pb( attachment.UploadAttachmentRequest() ) @@ -20370,6 +20458,10 @@ def test_upload_attachment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = attachment.UploadAttachmentResponse() + post_with_metadata.return_value = ( + attachment.UploadAttachmentResponse(), + metadata, + ) client.upload_attachment( request, @@ -20381,6 +20473,7 @@ def test_upload_attachment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_spaces_rest_bad_request(request_type=space.ListSpacesRequest): @@ -20463,10 +20556,13 @@ def test_list_spaces_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_list_spaces" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_list_spaces_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_list_spaces" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space.ListSpacesRequest.pb(space.ListSpacesRequest()) transcode.return_value = { "method": "post", @@ -20488,6 +20584,7 @@ def test_list_spaces_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space.ListSpacesResponse() + post_with_metadata.return_value = space.ListSpacesResponse(), metadata client.list_spaces( request, @@ -20499,6 +20596,7 @@ def test_list_spaces_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_spaces_rest_bad_request(request_type=space.SearchSpacesRequest): @@ -20583,10 +20681,13 @@ def test_search_spaces_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_search_spaces" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_search_spaces_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_search_spaces" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space.SearchSpacesRequest.pb(space.SearchSpacesRequest()) transcode.return_value = { "method": "post", @@ -20608,6 +20709,7 @@ def test_search_spaces_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space.SearchSpacesResponse() + post_with_metadata.return_value = space.SearchSpacesResponse(), metadata client.search_spaces( request, @@ -20619,6 +20721,7 @@ def test_search_spaces_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_space_rest_bad_request(request_type=space.GetSpaceRequest): @@ -20727,10 +20830,13 @@ def test_get_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_space" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_get_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space.GetSpaceRequest.pb(space.GetSpaceRequest()) transcode.return_value = { "method": "post", @@ -20752,6 +20858,7 @@ def test_get_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space.Space() + post_with_metadata.return_value = space.Space(), metadata client.get_space( request, @@ -20763,6 +20870,7 @@ def test_get_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_space_rest_bad_request(request_type=gc_space.CreateSpaceRequest): @@ -20978,10 +21086,13 @@ def test_create_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_create_space" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_create_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_create_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_space.CreateSpaceRequest.pb(gc_space.CreateSpaceRequest()) transcode.return_value = { "method": "post", @@ -21003,6 +21114,7 @@ def test_create_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_space.Space() + post_with_metadata.return_value = gc_space.Space(), metadata client.create_space( request, @@ -21014,6 +21126,7 @@ def test_create_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_up_space_rest_bad_request(request_type=space_setup.SetUpSpaceRequest): @@ -21122,10 +21235,13 @@ def test_set_up_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_set_up_space" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_set_up_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_set_up_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space_setup.SetUpSpaceRequest.pb(space_setup.SetUpSpaceRequest()) transcode.return_value = { "method": "post", @@ -21147,6 +21263,7 @@ def test_set_up_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space.Space() + post_with_metadata.return_value = space.Space(), metadata client.set_up_space( request, @@ -21158,6 +21275,7 @@ def test_set_up_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_space_rest_bad_request(request_type=gc_space.UpdateSpaceRequest): @@ -21373,10 +21491,13 @@ def test_update_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_update_space" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_update_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_update_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_space.UpdateSpaceRequest.pb(gc_space.UpdateSpaceRequest()) transcode.return_value = { "method": "post", @@ -21398,6 +21519,7 @@ def test_update_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_space.Space() + post_with_metadata.return_value = gc_space.Space(), metadata client.update_space( request, @@ -21409,6 +21531,7 @@ def test_update_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_space_rest_bad_request(request_type=space.DeleteSpaceRequest): @@ -21595,10 +21718,14 @@ def test_complete_import_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_complete_import_space" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, + "post_complete_import_space_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_complete_import_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space.CompleteImportSpaceRequest.pb( space.CompleteImportSpaceRequest() ) @@ -21624,6 +21751,7 @@ def test_complete_import_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space.CompleteImportSpaceResponse() + post_with_metadata.return_value = space.CompleteImportSpaceResponse(), metadata client.complete_import_space( request, @@ -21635,6 +21763,7 @@ def test_complete_import_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_find_direct_message_rest_bad_request( @@ -21745,10 +21874,13 @@ def test_find_direct_message_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_find_direct_message" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_find_direct_message_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_find_direct_message" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space.FindDirectMessageRequest.pb(space.FindDirectMessageRequest()) transcode.return_value = { "method": "post", @@ -21770,6 +21902,7 @@ def test_find_direct_message_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space.Space() + post_with_metadata.return_value = space.Space(), metadata client.find_direct_message( request, @@ -21781,6 +21914,7 @@ def test_find_direct_message_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_membership_rest_bad_request( @@ -21951,10 +22085,13 @@ def test_create_membership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_create_membership" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_create_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_create_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_membership.CreateMembershipRequest.pb( gc_membership.CreateMembershipRequest() ) @@ -21978,6 +22115,7 @@ def test_create_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_membership.Membership() + post_with_metadata.return_value = gc_membership.Membership(), metadata client.create_membership( request, @@ -21989,6 +22127,7 @@ def test_create_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_membership_rest_bad_request( @@ -22159,10 +22298,13 @@ def test_update_membership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_update_membership" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_update_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_update_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_membership.UpdateMembershipRequest.pb( gc_membership.UpdateMembershipRequest() ) @@ -22186,6 +22328,7 @@ def test_update_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_membership.Membership() + post_with_metadata.return_value = gc_membership.Membership(), metadata client.update_membership( request, @@ -22197,6 +22340,7 @@ def test_update_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_membership_rest_bad_request( @@ -22285,10 +22429,13 @@ def test_delete_membership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_delete_membership" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_delete_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_delete_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.DeleteMembershipRequest.pb( membership.DeleteMembershipRequest() ) @@ -22312,6 +22459,7 @@ def test_delete_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.Membership() + post_with_metadata.return_value = membership.Membership(), metadata client.delete_membership( request, @@ -22323,6 +22471,7 @@ def test_delete_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_reaction_rest_bad_request( @@ -22485,10 +22634,13 @@ def test_create_reaction_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_create_reaction" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_create_reaction_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_create_reaction" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_reaction.CreateReactionRequest.pb( gc_reaction.CreateReactionRequest() ) @@ -22512,6 +22664,7 @@ def test_create_reaction_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_reaction.Reaction() + post_with_metadata.return_value = gc_reaction.Reaction(), metadata client.create_reaction( request, @@ -22523,6 +22676,7 @@ def test_create_reaction_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_reactions_rest_bad_request(request_type=reaction.ListReactionsRequest): @@ -22605,10 +22759,13 @@ def test_list_reactions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_list_reactions" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_list_reactions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_list_reactions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reaction.ListReactionsRequest.pb(reaction.ListReactionsRequest()) transcode.return_value = { "method": "post", @@ -22632,6 +22789,7 @@ def test_list_reactions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reaction.ListReactionsResponse() + post_with_metadata.return_value = reaction.ListReactionsResponse(), metadata client.list_reactions( request, @@ -22643,6 +22801,7 @@ def test_list_reactions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_reaction_rest_bad_request(request_type=reaction.DeleteReactionRequest): @@ -22832,10 +22991,13 @@ def test_get_space_read_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_space_read_state" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_get_space_read_state_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_space_read_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space_read_state.GetSpaceReadStateRequest.pb( space_read_state.GetSpaceReadStateRequest() ) @@ -22861,6 +23023,7 @@ def test_get_space_read_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space_read_state.SpaceReadState() + post_with_metadata.return_value = space_read_state.SpaceReadState(), metadata client.get_space_read_state( request, @@ -22872,6 +23035,7 @@ def test_get_space_read_state_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_space_read_state_rest_bad_request( @@ -23033,10 +23197,14 @@ def test_update_space_read_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_update_space_read_state" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, + "post_update_space_read_state_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_update_space_read_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gc_space_read_state.UpdateSpaceReadStateRequest.pb( gc_space_read_state.UpdateSpaceReadStateRequest() ) @@ -23062,6 +23230,7 @@ def test_update_space_read_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gc_space_read_state.SpaceReadState() + post_with_metadata.return_value = gc_space_read_state.SpaceReadState(), metadata client.update_space_read_state( request, @@ -23073,6 +23242,7 @@ def test_update_space_read_state_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_thread_read_state_rest_bad_request( @@ -23161,10 +23331,14 @@ def test_get_thread_read_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_thread_read_state" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, + "post_get_thread_read_state_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_thread_read_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = thread_read_state.GetThreadReadStateRequest.pb( thread_read_state.GetThreadReadStateRequest() ) @@ -23190,6 +23364,7 @@ def test_get_thread_read_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = thread_read_state.ThreadReadState() + post_with_metadata.return_value = thread_read_state.ThreadReadState(), metadata client.get_thread_read_state( request, @@ -23201,6 +23376,7 @@ def test_get_thread_read_state_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_space_event_rest_bad_request( @@ -23287,10 +23463,13 @@ def test_get_space_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_get_space_event" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_get_space_event_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_get_space_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space_event.GetSpaceEventRequest.pb( space_event.GetSpaceEventRequest() ) @@ -23314,6 +23493,7 @@ def test_get_space_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space_event.SpaceEvent() + post_with_metadata.return_value = space_event.SpaceEvent(), metadata client.get_space_event( request, @@ -23325,6 +23505,7 @@ def test_get_space_event_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_space_events_rest_bad_request( @@ -23409,10 +23590,13 @@ def test_list_space_events_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ChatServiceRestInterceptor, "post_list_space_events" ) as post, mock.patch.object( + transports.ChatServiceRestInterceptor, "post_list_space_events_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ChatServiceRestInterceptor, "pre_list_space_events" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = space_event.ListSpaceEventsRequest.pb( space_event.ListSpaceEventsRequest() ) @@ -23438,6 +23622,10 @@ def test_list_space_events_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = space_event.ListSpaceEventsResponse() + post_with_metadata.return_value = ( + space_event.ListSpaceEventsResponse(), + metadata, + ) client.list_space_events( request, @@ -23449,6 +23637,7 @@ def test_list_space_events_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-apps-events-subscriptions/google/apps/events_subscriptions/gapic_version.py b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions/gapic_version.py index e9c4bb5650f3..558c8aab67c5 100644 --- a/packages/google-apps-events-subscriptions/google/apps/events_subscriptions/gapic_version.py +++ b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.5" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/gapic_version.py b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/gapic_version.py index e9c4bb5650f3..558c8aab67c5 100644 --- a/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/gapic_version.py +++ b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_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.5" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/client.py b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/client.py index 578243a08b4a..1e5f218568f4 100644 --- a/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/client.py +++ b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_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 @@ -522,6 +524,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. @@ -1576,16 +1605,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-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/transports/rest.py b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/transports/rest.py index 4bf33555dab4..58cdb80af37c 100644 --- a/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/transports/rest.py +++ b/packages/google-apps-events-subscriptions/google/apps/events_subscriptions_v1/services/subscriptions_service/transports/rest.py @@ -146,12 +146,35 @@ def post_create_subscription( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_subscription - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_subscription_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SubscriptionsService server but before - it is returned to user code. + it is returned to user code. This `post_create_subscription` interceptor runs + before the `post_create_subscription_with_metadata` interceptor. """ return response + def post_create_subscription_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_subscription + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SubscriptionsService server but before it is returned to user code. + + We recommend only using this `post_create_subscription_with_metadata` + interceptor in new development instead of the `post_create_subscription` interceptor. + When both interceptors are used, this `post_create_subscription_with_metadata` interceptor runs after the + `post_create_subscription` interceptor. The (possibly modified) response returned by + `post_create_subscription` will be passed to + `post_create_subscription_with_metadata`. + """ + return response, metadata + def pre_delete_subscription( self, request: subscriptions_service.DeleteSubscriptionRequest, @@ -172,12 +195,35 @@ def post_delete_subscription( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_subscription - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_subscription_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SubscriptionsService server but before - it is returned to user code. + it is returned to user code. This `post_delete_subscription` interceptor runs + before the `post_delete_subscription_with_metadata` interceptor. """ return response + def post_delete_subscription_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_subscription + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SubscriptionsService server but before it is returned to user code. + + We recommend only using this `post_delete_subscription_with_metadata` + interceptor in new development instead of the `post_delete_subscription` interceptor. + When both interceptors are used, this `post_delete_subscription_with_metadata` interceptor runs after the + `post_delete_subscription` interceptor. The (possibly modified) response returned by + `post_delete_subscription` will be passed to + `post_delete_subscription_with_metadata`. + """ + return response, metadata + def pre_get_subscription( self, request: subscriptions_service.GetSubscriptionRequest, @@ -198,12 +244,37 @@ def post_get_subscription( ) -> subscription_resource.Subscription: """Post-rpc interceptor for get_subscription - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_subscription_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SubscriptionsService server but before - it is returned to user code. + it is returned to user code. This `post_get_subscription` interceptor runs + before the `post_get_subscription_with_metadata` interceptor. """ return response + def post_get_subscription_with_metadata( + self, + response: subscription_resource.Subscription, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + subscription_resource.Subscription, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_subscription + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SubscriptionsService server but before it is returned to user code. + + We recommend only using this `post_get_subscription_with_metadata` + interceptor in new development instead of the `post_get_subscription` interceptor. + When both interceptors are used, this `post_get_subscription_with_metadata` interceptor runs after the + `post_get_subscription` interceptor. The (possibly modified) response returned by + `post_get_subscription` will be passed to + `post_get_subscription_with_metadata`. + """ + return response, metadata + def pre_list_subscriptions( self, request: subscriptions_service.ListSubscriptionsRequest, @@ -224,12 +295,38 @@ def post_list_subscriptions( ) -> subscriptions_service.ListSubscriptionsResponse: """Post-rpc interceptor for list_subscriptions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_subscriptions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SubscriptionsService server but before - it is returned to user code. + it is returned to user code. This `post_list_subscriptions` interceptor runs + before the `post_list_subscriptions_with_metadata` interceptor. """ return response + def post_list_subscriptions_with_metadata( + self, + response: subscriptions_service.ListSubscriptionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + subscriptions_service.ListSubscriptionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_subscriptions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SubscriptionsService server but before it is returned to user code. + + We recommend only using this `post_list_subscriptions_with_metadata` + interceptor in new development instead of the `post_list_subscriptions` interceptor. + When both interceptors are used, this `post_list_subscriptions_with_metadata` interceptor runs after the + `post_list_subscriptions` interceptor. The (possibly modified) response returned by + `post_list_subscriptions` will be passed to + `post_list_subscriptions_with_metadata`. + """ + return response, metadata + def pre_reactivate_subscription( self, request: subscriptions_service.ReactivateSubscriptionRequest, @@ -250,12 +347,35 @@ def post_reactivate_subscription( ) -> operations_pb2.Operation: """Post-rpc interceptor for reactivate_subscription - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_reactivate_subscription_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SubscriptionsService server but before - it is returned to user code. + it is returned to user code. This `post_reactivate_subscription` interceptor runs + before the `post_reactivate_subscription_with_metadata` interceptor. """ return response + def post_reactivate_subscription_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 reactivate_subscription + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SubscriptionsService server but before it is returned to user code. + + We recommend only using this `post_reactivate_subscription_with_metadata` + interceptor in new development instead of the `post_reactivate_subscription` interceptor. + When both interceptors are used, this `post_reactivate_subscription_with_metadata` interceptor runs after the + `post_reactivate_subscription` interceptor. The (possibly modified) response returned by + `post_reactivate_subscription` will be passed to + `post_reactivate_subscription_with_metadata`. + """ + return response, metadata + def pre_update_subscription( self, request: subscriptions_service.UpdateSubscriptionRequest, @@ -276,12 +396,35 @@ def post_update_subscription( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_subscription - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_subscription_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SubscriptionsService server but before - it is returned to user code. + it is returned to user code. This `post_update_subscription` interceptor runs + before the `post_update_subscription_with_metadata` interceptor. """ return response + def post_update_subscription_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_subscription + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SubscriptionsService server but before it is returned to user code. + + We recommend only using this `post_update_subscription_with_metadata` + interceptor in new development instead of the `post_update_subscription` interceptor. + When both interceptors are used, this `post_update_subscription_with_metadata` interceptor runs after the + `post_update_subscription` interceptor. The (possibly modified) response returned by + `post_update_subscription` will be passed to + `post_update_subscription_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -560,6 +703,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_subscription(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_subscription_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -707,6 +854,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_subscription(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_subscription_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -855,6 +1006,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_subscription(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_subscription_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1005,6 +1160,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_subscriptions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_subscriptions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1162,6 +1321,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_reactivate_subscription(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_reactivate_subscription_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1315,6 +1478,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_subscription(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_subscription_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-apps-events-subscriptions/samples/generated_samples/snippet_metadata_google.apps.events.subscriptions.v1.json b/packages/google-apps-events-subscriptions/samples/generated_samples/snippet_metadata_google.apps.events.subscriptions.v1.json index 521aa116d51f..b893a1c0de8c 100644 --- a/packages/google-apps-events-subscriptions/samples/generated_samples/snippet_metadata_google.apps.events.subscriptions.v1.json +++ b/packages/google-apps-events-subscriptions/samples/generated_samples/snippet_metadata_google.apps.events.subscriptions.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-apps-events-subscriptions", - "version": "0.1.5" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-apps-events-subscriptions/tests/unit/gapic/events_subscriptions_v1/test_subscriptions_service.py b/packages/google-apps-events-subscriptions/tests/unit/gapic/events_subscriptions_v1/test_subscriptions_service.py index 639f5130b6ec..207f575b3738 100644 --- a/packages/google-apps-events-subscriptions/tests/unit/gapic/events_subscriptions_v1/test_subscriptions_service.py +++ b/packages/google-apps-events-subscriptions/tests/unit/gapic/events_subscriptions_v1/test_subscriptions_service.py @@ -77,6 +77,13 @@ subscriptions_service, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -350,6 +357,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SubscriptionsServiceClient(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 = SubscriptionsServiceClient(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", [ @@ -5145,10 +5195,14 @@ def test_create_subscription_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "post_create_subscription" ) as post, mock.patch.object( + transports.SubscriptionsServiceRestInterceptor, + "post_create_subscription_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "pre_create_subscription" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = subscriptions_service.CreateSubscriptionRequest.pb( subscriptions_service.CreateSubscriptionRequest() ) @@ -5172,6 +5226,7 @@ def test_create_subscription_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_subscription( request, @@ -5183,6 +5238,7 @@ def test_create_subscription_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_subscription_rest_bad_request( @@ -5263,10 +5319,14 @@ def test_delete_subscription_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "post_delete_subscription" ) as post, mock.patch.object( + transports.SubscriptionsServiceRestInterceptor, + "post_delete_subscription_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "pre_delete_subscription" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = subscriptions_service.DeleteSubscriptionRequest.pb( subscriptions_service.DeleteSubscriptionRequest() ) @@ -5290,6 +5350,7 @@ def test_delete_subscription_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_subscription( request, @@ -5301,6 +5362,7 @@ def test_delete_subscription_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_subscription_rest_bad_request( @@ -5404,10 +5466,14 @@ def test_get_subscription_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "post_get_subscription" ) as post, mock.patch.object( + transports.SubscriptionsServiceRestInterceptor, + "post_get_subscription_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "pre_get_subscription" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = subscriptions_service.GetSubscriptionRequest.pb( subscriptions_service.GetSubscriptionRequest() ) @@ -5433,6 +5499,7 @@ def test_get_subscription_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = subscription_resource.Subscription() + post_with_metadata.return_value = subscription_resource.Subscription(), metadata client.get_subscription( request, @@ -5444,6 +5511,7 @@ def test_get_subscription_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_subscriptions_rest_bad_request( @@ -5528,10 +5596,14 @@ def test_list_subscriptions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "post_list_subscriptions" ) as post, mock.patch.object( + transports.SubscriptionsServiceRestInterceptor, + "post_list_subscriptions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "pre_list_subscriptions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = subscriptions_service.ListSubscriptionsRequest.pb( subscriptions_service.ListSubscriptionsRequest() ) @@ -5557,6 +5629,10 @@ def test_list_subscriptions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = subscriptions_service.ListSubscriptionsResponse() + post_with_metadata.return_value = ( + subscriptions_service.ListSubscriptionsResponse(), + metadata, + ) client.list_subscriptions( request, @@ -5568,6 +5644,7 @@ def test_list_subscriptions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_subscription_rest_bad_request( @@ -5737,10 +5814,14 @@ def test_update_subscription_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "post_update_subscription" ) as post, mock.patch.object( + transports.SubscriptionsServiceRestInterceptor, + "post_update_subscription_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "pre_update_subscription" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = subscriptions_service.UpdateSubscriptionRequest.pb( subscriptions_service.UpdateSubscriptionRequest() ) @@ -5764,6 +5845,7 @@ def test_update_subscription_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_subscription( request, @@ -5775,6 +5857,7 @@ def test_update_subscription_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_reactivate_subscription_rest_bad_request( @@ -5855,10 +5938,14 @@ def test_reactivate_subscription_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "post_reactivate_subscription" ) as post, mock.patch.object( + transports.SubscriptionsServiceRestInterceptor, + "post_reactivate_subscription_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubscriptionsServiceRestInterceptor, "pre_reactivate_subscription" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = subscriptions_service.ReactivateSubscriptionRequest.pb( subscriptions_service.ReactivateSubscriptionRequest() ) @@ -5882,6 +5969,7 @@ def test_reactivate_subscription_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.reactivate_subscription( request, @@ -5893,6 +5981,7 @@ def test_reactivate_subscription_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-apps-meet/google/apps/meet/gapic_version.py b/packages/google-apps-meet/google/apps/meet/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-apps-meet/google/apps/meet/gapic_version.py +++ b/packages/google-apps-meet/google/apps/meet/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-apps-meet/google/apps/meet_v2/gapic_version.py b/packages/google-apps-meet/google/apps/meet_v2/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-apps-meet/google/apps/meet_v2/gapic_version.py +++ b/packages/google-apps-meet/google/apps/meet_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-apps-meet/google/apps/meet_v2/services/conference_records_service/client.py b/packages/google-apps-meet/google/apps/meet_v2/services/conference_records_service/client.py index 35bd560991ad..875009ac9f4c 100644 --- a/packages/google-apps-meet/google/apps/meet_v2/services/conference_records_service/client.py +++ b/packages/google-apps-meet/google/apps/meet_v2/services/conference_records_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 @@ -602,6 +604,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-apps-meet/google/apps/meet_v2/services/conference_records_service/transports/rest.py b/packages/google-apps-meet/google/apps/meet_v2/services/conference_records_service/transports/rest.py index 4ed223265adf..ebf5f73fc856 100644 --- a/packages/google-apps-meet/google/apps/meet_v2/services/conference_records_service/transports/rest.py +++ b/packages/google-apps-meet/google/apps/meet_v2/services/conference_records_service/transports/rest.py @@ -189,12 +189,35 @@ def post_get_conference_record( ) -> resource.ConferenceRecord: """Post-rpc interceptor for get_conference_record - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_conference_record_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_conference_record` interceptor runs + before the `post_get_conference_record_with_metadata` interceptor. """ return response + def post_get_conference_record_with_metadata( + self, + response: resource.ConferenceRecord, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.ConferenceRecord, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_conference_record + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_conference_record_with_metadata` + interceptor in new development instead of the `post_get_conference_record` interceptor. + When both interceptors are used, this `post_get_conference_record_with_metadata` interceptor runs after the + `post_get_conference_record` interceptor. The (possibly modified) response returned by + `post_get_conference_record` will be passed to + `post_get_conference_record_with_metadata`. + """ + return response, metadata + def pre_get_participant( self, request: service.GetParticipantRequest, @@ -212,12 +235,35 @@ def post_get_participant( ) -> resource.Participant: """Post-rpc interceptor for get_participant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_participant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_participant` interceptor runs + before the `post_get_participant_with_metadata` interceptor. """ return response + def post_get_participant_with_metadata( + self, + response: resource.Participant, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Participant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_participant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_participant_with_metadata` + interceptor in new development instead of the `post_get_participant` interceptor. + When both interceptors are used, this `post_get_participant_with_metadata` interceptor runs after the + `post_get_participant` interceptor. The (possibly modified) response returned by + `post_get_participant` will be passed to + `post_get_participant_with_metadata`. + """ + return response, metadata + def pre_get_participant_session( self, request: service.GetParticipantSessionRequest, @@ -237,12 +283,35 @@ def post_get_participant_session( ) -> resource.ParticipantSession: """Post-rpc interceptor for get_participant_session - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_participant_session_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_participant_session` interceptor runs + before the `post_get_participant_session_with_metadata` interceptor. """ return response + def post_get_participant_session_with_metadata( + self, + response: resource.ParticipantSession, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.ParticipantSession, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_participant_session + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_participant_session_with_metadata` + interceptor in new development instead of the `post_get_participant_session` interceptor. + When both interceptors are used, this `post_get_participant_session_with_metadata` interceptor runs after the + `post_get_participant_session` interceptor. The (possibly modified) response returned by + `post_get_participant_session` will be passed to + `post_get_participant_session_with_metadata`. + """ + return response, metadata + def pre_get_recording( self, request: service.GetRecordingRequest, @@ -258,12 +327,35 @@ def pre_get_recording( def post_get_recording(self, response: resource.Recording) -> resource.Recording: """Post-rpc interceptor for get_recording - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_recording_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_recording` interceptor runs + before the `post_get_recording_with_metadata` interceptor. """ return response + def post_get_recording_with_metadata( + self, + response: resource.Recording, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Recording, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_recording + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_recording_with_metadata` + interceptor in new development instead of the `post_get_recording` interceptor. + When both interceptors are used, this `post_get_recording_with_metadata` interceptor runs after the + `post_get_recording` interceptor. The (possibly modified) response returned by + `post_get_recording` will be passed to + `post_get_recording_with_metadata`. + """ + return response, metadata + def pre_get_transcript( self, request: service.GetTranscriptRequest, @@ -279,12 +371,35 @@ def pre_get_transcript( def post_get_transcript(self, response: resource.Transcript) -> resource.Transcript: """Post-rpc interceptor for get_transcript - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_transcript_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_transcript` interceptor runs + before the `post_get_transcript_with_metadata` interceptor. """ return response + def post_get_transcript_with_metadata( + self, + response: resource.Transcript, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Transcript, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_transcript + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_transcript_with_metadata` + interceptor in new development instead of the `post_get_transcript` interceptor. + When both interceptors are used, this `post_get_transcript_with_metadata` interceptor runs after the + `post_get_transcript` interceptor. The (possibly modified) response returned by + `post_get_transcript` will be passed to + `post_get_transcript_with_metadata`. + """ + return response, metadata + def pre_get_transcript_entry( self, request: service.GetTranscriptEntryRequest, @@ -304,12 +419,35 @@ def post_get_transcript_entry( ) -> resource.TranscriptEntry: """Post-rpc interceptor for get_transcript_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_transcript_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_transcript_entry` interceptor runs + before the `post_get_transcript_entry_with_metadata` interceptor. """ return response + def post_get_transcript_entry_with_metadata( + self, + response: resource.TranscriptEntry, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.TranscriptEntry, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_transcript_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_transcript_entry_with_metadata` + interceptor in new development instead of the `post_get_transcript_entry` interceptor. + When both interceptors are used, this `post_get_transcript_entry_with_metadata` interceptor runs after the + `post_get_transcript_entry` interceptor. The (possibly modified) response returned by + `post_get_transcript_entry` will be passed to + `post_get_transcript_entry_with_metadata`. + """ + return response, metadata + def pre_list_conference_records( self, request: service.ListConferenceRecordsRequest, @@ -329,12 +467,37 @@ def post_list_conference_records( ) -> service.ListConferenceRecordsResponse: """Post-rpc interceptor for list_conference_records - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_conference_records_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_conference_records` interceptor runs + before the `post_list_conference_records_with_metadata` interceptor. """ return response + def post_list_conference_records_with_metadata( + self, + response: service.ListConferenceRecordsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListConferenceRecordsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_conference_records + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_conference_records_with_metadata` + interceptor in new development instead of the `post_list_conference_records` interceptor. + When both interceptors are used, this `post_list_conference_records_with_metadata` interceptor runs after the + `post_list_conference_records` interceptor. The (possibly modified) response returned by + `post_list_conference_records` will be passed to + `post_list_conference_records_with_metadata`. + """ + return response, metadata + def pre_list_participants( self, request: service.ListParticipantsRequest, @@ -354,12 +517,37 @@ def post_list_participants( ) -> service.ListParticipantsResponse: """Post-rpc interceptor for list_participants - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_participants_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_participants` interceptor runs + before the `post_list_participants_with_metadata` interceptor. """ return response + def post_list_participants_with_metadata( + self, + response: service.ListParticipantsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListParticipantsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_participants + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_participants_with_metadata` + interceptor in new development instead of the `post_list_participants` interceptor. + When both interceptors are used, this `post_list_participants_with_metadata` interceptor runs after the + `post_list_participants` interceptor. The (possibly modified) response returned by + `post_list_participants` will be passed to + `post_list_participants_with_metadata`. + """ + return response, metadata + def pre_list_participant_sessions( self, request: service.ListParticipantSessionsRequest, @@ -379,12 +567,37 @@ def post_list_participant_sessions( ) -> service.ListParticipantSessionsResponse: """Post-rpc interceptor for list_participant_sessions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_participant_sessions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_participant_sessions` interceptor runs + before the `post_list_participant_sessions_with_metadata` interceptor. """ return response + def post_list_participant_sessions_with_metadata( + self, + response: service.ListParticipantSessionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListParticipantSessionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_participant_sessions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_participant_sessions_with_metadata` + interceptor in new development instead of the `post_list_participant_sessions` interceptor. + When both interceptors are used, this `post_list_participant_sessions_with_metadata` interceptor runs after the + `post_list_participant_sessions` interceptor. The (possibly modified) response returned by + `post_list_participant_sessions` will be passed to + `post_list_participant_sessions_with_metadata`. + """ + return response, metadata + def pre_list_recordings( self, request: service.ListRecordingsRequest, @@ -402,12 +615,35 @@ def post_list_recordings( ) -> service.ListRecordingsResponse: """Post-rpc interceptor for list_recordings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_recordings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_recordings` interceptor runs + before the `post_list_recordings_with_metadata` interceptor. """ return response + def post_list_recordings_with_metadata( + self, + response: service.ListRecordingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListRecordingsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_recordings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_recordings_with_metadata` + interceptor in new development instead of the `post_list_recordings` interceptor. + When both interceptors are used, this `post_list_recordings_with_metadata` interceptor runs after the + `post_list_recordings` interceptor. The (possibly modified) response returned by + `post_list_recordings` will be passed to + `post_list_recordings_with_metadata`. + """ + return response, metadata + def pre_list_transcript_entries( self, request: service.ListTranscriptEntriesRequest, @@ -427,12 +663,37 @@ def post_list_transcript_entries( ) -> service.ListTranscriptEntriesResponse: """Post-rpc interceptor for list_transcript_entries - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_transcript_entries_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_transcript_entries` interceptor runs + before the `post_list_transcript_entries_with_metadata` interceptor. """ return response + def post_list_transcript_entries_with_metadata( + self, + response: service.ListTranscriptEntriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListTranscriptEntriesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_transcript_entries + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_transcript_entries_with_metadata` + interceptor in new development instead of the `post_list_transcript_entries` interceptor. + When both interceptors are used, this `post_list_transcript_entries_with_metadata` interceptor runs after the + `post_list_transcript_entries` interceptor. The (possibly modified) response returned by + `post_list_transcript_entries` will be passed to + `post_list_transcript_entries_with_metadata`. + """ + return response, metadata + def pre_list_transcripts( self, request: service.ListTranscriptsRequest, @@ -450,12 +711,37 @@ def post_list_transcripts( ) -> service.ListTranscriptsResponse: """Post-rpc interceptor for list_transcripts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_transcripts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_transcripts` interceptor runs + before the `post_list_transcripts_with_metadata` interceptor. """ return response + def post_list_transcripts_with_metadata( + self, + response: service.ListTranscriptsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListTranscriptsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_transcripts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_transcripts_with_metadata` + interceptor in new development instead of the `post_list_transcripts` interceptor. + When both interceptors are used, this `post_list_transcripts_with_metadata` interceptor runs after the + `post_list_transcripts` interceptor. The (possibly modified) response returned by + `post_list_transcripts` will be passed to + `post_list_transcripts_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ConferenceRecordsServiceRestStub: @@ -665,6 +951,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_conference_record(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_conference_record_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -810,6 +1100,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_participant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_participant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -962,6 +1256,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_participant_session(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_participant_session_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1108,6 +1406,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_recording(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_recording_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1255,6 +1557,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_transcript(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_transcript_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1403,6 +1709,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_transcript_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_transcript_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1549,6 +1859,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_conference_records(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_conference_records_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1697,6 +2011,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_participants(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_participants_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1844,6 +2162,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_participant_sessions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_participant_sessions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1989,6 +2311,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_recordings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_recordings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2135,6 +2461,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_transcript_entries(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_transcript_entries_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2282,6 +2612,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_transcripts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_transcripts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/client.py b/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/client.py index 0a19bfa2a7fb..74463bc83da7 100644 --- a/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/client.py +++ b/packages/google-apps-meet/google/apps/meet_v2/services/spaces_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. diff --git a/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/transports/rest.py b/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/transports/rest.py index 5ffeecf68bd7..b18d4cd7f824 100644 --- a/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/transports/rest.py +++ b/packages/google-apps-meet/google/apps/meet_v2/services/spaces_service/transports/rest.py @@ -118,12 +118,35 @@ def pre_create_space( def post_create_space(self, response: resource.Space) -> resource.Space: """Post-rpc interceptor for create_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_create_space` interceptor runs + before the `post_create_space_with_metadata` interceptor. """ return response + def post_create_space_with_metadata( + self, + response: resource.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_create_space_with_metadata` + interceptor in new development instead of the `post_create_space` interceptor. + When both interceptors are used, this `post_create_space_with_metadata` interceptor runs after the + `post_create_space` interceptor. The (possibly modified) response returned by + `post_create_space` will be passed to + `post_create_space_with_metadata`. + """ + return response, metadata + def pre_end_active_conference( self, request: service.EndActiveConferenceRequest, @@ -153,12 +176,35 @@ def pre_get_space( def post_get_space(self, response: resource.Space) -> resource.Space: """Post-rpc interceptor for get_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_get_space` interceptor runs + before the `post_get_space_with_metadata` interceptor. """ return response + def post_get_space_with_metadata( + self, + response: resource.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_get_space_with_metadata` + interceptor in new development instead of the `post_get_space` interceptor. + When both interceptors are used, this `post_get_space_with_metadata` interceptor runs after the + `post_get_space` interceptor. The (possibly modified) response returned by + `post_get_space` will be passed to + `post_get_space_with_metadata`. + """ + return response, metadata + def pre_update_space( self, request: service.UpdateSpaceRequest, @@ -174,12 +220,35 @@ def pre_update_space( def post_update_space(self, response: resource.Space) -> resource.Space: """Post-rpc interceptor for update_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_update_space` interceptor runs + before the `post_update_space_with_metadata` interceptor. """ return response + def post_update_space_with_metadata( + self, + response: resource.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_update_space_with_metadata` + interceptor in new development instead of the `post_update_space` interceptor. + When both interceptors are used, this `post_update_space_with_metadata` interceptor runs after the + `post_update_space` interceptor. The (possibly modified) response returned by + `post_update_space` will be passed to + `post_update_space_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SpacesServiceRestStub: @@ -397,6 +466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -659,6 +732,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -812,6 +889,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-apps-meet/google/apps/meet_v2beta/gapic_version.py b/packages/google-apps-meet/google/apps/meet_v2beta/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-apps-meet/google/apps/meet_v2beta/gapic_version.py +++ b/packages/google-apps-meet/google/apps/meet_v2beta/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-apps-meet/google/apps/meet_v2beta/services/conference_records_service/client.py b/packages/google-apps-meet/google/apps/meet_v2beta/services/conference_records_service/client.py index 424927fada53..57aae5a468e2 100644 --- a/packages/google-apps-meet/google/apps/meet_v2beta/services/conference_records_service/client.py +++ b/packages/google-apps-meet/google/apps/meet_v2beta/services/conference_records_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 @@ -602,6 +604,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-apps-meet/google/apps/meet_v2beta/services/conference_records_service/transports/rest.py b/packages/google-apps-meet/google/apps/meet_v2beta/services/conference_records_service/transports/rest.py index 9693157a6016..a718fb67d700 100644 --- a/packages/google-apps-meet/google/apps/meet_v2beta/services/conference_records_service/transports/rest.py +++ b/packages/google-apps-meet/google/apps/meet_v2beta/services/conference_records_service/transports/rest.py @@ -189,12 +189,35 @@ def post_get_conference_record( ) -> resource.ConferenceRecord: """Post-rpc interceptor for get_conference_record - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_conference_record_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_conference_record` interceptor runs + before the `post_get_conference_record_with_metadata` interceptor. """ return response + def post_get_conference_record_with_metadata( + self, + response: resource.ConferenceRecord, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.ConferenceRecord, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_conference_record + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_conference_record_with_metadata` + interceptor in new development instead of the `post_get_conference_record` interceptor. + When both interceptors are used, this `post_get_conference_record_with_metadata` interceptor runs after the + `post_get_conference_record` interceptor. The (possibly modified) response returned by + `post_get_conference_record` will be passed to + `post_get_conference_record_with_metadata`. + """ + return response, metadata + def pre_get_participant( self, request: service.GetParticipantRequest, @@ -212,12 +235,35 @@ def post_get_participant( ) -> resource.Participant: """Post-rpc interceptor for get_participant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_participant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_participant` interceptor runs + before the `post_get_participant_with_metadata` interceptor. """ return response + def post_get_participant_with_metadata( + self, + response: resource.Participant, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Participant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_participant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_participant_with_metadata` + interceptor in new development instead of the `post_get_participant` interceptor. + When both interceptors are used, this `post_get_participant_with_metadata` interceptor runs after the + `post_get_participant` interceptor. The (possibly modified) response returned by + `post_get_participant` will be passed to + `post_get_participant_with_metadata`. + """ + return response, metadata + def pre_get_participant_session( self, request: service.GetParticipantSessionRequest, @@ -237,12 +283,35 @@ def post_get_participant_session( ) -> resource.ParticipantSession: """Post-rpc interceptor for get_participant_session - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_participant_session_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_participant_session` interceptor runs + before the `post_get_participant_session_with_metadata` interceptor. """ return response + def post_get_participant_session_with_metadata( + self, + response: resource.ParticipantSession, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.ParticipantSession, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_participant_session + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_participant_session_with_metadata` + interceptor in new development instead of the `post_get_participant_session` interceptor. + When both interceptors are used, this `post_get_participant_session_with_metadata` interceptor runs after the + `post_get_participant_session` interceptor. The (possibly modified) response returned by + `post_get_participant_session` will be passed to + `post_get_participant_session_with_metadata`. + """ + return response, metadata + def pre_get_recording( self, request: service.GetRecordingRequest, @@ -258,12 +327,35 @@ def pre_get_recording( def post_get_recording(self, response: resource.Recording) -> resource.Recording: """Post-rpc interceptor for get_recording - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_recording_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_recording` interceptor runs + before the `post_get_recording_with_metadata` interceptor. """ return response + def post_get_recording_with_metadata( + self, + response: resource.Recording, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Recording, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_recording + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_recording_with_metadata` + interceptor in new development instead of the `post_get_recording` interceptor. + When both interceptors are used, this `post_get_recording_with_metadata` interceptor runs after the + `post_get_recording` interceptor. The (possibly modified) response returned by + `post_get_recording` will be passed to + `post_get_recording_with_metadata`. + """ + return response, metadata + def pre_get_transcript( self, request: service.GetTranscriptRequest, @@ -279,12 +371,35 @@ def pre_get_transcript( def post_get_transcript(self, response: resource.Transcript) -> resource.Transcript: """Post-rpc interceptor for get_transcript - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_transcript_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_transcript` interceptor runs + before the `post_get_transcript_with_metadata` interceptor. """ return response + def post_get_transcript_with_metadata( + self, + response: resource.Transcript, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Transcript, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_transcript + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_transcript_with_metadata` + interceptor in new development instead of the `post_get_transcript` interceptor. + When both interceptors are used, this `post_get_transcript_with_metadata` interceptor runs after the + `post_get_transcript` interceptor. The (possibly modified) response returned by + `post_get_transcript` will be passed to + `post_get_transcript_with_metadata`. + """ + return response, metadata + def pre_get_transcript_entry( self, request: service.GetTranscriptEntryRequest, @@ -304,12 +419,35 @@ def post_get_transcript_entry( ) -> resource.TranscriptEntry: """Post-rpc interceptor for get_transcript_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_transcript_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_get_transcript_entry` interceptor runs + before the `post_get_transcript_entry_with_metadata` interceptor. """ return response + def post_get_transcript_entry_with_metadata( + self, + response: resource.TranscriptEntry, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.TranscriptEntry, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_transcript_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_get_transcript_entry_with_metadata` + interceptor in new development instead of the `post_get_transcript_entry` interceptor. + When both interceptors are used, this `post_get_transcript_entry_with_metadata` interceptor runs after the + `post_get_transcript_entry` interceptor. The (possibly modified) response returned by + `post_get_transcript_entry` will be passed to + `post_get_transcript_entry_with_metadata`. + """ + return response, metadata + def pre_list_conference_records( self, request: service.ListConferenceRecordsRequest, @@ -329,12 +467,37 @@ def post_list_conference_records( ) -> service.ListConferenceRecordsResponse: """Post-rpc interceptor for list_conference_records - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_conference_records_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_conference_records` interceptor runs + before the `post_list_conference_records_with_metadata` interceptor. """ return response + def post_list_conference_records_with_metadata( + self, + response: service.ListConferenceRecordsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListConferenceRecordsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_conference_records + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_conference_records_with_metadata` + interceptor in new development instead of the `post_list_conference_records` interceptor. + When both interceptors are used, this `post_list_conference_records_with_metadata` interceptor runs after the + `post_list_conference_records` interceptor. The (possibly modified) response returned by + `post_list_conference_records` will be passed to + `post_list_conference_records_with_metadata`. + """ + return response, metadata + def pre_list_participants( self, request: service.ListParticipantsRequest, @@ -354,12 +517,37 @@ def post_list_participants( ) -> service.ListParticipantsResponse: """Post-rpc interceptor for list_participants - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_participants_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_participants` interceptor runs + before the `post_list_participants_with_metadata` interceptor. """ return response + def post_list_participants_with_metadata( + self, + response: service.ListParticipantsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListParticipantsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_participants + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_participants_with_metadata` + interceptor in new development instead of the `post_list_participants` interceptor. + When both interceptors are used, this `post_list_participants_with_metadata` interceptor runs after the + `post_list_participants` interceptor. The (possibly modified) response returned by + `post_list_participants` will be passed to + `post_list_participants_with_metadata`. + """ + return response, metadata + def pre_list_participant_sessions( self, request: service.ListParticipantSessionsRequest, @@ -379,12 +567,37 @@ def post_list_participant_sessions( ) -> service.ListParticipantSessionsResponse: """Post-rpc interceptor for list_participant_sessions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_participant_sessions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_participant_sessions` interceptor runs + before the `post_list_participant_sessions_with_metadata` interceptor. """ return response + def post_list_participant_sessions_with_metadata( + self, + response: service.ListParticipantSessionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListParticipantSessionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_participant_sessions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_participant_sessions_with_metadata` + interceptor in new development instead of the `post_list_participant_sessions` interceptor. + When both interceptors are used, this `post_list_participant_sessions_with_metadata` interceptor runs after the + `post_list_participant_sessions` interceptor. The (possibly modified) response returned by + `post_list_participant_sessions` will be passed to + `post_list_participant_sessions_with_metadata`. + """ + return response, metadata + def pre_list_recordings( self, request: service.ListRecordingsRequest, @@ -402,12 +615,35 @@ def post_list_recordings( ) -> service.ListRecordingsResponse: """Post-rpc interceptor for list_recordings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_recordings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_recordings` interceptor runs + before the `post_list_recordings_with_metadata` interceptor. """ return response + def post_list_recordings_with_metadata( + self, + response: service.ListRecordingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListRecordingsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_recordings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_recordings_with_metadata` + interceptor in new development instead of the `post_list_recordings` interceptor. + When both interceptors are used, this `post_list_recordings_with_metadata` interceptor runs after the + `post_list_recordings` interceptor. The (possibly modified) response returned by + `post_list_recordings` will be passed to + `post_list_recordings_with_metadata`. + """ + return response, metadata + def pre_list_transcript_entries( self, request: service.ListTranscriptEntriesRequest, @@ -427,12 +663,37 @@ def post_list_transcript_entries( ) -> service.ListTranscriptEntriesResponse: """Post-rpc interceptor for list_transcript_entries - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_transcript_entries_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_transcript_entries` interceptor runs + before the `post_list_transcript_entries_with_metadata` interceptor. """ return response + def post_list_transcript_entries_with_metadata( + self, + response: service.ListTranscriptEntriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListTranscriptEntriesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_transcript_entries + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_transcript_entries_with_metadata` + interceptor in new development instead of the `post_list_transcript_entries` interceptor. + When both interceptors are used, this `post_list_transcript_entries_with_metadata` interceptor runs after the + `post_list_transcript_entries` interceptor. The (possibly modified) response returned by + `post_list_transcript_entries` will be passed to + `post_list_transcript_entries_with_metadata`. + """ + return response, metadata + def pre_list_transcripts( self, request: service.ListTranscriptsRequest, @@ -450,12 +711,37 @@ def post_list_transcripts( ) -> service.ListTranscriptsResponse: """Post-rpc interceptor for list_transcripts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_transcripts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConferenceRecordsService server but before - it is returned to user code. + it is returned to user code. This `post_list_transcripts` interceptor runs + before the `post_list_transcripts_with_metadata` interceptor. """ return response + def post_list_transcripts_with_metadata( + self, + response: service.ListTranscriptsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListTranscriptsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_transcripts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConferenceRecordsService server but before it is returned to user code. + + We recommend only using this `post_list_transcripts_with_metadata` + interceptor in new development instead of the `post_list_transcripts` interceptor. + When both interceptors are used, this `post_list_transcripts_with_metadata` interceptor runs after the + `post_list_transcripts` interceptor. The (possibly modified) response returned by + `post_list_transcripts` will be passed to + `post_list_transcripts_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ConferenceRecordsServiceRestStub: @@ -665,6 +951,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_conference_record(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_conference_record_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -810,6 +1100,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_participant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_participant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -962,6 +1256,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_participant_session(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_participant_session_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1108,6 +1406,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_recording(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_recording_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1255,6 +1557,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_transcript(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_transcript_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1403,6 +1709,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_transcript_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_transcript_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1549,6 +1859,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_conference_records(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_conference_records_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1697,6 +2011,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_participants(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_participants_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1844,6 +2162,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_participant_sessions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_participant_sessions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1989,6 +2311,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_recordings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_recordings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2135,6 +2461,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_transcript_entries(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_transcript_entries_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2282,6 +2612,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_transcripts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_transcripts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/client.py b/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/client.py index 5c004e3ca4ae..4c0fc0cf3c9f 100644 --- a/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/client.py +++ b/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_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. diff --git a/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/transports/rest.py b/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/transports/rest.py index 2dd32541a7fd..4bd95f866db5 100644 --- a/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/transports/rest.py +++ b/packages/google-apps-meet/google/apps/meet_v2beta/services/spaces_service/transports/rest.py @@ -146,12 +146,35 @@ def pre_create_member( def post_create_member(self, response: resource.Member) -> resource.Member: """Post-rpc interceptor for create_member - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_member_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_create_member` interceptor runs + before the `post_create_member_with_metadata` interceptor. """ return response + def post_create_member_with_metadata( + self, + response: resource.Member, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Member, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_member + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_create_member_with_metadata` + interceptor in new development instead of the `post_create_member` interceptor. + When both interceptors are used, this `post_create_member_with_metadata` interceptor runs after the + `post_create_member` interceptor. The (possibly modified) response returned by + `post_create_member` will be passed to + `post_create_member_with_metadata`. + """ + return response, metadata + def pre_create_space( self, request: service.CreateSpaceRequest, @@ -167,12 +190,35 @@ def pre_create_space( def post_create_space(self, response: resource.Space) -> resource.Space: """Post-rpc interceptor for create_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_create_space` interceptor runs + before the `post_create_space_with_metadata` interceptor. """ return response + def post_create_space_with_metadata( + self, + response: resource.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_create_space_with_metadata` + interceptor in new development instead of the `post_create_space` interceptor. + When both interceptors are used, this `post_create_space_with_metadata` interceptor runs after the + `post_create_space` interceptor. The (possibly modified) response returned by + `post_create_space` will be passed to + `post_create_space_with_metadata`. + """ + return response, metadata + def pre_delete_member( self, request: service.DeleteMemberRequest, @@ -214,12 +260,35 @@ def pre_get_member( def post_get_member(self, response: resource.Member) -> resource.Member: """Post-rpc interceptor for get_member - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_member_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_get_member` interceptor runs + before the `post_get_member_with_metadata` interceptor. """ return response + def post_get_member_with_metadata( + self, + response: resource.Member, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Member, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_member + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_get_member_with_metadata` + interceptor in new development instead of the `post_get_member` interceptor. + When both interceptors are used, this `post_get_member_with_metadata` interceptor runs after the + `post_get_member` interceptor. The (possibly modified) response returned by + `post_get_member` will be passed to + `post_get_member_with_metadata`. + """ + return response, metadata + def pre_get_space( self, request: service.GetSpaceRequest, @@ -235,12 +304,35 @@ def pre_get_space( def post_get_space(self, response: resource.Space) -> resource.Space: """Post-rpc interceptor for get_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_get_space` interceptor runs + before the `post_get_space_with_metadata` interceptor. """ return response + def post_get_space_with_metadata( + self, + response: resource.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_get_space_with_metadata` + interceptor in new development instead of the `post_get_space` interceptor. + When both interceptors are used, this `post_get_space_with_metadata` interceptor runs after the + `post_get_space` interceptor. The (possibly modified) response returned by + `post_get_space` will be passed to + `post_get_space_with_metadata`. + """ + return response, metadata + def pre_list_members( self, request: service.ListMembersRequest, @@ -258,12 +350,35 @@ def post_list_members( ) -> service.ListMembersResponse: """Post-rpc interceptor for list_members - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_members_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_list_members` interceptor runs + before the `post_list_members_with_metadata` interceptor. """ return response + def post_list_members_with_metadata( + self, + response: service.ListMembersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListMembersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_members + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_list_members_with_metadata` + interceptor in new development instead of the `post_list_members` interceptor. + When both interceptors are used, this `post_list_members_with_metadata` interceptor runs after the + `post_list_members` interceptor. The (possibly modified) response returned by + `post_list_members` will be passed to + `post_list_members_with_metadata`. + """ + return response, metadata + def pre_update_space( self, request: service.UpdateSpaceRequest, @@ -279,12 +394,35 @@ def pre_update_space( def post_update_space(self, response: resource.Space) -> resource.Space: """Post-rpc interceptor for update_space - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_space_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SpacesService server but before - it is returned to user code. + it is returned to user code. This `post_update_space` interceptor runs + before the `post_update_space_with_metadata` interceptor. """ return response + def post_update_space_with_metadata( + self, + response: resource.Space, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.Space, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_space + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SpacesService server but before it is returned to user code. + + We recommend only using this `post_update_space_with_metadata` + interceptor in new development instead of the `post_update_space` interceptor. + When both interceptors are used, this `post_update_space_with_metadata` interceptor runs after the + `post_update_space` interceptor. The (possibly modified) response returned by + `post_update_space` will be passed to + `post_update_space_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SpacesServiceRestStub: @@ -499,6 +637,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_member(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_member_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -652,6 +794,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1021,6 +1167,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_member(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_member_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1168,6 +1318,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1311,6 +1465,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_members(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_members_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1464,6 +1622,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_space(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_space_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2.json b/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2.json index 3ae94e7d3be7..55b2797bb589 100644 --- a/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2.json +++ b/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-apps-meet", - "version": "0.1.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2beta.json b/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2beta.json index ccadb7ec8a59..e4879aae2f2a 100644 --- a/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2beta.json +++ b/packages/google-apps-meet/samples/generated_samples/snippet_metadata_google.apps.meet.v2beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-apps-meet", - "version": "0.1.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_conference_records_service.py b/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_conference_records_service.py index 664601f75754..1aaaf0f8a9ad 100644 --- a/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_conference_records_service.py +++ b/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_conference_records_service.py @@ -61,6 +61,13 @@ ) from google.apps.meet_v2.types import resource, 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 @@ -336,6 +343,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ConferenceRecordsServiceClient(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 = ConferenceRecordsServiceClient(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", [ @@ -9513,10 +9563,14 @@ def test_get_conference_record_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_conference_record" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_conference_record_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_conference_record" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetConferenceRecordRequest.pb( service.GetConferenceRecordRequest() ) @@ -9540,6 +9594,7 @@ def test_get_conference_record_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.ConferenceRecord() + post_with_metadata.return_value = resource.ConferenceRecord(), metadata client.get_conference_record( request, @@ -9551,6 +9606,7 @@ def test_get_conference_record_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_conference_records_rest_bad_request( @@ -9636,11 +9692,15 @@ def test_list_conference_records_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_list_conference_records", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_conference_records_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_conference_records", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListConferenceRecordsRequest.pb( service.ListConferenceRecordsRequest() ) @@ -9666,6 +9726,10 @@ def test_list_conference_records_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListConferenceRecordsResponse() + post_with_metadata.return_value = ( + service.ListConferenceRecordsResponse(), + metadata, + ) client.list_conference_records( request, @@ -9677,6 +9741,7 @@ def test_list_conference_records_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_participant_rest_bad_request(request_type=service.GetParticipantRequest): @@ -9759,10 +9824,14 @@ def test_get_participant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_participant" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_participant_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_participant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetParticipantRequest.pb(service.GetParticipantRequest()) transcode.return_value = { "method": "post", @@ -9784,6 +9853,7 @@ def test_get_participant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Participant() + post_with_metadata.return_value = resource.Participant(), metadata client.get_participant( request, @@ -9795,6 +9865,7 @@ def test_get_participant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_participants_rest_bad_request( @@ -9881,10 +9952,14 @@ def test_list_participants_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_list_participants" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_participants_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_participants" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListParticipantsRequest.pb( service.ListParticipantsRequest() ) @@ -9910,6 +9985,7 @@ def test_list_participants_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListParticipantsResponse() + post_with_metadata.return_value = service.ListParticipantsResponse(), metadata client.list_participants( request, @@ -9921,6 +9997,7 @@ def test_list_participants_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_participant_session_rest_bad_request( @@ -10010,11 +10087,15 @@ def test_get_participant_session_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_get_participant_session", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_participant_session_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_participant_session", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetParticipantSessionRequest.pb( service.GetParticipantSessionRequest() ) @@ -10040,6 +10121,7 @@ def test_get_participant_session_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.ParticipantSession() + post_with_metadata.return_value = resource.ParticipantSession(), metadata client.get_participant_session( request, @@ -10051,6 +10133,7 @@ def test_get_participant_session_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_participant_sessions_rest_bad_request( @@ -10136,11 +10219,15 @@ def test_list_participant_sessions_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_list_participant_sessions", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_participant_sessions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_participant_sessions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListParticipantSessionsRequest.pb( service.ListParticipantSessionsRequest() ) @@ -10166,6 +10253,10 @@ def test_list_participant_sessions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListParticipantSessionsResponse() + post_with_metadata.return_value = ( + service.ListParticipantSessionsResponse(), + metadata, + ) client.list_participant_sessions( request, @@ -10177,6 +10268,7 @@ def test_list_participant_sessions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_recording_rest_bad_request(request_type=service.GetRecordingRequest): @@ -10261,10 +10353,14 @@ def test_get_recording_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_recording" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_recording_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_recording" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetRecordingRequest.pb(service.GetRecordingRequest()) transcode.return_value = { "method": "post", @@ -10286,6 +10382,7 @@ def test_get_recording_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Recording() + post_with_metadata.return_value = resource.Recording(), metadata client.get_recording( request, @@ -10297,6 +10394,7 @@ def test_get_recording_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_recordings_rest_bad_request(request_type=service.ListRecordingsRequest): @@ -10379,10 +10477,14 @@ def test_list_recordings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_list_recordings" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_recordings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_recordings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListRecordingsRequest.pb(service.ListRecordingsRequest()) transcode.return_value = { "method": "post", @@ -10406,6 +10508,7 @@ def test_list_recordings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListRecordingsResponse() + post_with_metadata.return_value = service.ListRecordingsResponse(), metadata client.list_recordings( request, @@ -10417,6 +10520,7 @@ def test_list_recordings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_transcript_rest_bad_request(request_type=service.GetTranscriptRequest): @@ -10501,10 +10605,14 @@ def test_get_transcript_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_transcript" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_transcript_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_transcript" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetTranscriptRequest.pb(service.GetTranscriptRequest()) transcode.return_value = { "method": "post", @@ -10526,6 +10634,7 @@ def test_get_transcript_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Transcript() + post_with_metadata.return_value = resource.Transcript(), metadata client.get_transcript( request, @@ -10537,6 +10646,7 @@ def test_get_transcript_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_transcripts_rest_bad_request(request_type=service.ListTranscriptsRequest): @@ -10619,10 +10729,14 @@ def test_list_transcripts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_list_transcripts" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_transcripts_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_transcripts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListTranscriptsRequest.pb(service.ListTranscriptsRequest()) transcode.return_value = { "method": "post", @@ -10646,6 +10760,7 @@ def test_list_transcripts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListTranscriptsResponse() + post_with_metadata.return_value = service.ListTranscriptsResponse(), metadata client.list_transcripts( request, @@ -10657,6 +10772,7 @@ def test_list_transcripts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_transcript_entry_rest_bad_request( @@ -10751,10 +10867,14 @@ def test_get_transcript_entry_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_transcript_entry" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_transcript_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_transcript_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetTranscriptEntryRequest.pb( service.GetTranscriptEntryRequest() ) @@ -10778,6 +10898,7 @@ def test_get_transcript_entry_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.TranscriptEntry() + post_with_metadata.return_value = resource.TranscriptEntry(), metadata client.get_transcript_entry( request, @@ -10789,6 +10910,7 @@ def test_get_transcript_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_transcript_entries_rest_bad_request( @@ -10874,11 +10996,15 @@ def test_list_transcript_entries_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_list_transcript_entries", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_transcript_entries_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_transcript_entries", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListTranscriptEntriesRequest.pb( service.ListTranscriptEntriesRequest() ) @@ -10904,6 +11030,10 @@ def test_list_transcript_entries_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListTranscriptEntriesResponse() + post_with_metadata.return_value = ( + service.ListTranscriptEntriesResponse(), + metadata, + ) client.list_transcript_entries( request, @@ -10915,6 +11045,7 @@ def test_list_transcript_entries_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-apps-meet/tests/unit/gapic/meet_v2/test_spaces_service.py b/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_spaces_service.py index 669d804132f1..2754e46b20e9 100644 --- a/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_spaces_service.py +++ b/packages/google-apps-meet/tests/unit/gapic/meet_v2/test_spaces_service.py @@ -60,6 +60,13 @@ ) from google.apps.meet_v2.types import resource, 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 = SpacesServiceClient(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 = SpacesServiceClient(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", [ @@ -3411,10 +3461,13 @@ def test_create_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_create_space" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_create_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_create_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSpaceRequest.pb(service.CreateSpaceRequest()) transcode.return_value = { "method": "post", @@ -3436,6 +3489,7 @@ def test_create_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Space() + post_with_metadata.return_value = resource.Space(), metadata client.create_space( request, @@ -3447,6 +3501,7 @@ def test_create_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_space_rest_bad_request(request_type=service.GetSpaceRequest): @@ -3533,10 +3588,13 @@ def test_get_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_get_space" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_get_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_get_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSpaceRequest.pb(service.GetSpaceRequest()) transcode.return_value = { "method": "post", @@ -3558,6 +3616,7 @@ def test_get_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Space() + post_with_metadata.return_value = resource.Space(), metadata client.get_space( request, @@ -3569,6 +3628,7 @@ def test_get_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_space_rest_bad_request(request_type=service.UpdateSpaceRequest): @@ -3729,10 +3789,13 @@ def test_update_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_update_space" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_update_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_update_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSpaceRequest.pb(service.UpdateSpaceRequest()) transcode.return_value = { "method": "post", @@ -3754,6 +3817,7 @@ def test_update_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Space() + post_with_metadata.return_value = resource.Space(), metadata client.update_space( request, @@ -3765,6 +3829,7 @@ def test_update_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_end_active_conference_rest_bad_request( diff --git a/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_conference_records_service.py b/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_conference_records_service.py index 2f7165b6576b..5a1ef4c3d853 100644 --- a/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_conference_records_service.py +++ b/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_conference_records_service.py @@ -61,6 +61,13 @@ ) from google.apps.meet_v2beta.types import resource, 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 @@ -336,6 +343,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ConferenceRecordsServiceClient(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 = ConferenceRecordsServiceClient(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", [ @@ -9519,10 +9569,14 @@ def test_get_conference_record_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_conference_record" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_conference_record_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_conference_record" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetConferenceRecordRequest.pb( service.GetConferenceRecordRequest() ) @@ -9546,6 +9600,7 @@ def test_get_conference_record_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.ConferenceRecord() + post_with_metadata.return_value = resource.ConferenceRecord(), metadata client.get_conference_record( request, @@ -9557,6 +9612,7 @@ def test_get_conference_record_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_conference_records_rest_bad_request( @@ -9642,11 +9698,15 @@ def test_list_conference_records_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_list_conference_records", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_conference_records_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_conference_records", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListConferenceRecordsRequest.pb( service.ListConferenceRecordsRequest() ) @@ -9672,6 +9732,10 @@ def test_list_conference_records_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListConferenceRecordsResponse() + post_with_metadata.return_value = ( + service.ListConferenceRecordsResponse(), + metadata, + ) client.list_conference_records( request, @@ -9683,6 +9747,7 @@ def test_list_conference_records_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_participant_rest_bad_request(request_type=service.GetParticipantRequest): @@ -9765,10 +9830,14 @@ def test_get_participant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_participant" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_participant_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_participant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetParticipantRequest.pb(service.GetParticipantRequest()) transcode.return_value = { "method": "post", @@ -9790,6 +9859,7 @@ def test_get_participant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Participant() + post_with_metadata.return_value = resource.Participant(), metadata client.get_participant( request, @@ -9801,6 +9871,7 @@ def test_get_participant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_participants_rest_bad_request( @@ -9887,10 +9958,14 @@ def test_list_participants_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_list_participants" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_participants_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_participants" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListParticipantsRequest.pb( service.ListParticipantsRequest() ) @@ -9916,6 +9991,7 @@ def test_list_participants_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListParticipantsResponse() + post_with_metadata.return_value = service.ListParticipantsResponse(), metadata client.list_participants( request, @@ -9927,6 +10003,7 @@ def test_list_participants_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_participant_session_rest_bad_request( @@ -10016,11 +10093,15 @@ def test_get_participant_session_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_get_participant_session", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_participant_session_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_participant_session", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetParticipantSessionRequest.pb( service.GetParticipantSessionRequest() ) @@ -10046,6 +10127,7 @@ def test_get_participant_session_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.ParticipantSession() + post_with_metadata.return_value = resource.ParticipantSession(), metadata client.get_participant_session( request, @@ -10057,6 +10139,7 @@ def test_get_participant_session_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_participant_sessions_rest_bad_request( @@ -10142,11 +10225,15 @@ def test_list_participant_sessions_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_list_participant_sessions", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_participant_sessions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_participant_sessions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListParticipantSessionsRequest.pb( service.ListParticipantSessionsRequest() ) @@ -10172,6 +10259,10 @@ def test_list_participant_sessions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListParticipantSessionsResponse() + post_with_metadata.return_value = ( + service.ListParticipantSessionsResponse(), + metadata, + ) client.list_participant_sessions( request, @@ -10183,6 +10274,7 @@ def test_list_participant_sessions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_recording_rest_bad_request(request_type=service.GetRecordingRequest): @@ -10267,10 +10359,14 @@ def test_get_recording_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_recording" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_recording_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_recording" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetRecordingRequest.pb(service.GetRecordingRequest()) transcode.return_value = { "method": "post", @@ -10292,6 +10388,7 @@ def test_get_recording_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Recording() + post_with_metadata.return_value = resource.Recording(), metadata client.get_recording( request, @@ -10303,6 +10400,7 @@ def test_get_recording_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_recordings_rest_bad_request(request_type=service.ListRecordingsRequest): @@ -10385,10 +10483,14 @@ def test_list_recordings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_list_recordings" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_recordings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_recordings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListRecordingsRequest.pb(service.ListRecordingsRequest()) transcode.return_value = { "method": "post", @@ -10412,6 +10514,7 @@ def test_list_recordings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListRecordingsResponse() + post_with_metadata.return_value = service.ListRecordingsResponse(), metadata client.list_recordings( request, @@ -10423,6 +10526,7 @@ def test_list_recordings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_transcript_rest_bad_request(request_type=service.GetTranscriptRequest): @@ -10507,10 +10611,14 @@ def test_get_transcript_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_transcript" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_transcript_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_transcript" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetTranscriptRequest.pb(service.GetTranscriptRequest()) transcode.return_value = { "method": "post", @@ -10532,6 +10640,7 @@ def test_get_transcript_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Transcript() + post_with_metadata.return_value = resource.Transcript(), metadata client.get_transcript( request, @@ -10543,6 +10652,7 @@ def test_get_transcript_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_transcripts_rest_bad_request(request_type=service.ListTranscriptsRequest): @@ -10625,10 +10735,14 @@ def test_list_transcripts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_list_transcripts" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_transcripts_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_transcripts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListTranscriptsRequest.pb(service.ListTranscriptsRequest()) transcode.return_value = { "method": "post", @@ -10652,6 +10766,7 @@ def test_list_transcripts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListTranscriptsResponse() + post_with_metadata.return_value = service.ListTranscriptsResponse(), metadata client.list_transcripts( request, @@ -10663,6 +10778,7 @@ def test_list_transcripts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_transcript_entry_rest_bad_request( @@ -10757,10 +10873,14 @@ def test_get_transcript_entry_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "post_get_transcript_entry" ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_get_transcript_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_get_transcript_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetTranscriptEntryRequest.pb( service.GetTranscriptEntryRequest() ) @@ -10784,6 +10904,7 @@ def test_get_transcript_entry_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.TranscriptEntry() + post_with_metadata.return_value = resource.TranscriptEntry(), metadata client.get_transcript_entry( request, @@ -10795,6 +10916,7 @@ def test_get_transcript_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_transcript_entries_rest_bad_request( @@ -10880,11 +11002,15 @@ def test_list_transcript_entries_rest_interceptors(null_interceptor): transports.ConferenceRecordsServiceRestInterceptor, "post_list_transcript_entries", ) as post, mock.patch.object( + transports.ConferenceRecordsServiceRestInterceptor, + "post_list_transcript_entries_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConferenceRecordsServiceRestInterceptor, "pre_list_transcript_entries", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListTranscriptEntriesRequest.pb( service.ListTranscriptEntriesRequest() ) @@ -10910,6 +11036,10 @@ def test_list_transcript_entries_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListTranscriptEntriesResponse() + post_with_metadata.return_value = ( + service.ListTranscriptEntriesResponse(), + metadata, + ) client.list_transcript_entries( request, @@ -10921,6 +11051,7 @@ def test_list_transcript_entries_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-apps-meet/tests/unit/gapic/meet_v2beta/test_spaces_service.py b/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_spaces_service.py index e0c6f945c596..93101b467265 100644 --- a/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_spaces_service.py +++ b/packages/google-apps-meet/tests/unit/gapic/meet_v2beta/test_spaces_service.py @@ -61,6 +61,13 @@ ) from google.apps.meet_v2beta.types import resource, 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 @@ -315,6 +322,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SpacesServiceClient(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 = SpacesServiceClient(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", [ @@ -5902,10 +5952,13 @@ def test_create_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_create_space" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_create_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_create_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSpaceRequest.pb(service.CreateSpaceRequest()) transcode.return_value = { "method": "post", @@ -5927,6 +5980,7 @@ def test_create_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Space() + post_with_metadata.return_value = resource.Space(), metadata client.create_space( request, @@ -5938,6 +5992,7 @@ def test_create_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_space_rest_bad_request(request_type=service.GetSpaceRequest): @@ -6024,10 +6079,13 @@ def test_get_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_get_space" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_get_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_get_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSpaceRequest.pb(service.GetSpaceRequest()) transcode.return_value = { "method": "post", @@ -6049,6 +6107,7 @@ def test_get_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Space() + post_with_metadata.return_value = resource.Space(), metadata client.get_space( request, @@ -6060,6 +6119,7 @@ def test_get_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_space_rest_bad_request(request_type=service.UpdateSpaceRequest): @@ -6236,10 +6296,13 @@ def test_update_space_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_update_space" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_update_space_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_update_space" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSpaceRequest.pb(service.UpdateSpaceRequest()) transcode.return_value = { "method": "post", @@ -6261,6 +6324,7 @@ def test_update_space_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Space() + post_with_metadata.return_value = resource.Space(), metadata client.update_space( request, @@ -6272,6 +6336,7 @@ def test_update_space_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_end_active_conference_rest_bad_request( @@ -6542,10 +6607,13 @@ def test_create_member_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_create_member" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_create_member_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_create_member" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateMemberRequest.pb(service.CreateMemberRequest()) transcode.return_value = { "method": "post", @@ -6567,6 +6635,7 @@ def test_create_member_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Member() + post_with_metadata.return_value = resource.Member(), metadata client.create_member( request, @@ -6578,6 +6647,7 @@ def test_create_member_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_member_rest_bad_request(request_type=service.GetMemberRequest): @@ -6666,10 +6736,13 @@ def test_get_member_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_get_member" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_get_member_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_get_member" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetMemberRequest.pb(service.GetMemberRequest()) transcode.return_value = { "method": "post", @@ -6691,6 +6764,7 @@ def test_get_member_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.Member() + post_with_metadata.return_value = resource.Member(), metadata client.get_member( request, @@ -6702,6 +6776,7 @@ def test_get_member_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_members_rest_bad_request(request_type=service.ListMembersRequest): @@ -6784,10 +6859,13 @@ def test_list_members_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpacesServiceRestInterceptor, "post_list_members" ) as post, mock.patch.object( + transports.SpacesServiceRestInterceptor, "post_list_members_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpacesServiceRestInterceptor, "pre_list_members" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListMembersRequest.pb(service.ListMembersRequest()) transcode.return_value = { "method": "post", @@ -6811,6 +6889,7 @@ def test_list_members_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListMembersResponse() + post_with_metadata.return_value = service.ListMembersResponse(), metadata client.list_members( request, @@ -6822,6 +6901,7 @@ def test_list_members_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_member_rest_bad_request(request_type=service.DeleteMemberRequest): diff --git a/packages/google-apps-script-type/google/apps/script/type/calendar/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/calendar/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/calendar/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/calendar/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-script-type/google/apps/script/type/docs/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/docs/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/docs/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/docs/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-script-type/google/apps/script/type/drive/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/drive/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/drive/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/drive/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-script-type/google/apps/script/type/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-script-type/google/apps/script/type/gmail/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/gmail/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/gmail/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/gmail/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-script-type/google/apps/script/type/sheets/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/sheets/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/sheets/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/sheets/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-apps-script-type/google/apps/script/type/slides/gapic_version.py b/packages/google-apps-script-type/google/apps/script/type/slides/gapic_version.py index ab68833be4be..558c8aab67c5 100644 --- a/packages/google-apps-script-type/google/apps/script/type/slides/gapic_version.py +++ b/packages/google-apps-script-type/google/apps/script/type/slides/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-area120-tables/google/area120/tables/gapic_version.py b/packages/google-area120-tables/google/area120/tables/gapic_version.py index 9d5fd39a4c03..558c8aab67c5 100644 --- a/packages/google-area120-tables/google/area120/tables/gapic_version.py +++ b/packages/google-area120-tables/google/area120/tables/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.11.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-area120-tables/google/area120/tables_v1alpha1/gapic_version.py b/packages/google-area120-tables/google/area120/tables_v1alpha1/gapic_version.py index 9d5fd39a4c03..558c8aab67c5 100644 --- a/packages/google-area120-tables/google/area120/tables_v1alpha1/gapic_version.py +++ b/packages/google-area120-tables/google/area120/tables_v1alpha1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.11.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_service/client.py b/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_service/client.py index 7bd8ef7f2863..7ffe8fdd3ff9 100644 --- a/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_service/client.py +++ b/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_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 @@ -523,6 +525,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-area120-tables/google/area120/tables_v1alpha1/services/tables_service/transports/rest.py b/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_service/transports/rest.py index deb037e7c0af..5037e83a8806 100644 --- a/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_service/transports/rest.py +++ b/packages/google-area120-tables/google/area120/tables_v1alpha1/services/tables_service/transports/rest.py @@ -180,12 +180,35 @@ def post_batch_create_rows( ) -> tables.BatchCreateRowsResponse: """Post-rpc interceptor for batch_create_rows - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_rows_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_rows` interceptor runs + before the `post_batch_create_rows_with_metadata` interceptor. """ return response + def post_batch_create_rows_with_metadata( + self, + response: tables.BatchCreateRowsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tables.BatchCreateRowsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_create_rows + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_batch_create_rows_with_metadata` + interceptor in new development instead of the `post_batch_create_rows` interceptor. + When both interceptors are used, this `post_batch_create_rows_with_metadata` interceptor runs after the + `post_batch_create_rows` interceptor. The (possibly modified) response returned by + `post_batch_create_rows` will be passed to + `post_batch_create_rows_with_metadata`. + """ + return response, metadata + def pre_batch_delete_rows( self, request: tables.BatchDeleteRowsRequest, @@ -215,12 +238,35 @@ def post_batch_update_rows( ) -> tables.BatchUpdateRowsResponse: """Post-rpc interceptor for batch_update_rows - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_rows_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_rows` interceptor runs + before the `post_batch_update_rows_with_metadata` interceptor. """ return response + def post_batch_update_rows_with_metadata( + self, + response: tables.BatchUpdateRowsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tables.BatchUpdateRowsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_update_rows + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_batch_update_rows_with_metadata` + interceptor in new development instead of the `post_batch_update_rows` interceptor. + When both interceptors are used, this `post_batch_update_rows_with_metadata` interceptor runs after the + `post_batch_update_rows` interceptor. The (possibly modified) response returned by + `post_batch_update_rows` will be passed to + `post_batch_update_rows_with_metadata`. + """ + return response, metadata + def pre_create_row( self, request: tables.CreateRowRequest, @@ -236,12 +282,33 @@ def pre_create_row( def post_create_row(self, response: tables.Row) -> tables.Row: """Post-rpc interceptor for create_row - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_row_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_create_row` interceptor runs + before the `post_create_row_with_metadata` interceptor. """ return response + def post_create_row_with_metadata( + self, response: tables.Row, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[tables.Row, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_row + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_create_row_with_metadata` + interceptor in new development instead of the `post_create_row` interceptor. + When both interceptors are used, this `post_create_row_with_metadata` interceptor runs after the + `post_create_row` interceptor. The (possibly modified) response returned by + `post_create_row` will be passed to + `post_create_row_with_metadata`. + """ + return response, metadata + def pre_delete_row( self, request: tables.DeleteRowRequest, @@ -269,12 +336,33 @@ def pre_get_row( def post_get_row(self, response: tables.Row) -> tables.Row: """Post-rpc interceptor for get_row - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_row_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_get_row` interceptor runs + before the `post_get_row_with_metadata` interceptor. """ return response + def post_get_row_with_metadata( + self, response: tables.Row, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[tables.Row, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_row + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_get_row_with_metadata` + interceptor in new development instead of the `post_get_row` interceptor. + When both interceptors are used, this `post_get_row_with_metadata` interceptor runs after the + `post_get_row` interceptor. The (possibly modified) response returned by + `post_get_row` will be passed to + `post_get_row_with_metadata`. + """ + return response, metadata + def pre_get_table( self, request: tables.GetTableRequest, @@ -290,12 +378,33 @@ def pre_get_table( def post_get_table(self, response: tables.Table) -> tables.Table: """Post-rpc interceptor for get_table - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_table_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_get_table` interceptor runs + before the `post_get_table_with_metadata` interceptor. """ return response + def post_get_table_with_metadata( + self, response: tables.Table, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[tables.Table, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_table + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_get_table_with_metadata` + interceptor in new development instead of the `post_get_table` interceptor. + When both interceptors are used, this `post_get_table_with_metadata` interceptor runs after the + `post_get_table` interceptor. The (possibly modified) response returned by + `post_get_table` will be passed to + `post_get_table_with_metadata`. + """ + return response, metadata + def pre_get_workspace( self, request: tables.GetWorkspaceRequest, @@ -311,12 +420,35 @@ def pre_get_workspace( def post_get_workspace(self, response: tables.Workspace) -> tables.Workspace: """Post-rpc interceptor for get_workspace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_workspace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_get_workspace` interceptor runs + before the `post_get_workspace_with_metadata` interceptor. """ return response + def post_get_workspace_with_metadata( + self, + response: tables.Workspace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tables.Workspace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_workspace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_get_workspace_with_metadata` + interceptor in new development instead of the `post_get_workspace` interceptor. + When both interceptors are used, this `post_get_workspace_with_metadata` interceptor runs after the + `post_get_workspace` interceptor. The (possibly modified) response returned by + `post_get_workspace` will be passed to + `post_get_workspace_with_metadata`. + """ + return response, metadata + def pre_list_rows( self, request: tables.ListRowsRequest, @@ -334,12 +466,35 @@ def post_list_rows( ) -> tables.ListRowsResponse: """Post-rpc interceptor for list_rows - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_rows_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_list_rows` interceptor runs + before the `post_list_rows_with_metadata` interceptor. """ return response + def post_list_rows_with_metadata( + self, + response: tables.ListRowsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tables.ListRowsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_rows + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_list_rows_with_metadata` + interceptor in new development instead of the `post_list_rows` interceptor. + When both interceptors are used, this `post_list_rows_with_metadata` interceptor runs after the + `post_list_rows` interceptor. The (possibly modified) response returned by + `post_list_rows` will be passed to + `post_list_rows_with_metadata`. + """ + return response, metadata + def pre_list_tables( self, request: tables.ListTablesRequest, @@ -357,12 +512,35 @@ def post_list_tables( ) -> tables.ListTablesResponse: """Post-rpc interceptor for list_tables - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tables_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_list_tables` interceptor runs + before the `post_list_tables_with_metadata` interceptor. """ return response + def post_list_tables_with_metadata( + self, + response: tables.ListTablesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tables.ListTablesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_tables + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_list_tables_with_metadata` + interceptor in new development instead of the `post_list_tables` interceptor. + When both interceptors are used, this `post_list_tables_with_metadata` interceptor runs after the + `post_list_tables` interceptor. The (possibly modified) response returned by + `post_list_tables` will be passed to + `post_list_tables_with_metadata`. + """ + return response, metadata + def pre_list_workspaces( self, request: tables.ListWorkspacesRequest, @@ -380,12 +558,35 @@ def post_list_workspaces( ) -> tables.ListWorkspacesResponse: """Post-rpc interceptor for list_workspaces - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_workspaces_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_list_workspaces` interceptor runs + before the `post_list_workspaces_with_metadata` interceptor. """ return response + def post_list_workspaces_with_metadata( + self, + response: tables.ListWorkspacesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tables.ListWorkspacesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_workspaces + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_list_workspaces_with_metadata` + interceptor in new development instead of the `post_list_workspaces` interceptor. + When both interceptors are used, this `post_list_workspaces_with_metadata` interceptor runs after the + `post_list_workspaces` interceptor. The (possibly modified) response returned by + `post_list_workspaces` will be passed to + `post_list_workspaces_with_metadata`. + """ + return response, metadata + def pre_update_row( self, request: tables.UpdateRowRequest, @@ -401,12 +602,33 @@ def pre_update_row( def post_update_row(self, response: tables.Row) -> tables.Row: """Post-rpc interceptor for update_row - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_row_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TablesService server but before - it is returned to user code. + it is returned to user code. This `post_update_row` interceptor runs + before the `post_update_row_with_metadata` interceptor. """ return response + def post_update_row_with_metadata( + self, response: tables.Row, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[tables.Row, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_row + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TablesService server but before it is returned to user code. + + We recommend only using this `post_update_row_with_metadata` + interceptor in new development instead of the `post_update_row` interceptor. + When both interceptors are used, this `post_update_row_with_metadata` interceptor runs after the + `post_update_row` interceptor. The (possibly modified) response returned by + `post_update_row` will be passed to + `post_update_row_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TablesServiceRestStub: @@ -635,6 +857,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_rows(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_rows_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -901,6 +1127,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_rows(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_update_rows_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1054,6 +1284,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_row(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_row_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1308,6 +1542,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_row(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_row_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1453,6 +1691,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_table(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_table_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1594,6 +1836,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_workspace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_workspace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1741,6 +1987,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_rows(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_rows_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1888,6 +2138,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tables(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tables_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2031,6 +2285,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_workspaces(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_workspaces_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2184,6 +2442,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_row(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_row_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-area120-tables/samples/generated_samples/snippet_metadata_google.area120.tables.v1alpha1.json b/packages/google-area120-tables/samples/generated_samples/snippet_metadata_google.area120.tables.v1alpha1.json index c10d607058a5..5a5c20778494 100644 --- a/packages/google-area120-tables/samples/generated_samples/snippet_metadata_google.area120.tables.v1alpha1.json +++ b/packages/google-area120-tables/samples/generated_samples/snippet_metadata_google.area120.tables.v1alpha1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-area120-tables", - "version": "0.11.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-area120-tables/tests/unit/gapic/tables_v1alpha1/test_tables_service.py b/packages/google-area120-tables/tests/unit/gapic/tables_v1alpha1/test_tables_service.py index 42cb49517258..baab63d7465b 100644 --- a/packages/google-area120-tables/tests/unit/gapic/tables_v1alpha1/test_tables_service.py +++ b/packages/google-area120-tables/tests/unit/gapic/tables_v1alpha1/test_tables_service.py @@ -62,6 +62,13 @@ ) from google.area120.tables_v1alpha1.types import tables +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 = TablesServiceClient(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 = TablesServiceClient(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", [ @@ -7679,10 +7729,13 @@ def test_get_table_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_get_table" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_get_table_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_get_table" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.GetTableRequest.pb(tables.GetTableRequest()) transcode.return_value = { "method": "post", @@ -7704,6 +7757,7 @@ def test_get_table_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.Table() + post_with_metadata.return_value = tables.Table(), metadata client.get_table( request, @@ -7715,6 +7769,7 @@ def test_get_table_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tables_rest_bad_request(request_type=tables.ListTablesRequest): @@ -7797,10 +7852,13 @@ def test_list_tables_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_list_tables" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_list_tables_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_list_tables" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.ListTablesRequest.pb(tables.ListTablesRequest()) transcode.return_value = { "method": "post", @@ -7822,6 +7880,7 @@ def test_list_tables_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.ListTablesResponse() + post_with_metadata.return_value = tables.ListTablesResponse(), metadata client.list_tables( request, @@ -7833,6 +7892,7 @@ def test_list_tables_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_workspace_rest_bad_request(request_type=tables.GetWorkspaceRequest): @@ -7917,10 +7977,13 @@ def test_get_workspace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_get_workspace" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_get_workspace_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_get_workspace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.GetWorkspaceRequest.pb(tables.GetWorkspaceRequest()) transcode.return_value = { "method": "post", @@ -7942,6 +8005,7 @@ def test_get_workspace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.Workspace() + post_with_metadata.return_value = tables.Workspace(), metadata client.get_workspace( request, @@ -7953,6 +8017,7 @@ def test_get_workspace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_workspaces_rest_bad_request(request_type=tables.ListWorkspacesRequest): @@ -8035,10 +8100,13 @@ def test_list_workspaces_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_list_workspaces" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_list_workspaces_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_list_workspaces" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.ListWorkspacesRequest.pb(tables.ListWorkspacesRequest()) transcode.return_value = { "method": "post", @@ -8062,6 +8130,7 @@ def test_list_workspaces_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.ListWorkspacesResponse() + post_with_metadata.return_value = tables.ListWorkspacesResponse(), metadata client.list_workspaces( request, @@ -8073,6 +8142,7 @@ def test_list_workspaces_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_row_rest_bad_request(request_type=tables.GetRowRequest): @@ -8155,10 +8225,13 @@ def test_get_row_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_get_row" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_get_row_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_get_row" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.GetRowRequest.pb(tables.GetRowRequest()) transcode.return_value = { "method": "post", @@ -8180,6 +8253,7 @@ def test_get_row_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.Row() + post_with_metadata.return_value = tables.Row(), metadata client.get_row( request, @@ -8191,6 +8265,7 @@ def test_get_row_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rows_rest_bad_request(request_type=tables.ListRowsRequest): @@ -8273,10 +8348,13 @@ def test_list_rows_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_list_rows" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_list_rows_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_list_rows" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.ListRowsRequest.pb(tables.ListRowsRequest()) transcode.return_value = { "method": "post", @@ -8298,6 +8376,7 @@ def test_list_rows_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.ListRowsResponse() + post_with_metadata.return_value = tables.ListRowsResponse(), metadata client.list_rows( request, @@ -8309,6 +8388,7 @@ def test_list_rows_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_row_rest_bad_request(request_type=tables.CreateRowRequest): @@ -8459,10 +8539,13 @@ def test_create_row_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_create_row" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_create_row_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_create_row" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.CreateRowRequest.pb(tables.CreateRowRequest()) transcode.return_value = { "method": "post", @@ -8484,6 +8567,7 @@ def test_create_row_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.Row() + post_with_metadata.return_value = tables.Row(), metadata client.create_row( request, @@ -8495,6 +8579,7 @@ def test_create_row_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_rows_rest_bad_request(request_type=tables.BatchCreateRowsRequest): @@ -8574,10 +8659,13 @@ def test_batch_create_rows_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_batch_create_rows" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_batch_create_rows_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_batch_create_rows" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.BatchCreateRowsRequest.pb(tables.BatchCreateRowsRequest()) transcode.return_value = { "method": "post", @@ -8601,6 +8689,7 @@ def test_batch_create_rows_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.BatchCreateRowsResponse() + post_with_metadata.return_value = tables.BatchCreateRowsResponse(), metadata client.batch_create_rows( request, @@ -8612,6 +8701,7 @@ def test_batch_create_rows_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_row_rest_bad_request(request_type=tables.UpdateRowRequest): @@ -8762,10 +8852,13 @@ def test_update_row_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_update_row" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_update_row_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_update_row" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.UpdateRowRequest.pb(tables.UpdateRowRequest()) transcode.return_value = { "method": "post", @@ -8787,6 +8880,7 @@ def test_update_row_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.Row() + post_with_metadata.return_value = tables.Row(), metadata client.update_row( request, @@ -8798,6 +8892,7 @@ def test_update_row_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_rows_rest_bad_request(request_type=tables.BatchUpdateRowsRequest): @@ -8877,10 +8972,13 @@ def test_batch_update_rows_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TablesServiceRestInterceptor, "post_batch_update_rows" ) as post, mock.patch.object( + transports.TablesServiceRestInterceptor, "post_batch_update_rows_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TablesServiceRestInterceptor, "pre_batch_update_rows" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tables.BatchUpdateRowsRequest.pb(tables.BatchUpdateRowsRequest()) transcode.return_value = { "method": "post", @@ -8904,6 +9002,7 @@ def test_batch_update_rows_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tables.BatchUpdateRowsResponse() + post_with_metadata.return_value = tables.BatchUpdateRowsResponse(), metadata client.batch_update_rows( request, @@ -8915,6 +9014,7 @@ def test_batch_update_rows_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_row_rest_bad_request(request_type=tables.DeleteRowRequest): diff --git a/packages/google-cloud-access-approval/google/cloud/accessapproval/gapic_version.py b/packages/google-cloud-access-approval/google/cloud/accessapproval/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-access-approval/google/cloud/accessapproval/gapic_version.py +++ b/packages/google-cloud-access-approval/google/cloud/accessapproval/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-access-approval/google/cloud/accessapproval_v1/gapic_version.py b/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/gapic_version.py +++ b/packages/google-cloud-access-approval/google/cloud/accessapproval_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-access-approval/google/cloud/accessapproval_v1/services/access_approval/client.py b/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/client.py index 118cb667f0e3..daa3028e3f36 100644 --- a/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/client.py +++ b/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/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 @@ -550,6 +552,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-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/rest.py b/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/rest.py index 3b84b1ddbf03..8aa6456a71db 100644 --- a/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/rest.py +++ b/packages/google-cloud-access-approval/google/cloud/accessapproval_v1/services/access_approval/transports/rest.py @@ -163,12 +163,35 @@ def post_approve_approval_request( ) -> accessapproval.ApprovalRequest: """Post-rpc interceptor for approve_approval_request - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_approve_approval_request_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_approve_approval_request` interceptor runs + before the `post_approve_approval_request_with_metadata` interceptor. """ return response + def post_approve_approval_request_with_metadata( + self, + response: accessapproval.ApprovalRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[accessapproval.ApprovalRequest, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for approve_approval_request + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_approve_approval_request_with_metadata` + interceptor in new development instead of the `post_approve_approval_request` interceptor. + When both interceptors are used, this `post_approve_approval_request_with_metadata` interceptor runs after the + `post_approve_approval_request` interceptor. The (possibly modified) response returned by + `post_approve_approval_request` will be passed to + `post_approve_approval_request_with_metadata`. + """ + return response, metadata + def pre_delete_access_approval_settings( self, request: accessapproval.DeleteAccessApprovalSettingsMessage, @@ -204,12 +227,35 @@ def post_dismiss_approval_request( ) -> accessapproval.ApprovalRequest: """Post-rpc interceptor for dismiss_approval_request - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_dismiss_approval_request_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_dismiss_approval_request` interceptor runs + before the `post_dismiss_approval_request_with_metadata` interceptor. """ return response + def post_dismiss_approval_request_with_metadata( + self, + response: accessapproval.ApprovalRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[accessapproval.ApprovalRequest, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for dismiss_approval_request + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_dismiss_approval_request_with_metadata` + interceptor in new development instead of the `post_dismiss_approval_request` interceptor. + When both interceptors are used, this `post_dismiss_approval_request_with_metadata` interceptor runs after the + `post_dismiss_approval_request` interceptor. The (possibly modified) response returned by + `post_dismiss_approval_request` will be passed to + `post_dismiss_approval_request_with_metadata`. + """ + return response, metadata + def pre_get_access_approval_service_account( self, request: accessapproval.GetAccessApprovalServiceAccountMessage, @@ -230,12 +276,38 @@ def post_get_access_approval_service_account( ) -> accessapproval.AccessApprovalServiceAccount: """Post-rpc interceptor for get_access_approval_service_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_access_approval_service_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_get_access_approval_service_account` interceptor runs + before the `post_get_access_approval_service_account_with_metadata` interceptor. """ return response + def post_get_access_approval_service_account_with_metadata( + self, + response: accessapproval.AccessApprovalServiceAccount, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + accessapproval.AccessApprovalServiceAccount, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_access_approval_service_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_get_access_approval_service_account_with_metadata` + interceptor in new development instead of the `post_get_access_approval_service_account` interceptor. + When both interceptors are used, this `post_get_access_approval_service_account_with_metadata` interceptor runs after the + `post_get_access_approval_service_account` interceptor. The (possibly modified) response returned by + `post_get_access_approval_service_account` will be passed to + `post_get_access_approval_service_account_with_metadata`. + """ + return response, metadata + def pre_get_access_approval_settings( self, request: accessapproval.GetAccessApprovalSettingsMessage, @@ -256,12 +328,37 @@ def post_get_access_approval_settings( ) -> accessapproval.AccessApprovalSettings: """Post-rpc interceptor for get_access_approval_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_access_approval_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_get_access_approval_settings` interceptor runs + before the `post_get_access_approval_settings_with_metadata` interceptor. """ return response + def post_get_access_approval_settings_with_metadata( + self, + response: accessapproval.AccessApprovalSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + accessapproval.AccessApprovalSettings, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_access_approval_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_get_access_approval_settings_with_metadata` + interceptor in new development instead of the `post_get_access_approval_settings` interceptor. + When both interceptors are used, this `post_get_access_approval_settings_with_metadata` interceptor runs after the + `post_get_access_approval_settings` interceptor. The (possibly modified) response returned by + `post_get_access_approval_settings` will be passed to + `post_get_access_approval_settings_with_metadata`. + """ + return response, metadata + def pre_get_approval_request( self, request: accessapproval.GetApprovalRequestMessage, @@ -282,12 +379,35 @@ def post_get_approval_request( ) -> accessapproval.ApprovalRequest: """Post-rpc interceptor for get_approval_request - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_approval_request_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_get_approval_request` interceptor runs + before the `post_get_approval_request_with_metadata` interceptor. """ return response + def post_get_approval_request_with_metadata( + self, + response: accessapproval.ApprovalRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[accessapproval.ApprovalRequest, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_approval_request + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_get_approval_request_with_metadata` + interceptor in new development instead of the `post_get_approval_request` interceptor. + When both interceptors are used, this `post_get_approval_request_with_metadata` interceptor runs after the + `post_get_approval_request` interceptor. The (possibly modified) response returned by + `post_get_approval_request` will be passed to + `post_get_approval_request_with_metadata`. + """ + return response, metadata + def pre_invalidate_approval_request( self, request: accessapproval.InvalidateApprovalRequestMessage, @@ -308,12 +428,35 @@ def post_invalidate_approval_request( ) -> accessapproval.ApprovalRequest: """Post-rpc interceptor for invalidate_approval_request - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_invalidate_approval_request_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_invalidate_approval_request` interceptor runs + before the `post_invalidate_approval_request_with_metadata` interceptor. """ return response + def post_invalidate_approval_request_with_metadata( + self, + response: accessapproval.ApprovalRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[accessapproval.ApprovalRequest, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for invalidate_approval_request + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_invalidate_approval_request_with_metadata` + interceptor in new development instead of the `post_invalidate_approval_request` interceptor. + When both interceptors are used, this `post_invalidate_approval_request_with_metadata` interceptor runs after the + `post_invalidate_approval_request` interceptor. The (possibly modified) response returned by + `post_invalidate_approval_request` will be passed to + `post_invalidate_approval_request_with_metadata`. + """ + return response, metadata + def pre_list_approval_requests( self, request: accessapproval.ListApprovalRequestsMessage, @@ -334,12 +477,38 @@ def post_list_approval_requests( ) -> accessapproval.ListApprovalRequestsResponse: """Post-rpc interceptor for list_approval_requests - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_approval_requests_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_list_approval_requests` interceptor runs + before the `post_list_approval_requests_with_metadata` interceptor. """ return response + def post_list_approval_requests_with_metadata( + self, + response: accessapproval.ListApprovalRequestsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + accessapproval.ListApprovalRequestsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_approval_requests + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_list_approval_requests_with_metadata` + interceptor in new development instead of the `post_list_approval_requests` interceptor. + When both interceptors are used, this `post_list_approval_requests_with_metadata` interceptor runs after the + `post_list_approval_requests` interceptor. The (possibly modified) response returned by + `post_list_approval_requests` will be passed to + `post_list_approval_requests_with_metadata`. + """ + return response, metadata + def pre_update_access_approval_settings( self, request: accessapproval.UpdateAccessApprovalSettingsMessage, @@ -360,12 +529,37 @@ def post_update_access_approval_settings( ) -> accessapproval.AccessApprovalSettings: """Post-rpc interceptor for update_access_approval_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_access_approval_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AccessApproval server but before - it is returned to user code. + it is returned to user code. This `post_update_access_approval_settings` interceptor runs + before the `post_update_access_approval_settings_with_metadata` interceptor. """ return response + def post_update_access_approval_settings_with_metadata( + self, + response: accessapproval.AccessApprovalSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + accessapproval.AccessApprovalSettings, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_access_approval_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AccessApproval server but before it is returned to user code. + + We recommend only using this `post_update_access_approval_settings_with_metadata` + interceptor in new development instead of the `post_update_access_approval_settings` interceptor. + When both interceptors are used, this `post_update_access_approval_settings_with_metadata` interceptor runs after the + `post_update_access_approval_settings` interceptor. The (possibly modified) response returned by + `post_update_access_approval_settings` will be passed to + `post_update_access_approval_settings_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AccessApprovalRestStub: @@ -618,6 +812,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_approve_approval_request(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_approve_approval_request_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -885,6 +1083,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_dismiss_approval_request(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_dismiss_approval_request_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1036,6 +1238,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_access_approval_service_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_access_approval_service_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1188,6 +1397,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_access_approval_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_access_approval_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1334,6 +1547,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_approval_request(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_approval_request_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1489,6 +1706,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_invalidate_approval_request(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_invalidate_approval_request_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1634,6 +1855,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_approval_requests(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_approval_requests_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1792,6 +2017,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_access_approval_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_access_approval_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-access-approval/samples/generated_samples/snippet_metadata_google.cloud.accessapproval.v1.json b/packages/google-cloud-access-approval/samples/generated_samples/snippet_metadata_google.cloud.accessapproval.v1.json index b5873343671b..b3ec8896db77 100644 --- a/packages/google-cloud-access-approval/samples/generated_samples/snippet_metadata_google.cloud.accessapproval.v1.json +++ b/packages/google-cloud-access-approval/samples/generated_samples/snippet_metadata_google.cloud.accessapproval.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-access-approval", - "version": "1.15.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-access-approval/tests/unit/gapic/accessapproval_v1/test_access_approval.py b/packages/google-cloud-access-approval/tests/unit/gapic/accessapproval_v1/test_access_approval.py index f81e6a845b87..25a31f555255 100644 --- a/packages/google-cloud-access-approval/tests/unit/gapic/accessapproval_v1/test_access_approval.py +++ b/packages/google-cloud-access-approval/tests/unit/gapic/accessapproval_v1/test_access_approval.py @@ -62,6 +62,13 @@ ) from google.cloud.accessapproval_v1.types import accessapproval +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -320,6 +327,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AccessApprovalClient(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 = AccessApprovalClient(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", [ @@ -5615,10 +5665,14 @@ def test_list_approval_requests_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_list_approval_requests" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_list_approval_requests_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_list_approval_requests" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.ListApprovalRequestsMessage.pb( accessapproval.ListApprovalRequestsMessage() ) @@ -5644,6 +5698,10 @@ def test_list_approval_requests_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.ListApprovalRequestsResponse() + post_with_metadata.return_value = ( + accessapproval.ListApprovalRequestsResponse(), + metadata, + ) client.list_approval_requests( request, @@ -5655,6 +5713,7 @@ def test_list_approval_requests_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_approval_request_rest_bad_request( @@ -5741,10 +5800,14 @@ def test_get_approval_request_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_get_approval_request" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_get_approval_request_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_get_approval_request" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.GetApprovalRequestMessage.pb( accessapproval.GetApprovalRequestMessage() ) @@ -5770,6 +5833,7 @@ def test_get_approval_request_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.ApprovalRequest() + post_with_metadata.return_value = accessapproval.ApprovalRequest(), metadata client.get_approval_request( request, @@ -5781,6 +5845,7 @@ def test_get_approval_request_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_approve_approval_request_rest_bad_request( @@ -5867,10 +5932,14 @@ def test_approve_approval_request_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_approve_approval_request" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_approve_approval_request_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_approve_approval_request" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.ApproveApprovalRequestMessage.pb( accessapproval.ApproveApprovalRequestMessage() ) @@ -5896,6 +5965,7 @@ def test_approve_approval_request_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.ApprovalRequest() + post_with_metadata.return_value = accessapproval.ApprovalRequest(), metadata client.approve_approval_request( request, @@ -5907,6 +5977,7 @@ def test_approve_approval_request_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_dismiss_approval_request_rest_bad_request( @@ -5993,10 +6064,14 @@ def test_dismiss_approval_request_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_dismiss_approval_request" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_dismiss_approval_request_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_dismiss_approval_request" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.DismissApprovalRequestMessage.pb( accessapproval.DismissApprovalRequestMessage() ) @@ -6022,6 +6097,7 @@ def test_dismiss_approval_request_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.ApprovalRequest() + post_with_metadata.return_value = accessapproval.ApprovalRequest(), metadata client.dismiss_approval_request( request, @@ -6033,6 +6109,7 @@ def test_dismiss_approval_request_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_invalidate_approval_request_rest_bad_request( @@ -6119,10 +6196,14 @@ def test_invalidate_approval_request_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_invalidate_approval_request" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_invalidate_approval_request_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_invalidate_approval_request" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.InvalidateApprovalRequestMessage.pb( accessapproval.InvalidateApprovalRequestMessage() ) @@ -6148,6 +6229,7 @@ def test_invalidate_approval_request_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.ApprovalRequest() + post_with_metadata.return_value = accessapproval.ApprovalRequest(), metadata client.invalidate_approval_request( request, @@ -6159,6 +6241,7 @@ def test_invalidate_approval_request_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_access_approval_settings_rest_bad_request( @@ -6253,10 +6336,14 @@ def test_get_access_approval_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_get_access_approval_settings" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_get_access_approval_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_get_access_approval_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.GetAccessApprovalSettingsMessage.pb( accessapproval.GetAccessApprovalSettingsMessage() ) @@ -6282,6 +6369,10 @@ def test_get_access_approval_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.AccessApprovalSettings() + post_with_metadata.return_value = ( + accessapproval.AccessApprovalSettings(), + metadata, + ) client.get_access_approval_settings( request, @@ -6293,6 +6384,7 @@ def test_get_access_approval_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_access_approval_settings_rest_bad_request( @@ -6470,10 +6562,14 @@ def test_update_access_approval_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AccessApprovalRestInterceptor, "post_update_access_approval_settings" ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_update_access_approval_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_update_access_approval_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.UpdateAccessApprovalSettingsMessage.pb( accessapproval.UpdateAccessApprovalSettingsMessage() ) @@ -6499,6 +6595,10 @@ def test_update_access_approval_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = accessapproval.AccessApprovalSettings() + post_with_metadata.return_value = ( + accessapproval.AccessApprovalSettings(), + metadata, + ) client.update_access_approval_settings( request, @@ -6510,6 +6610,7 @@ def test_update_access_approval_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_access_approval_settings_rest_bad_request( @@ -6706,11 +6807,15 @@ def test_get_access_approval_service_account_rest_interceptors(null_interceptor) transports.AccessApprovalRestInterceptor, "post_get_access_approval_service_account", ) as post, mock.patch.object( + transports.AccessApprovalRestInterceptor, + "post_get_access_approval_service_account_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AccessApprovalRestInterceptor, "pre_get_access_approval_service_account", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = accessapproval.GetAccessApprovalServiceAccountMessage.pb( accessapproval.GetAccessApprovalServiceAccountMessage() ) @@ -6736,6 +6841,10 @@ def test_get_access_approval_service_account_rest_interceptors(null_interceptor) ] pre.return_value = request, metadata post.return_value = accessapproval.AccessApprovalServiceAccount() + post_with_metadata.return_value = ( + accessapproval.AccessApprovalServiceAccount(), + metadata, + ) client.get_access_approval_service_account( request, @@ -6747,6 +6856,7 @@ def test_get_access_approval_service_account_rest_interceptors(null_interceptor) pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications/gapic_version.py b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications/gapic_version.py index fb3463bbb3c2..558c8aab67c5 100644 --- a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications/gapic_version.py +++ b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.13" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/gapic_version.py b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/gapic_version.py index fb3463bbb3c2..558c8aab67c5 100644 --- a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/gapic_version.py +++ b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.13" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/client.py b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/client.py index d07a0bfcddd5..e9196e1357c7 100644 --- a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/client.py +++ b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -514,6 +516,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/transports/rest.py b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/transports/rest.py index 6cb2747c75b4..e2e3b223030d 100644 --- a/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/transports/rest.py +++ b/packages/google-cloud-advisorynotifications/google/cloud/advisorynotifications_v1/services/advisory_notifications_service/transports/rest.py @@ -123,12 +123,35 @@ def post_get_notification( ) -> service.Notification: """Post-rpc interceptor for get_notification - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_notification_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdvisoryNotificationsService server but before - it is returned to user code. + it is returned to user code. This `post_get_notification` interceptor runs + before the `post_get_notification_with_metadata` interceptor. """ return response + def post_get_notification_with_metadata( + self, + response: service.Notification, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Notification, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_notification + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdvisoryNotificationsService server but before it is returned to user code. + + We recommend only using this `post_get_notification_with_metadata` + interceptor in new development instead of the `post_get_notification` interceptor. + When both interceptors are used, this `post_get_notification_with_metadata` interceptor runs after the + `post_get_notification` interceptor. The (possibly modified) response returned by + `post_get_notification` will be passed to + `post_get_notification_with_metadata`. + """ + return response, metadata + def pre_get_settings( self, request: service.GetSettingsRequest, @@ -144,12 +167,35 @@ def pre_get_settings( def post_get_settings(self, response: service.Settings) -> service.Settings: """Post-rpc interceptor for get_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdvisoryNotificationsService server but before - it is returned to user code. + it is returned to user code. This `post_get_settings` interceptor runs + before the `post_get_settings_with_metadata` interceptor. """ return response + def post_get_settings_with_metadata( + self, + response: service.Settings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Settings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdvisoryNotificationsService server but before it is returned to user code. + + We recommend only using this `post_get_settings_with_metadata` + interceptor in new development instead of the `post_get_settings` interceptor. + When both interceptors are used, this `post_get_settings_with_metadata` interceptor runs after the + `post_get_settings` interceptor. The (possibly modified) response returned by + `post_get_settings` will be passed to + `post_get_settings_with_metadata`. + """ + return response, metadata + def pre_list_notifications( self, request: service.ListNotificationsRequest, @@ -169,12 +215,37 @@ def post_list_notifications( ) -> service.ListNotificationsResponse: """Post-rpc interceptor for list_notifications - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_notifications_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdvisoryNotificationsService server but before - it is returned to user code. + it is returned to user code. This `post_list_notifications` interceptor runs + before the `post_list_notifications_with_metadata` interceptor. """ return response + def post_list_notifications_with_metadata( + self, + response: service.ListNotificationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListNotificationsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_notifications + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdvisoryNotificationsService server but before it is returned to user code. + + We recommend only using this `post_list_notifications_with_metadata` + interceptor in new development instead of the `post_list_notifications` interceptor. + When both interceptors are used, this `post_list_notifications_with_metadata` interceptor runs after the + `post_list_notifications` interceptor. The (possibly modified) response returned by + `post_list_notifications` will be passed to + `post_list_notifications_with_metadata`. + """ + return response, metadata + def pre_update_settings( self, request: service.UpdateSettingsRequest, @@ -190,12 +261,35 @@ def pre_update_settings( def post_update_settings(self, response: service.Settings) -> service.Settings: """Post-rpc interceptor for update_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AdvisoryNotificationsService server but before - it is returned to user code. + it is returned to user code. This `post_update_settings` interceptor runs + before the `post_update_settings_with_metadata` interceptor. """ return response + def post_update_settings_with_metadata( + self, + response: service.Settings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Settings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AdvisoryNotificationsService server but before it is returned to user code. + + We recommend only using this `post_update_settings_with_metadata` + interceptor in new development instead of the `post_update_settings` interceptor. + When both interceptors are used, this `post_update_settings_with_metadata` interceptor runs after the + `post_update_settings` interceptor. The (possibly modified) response returned by + `post_update_settings` will be passed to + `post_update_settings_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AdvisoryNotificationsServiceRestStub: @@ -408,6 +502,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_notification(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_notification_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -551,6 +649,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -697,6 +799,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_notifications(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_notifications_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -848,6 +954,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-advisorynotifications/samples/generated_samples/snippet_metadata_google.cloud.advisorynotifications.v1.json b/packages/google-cloud-advisorynotifications/samples/generated_samples/snippet_metadata_google.cloud.advisorynotifications.v1.json index 92ef859c8101..6c6bd1f36550 100644 --- a/packages/google-cloud-advisorynotifications/samples/generated_samples/snippet_metadata_google.cloud.advisorynotifications.v1.json +++ b/packages/google-cloud-advisorynotifications/samples/generated_samples/snippet_metadata_google.cloud.advisorynotifications.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-advisorynotifications", - "version": "0.3.13" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-advisorynotifications/tests/unit/gapic/advisorynotifications_v1/test_advisory_notifications_service.py b/packages/google-cloud-advisorynotifications/tests/unit/gapic/advisorynotifications_v1/test_advisory_notifications_service.py index f910f0508058..bbbf908f3343 100644 --- a/packages/google-cloud-advisorynotifications/tests/unit/gapic/advisorynotifications_v1/test_advisory_notifications_service.py +++ b/packages/google-cloud-advisorynotifications/tests/unit/gapic/advisorynotifications_v1/test_advisory_notifications_service.py @@ -61,6 +61,13 @@ ) from google.cloud.advisorynotifications_v1.types import service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = AdvisoryNotificationsServiceClient(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 = AdvisoryNotificationsServiceClient(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", [ @@ -3885,10 +3935,14 @@ def test_list_notifications_rest_interceptors(null_interceptor): transports.AdvisoryNotificationsServiceRestInterceptor, "post_list_notifications", ) as post, mock.patch.object( + transports.AdvisoryNotificationsServiceRestInterceptor, + "post_list_notifications_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "pre_list_notifications" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListNotificationsRequest.pb( service.ListNotificationsRequest() ) @@ -3914,6 +3968,7 @@ def test_list_notifications_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListNotificationsResponse() + post_with_metadata.return_value = service.ListNotificationsResponse(), metadata client.list_notifications( request, @@ -3925,6 +3980,7 @@ def test_list_notifications_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_notification_rest_bad_request(request_type=service.GetNotificationRequest): @@ -4016,10 +4072,14 @@ def test_get_notification_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "post_get_notification" ) as post, mock.patch.object( + transports.AdvisoryNotificationsServiceRestInterceptor, + "post_get_notification_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "pre_get_notification" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetNotificationRequest.pb(service.GetNotificationRequest()) transcode.return_value = { "method": "post", @@ -4041,6 +4101,7 @@ def test_get_notification_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Notification() + post_with_metadata.return_value = service.Notification(), metadata client.get_notification( request, @@ -4052,6 +4113,7 @@ def test_get_notification_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_settings_rest_bad_request(request_type=service.GetSettingsRequest): @@ -4136,10 +4198,14 @@ def test_get_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "post_get_settings" ) as post, mock.patch.object( + transports.AdvisoryNotificationsServiceRestInterceptor, + "post_get_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "pre_get_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSettingsRequest.pb(service.GetSettingsRequest()) transcode.return_value = { "method": "post", @@ -4161,6 +4227,7 @@ def test_get_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Settings() + post_with_metadata.return_value = service.Settings(), metadata client.get_settings( request, @@ -4172,6 +4239,7 @@ def test_get_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_settings_rest_bad_request(request_type=service.UpdateSettingsRequest): @@ -4332,10 +4400,14 @@ def test_update_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "post_update_settings" ) as post, mock.patch.object( + transports.AdvisoryNotificationsServiceRestInterceptor, + "post_update_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AdvisoryNotificationsServiceRestInterceptor, "pre_update_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSettingsRequest.pb(service.UpdateSettingsRequest()) transcode.return_value = { "method": "post", @@ -4357,6 +4429,7 @@ def test_update_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Settings() + post_with_metadata.return_value = service.Settings(), metadata client.update_settings( request, @@ -4368,6 +4441,7 @@ def test_update_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors/gapic_version.py b/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors/gapic_version.py index cf5493b86bbc..558c8aab67c5 100644 --- a/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors/gapic_version.py +++ b/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.7" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors_v1/gapic_version.py b/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors_v1/gapic_version.py index cf5493b86bbc..558c8aab67c5 100644 --- a/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors_v1/gapic_version.py +++ b/packages/google-cloud-alloydb-connectors/google/cloud/alloydb/connectors_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.7" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb/gapic_version.py b/packages/google-cloud-alloydb/google/cloud/alloydb/gapic_version.py index 72f01aec6400..558c8aab67c5 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb/gapic_version.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.4.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb_v1/gapic_version.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1/gapic_version.py index 72f01aec6400..558c8aab67c5 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1/gapic_version.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.4.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/client.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/client.py index 9af3a0a32780..b9f974b9ddc1 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/client.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -677,6 +679,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-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/transports/rest.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/transports/rest.py index faa1b840a61b..83eaa4d7b61e 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/transports/rest.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1/services/alloy_db_admin/transports/rest.py @@ -366,12 +366,35 @@ def post_batch_create_instances( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_create_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_instances` interceptor runs + before the `post_batch_create_instances_with_metadata` interceptor. """ return response + def post_batch_create_instances_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_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_batch_create_instances_with_metadata` + interceptor in new development instead of the `post_batch_create_instances` interceptor. + When both interceptors are used, this `post_batch_create_instances_with_metadata` interceptor runs after the + `post_batch_create_instances` interceptor. The (possibly modified) response returned by + `post_batch_create_instances` will be passed to + `post_batch_create_instances_with_metadata`. + """ + return response, metadata + def pre_create_backup( self, request: service.CreateBackupRequest, @@ -389,12 +412,35 @@ def post_create_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_backup` interceptor runs + before the `post_create_backup_with_metadata` interceptor. """ return response + def post_create_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_backup_with_metadata` + interceptor in new development instead of the `post_create_backup` interceptor. + When both interceptors are used, this `post_create_backup_with_metadata` interceptor runs after the + `post_create_backup` interceptor. The (possibly modified) response returned by + `post_create_backup` will be passed to + `post_create_backup_with_metadata`. + """ + return response, metadata + def pre_create_cluster( self, request: service.CreateClusterRequest, @@ -412,12 +458,35 @@ def post_create_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_cluster` interceptor runs + before the `post_create_cluster_with_metadata` interceptor. """ return response + def post_create_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_cluster_with_metadata` + interceptor in new development instead of the `post_create_cluster` interceptor. + When both interceptors are used, this `post_create_cluster_with_metadata` interceptor runs after the + `post_create_cluster` interceptor. The (possibly modified) response returned by + `post_create_cluster` will be passed to + `post_create_cluster_with_metadata`. + """ + return response, metadata + def pre_create_instance( self, request: service.CreateInstanceRequest, @@ -435,12 +504,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 AlloyDBAdmin 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 AlloyDBAdmin 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_secondary_cluster( self, request: service.CreateSecondaryClusterRequest, @@ -460,12 +552,35 @@ def post_create_secondary_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_secondary_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secondary_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_secondary_cluster` interceptor runs + before the `post_create_secondary_cluster_with_metadata` interceptor. """ return response + def post_create_secondary_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_secondary_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_secondary_cluster_with_metadata` + interceptor in new development instead of the `post_create_secondary_cluster` interceptor. + When both interceptors are used, this `post_create_secondary_cluster_with_metadata` interceptor runs after the + `post_create_secondary_cluster` interceptor. The (possibly modified) response returned by + `post_create_secondary_cluster` will be passed to + `post_create_secondary_cluster_with_metadata`. + """ + return response, metadata + def pre_create_secondary_instance( self, request: service.CreateSecondaryInstanceRequest, @@ -485,12 +600,35 @@ def post_create_secondary_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_secondary_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secondary_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_secondary_instance` interceptor runs + before the `post_create_secondary_instance_with_metadata` interceptor. """ return response + def post_create_secondary_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_secondary_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_secondary_instance_with_metadata` + interceptor in new development instead of the `post_create_secondary_instance` interceptor. + When both interceptors are used, this `post_create_secondary_instance_with_metadata` interceptor runs after the + `post_create_secondary_instance` interceptor. The (possibly modified) response returned by + `post_create_secondary_instance` will be passed to + `post_create_secondary_instance_with_metadata`. + """ + return response, metadata + def pre_create_user( self, request: service.CreateUserRequest, @@ -506,12 +644,35 @@ def pre_create_user( def post_create_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for create_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_user` interceptor runs + before the `post_create_user_with_metadata` interceptor. """ return response + def post_create_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_user_with_metadata` + interceptor in new development instead of the `post_create_user` interceptor. + When both interceptors are used, this `post_create_user_with_metadata` interceptor runs after the + `post_create_user` interceptor. The (possibly modified) response returned by + `post_create_user` will be passed to + `post_create_user_with_metadata`. + """ + return response, metadata + def pre_delete_backup( self, request: service.DeleteBackupRequest, @@ -529,12 +690,35 @@ def post_delete_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_delete_backup` interceptor runs + before the `post_delete_backup_with_metadata` interceptor. """ return response + def post_delete_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_delete_backup_with_metadata` + interceptor in new development instead of the `post_delete_backup` interceptor. + When both interceptors are used, this `post_delete_backup_with_metadata` interceptor runs after the + `post_delete_backup` interceptor. The (possibly modified) response returned by + `post_delete_backup` will be passed to + `post_delete_backup_with_metadata`. + """ + return response, metadata + def pre_delete_cluster( self, request: service.DeleteClusterRequest, @@ -552,12 +736,35 @@ def post_delete_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_delete_cluster` interceptor runs + before the `post_delete_cluster_with_metadata` interceptor. """ return response + def post_delete_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_delete_cluster_with_metadata` + interceptor in new development instead of the `post_delete_cluster` interceptor. + When both interceptors are used, this `post_delete_cluster_with_metadata` interceptor runs after the + `post_delete_cluster` interceptor. The (possibly modified) response returned by + `post_delete_cluster` will be passed to + `post_delete_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: service.DeleteInstanceRequest, @@ -575,12 +782,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 AlloyDBAdmin 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 AlloyDBAdmin 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_user( self, request: service.DeleteUserRequest, @@ -610,12 +840,35 @@ def post_execute_sql( ) -> service.ExecuteSqlResponse: """Post-rpc interceptor for execute_sql - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_execute_sql_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_execute_sql` interceptor runs + before the `post_execute_sql_with_metadata` interceptor. """ return response + def post_execute_sql_with_metadata( + self, + response: service.ExecuteSqlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ExecuteSqlResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for execute_sql + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_execute_sql_with_metadata` + interceptor in new development instead of the `post_execute_sql` interceptor. + When both interceptors are used, this `post_execute_sql_with_metadata` interceptor runs after the + `post_execute_sql` interceptor. The (possibly modified) response returned by + `post_execute_sql` will be passed to + `post_execute_sql_with_metadata`. + """ + return response, metadata + def pre_failover_instance( self, request: service.FailoverInstanceRequest, @@ -635,12 +888,35 @@ def post_failover_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for failover_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_failover_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_failover_instance` interceptor runs + before the `post_failover_instance_with_metadata` interceptor. """ return response + def post_failover_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 failover_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_failover_instance_with_metadata` + interceptor in new development instead of the `post_failover_instance` interceptor. + When both interceptors are used, this `post_failover_instance_with_metadata` interceptor runs after the + `post_failover_instance` interceptor. The (possibly modified) response returned by + `post_failover_instance` will be passed to + `post_failover_instance_with_metadata`. + """ + return response, metadata + def pre_generate_client_certificate( self, request: service.GenerateClientCertificateRequest, @@ -661,12 +937,38 @@ def post_generate_client_certificate( ) -> service.GenerateClientCertificateResponse: """Post-rpc interceptor for generate_client_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_client_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_generate_client_certificate` interceptor runs + before the `post_generate_client_certificate_with_metadata` interceptor. """ return response + def post_generate_client_certificate_with_metadata( + self, + response: service.GenerateClientCertificateResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.GenerateClientCertificateResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_client_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_generate_client_certificate_with_metadata` + interceptor in new development instead of the `post_generate_client_certificate` interceptor. + When both interceptors are used, this `post_generate_client_certificate_with_metadata` interceptor runs after the + `post_generate_client_certificate` interceptor. The (possibly modified) response returned by + `post_generate_client_certificate` will be passed to + `post_generate_client_certificate_with_metadata`. + """ + return response, metadata + def pre_get_backup( self, request: service.GetBackupRequest, @@ -682,12 +984,35 @@ def pre_get_backup( def post_get_backup(self, response: resources.Backup) -> resources.Backup: """Post-rpc interceptor for get_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_backup` interceptor runs + before the `post_get_backup_with_metadata` interceptor. """ return response + def post_get_backup_with_metadata( + self, + response: resources.Backup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Backup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_backup_with_metadata` + interceptor in new development instead of the `post_get_backup` interceptor. + When both interceptors are used, this `post_get_backup_with_metadata` interceptor runs after the + `post_get_backup` interceptor. The (possibly modified) response returned by + `post_get_backup` will be passed to + `post_get_backup_with_metadata`. + """ + return response, metadata + def pre_get_cluster( self, request: service.GetClusterRequest, @@ -703,12 +1028,35 @@ def pre_get_cluster( def post_get_cluster(self, response: resources.Cluster) -> resources.Cluster: """Post-rpc interceptor for get_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_cluster` interceptor runs + before the `post_get_cluster_with_metadata` interceptor. """ return response + def post_get_cluster_with_metadata( + self, + response: resources.Cluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Cluster, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_cluster_with_metadata` + interceptor in new development instead of the `post_get_cluster` interceptor. + When both interceptors are used, this `post_get_cluster_with_metadata` interceptor runs after the + `post_get_cluster` interceptor. The (possibly modified) response returned by + `post_get_cluster` will be passed to + `post_get_cluster_with_metadata`. + """ + return response, metadata + def pre_get_connection_info( self, request: service.GetConnectionInfoRequest, @@ -728,12 +1076,35 @@ def post_get_connection_info( ) -> resources.ConnectionInfo: """Post-rpc interceptor for get_connection_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_connection_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_connection_info` interceptor runs + before the `post_get_connection_info_with_metadata` interceptor. """ return response + def post_get_connection_info_with_metadata( + self, + response: resources.ConnectionInfo, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ConnectionInfo, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_connection_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_connection_info_with_metadata` + interceptor in new development instead of the `post_get_connection_info` interceptor. + When both interceptors are used, this `post_get_connection_info_with_metadata` interceptor runs after the + `post_get_connection_info` interceptor. The (possibly modified) response returned by + `post_get_connection_info` will be passed to + `post_get_connection_info_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: service.GetInstanceRequest, @@ -749,12 +1120,35 @@ def pre_get_instance( def post_get_instance(self, response: resources.Instance) -> resources.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 AlloyDBAdmin 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: resources.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.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 AlloyDBAdmin 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_user( self, request: service.GetUserRequest, @@ -770,12 +1164,35 @@ def pre_get_user( def post_get_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for get_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_user` interceptor runs + before the `post_get_user_with_metadata` interceptor. """ return response + def post_get_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_user_with_metadata` + interceptor in new development instead of the `post_get_user` interceptor. + When both interceptors are used, this `post_get_user_with_metadata` interceptor runs after the + `post_get_user` interceptor. The (possibly modified) response returned by + `post_get_user` will be passed to + `post_get_user_with_metadata`. + """ + return response, metadata + def pre_inject_fault( self, request: service.InjectFaultRequest, @@ -793,12 +1210,35 @@ def post_inject_fault( ) -> operations_pb2.Operation: """Post-rpc interceptor for inject_fault - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_inject_fault_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_inject_fault` interceptor runs + before the `post_inject_fault_with_metadata` interceptor. """ return response + def post_inject_fault_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 inject_fault + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_inject_fault_with_metadata` + interceptor in new development instead of the `post_inject_fault` interceptor. + When both interceptors are used, this `post_inject_fault_with_metadata` interceptor runs after the + `post_inject_fault` interceptor. The (possibly modified) response returned by + `post_inject_fault` will be passed to + `post_inject_fault_with_metadata`. + """ + return response, metadata + def pre_list_backups( self, request: service.ListBackupsRequest, @@ -816,12 +1256,35 @@ def post_list_backups( ) -> service.ListBackupsResponse: """Post-rpc interceptor for list_backups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_backups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_backups` interceptor runs + before the `post_list_backups_with_metadata` interceptor. """ return response + def post_list_backups_with_metadata( + self, + response: service.ListBackupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListBackupsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_backups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_backups_with_metadata` + interceptor in new development instead of the `post_list_backups` interceptor. + When both interceptors are used, this `post_list_backups_with_metadata` interceptor runs after the + `post_list_backups` interceptor. The (possibly modified) response returned by + `post_list_backups` will be passed to + `post_list_backups_with_metadata`. + """ + return response, metadata + def pre_list_clusters( self, request: service.ListClustersRequest, @@ -839,12 +1302,35 @@ def post_list_clusters( ) -> service.ListClustersResponse: """Post-rpc interceptor for list_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_clusters` interceptor runs + before the `post_list_clusters_with_metadata` interceptor. """ return response + def post_list_clusters_with_metadata( + self, + response: service.ListClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListClustersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_clusters_with_metadata` + interceptor in new development instead of the `post_list_clusters` interceptor. + When both interceptors are used, this `post_list_clusters_with_metadata` interceptor runs after the + `post_list_clusters` interceptor. The (possibly modified) response returned by + `post_list_clusters` will be passed to + `post_list_clusters_with_metadata`. + """ + return response, metadata + def pre_list_databases( self, request: service.ListDatabasesRequest, @@ -862,12 +1348,35 @@ def post_list_databases( ) -> service.ListDatabasesResponse: """Post-rpc interceptor for list_databases - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_databases_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_databases` interceptor runs + before the `post_list_databases_with_metadata` interceptor. """ return response + def post_list_databases_with_metadata( + self, + response: service.ListDatabasesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListDatabasesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_databases + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_databases_with_metadata` + interceptor in new development instead of the `post_list_databases` interceptor. + When both interceptors are used, this `post_list_databases_with_metadata` interceptor runs after the + `post_list_databases` interceptor. The (possibly modified) response returned by + `post_list_databases` will be passed to + `post_list_databases_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: service.ListInstancesRequest, @@ -885,12 +1394,35 @@ def post_list_instances( ) -> service.ListInstancesResponse: """Post-rpc interceptor for list_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin 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: service.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListInstancesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin 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_supported_database_flags( self, request: service.ListSupportedDatabaseFlagsRequest, @@ -911,12 +1443,38 @@ def post_list_supported_database_flags( ) -> service.ListSupportedDatabaseFlagsResponse: """Post-rpc interceptor for list_supported_database_flags - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_supported_database_flags_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_supported_database_flags` interceptor runs + before the `post_list_supported_database_flags_with_metadata` interceptor. """ return response + def post_list_supported_database_flags_with_metadata( + self, + response: service.ListSupportedDatabaseFlagsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListSupportedDatabaseFlagsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_supported_database_flags + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_supported_database_flags_with_metadata` + interceptor in new development instead of the `post_list_supported_database_flags` interceptor. + When both interceptors are used, this `post_list_supported_database_flags_with_metadata` interceptor runs after the + `post_list_supported_database_flags` interceptor. The (possibly modified) response returned by + `post_list_supported_database_flags` will be passed to + `post_list_supported_database_flags_with_metadata`. + """ + return response, metadata + def pre_list_users( self, request: service.ListUsersRequest, @@ -934,12 +1492,35 @@ def post_list_users( ) -> service.ListUsersResponse: """Post-rpc interceptor for list_users - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_users_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_users` interceptor runs + before the `post_list_users_with_metadata` interceptor. """ return response + def post_list_users_with_metadata( + self, + response: service.ListUsersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListUsersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_users + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_users_with_metadata` + interceptor in new development instead of the `post_list_users` interceptor. + When both interceptors are used, this `post_list_users_with_metadata` interceptor runs after the + `post_list_users` interceptor. The (possibly modified) response returned by + `post_list_users` will be passed to + `post_list_users_with_metadata`. + """ + return response, metadata + def pre_promote_cluster( self, request: service.PromoteClusterRequest, @@ -957,12 +1538,35 @@ def post_promote_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for promote_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_promote_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_promote_cluster` interceptor runs + before the `post_promote_cluster_with_metadata` interceptor. """ return response + def post_promote_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 promote_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_promote_cluster_with_metadata` + interceptor in new development instead of the `post_promote_cluster` interceptor. + When both interceptors are used, this `post_promote_cluster_with_metadata` interceptor runs after the + `post_promote_cluster` interceptor. The (possibly modified) response returned by + `post_promote_cluster` will be passed to + `post_promote_cluster_with_metadata`. + """ + return response, metadata + def pre_restart_instance( self, request: service.RestartInstanceRequest, @@ -980,12 +1584,35 @@ def post_restart_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for restart_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restart_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_restart_instance` interceptor runs + before the `post_restart_instance_with_metadata` interceptor. """ return response + def post_restart_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for restart_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_restart_instance_with_metadata` + interceptor in new development instead of the `post_restart_instance` interceptor. + When both interceptors are used, this `post_restart_instance_with_metadata` interceptor runs after the + `post_restart_instance` interceptor. The (possibly modified) response returned by + `post_restart_instance` will be passed to + `post_restart_instance_with_metadata`. + """ + return response, metadata + def pre_restore_cluster( self, request: service.RestoreClusterRequest, @@ -1003,12 +1630,35 @@ def post_restore_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for restore_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restore_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_restore_cluster` interceptor runs + before the `post_restore_cluster_with_metadata` interceptor. """ return response + def post_restore_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 restore_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_restore_cluster_with_metadata` + interceptor in new development instead of the `post_restore_cluster` interceptor. + When both interceptors are used, this `post_restore_cluster_with_metadata` interceptor runs after the + `post_restore_cluster` interceptor. The (possibly modified) response returned by + `post_restore_cluster` will be passed to + `post_restore_cluster_with_metadata`. + """ + return response, metadata + def pre_switchover_cluster( self, request: service.SwitchoverClusterRequest, @@ -1028,12 +1678,35 @@ def post_switchover_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for switchover_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_switchover_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_switchover_cluster` interceptor runs + before the `post_switchover_cluster_with_metadata` interceptor. """ return response + def post_switchover_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 switchover_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_switchover_cluster_with_metadata` + interceptor in new development instead of the `post_switchover_cluster` interceptor. + When both interceptors are used, this `post_switchover_cluster_with_metadata` interceptor runs after the + `post_switchover_cluster` interceptor. The (possibly modified) response returned by + `post_switchover_cluster` will be passed to + `post_switchover_cluster_with_metadata`. + """ + return response, metadata + def pre_update_backup( self, request: service.UpdateBackupRequest, @@ -1051,12 +1724,35 @@ def post_update_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_backup` interceptor runs + before the `post_update_backup_with_metadata` interceptor. """ return response + def post_update_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_backup_with_metadata` + interceptor in new development instead of the `post_update_backup` interceptor. + When both interceptors are used, this `post_update_backup_with_metadata` interceptor runs after the + `post_update_backup` interceptor. The (possibly modified) response returned by + `post_update_backup` will be passed to + `post_update_backup_with_metadata`. + """ + return response, metadata + def pre_update_cluster( self, request: service.UpdateClusterRequest, @@ -1074,12 +1770,35 @@ def post_update_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_cluster` interceptor runs + before the `post_update_cluster_with_metadata` interceptor. """ return response + def post_update_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_cluster_with_metadata` + interceptor in new development instead of the `post_update_cluster` interceptor. + When both interceptors are used, this `post_update_cluster_with_metadata` interceptor runs after the + `post_update_cluster` interceptor. The (possibly modified) response returned by + `post_update_cluster` will be passed to + `post_update_cluster_with_metadata`. + """ + return response, metadata + def pre_update_instance( self, request: service.UpdateInstanceRequest, @@ -1097,12 +1816,35 @@ def post_update_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_instance` interceptor runs + before the `post_update_instance_with_metadata` interceptor. """ return response + def post_update_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_instance_with_metadata` + interceptor in new development instead of the `post_update_instance` interceptor. + When both interceptors are used, this `post_update_instance_with_metadata` interceptor runs after the + `post_update_instance` interceptor. The (possibly modified) response returned by + `post_update_instance` will be passed to + `post_update_instance_with_metadata`. + """ + return response, metadata + def pre_update_user( self, request: service.UpdateUserRequest, @@ -1118,12 +1860,35 @@ def pre_update_user( def post_update_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for update_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_user` interceptor runs + before the `post_update_user_with_metadata` interceptor. """ return response + def post_update_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_user_with_metadata` + interceptor in new development instead of the `post_update_user` interceptor. + When both interceptors are used, this `post_update_user_with_metadata` interceptor runs after the + `post_update_user` interceptor. The (possibly modified) response returned by + `post_update_user` will be passed to + `post_update_user_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1538,6 +2303,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1689,6 +2458,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1836,6 +2609,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1983,6 +2760,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 @@ -2132,6 +2913,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secondary_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secondary_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2283,6 +3068,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secondary_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secondary_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2435,6 +3224,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2578,6 +3371,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2719,6 +3516,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2860,6 +3661,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 @@ -3122,6 +3927,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_execute_sql(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_execute_sql_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3272,6 +4081,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_failover_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_failover_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3428,6 +4241,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_client_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_client_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3574,6 +4391,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3724,6 +4545,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3869,6 +4694,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_connection_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_connection_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4017,6 +4846,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 @@ -4159,6 +4992,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4313,6 +5150,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_inject_fault(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_inject_fault_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4460,6 +5301,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_backups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_backups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4605,6 +5450,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4748,6 +5597,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_databases(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_databases_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4891,6 +5744,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 @@ -5040,6 +5897,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_supported_database_flags(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_supported_database_flags_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5186,6 +6050,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_users(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_users_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5333,6 +6201,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_promote_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_promote_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5482,6 +6354,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restart_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restart_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5631,6 +6507,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restore_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restore_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5781,6 +6661,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_switchover_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_switchover_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5932,6 +6816,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6079,6 +6967,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6226,6 +7118,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6378,6 +7274,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/gapic_version.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/gapic_version.py index 72f01aec6400..558c8aab67c5 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/gapic_version.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.4.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/client.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/client.py index 8be23dd20736..2022b8966e0a 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/client.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -683,6 +685,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. @@ -5299,16 +5328,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, @@ -5354,16 +5387,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, @@ -5520,16 +5557,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, @@ -5575,16 +5616,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-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/transports/rest.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/transports/rest.py index 7a0bbcd53a09..d8a83afe7f05 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/transports/rest.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1alpha/services/alloy_db_admin/transports/rest.py @@ -374,12 +374,35 @@ def post_batch_create_instances( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_create_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_instances` interceptor runs + before the `post_batch_create_instances_with_metadata` interceptor. """ return response + def post_batch_create_instances_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_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_batch_create_instances_with_metadata` + interceptor in new development instead of the `post_batch_create_instances` interceptor. + When both interceptors are used, this `post_batch_create_instances_with_metadata` interceptor runs after the + `post_batch_create_instances` interceptor. The (possibly modified) response returned by + `post_batch_create_instances` will be passed to + `post_batch_create_instances_with_metadata`. + """ + return response, metadata + def pre_create_backup( self, request: service.CreateBackupRequest, @@ -397,12 +420,35 @@ def post_create_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_backup` interceptor runs + before the `post_create_backup_with_metadata` interceptor. """ return response + def post_create_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_backup_with_metadata` + interceptor in new development instead of the `post_create_backup` interceptor. + When both interceptors are used, this `post_create_backup_with_metadata` interceptor runs after the + `post_create_backup` interceptor. The (possibly modified) response returned by + `post_create_backup` will be passed to + `post_create_backup_with_metadata`. + """ + return response, metadata + def pre_create_cluster( self, request: service.CreateClusterRequest, @@ -420,12 +466,35 @@ def post_create_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_cluster` interceptor runs + before the `post_create_cluster_with_metadata` interceptor. """ return response + def post_create_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_cluster_with_metadata` + interceptor in new development instead of the `post_create_cluster` interceptor. + When both interceptors are used, this `post_create_cluster_with_metadata` interceptor runs after the + `post_create_cluster` interceptor. The (possibly modified) response returned by + `post_create_cluster` will be passed to + `post_create_cluster_with_metadata`. + """ + return response, metadata + def pre_create_instance( self, request: service.CreateInstanceRequest, @@ -443,12 +512,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 AlloyDBAdmin 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 AlloyDBAdmin 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_secondary_cluster( self, request: service.CreateSecondaryClusterRequest, @@ -468,12 +560,35 @@ def post_create_secondary_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_secondary_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secondary_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_secondary_cluster` interceptor runs + before the `post_create_secondary_cluster_with_metadata` interceptor. """ return response + def post_create_secondary_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_secondary_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_secondary_cluster_with_metadata` + interceptor in new development instead of the `post_create_secondary_cluster` interceptor. + When both interceptors are used, this `post_create_secondary_cluster_with_metadata` interceptor runs after the + `post_create_secondary_cluster` interceptor. The (possibly modified) response returned by + `post_create_secondary_cluster` will be passed to + `post_create_secondary_cluster_with_metadata`. + """ + return response, metadata + def pre_create_secondary_instance( self, request: service.CreateSecondaryInstanceRequest, @@ -493,12 +608,35 @@ def post_create_secondary_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_secondary_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secondary_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_secondary_instance` interceptor runs + before the `post_create_secondary_instance_with_metadata` interceptor. """ return response + def post_create_secondary_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_secondary_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_secondary_instance_with_metadata` + interceptor in new development instead of the `post_create_secondary_instance` interceptor. + When both interceptors are used, this `post_create_secondary_instance_with_metadata` interceptor runs after the + `post_create_secondary_instance` interceptor. The (possibly modified) response returned by + `post_create_secondary_instance` will be passed to + `post_create_secondary_instance_with_metadata`. + """ + return response, metadata + def pre_create_user( self, request: service.CreateUserRequest, @@ -514,12 +652,35 @@ def pre_create_user( def post_create_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for create_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_user` interceptor runs + before the `post_create_user_with_metadata` interceptor. """ return response + def post_create_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_user_with_metadata` + interceptor in new development instead of the `post_create_user` interceptor. + When both interceptors are used, this `post_create_user_with_metadata` interceptor runs after the + `post_create_user` interceptor. The (possibly modified) response returned by + `post_create_user` will be passed to + `post_create_user_with_metadata`. + """ + return response, metadata + def pre_delete_backup( self, request: service.DeleteBackupRequest, @@ -537,12 +698,35 @@ def post_delete_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_delete_backup` interceptor runs + before the `post_delete_backup_with_metadata` interceptor. """ return response + def post_delete_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_delete_backup_with_metadata` + interceptor in new development instead of the `post_delete_backup` interceptor. + When both interceptors are used, this `post_delete_backup_with_metadata` interceptor runs after the + `post_delete_backup` interceptor. The (possibly modified) response returned by + `post_delete_backup` will be passed to + `post_delete_backup_with_metadata`. + """ + return response, metadata + def pre_delete_cluster( self, request: service.DeleteClusterRequest, @@ -560,12 +744,35 @@ def post_delete_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_delete_cluster` interceptor runs + before the `post_delete_cluster_with_metadata` interceptor. """ return response + def post_delete_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_delete_cluster_with_metadata` + interceptor in new development instead of the `post_delete_cluster` interceptor. + When both interceptors are used, this `post_delete_cluster_with_metadata` interceptor runs after the + `post_delete_cluster` interceptor. The (possibly modified) response returned by + `post_delete_cluster` will be passed to + `post_delete_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: service.DeleteInstanceRequest, @@ -583,12 +790,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 AlloyDBAdmin 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 AlloyDBAdmin 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_user( self, request: service.DeleteUserRequest, @@ -618,12 +848,35 @@ def post_execute_sql( ) -> service.ExecuteSqlResponse: """Post-rpc interceptor for execute_sql - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_execute_sql_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_execute_sql` interceptor runs + before the `post_execute_sql_with_metadata` interceptor. """ return response + def post_execute_sql_with_metadata( + self, + response: service.ExecuteSqlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ExecuteSqlResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for execute_sql + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_execute_sql_with_metadata` + interceptor in new development instead of the `post_execute_sql` interceptor. + When both interceptors are used, this `post_execute_sql_with_metadata` interceptor runs after the + `post_execute_sql` interceptor. The (possibly modified) response returned by + `post_execute_sql` will be passed to + `post_execute_sql_with_metadata`. + """ + return response, metadata + def pre_failover_instance( self, request: service.FailoverInstanceRequest, @@ -643,12 +896,35 @@ def post_failover_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for failover_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_failover_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_failover_instance` interceptor runs + before the `post_failover_instance_with_metadata` interceptor. """ return response + def post_failover_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 failover_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_failover_instance_with_metadata` + interceptor in new development instead of the `post_failover_instance` interceptor. + When both interceptors are used, this `post_failover_instance_with_metadata` interceptor runs after the + `post_failover_instance` interceptor. The (possibly modified) response returned by + `post_failover_instance` will be passed to + `post_failover_instance_with_metadata`. + """ + return response, metadata + def pre_generate_client_certificate( self, request: service.GenerateClientCertificateRequest, @@ -669,12 +945,38 @@ def post_generate_client_certificate( ) -> service.GenerateClientCertificateResponse: """Post-rpc interceptor for generate_client_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_client_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_generate_client_certificate` interceptor runs + before the `post_generate_client_certificate_with_metadata` interceptor. """ return response + def post_generate_client_certificate_with_metadata( + self, + response: service.GenerateClientCertificateResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.GenerateClientCertificateResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_client_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_generate_client_certificate_with_metadata` + interceptor in new development instead of the `post_generate_client_certificate` interceptor. + When both interceptors are used, this `post_generate_client_certificate_with_metadata` interceptor runs after the + `post_generate_client_certificate` interceptor. The (possibly modified) response returned by + `post_generate_client_certificate` will be passed to + `post_generate_client_certificate_with_metadata`. + """ + return response, metadata + def pre_get_backup( self, request: service.GetBackupRequest, @@ -690,12 +992,35 @@ def pre_get_backup( def post_get_backup(self, response: resources.Backup) -> resources.Backup: """Post-rpc interceptor for get_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_backup` interceptor runs + before the `post_get_backup_with_metadata` interceptor. """ return response + def post_get_backup_with_metadata( + self, + response: resources.Backup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Backup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_backup_with_metadata` + interceptor in new development instead of the `post_get_backup` interceptor. + When both interceptors are used, this `post_get_backup_with_metadata` interceptor runs after the + `post_get_backup` interceptor. The (possibly modified) response returned by + `post_get_backup` will be passed to + `post_get_backup_with_metadata`. + """ + return response, metadata + def pre_get_cluster( self, request: service.GetClusterRequest, @@ -711,12 +1036,35 @@ def pre_get_cluster( def post_get_cluster(self, response: resources.Cluster) -> resources.Cluster: """Post-rpc interceptor for get_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_cluster` interceptor runs + before the `post_get_cluster_with_metadata` interceptor. """ return response + def post_get_cluster_with_metadata( + self, + response: resources.Cluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Cluster, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_cluster_with_metadata` + interceptor in new development instead of the `post_get_cluster` interceptor. + When both interceptors are used, this `post_get_cluster_with_metadata` interceptor runs after the + `post_get_cluster` interceptor. The (possibly modified) response returned by + `post_get_cluster` will be passed to + `post_get_cluster_with_metadata`. + """ + return response, metadata + def pre_get_connection_info( self, request: service.GetConnectionInfoRequest, @@ -736,12 +1084,35 @@ def post_get_connection_info( ) -> resources.ConnectionInfo: """Post-rpc interceptor for get_connection_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_connection_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_connection_info` interceptor runs + before the `post_get_connection_info_with_metadata` interceptor. """ return response + def post_get_connection_info_with_metadata( + self, + response: resources.ConnectionInfo, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ConnectionInfo, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_connection_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_connection_info_with_metadata` + interceptor in new development instead of the `post_get_connection_info` interceptor. + When both interceptors are used, this `post_get_connection_info_with_metadata` interceptor runs after the + `post_get_connection_info` interceptor. The (possibly modified) response returned by + `post_get_connection_info` will be passed to + `post_get_connection_info_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: service.GetInstanceRequest, @@ -757,12 +1128,35 @@ def pre_get_instance( def post_get_instance(self, response: resources.Instance) -> resources.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 AlloyDBAdmin 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: resources.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.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 AlloyDBAdmin 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_user( self, request: service.GetUserRequest, @@ -778,12 +1172,35 @@ def pre_get_user( def post_get_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for get_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_user` interceptor runs + before the `post_get_user_with_metadata` interceptor. """ return response + def post_get_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_user_with_metadata` + interceptor in new development instead of the `post_get_user` interceptor. + When both interceptors are used, this `post_get_user_with_metadata` interceptor runs after the + `post_get_user` interceptor. The (possibly modified) response returned by + `post_get_user` will be passed to + `post_get_user_with_metadata`. + """ + return response, metadata + def pre_inject_fault( self, request: service.InjectFaultRequest, @@ -801,12 +1218,35 @@ def post_inject_fault( ) -> operations_pb2.Operation: """Post-rpc interceptor for inject_fault - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_inject_fault_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_inject_fault` interceptor runs + before the `post_inject_fault_with_metadata` interceptor. """ return response + def post_inject_fault_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 inject_fault + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_inject_fault_with_metadata` + interceptor in new development instead of the `post_inject_fault` interceptor. + When both interceptors are used, this `post_inject_fault_with_metadata` interceptor runs after the + `post_inject_fault` interceptor. The (possibly modified) response returned by + `post_inject_fault` will be passed to + `post_inject_fault_with_metadata`. + """ + return response, metadata + def pre_list_backups( self, request: service.ListBackupsRequest, @@ -824,12 +1264,35 @@ def post_list_backups( ) -> service.ListBackupsResponse: """Post-rpc interceptor for list_backups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_backups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_backups` interceptor runs + before the `post_list_backups_with_metadata` interceptor. """ return response + def post_list_backups_with_metadata( + self, + response: service.ListBackupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListBackupsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_backups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_backups_with_metadata` + interceptor in new development instead of the `post_list_backups` interceptor. + When both interceptors are used, this `post_list_backups_with_metadata` interceptor runs after the + `post_list_backups` interceptor. The (possibly modified) response returned by + `post_list_backups` will be passed to + `post_list_backups_with_metadata`. + """ + return response, metadata + def pre_list_clusters( self, request: service.ListClustersRequest, @@ -847,12 +1310,35 @@ def post_list_clusters( ) -> service.ListClustersResponse: """Post-rpc interceptor for list_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_clusters` interceptor runs + before the `post_list_clusters_with_metadata` interceptor. """ return response + def post_list_clusters_with_metadata( + self, + response: service.ListClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListClustersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_clusters_with_metadata` + interceptor in new development instead of the `post_list_clusters` interceptor. + When both interceptors are used, this `post_list_clusters_with_metadata` interceptor runs after the + `post_list_clusters` interceptor. The (possibly modified) response returned by + `post_list_clusters` will be passed to + `post_list_clusters_with_metadata`. + """ + return response, metadata + def pre_list_databases( self, request: service.ListDatabasesRequest, @@ -870,12 +1356,35 @@ def post_list_databases( ) -> service.ListDatabasesResponse: """Post-rpc interceptor for list_databases - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_databases_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_databases` interceptor runs + before the `post_list_databases_with_metadata` interceptor. """ return response + def post_list_databases_with_metadata( + self, + response: service.ListDatabasesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListDatabasesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_databases + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_databases_with_metadata` + interceptor in new development instead of the `post_list_databases` interceptor. + When both interceptors are used, this `post_list_databases_with_metadata` interceptor runs after the + `post_list_databases` interceptor. The (possibly modified) response returned by + `post_list_databases` will be passed to + `post_list_databases_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: service.ListInstancesRequest, @@ -893,12 +1402,35 @@ def post_list_instances( ) -> service.ListInstancesResponse: """Post-rpc interceptor for list_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin 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: service.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListInstancesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin 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_supported_database_flags( self, request: service.ListSupportedDatabaseFlagsRequest, @@ -919,12 +1451,38 @@ def post_list_supported_database_flags( ) -> service.ListSupportedDatabaseFlagsResponse: """Post-rpc interceptor for list_supported_database_flags - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_supported_database_flags_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_supported_database_flags` interceptor runs + before the `post_list_supported_database_flags_with_metadata` interceptor. """ return response + def post_list_supported_database_flags_with_metadata( + self, + response: service.ListSupportedDatabaseFlagsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListSupportedDatabaseFlagsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_supported_database_flags + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_supported_database_flags_with_metadata` + interceptor in new development instead of the `post_list_supported_database_flags` interceptor. + When both interceptors are used, this `post_list_supported_database_flags_with_metadata` interceptor runs after the + `post_list_supported_database_flags` interceptor. The (possibly modified) response returned by + `post_list_supported_database_flags` will be passed to + `post_list_supported_database_flags_with_metadata`. + """ + return response, metadata + def pre_list_users( self, request: service.ListUsersRequest, @@ -942,12 +1500,35 @@ def post_list_users( ) -> service.ListUsersResponse: """Post-rpc interceptor for list_users - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_users_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_users` interceptor runs + before the `post_list_users_with_metadata` interceptor. """ return response + def post_list_users_with_metadata( + self, + response: service.ListUsersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListUsersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_users + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_users_with_metadata` + interceptor in new development instead of the `post_list_users` interceptor. + When both interceptors are used, this `post_list_users_with_metadata` interceptor runs after the + `post_list_users` interceptor. The (possibly modified) response returned by + `post_list_users` will be passed to + `post_list_users_with_metadata`. + """ + return response, metadata + def pre_promote_cluster( self, request: service.PromoteClusterRequest, @@ -965,12 +1546,35 @@ def post_promote_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for promote_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_promote_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_promote_cluster` interceptor runs + before the `post_promote_cluster_with_metadata` interceptor. """ return response + def post_promote_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 promote_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_promote_cluster_with_metadata` + interceptor in new development instead of the `post_promote_cluster` interceptor. + When both interceptors are used, this `post_promote_cluster_with_metadata` interceptor runs after the + `post_promote_cluster` interceptor. The (possibly modified) response returned by + `post_promote_cluster` will be passed to + `post_promote_cluster_with_metadata`. + """ + return response, metadata + def pre_restart_instance( self, request: service.RestartInstanceRequest, @@ -988,12 +1592,35 @@ def post_restart_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for restart_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restart_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_restart_instance` interceptor runs + before the `post_restart_instance_with_metadata` interceptor. """ return response + def post_restart_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for restart_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_restart_instance_with_metadata` + interceptor in new development instead of the `post_restart_instance` interceptor. + When both interceptors are used, this `post_restart_instance_with_metadata` interceptor runs after the + `post_restart_instance` interceptor. The (possibly modified) response returned by + `post_restart_instance` will be passed to + `post_restart_instance_with_metadata`. + """ + return response, metadata + def pre_restore_cluster( self, request: service.RestoreClusterRequest, @@ -1011,12 +1638,35 @@ def post_restore_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for restore_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restore_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_restore_cluster` interceptor runs + before the `post_restore_cluster_with_metadata` interceptor. """ return response + def post_restore_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 restore_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_restore_cluster_with_metadata` + interceptor in new development instead of the `post_restore_cluster` interceptor. + When both interceptors are used, this `post_restore_cluster_with_metadata` interceptor runs after the + `post_restore_cluster` interceptor. The (possibly modified) response returned by + `post_restore_cluster` will be passed to + `post_restore_cluster_with_metadata`. + """ + return response, metadata + def pre_switchover_cluster( self, request: service.SwitchoverClusterRequest, @@ -1036,12 +1686,35 @@ def post_switchover_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for switchover_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_switchover_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_switchover_cluster` interceptor runs + before the `post_switchover_cluster_with_metadata` interceptor. """ return response + def post_switchover_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 switchover_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_switchover_cluster_with_metadata` + interceptor in new development instead of the `post_switchover_cluster` interceptor. + When both interceptors are used, this `post_switchover_cluster_with_metadata` interceptor runs after the + `post_switchover_cluster` interceptor. The (possibly modified) response returned by + `post_switchover_cluster` will be passed to + `post_switchover_cluster_with_metadata`. + """ + return response, metadata + def pre_update_backup( self, request: service.UpdateBackupRequest, @@ -1059,12 +1732,35 @@ def post_update_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_backup` interceptor runs + before the `post_update_backup_with_metadata` interceptor. """ return response + def post_update_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_backup_with_metadata` + interceptor in new development instead of the `post_update_backup` interceptor. + When both interceptors are used, this `post_update_backup_with_metadata` interceptor runs after the + `post_update_backup` interceptor. The (possibly modified) response returned by + `post_update_backup` will be passed to + `post_update_backup_with_metadata`. + """ + return response, metadata + def pre_update_cluster( self, request: service.UpdateClusterRequest, @@ -1082,12 +1778,35 @@ def post_update_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_cluster` interceptor runs + before the `post_update_cluster_with_metadata` interceptor. """ return response + def post_update_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_cluster_with_metadata` + interceptor in new development instead of the `post_update_cluster` interceptor. + When both interceptors are used, this `post_update_cluster_with_metadata` interceptor runs after the + `post_update_cluster` interceptor. The (possibly modified) response returned by + `post_update_cluster` will be passed to + `post_update_cluster_with_metadata`. + """ + return response, metadata + def pre_update_instance( self, request: service.UpdateInstanceRequest, @@ -1105,12 +1824,35 @@ def post_update_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_instance` interceptor runs + before the `post_update_instance_with_metadata` interceptor. """ return response + def post_update_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_instance_with_metadata` + interceptor in new development instead of the `post_update_instance` interceptor. + When both interceptors are used, this `post_update_instance_with_metadata` interceptor runs after the + `post_update_instance` interceptor. The (possibly modified) response returned by + `post_update_instance` will be passed to + `post_update_instance_with_metadata`. + """ + return response, metadata + def pre_update_user( self, request: service.UpdateUserRequest, @@ -1126,12 +1868,35 @@ def pre_update_user( def post_update_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for update_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_user` interceptor runs + before the `post_update_user_with_metadata` interceptor. """ return response + def post_update_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_user_with_metadata` + interceptor in new development instead of the `post_update_user` interceptor. + When both interceptors are used, this `post_update_user_with_metadata` interceptor runs after the + `post_update_user` interceptor. The (possibly modified) response returned by + `post_update_user` will be passed to + `post_update_user_with_metadata`. + """ + return response, metadata + def pre_upgrade_cluster( self, request: service.UpgradeClusterRequest, @@ -1149,12 +1914,35 @@ def post_upgrade_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for upgrade_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_upgrade_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_upgrade_cluster` interceptor runs + before the `post_upgrade_cluster_with_metadata` interceptor. """ return response + def post_upgrade_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 upgrade_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_upgrade_cluster_with_metadata` + interceptor in new development instead of the `post_upgrade_cluster` interceptor. + When both interceptors are used, this `post_upgrade_cluster_with_metadata` interceptor runs after the + `post_upgrade_cluster` interceptor. The (possibly modified) response returned by + `post_upgrade_cluster` will be passed to + `post_upgrade_cluster_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1569,6 +2357,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1720,6 +2512,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1867,6 +2663,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2014,6 +2814,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 @@ -2163,6 +2967,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secondary_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secondary_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2314,6 +3122,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secondary_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secondary_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2466,6 +3278,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2609,6 +3425,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2750,6 +3570,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2891,6 +3715,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 @@ -3153,6 +3981,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_execute_sql(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_execute_sql_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3303,6 +4135,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_failover_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_failover_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3459,6 +4295,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_client_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_client_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3605,6 +4445,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3755,6 +4599,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3900,6 +4748,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_connection_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_connection_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4048,6 +4900,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 @@ -4190,6 +5046,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4344,6 +5204,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_inject_fault(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_inject_fault_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4491,6 +5355,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_backups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_backups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4636,6 +5504,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4779,6 +5651,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_databases(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_databases_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4922,6 +5798,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 @@ -5071,6 +5951,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_supported_database_flags(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_supported_database_flags_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5217,6 +6104,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_users(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_users_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5364,6 +6255,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_promote_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_promote_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5513,6 +6408,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restart_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restart_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5662,6 +6561,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restore_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restore_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5812,6 +6715,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_switchover_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_switchover_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5963,6 +6870,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6110,6 +7021,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6257,6 +7172,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6409,6 +7328,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6556,6 +7479,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_upgrade_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_upgrade_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/gapic_version.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/gapic_version.py index 72f01aec6400..558c8aab67c5 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/gapic_version.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.4.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/client.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/client.py index 53e3e679b97b..341e35916a19 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/client.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -683,6 +685,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. @@ -5299,16 +5328,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, @@ -5354,16 +5387,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, @@ -5520,16 +5557,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, @@ -5575,16 +5616,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-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/transports/rest.py b/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/transports/rest.py index aca2fbca3004..4f08d54c1462 100644 --- a/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/transports/rest.py +++ b/packages/google-cloud-alloydb/google/cloud/alloydb_v1beta/services/alloy_db_admin/transports/rest.py @@ -374,12 +374,35 @@ def post_batch_create_instances( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_create_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_instances` interceptor runs + before the `post_batch_create_instances_with_metadata` interceptor. """ return response + def post_batch_create_instances_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_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_batch_create_instances_with_metadata` + interceptor in new development instead of the `post_batch_create_instances` interceptor. + When both interceptors are used, this `post_batch_create_instances_with_metadata` interceptor runs after the + `post_batch_create_instances` interceptor. The (possibly modified) response returned by + `post_batch_create_instances` will be passed to + `post_batch_create_instances_with_metadata`. + """ + return response, metadata + def pre_create_backup( self, request: service.CreateBackupRequest, @@ -397,12 +420,35 @@ def post_create_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_backup` interceptor runs + before the `post_create_backup_with_metadata` interceptor. """ return response + def post_create_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_backup_with_metadata` + interceptor in new development instead of the `post_create_backup` interceptor. + When both interceptors are used, this `post_create_backup_with_metadata` interceptor runs after the + `post_create_backup` interceptor. The (possibly modified) response returned by + `post_create_backup` will be passed to + `post_create_backup_with_metadata`. + """ + return response, metadata + def pre_create_cluster( self, request: service.CreateClusterRequest, @@ -420,12 +466,35 @@ def post_create_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_cluster` interceptor runs + before the `post_create_cluster_with_metadata` interceptor. """ return response + def post_create_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_cluster_with_metadata` + interceptor in new development instead of the `post_create_cluster` interceptor. + When both interceptors are used, this `post_create_cluster_with_metadata` interceptor runs after the + `post_create_cluster` interceptor. The (possibly modified) response returned by + `post_create_cluster` will be passed to + `post_create_cluster_with_metadata`. + """ + return response, metadata + def pre_create_instance( self, request: service.CreateInstanceRequest, @@ -443,12 +512,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 AlloyDBAdmin 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 AlloyDBAdmin 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_secondary_cluster( self, request: service.CreateSecondaryClusterRequest, @@ -468,12 +560,35 @@ def post_create_secondary_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_secondary_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secondary_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_secondary_cluster` interceptor runs + before the `post_create_secondary_cluster_with_metadata` interceptor. """ return response + def post_create_secondary_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_secondary_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_secondary_cluster_with_metadata` + interceptor in new development instead of the `post_create_secondary_cluster` interceptor. + When both interceptors are used, this `post_create_secondary_cluster_with_metadata` interceptor runs after the + `post_create_secondary_cluster` interceptor. The (possibly modified) response returned by + `post_create_secondary_cluster` will be passed to + `post_create_secondary_cluster_with_metadata`. + """ + return response, metadata + def pre_create_secondary_instance( self, request: service.CreateSecondaryInstanceRequest, @@ -493,12 +608,35 @@ def post_create_secondary_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_secondary_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secondary_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_secondary_instance` interceptor runs + before the `post_create_secondary_instance_with_metadata` interceptor. """ return response + def post_create_secondary_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_secondary_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_secondary_instance_with_metadata` + interceptor in new development instead of the `post_create_secondary_instance` interceptor. + When both interceptors are used, this `post_create_secondary_instance_with_metadata` interceptor runs after the + `post_create_secondary_instance` interceptor. The (possibly modified) response returned by + `post_create_secondary_instance` will be passed to + `post_create_secondary_instance_with_metadata`. + """ + return response, metadata + def pre_create_user( self, request: service.CreateUserRequest, @@ -514,12 +652,35 @@ def pre_create_user( def post_create_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for create_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_create_user` interceptor runs + before the `post_create_user_with_metadata` interceptor. """ return response + def post_create_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_create_user_with_metadata` + interceptor in new development instead of the `post_create_user` interceptor. + When both interceptors are used, this `post_create_user_with_metadata` interceptor runs after the + `post_create_user` interceptor. The (possibly modified) response returned by + `post_create_user` will be passed to + `post_create_user_with_metadata`. + """ + return response, metadata + def pre_delete_backup( self, request: service.DeleteBackupRequest, @@ -537,12 +698,35 @@ def post_delete_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_delete_backup` interceptor runs + before the `post_delete_backup_with_metadata` interceptor. """ return response + def post_delete_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_delete_backup_with_metadata` + interceptor in new development instead of the `post_delete_backup` interceptor. + When both interceptors are used, this `post_delete_backup_with_metadata` interceptor runs after the + `post_delete_backup` interceptor. The (possibly modified) response returned by + `post_delete_backup` will be passed to + `post_delete_backup_with_metadata`. + """ + return response, metadata + def pre_delete_cluster( self, request: service.DeleteClusterRequest, @@ -560,12 +744,35 @@ def post_delete_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_delete_cluster` interceptor runs + before the `post_delete_cluster_with_metadata` interceptor. """ return response + def post_delete_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_delete_cluster_with_metadata` + interceptor in new development instead of the `post_delete_cluster` interceptor. + When both interceptors are used, this `post_delete_cluster_with_metadata` interceptor runs after the + `post_delete_cluster` interceptor. The (possibly modified) response returned by + `post_delete_cluster` will be passed to + `post_delete_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: service.DeleteInstanceRequest, @@ -583,12 +790,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 AlloyDBAdmin 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 AlloyDBAdmin 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_user( self, request: service.DeleteUserRequest, @@ -618,12 +848,35 @@ def post_execute_sql( ) -> service.ExecuteSqlResponse: """Post-rpc interceptor for execute_sql - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_execute_sql_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_execute_sql` interceptor runs + before the `post_execute_sql_with_metadata` interceptor. """ return response + def post_execute_sql_with_metadata( + self, + response: service.ExecuteSqlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ExecuteSqlResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for execute_sql + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_execute_sql_with_metadata` + interceptor in new development instead of the `post_execute_sql` interceptor. + When both interceptors are used, this `post_execute_sql_with_metadata` interceptor runs after the + `post_execute_sql` interceptor. The (possibly modified) response returned by + `post_execute_sql` will be passed to + `post_execute_sql_with_metadata`. + """ + return response, metadata + def pre_failover_instance( self, request: service.FailoverInstanceRequest, @@ -643,12 +896,35 @@ def post_failover_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for failover_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_failover_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_failover_instance` interceptor runs + before the `post_failover_instance_with_metadata` interceptor. """ return response + def post_failover_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 failover_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_failover_instance_with_metadata` + interceptor in new development instead of the `post_failover_instance` interceptor. + When both interceptors are used, this `post_failover_instance_with_metadata` interceptor runs after the + `post_failover_instance` interceptor. The (possibly modified) response returned by + `post_failover_instance` will be passed to + `post_failover_instance_with_metadata`. + """ + return response, metadata + def pre_generate_client_certificate( self, request: service.GenerateClientCertificateRequest, @@ -669,12 +945,38 @@ def post_generate_client_certificate( ) -> service.GenerateClientCertificateResponse: """Post-rpc interceptor for generate_client_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_client_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_generate_client_certificate` interceptor runs + before the `post_generate_client_certificate_with_metadata` interceptor. """ return response + def post_generate_client_certificate_with_metadata( + self, + response: service.GenerateClientCertificateResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.GenerateClientCertificateResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_client_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_generate_client_certificate_with_metadata` + interceptor in new development instead of the `post_generate_client_certificate` interceptor. + When both interceptors are used, this `post_generate_client_certificate_with_metadata` interceptor runs after the + `post_generate_client_certificate` interceptor. The (possibly modified) response returned by + `post_generate_client_certificate` will be passed to + `post_generate_client_certificate_with_metadata`. + """ + return response, metadata + def pre_get_backup( self, request: service.GetBackupRequest, @@ -690,12 +992,35 @@ def pre_get_backup( def post_get_backup(self, response: resources.Backup) -> resources.Backup: """Post-rpc interceptor for get_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_backup` interceptor runs + before the `post_get_backup_with_metadata` interceptor. """ return response + def post_get_backup_with_metadata( + self, + response: resources.Backup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Backup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_backup_with_metadata` + interceptor in new development instead of the `post_get_backup` interceptor. + When both interceptors are used, this `post_get_backup_with_metadata` interceptor runs after the + `post_get_backup` interceptor. The (possibly modified) response returned by + `post_get_backup` will be passed to + `post_get_backup_with_metadata`. + """ + return response, metadata + def pre_get_cluster( self, request: service.GetClusterRequest, @@ -711,12 +1036,35 @@ def pre_get_cluster( def post_get_cluster(self, response: resources.Cluster) -> resources.Cluster: """Post-rpc interceptor for get_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_cluster` interceptor runs + before the `post_get_cluster_with_metadata` interceptor. """ return response + def post_get_cluster_with_metadata( + self, + response: resources.Cluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Cluster, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_cluster_with_metadata` + interceptor in new development instead of the `post_get_cluster` interceptor. + When both interceptors are used, this `post_get_cluster_with_metadata` interceptor runs after the + `post_get_cluster` interceptor. The (possibly modified) response returned by + `post_get_cluster` will be passed to + `post_get_cluster_with_metadata`. + """ + return response, metadata + def pre_get_connection_info( self, request: service.GetConnectionInfoRequest, @@ -736,12 +1084,35 @@ def post_get_connection_info( ) -> resources.ConnectionInfo: """Post-rpc interceptor for get_connection_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_connection_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_connection_info` interceptor runs + before the `post_get_connection_info_with_metadata` interceptor. """ return response + def post_get_connection_info_with_metadata( + self, + response: resources.ConnectionInfo, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ConnectionInfo, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_connection_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_connection_info_with_metadata` + interceptor in new development instead of the `post_get_connection_info` interceptor. + When both interceptors are used, this `post_get_connection_info_with_metadata` interceptor runs after the + `post_get_connection_info` interceptor. The (possibly modified) response returned by + `post_get_connection_info` will be passed to + `post_get_connection_info_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: service.GetInstanceRequest, @@ -757,12 +1128,35 @@ def pre_get_instance( def post_get_instance(self, response: resources.Instance) -> resources.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 AlloyDBAdmin 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: resources.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.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 AlloyDBAdmin 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_user( self, request: service.GetUserRequest, @@ -778,12 +1172,35 @@ def pre_get_user( def post_get_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for get_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_user` interceptor runs + before the `post_get_user_with_metadata` interceptor. """ return response + def post_get_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_get_user_with_metadata` + interceptor in new development instead of the `post_get_user` interceptor. + When both interceptors are used, this `post_get_user_with_metadata` interceptor runs after the + `post_get_user` interceptor. The (possibly modified) response returned by + `post_get_user` will be passed to + `post_get_user_with_metadata`. + """ + return response, metadata + def pre_inject_fault( self, request: service.InjectFaultRequest, @@ -801,12 +1218,35 @@ def post_inject_fault( ) -> operations_pb2.Operation: """Post-rpc interceptor for inject_fault - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_inject_fault_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_inject_fault` interceptor runs + before the `post_inject_fault_with_metadata` interceptor. """ return response + def post_inject_fault_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 inject_fault + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_inject_fault_with_metadata` + interceptor in new development instead of the `post_inject_fault` interceptor. + When both interceptors are used, this `post_inject_fault_with_metadata` interceptor runs after the + `post_inject_fault` interceptor. The (possibly modified) response returned by + `post_inject_fault` will be passed to + `post_inject_fault_with_metadata`. + """ + return response, metadata + def pre_list_backups( self, request: service.ListBackupsRequest, @@ -824,12 +1264,35 @@ def post_list_backups( ) -> service.ListBackupsResponse: """Post-rpc interceptor for list_backups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_backups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_backups` interceptor runs + before the `post_list_backups_with_metadata` interceptor. """ return response + def post_list_backups_with_metadata( + self, + response: service.ListBackupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListBackupsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_backups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_backups_with_metadata` + interceptor in new development instead of the `post_list_backups` interceptor. + When both interceptors are used, this `post_list_backups_with_metadata` interceptor runs after the + `post_list_backups` interceptor. The (possibly modified) response returned by + `post_list_backups` will be passed to + `post_list_backups_with_metadata`. + """ + return response, metadata + def pre_list_clusters( self, request: service.ListClustersRequest, @@ -847,12 +1310,35 @@ def post_list_clusters( ) -> service.ListClustersResponse: """Post-rpc interceptor for list_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_clusters` interceptor runs + before the `post_list_clusters_with_metadata` interceptor. """ return response + def post_list_clusters_with_metadata( + self, + response: service.ListClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListClustersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_clusters_with_metadata` + interceptor in new development instead of the `post_list_clusters` interceptor. + When both interceptors are used, this `post_list_clusters_with_metadata` interceptor runs after the + `post_list_clusters` interceptor. The (possibly modified) response returned by + `post_list_clusters` will be passed to + `post_list_clusters_with_metadata`. + """ + return response, metadata + def pre_list_databases( self, request: service.ListDatabasesRequest, @@ -870,12 +1356,35 @@ def post_list_databases( ) -> service.ListDatabasesResponse: """Post-rpc interceptor for list_databases - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_databases_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_databases` interceptor runs + before the `post_list_databases_with_metadata` interceptor. """ return response + def post_list_databases_with_metadata( + self, + response: service.ListDatabasesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListDatabasesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_databases + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_databases_with_metadata` + interceptor in new development instead of the `post_list_databases` interceptor. + When both interceptors are used, this `post_list_databases_with_metadata` interceptor runs after the + `post_list_databases` interceptor. The (possibly modified) response returned by + `post_list_databases` will be passed to + `post_list_databases_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: service.ListInstancesRequest, @@ -893,12 +1402,35 @@ def post_list_instances( ) -> service.ListInstancesResponse: """Post-rpc interceptor for list_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin 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: service.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListInstancesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin 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_supported_database_flags( self, request: service.ListSupportedDatabaseFlagsRequest, @@ -919,12 +1451,38 @@ def post_list_supported_database_flags( ) -> service.ListSupportedDatabaseFlagsResponse: """Post-rpc interceptor for list_supported_database_flags - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_supported_database_flags_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_supported_database_flags` interceptor runs + before the `post_list_supported_database_flags_with_metadata` interceptor. """ return response + def post_list_supported_database_flags_with_metadata( + self, + response: service.ListSupportedDatabaseFlagsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListSupportedDatabaseFlagsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_supported_database_flags + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_supported_database_flags_with_metadata` + interceptor in new development instead of the `post_list_supported_database_flags` interceptor. + When both interceptors are used, this `post_list_supported_database_flags_with_metadata` interceptor runs after the + `post_list_supported_database_flags` interceptor. The (possibly modified) response returned by + `post_list_supported_database_flags` will be passed to + `post_list_supported_database_flags_with_metadata`. + """ + return response, metadata + def pre_list_users( self, request: service.ListUsersRequest, @@ -942,12 +1500,35 @@ def post_list_users( ) -> service.ListUsersResponse: """Post-rpc interceptor for list_users - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_users_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_list_users` interceptor runs + before the `post_list_users_with_metadata` interceptor. """ return response + def post_list_users_with_metadata( + self, + response: service.ListUsersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListUsersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_users + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_list_users_with_metadata` + interceptor in new development instead of the `post_list_users` interceptor. + When both interceptors are used, this `post_list_users_with_metadata` interceptor runs after the + `post_list_users` interceptor. The (possibly modified) response returned by + `post_list_users` will be passed to + `post_list_users_with_metadata`. + """ + return response, metadata + def pre_promote_cluster( self, request: service.PromoteClusterRequest, @@ -965,12 +1546,35 @@ def post_promote_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for promote_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_promote_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_promote_cluster` interceptor runs + before the `post_promote_cluster_with_metadata` interceptor. """ return response + def post_promote_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 promote_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_promote_cluster_with_metadata` + interceptor in new development instead of the `post_promote_cluster` interceptor. + When both interceptors are used, this `post_promote_cluster_with_metadata` interceptor runs after the + `post_promote_cluster` interceptor. The (possibly modified) response returned by + `post_promote_cluster` will be passed to + `post_promote_cluster_with_metadata`. + """ + return response, metadata + def pre_restart_instance( self, request: service.RestartInstanceRequest, @@ -988,12 +1592,35 @@ def post_restart_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for restart_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restart_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_restart_instance` interceptor runs + before the `post_restart_instance_with_metadata` interceptor. """ return response + def post_restart_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for restart_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_restart_instance_with_metadata` + interceptor in new development instead of the `post_restart_instance` interceptor. + When both interceptors are used, this `post_restart_instance_with_metadata` interceptor runs after the + `post_restart_instance` interceptor. The (possibly modified) response returned by + `post_restart_instance` will be passed to + `post_restart_instance_with_metadata`. + """ + return response, metadata + def pre_restore_cluster( self, request: service.RestoreClusterRequest, @@ -1011,12 +1638,35 @@ def post_restore_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for restore_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restore_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_restore_cluster` interceptor runs + before the `post_restore_cluster_with_metadata` interceptor. """ return response + def post_restore_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 restore_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_restore_cluster_with_metadata` + interceptor in new development instead of the `post_restore_cluster` interceptor. + When both interceptors are used, this `post_restore_cluster_with_metadata` interceptor runs after the + `post_restore_cluster` interceptor. The (possibly modified) response returned by + `post_restore_cluster` will be passed to + `post_restore_cluster_with_metadata`. + """ + return response, metadata + def pre_switchover_cluster( self, request: service.SwitchoverClusterRequest, @@ -1036,12 +1686,35 @@ def post_switchover_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for switchover_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_switchover_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_switchover_cluster` interceptor runs + before the `post_switchover_cluster_with_metadata` interceptor. """ return response + def post_switchover_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 switchover_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_switchover_cluster_with_metadata` + interceptor in new development instead of the `post_switchover_cluster` interceptor. + When both interceptors are used, this `post_switchover_cluster_with_metadata` interceptor runs after the + `post_switchover_cluster` interceptor. The (possibly modified) response returned by + `post_switchover_cluster` will be passed to + `post_switchover_cluster_with_metadata`. + """ + return response, metadata + def pre_update_backup( self, request: service.UpdateBackupRequest, @@ -1059,12 +1732,35 @@ def post_update_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_backup` interceptor runs + before the `post_update_backup_with_metadata` interceptor. """ return response + def post_update_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_backup_with_metadata` + interceptor in new development instead of the `post_update_backup` interceptor. + When both interceptors are used, this `post_update_backup_with_metadata` interceptor runs after the + `post_update_backup` interceptor. The (possibly modified) response returned by + `post_update_backup` will be passed to + `post_update_backup_with_metadata`. + """ + return response, metadata + def pre_update_cluster( self, request: service.UpdateClusterRequest, @@ -1082,12 +1778,35 @@ def post_update_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_cluster` interceptor runs + before the `post_update_cluster_with_metadata` interceptor. """ return response + def post_update_cluster_with_metadata( + self, + response: 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_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_cluster_with_metadata` + interceptor in new development instead of the `post_update_cluster` interceptor. + When both interceptors are used, this `post_update_cluster_with_metadata` interceptor runs after the + `post_update_cluster` interceptor. The (possibly modified) response returned by + `post_update_cluster` will be passed to + `post_update_cluster_with_metadata`. + """ + return response, metadata + def pre_update_instance( self, request: service.UpdateInstanceRequest, @@ -1105,12 +1824,35 @@ def post_update_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_instance` interceptor runs + before the `post_update_instance_with_metadata` interceptor. """ return response + def post_update_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_instance_with_metadata` + interceptor in new development instead of the `post_update_instance` interceptor. + When both interceptors are used, this `post_update_instance_with_metadata` interceptor runs after the + `post_update_instance` interceptor. The (possibly modified) response returned by + `post_update_instance` will be passed to + `post_update_instance_with_metadata`. + """ + return response, metadata + def pre_update_user( self, request: service.UpdateUserRequest, @@ -1126,12 +1868,35 @@ def pre_update_user( def post_update_user(self, response: resources.User) -> resources.User: """Post-rpc interceptor for update_user - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_user_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_user` interceptor runs + before the `post_update_user_with_metadata` interceptor. """ return response + def post_update_user_with_metadata( + self, + response: resources.User, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.User, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_user + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_update_user_with_metadata` + interceptor in new development instead of the `post_update_user` interceptor. + When both interceptors are used, this `post_update_user_with_metadata` interceptor runs after the + `post_update_user` interceptor. The (possibly modified) response returned by + `post_update_user` will be passed to + `post_update_user_with_metadata`. + """ + return response, metadata + def pre_upgrade_cluster( self, request: service.UpgradeClusterRequest, @@ -1149,12 +1914,35 @@ def post_upgrade_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for upgrade_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_upgrade_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AlloyDBAdmin server but before - it is returned to user code. + it is returned to user code. This `post_upgrade_cluster` interceptor runs + before the `post_upgrade_cluster_with_metadata` interceptor. """ return response + def post_upgrade_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 upgrade_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AlloyDBAdmin server but before it is returned to user code. + + We recommend only using this `post_upgrade_cluster_with_metadata` + interceptor in new development instead of the `post_upgrade_cluster` interceptor. + When both interceptors are used, this `post_upgrade_cluster_with_metadata` interceptor runs after the + `post_upgrade_cluster` interceptor. The (possibly modified) response returned by + `post_upgrade_cluster` will be passed to + `post_upgrade_cluster_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1568,6 +2356,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1719,6 +2511,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1866,6 +2662,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2013,6 +2813,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 @@ -2162,6 +2966,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secondary_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secondary_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2313,6 +3121,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secondary_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secondary_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2465,6 +3277,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2608,6 +3424,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2749,6 +3569,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2890,6 +3714,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 @@ -3152,6 +3980,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_execute_sql(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_execute_sql_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3302,6 +4134,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_failover_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_failover_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3458,6 +4294,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_client_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_client_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3604,6 +4444,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3754,6 +4598,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3899,6 +4747,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_connection_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_connection_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4047,6 +4899,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 @@ -4189,6 +5045,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4343,6 +5203,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_inject_fault(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_inject_fault_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4490,6 +5354,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_backups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_backups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4635,6 +5503,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4778,6 +5650,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_databases(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_databases_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4921,6 +5797,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 @@ -5070,6 +5950,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_supported_database_flags(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_supported_database_flags_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5216,6 +6103,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_users(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_users_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5363,6 +6254,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_promote_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_promote_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5512,6 +6407,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restart_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restart_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5661,6 +6560,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restore_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restore_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5811,6 +6714,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_switchover_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_switchover_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5962,6 +6869,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6109,6 +7020,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6256,6 +7171,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6408,6 +7327,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_user(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_user_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6555,6 +7478,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_upgrade_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_upgrade_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1.json b/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1.json index 770170613b87..93784dc7f2da 100644 --- a/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1.json +++ b/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-alloydb", - "version": "0.4.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1alpha.json b/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1alpha.json index 16fcd7cdfe58..0beca3926d06 100644 --- a/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1alpha.json +++ b/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-alloydb", - "version": "0.4.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1beta.json b/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1beta.json index c90c9998fad0..696ffb3efe81 100644 --- a/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1beta.json +++ b/packages/google-cloud-alloydb/samples/generated_samples/snippet_metadata_google.cloud.alloydb.v1beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-alloydb", - "version": "0.4.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1/test_alloy_db_admin.py b/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1/test_alloy_db_admin.py index d7254314ed4f..c628c224db14 100644 --- a/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1/test_alloy_db_admin.py +++ b/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1/test_alloy_db_admin.py @@ -80,6 +80,13 @@ ) from google.cloud.alloydb_v1.types import data_model, 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 @@ -323,6 +330,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AlloyDBAdminClient(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 = AlloyDBAdminClient(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", [ @@ -22572,10 +22622,13 @@ def test_list_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_clusters" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_clusters_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListClustersRequest.pb(service.ListClustersRequest()) transcode.return_value = { "method": "post", @@ -22599,6 +22652,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListClustersResponse() + post_with_metadata.return_value = service.ListClustersResponse(), metadata client.list_clusters( request, @@ -22610,6 +22664,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_cluster_rest_bad_request(request_type=service.GetClusterRequest): @@ -22712,10 +22767,13 @@ def test_get_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetClusterRequest.pb(service.GetClusterRequest()) transcode.return_value = { "method": "post", @@ -22737,6 +22795,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Cluster() + post_with_metadata.return_value = resources.Cluster(), metadata client.get_cluster( request, @@ -22748,6 +22807,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_cluster_rest_bad_request(request_type=service.CreateClusterRequest): @@ -22978,10 +23038,13 @@ def test_create_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateClusterRequest.pb(service.CreateClusterRequest()) transcode.return_value = { "method": "post", @@ -23003,6 +23066,7 @@ def test_create_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_cluster( request, @@ -23014,6 +23078,7 @@ def test_create_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_cluster_rest_bad_request(request_type=service.UpdateClusterRequest): @@ -23248,10 +23313,13 @@ def test_update_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateClusterRequest.pb(service.UpdateClusterRequest()) transcode.return_value = { "method": "post", @@ -23273,6 +23341,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_cluster( request, @@ -23284,6 +23353,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_cluster_rest_bad_request(request_type=service.DeleteClusterRequest): @@ -23362,10 +23432,13 @@ def test_delete_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteClusterRequest.pb(service.DeleteClusterRequest()) transcode.return_value = { "method": "post", @@ -23387,6 +23460,7 @@ def test_delete_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_cluster( request, @@ -23398,6 +23472,7 @@ def test_delete_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_promote_cluster_rest_bad_request(request_type=service.PromoteClusterRequest): @@ -23476,10 +23551,13 @@ def test_promote_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_promote_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_promote_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_promote_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.PromoteClusterRequest.pb(service.PromoteClusterRequest()) transcode.return_value = { "method": "post", @@ -23501,6 +23579,7 @@ def test_promote_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.promote_cluster( request, @@ -23512,6 +23591,7 @@ def test_promote_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_switchover_cluster_rest_bad_request( @@ -23592,10 +23672,13 @@ def test_switchover_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_switchover_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_switchover_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_switchover_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.SwitchoverClusterRequest.pb( service.SwitchoverClusterRequest() ) @@ -23619,6 +23702,7 @@ def test_switchover_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.switchover_cluster( request, @@ -23630,6 +23714,7 @@ def test_switchover_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restore_cluster_rest_bad_request(request_type=service.RestoreClusterRequest): @@ -23708,10 +23793,13 @@ def test_restore_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_restore_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_restore_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_restore_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestoreClusterRequest.pb(service.RestoreClusterRequest()) transcode.return_value = { "method": "post", @@ -23733,6 +23821,7 @@ def test_restore_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.restore_cluster( request, @@ -23744,6 +23833,7 @@ def test_restore_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_secondary_cluster_rest_bad_request( @@ -23976,10 +24066,14 @@ def test_create_secondary_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_secondary_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_create_secondary_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_secondary_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecondaryClusterRequest.pb( service.CreateSecondaryClusterRequest() ) @@ -24003,6 +24097,7 @@ def test_create_secondary_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_secondary_cluster( request, @@ -24014,6 +24109,7 @@ def test_create_secondary_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_instances_rest_bad_request(request_type=service.ListInstancesRequest): @@ -24098,10 +24194,13 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListInstancesRequest.pb(service.ListInstancesRequest()) transcode.return_value = { "method": "post", @@ -24125,6 +24224,7 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListInstancesResponse() + post_with_metadata.return_value = service.ListInstancesResponse(), metadata client.list_instances( request, @@ -24136,6 +24236,7 @@ def test_list_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_instance_rest_bad_request(request_type=service.GetInstanceRequest): @@ -24248,10 +24349,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetInstanceRequest.pb(service.GetInstanceRequest()) transcode.return_value = { "method": "post", @@ -24273,6 +24377,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Instance() + post_with_metadata.return_value = resources.Instance(), metadata client.get_instance( request, @@ -24284,6 +24389,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(request_type=service.CreateInstanceRequest): @@ -24485,10 +24591,13 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateInstanceRequest.pb(service.CreateInstanceRequest()) transcode.return_value = { "method": "post", @@ -24510,6 +24619,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, @@ -24521,6 +24631,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_create_secondary_instance_rest_bad_request( @@ -24724,10 +24835,14 @@ def test_create_secondary_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_secondary_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_create_secondary_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_secondary_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecondaryInstanceRequest.pb( service.CreateSecondaryInstanceRequest() ) @@ -24751,6 +24866,7 @@ def test_create_secondary_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_secondary_instance( request, @@ -24762,6 +24878,7 @@ def test_create_secondary_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_instances_rest_bad_request( @@ -24977,10 +25094,14 @@ def test_batch_create_instances_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_batch_create_instances" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_batch_create_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_batch_create_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.BatchCreateInstancesRequest.pb( service.BatchCreateInstancesRequest() ) @@ -25004,6 +25125,7 @@ def test_batch_create_instances_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_instances( request, @@ -25015,6 +25137,7 @@ def test_batch_create_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_instance_rest_bad_request(request_type=service.UpdateInstanceRequest): @@ -25224,10 +25347,13 @@ def test_update_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateInstanceRequest.pb(service.UpdateInstanceRequest()) transcode.return_value = { "method": "post", @@ -25249,6 +25375,7 @@ def test_update_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_instance( request, @@ -25260,6 +25387,7 @@ def test_update_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instance_rest_bad_request(request_type=service.DeleteInstanceRequest): @@ -25342,10 +25470,13 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteInstanceRequest.pb(service.DeleteInstanceRequest()) transcode.return_value = { "method": "post", @@ -25367,6 +25498,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, @@ -25378,6 +25510,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_failover_instance_rest_bad_request( @@ -25462,10 +25595,13 @@ def test_failover_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_failover_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_failover_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_failover_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.FailoverInstanceRequest.pb( service.FailoverInstanceRequest() ) @@ -25489,6 +25625,7 @@ def test_failover_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.failover_instance( request, @@ -25500,6 +25637,7 @@ def test_failover_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_inject_fault_rest_bad_request(request_type=service.InjectFaultRequest): @@ -25582,10 +25720,13 @@ def test_inject_fault_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_inject_fault" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_inject_fault_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_inject_fault" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.InjectFaultRequest.pb(service.InjectFaultRequest()) transcode.return_value = { "method": "post", @@ -25607,6 +25748,7 @@ def test_inject_fault_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.inject_fault( request, @@ -25618,6 +25760,7 @@ def test_inject_fault_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restart_instance_rest_bad_request(request_type=service.RestartInstanceRequest): @@ -25700,10 +25843,13 @@ def test_restart_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_restart_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_restart_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_restart_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestartInstanceRequest.pb(service.RestartInstanceRequest()) transcode.return_value = { "method": "post", @@ -25725,6 +25871,7 @@ def test_restart_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.restart_instance( request, @@ -25736,6 +25883,7 @@ def test_restart_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_execute_sql_rest_bad_request(request_type=service.ExecuteSqlRequest): @@ -25819,10 +25967,13 @@ def test_execute_sql_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_execute_sql" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_execute_sql_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_execute_sql" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ExecuteSqlRequest.pb(service.ExecuteSqlRequest()) transcode.return_value = { "method": "post", @@ -25844,6 +25995,7 @@ def test_execute_sql_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ExecuteSqlResponse() + post_with_metadata.return_value = service.ExecuteSqlResponse(), metadata client.execute_sql( request, @@ -25855,6 +26007,7 @@ def test_execute_sql_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_backups_rest_bad_request(request_type=service.ListBackupsRequest): @@ -25939,10 +26092,13 @@ def test_list_backups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_backups" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_backups_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_backups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListBackupsRequest.pb(service.ListBackupsRequest()) transcode.return_value = { "method": "post", @@ -25966,6 +26122,7 @@ def test_list_backups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListBackupsResponse() + post_with_metadata.return_value = service.ListBackupsResponse(), metadata client.list_backups( request, @@ -25977,6 +26134,7 @@ def test_list_backups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_rest_bad_request(request_type=service.GetBackupRequest): @@ -26083,10 +26241,13 @@ def test_get_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetBackupRequest.pb(service.GetBackupRequest()) transcode.return_value = { "method": "post", @@ -26108,6 +26269,7 @@ def test_get_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Backup() + post_with_metadata.return_value = resources.Backup(), metadata client.get_backup( request, @@ -26119,6 +26281,7 @@ def test_get_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_backup_rest_bad_request(request_type=service.CreateBackupRequest): @@ -26292,10 +26455,13 @@ def test_create_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateBackupRequest.pb(service.CreateBackupRequest()) transcode.return_value = { "method": "post", @@ -26317,6 +26483,7 @@ def test_create_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_backup( request, @@ -26328,6 +26495,7 @@ def test_create_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_backup_rest_bad_request(request_type=service.UpdateBackupRequest): @@ -26505,10 +26673,13 @@ def test_update_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateBackupRequest.pb(service.UpdateBackupRequest()) transcode.return_value = { "method": "post", @@ -26530,6 +26701,7 @@ def test_update_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_backup( request, @@ -26541,6 +26713,7 @@ def test_update_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_backup_rest_bad_request(request_type=service.DeleteBackupRequest): @@ -26619,10 +26792,13 @@ def test_delete_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteBackupRequest.pb(service.DeleteBackupRequest()) transcode.return_value = { "method": "post", @@ -26644,6 +26820,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_backup( request, @@ -26655,6 +26832,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_supported_database_flags_rest_bad_request( @@ -26739,10 +26917,14 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_supported_database_flags" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_list_supported_database_flags_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_supported_database_flags" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSupportedDatabaseFlagsRequest.pb( service.ListSupportedDatabaseFlagsRequest() ) @@ -26768,6 +26950,10 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSupportedDatabaseFlagsResponse() + post_with_metadata.return_value = ( + service.ListSupportedDatabaseFlagsResponse(), + metadata, + ) client.list_supported_database_flags( request, @@ -26779,6 +26965,7 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_client_certificate_rest_bad_request( @@ -26865,10 +27052,14 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_generate_client_certificate" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_generate_client_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_generate_client_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GenerateClientCertificateRequest.pb( service.GenerateClientCertificateRequest() ) @@ -26894,6 +27085,10 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.GenerateClientCertificateResponse() + post_with_metadata.return_value = ( + service.GenerateClientCertificateResponse(), + metadata, + ) client.generate_client_certificate( request, @@ -26905,6 +27100,7 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_connection_info_rest_bad_request( @@ -26999,10 +27195,13 @@ def test_get_connection_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_connection_info" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_connection_info_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_connection_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetConnectionInfoRequest.pb( service.GetConnectionInfoRequest() ) @@ -27026,6 +27225,7 @@ def test_get_connection_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ConnectionInfo() + post_with_metadata.return_value = resources.ConnectionInfo(), metadata client.get_connection_info( request, @@ -27037,6 +27237,7 @@ def test_get_connection_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_users_rest_bad_request(request_type=service.ListUsersRequest): @@ -27121,10 +27322,13 @@ def test_list_users_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_users" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_users_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_users" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListUsersRequest.pb(service.ListUsersRequest()) transcode.return_value = { "method": "post", @@ -27146,6 +27350,7 @@ def test_list_users_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListUsersResponse() + post_with_metadata.return_value = service.ListUsersResponse(), metadata client.list_users( request, @@ -27157,6 +27362,7 @@ def test_list_users_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_user_rest_bad_request(request_type=service.GetUserRequest): @@ -27251,10 +27457,13 @@ def test_get_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetUserRequest.pb(service.GetUserRequest()) transcode.return_value = { "method": "post", @@ -27276,6 +27485,7 @@ def test_get_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.get_user( request, @@ -27287,6 +27497,7 @@ def test_get_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_user_rest_bad_request(request_type=service.CreateUserRequest): @@ -27451,10 +27662,13 @@ def test_create_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateUserRequest.pb(service.CreateUserRequest()) transcode.return_value = { "method": "post", @@ -27476,6 +27690,7 @@ def test_create_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.create_user( request, @@ -27487,6 +27702,7 @@ def test_create_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_user_rest_bad_request(request_type=service.UpdateUserRequest): @@ -27659,10 +27875,13 @@ def test_update_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateUserRequest.pb(service.UpdateUserRequest()) transcode.return_value = { "method": "post", @@ -27684,6 +27903,7 @@ def test_update_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.update_user( request, @@ -27695,6 +27915,7 @@ def test_update_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_user_rest_bad_request(request_type=service.DeleteUserRequest): @@ -27886,10 +28107,13 @@ def test_list_databases_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_databases" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_databases_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_databases" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListDatabasesRequest.pb(service.ListDatabasesRequest()) transcode.return_value = { "method": "post", @@ -27913,6 +28137,7 @@ def test_list_databases_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListDatabasesResponse() + post_with_metadata.return_value = service.ListDatabasesResponse(), metadata client.list_databases( request, @@ -27924,6 +28149,7 @@ def test_list_databases_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-alloydb/tests/unit/gapic/alloydb_v1alpha/test_alloy_db_admin.py b/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1alpha/test_alloy_db_admin.py index 5935432e7a1f..40e03d35d80b 100644 --- a/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1alpha/test_alloy_db_admin.py +++ b/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1alpha/test_alloy_db_admin.py @@ -86,6 +86,13 @@ service, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -329,6 +336,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AlloyDBAdminClient(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 = AlloyDBAdminClient(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", [ @@ -23191,10 +23241,13 @@ def test_list_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_clusters" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_clusters_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListClustersRequest.pb(service.ListClustersRequest()) transcode.return_value = { "method": "post", @@ -23218,6 +23271,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListClustersResponse() + post_with_metadata.return_value = service.ListClustersResponse(), metadata client.list_clusters( request, @@ -23229,6 +23283,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_cluster_rest_bad_request(request_type=service.GetClusterRequest): @@ -23333,10 +23388,13 @@ def test_get_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetClusterRequest.pb(service.GetClusterRequest()) transcode.return_value = { "method": "post", @@ -23358,6 +23416,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Cluster() + post_with_metadata.return_value = resources.Cluster(), metadata client.get_cluster( request, @@ -23369,6 +23428,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_cluster_rest_bad_request(request_type=service.CreateClusterRequest): @@ -23606,10 +23666,13 @@ def test_create_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateClusterRequest.pb(service.CreateClusterRequest()) transcode.return_value = { "method": "post", @@ -23631,6 +23694,7 @@ def test_create_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_cluster( request, @@ -23642,6 +23706,7 @@ def test_create_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_cluster_rest_bad_request(request_type=service.UpdateClusterRequest): @@ -23883,10 +23948,13 @@ def test_update_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateClusterRequest.pb(service.UpdateClusterRequest()) transcode.return_value = { "method": "post", @@ -23908,6 +23976,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_cluster( request, @@ -23919,6 +23988,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_upgrade_cluster_rest_bad_request(request_type=service.UpgradeClusterRequest): @@ -23997,10 +24067,13 @@ def test_upgrade_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_upgrade_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_upgrade_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_upgrade_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpgradeClusterRequest.pb(service.UpgradeClusterRequest()) transcode.return_value = { "method": "post", @@ -24022,6 +24095,7 @@ def test_upgrade_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.upgrade_cluster( request, @@ -24033,6 +24107,7 @@ def test_upgrade_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_cluster_rest_bad_request(request_type=service.DeleteClusterRequest): @@ -24111,10 +24186,13 @@ def test_delete_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteClusterRequest.pb(service.DeleteClusterRequest()) transcode.return_value = { "method": "post", @@ -24136,6 +24214,7 @@ def test_delete_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_cluster( request, @@ -24147,6 +24226,7 @@ def test_delete_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_promote_cluster_rest_bad_request(request_type=service.PromoteClusterRequest): @@ -24225,10 +24305,13 @@ def test_promote_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_promote_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_promote_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_promote_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.PromoteClusterRequest.pb(service.PromoteClusterRequest()) transcode.return_value = { "method": "post", @@ -24250,6 +24333,7 @@ def test_promote_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.promote_cluster( request, @@ -24261,6 +24345,7 @@ def test_promote_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_switchover_cluster_rest_bad_request( @@ -24341,10 +24426,13 @@ def test_switchover_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_switchover_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_switchover_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_switchover_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.SwitchoverClusterRequest.pb( service.SwitchoverClusterRequest() ) @@ -24368,6 +24456,7 @@ def test_switchover_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.switchover_cluster( request, @@ -24379,6 +24468,7 @@ def test_switchover_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restore_cluster_rest_bad_request(request_type=service.RestoreClusterRequest): @@ -24457,10 +24547,13 @@ def test_restore_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_restore_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_restore_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_restore_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestoreClusterRequest.pb(service.RestoreClusterRequest()) transcode.return_value = { "method": "post", @@ -24482,6 +24575,7 @@ def test_restore_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.restore_cluster( request, @@ -24493,6 +24587,7 @@ def test_restore_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_secondary_cluster_rest_bad_request( @@ -24732,10 +24827,14 @@ def test_create_secondary_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_secondary_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_create_secondary_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_secondary_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecondaryClusterRequest.pb( service.CreateSecondaryClusterRequest() ) @@ -24759,6 +24858,7 @@ def test_create_secondary_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_secondary_cluster( request, @@ -24770,6 +24870,7 @@ def test_create_secondary_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_instances_rest_bad_request(request_type=service.ListInstancesRequest): @@ -24854,10 +24955,13 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListInstancesRequest.pb(service.ListInstancesRequest()) transcode.return_value = { "method": "post", @@ -24881,6 +24985,7 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListInstancesResponse() + post_with_metadata.return_value = service.ListInstancesResponse(), metadata client.list_instances( request, @@ -24892,6 +24997,7 @@ def test_list_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_instance_rest_bad_request(request_type=service.GetInstanceRequest): @@ -25006,10 +25112,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetInstanceRequest.pb(service.GetInstanceRequest()) transcode.return_value = { "method": "post", @@ -25031,6 +25140,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Instance() + post_with_metadata.return_value = resources.Instance(), metadata client.get_instance( request, @@ -25042,6 +25152,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(request_type=service.CreateInstanceRequest): @@ -25260,10 +25371,13 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateInstanceRequest.pb(service.CreateInstanceRequest()) transcode.return_value = { "method": "post", @@ -25285,6 +25399,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, @@ -25296,6 +25411,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_create_secondary_instance_rest_bad_request( @@ -25516,10 +25632,14 @@ def test_create_secondary_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_secondary_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_create_secondary_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_secondary_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecondaryInstanceRequest.pb( service.CreateSecondaryInstanceRequest() ) @@ -25543,6 +25663,7 @@ def test_create_secondary_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_secondary_instance( request, @@ -25554,6 +25675,7 @@ def test_create_secondary_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_instances_rest_bad_request( @@ -25788,10 +25910,14 @@ def test_batch_create_instances_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_batch_create_instances" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_batch_create_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_batch_create_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.BatchCreateInstancesRequest.pb( service.BatchCreateInstancesRequest() ) @@ -25815,6 +25941,7 @@ def test_batch_create_instances_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_instances( request, @@ -25826,6 +25953,7 @@ def test_batch_create_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_instance_rest_bad_request(request_type=service.UpdateInstanceRequest): @@ -26052,10 +26180,13 @@ def test_update_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateInstanceRequest.pb(service.UpdateInstanceRequest()) transcode.return_value = { "method": "post", @@ -26077,6 +26208,7 @@ def test_update_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_instance( request, @@ -26088,6 +26220,7 @@ def test_update_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instance_rest_bad_request(request_type=service.DeleteInstanceRequest): @@ -26170,10 +26303,13 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteInstanceRequest.pb(service.DeleteInstanceRequest()) transcode.return_value = { "method": "post", @@ -26195,6 +26331,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, @@ -26206,6 +26343,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_failover_instance_rest_bad_request( @@ -26290,10 +26428,13 @@ def test_failover_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_failover_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_failover_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_failover_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.FailoverInstanceRequest.pb( service.FailoverInstanceRequest() ) @@ -26317,6 +26458,7 @@ def test_failover_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.failover_instance( request, @@ -26328,6 +26470,7 @@ def test_failover_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_inject_fault_rest_bad_request(request_type=service.InjectFaultRequest): @@ -26410,10 +26553,13 @@ def test_inject_fault_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_inject_fault" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_inject_fault_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_inject_fault" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.InjectFaultRequest.pb(service.InjectFaultRequest()) transcode.return_value = { "method": "post", @@ -26435,6 +26581,7 @@ def test_inject_fault_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.inject_fault( request, @@ -26446,6 +26593,7 @@ def test_inject_fault_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restart_instance_rest_bad_request(request_type=service.RestartInstanceRequest): @@ -26528,10 +26676,13 @@ def test_restart_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_restart_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_restart_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_restart_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestartInstanceRequest.pb(service.RestartInstanceRequest()) transcode.return_value = { "method": "post", @@ -26553,6 +26704,7 @@ def test_restart_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.restart_instance( request, @@ -26564,6 +26716,7 @@ def test_restart_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_execute_sql_rest_bad_request(request_type=service.ExecuteSqlRequest): @@ -26647,10 +26800,13 @@ def test_execute_sql_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_execute_sql" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_execute_sql_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_execute_sql" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ExecuteSqlRequest.pb(service.ExecuteSqlRequest()) transcode.return_value = { "method": "post", @@ -26672,6 +26828,7 @@ def test_execute_sql_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ExecuteSqlResponse() + post_with_metadata.return_value = service.ExecuteSqlResponse(), metadata client.execute_sql( request, @@ -26683,6 +26840,7 @@ def test_execute_sql_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_backups_rest_bad_request(request_type=service.ListBackupsRequest): @@ -26767,10 +26925,13 @@ def test_list_backups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_backups" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_backups_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_backups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListBackupsRequest.pb(service.ListBackupsRequest()) transcode.return_value = { "method": "post", @@ -26794,6 +26955,7 @@ def test_list_backups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListBackupsResponse() + post_with_metadata.return_value = service.ListBackupsResponse(), metadata client.list_backups( request, @@ -26805,6 +26967,7 @@ def test_list_backups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_rest_bad_request(request_type=service.GetBackupRequest): @@ -26913,10 +27076,13 @@ def test_get_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetBackupRequest.pb(service.GetBackupRequest()) transcode.return_value = { "method": "post", @@ -26938,6 +27104,7 @@ def test_get_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Backup() + post_with_metadata.return_value = resources.Backup(), metadata client.get_backup( request, @@ -26949,6 +27116,7 @@ def test_get_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_backup_rest_bad_request(request_type=service.CreateBackupRequest): @@ -27123,10 +27291,13 @@ def test_create_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateBackupRequest.pb(service.CreateBackupRequest()) transcode.return_value = { "method": "post", @@ -27148,6 +27319,7 @@ def test_create_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_backup( request, @@ -27159,6 +27331,7 @@ def test_create_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_backup_rest_bad_request(request_type=service.UpdateBackupRequest): @@ -27337,10 +27510,13 @@ def test_update_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateBackupRequest.pb(service.UpdateBackupRequest()) transcode.return_value = { "method": "post", @@ -27362,6 +27538,7 @@ def test_update_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_backup( request, @@ -27373,6 +27550,7 @@ def test_update_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_backup_rest_bad_request(request_type=service.DeleteBackupRequest): @@ -27451,10 +27629,13 @@ def test_delete_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteBackupRequest.pb(service.DeleteBackupRequest()) transcode.return_value = { "method": "post", @@ -27476,6 +27657,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_backup( request, @@ -27487,6 +27669,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_supported_database_flags_rest_bad_request( @@ -27571,10 +27754,14 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_supported_database_flags" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_list_supported_database_flags_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_supported_database_flags" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSupportedDatabaseFlagsRequest.pb( service.ListSupportedDatabaseFlagsRequest() ) @@ -27600,6 +27787,10 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSupportedDatabaseFlagsResponse() + post_with_metadata.return_value = ( + service.ListSupportedDatabaseFlagsResponse(), + metadata, + ) client.list_supported_database_flags( request, @@ -27611,6 +27802,7 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_client_certificate_rest_bad_request( @@ -27699,10 +27891,14 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_generate_client_certificate" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_generate_client_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_generate_client_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GenerateClientCertificateRequest.pb( service.GenerateClientCertificateRequest() ) @@ -27728,6 +27924,10 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.GenerateClientCertificateResponse() + post_with_metadata.return_value = ( + service.GenerateClientCertificateResponse(), + metadata, + ) client.generate_client_certificate( request, @@ -27739,6 +27939,7 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_connection_info_rest_bad_request( @@ -27837,10 +28038,13 @@ def test_get_connection_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_connection_info" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_connection_info_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_connection_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetConnectionInfoRequest.pb( service.GetConnectionInfoRequest() ) @@ -27864,6 +28068,7 @@ def test_get_connection_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ConnectionInfo() + post_with_metadata.return_value = resources.ConnectionInfo(), metadata client.get_connection_info( request, @@ -27875,6 +28080,7 @@ def test_get_connection_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_users_rest_bad_request(request_type=service.ListUsersRequest): @@ -27959,10 +28165,13 @@ def test_list_users_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_users" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_users_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_users" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListUsersRequest.pb(service.ListUsersRequest()) transcode.return_value = { "method": "post", @@ -27984,6 +28193,7 @@ def test_list_users_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListUsersResponse() + post_with_metadata.return_value = service.ListUsersResponse(), metadata client.list_users( request, @@ -27995,6 +28205,7 @@ def test_list_users_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_user_rest_bad_request(request_type=service.GetUserRequest): @@ -28089,10 +28300,13 @@ def test_get_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetUserRequest.pb(service.GetUserRequest()) transcode.return_value = { "method": "post", @@ -28114,6 +28328,7 @@ def test_get_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.get_user( request, @@ -28125,6 +28340,7 @@ def test_get_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_user_rest_bad_request(request_type=service.CreateUserRequest): @@ -28289,10 +28505,13 @@ def test_create_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateUserRequest.pb(service.CreateUserRequest()) transcode.return_value = { "method": "post", @@ -28314,6 +28533,7 @@ def test_create_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.create_user( request, @@ -28325,6 +28545,7 @@ def test_create_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_user_rest_bad_request(request_type=service.UpdateUserRequest): @@ -28497,10 +28718,13 @@ def test_update_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateUserRequest.pb(service.UpdateUserRequest()) transcode.return_value = { "method": "post", @@ -28522,6 +28746,7 @@ def test_update_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.update_user( request, @@ -28533,6 +28758,7 @@ def test_update_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_user_rest_bad_request(request_type=service.DeleteUserRequest): @@ -28724,10 +28950,13 @@ def test_list_databases_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_databases" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_databases_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_databases" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListDatabasesRequest.pb(service.ListDatabasesRequest()) transcode.return_value = { "method": "post", @@ -28751,6 +28980,7 @@ def test_list_databases_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListDatabasesResponse() + post_with_metadata.return_value = service.ListDatabasesResponse(), metadata client.list_databases( request, @@ -28762,6 +28992,7 @@ def test_list_databases_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-alloydb/tests/unit/gapic/alloydb_v1beta/test_alloy_db_admin.py b/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1beta/test_alloy_db_admin.py index c5907e0a6acf..7a55dff3383d 100644 --- a/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1beta/test_alloy_db_admin.py +++ b/packages/google-cloud-alloydb/tests/unit/gapic/alloydb_v1beta/test_alloy_db_admin.py @@ -86,6 +86,13 @@ service, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -329,6 +336,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AlloyDBAdminClient(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 = AlloyDBAdminClient(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", [ @@ -23176,10 +23226,13 @@ def test_list_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_clusters" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_clusters_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListClustersRequest.pb(service.ListClustersRequest()) transcode.return_value = { "method": "post", @@ -23203,6 +23256,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListClustersResponse() + post_with_metadata.return_value = service.ListClustersResponse(), metadata client.list_clusters( request, @@ -23214,6 +23268,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_cluster_rest_bad_request(request_type=service.GetClusterRequest): @@ -23316,10 +23371,13 @@ def test_get_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetClusterRequest.pb(service.GetClusterRequest()) transcode.return_value = { "method": "post", @@ -23341,6 +23399,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Cluster() + post_with_metadata.return_value = resources.Cluster(), metadata client.get_cluster( request, @@ -23352,6 +23411,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_cluster_rest_bad_request(request_type=service.CreateClusterRequest): @@ -23588,10 +23648,13 @@ def test_create_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateClusterRequest.pb(service.CreateClusterRequest()) transcode.return_value = { "method": "post", @@ -23613,6 +23676,7 @@ def test_create_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_cluster( request, @@ -23624,6 +23688,7 @@ def test_create_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_cluster_rest_bad_request(request_type=service.UpdateClusterRequest): @@ -23864,10 +23929,13 @@ def test_update_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateClusterRequest.pb(service.UpdateClusterRequest()) transcode.return_value = { "method": "post", @@ -23889,6 +23957,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_cluster( request, @@ -23900,6 +23969,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_upgrade_cluster_rest_bad_request(request_type=service.UpgradeClusterRequest): @@ -23978,10 +24048,13 @@ def test_upgrade_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_upgrade_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_upgrade_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_upgrade_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpgradeClusterRequest.pb(service.UpgradeClusterRequest()) transcode.return_value = { "method": "post", @@ -24003,6 +24076,7 @@ def test_upgrade_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.upgrade_cluster( request, @@ -24014,6 +24088,7 @@ def test_upgrade_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_cluster_rest_bad_request(request_type=service.DeleteClusterRequest): @@ -24092,10 +24167,13 @@ def test_delete_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteClusterRequest.pb(service.DeleteClusterRequest()) transcode.return_value = { "method": "post", @@ -24117,6 +24195,7 @@ def test_delete_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_cluster( request, @@ -24128,6 +24207,7 @@ def test_delete_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_promote_cluster_rest_bad_request(request_type=service.PromoteClusterRequest): @@ -24206,10 +24286,13 @@ def test_promote_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_promote_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_promote_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_promote_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.PromoteClusterRequest.pb(service.PromoteClusterRequest()) transcode.return_value = { "method": "post", @@ -24231,6 +24314,7 @@ def test_promote_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.promote_cluster( request, @@ -24242,6 +24326,7 @@ def test_promote_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_switchover_cluster_rest_bad_request( @@ -24322,10 +24407,13 @@ def test_switchover_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_switchover_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_switchover_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_switchover_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.SwitchoverClusterRequest.pb( service.SwitchoverClusterRequest() ) @@ -24349,6 +24437,7 @@ def test_switchover_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.switchover_cluster( request, @@ -24360,6 +24449,7 @@ def test_switchover_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restore_cluster_rest_bad_request(request_type=service.RestoreClusterRequest): @@ -24438,10 +24528,13 @@ def test_restore_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_restore_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_restore_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_restore_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestoreClusterRequest.pb(service.RestoreClusterRequest()) transcode.return_value = { "method": "post", @@ -24463,6 +24556,7 @@ def test_restore_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.restore_cluster( request, @@ -24474,6 +24568,7 @@ def test_restore_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_secondary_cluster_rest_bad_request( @@ -24712,10 +24807,14 @@ def test_create_secondary_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_secondary_cluster" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_create_secondary_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_secondary_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecondaryClusterRequest.pb( service.CreateSecondaryClusterRequest() ) @@ -24739,6 +24838,7 @@ def test_create_secondary_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_secondary_cluster( request, @@ -24750,6 +24850,7 @@ def test_create_secondary_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_instances_rest_bad_request(request_type=service.ListInstancesRequest): @@ -24834,10 +24935,13 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListInstancesRequest.pb(service.ListInstancesRequest()) transcode.return_value = { "method": "post", @@ -24861,6 +24965,7 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListInstancesResponse() + post_with_metadata.return_value = service.ListInstancesResponse(), metadata client.list_instances( request, @@ -24872,6 +24977,7 @@ def test_list_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_instance_rest_bad_request(request_type=service.GetInstanceRequest): @@ -24984,10 +25090,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetInstanceRequest.pb(service.GetInstanceRequest()) transcode.return_value = { "method": "post", @@ -25009,6 +25118,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Instance() + post_with_metadata.return_value = resources.Instance(), metadata client.get_instance( request, @@ -25020,6 +25130,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(request_type=service.CreateInstanceRequest): @@ -25234,10 +25345,13 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateInstanceRequest.pb(service.CreateInstanceRequest()) transcode.return_value = { "method": "post", @@ -25259,6 +25373,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, @@ -25270,6 +25385,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_create_secondary_instance_rest_bad_request( @@ -25486,10 +25602,14 @@ def test_create_secondary_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_secondary_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_create_secondary_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_secondary_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecondaryInstanceRequest.pb( service.CreateSecondaryInstanceRequest() ) @@ -25513,6 +25633,7 @@ def test_create_secondary_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_secondary_instance( request, @@ -25524,6 +25645,7 @@ def test_create_secondary_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_instances_rest_bad_request( @@ -25752,10 +25874,14 @@ def test_batch_create_instances_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_batch_create_instances" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_batch_create_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_batch_create_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.BatchCreateInstancesRequest.pb( service.BatchCreateInstancesRequest() ) @@ -25779,6 +25905,7 @@ def test_batch_create_instances_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_instances( request, @@ -25790,6 +25917,7 @@ def test_batch_create_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_instance_rest_bad_request(request_type=service.UpdateInstanceRequest): @@ -26012,10 +26140,13 @@ def test_update_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateInstanceRequest.pb(service.UpdateInstanceRequest()) transcode.return_value = { "method": "post", @@ -26037,6 +26168,7 @@ def test_update_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_instance( request, @@ -26048,6 +26180,7 @@ def test_update_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instance_rest_bad_request(request_type=service.DeleteInstanceRequest): @@ -26130,10 +26263,13 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteInstanceRequest.pb(service.DeleteInstanceRequest()) transcode.return_value = { "method": "post", @@ -26155,6 +26291,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, @@ -26166,6 +26303,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_failover_instance_rest_bad_request( @@ -26250,10 +26388,13 @@ def test_failover_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_failover_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_failover_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_failover_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.FailoverInstanceRequest.pb( service.FailoverInstanceRequest() ) @@ -26277,6 +26418,7 @@ def test_failover_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.failover_instance( request, @@ -26288,6 +26430,7 @@ def test_failover_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_inject_fault_rest_bad_request(request_type=service.InjectFaultRequest): @@ -26370,10 +26513,13 @@ def test_inject_fault_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_inject_fault" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_inject_fault_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_inject_fault" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.InjectFaultRequest.pb(service.InjectFaultRequest()) transcode.return_value = { "method": "post", @@ -26395,6 +26541,7 @@ def test_inject_fault_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.inject_fault( request, @@ -26406,6 +26553,7 @@ def test_inject_fault_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restart_instance_rest_bad_request(request_type=service.RestartInstanceRequest): @@ -26488,10 +26636,13 @@ def test_restart_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_restart_instance" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_restart_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_restart_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestartInstanceRequest.pb(service.RestartInstanceRequest()) transcode.return_value = { "method": "post", @@ -26513,6 +26664,7 @@ def test_restart_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.restart_instance( request, @@ -26524,6 +26676,7 @@ def test_restart_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_execute_sql_rest_bad_request(request_type=service.ExecuteSqlRequest): @@ -26607,10 +26760,13 @@ def test_execute_sql_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_execute_sql" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_execute_sql_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_execute_sql" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ExecuteSqlRequest.pb(service.ExecuteSqlRequest()) transcode.return_value = { "method": "post", @@ -26632,6 +26788,7 @@ def test_execute_sql_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ExecuteSqlResponse() + post_with_metadata.return_value = service.ExecuteSqlResponse(), metadata client.execute_sql( request, @@ -26643,6 +26800,7 @@ def test_execute_sql_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_backups_rest_bad_request(request_type=service.ListBackupsRequest): @@ -26727,10 +26885,13 @@ def test_list_backups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_backups" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_backups_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_backups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListBackupsRequest.pb(service.ListBackupsRequest()) transcode.return_value = { "method": "post", @@ -26754,6 +26915,7 @@ def test_list_backups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListBackupsResponse() + post_with_metadata.return_value = service.ListBackupsResponse(), metadata client.list_backups( request, @@ -26765,6 +26927,7 @@ def test_list_backups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_rest_bad_request(request_type=service.GetBackupRequest): @@ -26871,10 +27034,13 @@ def test_get_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetBackupRequest.pb(service.GetBackupRequest()) transcode.return_value = { "method": "post", @@ -26896,6 +27062,7 @@ def test_get_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Backup() + post_with_metadata.return_value = resources.Backup(), metadata client.get_backup( request, @@ -26907,6 +27074,7 @@ def test_get_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_backup_rest_bad_request(request_type=service.CreateBackupRequest): @@ -27080,10 +27248,13 @@ def test_create_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateBackupRequest.pb(service.CreateBackupRequest()) transcode.return_value = { "method": "post", @@ -27105,6 +27276,7 @@ def test_create_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_backup( request, @@ -27116,6 +27288,7 @@ def test_create_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_backup_rest_bad_request(request_type=service.UpdateBackupRequest): @@ -27293,10 +27466,13 @@ def test_update_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateBackupRequest.pb(service.UpdateBackupRequest()) transcode.return_value = { "method": "post", @@ -27318,6 +27494,7 @@ def test_update_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_backup( request, @@ -27329,6 +27506,7 @@ def test_update_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_backup_rest_bad_request(request_type=service.DeleteBackupRequest): @@ -27407,10 +27585,13 @@ def test_delete_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_delete_backup" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_delete_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_delete_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteBackupRequest.pb(service.DeleteBackupRequest()) transcode.return_value = { "method": "post", @@ -27432,6 +27613,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_backup( request, @@ -27443,6 +27625,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_supported_database_flags_rest_bad_request( @@ -27527,10 +27710,14 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_supported_database_flags" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_list_supported_database_flags_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_supported_database_flags" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSupportedDatabaseFlagsRequest.pb( service.ListSupportedDatabaseFlagsRequest() ) @@ -27556,6 +27743,10 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSupportedDatabaseFlagsResponse() + post_with_metadata.return_value = ( + service.ListSupportedDatabaseFlagsResponse(), + metadata, + ) client.list_supported_database_flags( request, @@ -27567,6 +27758,7 @@ def test_list_supported_database_flags_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_client_certificate_rest_bad_request( @@ -27655,10 +27847,14 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_generate_client_certificate" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, + "post_generate_client_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_generate_client_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GenerateClientCertificateRequest.pb( service.GenerateClientCertificateRequest() ) @@ -27684,6 +27880,10 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.GenerateClientCertificateResponse() + post_with_metadata.return_value = ( + service.GenerateClientCertificateResponse(), + metadata, + ) client.generate_client_certificate( request, @@ -27695,6 +27895,7 @@ def test_generate_client_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_connection_info_rest_bad_request( @@ -27793,10 +27994,13 @@ def test_get_connection_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_connection_info" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_connection_info_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_connection_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetConnectionInfoRequest.pb( service.GetConnectionInfoRequest() ) @@ -27820,6 +28024,7 @@ def test_get_connection_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ConnectionInfo() + post_with_metadata.return_value = resources.ConnectionInfo(), metadata client.get_connection_info( request, @@ -27831,6 +28036,7 @@ def test_get_connection_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_users_rest_bad_request(request_type=service.ListUsersRequest): @@ -27915,10 +28121,13 @@ def test_list_users_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_users" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_users_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_users" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListUsersRequest.pb(service.ListUsersRequest()) transcode.return_value = { "method": "post", @@ -27940,6 +28149,7 @@ def test_list_users_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListUsersResponse() + post_with_metadata.return_value = service.ListUsersResponse(), metadata client.list_users( request, @@ -27951,6 +28161,7 @@ def test_list_users_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_user_rest_bad_request(request_type=service.GetUserRequest): @@ -28045,10 +28256,13 @@ def test_get_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_get_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_get_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_get_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetUserRequest.pb(service.GetUserRequest()) transcode.return_value = { "method": "post", @@ -28070,6 +28284,7 @@ def test_get_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.get_user( request, @@ -28081,6 +28296,7 @@ def test_get_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_user_rest_bad_request(request_type=service.CreateUserRequest): @@ -28245,10 +28461,13 @@ def test_create_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_create_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_create_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_create_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateUserRequest.pb(service.CreateUserRequest()) transcode.return_value = { "method": "post", @@ -28270,6 +28489,7 @@ def test_create_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.create_user( request, @@ -28281,6 +28501,7 @@ def test_create_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_user_rest_bad_request(request_type=service.UpdateUserRequest): @@ -28453,10 +28674,13 @@ def test_update_user_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_update_user" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_update_user_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_update_user" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateUserRequest.pb(service.UpdateUserRequest()) transcode.return_value = { "method": "post", @@ -28478,6 +28702,7 @@ def test_update_user_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.User() + post_with_metadata.return_value = resources.User(), metadata client.update_user( request, @@ -28489,6 +28714,7 @@ def test_update_user_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_user_rest_bad_request(request_type=service.DeleteUserRequest): @@ -28680,10 +28906,13 @@ def test_list_databases_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "post_list_databases" ) as post, mock.patch.object( + transports.AlloyDBAdminRestInterceptor, "post_list_databases_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AlloyDBAdminRestInterceptor, "pre_list_databases" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListDatabasesRequest.pb(service.ListDatabasesRequest()) transcode.return_value = { "method": "post", @@ -28707,6 +28936,7 @@ def test_list_databases_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListDatabasesResponse() + post_with_metadata.return_value = service.ListDatabasesResponse(), metadata client.list_databases( request, @@ -28718,6 +28948,7 @@ def test_list_databases_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-api-gateway/google/cloud/apigateway/gapic_version.py b/packages/google-cloud-api-gateway/google/cloud/apigateway/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-api-gateway/google/cloud/apigateway/gapic_version.py +++ b/packages/google-cloud-api-gateway/google/cloud/apigateway/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-api-gateway/google/cloud/apigateway_v1/gapic_version.py b/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/gapic_version.py +++ b/packages/google-cloud-api-gateway/google/cloud/apigateway_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-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/client.py b/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/client.py index d32a2005b0a7..25cedbc25fc3 100644 --- a/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/client.py +++ b/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/services/api_gateway_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 @@ -585,6 +587,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-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/transports/rest.py b/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/transports/rest.py index ca7f2fcc2254..8c83e8c7c341 100644 --- a/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/transports/rest.py +++ b/packages/google-cloud-api-gateway/google/cloud/apigateway_v1/services/api_gateway_service/transports/rest.py @@ -212,12 +212,35 @@ def post_create_api( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_create_api` interceptor runs + before the `post_create_api_with_metadata` interceptor. """ return response + def post_create_api_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_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_create_api_with_metadata` + interceptor in new development instead of the `post_create_api` interceptor. + When both interceptors are used, this `post_create_api_with_metadata` interceptor runs after the + `post_create_api` interceptor. The (possibly modified) response returned by + `post_create_api` will be passed to + `post_create_api_with_metadata`. + """ + return response, metadata + def pre_create_api_config( self, request: apigateway.CreateApiConfigRequest, @@ -237,12 +260,35 @@ def post_create_api_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_api_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_create_api_config` interceptor runs + before the `post_create_api_config_with_metadata` interceptor. """ return response + def post_create_api_config_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_api_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_create_api_config_with_metadata` + interceptor in new development instead of the `post_create_api_config` interceptor. + When both interceptors are used, this `post_create_api_config_with_metadata` interceptor runs after the + `post_create_api_config` interceptor. The (possibly modified) response returned by + `post_create_api_config` will be passed to + `post_create_api_config_with_metadata`. + """ + return response, metadata + def pre_create_gateway( self, request: apigateway.CreateGatewayRequest, @@ -262,12 +308,35 @@ def post_create_gateway( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_gateway - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_gateway_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_create_gateway` interceptor runs + before the `post_create_gateway_with_metadata` interceptor. """ return response + def post_create_gateway_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_gateway + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_create_gateway_with_metadata` + interceptor in new development instead of the `post_create_gateway` interceptor. + When both interceptors are used, this `post_create_gateway_with_metadata` interceptor runs after the + `post_create_gateway` interceptor. The (possibly modified) response returned by + `post_create_gateway` will be passed to + `post_create_gateway_with_metadata`. + """ + return response, metadata + def pre_delete_api( self, request: apigateway.DeleteApiRequest, @@ -285,12 +354,35 @@ def post_delete_api( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_delete_api` interceptor runs + before the `post_delete_api_with_metadata` interceptor. """ return response + def post_delete_api_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_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_delete_api_with_metadata` + interceptor in new development instead of the `post_delete_api` interceptor. + When both interceptors are used, this `post_delete_api_with_metadata` interceptor runs after the + `post_delete_api` interceptor. The (possibly modified) response returned by + `post_delete_api` will be passed to + `post_delete_api_with_metadata`. + """ + return response, metadata + def pre_delete_api_config( self, request: apigateway.DeleteApiConfigRequest, @@ -310,12 +402,35 @@ def post_delete_api_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_api_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_api_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_delete_api_config` interceptor runs + before the `post_delete_api_config_with_metadata` interceptor. """ return response + def post_delete_api_config_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_api_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_delete_api_config_with_metadata` + interceptor in new development instead of the `post_delete_api_config` interceptor. + When both interceptors are used, this `post_delete_api_config_with_metadata` interceptor runs after the + `post_delete_api_config` interceptor. The (possibly modified) response returned by + `post_delete_api_config` will be passed to + `post_delete_api_config_with_metadata`. + """ + return response, metadata + def pre_delete_gateway( self, request: apigateway.DeleteGatewayRequest, @@ -335,12 +450,35 @@ def post_delete_gateway( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_gateway - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_gateway_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_delete_gateway` interceptor runs + before the `post_delete_gateway_with_metadata` interceptor. """ return response + def post_delete_gateway_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_gateway + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_delete_gateway_with_metadata` + interceptor in new development instead of the `post_delete_gateway` interceptor. + When both interceptors are used, this `post_delete_gateway_with_metadata` interceptor runs after the + `post_delete_gateway` interceptor. The (possibly modified) response returned by + `post_delete_gateway` will be passed to + `post_delete_gateway_with_metadata`. + """ + return response, metadata + def pre_get_api( self, request: apigateway.GetApiRequest, @@ -356,12 +494,35 @@ def pre_get_api( def post_get_api(self, response: apigateway.Api) -> apigateway.Api: """Post-rpc interceptor for get_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_get_api` interceptor runs + before the `post_get_api_with_metadata` interceptor. """ return response + def post_get_api_with_metadata( + self, + response: apigateway.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apigateway.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_get_api_with_metadata` + interceptor in new development instead of the `post_get_api` interceptor. + When both interceptors are used, this `post_get_api_with_metadata` interceptor runs after the + `post_get_api` interceptor. The (possibly modified) response returned by + `post_get_api` will be passed to + `post_get_api_with_metadata`. + """ + return response, metadata + def pre_get_api_config( self, request: apigateway.GetApiConfigRequest, @@ -379,12 +540,35 @@ def post_get_api_config( ) -> apigateway.ApiConfig: """Post-rpc interceptor for get_api_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_get_api_config` interceptor runs + before the `post_get_api_config_with_metadata` interceptor. """ return response + def post_get_api_config_with_metadata( + self, + response: apigateway.ApiConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apigateway.ApiConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_get_api_config_with_metadata` + interceptor in new development instead of the `post_get_api_config` interceptor. + When both interceptors are used, this `post_get_api_config_with_metadata` interceptor runs after the + `post_get_api_config` interceptor. The (possibly modified) response returned by + `post_get_api_config` will be passed to + `post_get_api_config_with_metadata`. + """ + return response, metadata + def pre_get_gateway( self, request: apigateway.GetGatewayRequest, @@ -400,12 +584,35 @@ def pre_get_gateway( def post_get_gateway(self, response: apigateway.Gateway) -> apigateway.Gateway: """Post-rpc interceptor for get_gateway - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_gateway_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_get_gateway` interceptor runs + before the `post_get_gateway_with_metadata` interceptor. """ return response + def post_get_gateway_with_metadata( + self, + response: apigateway.Gateway, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apigateway.Gateway, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_gateway + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_get_gateway_with_metadata` + interceptor in new development instead of the `post_get_gateway` interceptor. + When both interceptors are used, this `post_get_gateway_with_metadata` interceptor runs after the + `post_get_gateway` interceptor. The (possibly modified) response returned by + `post_get_gateway` will be passed to + `post_get_gateway_with_metadata`. + """ + return response, metadata + def pre_list_api_configs( self, request: apigateway.ListApiConfigsRequest, @@ -425,12 +632,37 @@ def post_list_api_configs( ) -> apigateway.ListApiConfigsResponse: """Post-rpc interceptor for list_api_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_list_api_configs` interceptor runs + before the `post_list_api_configs_with_metadata` interceptor. """ return response + def post_list_api_configs_with_metadata( + self, + response: apigateway.ListApiConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apigateway.ListApiConfigsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_api_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_list_api_configs_with_metadata` + interceptor in new development instead of the `post_list_api_configs` interceptor. + When both interceptors are used, this `post_list_api_configs_with_metadata` interceptor runs after the + `post_list_api_configs` interceptor. The (possibly modified) response returned by + `post_list_api_configs` will be passed to + `post_list_api_configs_with_metadata`. + """ + return response, metadata + def pre_list_apis( self, request: apigateway.ListApisRequest, @@ -448,12 +680,35 @@ def post_list_apis( ) -> apigateway.ListApisResponse: """Post-rpc interceptor for list_apis - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_apis_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_list_apis` interceptor runs + before the `post_list_apis_with_metadata` interceptor. """ return response + def post_list_apis_with_metadata( + self, + response: apigateway.ListApisResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apigateway.ListApisResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_apis + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_list_apis_with_metadata` + interceptor in new development instead of the `post_list_apis` interceptor. + When both interceptors are used, this `post_list_apis_with_metadata` interceptor runs after the + `post_list_apis` interceptor. The (possibly modified) response returned by + `post_list_apis` will be passed to + `post_list_apis_with_metadata`. + """ + return response, metadata + def pre_list_gateways( self, request: apigateway.ListGatewaysRequest, @@ -471,12 +726,37 @@ def post_list_gateways( ) -> apigateway.ListGatewaysResponse: """Post-rpc interceptor for list_gateways - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_gateways_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_list_gateways` interceptor runs + before the `post_list_gateways_with_metadata` interceptor. """ return response + def post_list_gateways_with_metadata( + self, + response: apigateway.ListGatewaysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apigateway.ListGatewaysResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_gateways + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_list_gateways_with_metadata` + interceptor in new development instead of the `post_list_gateways` interceptor. + When both interceptors are used, this `post_list_gateways_with_metadata` interceptor runs after the + `post_list_gateways` interceptor. The (possibly modified) response returned by + `post_list_gateways` will be passed to + `post_list_gateways_with_metadata`. + """ + return response, metadata + def pre_update_api( self, request: apigateway.UpdateApiRequest, @@ -494,12 +774,35 @@ def post_update_api( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_update_api` interceptor runs + before the `post_update_api_with_metadata` interceptor. """ return response + def post_update_api_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_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_update_api_with_metadata` + interceptor in new development instead of the `post_update_api` interceptor. + When both interceptors are used, this `post_update_api_with_metadata` interceptor runs after the + `post_update_api` interceptor. The (possibly modified) response returned by + `post_update_api` will be passed to + `post_update_api_with_metadata`. + """ + return response, metadata + def pre_update_api_config( self, request: apigateway.UpdateApiConfigRequest, @@ -519,12 +822,35 @@ def post_update_api_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_api_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_update_api_config` interceptor runs + before the `post_update_api_config_with_metadata` interceptor. """ return response + def post_update_api_config_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_api_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_update_api_config_with_metadata` + interceptor in new development instead of the `post_update_api_config` interceptor. + When both interceptors are used, this `post_update_api_config_with_metadata` interceptor runs after the + `post_update_api_config` interceptor. The (possibly modified) response returned by + `post_update_api_config` will be passed to + `post_update_api_config_with_metadata`. + """ + return response, metadata + def pre_update_gateway( self, request: apigateway.UpdateGatewayRequest, @@ -544,12 +870,35 @@ def post_update_gateway( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_gateway - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_gateway_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiGatewayService server but before - it is returned to user code. + it is returned to user code. This `post_update_gateway` interceptor runs + before the `post_update_gateway_with_metadata` interceptor. """ return response + def post_update_gateway_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_gateway + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiGatewayService server but before it is returned to user code. + + We recommend only using this `post_update_gateway_with_metadata` + interceptor in new development instead of the `post_update_gateway` interceptor. + When both interceptors are used, this `post_update_gateway_with_metadata` interceptor runs after the + `post_update_gateway` interceptor. The (possibly modified) response returned by + `post_update_gateway` will be passed to + `post_update_gateway_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ApiGatewayServiceRestStub: @@ -817,6 +1166,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -968,6 +1321,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1117,6 +1474,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_gateway(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_gateway_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1259,6 +1620,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1404,6 +1769,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_api_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_api_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1547,6 +1916,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_gateway(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_gateway_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1694,6 +2067,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1838,6 +2215,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1985,6 +2366,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_gateway(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_gateway_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2131,6 +2516,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_api_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2276,6 +2665,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_apis(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_apis_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2419,6 +2812,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_gateways(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_gateways_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2567,6 +2964,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2718,6 +3119,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2867,6 +3272,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_gateway(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_gateway_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-api-gateway/samples/generated_samples/snippet_metadata_google.cloud.apigateway.v1.json b/packages/google-cloud-api-gateway/samples/generated_samples/snippet_metadata_google.cloud.apigateway.v1.json index b6f087c63c0a..0d3028a33f91 100644 --- a/packages/google-cloud-api-gateway/samples/generated_samples/snippet_metadata_google.cloud.apigateway.v1.json +++ b/packages/google-cloud-api-gateway/samples/generated_samples/snippet_metadata_google.cloud.apigateway.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-api-gateway", - "version": "1.11.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-api-gateway/tests/unit/gapic/apigateway_v1/test_api_gateway_service.py b/packages/google-cloud-api-gateway/tests/unit/gapic/apigateway_v1/test_api_gateway_service.py index a64e1d0615a4..54bd4fd6bac9 100644 --- a/packages/google-cloud-api-gateway/tests/unit/gapic/apigateway_v1/test_api_gateway_service.py +++ b/packages/google-cloud-api-gateway/tests/unit/gapic/apigateway_v1/test_api_gateway_service.py @@ -73,6 +73,13 @@ ) from google.cloud.apigateway_v1.types import apigateway +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 = ApiGatewayServiceClient(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 = ApiGatewayServiceClient(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", [ @@ -10690,10 +10740,13 @@ def test_list_gateways_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_list_gateways" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_list_gateways_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_list_gateways" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.ListGatewaysRequest.pb(apigateway.ListGatewaysRequest()) transcode.return_value = { "method": "post", @@ -10717,6 +10770,7 @@ def test_list_gateways_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apigateway.ListGatewaysResponse() + post_with_metadata.return_value = apigateway.ListGatewaysResponse(), metadata client.list_gateways( request, @@ -10728,6 +10782,7 @@ def test_list_gateways_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_gateway_rest_bad_request(request_type=apigateway.GetGatewayRequest): @@ -10818,10 +10873,13 @@ def test_get_gateway_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_get_gateway" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_get_gateway_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_get_gateway" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.GetGatewayRequest.pb(apigateway.GetGatewayRequest()) transcode.return_value = { "method": "post", @@ -10843,6 +10901,7 @@ def test_get_gateway_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apigateway.Gateway() + post_with_metadata.return_value = apigateway.Gateway(), metadata client.get_gateway( request, @@ -10854,6 +10913,7 @@ def test_get_gateway_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_gateway_rest_bad_request(request_type=apigateway.CreateGatewayRequest): @@ -11009,10 +11069,13 @@ def test_create_gateway_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_create_gateway" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_create_gateway_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_create_gateway" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.CreateGatewayRequest.pb( apigateway.CreateGatewayRequest() ) @@ -11036,6 +11099,7 @@ def test_create_gateway_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_gateway( request, @@ -11047,6 +11111,7 @@ def test_create_gateway_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_gateway_rest_bad_request(request_type=apigateway.UpdateGatewayRequest): @@ -11206,10 +11271,13 @@ def test_update_gateway_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_update_gateway" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_update_gateway_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_update_gateway" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.UpdateGatewayRequest.pb( apigateway.UpdateGatewayRequest() ) @@ -11233,6 +11301,7 @@ def test_update_gateway_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_gateway( request, @@ -11244,6 +11313,7 @@ def test_update_gateway_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_gateway_rest_bad_request(request_type=apigateway.DeleteGatewayRequest): @@ -11322,10 +11392,13 @@ def test_delete_gateway_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_delete_gateway" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_delete_gateway_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_delete_gateway" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.DeleteGatewayRequest.pb( apigateway.DeleteGatewayRequest() ) @@ -11349,6 +11422,7 @@ def test_delete_gateway_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_gateway( request, @@ -11360,6 +11434,7 @@ def test_delete_gateway_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_apis_rest_bad_request(request_type=apigateway.ListApisRequest): @@ -11444,10 +11519,13 @@ def test_list_apis_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_list_apis" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_list_apis_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_list_apis" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.ListApisRequest.pb(apigateway.ListApisRequest()) transcode.return_value = { "method": "post", @@ -11471,6 +11549,7 @@ def test_list_apis_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apigateway.ListApisResponse() + post_with_metadata.return_value = apigateway.ListApisResponse(), metadata client.list_apis( request, @@ -11482,6 +11561,7 @@ def test_list_apis_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_rest_bad_request(request_type=apigateway.GetApiRequest): @@ -11570,10 +11650,13 @@ def test_get_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_get_api" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_get_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_get_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.GetApiRequest.pb(apigateway.GetApiRequest()) transcode.return_value = { "method": "post", @@ -11595,6 +11678,7 @@ def test_get_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apigateway.Api() + post_with_metadata.return_value = apigateway.Api(), metadata client.get_api( request, @@ -11606,6 +11690,7 @@ def test_get_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_api_rest_bad_request(request_type=apigateway.CreateApiRequest): @@ -11760,10 +11845,13 @@ def test_create_api_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_create_api" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_create_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_create_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.CreateApiRequest.pb(apigateway.CreateApiRequest()) transcode.return_value = { "method": "post", @@ -11785,6 +11873,7 @@ def test_create_api_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_api( request, @@ -11796,6 +11885,7 @@ def test_create_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_rest_bad_request(request_type=apigateway.UpdateApiRequest): @@ -11950,10 +12040,13 @@ def test_update_api_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_update_api" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_update_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_update_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.UpdateApiRequest.pb(apigateway.UpdateApiRequest()) transcode.return_value = { "method": "post", @@ -11975,6 +12068,7 @@ def test_update_api_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_api( request, @@ -11986,6 +12080,7 @@ def test_update_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_rest_bad_request(request_type=apigateway.DeleteApiRequest): @@ -12064,10 +12159,13 @@ def test_delete_api_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_delete_api" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_delete_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_delete_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.DeleteApiRequest.pb(apigateway.DeleteApiRequest()) transcode.return_value = { "method": "post", @@ -12089,6 +12187,7 @@ def test_delete_api_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_api( request, @@ -12100,6 +12199,7 @@ def test_delete_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_api_configs_rest_bad_request( @@ -12186,10 +12286,14 @@ def test_list_api_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_list_api_configs" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, + "post_list_api_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_list_api_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.ListApiConfigsRequest.pb( apigateway.ListApiConfigsRequest() ) @@ -12215,6 +12319,7 @@ def test_list_api_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apigateway.ListApiConfigsResponse() + post_with_metadata.return_value = apigateway.ListApiConfigsResponse(), metadata client.list_api_configs( request, @@ -12226,6 +12331,7 @@ def test_list_api_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_config_rest_bad_request(request_type=apigateway.GetApiConfigRequest): @@ -12320,10 +12426,13 @@ def test_get_api_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_get_api_config" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, "post_get_api_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_get_api_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.GetApiConfigRequest.pb(apigateway.GetApiConfigRequest()) transcode.return_value = { "method": "post", @@ -12345,6 +12454,7 @@ def test_get_api_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apigateway.ApiConfig() + post_with_metadata.return_value = apigateway.ApiConfig(), metadata client.get_api_config( request, @@ -12356,6 +12466,7 @@ def test_get_api_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_api_config_rest_bad_request( @@ -12518,10 +12629,14 @@ def test_create_api_config_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_create_api_config" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, + "post_create_api_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_create_api_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.CreateApiConfigRequest.pb( apigateway.CreateApiConfigRequest() ) @@ -12545,6 +12660,7 @@ def test_create_api_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_api_config( request, @@ -12556,6 +12672,7 @@ def test_create_api_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_config_rest_bad_request( @@ -12726,10 +12843,14 @@ def test_update_api_config_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_update_api_config" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, + "post_update_api_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_update_api_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.UpdateApiConfigRequest.pb( apigateway.UpdateApiConfigRequest() ) @@ -12753,6 +12874,7 @@ def test_update_api_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_api_config( request, @@ -12764,6 +12886,7 @@ def test_update_api_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_config_rest_bad_request( @@ -12848,10 +12971,14 @@ def test_delete_api_config_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "post_delete_api_config" ) as post, mock.patch.object( + transports.ApiGatewayServiceRestInterceptor, + "post_delete_api_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiGatewayServiceRestInterceptor, "pre_delete_api_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apigateway.DeleteApiConfigRequest.pb( apigateway.DeleteApiConfigRequest() ) @@ -12875,6 +13002,7 @@ def test_delete_api_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_api_config( request, @@ -12886,6 +13014,7 @@ def test_delete_api_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-api-keys/google/cloud/api_keys/gapic_version.py b/packages/google-cloud-api-keys/google/cloud/api_keys/gapic_version.py index 0f3dcb10f73a..558c8aab67c5 100644 --- a/packages/google-cloud-api-keys/google/cloud/api_keys/gapic_version.py +++ b/packages/google-cloud-api-keys/google/cloud/api_keys/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.5.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-api-keys/google/cloud/api_keys_v2/gapic_version.py b/packages/google-cloud-api-keys/google/cloud/api_keys_v2/gapic_version.py index 0f3dcb10f73a..558c8aab67c5 100644 --- a/packages/google-cloud-api-keys/google/cloud/api_keys_v2/gapic_version.py +++ b/packages/google-cloud-api-keys/google/cloud/api_keys_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.5.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/client.py b/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/client.py index a526124aaff9..6513930b3813 100644 --- a/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/client.py +++ b/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -489,6 +491,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1668,16 +1697,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-api-keys/google/cloud/api_keys_v2/services/api_keys/transports/rest.py b/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/transports/rest.py index bb2a6dbffd8a..fb4e931065ab 100644 --- a/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/transports/rest.py +++ b/packages/google-cloud-api-keys/google/cloud/api_keys_v2/services/api_keys/transports/rest.py @@ -156,12 +156,35 @@ def post_create_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_create_key` interceptor runs + before the `post_create_key_with_metadata` interceptor. """ return response + def post_create_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 create_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_create_key_with_metadata` + interceptor in new development instead of the `post_create_key` interceptor. + When both interceptors are used, this `post_create_key_with_metadata` interceptor runs after the + `post_create_key` interceptor. The (possibly modified) response returned by + `post_create_key` will be passed to + `post_create_key_with_metadata`. + """ + return response, metadata + def pre_delete_key( self, request: apikeys.DeleteKeyRequest, @@ -179,12 +202,35 @@ def post_delete_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_delete_key` interceptor runs + before the `post_delete_key_with_metadata` interceptor. """ return response + def post_delete_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 delete_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_delete_key_with_metadata` + interceptor in new development instead of the `post_delete_key` interceptor. + When both interceptors are used, this `post_delete_key_with_metadata` interceptor runs after the + `post_delete_key` interceptor. The (possibly modified) response returned by + `post_delete_key` will be passed to + `post_delete_key_with_metadata`. + """ + return response, metadata + def pre_get_key( self, request: apikeys.GetKeyRequest, @@ -200,12 +246,33 @@ def pre_get_key( def post_get_key(self, response: resources.Key) -> resources.Key: """Post-rpc interceptor for get_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_get_key` interceptor runs + before the `post_get_key_with_metadata` interceptor. """ return response + def post_get_key_with_metadata( + self, response: resources.Key, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[resources.Key, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_get_key_with_metadata` + interceptor in new development instead of the `post_get_key` interceptor. + When both interceptors are used, this `post_get_key_with_metadata` interceptor runs after the + `post_get_key` interceptor. The (possibly modified) response returned by + `post_get_key` will be passed to + `post_get_key_with_metadata`. + """ + return response, metadata + def pre_get_key_string( self, request: apikeys.GetKeyStringRequest, @@ -223,12 +290,35 @@ def post_get_key_string( ) -> apikeys.GetKeyStringResponse: """Post-rpc interceptor for get_key_string - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_key_string_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_get_key_string` interceptor runs + before the `post_get_key_string_with_metadata` interceptor. """ return response + def post_get_key_string_with_metadata( + self, + response: apikeys.GetKeyStringResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apikeys.GetKeyStringResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_key_string + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_get_key_string_with_metadata` + interceptor in new development instead of the `post_get_key_string` interceptor. + When both interceptors are used, this `post_get_key_string_with_metadata` interceptor runs after the + `post_get_key_string` interceptor. The (possibly modified) response returned by + `post_get_key_string` will be passed to + `post_get_key_string_with_metadata`. + """ + return response, metadata + def pre_list_keys( self, request: apikeys.ListKeysRequest, @@ -246,12 +336,35 @@ def post_list_keys( ) -> apikeys.ListKeysResponse: """Post-rpc interceptor for list_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_list_keys` interceptor runs + before the `post_list_keys_with_metadata` interceptor. """ return response + def post_list_keys_with_metadata( + self, + response: apikeys.ListKeysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apikeys.ListKeysResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_list_keys_with_metadata` + interceptor in new development instead of the `post_list_keys` interceptor. + When both interceptors are used, this `post_list_keys_with_metadata` interceptor runs after the + `post_list_keys` interceptor. The (possibly modified) response returned by + `post_list_keys` will be passed to + `post_list_keys_with_metadata`. + """ + return response, metadata + def pre_lookup_key( self, request: apikeys.LookupKeyRequest, @@ -269,12 +382,35 @@ def post_lookup_key( ) -> apikeys.LookupKeyResponse: """Post-rpc interceptor for lookup_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_lookup_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_lookup_key` interceptor runs + before the `post_lookup_key_with_metadata` interceptor. """ return response + def post_lookup_key_with_metadata( + self, + response: apikeys.LookupKeyResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[apikeys.LookupKeyResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for lookup_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_lookup_key_with_metadata` + interceptor in new development instead of the `post_lookup_key` interceptor. + When both interceptors are used, this `post_lookup_key_with_metadata` interceptor runs after the + `post_lookup_key` interceptor. The (possibly modified) response returned by + `post_lookup_key` will be passed to + `post_lookup_key_with_metadata`. + """ + return response, metadata + def pre_undelete_key( self, request: apikeys.UndeleteKeyRequest, @@ -292,12 +428,35 @@ def post_undelete_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_undelete_key` interceptor runs + before the `post_undelete_key_with_metadata` interceptor. """ return response + def post_undelete_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 undelete_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_undelete_key_with_metadata` + interceptor in new development instead of the `post_undelete_key` interceptor. + When both interceptors are used, this `post_undelete_key_with_metadata` interceptor runs after the + `post_undelete_key` interceptor. The (possibly modified) response returned by + `post_undelete_key` will be passed to + `post_undelete_key_with_metadata`. + """ + return response, metadata + def pre_update_key( self, request: apikeys.UpdateKeyRequest, @@ -315,12 +474,35 @@ def post_update_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiKeys server but before - it is returned to user code. + it is returned to user code. This `post_update_key` interceptor runs + before the `post_update_key_with_metadata` interceptor. """ return response + def post_update_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 update_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiKeys server but before it is returned to user code. + + We recommend only using this `post_update_key_with_metadata` + interceptor in new development instead of the `post_update_key` interceptor. + When both interceptors are used, this `post_update_key_with_metadata` interceptor runs after the + `post_update_key` interceptor. The (possibly modified) response returned by + `post_update_key` will be passed to + `post_update_key_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -592,6 +774,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -733,6 +919,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -873,6 +1063,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1015,6 +1209,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_key_string(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_key_string_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1155,6 +1353,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1295,6 +1497,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_lookup_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_lookup_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1444,6 +1650,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undelete_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1591,6 +1801,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-api-keys/samples/generated_samples/snippet_metadata_google.api.apikeys.v2.json b/packages/google-cloud-api-keys/samples/generated_samples/snippet_metadata_google.api.apikeys.v2.json index 0fcb55ecaf4b..3f1f9841f3c1 100644 --- a/packages/google-cloud-api-keys/samples/generated_samples/snippet_metadata_google.api.apikeys.v2.json +++ b/packages/google-cloud-api-keys/samples/generated_samples/snippet_metadata_google.api.apikeys.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-api-keys", - "version": "0.5.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-api-keys/tests/unit/gapic/api_keys_v2/test_api_keys.py b/packages/google-cloud-api-keys/tests/unit/gapic/api_keys_v2/test_api_keys.py index 5c44698b7fe6..2f3316e590a2 100644 --- a/packages/google-cloud-api-keys/tests/unit/gapic/api_keys_v2/test_api_keys.py +++ b/packages/google-cloud-api-keys/tests/unit/gapic/api_keys_v2/test_api_keys.py @@ -73,6 +73,13 @@ ) from google.cloud.api_keys_v2.types import apikeys, 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 @@ -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 = ApiKeysClient(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 = ApiKeysClient(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", [ @@ -5701,10 +5751,13 @@ def test_create_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiKeysRestInterceptor, "post_create_key" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_create_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_create_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.CreateKeyRequest.pb(apikeys.CreateKeyRequest()) transcode.return_value = { "method": "post", @@ -5726,6 +5779,7 @@ def test_create_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.create_key( request, @@ -5737,6 +5791,7 @@ def test_create_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_keys_rest_bad_request(request_type=apikeys.ListKeysRequest): @@ -5817,10 +5872,13 @@ def test_list_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiKeysRestInterceptor, "post_list_keys" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_list_keys_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_list_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.ListKeysRequest.pb(apikeys.ListKeysRequest()) transcode.return_value = { "method": "post", @@ -5842,6 +5900,7 @@ def test_list_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apikeys.ListKeysResponse() + post_with_metadata.return_value = apikeys.ListKeysResponse(), metadata client.list_keys( request, @@ -5853,6 +5912,7 @@ def test_list_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_key_rest_bad_request(request_type=apikeys.GetKeyRequest): @@ -5941,10 +6001,13 @@ def test_get_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiKeysRestInterceptor, "post_get_key" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_get_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_get_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.GetKeyRequest.pb(apikeys.GetKeyRequest()) transcode.return_value = { "method": "post", @@ -5966,6 +6029,7 @@ def test_get_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Key() + post_with_metadata.return_value = resources.Key(), metadata client.get_key( request, @@ -5977,6 +6041,7 @@ def test_get_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_key_string_rest_bad_request(request_type=apikeys.GetKeyStringRequest): @@ -6057,10 +6122,13 @@ def test_get_key_string_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiKeysRestInterceptor, "post_get_key_string" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_get_key_string_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_get_key_string" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.GetKeyStringRequest.pb(apikeys.GetKeyStringRequest()) transcode.return_value = { "method": "post", @@ -6084,6 +6152,7 @@ def test_get_key_string_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apikeys.GetKeyStringResponse() + post_with_metadata.return_value = apikeys.GetKeyStringResponse(), metadata client.get_key_string( request, @@ -6095,6 +6164,7 @@ def test_get_key_string_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_key_rest_bad_request(request_type=apikeys.UpdateKeyRequest): @@ -6280,10 +6350,13 @@ def test_update_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiKeysRestInterceptor, "post_update_key" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_update_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_update_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.UpdateKeyRequest.pb(apikeys.UpdateKeyRequest()) transcode.return_value = { "method": "post", @@ -6305,6 +6378,7 @@ def test_update_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.update_key( request, @@ -6316,6 +6390,7 @@ def test_update_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_key_rest_bad_request(request_type=apikeys.DeleteKeyRequest): @@ -6392,10 +6467,13 @@ def test_delete_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiKeysRestInterceptor, "post_delete_key" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_delete_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_delete_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.DeleteKeyRequest.pb(apikeys.DeleteKeyRequest()) transcode.return_value = { "method": "post", @@ -6417,6 +6495,7 @@ def test_delete_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.delete_key( request, @@ -6428,6 +6507,7 @@ def test_delete_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_key_rest_bad_request(request_type=apikeys.UndeleteKeyRequest): @@ -6504,10 +6584,13 @@ def test_undelete_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApiKeysRestInterceptor, "post_undelete_key" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_undelete_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_undelete_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.UndeleteKeyRequest.pb(apikeys.UndeleteKeyRequest()) transcode.return_value = { "method": "post", @@ -6529,6 +6612,7 @@ def test_undelete_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.undelete_key( request, @@ -6540,6 +6624,7 @@ def test_undelete_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_lookup_key_rest_bad_request(request_type=apikeys.LookupKeyRequest): @@ -6622,10 +6707,13 @@ def test_lookup_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiKeysRestInterceptor, "post_lookup_key" ) as post, mock.patch.object( + transports.ApiKeysRestInterceptor, "post_lookup_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiKeysRestInterceptor, "pre_lookup_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apikeys.LookupKeyRequest.pb(apikeys.LookupKeyRequest()) transcode.return_value = { "method": "post", @@ -6647,6 +6735,7 @@ def test_lookup_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apikeys.LookupKeyResponse() + post_with_metadata.return_value = apikeys.LookupKeyResponse(), metadata client.lookup_key( request, @@ -6658,6 +6747,7 @@ def test_lookup_key_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-apigee-connect/google/cloud/apigeeconnect/gapic_version.py b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect/gapic_version.py +++ b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect/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-apigee-connect/google/cloud/apigeeconnect_v1/gapic_version.py b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/gapic_version.py +++ b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_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-apigee-connect/google/cloud/apigeeconnect_v1/services/connection_service/client.py b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/connection_service/client.py index b57059b8dea1..2f838a29e0f9 100644 --- a/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/connection_service/client.py +++ b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/connection_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. diff --git a/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/tether/client.py b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/tether/client.py index 4c037bad3e35..c1037a88e617 100644 --- a/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/tether/client.py +++ b/packages/google-cloud-apigee-connect/google/cloud/apigeeconnect_v1/services/tether/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-apigee-connect/samples/generated_samples/snippet_metadata_google.cloud.apigeeconnect.v1.json b/packages/google-cloud-apigee-connect/samples/generated_samples/snippet_metadata_google.cloud.apigeeconnect.v1.json index d5e0b1dcce51..ce1973950a71 100644 --- a/packages/google-cloud-apigee-connect/samples/generated_samples/snippet_metadata_google.cloud.apigeeconnect.v1.json +++ b/packages/google-cloud-apigee-connect/samples/generated_samples/snippet_metadata_google.cloud.apigeeconnect.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-apigee-connect", - "version": "1.11.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_connection_service.py b/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_connection_service.py index e9418bd984a8..19c40db4e952 100644 --- a/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_connection_service.py +++ b/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_connection_service.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -55,6 +56,13 @@ ) from google.cloud.apigeeconnect_v1.types import connection +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 +330,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ConnectionServiceClient(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 = ConnectionServiceClient(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-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_tether.py b/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_tether.py index 9018fd010c76..7bf3a4bb46bd 100644 --- a/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_tether.py +++ b/packages/google-cloud-apigee-connect/tests/unit/gapic/apigeeconnect_v1/test_tether.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -57,6 +58,13 @@ ) from google.cloud.apigeeconnect_v1.types import tether +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -279,6 +287,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TetherClient(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 = TetherClient(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-apigee-registry/google/cloud/apigee_registry/gapic_version.py b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry/gapic_version.py index 0b6dbde2b051..558c8aab67c5 100644 --- a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry/gapic_version.py +++ b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/gapic_version.py b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/gapic_version.py index 0b6dbde2b051..558c8aab67c5 100644 --- a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/gapic_version.py +++ b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/client.py b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/client.py index a7110deae9eb..beaeaaa6a4bf 100644 --- a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/client.py +++ b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/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 @@ -492,6 +494,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. @@ -1121,16 +1150,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, @@ -1176,16 +1209,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, @@ -1408,16 +1445,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, @@ -1530,16 +1571,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, @@ -1590,16 +1635,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, @@ -1645,16 +1694,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, @@ -1700,16 +1753,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-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/transports/rest.py b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/transports/rest.py index 4e00f6d48821..9a32fe004c08 100644 --- a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/transports/rest.py +++ b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/provisioning/transports/rest.py @@ -122,12 +122,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 Provisioning 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 Provisioning server but before it is returned to user code. + + We recommend only using this `post_create_instance_with_metadata` + interceptor in new development instead of the `post_create_instance` interceptor. + When both interceptors are used, this `post_create_instance_with_metadata` interceptor runs after the + `post_create_instance` interceptor. The (possibly modified) response returned by + `post_create_instance` will be passed to + `post_create_instance_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: provisioning_service.DeleteInstanceRequest, @@ -148,12 +171,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 Provisioning 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 Provisioning server but before it is returned to user code. + + We recommend only using this `post_delete_instance_with_metadata` + interceptor in new development instead of the `post_delete_instance` interceptor. + When both interceptors are used, this `post_delete_instance_with_metadata` interceptor runs after the + `post_delete_instance` interceptor. The (possibly modified) response returned by + `post_delete_instance` will be passed to + `post_delete_instance_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: provisioning_service.GetInstanceRequest, @@ -173,12 +219,35 @@ def post_get_instance( ) -> provisioning_service.Instance: """Post-rpc interceptor for get_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Provisioning 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: provisioning_service.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[provisioning_service.Instance, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Provisioning 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_location( self, request: locations_pb2.GetLocationRequest, @@ -663,6 +732,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 @@ -804,6 +877,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 @@ -952,6 +1029,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 diff --git a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/client.py b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/client.py index b9fdde2a8a2b..ec0f6b96537b 100644 --- a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/client.py +++ b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/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 @@ -589,6 +591,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. @@ -4901,16 +4930,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, @@ -4956,16 +4989,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, @@ -5188,16 +5225,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, @@ -5310,16 +5351,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, @@ -5370,16 +5415,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, @@ -5425,16 +5474,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, @@ -5480,16 +5533,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-apigee-registry/google/cloud/apigee_registry_v1/services/registry/transports/rest.py b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/transports/rest.py index 5a42b2c8b1a9..453047dd6733 100644 --- a/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/transports/rest.py +++ b/packages/google-cloud-apigee-registry/google/cloud/apigee_registry_v1/services/registry/transports/rest.py @@ -357,12 +357,35 @@ def pre_create_api( def post_create_api(self, response: registry_models.Api) -> registry_models.Api: """Post-rpc interceptor for create_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_create_api` interceptor runs + before the `post_create_api_with_metadata` interceptor. """ return response + def post_create_api_with_metadata( + self, + response: registry_models.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_create_api_with_metadata` + interceptor in new development instead of the `post_create_api` interceptor. + When both interceptors are used, this `post_create_api_with_metadata` interceptor runs after the + `post_create_api` interceptor. The (possibly modified) response returned by + `post_create_api` will be passed to + `post_create_api_with_metadata`. + """ + return response, metadata + def pre_create_api_deployment( self, request: registry_service.CreateApiDeploymentRequest, @@ -383,12 +406,35 @@ def post_create_api_deployment( ) -> registry_models.ApiDeployment: """Post-rpc interceptor for create_api_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_create_api_deployment` interceptor runs + before the `post_create_api_deployment_with_metadata` interceptor. """ return response + def post_create_api_deployment_with_metadata( + self, + response: registry_models.ApiDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiDeployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_api_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_create_api_deployment_with_metadata` + interceptor in new development instead of the `post_create_api_deployment` interceptor. + When both interceptors are used, this `post_create_api_deployment_with_metadata` interceptor runs after the + `post_create_api_deployment` interceptor. The (possibly modified) response returned by + `post_create_api_deployment` will be passed to + `post_create_api_deployment_with_metadata`. + """ + return response, metadata + def pre_create_api_spec( self, request: registry_service.CreateApiSpecRequest, @@ -408,12 +454,35 @@ def post_create_api_spec( ) -> registry_models.ApiSpec: """Post-rpc interceptor for create_api_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_create_api_spec` interceptor runs + before the `post_create_api_spec_with_metadata` interceptor. """ return response + def post_create_api_spec_with_metadata( + self, + response: registry_models.ApiSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_api_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_create_api_spec_with_metadata` + interceptor in new development instead of the `post_create_api_spec` interceptor. + When both interceptors are used, this `post_create_api_spec_with_metadata` interceptor runs after the + `post_create_api_spec` interceptor. The (possibly modified) response returned by + `post_create_api_spec` will be passed to + `post_create_api_spec_with_metadata`. + """ + return response, metadata + def pre_create_api_version( self, request: registry_service.CreateApiVersionRequest, @@ -434,12 +503,35 @@ def post_create_api_version( ) -> registry_models.ApiVersion: """Post-rpc interceptor for create_api_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_create_api_version` interceptor runs + before the `post_create_api_version_with_metadata` interceptor. """ return response + def post_create_api_version_with_metadata( + self, + response: registry_models.ApiVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_api_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_create_api_version_with_metadata` + interceptor in new development instead of the `post_create_api_version` interceptor. + When both interceptors are used, this `post_create_api_version_with_metadata` interceptor runs after the + `post_create_api_version` interceptor. The (possibly modified) response returned by + `post_create_api_version` will be passed to + `post_create_api_version_with_metadata`. + """ + return response, metadata + def pre_create_artifact( self, request: registry_service.CreateArtifactRequest, @@ -459,12 +551,35 @@ def post_create_artifact( ) -> registry_models.Artifact: """Post-rpc interceptor for create_artifact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_artifact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_create_artifact` interceptor runs + before the `post_create_artifact_with_metadata` interceptor. """ return response + def post_create_artifact_with_metadata( + self, + response: registry_models.Artifact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.Artifact, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_artifact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_create_artifact_with_metadata` + interceptor in new development instead of the `post_create_artifact` interceptor. + When both interceptors are used, this `post_create_artifact_with_metadata` interceptor runs after the + `post_create_artifact` interceptor. The (possibly modified) response returned by + `post_create_artifact` will be passed to + `post_create_artifact_with_metadata`. + """ + return response, metadata + def pre_delete_api( self, request: registry_service.DeleteApiRequest, @@ -514,12 +629,35 @@ def post_delete_api_deployment_revision( ) -> registry_models.ApiDeployment: """Post-rpc interceptor for delete_api_deployment_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_api_deployment_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_delete_api_deployment_revision` interceptor runs + before the `post_delete_api_deployment_revision_with_metadata` interceptor. """ return response + def post_delete_api_deployment_revision_with_metadata( + self, + response: registry_models.ApiDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiDeployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_api_deployment_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_delete_api_deployment_revision_with_metadata` + interceptor in new development instead of the `post_delete_api_deployment_revision` interceptor. + When both interceptors are used, this `post_delete_api_deployment_revision_with_metadata` interceptor runs after the + `post_delete_api_deployment_revision` interceptor. The (possibly modified) response returned by + `post_delete_api_deployment_revision` will be passed to + `post_delete_api_deployment_revision_with_metadata`. + """ + return response, metadata + def pre_delete_api_spec( self, request: registry_service.DeleteApiSpecRequest, @@ -554,12 +692,35 @@ def post_delete_api_spec_revision( ) -> registry_models.ApiSpec: """Post-rpc interceptor for delete_api_spec_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_api_spec_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_delete_api_spec_revision` interceptor runs + before the `post_delete_api_spec_revision_with_metadata` interceptor. """ return response + def post_delete_api_spec_revision_with_metadata( + self, + response: registry_models.ApiSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_api_spec_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_delete_api_spec_revision_with_metadata` + interceptor in new development instead of the `post_delete_api_spec_revision` interceptor. + When both interceptors are used, this `post_delete_api_spec_revision_with_metadata` interceptor runs after the + `post_delete_api_spec_revision` interceptor. The (possibly modified) response returned by + `post_delete_api_spec_revision` will be passed to + `post_delete_api_spec_revision_with_metadata`. + """ + return response, metadata + def pre_delete_api_version( self, request: registry_service.DeleteApiVersionRequest, @@ -604,12 +765,35 @@ def pre_get_api( def post_get_api(self, response: registry_models.Api) -> registry_models.Api: """Post-rpc interceptor for get_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_api` interceptor runs + before the `post_get_api_with_metadata` interceptor. """ return response + def post_get_api_with_metadata( + self, + response: registry_models.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_api_with_metadata` + interceptor in new development instead of the `post_get_api` interceptor. + When both interceptors are used, this `post_get_api_with_metadata` interceptor runs after the + `post_get_api` interceptor. The (possibly modified) response returned by + `post_get_api` will be passed to + `post_get_api_with_metadata`. + """ + return response, metadata + def pre_get_api_deployment( self, request: registry_service.GetApiDeploymentRequest, @@ -630,12 +814,35 @@ def post_get_api_deployment( ) -> registry_models.ApiDeployment: """Post-rpc interceptor for get_api_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_api_deployment` interceptor runs + before the `post_get_api_deployment_with_metadata` interceptor. """ return response + def post_get_api_deployment_with_metadata( + self, + response: registry_models.ApiDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiDeployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_api_deployment_with_metadata` + interceptor in new development instead of the `post_get_api_deployment` interceptor. + When both interceptors are used, this `post_get_api_deployment_with_metadata` interceptor runs after the + `post_get_api_deployment` interceptor. The (possibly modified) response returned by + `post_get_api_deployment` will be passed to + `post_get_api_deployment_with_metadata`. + """ + return response, metadata + def pre_get_api_spec( self, request: registry_service.GetApiSpecRequest, @@ -655,12 +862,35 @@ def post_get_api_spec( ) -> registry_models.ApiSpec: """Post-rpc interceptor for get_api_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_api_spec` interceptor runs + before the `post_get_api_spec_with_metadata` interceptor. """ return response + def post_get_api_spec_with_metadata( + self, + response: registry_models.ApiSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_api_spec_with_metadata` + interceptor in new development instead of the `post_get_api_spec` interceptor. + When both interceptors are used, this `post_get_api_spec_with_metadata` interceptor runs after the + `post_get_api_spec` interceptor. The (possibly modified) response returned by + `post_get_api_spec` will be passed to + `post_get_api_spec_with_metadata`. + """ + return response, metadata + def pre_get_api_spec_contents( self, request: registry_service.GetApiSpecContentsRequest, @@ -681,12 +911,35 @@ def post_get_api_spec_contents( ) -> httpbody_pb2.HttpBody: """Post-rpc interceptor for get_api_spec_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_spec_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_api_spec_contents` interceptor runs + before the `post_get_api_spec_contents_with_metadata` interceptor. """ return response + def post_get_api_spec_contents_with_metadata( + self, + response: httpbody_pb2.HttpBody, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[httpbody_pb2.HttpBody, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_spec_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_api_spec_contents_with_metadata` + interceptor in new development instead of the `post_get_api_spec_contents` interceptor. + When both interceptors are used, this `post_get_api_spec_contents_with_metadata` interceptor runs after the + `post_get_api_spec_contents` interceptor. The (possibly modified) response returned by + `post_get_api_spec_contents` will be passed to + `post_get_api_spec_contents_with_metadata`. + """ + return response, metadata + def pre_get_api_version( self, request: registry_service.GetApiVersionRequest, @@ -706,12 +959,35 @@ def post_get_api_version( ) -> registry_models.ApiVersion: """Post-rpc interceptor for get_api_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_api_version` interceptor runs + before the `post_get_api_version_with_metadata` interceptor. """ return response + def post_get_api_version_with_metadata( + self, + response: registry_models.ApiVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_api_version_with_metadata` + interceptor in new development instead of the `post_get_api_version` interceptor. + When both interceptors are used, this `post_get_api_version_with_metadata` interceptor runs after the + `post_get_api_version` interceptor. The (possibly modified) response returned by + `post_get_api_version` will be passed to + `post_get_api_version_with_metadata`. + """ + return response, metadata + def pre_get_artifact( self, request: registry_service.GetArtifactRequest, @@ -731,12 +1007,35 @@ def post_get_artifact( ) -> registry_models.Artifact: """Post-rpc interceptor for get_artifact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_artifact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_artifact` interceptor runs + before the `post_get_artifact_with_metadata` interceptor. """ return response + def post_get_artifact_with_metadata( + self, + response: registry_models.Artifact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.Artifact, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_artifact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_artifact_with_metadata` + interceptor in new development instead of the `post_get_artifact` interceptor. + When both interceptors are used, this `post_get_artifact_with_metadata` interceptor runs after the + `post_get_artifact` interceptor. The (possibly modified) response returned by + `post_get_artifact` will be passed to + `post_get_artifact_with_metadata`. + """ + return response, metadata + def pre_get_artifact_contents( self, request: registry_service.GetArtifactContentsRequest, @@ -757,12 +1056,35 @@ def post_get_artifact_contents( ) -> httpbody_pb2.HttpBody: """Post-rpc interceptor for get_artifact_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_artifact_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_get_artifact_contents` interceptor runs + before the `post_get_artifact_contents_with_metadata` interceptor. """ return response + def post_get_artifact_contents_with_metadata( + self, + response: httpbody_pb2.HttpBody, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[httpbody_pb2.HttpBody, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_artifact_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_get_artifact_contents_with_metadata` + interceptor in new development instead of the `post_get_artifact_contents` interceptor. + When both interceptors are used, this `post_get_artifact_contents_with_metadata` interceptor runs after the + `post_get_artifact_contents` interceptor. The (possibly modified) response returned by + `post_get_artifact_contents` will be passed to + `post_get_artifact_contents_with_metadata`. + """ + return response, metadata + def pre_list_api_deployment_revisions( self, request: registry_service.ListApiDeploymentRevisionsRequest, @@ -783,12 +1105,38 @@ def post_list_api_deployment_revisions( ) -> registry_service.ListApiDeploymentRevisionsResponse: """Post-rpc interceptor for list_api_deployment_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_deployment_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_api_deployment_revisions` interceptor runs + before the `post_list_api_deployment_revisions_with_metadata` interceptor. """ return response + def post_list_api_deployment_revisions_with_metadata( + self, + response: registry_service.ListApiDeploymentRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListApiDeploymentRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_api_deployment_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_api_deployment_revisions_with_metadata` + interceptor in new development instead of the `post_list_api_deployment_revisions` interceptor. + When both interceptors are used, this `post_list_api_deployment_revisions_with_metadata` interceptor runs after the + `post_list_api_deployment_revisions` interceptor. The (possibly modified) response returned by + `post_list_api_deployment_revisions` will be passed to + `post_list_api_deployment_revisions_with_metadata`. + """ + return response, metadata + def pre_list_api_deployments( self, request: registry_service.ListApiDeploymentsRequest, @@ -809,12 +1157,38 @@ def post_list_api_deployments( ) -> registry_service.ListApiDeploymentsResponse: """Post-rpc interceptor for list_api_deployments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_deployments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_api_deployments` interceptor runs + before the `post_list_api_deployments_with_metadata` interceptor. """ return response + def post_list_api_deployments_with_metadata( + self, + response: registry_service.ListApiDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListApiDeploymentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_api_deployments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_api_deployments_with_metadata` + interceptor in new development instead of the `post_list_api_deployments` interceptor. + When both interceptors are used, this `post_list_api_deployments_with_metadata` interceptor runs after the + `post_list_api_deployments` interceptor. The (possibly modified) response returned by + `post_list_api_deployments` will be passed to + `post_list_api_deployments_with_metadata`. + """ + return response, metadata + def pre_list_apis( self, request: registry_service.ListApisRequest, @@ -834,12 +1208,37 @@ def post_list_apis( ) -> registry_service.ListApisResponse: """Post-rpc interceptor for list_apis - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_apis_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_apis` interceptor runs + before the `post_list_apis_with_metadata` interceptor. """ return response + def post_list_apis_with_metadata( + self, + response: registry_service.ListApisResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListApisResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_apis + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_apis_with_metadata` + interceptor in new development instead of the `post_list_apis` interceptor. + When both interceptors are used, this `post_list_apis_with_metadata` interceptor runs after the + `post_list_apis` interceptor. The (possibly modified) response returned by + `post_list_apis` will be passed to + `post_list_apis_with_metadata`. + """ + return response, metadata + def pre_list_api_spec_revisions( self, request: registry_service.ListApiSpecRevisionsRequest, @@ -860,12 +1259,38 @@ def post_list_api_spec_revisions( ) -> registry_service.ListApiSpecRevisionsResponse: """Post-rpc interceptor for list_api_spec_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_spec_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_api_spec_revisions` interceptor runs + before the `post_list_api_spec_revisions_with_metadata` interceptor. """ return response + def post_list_api_spec_revisions_with_metadata( + self, + response: registry_service.ListApiSpecRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListApiSpecRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_api_spec_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_api_spec_revisions_with_metadata` + interceptor in new development instead of the `post_list_api_spec_revisions` interceptor. + When both interceptors are used, this `post_list_api_spec_revisions_with_metadata` interceptor runs after the + `post_list_api_spec_revisions` interceptor. The (possibly modified) response returned by + `post_list_api_spec_revisions` will be passed to + `post_list_api_spec_revisions_with_metadata`. + """ + return response, metadata + def pre_list_api_specs( self, request: registry_service.ListApiSpecsRequest, @@ -885,12 +1310,37 @@ def post_list_api_specs( ) -> registry_service.ListApiSpecsResponse: """Post-rpc interceptor for list_api_specs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_specs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_api_specs` interceptor runs + before the `post_list_api_specs_with_metadata` interceptor. """ return response + def post_list_api_specs_with_metadata( + self, + response: registry_service.ListApiSpecsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListApiSpecsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_api_specs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_api_specs_with_metadata` + interceptor in new development instead of the `post_list_api_specs` interceptor. + When both interceptors are used, this `post_list_api_specs_with_metadata` interceptor runs after the + `post_list_api_specs` interceptor. The (possibly modified) response returned by + `post_list_api_specs` will be passed to + `post_list_api_specs_with_metadata`. + """ + return response, metadata + def pre_list_api_versions( self, request: registry_service.ListApiVersionsRequest, @@ -910,12 +1360,38 @@ def post_list_api_versions( ) -> registry_service.ListApiVersionsResponse: """Post-rpc interceptor for list_api_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_api_versions` interceptor runs + before the `post_list_api_versions_with_metadata` interceptor. """ return response + def post_list_api_versions_with_metadata( + self, + response: registry_service.ListApiVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListApiVersionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_api_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_api_versions_with_metadata` + interceptor in new development instead of the `post_list_api_versions` interceptor. + When both interceptors are used, this `post_list_api_versions_with_metadata` interceptor runs after the + `post_list_api_versions` interceptor. The (possibly modified) response returned by + `post_list_api_versions` will be passed to + `post_list_api_versions_with_metadata`. + """ + return response, metadata + def pre_list_artifacts( self, request: registry_service.ListArtifactsRequest, @@ -935,12 +1411,37 @@ def post_list_artifacts( ) -> registry_service.ListArtifactsResponse: """Post-rpc interceptor for list_artifacts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_artifacts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_list_artifacts` interceptor runs + before the `post_list_artifacts_with_metadata` interceptor. """ return response + def post_list_artifacts_with_metadata( + self, + response: registry_service.ListArtifactsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registry_service.ListArtifactsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_artifacts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_list_artifacts_with_metadata` + interceptor in new development instead of the `post_list_artifacts` interceptor. + When both interceptors are used, this `post_list_artifacts_with_metadata` interceptor runs after the + `post_list_artifacts` interceptor. The (possibly modified) response returned by + `post_list_artifacts` will be passed to + `post_list_artifacts_with_metadata`. + """ + return response, metadata + def pre_replace_artifact( self, request: registry_service.ReplaceArtifactRequest, @@ -960,12 +1461,35 @@ def post_replace_artifact( ) -> registry_models.Artifact: """Post-rpc interceptor for replace_artifact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_replace_artifact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_replace_artifact` interceptor runs + before the `post_replace_artifact_with_metadata` interceptor. """ return response + def post_replace_artifact_with_metadata( + self, + response: registry_models.Artifact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.Artifact, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for replace_artifact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_replace_artifact_with_metadata` + interceptor in new development instead of the `post_replace_artifact` interceptor. + When both interceptors are used, this `post_replace_artifact_with_metadata` interceptor runs after the + `post_replace_artifact` interceptor. The (possibly modified) response returned by + `post_replace_artifact` will be passed to + `post_replace_artifact_with_metadata`. + """ + return response, metadata + def pre_rollback_api_deployment( self, request: registry_service.RollbackApiDeploymentRequest, @@ -986,12 +1510,35 @@ def post_rollback_api_deployment( ) -> registry_models.ApiDeployment: """Post-rpc interceptor for rollback_api_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_rollback_api_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_rollback_api_deployment` interceptor runs + before the `post_rollback_api_deployment_with_metadata` interceptor. """ return response + def post_rollback_api_deployment_with_metadata( + self, + response: registry_models.ApiDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiDeployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for rollback_api_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_rollback_api_deployment_with_metadata` + interceptor in new development instead of the `post_rollback_api_deployment` interceptor. + When both interceptors are used, this `post_rollback_api_deployment_with_metadata` interceptor runs after the + `post_rollback_api_deployment` interceptor. The (possibly modified) response returned by + `post_rollback_api_deployment` will be passed to + `post_rollback_api_deployment_with_metadata`. + """ + return response, metadata + def pre_rollback_api_spec( self, request: registry_service.RollbackApiSpecRequest, @@ -1011,12 +1558,35 @@ def post_rollback_api_spec( ) -> registry_models.ApiSpec: """Post-rpc interceptor for rollback_api_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_rollback_api_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_rollback_api_spec` interceptor runs + before the `post_rollback_api_spec_with_metadata` interceptor. """ return response + def post_rollback_api_spec_with_metadata( + self, + response: registry_models.ApiSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for rollback_api_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_rollback_api_spec_with_metadata` + interceptor in new development instead of the `post_rollback_api_spec` interceptor. + When both interceptors are used, this `post_rollback_api_spec_with_metadata` interceptor runs after the + `post_rollback_api_spec` interceptor. The (possibly modified) response returned by + `post_rollback_api_spec` will be passed to + `post_rollback_api_spec_with_metadata`. + """ + return response, metadata + def pre_tag_api_deployment_revision( self, request: registry_service.TagApiDeploymentRevisionRequest, @@ -1037,12 +1607,35 @@ def post_tag_api_deployment_revision( ) -> registry_models.ApiDeployment: """Post-rpc interceptor for tag_api_deployment_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_tag_api_deployment_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_tag_api_deployment_revision` interceptor runs + before the `post_tag_api_deployment_revision_with_metadata` interceptor. """ return response + def post_tag_api_deployment_revision_with_metadata( + self, + response: registry_models.ApiDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiDeployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for tag_api_deployment_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_tag_api_deployment_revision_with_metadata` + interceptor in new development instead of the `post_tag_api_deployment_revision` interceptor. + When both interceptors are used, this `post_tag_api_deployment_revision_with_metadata` interceptor runs after the + `post_tag_api_deployment_revision` interceptor. The (possibly modified) response returned by + `post_tag_api_deployment_revision` will be passed to + `post_tag_api_deployment_revision_with_metadata`. + """ + return response, metadata + def pre_tag_api_spec_revision( self, request: registry_service.TagApiSpecRevisionRequest, @@ -1063,12 +1656,35 @@ def post_tag_api_spec_revision( ) -> registry_models.ApiSpec: """Post-rpc interceptor for tag_api_spec_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_tag_api_spec_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_tag_api_spec_revision` interceptor runs + before the `post_tag_api_spec_revision_with_metadata` interceptor. """ return response + def post_tag_api_spec_revision_with_metadata( + self, + response: registry_models.ApiSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for tag_api_spec_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_tag_api_spec_revision_with_metadata` + interceptor in new development instead of the `post_tag_api_spec_revision` interceptor. + When both interceptors are used, this `post_tag_api_spec_revision_with_metadata` interceptor runs after the + `post_tag_api_spec_revision` interceptor. The (possibly modified) response returned by + `post_tag_api_spec_revision` will be passed to + `post_tag_api_spec_revision_with_metadata`. + """ + return response, metadata + def pre_update_api( self, request: registry_service.UpdateApiRequest, @@ -1086,12 +1702,35 @@ def pre_update_api( def post_update_api(self, response: registry_models.Api) -> registry_models.Api: """Post-rpc interceptor for update_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_update_api` interceptor runs + before the `post_update_api_with_metadata` interceptor. """ return response + def post_update_api_with_metadata( + self, + response: registry_models.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_update_api_with_metadata` + interceptor in new development instead of the `post_update_api` interceptor. + When both interceptors are used, this `post_update_api_with_metadata` interceptor runs after the + `post_update_api` interceptor. The (possibly modified) response returned by + `post_update_api` will be passed to + `post_update_api_with_metadata`. + """ + return response, metadata + def pre_update_api_deployment( self, request: registry_service.UpdateApiDeploymentRequest, @@ -1112,12 +1751,35 @@ def post_update_api_deployment( ) -> registry_models.ApiDeployment: """Post-rpc interceptor for update_api_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_update_api_deployment` interceptor runs + before the `post_update_api_deployment_with_metadata` interceptor. """ return response + def post_update_api_deployment_with_metadata( + self, + response: registry_models.ApiDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiDeployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_api_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_update_api_deployment_with_metadata` + interceptor in new development instead of the `post_update_api_deployment` interceptor. + When both interceptors are used, this `post_update_api_deployment_with_metadata` interceptor runs after the + `post_update_api_deployment` interceptor. The (possibly modified) response returned by + `post_update_api_deployment` will be passed to + `post_update_api_deployment_with_metadata`. + """ + return response, metadata + def pre_update_api_spec( self, request: registry_service.UpdateApiSpecRequest, @@ -1137,12 +1799,35 @@ def post_update_api_spec( ) -> registry_models.ApiSpec: """Post-rpc interceptor for update_api_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_update_api_spec` interceptor runs + before the `post_update_api_spec_with_metadata` interceptor. """ return response + def post_update_api_spec_with_metadata( + self, + response: registry_models.ApiSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_api_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_update_api_spec_with_metadata` + interceptor in new development instead of the `post_update_api_spec` interceptor. + When both interceptors are used, this `post_update_api_spec_with_metadata` interceptor runs after the + `post_update_api_spec` interceptor. The (possibly modified) response returned by + `post_update_api_spec` will be passed to + `post_update_api_spec_with_metadata`. + """ + return response, metadata + def pre_update_api_version( self, request: registry_service.UpdateApiVersionRequest, @@ -1163,12 +1848,35 @@ def post_update_api_version( ) -> registry_models.ApiVersion: """Post-rpc interceptor for update_api_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Registry server but before - it is returned to user code. + it is returned to user code. This `post_update_api_version` interceptor runs + before the `post_update_api_version_with_metadata` interceptor. """ return response + def post_update_api_version_with_metadata( + self, + response: registry_models.ApiVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[registry_models.ApiVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_api_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Registry server but before it is returned to user code. + + We recommend only using this `post_update_api_version_with_metadata` + interceptor in new development instead of the `post_update_api_version` interceptor. + When both interceptors are used, this `post_update_api_version_with_metadata` interceptor runs after the + `post_update_api_version` interceptor. The (possibly modified) response returned by + `post_update_api_version` will be passed to + `post_update_api_version_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1601,6 +2309,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1759,6 +2471,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1923,6 +2639,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2078,6 +2798,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2241,6 +2965,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_artifact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_artifact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2609,6 +3337,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_api_deployment_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_delete_api_deployment_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2876,6 +3611,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_api_spec_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_api_spec_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3239,6 +3978,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3392,6 +4135,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3548,6 +4295,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3740,6 +4491,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_spec_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_spec_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3887,6 +4642,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4040,6 +4799,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_artifact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_artifact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4232,6 +4995,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_artifact_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_artifact_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4378,6 +5145,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_deployment_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_api_deployment_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4527,6 +5301,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_deployments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_api_deployments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4669,6 +5447,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_apis(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_apis_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4816,6 +5598,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_spec_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_api_spec_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4960,6 +5746,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_specs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_api_specs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5108,6 +5898,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_api_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5254,6 +6048,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_artifacts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_artifacts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5421,6 +6219,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_replace_artifact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_replace_artifact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5579,6 +6381,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_rollback_api_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_rollback_api_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5747,6 +6553,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_rollback_api_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_rollback_api_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5906,6 +6716,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_tag_api_deployment_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_tag_api_deployment_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6069,6 +6883,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_tag_api_spec_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_tag_api_spec_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6218,6 +7036,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6376,6 +7198,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6540,6 +7366,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6695,6 +7525,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apigee-registry/samples/generated_samples/snippet_metadata_google.cloud.apigeeregistry.v1.json b/packages/google-cloud-apigee-registry/samples/generated_samples/snippet_metadata_google.cloud.apigeeregistry.v1.json index 30dc0e5f152e..b2c5df756020 100644 --- a/packages/google-cloud-apigee-registry/samples/generated_samples/snippet_metadata_google.cloud.apigeeregistry.v1.json +++ b/packages/google-cloud-apigee-registry/samples/generated_samples/snippet_metadata_google.cloud.apigeeregistry.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-apigee-registry", - "version": "0.6.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_provisioning.py b/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_provisioning.py index 084db6f89135..31ade30c1d78 100644 --- a/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_provisioning.py +++ b/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_provisioning.py @@ -75,6 +75,13 @@ ) from google.cloud.apigee_registry_v1.types import provisioning_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 = ProvisioningClient(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 = ProvisioningClient(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", [ @@ -3049,10 +3099,13 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProvisioningRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.ProvisioningRestInterceptor, "post_create_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProvisioningRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = provisioning_service.CreateInstanceRequest.pb( provisioning_service.CreateInstanceRequest() ) @@ -3076,6 +3129,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, @@ -3087,6 +3141,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( @@ -3167,10 +3222,13 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProvisioningRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.ProvisioningRestInterceptor, "post_delete_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProvisioningRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = provisioning_service.DeleteInstanceRequest.pb( provisioning_service.DeleteInstanceRequest() ) @@ -3194,6 +3252,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, @@ -3205,6 +3264,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_get_instance_rest_bad_request( @@ -3293,10 +3353,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProvisioningRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.ProvisioningRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProvisioningRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = provisioning_service.GetInstanceRequest.pb( provisioning_service.GetInstanceRequest() ) @@ -3322,6 +3385,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = provisioning_service.Instance() + post_with_metadata.return_value = provisioning_service.Instance(), metadata client.get_instance( request, @@ -3333,6 +3397,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_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_registry.py b/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_registry.py index c41ab4b6268a..a70b2936f9d8 100644 --- a/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_registry.py +++ b/packages/google-cloud-apigee-registry/tests/unit/gapic/apigee_registry_v1/test_registry.py @@ -69,6 +69,13 @@ ) from google.cloud.apigee_registry_v1.types import registry_models, registry_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 @@ -299,6 +306,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 = RegistryClient(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 = RegistryClient(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", [ @@ -23045,10 +23095,13 @@ def test_list_apis_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_apis" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_list_apis_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_apis" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListApisRequest.pb( registry_service.ListApisRequest() ) @@ -23074,6 +23127,7 @@ def test_list_apis_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListApisResponse() + post_with_metadata.return_value = registry_service.ListApisResponse(), metadata client.list_apis( request, @@ -23085,6 +23139,7 @@ def test_list_apis_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_rest_bad_request(request_type=registry_service.GetApiRequest): @@ -23175,10 +23230,13 @@ def test_get_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_api" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetApiRequest.pb(registry_service.GetApiRequest()) transcode.return_value = { "method": "post", @@ -23200,6 +23258,7 @@ def test_get_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.Api() + post_with_metadata.return_value = registry_models.Api(), metadata client.get_api( request, @@ -23211,6 +23270,7 @@ def test_get_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_api_rest_bad_request(request_type=registry_service.CreateApiRequest): @@ -23380,10 +23440,13 @@ def test_create_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_create_api" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_create_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_create_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.CreateApiRequest.pb( registry_service.CreateApiRequest() ) @@ -23407,6 +23470,7 @@ def test_create_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.Api() + post_with_metadata.return_value = registry_models.Api(), metadata client.create_api( request, @@ -23418,6 +23482,7 @@ def test_create_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_rest_bad_request(request_type=registry_service.UpdateApiRequest): @@ -23587,10 +23652,13 @@ def test_update_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_update_api" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_update_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_update_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.UpdateApiRequest.pb( registry_service.UpdateApiRequest() ) @@ -23614,6 +23682,7 @@ def test_update_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.Api() + post_with_metadata.return_value = registry_models.Api(), metadata client.update_api( request, @@ -23625,6 +23694,7 @@ def test_update_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_rest_bad_request(request_type=registry_service.DeleteApiRequest): @@ -23812,10 +23882,13 @@ def test_list_api_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_api_versions" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_list_api_versions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_api_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListApiVersionsRequest.pb( registry_service.ListApiVersionsRequest() ) @@ -23841,6 +23914,10 @@ def test_list_api_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListApiVersionsResponse() + post_with_metadata.return_value = ( + registry_service.ListApiVersionsResponse(), + metadata, + ) client.list_api_versions( request, @@ -23852,6 +23929,7 @@ def test_list_api_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_version_rest_bad_request( @@ -23944,10 +24022,13 @@ def test_get_api_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_api_version" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_api_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_api_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetApiVersionRequest.pb( registry_service.GetApiVersionRequest() ) @@ -23971,6 +24052,7 @@ def test_get_api_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiVersion() + post_with_metadata.return_value = registry_models.ApiVersion(), metadata client.get_api_version( request, @@ -23982,6 +24064,7 @@ def test_get_api_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_api_version_rest_bad_request( @@ -24147,10 +24230,13 @@ def test_create_api_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_create_api_version" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_create_api_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_create_api_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.CreateApiVersionRequest.pb( registry_service.CreateApiVersionRequest() ) @@ -24174,6 +24260,7 @@ def test_create_api_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiVersion() + post_with_metadata.return_value = registry_models.ApiVersion(), metadata client.create_api_version( request, @@ -24185,6 +24272,7 @@ def test_create_api_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_version_rest_bad_request( @@ -24358,10 +24446,13 @@ def test_update_api_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_update_api_version" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_update_api_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_update_api_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.UpdateApiVersionRequest.pb( registry_service.UpdateApiVersionRequest() ) @@ -24385,6 +24476,7 @@ def test_update_api_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiVersion() + post_with_metadata.return_value = registry_models.ApiVersion(), metadata client.update_api_version( request, @@ -24396,6 +24488,7 @@ def test_update_api_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_version_rest_bad_request( @@ -24593,10 +24686,13 @@ def test_list_api_specs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_api_specs" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_list_api_specs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_api_specs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListApiSpecsRequest.pb( registry_service.ListApiSpecsRequest() ) @@ -24622,6 +24718,10 @@ def test_list_api_specs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListApiSpecsResponse() + post_with_metadata.return_value = ( + registry_service.ListApiSpecsResponse(), + metadata, + ) client.list_api_specs( request, @@ -24633,6 +24733,7 @@ def test_list_api_specs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_spec_rest_bad_request(request_type=registry_service.GetApiSpecRequest): @@ -24733,10 +24834,13 @@ def test_get_api_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_api_spec" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_api_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_api_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetApiSpecRequest.pb( registry_service.GetApiSpecRequest() ) @@ -24760,6 +24864,7 @@ def test_get_api_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiSpec() + post_with_metadata.return_value = registry_models.ApiSpec(), metadata client.get_api_spec( request, @@ -24771,6 +24876,7 @@ def test_get_api_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_spec_contents_rest_bad_request( @@ -24856,10 +24962,13 @@ def test_get_api_spec_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_api_spec_contents" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_api_spec_contents_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_api_spec_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetApiSpecContentsRequest.pb( registry_service.GetApiSpecContentsRequest() ) @@ -24883,6 +24992,7 @@ def test_get_api_spec_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = httpbody_pb2.HttpBody() + post_with_metadata.return_value = httpbody_pb2.HttpBody(), metadata client.get_api_spec_contents( request, @@ -24894,6 +25004,7 @@ def test_get_api_spec_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_api_spec_rest_bad_request( @@ -25079,10 +25190,13 @@ def test_create_api_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_create_api_spec" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_create_api_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_create_api_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.CreateApiSpecRequest.pb( registry_service.CreateApiSpecRequest() ) @@ -25106,6 +25220,7 @@ def test_create_api_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiSpec() + post_with_metadata.return_value = registry_models.ApiSpec(), metadata client.create_api_spec( request, @@ -25117,6 +25232,7 @@ def test_create_api_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_spec_rest_bad_request( @@ -25306,10 +25422,13 @@ def test_update_api_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_update_api_spec" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_update_api_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_update_api_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.UpdateApiSpecRequest.pb( registry_service.UpdateApiSpecRequest() ) @@ -25333,6 +25452,7 @@ def test_update_api_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiSpec() + post_with_metadata.return_value = registry_models.ApiSpec(), metadata client.update_api_spec( request, @@ -25344,6 +25464,7 @@ def test_update_api_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_spec_rest_bad_request( @@ -25557,10 +25678,13 @@ def test_tag_api_spec_revision_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_tag_api_spec_revision" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_tag_api_spec_revision_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_tag_api_spec_revision" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.TagApiSpecRevisionRequest.pb( registry_service.TagApiSpecRevisionRequest() ) @@ -25584,6 +25708,7 @@ def test_tag_api_spec_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiSpec() + post_with_metadata.return_value = registry_models.ApiSpec(), metadata client.tag_api_spec_revision( request, @@ -25595,6 +25720,7 @@ def test_tag_api_spec_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_api_spec_revisions_rest_bad_request( @@ -25681,10 +25807,13 @@ def test_list_api_spec_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_api_spec_revisions" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_list_api_spec_revisions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_api_spec_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListApiSpecRevisionsRequest.pb( registry_service.ListApiSpecRevisionsRequest() ) @@ -25710,6 +25839,10 @@ def test_list_api_spec_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListApiSpecRevisionsResponse() + post_with_metadata.return_value = ( + registry_service.ListApiSpecRevisionsResponse(), + metadata, + ) client.list_api_spec_revisions( request, @@ -25721,6 +25854,7 @@ def test_list_api_spec_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_rollback_api_spec_rest_bad_request( @@ -25823,10 +25957,13 @@ def test_rollback_api_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_rollback_api_spec" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_rollback_api_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_rollback_api_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.RollbackApiSpecRequest.pb( registry_service.RollbackApiSpecRequest() ) @@ -25850,6 +25987,7 @@ def test_rollback_api_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiSpec() + post_with_metadata.return_value = registry_models.ApiSpec(), metadata client.rollback_api_spec( request, @@ -25861,6 +25999,7 @@ def test_rollback_api_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_spec_revision_rest_bad_request( @@ -25963,10 +26102,14 @@ def test_delete_api_spec_revision_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_delete_api_spec_revision" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, + "post_delete_api_spec_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_delete_api_spec_revision" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.DeleteApiSpecRevisionRequest.pb( registry_service.DeleteApiSpecRevisionRequest() ) @@ -25990,6 +26133,7 @@ def test_delete_api_spec_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiSpec() + post_with_metadata.return_value = registry_models.ApiSpec(), metadata client.delete_api_spec_revision( request, @@ -26001,6 +26145,7 @@ def test_delete_api_spec_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_api_deployments_rest_bad_request( @@ -26083,10 +26228,13 @@ def test_list_api_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_api_deployments" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_list_api_deployments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_api_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListApiDeploymentsRequest.pb( registry_service.ListApiDeploymentsRequest() ) @@ -26112,6 +26260,10 @@ def test_list_api_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListApiDeploymentsResponse() + post_with_metadata.return_value = ( + registry_service.ListApiDeploymentsResponse(), + metadata, + ) client.list_api_deployments( request, @@ -26123,6 +26275,7 @@ def test_list_api_deployments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_deployment_rest_bad_request( @@ -26225,10 +26378,13 @@ def test_get_api_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_api_deployment" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_api_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_api_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetApiDeploymentRequest.pb( registry_service.GetApiDeploymentRequest() ) @@ -26254,6 +26410,7 @@ def test_get_api_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiDeployment() + post_with_metadata.return_value = registry_models.ApiDeployment(), metadata client.get_api_deployment( request, @@ -26265,6 +26422,7 @@ def test_get_api_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_api_deployment_rest_bad_request( @@ -26448,10 +26606,13 @@ def test_create_api_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_create_api_deployment" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_create_api_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_create_api_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.CreateApiDeploymentRequest.pb( registry_service.CreateApiDeploymentRequest() ) @@ -26477,6 +26638,7 @@ def test_create_api_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiDeployment() + post_with_metadata.return_value = registry_models.ApiDeployment(), metadata client.create_api_deployment( request, @@ -26488,6 +26650,7 @@ def test_create_api_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_deployment_rest_bad_request( @@ -26679,10 +26842,13 @@ def test_update_api_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_update_api_deployment" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_update_api_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_update_api_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.UpdateApiDeploymentRequest.pb( registry_service.UpdateApiDeploymentRequest() ) @@ -26708,6 +26874,7 @@ def test_update_api_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiDeployment() + post_with_metadata.return_value = registry_models.ApiDeployment(), metadata client.update_api_deployment( request, @@ -26719,6 +26886,7 @@ def test_update_api_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_deployment_rest_bad_request( @@ -26932,10 +27100,14 @@ def test_tag_api_deployment_revision_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_tag_api_deployment_revision" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, + "post_tag_api_deployment_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_tag_api_deployment_revision" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.TagApiDeploymentRevisionRequest.pb( registry_service.TagApiDeploymentRevisionRequest() ) @@ -26961,6 +27133,7 @@ def test_tag_api_deployment_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiDeployment() + post_with_metadata.return_value = registry_models.ApiDeployment(), metadata client.tag_api_deployment_revision( request, @@ -26972,6 +27145,7 @@ def test_tag_api_deployment_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_api_deployment_revisions_rest_bad_request( @@ -27060,10 +27234,14 @@ def test_list_api_deployment_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_api_deployment_revisions" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, + "post_list_api_deployment_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_api_deployment_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListApiDeploymentRevisionsRequest.pb( registry_service.ListApiDeploymentRevisionsRequest() ) @@ -27089,6 +27267,10 @@ def test_list_api_deployment_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListApiDeploymentRevisionsResponse() + post_with_metadata.return_value = ( + registry_service.ListApiDeploymentRevisionsResponse(), + metadata, + ) client.list_api_deployment_revisions( request, @@ -27100,6 +27282,7 @@ def test_list_api_deployment_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_rollback_api_deployment_rest_bad_request( @@ -27202,10 +27385,13 @@ def test_rollback_api_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_rollback_api_deployment" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_rollback_api_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_rollback_api_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.RollbackApiDeploymentRequest.pb( registry_service.RollbackApiDeploymentRequest() ) @@ -27231,6 +27417,7 @@ def test_rollback_api_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiDeployment() + post_with_metadata.return_value = registry_models.ApiDeployment(), metadata client.rollback_api_deployment( request, @@ -27242,6 +27429,7 @@ def test_rollback_api_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_deployment_revision_rest_bad_request( @@ -27344,10 +27532,14 @@ def test_delete_api_deployment_revision_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_delete_api_deployment_revision" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, + "post_delete_api_deployment_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_delete_api_deployment_revision" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.DeleteApiDeploymentRevisionRequest.pb( registry_service.DeleteApiDeploymentRevisionRequest() ) @@ -27373,6 +27565,7 @@ def test_delete_api_deployment_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.ApiDeployment() + post_with_metadata.return_value = registry_models.ApiDeployment(), metadata client.delete_api_deployment_revision( request, @@ -27384,6 +27577,7 @@ def test_delete_api_deployment_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_artifacts_rest_bad_request( @@ -27466,10 +27660,13 @@ def test_list_artifacts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_list_artifacts" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_list_artifacts_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_list_artifacts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ListArtifactsRequest.pb( registry_service.ListArtifactsRequest() ) @@ -27495,6 +27692,10 @@ def test_list_artifacts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_service.ListArtifactsResponse() + post_with_metadata.return_value = ( + registry_service.ListArtifactsResponse(), + metadata, + ) client.list_artifacts( request, @@ -27506,6 +27707,7 @@ def test_list_artifacts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_artifact_rest_bad_request( @@ -27596,10 +27798,13 @@ def test_get_artifact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_artifact" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_artifact_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_artifact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetArtifactRequest.pb( registry_service.GetArtifactRequest() ) @@ -27623,6 +27828,7 @@ def test_get_artifact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.Artifact() + post_with_metadata.return_value = registry_models.Artifact(), metadata client.get_artifact( request, @@ -27634,6 +27840,7 @@ def test_get_artifact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_artifact_contents_rest_bad_request( @@ -27715,10 +27922,13 @@ def test_get_artifact_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_get_artifact_contents" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_get_artifact_contents_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_get_artifact_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.GetArtifactContentsRequest.pb( registry_service.GetArtifactContentsRequest() ) @@ -27742,6 +27952,7 @@ def test_get_artifact_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = httpbody_pb2.HttpBody() + post_with_metadata.return_value = httpbody_pb2.HttpBody(), metadata client.get_artifact_contents( request, @@ -27753,6 +27964,7 @@ def test_get_artifact_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_artifact_rest_bad_request( @@ -27919,10 +28131,13 @@ def test_create_artifact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_create_artifact" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_create_artifact_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_create_artifact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.CreateArtifactRequest.pb( registry_service.CreateArtifactRequest() ) @@ -27946,6 +28161,7 @@ def test_create_artifact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.Artifact() + post_with_metadata.return_value = registry_models.Artifact(), metadata client.create_artifact( request, @@ -27957,6 +28173,7 @@ def test_create_artifact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_replace_artifact_rest_bad_request( @@ -28127,10 +28344,13 @@ def test_replace_artifact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistryRestInterceptor, "post_replace_artifact" ) as post, mock.patch.object( + transports.RegistryRestInterceptor, "post_replace_artifact_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistryRestInterceptor, "pre_replace_artifact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registry_service.ReplaceArtifactRequest.pb( registry_service.ReplaceArtifactRequest() ) @@ -28154,6 +28374,7 @@ def test_replace_artifact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registry_models.Artifact() + post_with_metadata.return_value = registry_models.Artifact(), metadata client.replace_artifact( request, @@ -28165,6 +28386,7 @@ def test_replace_artifact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_artifact_rest_bad_request( diff --git a/packages/google-cloud-apihub/google/cloud/apihub/gapic_version.py b/packages/google-cloud-apihub/google/cloud/apihub/gapic_version.py index 355df6b536f8..558c8aab67c5 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub/gapic_version.py +++ b/packages/google-cloud-apihub/google/cloud/apihub/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.3" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/gapic_version.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/gapic_version.py index 355df6b536f8..558c8aab67c5 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/gapic_version.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_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.3" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/client.py index 9796f05470ca..02924683eff5 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -653,6 +655,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. @@ -5215,16 +5244,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, @@ -5270,16 +5303,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, @@ -5436,16 +5473,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, @@ -5491,16 +5532,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-apihub/google/cloud/apihub_v1/services/api_hub/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/transports/rest.py index f1623721d63a..87af2246f375 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub/transports/rest.py @@ -350,12 +350,35 @@ def pre_create_api( def post_create_api(self, response: common_fields.Api) -> common_fields.Api: """Post-rpc interceptor for create_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_create_api` interceptor runs + before the `post_create_api_with_metadata` interceptor. """ return response + def post_create_api_with_metadata( + self, + response: common_fields.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_create_api_with_metadata` + interceptor in new development instead of the `post_create_api` interceptor. + When both interceptors are used, this `post_create_api_with_metadata` interceptor runs after the + `post_create_api` interceptor. The (possibly modified) response returned by + `post_create_api` will be passed to + `post_create_api_with_metadata`. + """ + return response, metadata + def pre_create_attribute( self, request: apihub_service.CreateAttributeRequest, @@ -375,12 +398,35 @@ def post_create_attribute( ) -> common_fields.Attribute: """Post-rpc interceptor for create_attribute - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_attribute_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_create_attribute` interceptor runs + before the `post_create_attribute_with_metadata` interceptor. """ return response + def post_create_attribute_with_metadata( + self, + response: common_fields.Attribute, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Attribute, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_attribute + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_create_attribute_with_metadata` + interceptor in new development instead of the `post_create_attribute` interceptor. + When both interceptors are used, this `post_create_attribute_with_metadata` interceptor runs after the + `post_create_attribute` interceptor. The (possibly modified) response returned by + `post_create_attribute` will be passed to + `post_create_attribute_with_metadata`. + """ + return response, metadata + def pre_create_deployment( self, request: apihub_service.CreateDeploymentRequest, @@ -400,12 +446,35 @@ def post_create_deployment( ) -> common_fields.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 ApiHub 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: common_fields.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.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 ApiHub 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_external_api( self, request: apihub_service.CreateExternalApiRequest, @@ -425,12 +494,35 @@ def post_create_external_api( ) -> common_fields.ExternalApi: """Post-rpc interceptor for create_external_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_external_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_create_external_api` interceptor runs + before the `post_create_external_api_with_metadata` interceptor. """ return response + def post_create_external_api_with_metadata( + self, + response: common_fields.ExternalApi, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.ExternalApi, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_external_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_create_external_api_with_metadata` + interceptor in new development instead of the `post_create_external_api` interceptor. + When both interceptors are used, this `post_create_external_api_with_metadata` interceptor runs after the + `post_create_external_api` interceptor. The (possibly modified) response returned by + `post_create_external_api` will be passed to + `post_create_external_api_with_metadata`. + """ + return response, metadata + def pre_create_spec( self, request: apihub_service.CreateSpecRequest, @@ -448,12 +540,35 @@ def pre_create_spec( def post_create_spec(self, response: common_fields.Spec) -> common_fields.Spec: """Post-rpc interceptor for create_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_create_spec` interceptor runs + before the `post_create_spec_with_metadata` interceptor. """ return response + def post_create_spec_with_metadata( + self, + response: common_fields.Spec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Spec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_create_spec_with_metadata` + interceptor in new development instead of the `post_create_spec` interceptor. + When both interceptors are used, this `post_create_spec_with_metadata` interceptor runs after the + `post_create_spec` interceptor. The (possibly modified) response returned by + `post_create_spec` will be passed to + `post_create_spec_with_metadata`. + """ + return response, metadata + def pre_create_version( self, request: apihub_service.CreateVersionRequest, @@ -473,12 +588,35 @@ def post_create_version( ) -> common_fields.Version: """Post-rpc interceptor for create_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_create_version` interceptor runs + before the `post_create_version_with_metadata` interceptor. """ return response + def post_create_version_with_metadata( + self, + response: common_fields.Version, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Version, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_create_version_with_metadata` + interceptor in new development instead of the `post_create_version` interceptor. + When both interceptors are used, this `post_create_version_with_metadata` interceptor runs after the + `post_create_version` interceptor. The (possibly modified) response returned by + `post_create_version` will be passed to + `post_create_version_with_metadata`. + """ + return response, metadata + def pre_delete_api( self, request: apihub_service.DeleteApiRequest, @@ -578,12 +716,35 @@ def pre_get_api( def post_get_api(self, response: common_fields.Api) -> common_fields.Api: """Post-rpc interceptor for get_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_api` interceptor runs + before the `post_get_api_with_metadata` interceptor. """ return response + def post_get_api_with_metadata( + self, + response: common_fields.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_api_with_metadata` + interceptor in new development instead of the `post_get_api` interceptor. + When both interceptors are used, this `post_get_api_with_metadata` interceptor runs after the + `post_get_api` interceptor. The (possibly modified) response returned by + `post_get_api` will be passed to + `post_get_api_with_metadata`. + """ + return response, metadata + def pre_get_api_operation( self, request: apihub_service.GetApiOperationRequest, @@ -603,12 +764,35 @@ def post_get_api_operation( ) -> common_fields.ApiOperation: """Post-rpc interceptor for get_api_operation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_operation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_api_operation` interceptor runs + before the `post_get_api_operation_with_metadata` interceptor. """ return response + def post_get_api_operation_with_metadata( + self, + response: common_fields.ApiOperation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.ApiOperation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_operation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_api_operation_with_metadata` + interceptor in new development instead of the `post_get_api_operation` interceptor. + When both interceptors are used, this `post_get_api_operation_with_metadata` interceptor runs after the + `post_get_api_operation` interceptor. The (possibly modified) response returned by + `post_get_api_operation` will be passed to + `post_get_api_operation_with_metadata`. + """ + return response, metadata + def pre_get_attribute( self, request: apihub_service.GetAttributeRequest, @@ -628,12 +812,35 @@ def post_get_attribute( ) -> common_fields.Attribute: """Post-rpc interceptor for get_attribute - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_attribute_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_attribute` interceptor runs + before the `post_get_attribute_with_metadata` interceptor. """ return response + def post_get_attribute_with_metadata( + self, + response: common_fields.Attribute, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Attribute, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_attribute + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_attribute_with_metadata` + interceptor in new development instead of the `post_get_attribute` interceptor. + When both interceptors are used, this `post_get_attribute_with_metadata` interceptor runs after the + `post_get_attribute` interceptor. The (possibly modified) response returned by + `post_get_attribute` will be passed to + `post_get_attribute_with_metadata`. + """ + return response, metadata + def pre_get_definition( self, request: apihub_service.GetDefinitionRequest, @@ -653,12 +860,35 @@ def post_get_definition( ) -> common_fields.Definition: """Post-rpc interceptor for get_definition - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_definition_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_definition` interceptor runs + before the `post_get_definition_with_metadata` interceptor. """ return response + def post_get_definition_with_metadata( + self, + response: common_fields.Definition, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Definition, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_definition + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_definition_with_metadata` + interceptor in new development instead of the `post_get_definition` interceptor. + When both interceptors are used, this `post_get_definition_with_metadata` interceptor runs after the + `post_get_definition` interceptor. The (possibly modified) response returned by + `post_get_definition` will be passed to + `post_get_definition_with_metadata`. + """ + return response, metadata + def pre_get_deployment( self, request: apihub_service.GetDeploymentRequest, @@ -678,12 +908,35 @@ def post_get_deployment( ) -> common_fields.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 ApiHub 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: common_fields.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.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 ApiHub 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_external_api( self, request: apihub_service.GetExternalApiRequest, @@ -703,12 +956,35 @@ def post_get_external_api( ) -> common_fields.ExternalApi: """Post-rpc interceptor for get_external_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_external_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_external_api` interceptor runs + before the `post_get_external_api_with_metadata` interceptor. """ return response + def post_get_external_api_with_metadata( + self, + response: common_fields.ExternalApi, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.ExternalApi, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_external_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_external_api_with_metadata` + interceptor in new development instead of the `post_get_external_api` interceptor. + When both interceptors are used, this `post_get_external_api_with_metadata` interceptor runs after the + `post_get_external_api` interceptor. The (possibly modified) response returned by + `post_get_external_api` will be passed to + `post_get_external_api_with_metadata`. + """ + return response, metadata + def pre_get_spec( self, request: apihub_service.GetSpecRequest, @@ -724,12 +1000,35 @@ def pre_get_spec( def post_get_spec(self, response: common_fields.Spec) -> common_fields.Spec: """Post-rpc interceptor for get_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_spec` interceptor runs + before the `post_get_spec_with_metadata` interceptor. """ return response + def post_get_spec_with_metadata( + self, + response: common_fields.Spec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Spec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_spec_with_metadata` + interceptor in new development instead of the `post_get_spec` interceptor. + When both interceptors are used, this `post_get_spec_with_metadata` interceptor runs after the + `post_get_spec` interceptor. The (possibly modified) response returned by + `post_get_spec` will be passed to + `post_get_spec_with_metadata`. + """ + return response, metadata + def pre_get_spec_contents( self, request: apihub_service.GetSpecContentsRequest, @@ -749,12 +1048,35 @@ def post_get_spec_contents( ) -> common_fields.SpecContents: """Post-rpc interceptor for get_spec_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_spec_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_spec_contents` interceptor runs + before the `post_get_spec_contents_with_metadata` interceptor. """ return response + def post_get_spec_contents_with_metadata( + self, + response: common_fields.SpecContents, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.SpecContents, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_spec_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_spec_contents_with_metadata` + interceptor in new development instead of the `post_get_spec_contents` interceptor. + When both interceptors are used, this `post_get_spec_contents_with_metadata` interceptor runs after the + `post_get_spec_contents` interceptor. The (possibly modified) response returned by + `post_get_spec_contents` will be passed to + `post_get_spec_contents_with_metadata`. + """ + return response, metadata + def pre_get_version( self, request: apihub_service.GetVersionRequest, @@ -774,12 +1096,35 @@ def post_get_version( ) -> common_fields.Version: """Post-rpc interceptor for get_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_get_version` interceptor runs + before the `post_get_version_with_metadata` interceptor. """ return response + def post_get_version_with_metadata( + self, + response: common_fields.Version, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Version, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_get_version_with_metadata` + interceptor in new development instead of the `post_get_version` interceptor. + When both interceptors are used, this `post_get_version_with_metadata` interceptor runs after the + `post_get_version` interceptor. The (possibly modified) response returned by + `post_get_version` will be passed to + `post_get_version_with_metadata`. + """ + return response, metadata + def pre_list_api_operations( self, request: apihub_service.ListApiOperationsRequest, @@ -799,12 +1144,38 @@ def post_list_api_operations( ) -> apihub_service.ListApiOperationsResponse: """Post-rpc interceptor for list_api_operations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_api_operations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_list_api_operations` interceptor runs + before the `post_list_api_operations_with_metadata` interceptor. """ return response + def post_list_api_operations_with_metadata( + self, + response: apihub_service.ListApiOperationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListApiOperationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_api_operations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_list_api_operations_with_metadata` + interceptor in new development instead of the `post_list_api_operations` interceptor. + When both interceptors are used, this `post_list_api_operations_with_metadata` interceptor runs after the + `post_list_api_operations` interceptor. The (possibly modified) response returned by + `post_list_api_operations` will be passed to + `post_list_api_operations_with_metadata`. + """ + return response, metadata + def pre_list_apis( self, request: apihub_service.ListApisRequest, @@ -822,12 +1193,37 @@ def post_list_apis( ) -> apihub_service.ListApisResponse: """Post-rpc interceptor for list_apis - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_apis_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_list_apis` interceptor runs + before the `post_list_apis_with_metadata` interceptor. """ return response + def post_list_apis_with_metadata( + self, + response: apihub_service.ListApisResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListApisResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_apis + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_list_apis_with_metadata` + interceptor in new development instead of the `post_list_apis` interceptor. + When both interceptors are used, this `post_list_apis_with_metadata` interceptor runs after the + `post_list_apis` interceptor. The (possibly modified) response returned by + `post_list_apis` will be passed to + `post_list_apis_with_metadata`. + """ + return response, metadata + def pre_list_attributes( self, request: apihub_service.ListAttributesRequest, @@ -847,12 +1243,37 @@ def post_list_attributes( ) -> apihub_service.ListAttributesResponse: """Post-rpc interceptor for list_attributes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attributes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_list_attributes` interceptor runs + before the `post_list_attributes_with_metadata` interceptor. """ return response + def post_list_attributes_with_metadata( + self, + response: apihub_service.ListAttributesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListAttributesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_attributes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_list_attributes_with_metadata` + interceptor in new development instead of the `post_list_attributes` interceptor. + When both interceptors are used, this `post_list_attributes_with_metadata` interceptor runs after the + `post_list_attributes` interceptor. The (possibly modified) response returned by + `post_list_attributes` will be passed to + `post_list_attributes_with_metadata`. + """ + return response, metadata + def pre_list_deployments( self, request: apihub_service.ListDeploymentsRequest, @@ -872,12 +1293,37 @@ def post_list_deployments( ) -> apihub_service.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 ApiHub 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: apihub_service.ListDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.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 ApiHub 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_external_apis( self, request: apihub_service.ListExternalApisRequest, @@ -897,12 +1343,37 @@ def post_list_external_apis( ) -> apihub_service.ListExternalApisResponse: """Post-rpc interceptor for list_external_apis - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_external_apis_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_list_external_apis` interceptor runs + before the `post_list_external_apis_with_metadata` interceptor. """ return response + def post_list_external_apis_with_metadata( + self, + response: apihub_service.ListExternalApisResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListExternalApisResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_external_apis + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_list_external_apis_with_metadata` + interceptor in new development instead of the `post_list_external_apis` interceptor. + When both interceptors are used, this `post_list_external_apis_with_metadata` interceptor runs after the + `post_list_external_apis` interceptor. The (possibly modified) response returned by + `post_list_external_apis` will be passed to + `post_list_external_apis_with_metadata`. + """ + return response, metadata + def pre_list_specs( self, request: apihub_service.ListSpecsRequest, @@ -922,12 +1393,37 @@ def post_list_specs( ) -> apihub_service.ListSpecsResponse: """Post-rpc interceptor for list_specs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_specs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_list_specs` interceptor runs + before the `post_list_specs_with_metadata` interceptor. """ return response + def post_list_specs_with_metadata( + self, + response: apihub_service.ListSpecsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListSpecsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_specs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_list_specs_with_metadata` + interceptor in new development instead of the `post_list_specs` interceptor. + When both interceptors are used, this `post_list_specs_with_metadata` interceptor runs after the + `post_list_specs` interceptor. The (possibly modified) response returned by + `post_list_specs` will be passed to + `post_list_specs_with_metadata`. + """ + return response, metadata + def pre_list_versions( self, request: apihub_service.ListVersionsRequest, @@ -947,12 +1443,37 @@ def post_list_versions( ) -> apihub_service.ListVersionsResponse: """Post-rpc interceptor for list_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_list_versions` interceptor runs + before the `post_list_versions_with_metadata` interceptor. """ return response + def post_list_versions_with_metadata( + self, + response: apihub_service.ListVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_list_versions_with_metadata` + interceptor in new development instead of the `post_list_versions` interceptor. + When both interceptors are used, this `post_list_versions_with_metadata` interceptor runs after the + `post_list_versions` interceptor. The (possibly modified) response returned by + `post_list_versions` will be passed to + `post_list_versions_with_metadata`. + """ + return response, metadata + def pre_search_resources( self, request: apihub_service.SearchResourcesRequest, @@ -972,12 +1493,37 @@ def post_search_resources( ) -> apihub_service.SearchResourcesResponse: """Post-rpc interceptor for search_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_search_resources` interceptor runs + before the `post_search_resources_with_metadata` interceptor. """ return response + def post_search_resources_with_metadata( + self, + response: apihub_service.SearchResourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.SearchResourcesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for search_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_search_resources_with_metadata` + interceptor in new development instead of the `post_search_resources` interceptor. + When both interceptors are used, this `post_search_resources_with_metadata` interceptor runs after the + `post_search_resources` interceptor. The (possibly modified) response returned by + `post_search_resources` will be passed to + `post_search_resources_with_metadata`. + """ + return response, metadata + def pre_update_api( self, request: apihub_service.UpdateApiRequest, @@ -995,12 +1541,35 @@ def pre_update_api( def post_update_api(self, response: common_fields.Api) -> common_fields.Api: """Post-rpc interceptor for update_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_update_api` interceptor runs + before the `post_update_api_with_metadata` interceptor. """ return response + def post_update_api_with_metadata( + self, + response: common_fields.Api, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Api, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_update_api_with_metadata` + interceptor in new development instead of the `post_update_api` interceptor. + When both interceptors are used, this `post_update_api_with_metadata` interceptor runs after the + `post_update_api` interceptor. The (possibly modified) response returned by + `post_update_api` will be passed to + `post_update_api_with_metadata`. + """ + return response, metadata + def pre_update_attribute( self, request: apihub_service.UpdateAttributeRequest, @@ -1020,12 +1589,35 @@ def post_update_attribute( ) -> common_fields.Attribute: """Post-rpc interceptor for update_attribute - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_attribute_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_update_attribute` interceptor runs + before the `post_update_attribute_with_metadata` interceptor. """ return response + def post_update_attribute_with_metadata( + self, + response: common_fields.Attribute, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Attribute, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_attribute + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_update_attribute_with_metadata` + interceptor in new development instead of the `post_update_attribute` interceptor. + When both interceptors are used, this `post_update_attribute_with_metadata` interceptor runs after the + `post_update_attribute` interceptor. The (possibly modified) response returned by + `post_update_attribute` will be passed to + `post_update_attribute_with_metadata`. + """ + return response, metadata + def pre_update_deployment( self, request: apihub_service.UpdateDeploymentRequest, @@ -1045,12 +1637,35 @@ def post_update_deployment( ) -> common_fields.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 ApiHub 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: common_fields.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.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 ApiHub 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_external_api( self, request: apihub_service.UpdateExternalApiRequest, @@ -1070,12 +1685,35 @@ def post_update_external_api( ) -> common_fields.ExternalApi: """Post-rpc interceptor for update_external_api - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_external_api_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_update_external_api` interceptor runs + before the `post_update_external_api_with_metadata` interceptor. """ return response + def post_update_external_api_with_metadata( + self, + response: common_fields.ExternalApi, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.ExternalApi, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_external_api + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_update_external_api_with_metadata` + interceptor in new development instead of the `post_update_external_api` interceptor. + When both interceptors are used, this `post_update_external_api_with_metadata` interceptor runs after the + `post_update_external_api` interceptor. The (possibly modified) response returned by + `post_update_external_api` will be passed to + `post_update_external_api_with_metadata`. + """ + return response, metadata + def pre_update_spec( self, request: apihub_service.UpdateSpecRequest, @@ -1093,12 +1731,35 @@ def pre_update_spec( def post_update_spec(self, response: common_fields.Spec) -> common_fields.Spec: """Post-rpc interceptor for update_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_update_spec` interceptor runs + before the `post_update_spec_with_metadata` interceptor. """ return response + def post_update_spec_with_metadata( + self, + response: common_fields.Spec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Spec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_update_spec_with_metadata` + interceptor in new development instead of the `post_update_spec` interceptor. + When both interceptors are used, this `post_update_spec_with_metadata` interceptor runs after the + `post_update_spec` interceptor. The (possibly modified) response returned by + `post_update_spec` will be passed to + `post_update_spec_with_metadata`. + """ + return response, metadata + def pre_update_version( self, request: apihub_service.UpdateVersionRequest, @@ -1118,12 +1779,35 @@ def post_update_version( ) -> common_fields.Version: """Post-rpc interceptor for update_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHub server but before - it is returned to user code. + it is returned to user code. This `post_update_version` interceptor runs + before the `post_update_version_with_metadata` interceptor. """ return response + def post_update_version_with_metadata( + self, + response: common_fields.Version, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Version, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHub server but before it is returned to user code. + + We recommend only using this `post_update_version_with_metadata` + interceptor in new development instead of the `post_update_version` interceptor. + When both interceptors are used, this `post_update_version_with_metadata` interceptor runs after the + `post_update_version` interceptor. The (possibly modified) response returned by + `post_update_version` will be passed to + `post_update_version_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1481,6 +2165,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1642,6 +2330,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_attribute(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_attribute_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1805,6 +2497,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 @@ -1965,6 +2661,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_external_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_external_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2118,6 +2818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2271,6 +2975,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3077,6 +3785,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3234,6 +3946,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_operation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_operation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3385,6 +4101,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_attribute(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_attribute_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3537,6 +4257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_definition(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_definition_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3688,6 +4412,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 @@ -3838,6 +4566,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_external_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_external_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3982,6 +4714,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4130,6 +4866,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_spec_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_spec_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4275,6 +5015,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4426,6 +5170,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_api_operations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_api_operations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4571,6 +5319,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_apis(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_apis_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4718,6 +5470,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attributes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attributes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4871,6 +5627,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 @@ -5024,6 +5784,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_external_apis(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_external_apis_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5168,6 +5932,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_specs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_specs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5317,6 +6085,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5476,6 +6248,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5625,6 +6401,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5786,6 +6566,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_attribute(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_attribute_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5949,6 +6733,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 @@ -6109,6 +6897,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_external_api(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_external_api_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6262,6 +7054,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6415,6 +7211,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/client.py index ed70b2364c1d..013bba7770b3 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/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. @@ -1384,16 +1413,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, @@ -1439,16 +1472,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, @@ -1605,16 +1642,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, @@ -1660,16 +1701,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-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/transports/rest.py index d283dbab1a25..17714ce6df09 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_dependencies/transports/rest.py @@ -132,12 +132,35 @@ def post_create_dependency( ) -> common_fields.Dependency: """Post-rpc interceptor for create_dependency - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_dependency_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubDependencies server but before - it is returned to user code. + it is returned to user code. This `post_create_dependency` interceptor runs + before the `post_create_dependency_with_metadata` interceptor. """ return response + def post_create_dependency_with_metadata( + self, + response: common_fields.Dependency, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Dependency, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_dependency + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubDependencies server but before it is returned to user code. + + We recommend only using this `post_create_dependency_with_metadata` + interceptor in new development instead of the `post_create_dependency` interceptor. + When both interceptors are used, this `post_create_dependency_with_metadata` interceptor runs after the + `post_create_dependency` interceptor. The (possibly modified) response returned by + `post_create_dependency` will be passed to + `post_create_dependency_with_metadata`. + """ + return response, metadata + def pre_delete_dependency( self, request: apihub_service.DeleteDependencyRequest, @@ -171,12 +194,35 @@ def post_get_dependency( ) -> common_fields.Dependency: """Post-rpc interceptor for get_dependency - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_dependency_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubDependencies server but before - it is returned to user code. + it is returned to user code. This `post_get_dependency` interceptor runs + before the `post_get_dependency_with_metadata` interceptor. """ return response + def post_get_dependency_with_metadata( + self, + response: common_fields.Dependency, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Dependency, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_dependency + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubDependencies server but before it is returned to user code. + + We recommend only using this `post_get_dependency_with_metadata` + interceptor in new development instead of the `post_get_dependency` interceptor. + When both interceptors are used, this `post_get_dependency_with_metadata` interceptor runs after the + `post_get_dependency` interceptor. The (possibly modified) response returned by + `post_get_dependency` will be passed to + `post_get_dependency_with_metadata`. + """ + return response, metadata + def pre_list_dependencies( self, request: apihub_service.ListDependenciesRequest, @@ -196,12 +242,37 @@ def post_list_dependencies( ) -> apihub_service.ListDependenciesResponse: """Post-rpc interceptor for list_dependencies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_dependencies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubDependencies server but before - it is returned to user code. + it is returned to user code. This `post_list_dependencies` interceptor runs + before the `post_list_dependencies_with_metadata` interceptor. """ return response + def post_list_dependencies_with_metadata( + self, + response: apihub_service.ListDependenciesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + apihub_service.ListDependenciesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_dependencies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubDependencies server but before it is returned to user code. + + We recommend only using this `post_list_dependencies_with_metadata` + interceptor in new development instead of the `post_list_dependencies` interceptor. + When both interceptors are used, this `post_list_dependencies_with_metadata` interceptor runs after the + `post_list_dependencies` interceptor. The (possibly modified) response returned by + `post_list_dependencies` will be passed to + `post_list_dependencies_with_metadata`. + """ + return response, metadata + def pre_update_dependency( self, request: apihub_service.UpdateDependencyRequest, @@ -221,12 +292,35 @@ def post_update_dependency( ) -> common_fields.Dependency: """Post-rpc interceptor for update_dependency - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_dependency_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubDependencies server but before - it is returned to user code. + it is returned to user code. This `post_update_dependency` interceptor runs + before the `post_update_dependency_with_metadata` interceptor. """ return response + def post_update_dependency_with_metadata( + self, + response: common_fields.Dependency, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.Dependency, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_dependency + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubDependencies server but before it is returned to user code. + + We recommend only using this `post_update_dependency_with_metadata` + interceptor in new development instead of the `post_update_dependency` interceptor. + When both interceptors are used, this `post_update_dependency_with_metadata` interceptor runs after the + `post_update_dependency` interceptor. The (possibly modified) response returned by + `post_update_dependency` will be passed to + `post_update_dependency_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -595,6 +689,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_dependency(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_dependency_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -854,6 +952,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_dependency(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_dependency_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1002,6 +1104,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_dependencies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_dependencies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1161,6 +1267,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_dependency(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_dependency_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/client.py index 4d6b0b55a5af..30aa8d7e5514 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/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 @@ -502,6 +504,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. @@ -1066,16 +1095,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, @@ -1121,16 +1154,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, @@ -1287,16 +1324,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, @@ -1342,16 +1383,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-apihub/google/cloud/apihub_v1/services/api_hub_plugin/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/transports/rest.py index 3e6fcd8fed38..8e2ff4a9d4fb 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/api_hub_plugin/transports/rest.py @@ -119,12 +119,35 @@ def post_disable_plugin( ) -> plugin_service.Plugin: """Post-rpc interceptor for disable_plugin - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_plugin_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubPlugin server but before - it is returned to user code. + it is returned to user code. This `post_disable_plugin` interceptor runs + before the `post_disable_plugin_with_metadata` interceptor. """ return response + def post_disable_plugin_with_metadata( + self, + response: plugin_service.Plugin, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[plugin_service.Plugin, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_plugin + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubPlugin server but before it is returned to user code. + + We recommend only using this `post_disable_plugin_with_metadata` + interceptor in new development instead of the `post_disable_plugin` interceptor. + When both interceptors are used, this `post_disable_plugin_with_metadata` interceptor runs after the + `post_disable_plugin` interceptor. The (possibly modified) response returned by + `post_disable_plugin` will be passed to + `post_disable_plugin_with_metadata`. + """ + return response, metadata + def pre_enable_plugin( self, request: plugin_service.EnablePluginRequest, @@ -144,12 +167,35 @@ def post_enable_plugin( ) -> plugin_service.Plugin: """Post-rpc interceptor for enable_plugin - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_plugin_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubPlugin server but before - it is returned to user code. + it is returned to user code. This `post_enable_plugin` interceptor runs + before the `post_enable_plugin_with_metadata` interceptor. """ return response + def post_enable_plugin_with_metadata( + self, + response: plugin_service.Plugin, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[plugin_service.Plugin, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_plugin + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubPlugin server but before it is returned to user code. + + We recommend only using this `post_enable_plugin_with_metadata` + interceptor in new development instead of the `post_enable_plugin` interceptor. + When both interceptors are used, this `post_enable_plugin_with_metadata` interceptor runs after the + `post_enable_plugin` interceptor. The (possibly modified) response returned by + `post_enable_plugin` will be passed to + `post_enable_plugin_with_metadata`. + """ + return response, metadata + def pre_get_plugin( self, request: plugin_service.GetPluginRequest, @@ -167,12 +213,35 @@ def pre_get_plugin( def post_get_plugin(self, response: plugin_service.Plugin) -> plugin_service.Plugin: """Post-rpc interceptor for get_plugin - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_plugin_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ApiHubPlugin server but before - it is returned to user code. + it is returned to user code. This `post_get_plugin` interceptor runs + before the `post_get_plugin_with_metadata` interceptor. """ return response + def post_get_plugin_with_metadata( + self, + response: plugin_service.Plugin, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[plugin_service.Plugin, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_plugin + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ApiHubPlugin server but before it is returned to user code. + + We recommend only using this `post_get_plugin_with_metadata` + interceptor in new development instead of the `post_get_plugin` interceptor. + When both interceptors are used, this `post_get_plugin_with_metadata` interceptor runs after the + `post_get_plugin` interceptor. The (possibly modified) response returned by + `post_get_plugin` will be passed to + `post_get_plugin_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -531,6 +600,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_plugin(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_plugin_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -683,6 +756,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_plugin(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_plugin_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -829,6 +906,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_plugin(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_plugin_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_registration_service/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_registration_service/client.py index 285335177055..a2b1763f1ef7 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_registration_service/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_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 @@ -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. @@ -1187,16 +1216,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, @@ -1242,16 +1275,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, @@ -1408,16 +1445,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, @@ -1463,16 +1504,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-apihub/google/cloud/apihub_v1/services/host_project_registration_service/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_registration_service/transports/rest.py index 437f5503445b..c64b62e8d03f 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_registration_service/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/host_project_registration_service/transports/rest.py @@ -120,12 +120,38 @@ def post_create_host_project_registration( ) -> host_project_registration_service.HostProjectRegistration: """Post-rpc interceptor for create_host_project_registration - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_host_project_registration_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HostProjectRegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_host_project_registration` interceptor runs + before the `post_create_host_project_registration_with_metadata` interceptor. """ return response + def post_create_host_project_registration_with_metadata( + self, + response: host_project_registration_service.HostProjectRegistration, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + host_project_registration_service.HostProjectRegistration, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_host_project_registration + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HostProjectRegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_host_project_registration_with_metadata` + interceptor in new development instead of the `post_create_host_project_registration` interceptor. + When both interceptors are used, this `post_create_host_project_registration_with_metadata` interceptor runs after the + `post_create_host_project_registration` interceptor. The (possibly modified) response returned by + `post_create_host_project_registration` will be passed to + `post_create_host_project_registration_with_metadata`. + """ + return response, metadata + def pre_get_host_project_registration( self, request: host_project_registration_service.GetHostProjectRegistrationRequest, @@ -146,12 +172,38 @@ def post_get_host_project_registration( ) -> host_project_registration_service.HostProjectRegistration: """Post-rpc interceptor for get_host_project_registration - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_host_project_registration_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HostProjectRegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_host_project_registration` interceptor runs + before the `post_get_host_project_registration_with_metadata` interceptor. """ return response + def post_get_host_project_registration_with_metadata( + self, + response: host_project_registration_service.HostProjectRegistration, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + host_project_registration_service.HostProjectRegistration, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_host_project_registration + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HostProjectRegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_host_project_registration_with_metadata` + interceptor in new development instead of the `post_get_host_project_registration` interceptor. + When both interceptors are used, this `post_get_host_project_registration_with_metadata` interceptor runs after the + `post_get_host_project_registration` interceptor. The (possibly modified) response returned by + `post_get_host_project_registration` will be passed to + `post_get_host_project_registration_with_metadata`. + """ + return response, metadata + def pre_list_host_project_registrations( self, request: host_project_registration_service.ListHostProjectRegistrationsRequest, @@ -173,12 +225,38 @@ def post_list_host_project_registrations( ) -> host_project_registration_service.ListHostProjectRegistrationsResponse: """Post-rpc interceptor for list_host_project_registrations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_host_project_registrations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HostProjectRegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_host_project_registrations` interceptor runs + before the `post_list_host_project_registrations_with_metadata` interceptor. """ return response + def post_list_host_project_registrations_with_metadata( + self, + response: host_project_registration_service.ListHostProjectRegistrationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + host_project_registration_service.ListHostProjectRegistrationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_host_project_registrations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HostProjectRegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_host_project_registrations_with_metadata` + interceptor in new development instead of the `post_list_host_project_registrations` interceptor. + When both interceptors are used, this `post_list_host_project_registrations_with_metadata` interceptor runs after the + `post_list_host_project_registrations` interceptor. The (possibly modified) response returned by + `post_list_host_project_registrations` will be passed to + `post_list_host_project_registrations_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -558,6 +636,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_host_project_registration(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_host_project_registration_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -718,6 +803,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_host_project_registration(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_host_project_registration_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -875,6 +967,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_host_project_registrations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_host_project_registrations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_service/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_service/client.py index 0754a3fee0d0..ea50a3d4a2a3 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_service/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_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. @@ -1175,16 +1204,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, @@ -1230,16 +1263,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, @@ -1396,16 +1433,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, @@ -1451,16 +1492,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-apihub/google/cloud/apihub_v1/services/linting_service/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_service/transports/rest.py index 4f2819108c83..402e2bf2f4e7 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_service/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/linting_service/transports/rest.py @@ -124,12 +124,35 @@ def post_get_style_guide( ) -> linting_service.StyleGuide: """Post-rpc interceptor for get_style_guide - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_style_guide_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LintingService server but before - it is returned to user code. + it is returned to user code. This `post_get_style_guide` interceptor runs + before the `post_get_style_guide_with_metadata` interceptor. """ return response + def post_get_style_guide_with_metadata( + self, + response: linting_service.StyleGuide, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[linting_service.StyleGuide, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_style_guide + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LintingService server but before it is returned to user code. + + We recommend only using this `post_get_style_guide_with_metadata` + interceptor in new development instead of the `post_get_style_guide` interceptor. + When both interceptors are used, this `post_get_style_guide_with_metadata` interceptor runs after the + `post_get_style_guide` interceptor. The (possibly modified) response returned by + `post_get_style_guide` will be passed to + `post_get_style_guide_with_metadata`. + """ + return response, metadata + def pre_get_style_guide_contents( self, request: linting_service.GetStyleGuideContentsRequest, @@ -150,12 +173,37 @@ def post_get_style_guide_contents( ) -> linting_service.StyleGuideContents: """Post-rpc interceptor for get_style_guide_contents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_style_guide_contents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LintingService server but before - it is returned to user code. + it is returned to user code. This `post_get_style_guide_contents` interceptor runs + before the `post_get_style_guide_contents_with_metadata` interceptor. """ return response + def post_get_style_guide_contents_with_metadata( + self, + response: linting_service.StyleGuideContents, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + linting_service.StyleGuideContents, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_style_guide_contents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LintingService server but before it is returned to user code. + + We recommend only using this `post_get_style_guide_contents_with_metadata` + interceptor in new development instead of the `post_get_style_guide_contents` interceptor. + When both interceptors are used, this `post_get_style_guide_contents_with_metadata` interceptor runs after the + `post_get_style_guide_contents` interceptor. The (possibly modified) response returned by + `post_get_style_guide_contents` will be passed to + `post_get_style_guide_contents_with_metadata`. + """ + return response, metadata + def pre_lint_spec( self, request: linting_service.LintSpecRequest, @@ -189,12 +237,35 @@ def post_update_style_guide( ) -> linting_service.StyleGuide: """Post-rpc interceptor for update_style_guide - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_style_guide_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LintingService server but before - it is returned to user code. + it is returned to user code. This `post_update_style_guide` interceptor runs + before the `post_update_style_guide_with_metadata` interceptor. """ return response + def post_update_style_guide_with_metadata( + self, + response: linting_service.StyleGuide, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[linting_service.StyleGuide, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_style_guide + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LintingService server but before it is returned to user code. + + We recommend only using this `post_update_style_guide_with_metadata` + interceptor in new development instead of the `post_update_style_guide` interceptor. + When both interceptors are used, this `post_update_style_guide_with_metadata` interceptor runs after the + `post_update_style_guide` interceptor. The (possibly modified) response returned by + `post_update_style_guide` will be passed to + `post_update_style_guide_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -549,6 +620,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_style_guide(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_style_guide_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -694,6 +769,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_style_guide_contents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_style_guide_contents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -966,6 +1045,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_style_guide(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_style_guide_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/client.py index 0782e35b0559..b8332bf9edd9 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/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. @@ -1110,16 +1139,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, @@ -1165,16 +1198,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, @@ -1331,16 +1368,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, @@ -1386,16 +1427,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-apihub/google/cloud/apihub_v1/services/provisioning/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/transports/rest.py index d10fa7b8c6a6..d1c285a2421d 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/provisioning/transports/rest.py @@ -120,12 +120,35 @@ def post_create_api_hub_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_api_hub_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_api_hub_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Provisioning server but before - it is returned to user code. + it is returned to user code. This `post_create_api_hub_instance` interceptor runs + before the `post_create_api_hub_instance_with_metadata` interceptor. """ return response + def post_create_api_hub_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_api_hub_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Provisioning server but before it is returned to user code. + + We recommend only using this `post_create_api_hub_instance_with_metadata` + interceptor in new development instead of the `post_create_api_hub_instance` interceptor. + When both interceptors are used, this `post_create_api_hub_instance_with_metadata` interceptor runs after the + `post_create_api_hub_instance` interceptor. The (possibly modified) response returned by + `post_create_api_hub_instance` will be passed to + `post_create_api_hub_instance_with_metadata`. + """ + return response, metadata + def pre_get_api_hub_instance( self, request: provisioning_service.GetApiHubInstanceRequest, @@ -146,12 +169,35 @@ def post_get_api_hub_instance( ) -> common_fields.ApiHubInstance: """Post-rpc interceptor for get_api_hub_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_api_hub_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Provisioning server but before - it is returned to user code. + it is returned to user code. This `post_get_api_hub_instance` interceptor runs + before the `post_get_api_hub_instance_with_metadata` interceptor. """ return response + def post_get_api_hub_instance_with_metadata( + self, + response: common_fields.ApiHubInstance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common_fields.ApiHubInstance, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_api_hub_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Provisioning server but before it is returned to user code. + + We recommend only using this `post_get_api_hub_instance_with_metadata` + interceptor in new development instead of the `post_get_api_hub_instance` interceptor. + When both interceptors are used, this `post_get_api_hub_instance_with_metadata` interceptor runs after the + `post_get_api_hub_instance` interceptor. The (possibly modified) response returned by + `post_get_api_hub_instance` will be passed to + `post_get_api_hub_instance_with_metadata`. + """ + return response, metadata + def pre_lookup_api_hub_instance( self, request: provisioning_service.LookupApiHubInstanceRequest, @@ -172,12 +218,38 @@ def post_lookup_api_hub_instance( ) -> provisioning_service.LookupApiHubInstanceResponse: """Post-rpc interceptor for lookup_api_hub_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_lookup_api_hub_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Provisioning server but before - it is returned to user code. + it is returned to user code. This `post_lookup_api_hub_instance` interceptor runs + before the `post_lookup_api_hub_instance_with_metadata` interceptor. """ return response + def post_lookup_api_hub_instance_with_metadata( + self, + response: provisioning_service.LookupApiHubInstanceResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + provisioning_service.LookupApiHubInstanceResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for lookup_api_hub_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Provisioning server but before it is returned to user code. + + We recommend only using this `post_lookup_api_hub_instance_with_metadata` + interceptor in new development instead of the `post_lookup_api_hub_instance` interceptor. + When both interceptors are used, this `post_lookup_api_hub_instance_with_metadata` interceptor runs after the + `post_lookup_api_hub_instance` interceptor. The (possibly modified) response returned by + `post_lookup_api_hub_instance` will be passed to + `post_lookup_api_hub_instance_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -594,6 +666,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_api_hub_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_api_hub_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -742,6 +818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_api_hub_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_api_hub_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -889,6 +969,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_lookup_api_hub_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_lookup_api_hub_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/client.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/client.py index 0ca48901fd15..5710d3963e17 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/client.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_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 @@ -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. @@ -1410,16 +1439,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, @@ -1465,16 +1498,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, @@ -1631,16 +1668,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, @@ -1686,16 +1727,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-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/transports/rest.py b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/transports/rest.py index 1b3597fec0b4..a96822070361 100644 --- a/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/transports/rest.py +++ b/packages/google-cloud-apihub/google/cloud/apihub_v1/services/runtime_project_attachment_service/transports/rest.py @@ -133,12 +133,38 @@ def post_create_runtime_project_attachment( ) -> runtime_project_attachment_service.RuntimeProjectAttachment: """Post-rpc interceptor for create_runtime_project_attachment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_runtime_project_attachment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuntimeProjectAttachmentService server but before - it is returned to user code. + it is returned to user code. This `post_create_runtime_project_attachment` interceptor runs + before the `post_create_runtime_project_attachment_with_metadata` interceptor. """ return response + def post_create_runtime_project_attachment_with_metadata( + self, + response: runtime_project_attachment_service.RuntimeProjectAttachment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + runtime_project_attachment_service.RuntimeProjectAttachment, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_runtime_project_attachment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuntimeProjectAttachmentService server but before it is returned to user code. + + We recommend only using this `post_create_runtime_project_attachment_with_metadata` + interceptor in new development instead of the `post_create_runtime_project_attachment` interceptor. + When both interceptors are used, this `post_create_runtime_project_attachment_with_metadata` interceptor runs after the + `post_create_runtime_project_attachment` interceptor. The (possibly modified) response returned by + `post_create_runtime_project_attachment` will be passed to + `post_create_runtime_project_attachment_with_metadata`. + """ + return response, metadata + def pre_delete_runtime_project_attachment( self, request: runtime_project_attachment_service.DeleteRuntimeProjectAttachmentRequest, @@ -174,12 +200,38 @@ def post_get_runtime_project_attachment( ) -> runtime_project_attachment_service.RuntimeProjectAttachment: """Post-rpc interceptor for get_runtime_project_attachment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_runtime_project_attachment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuntimeProjectAttachmentService server but before - it is returned to user code. + it is returned to user code. This `post_get_runtime_project_attachment` interceptor runs + before the `post_get_runtime_project_attachment_with_metadata` interceptor. """ return response + def post_get_runtime_project_attachment_with_metadata( + self, + response: runtime_project_attachment_service.RuntimeProjectAttachment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + runtime_project_attachment_service.RuntimeProjectAttachment, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_runtime_project_attachment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuntimeProjectAttachmentService server but before it is returned to user code. + + We recommend only using this `post_get_runtime_project_attachment_with_metadata` + interceptor in new development instead of the `post_get_runtime_project_attachment` interceptor. + When both interceptors are used, this `post_get_runtime_project_attachment_with_metadata` interceptor runs after the + `post_get_runtime_project_attachment` interceptor. The (possibly modified) response returned by + `post_get_runtime_project_attachment` will be passed to + `post_get_runtime_project_attachment_with_metadata`. + """ + return response, metadata + def pre_list_runtime_project_attachments( self, request: runtime_project_attachment_service.ListRuntimeProjectAttachmentsRequest, @@ -201,12 +253,38 @@ def post_list_runtime_project_attachments( ) -> runtime_project_attachment_service.ListRuntimeProjectAttachmentsResponse: """Post-rpc interceptor for list_runtime_project_attachments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_runtime_project_attachments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuntimeProjectAttachmentService server but before - it is returned to user code. + it is returned to user code. This `post_list_runtime_project_attachments` interceptor runs + before the `post_list_runtime_project_attachments_with_metadata` interceptor. """ return response + def post_list_runtime_project_attachments_with_metadata( + self, + response: runtime_project_attachment_service.ListRuntimeProjectAttachmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + runtime_project_attachment_service.ListRuntimeProjectAttachmentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_runtime_project_attachments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuntimeProjectAttachmentService server but before it is returned to user code. + + We recommend only using this `post_list_runtime_project_attachments_with_metadata` + interceptor in new development instead of the `post_list_runtime_project_attachments` interceptor. + When both interceptors are used, this `post_list_runtime_project_attachments_with_metadata` interceptor runs after the + `post_list_runtime_project_attachments` interceptor. The (possibly modified) response returned by + `post_list_runtime_project_attachments` will be passed to + `post_list_runtime_project_attachments_with_metadata`. + """ + return response, metadata + def pre_lookup_runtime_project_attachment( self, request: runtime_project_attachment_service.LookupRuntimeProjectAttachmentRequest, @@ -228,12 +306,38 @@ def post_lookup_runtime_project_attachment( ) -> runtime_project_attachment_service.LookupRuntimeProjectAttachmentResponse: """Post-rpc interceptor for lookup_runtime_project_attachment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_lookup_runtime_project_attachment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuntimeProjectAttachmentService server but before - it is returned to user code. + it is returned to user code. This `post_lookup_runtime_project_attachment` interceptor runs + before the `post_lookup_runtime_project_attachment_with_metadata` interceptor. """ return response + def post_lookup_runtime_project_attachment_with_metadata( + self, + response: runtime_project_attachment_service.LookupRuntimeProjectAttachmentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + runtime_project_attachment_service.LookupRuntimeProjectAttachmentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for lookup_runtime_project_attachment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuntimeProjectAttachmentService server but before it is returned to user code. + + We recommend only using this `post_lookup_runtime_project_attachment_with_metadata` + interceptor in new development instead of the `post_lookup_runtime_project_attachment` interceptor. + When both interceptors are used, this `post_lookup_runtime_project_attachment_with_metadata` interceptor runs after the + `post_lookup_runtime_project_attachment` interceptor. The (possibly modified) response returned by + `post_lookup_runtime_project_attachment` will be passed to + `post_lookup_runtime_project_attachment_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -612,6 +716,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_runtime_project_attachment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_runtime_project_attachment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -885,6 +996,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_runtime_project_attachment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_runtime_project_attachment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1042,6 +1160,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_runtime_project_attachments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_runtime_project_attachments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1199,6 +1324,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_lookup_runtime_project_attachment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_lookup_runtime_project_attachment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-apihub/samples/generated_samples/snippet_metadata_google.cloud.apihub.v1.json b/packages/google-cloud-apihub/samples/generated_samples/snippet_metadata_google.cloud.apihub.v1.json index b8256fb0854f..f91c8ea92da1 100644 --- a/packages/google-cloud-apihub/samples/generated_samples/snippet_metadata_google.cloud.apihub.v1.json +++ b/packages/google-cloud-apihub/samples/generated_samples/snippet_metadata_google.cloud.apihub.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-apihub", - "version": "0.2.3" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub.py index 5bfa4b5cc4e7..47e24a257b5f 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub.py @@ -59,6 +59,13 @@ from google.cloud.apihub_v1.services.api_hub import ApiHubClient, pagers, transports from google.cloud.apihub_v1.types import apihub_service, common_fields +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 @@ -276,6 +283,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 = ApiHubClient(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 = ApiHubClient(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", [ @@ -8170,10 +8220,13 @@ def test_create_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_create_api" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_create_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_create_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateApiRequest.pb( apihub_service.CreateApiRequest() ) @@ -8197,6 +8250,7 @@ def test_create_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Api() + post_with_metadata.return_value = common_fields.Api(), metadata client.create_api( request, @@ -8208,6 +8262,7 @@ def test_create_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_rest_bad_request(request_type=apihub_service.GetApiRequest): @@ -8296,10 +8351,13 @@ def test_get_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_api" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetApiRequest.pb(apihub_service.GetApiRequest()) transcode.return_value = { "method": "post", @@ -8321,6 +8379,7 @@ def test_get_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Api() + post_with_metadata.return_value = common_fields.Api(), metadata client.get_api( request, @@ -8332,6 +8391,7 @@ def test_get_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_apis_rest_bad_request(request_type=apihub_service.ListApisRequest): @@ -8412,10 +8472,13 @@ def test_list_apis_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_apis" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_apis_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_apis" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListApisRequest.pb(apihub_service.ListApisRequest()) transcode.return_value = { "method": "post", @@ -8439,6 +8502,7 @@ def test_list_apis_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListApisResponse() + post_with_metadata.return_value = apihub_service.ListApisResponse(), metadata client.list_apis( request, @@ -8450,6 +8514,7 @@ def test_list_apis_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_api_rest_bad_request(request_type=apihub_service.UpdateApiRequest): @@ -8636,10 +8701,13 @@ def test_update_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_update_api" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_update_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_update_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateApiRequest.pb( apihub_service.UpdateApiRequest() ) @@ -8663,6 +8731,7 @@ def test_update_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Api() + post_with_metadata.return_value = common_fields.Api(), metadata client.update_api( request, @@ -8674,6 +8743,7 @@ def test_update_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_api_rest_bad_request(request_type=apihub_service.DeleteApiRequest): @@ -8973,10 +9043,13 @@ def test_create_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_create_version" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_create_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_create_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateVersionRequest.pb( apihub_service.CreateVersionRequest() ) @@ -9000,6 +9073,7 @@ def test_create_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Version() + post_with_metadata.return_value = common_fields.Version(), metadata client.create_version( request, @@ -9011,6 +9085,7 @@ def test_create_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_version_rest_bad_request(request_type=apihub_service.GetVersionRequest): @@ -9109,10 +9184,13 @@ def test_get_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_version" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetVersionRequest.pb( apihub_service.GetVersionRequest() ) @@ -9136,6 +9214,7 @@ def test_get_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Version() + post_with_metadata.return_value = common_fields.Version(), metadata client.get_version( request, @@ -9147,6 +9226,7 @@ def test_get_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_versions_rest_bad_request( @@ -9229,10 +9309,13 @@ def test_list_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_versions" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_versions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListVersionsRequest.pb( apihub_service.ListVersionsRequest() ) @@ -9258,6 +9341,10 @@ def test_list_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListVersionsResponse() + post_with_metadata.return_value = ( + apihub_service.ListVersionsResponse(), + metadata, + ) client.list_versions( request, @@ -9269,6 +9356,7 @@ def test_list_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_version_rest_bad_request( @@ -9471,10 +9559,13 @@ def test_update_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_update_version" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_update_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_update_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateVersionRequest.pb( apihub_service.UpdateVersionRequest() ) @@ -9498,6 +9589,7 @@ def test_update_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Version() + post_with_metadata.return_value = common_fields.Version(), metadata client.update_version( request, @@ -9509,6 +9601,7 @@ def test_update_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_version_rest_bad_request( @@ -9827,10 +9920,13 @@ def test_create_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_create_spec" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_create_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_create_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateSpecRequest.pb( apihub_service.CreateSpecRequest() ) @@ -9854,6 +9950,7 @@ def test_create_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Spec() + post_with_metadata.return_value = common_fields.Spec(), metadata client.create_spec( request, @@ -9865,6 +9962,7 @@ def test_create_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_spec_rest_bad_request(request_type=apihub_service.GetSpecRequest): @@ -9955,10 +10053,13 @@ def test_get_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_spec" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetSpecRequest.pb(apihub_service.GetSpecRequest()) transcode.return_value = { "method": "post", @@ -9980,6 +10081,7 @@ def test_get_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Spec() + post_with_metadata.return_value = common_fields.Spec(), metadata client.get_spec( request, @@ -9991,6 +10093,7 @@ def test_get_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_spec_contents_rest_bad_request( @@ -10079,10 +10182,13 @@ def test_get_spec_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_spec_contents" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_spec_contents_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_spec_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetSpecContentsRequest.pb( apihub_service.GetSpecContentsRequest() ) @@ -10106,6 +10212,7 @@ def test_get_spec_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.SpecContents() + post_with_metadata.return_value = common_fields.SpecContents(), metadata client.get_spec_contents( request, @@ -10117,6 +10224,7 @@ def test_get_spec_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_specs_rest_bad_request(request_type=apihub_service.ListSpecsRequest): @@ -10201,10 +10309,13 @@ def test_list_specs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_specs" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_specs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_specs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListSpecsRequest.pb( apihub_service.ListSpecsRequest() ) @@ -10230,6 +10341,7 @@ def test_list_specs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListSpecsResponse() + post_with_metadata.return_value = apihub_service.ListSpecsResponse(), metadata client.list_specs( request, @@ -10241,6 +10353,7 @@ def test_list_specs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_spec_rest_bad_request(request_type=apihub_service.UpdateSpecRequest): @@ -10452,10 +10565,13 @@ def test_update_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_update_spec" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_update_spec_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_update_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateSpecRequest.pb( apihub_service.UpdateSpecRequest() ) @@ -10479,6 +10595,7 @@ def test_update_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Spec() + post_with_metadata.return_value = common_fields.Spec(), metadata client.update_spec( request, @@ -10490,6 +10607,7 @@ def test_update_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_spec_rest_bad_request(request_type=apihub_service.DeleteSpecRequest): @@ -10687,10 +10805,13 @@ def test_get_api_operation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_api_operation" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_api_operation_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_api_operation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetApiOperationRequest.pb( apihub_service.GetApiOperationRequest() ) @@ -10714,6 +10835,7 @@ def test_get_api_operation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.ApiOperation() + post_with_metadata.return_value = common_fields.ApiOperation(), metadata client.get_api_operation( request, @@ -10725,6 +10847,7 @@ def test_get_api_operation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_api_operations_rest_bad_request( @@ -10811,10 +10934,13 @@ def test_list_api_operations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_api_operations" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_api_operations_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_api_operations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListApiOperationsRequest.pb( apihub_service.ListApiOperationsRequest() ) @@ -10840,6 +10966,10 @@ def test_list_api_operations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListApiOperationsResponse() + post_with_metadata.return_value = ( + apihub_service.ListApiOperationsResponse(), + metadata, + ) client.list_api_operations( request, @@ -10851,6 +10981,7 @@ def test_list_api_operations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_definition_rest_bad_request( @@ -10941,10 +11072,13 @@ def test_get_definition_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_definition" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_definition_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_definition" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetDefinitionRequest.pb( apihub_service.GetDefinitionRequest() ) @@ -10968,6 +11102,7 @@ def test_get_definition_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Definition() + post_with_metadata.return_value = common_fields.Definition(), metadata client.get_definition( request, @@ -10979,6 +11114,7 @@ def test_get_definition_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( @@ -11167,10 +11303,13 @@ def test_create_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_create_deployment" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_create_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_create_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateDeploymentRequest.pb( apihub_service.CreateDeploymentRequest() ) @@ -11194,6 +11333,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Deployment() + post_with_metadata.return_value = common_fields.Deployment(), metadata client.create_deployment( request, @@ -11205,6 +11345,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_get_deployment_rest_bad_request( @@ -11297,10 +11438,13 @@ def test_get_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_deployment" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetDeploymentRequest.pb( apihub_service.GetDeploymentRequest() ) @@ -11324,6 +11468,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Deployment() + post_with_metadata.return_value = common_fields.Deployment(), metadata client.get_deployment( request, @@ -11335,6 +11480,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_deployments_rest_bad_request( @@ -11417,10 +11563,13 @@ def test_list_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_deployments" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_deployments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListDeploymentsRequest.pb( apihub_service.ListDeploymentsRequest() ) @@ -11446,6 +11595,10 @@ def test_list_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListDeploymentsResponse() + post_with_metadata.return_value = ( + apihub_service.ListDeploymentsResponse(), + metadata, + ) client.list_deployments( request, @@ -11457,6 +11610,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_update_deployment_rest_bad_request( @@ -11649,10 +11803,13 @@ def test_update_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_update_deployment" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_update_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_update_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateDeploymentRequest.pb( apihub_service.UpdateDeploymentRequest() ) @@ -11676,6 +11833,7 @@ def test_update_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Deployment() + post_with_metadata.return_value = common_fields.Deployment(), metadata client.update_deployment( request, @@ -11687,6 +11845,7 @@ def test_update_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_deployment_rest_bad_request( @@ -11980,10 +12139,13 @@ def test_create_attribute_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_create_attribute" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_create_attribute_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_create_attribute" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateAttributeRequest.pb( apihub_service.CreateAttributeRequest() ) @@ -12007,6 +12169,7 @@ def test_create_attribute_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Attribute() + post_with_metadata.return_value = common_fields.Attribute(), metadata client.create_attribute( request, @@ -12018,6 +12181,7 @@ def test_create_attribute_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_attribute_rest_bad_request( @@ -12117,10 +12281,13 @@ def test_get_attribute_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_attribute" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_attribute_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_attribute" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetAttributeRequest.pb( apihub_service.GetAttributeRequest() ) @@ -12144,6 +12311,7 @@ def test_get_attribute_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Attribute() + post_with_metadata.return_value = common_fields.Attribute(), metadata client.get_attribute( request, @@ -12155,6 +12323,7 @@ def test_get_attribute_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_attribute_rest_bad_request( @@ -12345,10 +12514,13 @@ def test_update_attribute_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_update_attribute" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_update_attribute_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_update_attribute" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateAttributeRequest.pb( apihub_service.UpdateAttributeRequest() ) @@ -12372,6 +12544,7 @@ def test_update_attribute_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Attribute() + post_with_metadata.return_value = common_fields.Attribute(), metadata client.update_attribute( request, @@ -12383,6 +12556,7 @@ def test_update_attribute_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_attribute_rest_bad_request( @@ -12572,10 +12746,13 @@ def test_list_attributes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_attributes" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_attributes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_attributes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListAttributesRequest.pb( apihub_service.ListAttributesRequest() ) @@ -12601,6 +12778,10 @@ def test_list_attributes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListAttributesResponse() + post_with_metadata.return_value = ( + apihub_service.ListAttributesResponse(), + metadata, + ) client.list_attributes( request, @@ -12612,6 +12793,7 @@ def test_list_attributes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_resources_rest_bad_request( @@ -12694,10 +12876,13 @@ def test_search_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_search_resources" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_search_resources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_search_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.SearchResourcesRequest.pb( apihub_service.SearchResourcesRequest() ) @@ -12723,6 +12908,10 @@ def test_search_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.SearchResourcesResponse() + post_with_metadata.return_value = ( + apihub_service.SearchResourcesResponse(), + metadata, + ) client.search_resources( request, @@ -12734,6 +12923,7 @@ def test_search_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_external_api_rest_bad_request( @@ -12902,10 +13092,13 @@ def test_create_external_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_create_external_api" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_create_external_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_create_external_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateExternalApiRequest.pb( apihub_service.CreateExternalApiRequest() ) @@ -12929,6 +13122,7 @@ def test_create_external_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.ExternalApi() + post_with_metadata.return_value = common_fields.ExternalApi(), metadata client.create_external_api( request, @@ -12940,6 +13134,7 @@ def test_create_external_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_external_api_rest_bad_request( @@ -13030,10 +13225,13 @@ def test_get_external_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_get_external_api" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_get_external_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_get_external_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetExternalApiRequest.pb( apihub_service.GetExternalApiRequest() ) @@ -13057,6 +13255,7 @@ def test_get_external_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.ExternalApi() + post_with_metadata.return_value = common_fields.ExternalApi(), metadata client.get_external_api( request, @@ -13068,6 +13267,7 @@ def test_get_external_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_external_api_rest_bad_request( @@ -13244,10 +13444,13 @@ def test_update_external_api_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_update_external_api" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_update_external_api_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_update_external_api" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateExternalApiRequest.pb( apihub_service.UpdateExternalApiRequest() ) @@ -13271,6 +13474,7 @@ def test_update_external_api_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.ExternalApi() + post_with_metadata.return_value = common_fields.ExternalApi(), metadata client.update_external_api( request, @@ -13282,6 +13486,7 @@ def test_update_external_api_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_external_api_rest_bad_request( @@ -13471,10 +13676,13 @@ def test_list_external_apis_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubRestInterceptor, "post_list_external_apis" ) as post, mock.patch.object( + transports.ApiHubRestInterceptor, "post_list_external_apis_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubRestInterceptor, "pre_list_external_apis" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListExternalApisRequest.pb( apihub_service.ListExternalApisRequest() ) @@ -13500,6 +13708,10 @@ def test_list_external_apis_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListExternalApisResponse() + post_with_metadata.return_value = ( + apihub_service.ListExternalApisResponse(), + metadata, + ) client.list_external_apis( request, @@ -13511,6 +13723,7 @@ def test_list_external_apis_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-apihub/tests/unit/gapic/apihub_v1/test_api_hub_dependencies.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub_dependencies.py index 0f2b7a7b4cbf..40f5450f62c0 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub_dependencies.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub_dependencies.py @@ -63,6 +63,13 @@ ) from google.cloud.apihub_v1.types import apihub_service, common_fields +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -329,6 +336,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ApiHubDependenciesClient(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 = ApiHubDependenciesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -2188,10 +2238,14 @@ def test_create_dependency_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "post_create_dependency" ) as post, mock.patch.object( + transports.ApiHubDependenciesRestInterceptor, + "post_create_dependency_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "pre_create_dependency" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.CreateDependencyRequest.pb( apihub_service.CreateDependencyRequest() ) @@ -2215,6 +2269,7 @@ def test_create_dependency_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Dependency() + post_with_metadata.return_value = common_fields.Dependency(), metadata client.create_dependency( request, @@ -2226,6 +2281,7 @@ def test_create_dependency_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_dependency_rest_bad_request( @@ -2316,10 +2372,14 @@ def test_get_dependency_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "post_get_dependency" ) as post, mock.patch.object( + transports.ApiHubDependenciesRestInterceptor, + "post_get_dependency_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "pre_get_dependency" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.GetDependencyRequest.pb( apihub_service.GetDependencyRequest() ) @@ -2343,6 +2403,7 @@ def test_get_dependency_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Dependency() + post_with_metadata.return_value = common_fields.Dependency(), metadata client.get_dependency( request, @@ -2354,6 +2415,7 @@ def test_get_dependency_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_dependency_rest_bad_request( @@ -2535,10 +2597,14 @@ def test_update_dependency_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "post_update_dependency" ) as post, mock.patch.object( + transports.ApiHubDependenciesRestInterceptor, + "post_update_dependency_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "pre_update_dependency" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.UpdateDependencyRequest.pb( apihub_service.UpdateDependencyRequest() ) @@ -2562,6 +2628,7 @@ def test_update_dependency_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.Dependency() + post_with_metadata.return_value = common_fields.Dependency(), metadata client.update_dependency( request, @@ -2573,6 +2640,7 @@ def test_update_dependency_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_dependency_rest_bad_request( @@ -2766,10 +2834,14 @@ def test_list_dependencies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "post_list_dependencies" ) as post, mock.patch.object( + transports.ApiHubDependenciesRestInterceptor, + "post_list_dependencies_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ApiHubDependenciesRestInterceptor, "pre_list_dependencies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = apihub_service.ListDependenciesRequest.pb( apihub_service.ListDependenciesRequest() ) @@ -2795,6 +2867,10 @@ def test_list_dependencies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = apihub_service.ListDependenciesResponse() + post_with_metadata.return_value = ( + apihub_service.ListDependenciesResponse(), + metadata, + ) client.list_dependencies( request, @@ -2806,6 +2882,7 @@ def test_list_dependencies_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-apihub/tests/unit/gapic/apihub_v1/test_api_hub_plugin.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub_plugin.py index d90cab162dae..81ac46692326 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub_plugin.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_api_hub_plugin.py @@ -60,6 +60,13 @@ ) from google.cloud.apihub_v1.types import common_fields, plugin_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 @@ -298,6 +305,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 = ApiHubPluginClient(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 = ApiHubPluginClient(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", [ @@ -1580,10 +1630,13 @@ def test_get_plugin_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubPluginRestInterceptor, "post_get_plugin" ) as post, mock.patch.object( + transports.ApiHubPluginRestInterceptor, "post_get_plugin_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubPluginRestInterceptor, "pre_get_plugin" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = plugin_service.GetPluginRequest.pb( plugin_service.GetPluginRequest() ) @@ -1607,6 +1660,7 @@ def test_get_plugin_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = plugin_service.Plugin() + post_with_metadata.return_value = plugin_service.Plugin(), metadata client.get_plugin( request, @@ -1618,6 +1672,7 @@ def test_get_plugin_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_plugin_rest_bad_request( @@ -1708,10 +1763,13 @@ def test_enable_plugin_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubPluginRestInterceptor, "post_enable_plugin" ) as post, mock.patch.object( + transports.ApiHubPluginRestInterceptor, "post_enable_plugin_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubPluginRestInterceptor, "pre_enable_plugin" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = plugin_service.EnablePluginRequest.pb( plugin_service.EnablePluginRequest() ) @@ -1735,6 +1793,7 @@ def test_enable_plugin_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = plugin_service.Plugin() + post_with_metadata.return_value = plugin_service.Plugin(), metadata client.enable_plugin( request, @@ -1746,6 +1805,7 @@ def test_enable_plugin_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_plugin_rest_bad_request( @@ -1836,10 +1896,13 @@ def test_disable_plugin_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApiHubPluginRestInterceptor, "post_disable_plugin" ) as post, mock.patch.object( + transports.ApiHubPluginRestInterceptor, "post_disable_plugin_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApiHubPluginRestInterceptor, "pre_disable_plugin" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = plugin_service.DisablePluginRequest.pb( plugin_service.DisablePluginRequest() ) @@ -1863,6 +1926,7 @@ def test_disable_plugin_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = plugin_service.Plugin() + post_with_metadata.return_value = plugin_service.Plugin(), metadata client.disable_plugin( request, @@ -1874,6 +1938,7 @@ def test_disable_plugin_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-apihub/tests/unit/gapic/apihub_v1/test_host_project_registration_service.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_host_project_registration_service.py index 645a06d5663f..098a53c808bd 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_host_project_registration_service.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_host_project_registration_service.py @@ -62,6 +62,13 @@ ) from google.cloud.apihub_v1.types import host_project_registration_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -347,6 +354,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 = HostProjectRegistrationServiceClient(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 = HostProjectRegistrationServiceClient(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", [ @@ -1922,11 +1972,15 @@ def test_create_host_project_registration_rest_interceptors(null_interceptor): transports.HostProjectRegistrationServiceRestInterceptor, "post_create_host_project_registration", ) as post, mock.patch.object( + transports.HostProjectRegistrationServiceRestInterceptor, + "post_create_host_project_registration_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.HostProjectRegistrationServiceRestInterceptor, "pre_create_host_project_registration", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( host_project_registration_service.CreateHostProjectRegistrationRequest.pb( host_project_registration_service.CreateHostProjectRegistrationRequest() @@ -1958,6 +2012,10 @@ def test_create_host_project_registration_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = host_project_registration_service.HostProjectRegistration() + post_with_metadata.return_value = ( + host_project_registration_service.HostProjectRegistration(), + metadata, + ) client.create_host_project_registration( request, @@ -1969,6 +2027,7 @@ def test_create_host_project_registration_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_host_project_registration_rest_bad_request( @@ -2064,11 +2123,15 @@ def test_get_host_project_registration_rest_interceptors(null_interceptor): transports.HostProjectRegistrationServiceRestInterceptor, "post_get_host_project_registration", ) as post, mock.patch.object( + transports.HostProjectRegistrationServiceRestInterceptor, + "post_get_host_project_registration_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.HostProjectRegistrationServiceRestInterceptor, "pre_get_host_project_registration", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( host_project_registration_service.GetHostProjectRegistrationRequest.pb( host_project_registration_service.GetHostProjectRegistrationRequest() @@ -2098,6 +2161,10 @@ def test_get_host_project_registration_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = host_project_registration_service.HostProjectRegistration() + post_with_metadata.return_value = ( + host_project_registration_service.HostProjectRegistration(), + metadata, + ) client.get_host_project_registration( request, @@ -2109,6 +2176,7 @@ def test_get_host_project_registration_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_host_project_registrations_rest_bad_request( @@ -2200,11 +2268,15 @@ def test_list_host_project_registrations_rest_interceptors(null_interceptor): transports.HostProjectRegistrationServiceRestInterceptor, "post_list_host_project_registrations", ) as post, mock.patch.object( + transports.HostProjectRegistrationServiceRestInterceptor, + "post_list_host_project_registrations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.HostProjectRegistrationServiceRestInterceptor, "pre_list_host_project_registrations", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( host_project_registration_service.ListHostProjectRegistrationsRequest.pb( host_project_registration_service.ListHostProjectRegistrationsRequest() @@ -2236,6 +2308,10 @@ def test_list_host_project_registrations_rest_interceptors(null_interceptor): post.return_value = ( host_project_registration_service.ListHostProjectRegistrationsResponse() ) + post_with_metadata.return_value = ( + host_project_registration_service.ListHostProjectRegistrationsResponse(), + metadata, + ) client.list_host_project_registrations( request, @@ -2247,6 +2323,7 @@ def test_list_host_project_registrations_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-apihub/tests/unit/gapic/apihub_v1/test_linting_service.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_linting_service.py index 0971bf3da968..b394a274a688 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_linting_service.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_linting_service.py @@ -61,6 +61,13 @@ ) from google.cloud.apihub_v1.types import common_fields, linting_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 = LintingServiceClient(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 = LintingServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1734,10 +1784,13 @@ def test_get_style_guide_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LintingServiceRestInterceptor, "post_get_style_guide" ) as post, mock.patch.object( + transports.LintingServiceRestInterceptor, "post_get_style_guide_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LintingServiceRestInterceptor, "pre_get_style_guide" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = linting_service.GetStyleGuideRequest.pb( linting_service.GetStyleGuideRequest() ) @@ -1761,6 +1814,7 @@ def test_get_style_guide_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = linting_service.StyleGuide() + post_with_metadata.return_value = linting_service.StyleGuide(), metadata client.get_style_guide( request, @@ -1772,6 +1826,7 @@ def test_get_style_guide_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_style_guide_rest_bad_request( @@ -1938,10 +1993,14 @@ def test_update_style_guide_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LintingServiceRestInterceptor, "post_update_style_guide" ) as post, mock.patch.object( + transports.LintingServiceRestInterceptor, + "post_update_style_guide_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LintingServiceRestInterceptor, "pre_update_style_guide" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = linting_service.UpdateStyleGuideRequest.pb( linting_service.UpdateStyleGuideRequest() ) @@ -1965,6 +2024,7 @@ def test_update_style_guide_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = linting_service.StyleGuide() + post_with_metadata.return_value = linting_service.StyleGuide(), metadata client.update_style_guide( request, @@ -1976,6 +2036,7 @@ def test_update_style_guide_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_style_guide_contents_rest_bad_request( @@ -2066,10 +2127,14 @@ def test_get_style_guide_contents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LintingServiceRestInterceptor, "post_get_style_guide_contents" ) as post, mock.patch.object( + transports.LintingServiceRestInterceptor, + "post_get_style_guide_contents_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LintingServiceRestInterceptor, "pre_get_style_guide_contents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = linting_service.GetStyleGuideContentsRequest.pb( linting_service.GetStyleGuideContentsRequest() ) @@ -2095,6 +2160,7 @@ def test_get_style_guide_contents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = linting_service.StyleGuideContents() + post_with_metadata.return_value = linting_service.StyleGuideContents(), metadata client.get_style_guide_contents( request, @@ -2106,6 +2172,7 @@ def test_get_style_guide_contents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_lint_spec_rest_bad_request(request_type=linting_service.LintSpecRequest): diff --git a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_provisioning.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_provisioning.py index d1d2ff5a7526..fd8034bca2e5 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_provisioning.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_provisioning.py @@ -67,6 +67,13 @@ from google.cloud.apihub_v1.services.provisioning import ProvisioningClient, transports from google.cloud.apihub_v1.types import common_fields, provisioning_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 @@ -305,6 +312,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 = ProvisioningClient(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 = ProvisioningClient(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", [ @@ -1693,10 +1743,14 @@ def test_create_api_hub_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProvisioningRestInterceptor, "post_create_api_hub_instance" ) as post, mock.patch.object( + transports.ProvisioningRestInterceptor, + "post_create_api_hub_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ProvisioningRestInterceptor, "pre_create_api_hub_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = provisioning_service.CreateApiHubInstanceRequest.pb( provisioning_service.CreateApiHubInstanceRequest() ) @@ -1720,6 +1774,7 @@ def test_create_api_hub_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_api_hub_instance( request, @@ -1731,6 +1786,7 @@ def test_create_api_hub_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_api_hub_instance_rest_bad_request( @@ -1825,10 +1881,14 @@ def test_get_api_hub_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProvisioningRestInterceptor, "post_get_api_hub_instance" ) as post, mock.patch.object( + transports.ProvisioningRestInterceptor, + "post_get_api_hub_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ProvisioningRestInterceptor, "pre_get_api_hub_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = provisioning_service.GetApiHubInstanceRequest.pb( provisioning_service.GetApiHubInstanceRequest() ) @@ -1854,6 +1914,7 @@ def test_get_api_hub_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common_fields.ApiHubInstance() + post_with_metadata.return_value = common_fields.ApiHubInstance(), metadata client.get_api_hub_instance( request, @@ -1865,6 +1926,7 @@ def test_get_api_hub_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_lookup_api_hub_instance_rest_bad_request( @@ -1948,10 +2010,14 @@ def test_lookup_api_hub_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProvisioningRestInterceptor, "post_lookup_api_hub_instance" ) as post, mock.patch.object( + transports.ProvisioningRestInterceptor, + "post_lookup_api_hub_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ProvisioningRestInterceptor, "pre_lookup_api_hub_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = provisioning_service.LookupApiHubInstanceRequest.pb( provisioning_service.LookupApiHubInstanceRequest() ) @@ -1977,6 +2043,10 @@ def test_lookup_api_hub_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = provisioning_service.LookupApiHubInstanceResponse() + post_with_metadata.return_value = ( + provisioning_service.LookupApiHubInstanceResponse(), + metadata, + ) client.lookup_api_hub_instance( request, @@ -1988,6 +2058,7 @@ def test_lookup_api_hub_instance_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-apihub/tests/unit/gapic/apihub_v1/test_runtime_project_attachment_service.py b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_runtime_project_attachment_service.py index 895ab6aec87d..83a647839f9a 100644 --- a/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_runtime_project_attachment_service.py +++ b/packages/google-cloud-apihub/tests/unit/gapic/apihub_v1/test_runtime_project_attachment_service.py @@ -62,6 +62,13 @@ ) from google.cloud.apihub_v1.types import runtime_project_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 @@ -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 = RuntimeProjectAttachmentServiceClient(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 = RuntimeProjectAttachmentServiceClient(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", [ @@ -2311,11 +2361,15 @@ def test_create_runtime_project_attachment_rest_interceptors(null_interceptor): transports.RuntimeProjectAttachmentServiceRestInterceptor, "post_create_runtime_project_attachment", ) as post, mock.patch.object( + transports.RuntimeProjectAttachmentServiceRestInterceptor, + "post_create_runtime_project_attachment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RuntimeProjectAttachmentServiceRestInterceptor, "pre_create_runtime_project_attachment", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = runtime_project_attachment_service.CreateRuntimeProjectAttachmentRequest.pb( runtime_project_attachment_service.CreateRuntimeProjectAttachmentRequest() ) @@ -2347,6 +2401,10 @@ def test_create_runtime_project_attachment_rest_interceptors(null_interceptor): post.return_value = ( runtime_project_attachment_service.RuntimeProjectAttachment() ) + post_with_metadata.return_value = ( + runtime_project_attachment_service.RuntimeProjectAttachment(), + metadata, + ) client.create_runtime_project_attachment( request, @@ -2358,6 +2416,7 @@ def test_create_runtime_project_attachment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_runtime_project_attachment_rest_bad_request( @@ -2453,11 +2512,15 @@ def test_get_runtime_project_attachment_rest_interceptors(null_interceptor): transports.RuntimeProjectAttachmentServiceRestInterceptor, "post_get_runtime_project_attachment", ) as post, mock.patch.object( + transports.RuntimeProjectAttachmentServiceRestInterceptor, + "post_get_runtime_project_attachment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RuntimeProjectAttachmentServiceRestInterceptor, "pre_get_runtime_project_attachment", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( runtime_project_attachment_service.GetRuntimeProjectAttachmentRequest.pb( runtime_project_attachment_service.GetRuntimeProjectAttachmentRequest() @@ -2491,6 +2554,10 @@ def test_get_runtime_project_attachment_rest_interceptors(null_interceptor): post.return_value = ( runtime_project_attachment_service.RuntimeProjectAttachment() ) + post_with_metadata.return_value = ( + runtime_project_attachment_service.RuntimeProjectAttachment(), + metadata, + ) client.get_runtime_project_attachment( request, @@ -2502,6 +2569,7 @@ def test_get_runtime_project_attachment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_runtime_project_attachments_rest_bad_request( @@ -2593,11 +2661,15 @@ def test_list_runtime_project_attachments_rest_interceptors(null_interceptor): transports.RuntimeProjectAttachmentServiceRestInterceptor, "post_list_runtime_project_attachments", ) as post, mock.patch.object( + transports.RuntimeProjectAttachmentServiceRestInterceptor, + "post_list_runtime_project_attachments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RuntimeProjectAttachmentServiceRestInterceptor, "pre_list_runtime_project_attachments", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = runtime_project_attachment_service.ListRuntimeProjectAttachmentsRequest.pb( runtime_project_attachment_service.ListRuntimeProjectAttachmentsRequest() ) @@ -2627,6 +2699,10 @@ def test_list_runtime_project_attachments_rest_interceptors(null_interceptor): post.return_value = ( runtime_project_attachment_service.ListRuntimeProjectAttachmentsResponse() ) + post_with_metadata.return_value = ( + runtime_project_attachment_service.ListRuntimeProjectAttachmentsResponse(), + metadata, + ) client.list_runtime_project_attachments( request, @@ -2638,6 +2714,7 @@ def test_list_runtime_project_attachments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_runtime_project_attachment_rest_bad_request( @@ -2843,11 +2920,15 @@ def test_lookup_runtime_project_attachment_rest_interceptors(null_interceptor): transports.RuntimeProjectAttachmentServiceRestInterceptor, "post_lookup_runtime_project_attachment", ) as post, mock.patch.object( + transports.RuntimeProjectAttachmentServiceRestInterceptor, + "post_lookup_runtime_project_attachment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RuntimeProjectAttachmentServiceRestInterceptor, "pre_lookup_runtime_project_attachment", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = runtime_project_attachment_service.LookupRuntimeProjectAttachmentRequest.pb( runtime_project_attachment_service.LookupRuntimeProjectAttachmentRequest() ) @@ -2877,6 +2958,10 @@ def test_lookup_runtime_project_attachment_rest_interceptors(null_interceptor): post.return_value = ( runtime_project_attachment_service.LookupRuntimeProjectAttachmentResponse() ) + post_with_metadata.return_value = ( + runtime_project_attachment_service.LookupRuntimeProjectAttachmentResponse(), + metadata, + ) client.lookup_runtime_project_attachment( request, @@ -2888,6 +2973,7 @@ def test_lookup_runtime_project_attachment_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-appengine-admin/google/cloud/appengine_admin/gapic_version.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin/gapic_version.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin/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-appengine-admin/google/cloud/appengine_admin_v1/gapic_version.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/gapic_version.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_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-appengine-admin/google/cloud/appengine_admin_v1/services/applications/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/applications/client.py index 7897b1713042..170669d29ecc 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/applications/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/applications/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 @@ -464,6 +466,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-appengine-admin/google/cloud/appengine_admin_v1/services/applications/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/applications/transports/rest.py index 9d60835f0d57..e6bd11f7cf32 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/applications/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/applications/transports/rest.py @@ -126,12 +126,35 @@ def post_create_application( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_application - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_application_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Applications server but before - it is returned to user code. + it is returned to user code. This `post_create_application` interceptor runs + before the `post_create_application_with_metadata` interceptor. """ return response + def post_create_application_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_application + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Applications server but before it is returned to user code. + + We recommend only using this `post_create_application_with_metadata` + interceptor in new development instead of the `post_create_application` interceptor. + When both interceptors are used, this `post_create_application_with_metadata` interceptor runs after the + `post_create_application` interceptor. The (possibly modified) response returned by + `post_create_application` will be passed to + `post_create_application_with_metadata`. + """ + return response, metadata + def pre_get_application( self, request: appengine.GetApplicationRequest, @@ -151,12 +174,35 @@ def post_get_application( ) -> application.Application: """Post-rpc interceptor for get_application - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_application_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Applications server but before - it is returned to user code. + it is returned to user code. This `post_get_application` interceptor runs + before the `post_get_application_with_metadata` interceptor. """ return response + def post_get_application_with_metadata( + self, + response: application.Application, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[application.Application, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_application + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Applications server but before it is returned to user code. + + We recommend only using this `post_get_application_with_metadata` + interceptor in new development instead of the `post_get_application` interceptor. + When both interceptors are used, this `post_get_application_with_metadata` interceptor runs after the + `post_get_application` interceptor. The (possibly modified) response returned by + `post_get_application` will be passed to + `post_get_application_with_metadata`. + """ + return response, metadata + def pre_repair_application( self, request: appengine.RepairApplicationRequest, @@ -176,12 +222,35 @@ def post_repair_application( ) -> operations_pb2.Operation: """Post-rpc interceptor for repair_application - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_repair_application_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Applications server but before - it is returned to user code. + it is returned to user code. This `post_repair_application` interceptor runs + before the `post_repair_application_with_metadata` interceptor. """ return response + def post_repair_application_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 repair_application + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Applications server but before it is returned to user code. + + We recommend only using this `post_repair_application_with_metadata` + interceptor in new development instead of the `post_repair_application` interceptor. + When both interceptors are used, this `post_repair_application_with_metadata` interceptor runs after the + `post_repair_application` interceptor. The (possibly modified) response returned by + `post_repair_application` will be passed to + `post_repair_application_with_metadata`. + """ + return response, metadata + def pre_update_application( self, request: appengine.UpdateApplicationRequest, @@ -201,12 +270,35 @@ def post_update_application( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_application - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_application_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Applications server but before - it is returned to user code. + it is returned to user code. This `post_update_application` interceptor runs + before the `post_update_application_with_metadata` interceptor. """ return response + def post_update_application_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_application + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Applications server but before it is returned to user code. + + We recommend only using this `post_update_application_with_metadata` + interceptor in new development instead of the `post_update_application` interceptor. + When both interceptors are used, this `post_update_application_with_metadata` interceptor runs after the + `post_update_application` interceptor. The (possibly modified) response returned by + `post_update_application` will be passed to + `post_update_application_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ApplicationsRestStub: @@ -461,6 +553,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_application(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_application_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -604,6 +700,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_application(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_application_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -754,6 +854,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_repair_application(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_repair_application_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -903,6 +1007,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_application(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_application_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/client.py index 3ad8ad264dc2..0ca7ef3c1b76 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/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 @@ -469,6 +471,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-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/transports/rest.py index 5710cbbe06f0..f365434ad67c 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_certificates/transports/rest.py @@ -131,12 +131,37 @@ def post_create_authorized_certificate( ) -> certificate.AuthorizedCertificate: """Post-rpc interceptor for create_authorized_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_authorized_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AuthorizedCertificates server but before - it is returned to user code. + it is returned to user code. This `post_create_authorized_certificate` interceptor runs + before the `post_create_authorized_certificate_with_metadata` interceptor. """ return response + def post_create_authorized_certificate_with_metadata( + self, + response: certificate.AuthorizedCertificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate.AuthorizedCertificate, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_authorized_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AuthorizedCertificates server but before it is returned to user code. + + We recommend only using this `post_create_authorized_certificate_with_metadata` + interceptor in new development instead of the `post_create_authorized_certificate` interceptor. + When both interceptors are used, this `post_create_authorized_certificate_with_metadata` interceptor runs after the + `post_create_authorized_certificate` interceptor. The (possibly modified) response returned by + `post_create_authorized_certificate` will be passed to + `post_create_authorized_certificate_with_metadata`. + """ + return response, metadata + def pre_delete_authorized_certificate( self, request: appengine.DeleteAuthorizedCertificateRequest, @@ -172,12 +197,37 @@ def post_get_authorized_certificate( ) -> certificate.AuthorizedCertificate: """Post-rpc interceptor for get_authorized_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_authorized_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AuthorizedCertificates server but before - it is returned to user code. + it is returned to user code. This `post_get_authorized_certificate` interceptor runs + before the `post_get_authorized_certificate_with_metadata` interceptor. """ return response + def post_get_authorized_certificate_with_metadata( + self, + response: certificate.AuthorizedCertificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate.AuthorizedCertificate, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_authorized_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AuthorizedCertificates server but before it is returned to user code. + + We recommend only using this `post_get_authorized_certificate_with_metadata` + interceptor in new development instead of the `post_get_authorized_certificate` interceptor. + When both interceptors are used, this `post_get_authorized_certificate_with_metadata` interceptor runs after the + `post_get_authorized_certificate` interceptor. The (possibly modified) response returned by + `post_get_authorized_certificate` will be passed to + `post_get_authorized_certificate_with_metadata`. + """ + return response, metadata + def pre_list_authorized_certificates( self, request: appengine.ListAuthorizedCertificatesRequest, @@ -198,12 +248,38 @@ def post_list_authorized_certificates( ) -> appengine.ListAuthorizedCertificatesResponse: """Post-rpc interceptor for list_authorized_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_authorized_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AuthorizedCertificates server but before - it is returned to user code. + it is returned to user code. This `post_list_authorized_certificates` interceptor runs + before the `post_list_authorized_certificates_with_metadata` interceptor. """ return response + def post_list_authorized_certificates_with_metadata( + self, + response: appengine.ListAuthorizedCertificatesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + appengine.ListAuthorizedCertificatesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_authorized_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AuthorizedCertificates server but before it is returned to user code. + + We recommend only using this `post_list_authorized_certificates_with_metadata` + interceptor in new development instead of the `post_list_authorized_certificates` interceptor. + When both interceptors are used, this `post_list_authorized_certificates_with_metadata` interceptor runs after the + `post_list_authorized_certificates` interceptor. The (possibly modified) response returned by + `post_list_authorized_certificates` will be passed to + `post_list_authorized_certificates_with_metadata`. + """ + return response, metadata + def pre_update_authorized_certificate( self, request: appengine.UpdateAuthorizedCertificateRequest, @@ -224,12 +300,37 @@ def post_update_authorized_certificate( ) -> certificate.AuthorizedCertificate: """Post-rpc interceptor for update_authorized_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_authorized_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AuthorizedCertificates server but before - it is returned to user code. + it is returned to user code. This `post_update_authorized_certificate` interceptor runs + before the `post_update_authorized_certificate_with_metadata` interceptor. """ return response + def post_update_authorized_certificate_with_metadata( + self, + response: certificate.AuthorizedCertificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate.AuthorizedCertificate, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_authorized_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AuthorizedCertificates server but before it is returned to user code. + + We recommend only using this `post_update_authorized_certificate_with_metadata` + interceptor in new development instead of the `post_update_authorized_certificate` interceptor. + When both interceptors are used, this `post_update_authorized_certificate_with_metadata` interceptor runs after the + `post_update_authorized_certificate` interceptor. The (possibly modified) response returned by + `post_update_authorized_certificate` will be passed to + `post_update_authorized_certificate_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AuthorizedCertificatesRestStub: @@ -454,6 +555,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_authorized_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_authorized_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -719,6 +827,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_authorized_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_authorized_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -870,6 +982,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_authorized_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_authorized_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1030,6 +1146,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_authorized_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_authorized_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/client.py index 9483909886d3..6c91e010a627 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/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-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/transports/rest.py index 0441ac22e8a9..16c1350a16b3 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/authorized_domains/transports/rest.py @@ -101,12 +101,37 @@ def post_list_authorized_domains( ) -> appengine.ListAuthorizedDomainsResponse: """Post-rpc interceptor for list_authorized_domains - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_authorized_domains_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AuthorizedDomains server but before - it is returned to user code. + it is returned to user code. This `post_list_authorized_domains` interceptor runs + before the `post_list_authorized_domains_with_metadata` interceptor. """ return response + def post_list_authorized_domains_with_metadata( + self, + response: appengine.ListAuthorizedDomainsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + appengine.ListAuthorizedDomainsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_authorized_domains + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AuthorizedDomains server but before it is returned to user code. + + We recommend only using this `post_list_authorized_domains_with_metadata` + interceptor in new development instead of the `post_list_authorized_domains` interceptor. + When both interceptors are used, this `post_list_authorized_domains_with_metadata` interceptor runs after the + `post_list_authorized_domains` interceptor. The (possibly modified) response returned by + `post_list_authorized_domains` will be passed to + `post_list_authorized_domains_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AuthorizedDomainsRestStub: @@ -321,6 +346,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_authorized_domains(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_authorized_domains_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/client.py index 8fae3ea02743..43e3bcf28a90 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/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 @@ -467,6 +469,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-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/transports/rest.py index a57146f94322..c119e7e9aa9e 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/domain_mappings/transports/rest.py @@ -134,12 +134,35 @@ def post_create_domain_mapping( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_domain_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_domain_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DomainMappings server but before - it is returned to user code. + it is returned to user code. This `post_create_domain_mapping` interceptor runs + before the `post_create_domain_mapping_with_metadata` interceptor. """ return response + def post_create_domain_mapping_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_domain_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DomainMappings server but before it is returned to user code. + + We recommend only using this `post_create_domain_mapping_with_metadata` + interceptor in new development instead of the `post_create_domain_mapping` interceptor. + When both interceptors are used, this `post_create_domain_mapping_with_metadata` interceptor runs after the + `post_create_domain_mapping` interceptor. The (possibly modified) response returned by + `post_create_domain_mapping` will be passed to + `post_create_domain_mapping_with_metadata`. + """ + return response, metadata + def pre_delete_domain_mapping( self, request: appengine.DeleteDomainMappingRequest, @@ -159,12 +182,35 @@ def post_delete_domain_mapping( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_domain_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_domain_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DomainMappings server but before - it is returned to user code. + it is returned to user code. This `post_delete_domain_mapping` interceptor runs + before the `post_delete_domain_mapping_with_metadata` interceptor. """ return response + def post_delete_domain_mapping_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_domain_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DomainMappings server but before it is returned to user code. + + We recommend only using this `post_delete_domain_mapping_with_metadata` + interceptor in new development instead of the `post_delete_domain_mapping` interceptor. + When both interceptors are used, this `post_delete_domain_mapping_with_metadata` interceptor runs after the + `post_delete_domain_mapping` interceptor. The (possibly modified) response returned by + `post_delete_domain_mapping` will be passed to + `post_delete_domain_mapping_with_metadata`. + """ + return response, metadata + def pre_get_domain_mapping( self, request: appengine.GetDomainMappingRequest, @@ -184,12 +230,35 @@ def post_get_domain_mapping( ) -> domain_mapping.DomainMapping: """Post-rpc interceptor for get_domain_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_domain_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DomainMappings server but before - it is returned to user code. + it is returned to user code. This `post_get_domain_mapping` interceptor runs + before the `post_get_domain_mapping_with_metadata` interceptor. """ return response + def post_get_domain_mapping_with_metadata( + self, + response: domain_mapping.DomainMapping, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[domain_mapping.DomainMapping, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_domain_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DomainMappings server but before it is returned to user code. + + We recommend only using this `post_get_domain_mapping_with_metadata` + interceptor in new development instead of the `post_get_domain_mapping` interceptor. + When both interceptors are used, this `post_get_domain_mapping_with_metadata` interceptor runs after the + `post_get_domain_mapping` interceptor. The (possibly modified) response returned by + `post_get_domain_mapping` will be passed to + `post_get_domain_mapping_with_metadata`. + """ + return response, metadata + def pre_list_domain_mappings( self, request: appengine.ListDomainMappingsRequest, @@ -209,12 +278,37 @@ def post_list_domain_mappings( ) -> appengine.ListDomainMappingsResponse: """Post-rpc interceptor for list_domain_mappings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_domain_mappings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DomainMappings server but before - it is returned to user code. + it is returned to user code. This `post_list_domain_mappings` interceptor runs + before the `post_list_domain_mappings_with_metadata` interceptor. """ return response + def post_list_domain_mappings_with_metadata( + self, + response: appengine.ListDomainMappingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + appengine.ListDomainMappingsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_domain_mappings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DomainMappings server but before it is returned to user code. + + We recommend only using this `post_list_domain_mappings_with_metadata` + interceptor in new development instead of the `post_list_domain_mappings` interceptor. + When both interceptors are used, this `post_list_domain_mappings_with_metadata` interceptor runs after the + `post_list_domain_mappings` interceptor. The (possibly modified) response returned by + `post_list_domain_mappings` will be passed to + `post_list_domain_mappings_with_metadata`. + """ + return response, metadata + def pre_update_domain_mapping( self, request: appengine.UpdateDomainMappingRequest, @@ -234,12 +328,35 @@ def post_update_domain_mapping( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_domain_mapping - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_domain_mapping_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DomainMappings server but before - it is returned to user code. + it is returned to user code. This `post_update_domain_mapping` interceptor runs + before the `post_update_domain_mapping_with_metadata` interceptor. """ return response + def post_update_domain_mapping_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_domain_mapping + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DomainMappings server but before it is returned to user code. + + We recommend only using this `post_update_domain_mapping_with_metadata` + interceptor in new development instead of the `post_update_domain_mapping` interceptor. + When both interceptors are used, this `post_update_domain_mapping_with_metadata` interceptor runs after the + `post_update_domain_mapping` interceptor. The (possibly modified) response returned by + `post_update_domain_mapping` will be passed to + `post_update_domain_mapping_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class DomainMappingsRestStub: @@ -496,6 +613,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_domain_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_domain_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -641,6 +762,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_domain_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_domain_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -785,6 +910,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_domain_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_domain_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -930,6 +1059,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_domain_mappings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_domain_mappings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1083,6 +1216,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_domain_mapping(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_domain_mapping_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/client.py index 448017e11fff..0ab29153b93d 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/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-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/transports/rest.py index c4fd9f51f6aa..a21bfa2fc4da 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/firewall/transports/rest.py @@ -139,12 +139,38 @@ def post_batch_update_ingress_rules( ) -> appengine.BatchUpdateIngressRulesResponse: """Post-rpc interceptor for batch_update_ingress_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_ingress_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewall server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_ingress_rules` interceptor runs + before the `post_batch_update_ingress_rules_with_metadata` interceptor. """ return response + def post_batch_update_ingress_rules_with_metadata( + self, + response: appengine.BatchUpdateIngressRulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + appengine.BatchUpdateIngressRulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_update_ingress_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewall server but before it is returned to user code. + + We recommend only using this `post_batch_update_ingress_rules_with_metadata` + interceptor in new development instead of the `post_batch_update_ingress_rules` interceptor. + When both interceptors are used, this `post_batch_update_ingress_rules_with_metadata` interceptor runs after the + `post_batch_update_ingress_rules` interceptor. The (possibly modified) response returned by + `post_batch_update_ingress_rules` will be passed to + `post_batch_update_ingress_rules_with_metadata`. + """ + return response, metadata + def pre_create_ingress_rule( self, request: appengine.CreateIngressRuleRequest, @@ -164,12 +190,35 @@ def post_create_ingress_rule( ) -> firewall.FirewallRule: """Post-rpc interceptor for create_ingress_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_ingress_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewall server but before - it is returned to user code. + it is returned to user code. This `post_create_ingress_rule` interceptor runs + before the `post_create_ingress_rule_with_metadata` interceptor. """ return response + def post_create_ingress_rule_with_metadata( + self, + response: firewall.FirewallRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[firewall.FirewallRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_ingress_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewall server but before it is returned to user code. + + We recommend only using this `post_create_ingress_rule_with_metadata` + interceptor in new development instead of the `post_create_ingress_rule` interceptor. + When both interceptors are used, this `post_create_ingress_rule_with_metadata` interceptor runs after the + `post_create_ingress_rule` interceptor. The (possibly modified) response returned by + `post_create_ingress_rule` will be passed to + `post_create_ingress_rule_with_metadata`. + """ + return response, metadata + def pre_delete_ingress_rule( self, request: appengine.DeleteIngressRuleRequest, @@ -203,12 +252,35 @@ def post_get_ingress_rule( ) -> firewall.FirewallRule: """Post-rpc interceptor for get_ingress_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ingress_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewall server but before - it is returned to user code. + it is returned to user code. This `post_get_ingress_rule` interceptor runs + before the `post_get_ingress_rule_with_metadata` interceptor. """ return response + def post_get_ingress_rule_with_metadata( + self, + response: firewall.FirewallRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[firewall.FirewallRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ingress_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewall server but before it is returned to user code. + + We recommend only using this `post_get_ingress_rule_with_metadata` + interceptor in new development instead of the `post_get_ingress_rule` interceptor. + When both interceptors are used, this `post_get_ingress_rule_with_metadata` interceptor runs after the + `post_get_ingress_rule` interceptor. The (possibly modified) response returned by + `post_get_ingress_rule` will be passed to + `post_get_ingress_rule_with_metadata`. + """ + return response, metadata + def pre_list_ingress_rules( self, request: appengine.ListIngressRulesRequest, @@ -228,12 +300,37 @@ def post_list_ingress_rules( ) -> appengine.ListIngressRulesResponse: """Post-rpc interceptor for list_ingress_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_ingress_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewall server but before - it is returned to user code. + it is returned to user code. This `post_list_ingress_rules` interceptor runs + before the `post_list_ingress_rules_with_metadata` interceptor. """ return response + def post_list_ingress_rules_with_metadata( + self, + response: appengine.ListIngressRulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + appengine.ListIngressRulesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_ingress_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewall server but before it is returned to user code. + + We recommend only using this `post_list_ingress_rules_with_metadata` + interceptor in new development instead of the `post_list_ingress_rules` interceptor. + When both interceptors are used, this `post_list_ingress_rules_with_metadata` interceptor runs after the + `post_list_ingress_rules` interceptor. The (possibly modified) response returned by + `post_list_ingress_rules` will be passed to + `post_list_ingress_rules_with_metadata`. + """ + return response, metadata + def pre_update_ingress_rule( self, request: appengine.UpdateIngressRuleRequest, @@ -253,12 +350,35 @@ def post_update_ingress_rule( ) -> firewall.FirewallRule: """Post-rpc interceptor for update_ingress_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_ingress_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewall server but before - it is returned to user code. + it is returned to user code. This `post_update_ingress_rule` interceptor runs + before the `post_update_ingress_rule_with_metadata` interceptor. """ return response + def post_update_ingress_rule_with_metadata( + self, + response: firewall.FirewallRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[firewall.FirewallRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_ingress_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewall server but before it is returned to user code. + + We recommend only using this `post_update_ingress_rule_with_metadata` + interceptor in new development instead of the `post_update_ingress_rule` interceptor. + When both interceptors are used, this `post_update_ingress_rule_with_metadata` interceptor runs after the + `post_update_ingress_rule` interceptor. The (possibly modified) response returned by + `post_update_ingress_rule` will be passed to + `post_update_ingress_rule_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class FirewallRestStub: @@ -484,6 +604,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_ingress_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_update_ingress_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -638,6 +762,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_ingress_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_ingress_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -896,6 +1024,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ingress_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ingress_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1040,6 +1172,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_ingress_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_ingress_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1194,6 +1330,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_ingress_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_ingress_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/client.py index 518ad67b46a3..db07539db10a 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/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-appengine-admin/google/cloud/appengine_admin_v1/services/instances/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/transports/rest.py index 5171380a9056..d6798dee3df3 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/instances/transports/rest.py @@ -124,12 +124,35 @@ def post_debug_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for debug_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_debug_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_debug_instance` interceptor runs + before the `post_debug_instance_with_metadata` interceptor. """ return response + def post_debug_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 debug_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_debug_instance_with_metadata` + interceptor in new development instead of the `post_debug_instance` interceptor. + When both interceptors are used, this `post_debug_instance_with_metadata` interceptor runs after the + `post_debug_instance` interceptor. The (possibly modified) response returned by + `post_debug_instance` will be passed to + `post_debug_instance_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: appengine.DeleteInstanceRequest, @@ -149,12 +172,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 Instances 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 Instances server but before it is returned to user code. + + We recommend only using this `post_delete_instance_with_metadata` + interceptor in new development instead of the `post_delete_instance` interceptor. + When both interceptors are used, this `post_delete_instance_with_metadata` interceptor runs after the + `post_delete_instance` interceptor. The (possibly modified) response returned by + `post_delete_instance` will be passed to + `post_delete_instance_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: appengine.GetInstanceRequest, @@ -170,12 +216,35 @@ def pre_get_instance( def post_get_instance(self, response: instance.Instance) -> instance.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 Instances 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: instance.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[instance.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 Instances server but before it is returned to user code. + + We recommend only using this `post_get_instance_with_metadata` + interceptor in new development instead of the `post_get_instance` interceptor. + When both interceptors are used, this `post_get_instance_with_metadata` interceptor runs after the + `post_get_instance` interceptor. The (possibly modified) response returned by + `post_get_instance` will be passed to + `post_get_instance_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: appengine.ListInstancesRequest, @@ -193,12 +262,37 @@ def post_list_instances( ) -> appengine.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 Instances 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: appengine.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + appengine.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 Instances 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 + @dataclasses.dataclass class InstancesRestStub: @@ -457,6 +551,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_debug_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_debug_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -602,6 +700,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 @@ -747,6 +849,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 @@ -891,6 +997,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 diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/client.py index ec46847cac94..6329e0cb666f 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -466,6 +468,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/transports/rest.py index 6912599a409d..b47917bda3b6 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/services/transports/rest.py @@ -124,12 +124,35 @@ def post_delete_service( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Services server but before - it is returned to user code. + it is returned to user code. This `post_delete_service` interceptor runs + before the `post_delete_service_with_metadata` interceptor. """ return response + def post_delete_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 delete_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Services server but before it is returned to user code. + + We recommend only using this `post_delete_service_with_metadata` + interceptor in new development instead of the `post_delete_service` interceptor. + When both interceptors are used, this `post_delete_service_with_metadata` interceptor runs after the + `post_delete_service` interceptor. The (possibly modified) response returned by + `post_delete_service` will be passed to + `post_delete_service_with_metadata`. + """ + return response, metadata + def pre_get_service( self, request: appengine.GetServiceRequest, @@ -145,12 +168,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 Services 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 Services 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: appengine.ListServicesRequest, @@ -168,12 +214,35 @@ def post_list_services( ) -> appengine.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 Services 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: appengine.ListServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[appengine.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 Services 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_update_service( self, request: appengine.UpdateServiceRequest, @@ -191,12 +260,35 @@ def post_update_service( ) -> operations_pb2.Operation: """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 Services 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: 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_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Services 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 + @dataclasses.dataclass class ServicesRestStub: @@ -447,6 +539,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -601,6 +697,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 @@ -743,6 +843,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 @@ -894,6 +998,10 @@ def __call__( json_format.Parse(response.content, 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-appengine-admin/google/cloud/appengine_admin_v1/services/versions/client.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/client.py index f94be581ee94..b1362d9aea5e 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/client.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -468,6 +470,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/transports/rest.py b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/transports/rest.py index 4c560816e40f..91d82041faa8 100644 --- a/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/transports/rest.py +++ b/packages/google-cloud-appengine-admin/google/cloud/appengine_admin_v1/services/versions/transports/rest.py @@ -132,12 +132,35 @@ def post_create_version( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Versions server but before - it is returned to user code. + it is returned to user code. This `post_create_version` interceptor runs + before the `post_create_version_with_metadata` interceptor. """ return response + def post_create_version_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_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Versions server but before it is returned to user code. + + We recommend only using this `post_create_version_with_metadata` + interceptor in new development instead of the `post_create_version` interceptor. + When both interceptors are used, this `post_create_version_with_metadata` interceptor runs after the + `post_create_version` interceptor. The (possibly modified) response returned by + `post_create_version` will be passed to + `post_create_version_with_metadata`. + """ + return response, metadata + def pre_delete_version( self, request: appengine.DeleteVersionRequest, @@ -155,12 +178,35 @@ def post_delete_version( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Versions server but before - it is returned to user code. + it is returned to user code. This `post_delete_version` interceptor runs + before the `post_delete_version_with_metadata` interceptor. """ return response + def post_delete_version_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_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Versions server but before it is returned to user code. + + We recommend only using this `post_delete_version_with_metadata` + interceptor in new development instead of the `post_delete_version` interceptor. + When both interceptors are used, this `post_delete_version_with_metadata` interceptor runs after the + `post_delete_version` interceptor. The (possibly modified) response returned by + `post_delete_version` will be passed to + `post_delete_version_with_metadata`. + """ + return response, metadata + def pre_get_version( self, request: appengine.GetVersionRequest, @@ -176,12 +222,35 @@ def pre_get_version( def post_get_version(self, response: version.Version) -> version.Version: """Post-rpc interceptor for get_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Versions server but before - it is returned to user code. + it is returned to user code. This `post_get_version` interceptor runs + before the `post_get_version_with_metadata` interceptor. """ return response + def post_get_version_with_metadata( + self, + response: version.Version, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[version.Version, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Versions server but before it is returned to user code. + + We recommend only using this `post_get_version_with_metadata` + interceptor in new development instead of the `post_get_version` interceptor. + When both interceptors are used, this `post_get_version_with_metadata` interceptor runs after the + `post_get_version` interceptor. The (possibly modified) response returned by + `post_get_version` will be passed to + `post_get_version_with_metadata`. + """ + return response, metadata + def pre_list_versions( self, request: appengine.ListVersionsRequest, @@ -199,12 +268,35 @@ def post_list_versions( ) -> appengine.ListVersionsResponse: """Post-rpc interceptor for list_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Versions server but before - it is returned to user code. + it is returned to user code. This `post_list_versions` interceptor runs + before the `post_list_versions_with_metadata` interceptor. """ return response + def post_list_versions_with_metadata( + self, + response: appengine.ListVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[appengine.ListVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Versions server but before it is returned to user code. + + We recommend only using this `post_list_versions_with_metadata` + interceptor in new development instead of the `post_list_versions` interceptor. + When both interceptors are used, this `post_list_versions_with_metadata` interceptor runs after the + `post_list_versions` interceptor. The (possibly modified) response returned by + `post_list_versions` will be passed to + `post_list_versions_with_metadata`. + """ + return response, metadata + def pre_update_version( self, request: appengine.UpdateVersionRequest, @@ -222,12 +314,35 @@ def post_update_version( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Versions server but before - it is returned to user code. + it is returned to user code. This `post_update_version` interceptor runs + before the `post_update_version_with_metadata` interceptor. """ return response + def post_update_version_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_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Versions server but before it is returned to user code. + + We recommend only using this `post_update_version_with_metadata` + interceptor in new development instead of the `post_update_version` interceptor. + When both interceptors are used, this `post_update_version_with_metadata` interceptor runs after the + `post_update_version` interceptor. The (possibly modified) response returned by + `post_update_version` will be passed to + `post_update_version_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class VersionsRestStub: @@ -484,6 +599,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -629,6 +748,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -774,6 +897,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -916,6 +1043,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1067,6 +1198,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-appengine-admin/samples/generated_samples/snippet_metadata_google.appengine.v1.json b/packages/google-cloud-appengine-admin/samples/generated_samples/snippet_metadata_google.appengine.v1.json index 91e976ba6059..a039900680d7 100644 --- a/packages/google-cloud-appengine-admin/samples/generated_samples/snippet_metadata_google.appengine.v1.json +++ b/packages/google-cloud-appengine-admin/samples/generated_samples/snippet_metadata_google.appengine.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-appengine-admin", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_applications.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_applications.py index 1525ff0d0f9f..9d770acc2966 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_applications.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_applications.py @@ -72,6 +72,13 @@ from google.cloud.appengine_admin_v1.types import appengine, application from google.cloud.appengine_admin_v1.types import operation as ga_operation +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -315,6 +322,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ApplicationsClient(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 = ApplicationsClient(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", [ @@ -2789,10 +2839,13 @@ def test_get_application_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ApplicationsRestInterceptor, "post_get_application" ) as post, mock.patch.object( + transports.ApplicationsRestInterceptor, "post_get_application_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApplicationsRestInterceptor, "pre_get_application" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetApplicationRequest.pb( appengine.GetApplicationRequest() ) @@ -2816,6 +2869,7 @@ def test_get_application_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = application.Application() + post_with_metadata.return_value = application.Application(), metadata client.get_application( request, @@ -2827,6 +2881,7 @@ def test_get_application_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_application_rest_bad_request( @@ -3001,10 +3056,13 @@ def test_create_application_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApplicationsRestInterceptor, "post_create_application" ) as post, mock.patch.object( + transports.ApplicationsRestInterceptor, "post_create_application_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApplicationsRestInterceptor, "pre_create_application" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.CreateApplicationRequest.pb( appengine.CreateApplicationRequest() ) @@ -3028,6 +3086,7 @@ def test_create_application_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_application( request, @@ -3039,6 +3098,7 @@ def test_create_application_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_application_rest_bad_request( @@ -3213,10 +3273,13 @@ def test_update_application_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApplicationsRestInterceptor, "post_update_application" ) as post, mock.patch.object( + transports.ApplicationsRestInterceptor, "post_update_application_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApplicationsRestInterceptor, "pre_update_application" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.UpdateApplicationRequest.pb( appengine.UpdateApplicationRequest() ) @@ -3240,6 +3303,7 @@ def test_update_application_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_application( request, @@ -3251,6 +3315,7 @@ def test_update_application_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_repair_application_rest_bad_request( @@ -3331,10 +3396,13 @@ def test_repair_application_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ApplicationsRestInterceptor, "post_repair_application" ) as post, mock.patch.object( + transports.ApplicationsRestInterceptor, "post_repair_application_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ApplicationsRestInterceptor, "pre_repair_application" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.RepairApplicationRequest.pb( appengine.RepairApplicationRequest() ) @@ -3358,6 +3426,7 @@ def test_repair_application_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.repair_application( request, @@ -3369,6 +3438,7 @@ def test_repair_application_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-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_certificates.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_certificates.py index 8e695cca905e..b0f78a77fa36 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_certificates.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_certificates.py @@ -62,6 +62,13 @@ ) from google.cloud.appengine_admin_v1.types import appengine, certificate +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 = AuthorizedCertificatesClient(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 = AuthorizedCertificatesClient(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", [ @@ -3418,11 +3468,15 @@ def test_list_authorized_certificates_rest_interceptors(null_interceptor): transports.AuthorizedCertificatesRestInterceptor, "post_list_authorized_certificates", ) as post, mock.patch.object( + transports.AuthorizedCertificatesRestInterceptor, + "post_list_authorized_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AuthorizedCertificatesRestInterceptor, "pre_list_authorized_certificates", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListAuthorizedCertificatesRequest.pb( appengine.ListAuthorizedCertificatesRequest() ) @@ -3448,6 +3502,10 @@ def test_list_authorized_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListAuthorizedCertificatesResponse() + post_with_metadata.return_value = ( + appengine.ListAuthorizedCertificatesResponse(), + metadata, + ) client.list_authorized_certificates( request, @@ -3459,6 +3517,7 @@ def test_list_authorized_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_authorized_certificate_rest_bad_request( @@ -3554,11 +3613,15 @@ def test_get_authorized_certificate_rest_interceptors(null_interceptor): transports.AuthorizedCertificatesRestInterceptor, "post_get_authorized_certificate", ) as post, mock.patch.object( + transports.AuthorizedCertificatesRestInterceptor, + "post_get_authorized_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AuthorizedCertificatesRestInterceptor, "pre_get_authorized_certificate", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetAuthorizedCertificateRequest.pb( appengine.GetAuthorizedCertificateRequest() ) @@ -3584,6 +3647,7 @@ def test_get_authorized_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate.AuthorizedCertificate() + post_with_metadata.return_value = certificate.AuthorizedCertificate(), metadata client.get_authorized_certificate( request, @@ -3595,6 +3659,7 @@ def test_get_authorized_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_authorized_certificate_rest_bad_request( @@ -3774,11 +3839,15 @@ def test_create_authorized_certificate_rest_interceptors(null_interceptor): transports.AuthorizedCertificatesRestInterceptor, "post_create_authorized_certificate", ) as post, mock.patch.object( + transports.AuthorizedCertificatesRestInterceptor, + "post_create_authorized_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AuthorizedCertificatesRestInterceptor, "pre_create_authorized_certificate", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.CreateAuthorizedCertificateRequest.pb( appengine.CreateAuthorizedCertificateRequest() ) @@ -3804,6 +3873,7 @@ def test_create_authorized_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate.AuthorizedCertificate() + post_with_metadata.return_value = certificate.AuthorizedCertificate(), metadata client.create_authorized_certificate( request, @@ -3815,6 +3885,7 @@ def test_create_authorized_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_authorized_certificate_rest_bad_request( @@ -3994,11 +4065,15 @@ def test_update_authorized_certificate_rest_interceptors(null_interceptor): transports.AuthorizedCertificatesRestInterceptor, "post_update_authorized_certificate", ) as post, mock.patch.object( + transports.AuthorizedCertificatesRestInterceptor, + "post_update_authorized_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AuthorizedCertificatesRestInterceptor, "pre_update_authorized_certificate", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.UpdateAuthorizedCertificateRequest.pb( appengine.UpdateAuthorizedCertificateRequest() ) @@ -4024,6 +4099,7 @@ def test_update_authorized_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate.AuthorizedCertificate() + post_with_metadata.return_value = certificate.AuthorizedCertificate(), metadata client.update_authorized_certificate( request, @@ -4035,6 +4111,7 @@ def test_update_authorized_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_authorized_certificate_rest_bad_request( diff --git a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_domains.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_domains.py index 133b383b497a..1b7cf0233f44 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_domains.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_authorized_domains.py @@ -60,6 +60,13 @@ ) from google.cloud.appengine_admin_v1.types import appengine, domain +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 @@ -327,6 +334,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 = AuthorizedDomainsClient(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 = AuthorizedDomainsClient(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", [ @@ -1927,10 +1977,14 @@ def test_list_authorized_domains_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AuthorizedDomainsRestInterceptor, "post_list_authorized_domains" ) as post, mock.patch.object( + transports.AuthorizedDomainsRestInterceptor, + "post_list_authorized_domains_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AuthorizedDomainsRestInterceptor, "pre_list_authorized_domains" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListAuthorizedDomainsRequest.pb( appengine.ListAuthorizedDomainsRequest() ) @@ -1956,6 +2010,10 @@ def test_list_authorized_domains_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListAuthorizedDomainsResponse() + post_with_metadata.return_value = ( + appengine.ListAuthorizedDomainsResponse(), + metadata, + ) client.list_authorized_domains( request, @@ -1967,6 +2025,7 @@ def test_list_authorized_domains_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-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_domain_mappings.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_domain_mappings.py index f870a31de214..e5f8ba8b3f11 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_domain_mappings.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_domain_mappings.py @@ -73,6 +73,13 @@ from google.cloud.appengine_admin_v1.types import appengine, domain_mapping from google.cloud.appengine_admin_v1.types import operation as ga_operation +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -331,6 +338,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = DomainMappingsClient(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 = DomainMappingsClient(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", [ @@ -3317,10 +3367,14 @@ def test_list_domain_mappings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DomainMappingsRestInterceptor, "post_list_domain_mappings" ) as post, mock.patch.object( + transports.DomainMappingsRestInterceptor, + "post_list_domain_mappings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DomainMappingsRestInterceptor, "pre_list_domain_mappings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListDomainMappingsRequest.pb( appengine.ListDomainMappingsRequest() ) @@ -3346,6 +3400,10 @@ def test_list_domain_mappings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListDomainMappingsResponse() + post_with_metadata.return_value = ( + appengine.ListDomainMappingsResponse(), + metadata, + ) client.list_domain_mappings( request, @@ -3357,6 +3415,7 @@ def test_list_domain_mappings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_domain_mapping_rest_bad_request( @@ -3443,10 +3502,14 @@ def test_get_domain_mapping_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DomainMappingsRestInterceptor, "post_get_domain_mapping" ) as post, mock.patch.object( + transports.DomainMappingsRestInterceptor, + "post_get_domain_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DomainMappingsRestInterceptor, "pre_get_domain_mapping" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetDomainMappingRequest.pb( appengine.GetDomainMappingRequest() ) @@ -3472,6 +3535,7 @@ def test_get_domain_mapping_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = domain_mapping.DomainMapping() + post_with_metadata.return_value = domain_mapping.DomainMapping(), metadata client.get_domain_mapping( request, @@ -3483,6 +3547,7 @@ def test_get_domain_mapping_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_domain_mapping_rest_bad_request( @@ -3642,10 +3707,14 @@ def test_create_domain_mapping_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DomainMappingsRestInterceptor, "post_create_domain_mapping" ) as post, mock.patch.object( + transports.DomainMappingsRestInterceptor, + "post_create_domain_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DomainMappingsRestInterceptor, "pre_create_domain_mapping" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.CreateDomainMappingRequest.pb( appengine.CreateDomainMappingRequest() ) @@ -3669,6 +3738,7 @@ def test_create_domain_mapping_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_domain_mapping( request, @@ -3680,6 +3750,7 @@ def test_create_domain_mapping_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_domain_mapping_rest_bad_request( @@ -3839,10 +3910,14 @@ def test_update_domain_mapping_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DomainMappingsRestInterceptor, "post_update_domain_mapping" ) as post, mock.patch.object( + transports.DomainMappingsRestInterceptor, + "post_update_domain_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DomainMappingsRestInterceptor, "pre_update_domain_mapping" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.UpdateDomainMappingRequest.pb( appengine.UpdateDomainMappingRequest() ) @@ -3866,6 +3941,7 @@ def test_update_domain_mapping_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_domain_mapping( request, @@ -3877,6 +3953,7 @@ def test_update_domain_mapping_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_domain_mapping_rest_bad_request( @@ -3957,10 +4034,14 @@ def test_delete_domain_mapping_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DomainMappingsRestInterceptor, "post_delete_domain_mapping" ) as post, mock.patch.object( + transports.DomainMappingsRestInterceptor, + "post_delete_domain_mapping_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DomainMappingsRestInterceptor, "pre_delete_domain_mapping" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.DeleteDomainMappingRequest.pb( appengine.DeleteDomainMappingRequest() ) @@ -3984,6 +4065,7 @@ def test_delete_domain_mapping_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_domain_mapping( request, @@ -3995,6 +4077,7 @@ def test_delete_domain_mapping_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-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_firewall.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_firewall.py index e2c8f934a630..0c913b40a62b 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_firewall.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_firewall.py @@ -61,6 +61,13 @@ ) from google.cloud.appengine_admin_v1.types import appengine, firewall +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 @@ -291,6 +298,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 = FirewallClient(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 = FirewallClient(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", [ @@ -3575,10 +3625,13 @@ def test_list_ingress_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallRestInterceptor, "post_list_ingress_rules" ) as post, mock.patch.object( + transports.FirewallRestInterceptor, "post_list_ingress_rules_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallRestInterceptor, "pre_list_ingress_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListIngressRulesRequest.pb( appengine.ListIngressRulesRequest() ) @@ -3604,6 +3657,7 @@ def test_list_ingress_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListIngressRulesResponse() + post_with_metadata.return_value = appengine.ListIngressRulesResponse(), metadata client.list_ingress_rules( request, @@ -3615,6 +3669,7 @@ def test_list_ingress_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_ingress_rules_rest_bad_request( @@ -3694,10 +3749,14 @@ def test_batch_update_ingress_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallRestInterceptor, "post_batch_update_ingress_rules" ) as post, mock.patch.object( + transports.FirewallRestInterceptor, + "post_batch_update_ingress_rules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.FirewallRestInterceptor, "pre_batch_update_ingress_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.BatchUpdateIngressRulesRequest.pb( appengine.BatchUpdateIngressRulesRequest() ) @@ -3723,6 +3782,10 @@ def test_batch_update_ingress_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.BatchUpdateIngressRulesResponse() + post_with_metadata.return_value = ( + appengine.BatchUpdateIngressRulesResponse(), + metadata, + ) client.batch_update_ingress_rules( request, @@ -3734,6 +3797,7 @@ def test_batch_update_ingress_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_ingress_rule_rest_bad_request( @@ -3895,10 +3959,13 @@ def test_create_ingress_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallRestInterceptor, "post_create_ingress_rule" ) as post, mock.patch.object( + transports.FirewallRestInterceptor, "post_create_ingress_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallRestInterceptor, "pre_create_ingress_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.CreateIngressRuleRequest.pb( appengine.CreateIngressRuleRequest() ) @@ -3922,6 +3989,7 @@ def test_create_ingress_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = firewall.FirewallRule() + post_with_metadata.return_value = firewall.FirewallRule(), metadata client.create_ingress_rule( request, @@ -3933,6 +4001,7 @@ def test_create_ingress_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_ingress_rule_rest_bad_request( @@ -4021,10 +4090,13 @@ def test_get_ingress_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallRestInterceptor, "post_get_ingress_rule" ) as post, mock.patch.object( + transports.FirewallRestInterceptor, "post_get_ingress_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallRestInterceptor, "pre_get_ingress_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetIngressRuleRequest.pb( appengine.GetIngressRuleRequest() ) @@ -4048,6 +4120,7 @@ def test_get_ingress_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = firewall.FirewallRule() + post_with_metadata.return_value = firewall.FirewallRule(), metadata client.get_ingress_rule( request, @@ -4059,6 +4132,7 @@ def test_get_ingress_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_ingress_rule_rest_bad_request( @@ -4220,10 +4294,13 @@ def test_update_ingress_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallRestInterceptor, "post_update_ingress_rule" ) as post, mock.patch.object( + transports.FirewallRestInterceptor, "post_update_ingress_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallRestInterceptor, "pre_update_ingress_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.UpdateIngressRuleRequest.pb( appengine.UpdateIngressRuleRequest() ) @@ -4247,6 +4324,7 @@ def test_update_ingress_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = firewall.FirewallRule() + post_with_metadata.return_value = firewall.FirewallRule(), metadata client.update_ingress_rule( request, @@ -4258,6 +4336,7 @@ def test_update_ingress_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_ingress_rule_rest_bad_request( diff --git a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_instances.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_instances.py index 152bd013e85f..8eec63285926 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_instances.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_instances.py @@ -73,6 +73,13 @@ from google.cloud.appengine_admin_v1.types import appengine, instance from google.cloud.appengine_admin_v1.types import operation as ga_operation +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 @@ -306,6 +313,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = InstancesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = InstancesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -2881,10 +2931,13 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_list_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListInstancesRequest.pb(appengine.ListInstancesRequest()) transcode.return_value = { "method": "post", @@ -2908,6 +2961,7 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListInstancesResponse() + post_with_metadata.return_value = appengine.ListInstancesResponse(), metadata client.list_instances( request, @@ -2919,6 +2973,7 @@ def test_list_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_instance_rest_bad_request(request_type=appengine.GetInstanceRequest): @@ -3033,10 +3088,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetInstanceRequest.pb(appengine.GetInstanceRequest()) transcode.return_value = { "method": "post", @@ -3058,6 +3116,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = instance.Instance() + post_with_metadata.return_value = instance.Instance(), metadata client.get_instance( request, @@ -3069,6 +3128,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_delete_instance_rest_bad_request(request_type=appengine.DeleteInstanceRequest): @@ -3149,10 +3209,13 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.InstancesRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_delete_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.DeleteInstanceRequest.pb( appengine.DeleteInstanceRequest() ) @@ -3176,6 +3239,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, @@ -3187,6 +3251,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_debug_instance_rest_bad_request(request_type=appengine.DebugInstanceRequest): @@ -3267,10 +3332,13 @@ def test_debug_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.InstancesRestInterceptor, "post_debug_instance" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_debug_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_debug_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.DebugInstanceRequest.pb(appengine.DebugInstanceRequest()) transcode.return_value = { "method": "post", @@ -3292,6 +3360,7 @@ def test_debug_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.debug_instance( request, @@ -3303,6 +3372,7 @@ def test_debug_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_services.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_services.py index 46a64bd956af..8dcdcf7fdebe 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_services.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_services.py @@ -74,6 +74,13 @@ from google.cloud.appengine_admin_v1.types import operation as ga_operation from google.cloud.appengine_admin_v1.types import service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = ServicesClient(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 = ServicesClient(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", [ @@ -2799,10 +2849,13 @@ def test_list_services_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServicesRestInterceptor, "post_list_services" ) as post, mock.patch.object( + transports.ServicesRestInterceptor, "post_list_services_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServicesRestInterceptor, "pre_list_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListServicesRequest.pb(appengine.ListServicesRequest()) transcode.return_value = { "method": "post", @@ -2826,6 +2879,7 @@ def test_list_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListServicesResponse() + post_with_metadata.return_value = appengine.ListServicesResponse(), metadata client.list_services( request, @@ -2837,6 +2891,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(request_type=appengine.GetServiceRequest): @@ -2919,10 +2974,13 @@ def test_get_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServicesRestInterceptor, "post_get_service" ) as post, mock.patch.object( + transports.ServicesRestInterceptor, "post_get_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServicesRestInterceptor, "pre_get_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetServiceRequest.pb(appengine.GetServiceRequest()) transcode.return_value = { "method": "post", @@ -2944,6 +3002,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, @@ -2955,6 +3014,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(request_type=appengine.UpdateServiceRequest): @@ -3105,10 +3165,13 @@ def test_update_service_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ServicesRestInterceptor, "post_update_service" ) as post, mock.patch.object( + transports.ServicesRestInterceptor, "post_update_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServicesRestInterceptor, "pre_update_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.UpdateServiceRequest.pb(appengine.UpdateServiceRequest()) transcode.return_value = { "method": "post", @@ -3130,6 +3193,7 @@ def test_update_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.update_service( request, @@ -3141,6 +3205,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(request_type=appengine.DeleteServiceRequest): @@ -3217,10 +3282,13 @@ def test_delete_service_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ServicesRestInterceptor, "post_delete_service" ) as post, mock.patch.object( + transports.ServicesRestInterceptor, "post_delete_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServicesRestInterceptor, "pre_delete_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.DeleteServiceRequest.pb(appengine.DeleteServiceRequest()) transcode.return_value = { "method": "post", @@ -3242,6 +3310,7 @@ def test_delete_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.delete_service( request, @@ -3253,6 +3322,7 @@ def test_delete_service_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-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_versions.py b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_versions.py index 0fa06d1169d6..6ee7a1591067 100644 --- a/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_versions.py +++ b/packages/google-cloud-appengine-admin/tests/unit/gapic/appengine_admin_v1/test_versions.py @@ -76,6 +76,13 @@ from google.cloud.appengine_admin_v1.types import operation as ga_operation from google.cloud.appengine_admin_v1.types import version +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 @@ -306,6 +313,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 = VersionsClient(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 = VersionsClient(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", [ @@ -3221,10 +3271,13 @@ def test_list_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VersionsRestInterceptor, "post_list_versions" ) as post, mock.patch.object( + transports.VersionsRestInterceptor, "post_list_versions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VersionsRestInterceptor, "pre_list_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.ListVersionsRequest.pb(appengine.ListVersionsRequest()) transcode.return_value = { "method": "post", @@ -3248,6 +3301,7 @@ def test_list_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = appengine.ListVersionsResponse() + post_with_metadata.return_value = appengine.ListVersionsResponse(), metadata client.list_versions( request, @@ -3259,6 +3313,7 @@ def test_list_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_version_rest_bad_request(request_type=appengine.GetVersionRequest): @@ -3377,10 +3432,13 @@ def test_get_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VersionsRestInterceptor, "post_get_version" ) as post, mock.patch.object( + transports.VersionsRestInterceptor, "post_get_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VersionsRestInterceptor, "pre_get_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.GetVersionRequest.pb(appengine.GetVersionRequest()) transcode.return_value = { "method": "post", @@ -3402,6 +3460,7 @@ def test_get_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = version.Version() + post_with_metadata.return_value = version.Version(), metadata client.get_version( request, @@ -3413,6 +3472,7 @@ def test_get_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_version_rest_bad_request(request_type=appengine.CreateVersionRequest): @@ -3719,10 +3779,13 @@ def test_create_version_rest_interceptors(null_interceptor): ), mock.patch.object( transports.VersionsRestInterceptor, "post_create_version" ) as post, mock.patch.object( + transports.VersionsRestInterceptor, "post_create_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VersionsRestInterceptor, "pre_create_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.CreateVersionRequest.pb(appengine.CreateVersionRequest()) transcode.return_value = { "method": "post", @@ -3744,6 +3807,7 @@ def test_create_version_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_version( request, @@ -3755,6 +3819,7 @@ def test_create_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_version_rest_bad_request(request_type=appengine.UpdateVersionRequest): @@ -4061,10 +4126,13 @@ def test_update_version_rest_interceptors(null_interceptor): ), mock.patch.object( transports.VersionsRestInterceptor, "post_update_version" ) as post, mock.patch.object( + transports.VersionsRestInterceptor, "post_update_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VersionsRestInterceptor, "pre_update_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.UpdateVersionRequest.pb(appengine.UpdateVersionRequest()) transcode.return_value = { "method": "post", @@ -4086,6 +4154,7 @@ def test_update_version_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_version( request, @@ -4097,6 +4166,7 @@ def test_update_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_version_rest_bad_request(request_type=appengine.DeleteVersionRequest): @@ -4173,10 +4243,13 @@ def test_delete_version_rest_interceptors(null_interceptor): ), mock.patch.object( transports.VersionsRestInterceptor, "post_delete_version" ) as post, mock.patch.object( + transports.VersionsRestInterceptor, "post_delete_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VersionsRestInterceptor, "pre_delete_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = appengine.DeleteVersionRequest.pb(appengine.DeleteVersionRequest()) transcode.return_value = { "method": "post", @@ -4198,6 +4271,7 @@ def test_delete_version_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_version( request, @@ -4209,6 +4283,7 @@ def test_delete_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest():