From 770cf0f31125586a8622e9639f6d24c1bafa9b31 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 21:50:33 +0500 Subject: [PATCH] chore: [Many APIs] Update gapic-generator-python to v1.22.1 (#13524) BEGIN_COMMIT_OVERRIDE chore: Update gapic-generator-python to v1.22.1 fix(deps): Require grpc-google-iam-v1>=0.14.0 END_COMMIT_OVERRIDE - [ ] Regenerate this pull request now. fix(deps): Require grpc-google-iam-v1>=0.14.0 PiperOrigin-RevId: 726142856 Source-Link: https://github.com/googleapis/googleapis/commit/25989cb753bf7d69ee446bda9d9794b61912707d Source-Link: https://github.com/googleapis/googleapis-gen/commit/677041b91cef1598cc55727d59a2804b198a5bbf Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLW5ldHdvcmstbWFuYWdlbWVudC8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLW5ldHdvcmstc2VjdXJpdHkvLk93bEJvdC55YW1sIiwiaCI6IjY3NzA0MWI5MWNlZjE1OThjYzU1NzI3ZDU5YTI4MDRiMTk4YTViYmYifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLW5ldHdvcmstc2VydmljZXMvLk93bEJvdC55YW1sIiwiaCI6IjY3NzA0MWI5MWNlZjE1OThjYzU1NzI3ZDU5YTI4MDRiMTk4YTViYmYifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLW5vdGVib29rcy8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBhcmFtZXRlcm1hbmFnZXIvLk93bEJvdC55YW1sIiwiaCI6IjY3NzA0MWI5MWNlZjE1OThjYzU1NzI3ZDU5YTI4MDRiMTk4YTViYmYifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBvbGljeS10cm91Ymxlc2hvb3Rlci8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBvbGljeXNpbXVsYXRvci8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBvbGljeXRyb3VibGVzaG9vdGVyLWlhbS8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXByaXZhdGUtY2EvLk93bEJvdC55YW1sIiwiaCI6IjY3NzA0MWI5MWNlZjE1OThjYzU1NzI3ZDU5YTI4MDRiMTk4YTViYmYifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlc291cmNlLW1hbmFnZXIvLk93bEJvdC55YW1sIiwiaCI6IjY3NzA0MWI5MWNlZjE1OThjYzU1NzI3ZDU5YTI4MDRiMTk4YTViYmYifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJ1bi8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNlY3JldC1tYW5hZ2VyLy5Pd2xCb3QueWFtbCIsImgiOiI2NzcwNDFiOTFjZWYxNTk4Y2M1NTcyN2Q1OWEyODA0YjE5OGE1YmJmIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNlY3VyZXNvdXJjZW1hbmFnZXIvLk93bEJvdC55YW1sIiwiaCI6IjY3NzA0MWI5MWNlZjE1OThjYzU1NzI3ZDU5YTI4MDRiMTk4YTViYmYifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNlY3VyaXR5Y2VudGVyLy5Pd2xCb3QueWFtbCIsImgiOiI2NzcwNDFiOTFjZWYxNTk4Y2M1NTcyN2Q1OWEyODA0YjE5OGE1YmJmIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNlY3VyaXR5Y2VudGVybWFuYWdlbWVudC8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNlcnZpY2UtZGlyZWN0b3J5Ly5Pd2xCb3QueWFtbCIsImgiOiI2NzcwNDFiOTFjZWYxNTk4Y2M1NTcyN2Q1OWEyODA0YjE5OGE1YmJmIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNlcnZpY2UtbWFuYWdlbWVudC8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRhc2tzLy5Pd2xCb3QueWFtbCIsImgiOiI2NzcwNDFiOTFjZWYxNTk4Y2M1NTcyN2Q1OWEyODA0YjE5OGE1YmJmIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRyYW5zbGF0ZS8uT3dsQm90LnlhbWwiLCJoIjoiNjc3MDQxYjkxY2VmMTU5OGNjNTU3MjdkNTlhMjgwNGIxOThhNWJiZiJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpc2lvbmFpLy5Pd2xCb3QueWFtbCIsImgiOiI2NzcwNDFiOTFjZWYxNTk4Y2M1NTcyN2Q1OWEyODA0YjE5OGE1YmJmIn0= --------- Co-authored-by: Owl Bot --- .../README.rst | 4 +- .../cloud/network_management/gapic_version.py | 2 +- .../network_management_v1/gapic_version.py | 2 +- .../noxfile.py | 81 +- ...ata_google.cloud.networkmanagement.v1.json | 2 +- .../google-cloud-network-management/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../google-cloud-network-security/README.rst | 4 +- .../cloud/network_security/gapic_version.py | 2 +- .../network_security_v1/gapic_version.py | 2 +- .../network_security_v1beta1/gapic_version.py | 2 +- .../google-cloud-network-security/noxfile.py | 81 +- ...adata_google.cloud.networksecurity.v1.json | 2 +- ..._google.cloud.networksecurity.v1beta1.json | 2 +- .../google-cloud-network-security/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../google-cloud-network-services/README.rst | 4 +- .../cloud/network_services/gapic_version.py | 2 +- .../network_services_v1/gapic_version.py | 2 +- .../google-cloud-network-services/noxfile.py | 81 +- ...adata_google.cloud.networkservices.v1.json | 2 +- .../google-cloud-network-services/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- packages/google-cloud-notebooks/README.rst | 4 +- .../google/cloud/notebooks/gapic_version.py | 2 +- .../cloud/notebooks_v1/gapic_version.py | 2 +- .../cloud/notebooks_v1beta1/gapic_version.py | 2 +- .../cloud/notebooks_v2/gapic_version.py | 2 +- packages/google-cloud-notebooks/noxfile.py | 81 +- ...et_metadata_google.cloud.notebooks.v1.json | 2 +- ...tadata_google.cloud.notebooks.v1beta1.json | 2 +- ...et_metadata_google.cloud.notebooks.v2.json | 2 +- packages/google-cloud-notebooks/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../google-cloud-parametermanager/README.rst | 4 +- .../cloud/parametermanager/gapic_version.py | 3 +- .../parametermanager_v1/gapic_version.py | 3 +- .../services/parameter_manager/client.py | 73 +- .../parameter_manager/transports/rest.py | 283 +++++- .../google-cloud-parametermanager/noxfile.py | 81 +- .../test_parameter_manager.py | 108 ++ .../README.rst | 4 +- .../policytroubleshooter/gapic_version.py | 2 +- .../policytroubleshooter_v1/gapic_version.py | 2 +- .../services/iam_checker/client.py | 29 + .../services/iam_checker/transports/rest.py | 33 +- .../noxfile.py | 81 +- ..._google.cloud.policytroubleshooter.v1.json | 2 +- .../setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../test_iam_checker.py | 59 ++ .../google-cloud-policysimulator/README.rst | 4 +- .../cloud/policysimulator/gapic_version.py | 2 +- .../cloud/policysimulator_v1/gapic_version.py | 2 +- .../services/simulator/client.py | 73 +- .../services/simulator/transports/rest.py | 95 +- .../google-cloud-policysimulator/noxfile.py | 81 +- ...adata_google.cloud.policysimulator.v1.json | 2 +- .../google-cloud-policysimulator/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../policysimulator_v1/test_simulator.py | 68 ++ .../README.rst | 4 +- .../policytroubleshooter_iam/gapic_version.py | 2 +- .../gapic_version.py | 2 +- .../services/policy_troubleshooter/client.py | 29 + .../policy_troubleshooter/transports/rest.py | 34 +- .../noxfile.py | 81 +- ...gle.cloud.policytroubleshooter.iam.v3.json | 2 +- .../setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../test_policy_troubleshooter.py | 59 ++ packages/google-cloud-private-ca/README.rst | 4 +- .../cloud/security/privateca/gapic_version.py | 2 +- .../security/privateca_v1/gapic_version.py | 2 +- .../certificate_authority_service/client.py | 183 ++-- .../transports/rest.py | 936 ++++++++++++++++-- .../privateca_v1beta1/gapic_version.py | 2 +- .../certificate_authority_service/client.py | 29 + .../transports/rest.py | 659 +++++++++++- packages/google-cloud-private-ca/noxfile.py | 81 +- ...ta_google.cloud.security.privateca.v1.json | 2 +- ...ogle.cloud.security.privateca.v1beta1.json | 2 +- packages/google-cloud-private-ca/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../test_certificate_authority_service.py | 239 +++++ .../test_certificate_authority_service.py | 185 ++++ .../google-cloud-resource-manager/README.rst | 4 +- .../cloud/resourcemanager/gapic_version.py | 2 +- .../cloud/resourcemanager_v3/gapic_version.py | 2 +- .../services/folders/client.py | 51 +- .../services/folders/transports/rest.py | 344 ++++++- .../services/organizations/client.py | 51 +- .../services/organizations/transports/rest.py | 161 ++- .../services/projects/client.py | 51 +- .../services/projects/transports/rest.py | 346 ++++++- .../services/tag_bindings/client.py | 51 +- .../services/tag_bindings/transports/rest.py | 128 ++- .../services/tag_holds/client.py | 51 +- .../services/tag_holds/transports/rest.py | 93 +- .../services/tag_keys/client.py | 51 +- .../services/tag_keys/transports/rest.py | 282 +++++- .../services/tag_values/client.py | 51 +- .../services/tag_values/transports/rest.py | 284 +++++- .../google-cloud-resource-manager/noxfile.py | 81 +- ...adata_google.cloud.resourcemanager.v3.json | 2 +- .../google-cloud-resource-manager/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../gapic/resourcemanager_v3/test_folders.py | 108 ++ .../resourcemanager_v3/test_organizations.py | 83 ++ .../gapic/resourcemanager_v3/test_projects.py | 108 ++ .../resourcemanager_v3/test_tag_bindings.py | 76 ++ .../resourcemanager_v3/test_tag_holds.py | 65 ++ .../gapic/resourcemanager_v3/test_tag_keys.py | 98 ++ .../resourcemanager_v3/test_tag_values.py | 99 ++ packages/google-cloud-run/README.rst | 4 +- .../google/cloud/run/gapic_version.py | 2 +- .../google/cloud/run_v2/gapic_version.py | 2 +- packages/google-cloud-run/noxfile.py | 81 +- .../snippet_metadata_google.cloud.run.v2.json | 2 +- packages/google-cloud-run/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../google-cloud-secret-manager/README.rst | 4 +- .../cloud/secretmanager/gapic_version.py | 2 +- .../cloud/secretmanager_v1/gapic_version.py | 2 +- .../secretmanager_v1beta1/gapic_version.py | 2 +- .../secretmanager_v1beta2/gapic_version.py | 2 +- .../google-cloud-secret-manager/noxfile.py | 81 +- ...etadata_google.cloud.secretmanager.v1.json | 2 +- ...ta_google.cloud.secretmanager.v1beta2.json | 2 +- ...metadata_google.cloud.secrets.v1beta1.json | 2 +- packages/google-cloud-secret-manager/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../README.rst | 4 +- .../securesourcemanager/gapic_version.py | 2 +- .../securesourcemanager_v1/gapic_version.py | 2 +- .../noxfile.py | 81 +- ...a_google.cloud.securesourcemanager.v1.json | 2 +- .../google-cloud-securesourcemanager/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../google-cloud-securitycenter/README.rst | 4 +- .../cloud/securitycenter/gapic_version.py | 2 +- .../cloud/securitycenter_v1/gapic_version.py | 2 +- .../securitycenter_v1beta1/gapic_version.py | 2 +- .../securitycenter_v1p1beta1/gapic_version.py | 2 +- .../cloud/securitycenter_v2/gapic_version.py | 2 +- .../google-cloud-securitycenter/noxfile.py | 81 +- ...tadata_google.cloud.securitycenter.v1.json | 2 +- ...a_google.cloud.securitycenter.v1beta1.json | 2 +- ...google.cloud.securitycenter.v1p1beta1.json | 2 +- ...tadata_google.cloud.securitycenter.v2.json | 2 +- packages/google-cloud-securitycenter/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../README.rst | 4 +- .../securitycentermanagement/gapic_version.py | 2 +- .../gapic_version.py | 2 +- .../noxfile.py | 81 +- ...gle.cloud.securitycentermanagement.v1.json | 2 +- .../setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../google-cloud-service-directory/README.rst | 4 +- .../cloud/servicedirectory/gapic_version.py | 2 +- .../servicedirectory_v1/gapic_version.py | 2 +- .../servicedirectory_v1beta1/gapic_version.py | 2 +- .../google-cloud-service-directory/noxfile.py | 81 +- ...data_google.cloud.servicedirectory.v1.json | 2 +- ...google.cloud.servicedirectory.v1beta1.json | 2 +- .../google-cloud-service-directory/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../README.rst | 4 +- .../cloud/servicemanagement/gapic_version.py | 2 +- .../servicemanagement_v1/gapic_version.py | 2 +- .../noxfile.py | 81 +- ...adata_google.api.servicemanagement.v1.json | 2 +- .../google-cloud-service-management/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- .../test_service_manager.py | 1 + packages/google-cloud-tasks/README.rst | 4 +- .../google/cloud/tasks/gapic_version.py | 2 +- .../google/cloud/tasks_v2/gapic_version.py | 2 +- .../cloud/tasks_v2beta2/gapic_version.py | 2 +- .../cloud/tasks_v2beta3/gapic_version.py | 2 +- packages/google-cloud-tasks/noxfile.py | 81 +- ...nippet_metadata_google.cloud.tasks.v2.json | 2 +- ...t_metadata_google.cloud.tasks.v2beta2.json | 2 +- ...t_metadata_google.cloud.tasks.v2beta3.json | 2 +- packages/google-cloud-tasks/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- packages/google-cloud-translate/README.rst | 4 +- .../google/cloud/translate/gapic_version.py | 2 +- .../cloud/translate_v3/gapic_version.py | 2 +- .../cloud/translate_v3beta1/gapic_version.py | 2 +- packages/google-cloud-translate/noxfile.py | 81 +- ..._metadata_google.cloud.translation.v3.json | 2 +- ...data_google.cloud.translation.v3beta1.json | 2 +- packages/google-cloud-translate/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- packages/google-cloud-visionai/README.rst | 4 +- .../google/cloud/visionai/gapic_version.py | 2 +- .../google/cloud/visionai_v1/gapic_version.py | 2 +- .../cloud/visionai_v1alpha1/gapic_version.py | 2 +- packages/google-cloud-visionai/noxfile.py | 81 +- ...pet_metadata_google.cloud.visionai.v1.json | 2 +- ...tadata_google.cloud.visionai.v1alpha1.json | 2 +- packages/google-cloud-visionai/setup.py | 2 +- .../testing/constraints-3.7.txt | 2 +- 205 files changed, 7160 insertions(+), 599 deletions(-) diff --git a/packages/google-cloud-network-management/README.rst b/packages/google-cloud-network-management/README.rst index 8210c6ca3072..afde333db9d7 100644 --- a/packages/google-cloud-network-management/README.rst +++ b/packages/google-cloud-network-management/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Network Management.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Network Management.: https://cloud.google.com/network-management -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-network-management/google/cloud/network_management/gapic_version.py b/packages/google-cloud-network-management/google/cloud/network_management/gapic_version.py index 547a38985bb7..558c8aab67c5 100644 --- a/packages/google-cloud-network-management/google/cloud/network_management/gapic_version.py +++ b/packages/google-cloud-network-management/google/cloud/network_management/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.25.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-management/google/cloud/network_management_v1/gapic_version.py b/packages/google-cloud-network-management/google/cloud/network_management_v1/gapic_version.py index 547a38985bb7..558c8aab67c5 100644 --- a/packages/google-cloud-network-management/google/cloud/network_management_v1/gapic_version.py +++ b/packages/google-cloud-network-management/google/cloud/network_management_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.25.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-management/noxfile.py b/packages/google-cloud-network-management/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-network-management/noxfile.py +++ b/packages/google-cloud-network-management/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-network-management/samples/generated_samples/snippet_metadata_google.cloud.networkmanagement.v1.json b/packages/google-cloud-network-management/samples/generated_samples/snippet_metadata_google.cloud.networkmanagement.v1.json index ac042fddbcea..7bedd05e20b0 100644 --- a/packages/google-cloud-network-management/samples/generated_samples/snippet_metadata_google.cloud.networkmanagement.v1.json +++ b/packages/google-cloud-network-management/samples/generated_samples/snippet_metadata_google.cloud.networkmanagement.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-network-management", - "version": "1.25.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-network-management/setup.py b/packages/google-cloud-network-management/setup.py index 60447edaac79..6117048e30e0 100644 --- a/packages/google-cloud-network-management/setup.py +++ b/packages/google-cloud-network-management/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-network-management" diff --git a/packages/google-cloud-network-management/testing/constraints-3.7.txt b/packages/google-cloud-network-management/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-network-management/testing/constraints-3.7.txt +++ b/packages/google-cloud-network-management/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-network-security/README.rst b/packages/google-cloud-network-security/README.rst index 9e689a9c033a..c85f1a74bde0 100644 --- a/packages/google-cloud-network-security/README.rst +++ b/packages/google-cloud-network-security/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Network Security.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Network Security.: https://cloud.google.com/traffic-director/docs/reference/network-security/rest -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-network-security/google/cloud/network_security/gapic_version.py b/packages/google-cloud-network-security/google/cloud/network_security/gapic_version.py index 956522e5b1bb..558c8aab67c5 100644 --- a/packages/google-cloud-network-security/google/cloud/network_security/gapic_version.py +++ b/packages/google-cloud-network-security/google/cloud/network_security/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.9.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-security/google/cloud/network_security_v1/gapic_version.py b/packages/google-cloud-network-security/google/cloud/network_security_v1/gapic_version.py index 956522e5b1bb..558c8aab67c5 100644 --- a/packages/google-cloud-network-security/google/cloud/network_security_v1/gapic_version.py +++ b/packages/google-cloud-network-security/google/cloud/network_security_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.9.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-security/google/cloud/network_security_v1beta1/gapic_version.py b/packages/google-cloud-network-security/google/cloud/network_security_v1beta1/gapic_version.py index 956522e5b1bb..558c8aab67c5 100644 --- a/packages/google-cloud-network-security/google/cloud/network_security_v1beta1/gapic_version.py +++ b/packages/google-cloud-network-security/google/cloud/network_security_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.9.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-security/noxfile.py b/packages/google-cloud-network-security/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-network-security/noxfile.py +++ b/packages/google-cloud-network-security/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1.json b/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1.json index 559109d0c18b..71edaea2e319 100644 --- a/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1.json +++ b/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-network-security", - "version": "0.9.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1beta1.json b/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1beta1.json index 6cc64388500a..71c9b6489c86 100644 --- a/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1beta1.json +++ b/packages/google-cloud-network-security/samples/generated_samples/snippet_metadata_google.cloud.networksecurity.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-network-security", - "version": "0.9.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-network-security/setup.py b/packages/google-cloud-network-security/setup.py index d8d37dfe5f6b..c14cf1610823 100644 --- a/packages/google-cloud-network-security/setup.py +++ b/packages/google-cloud-network-security/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-network-security" diff --git a/packages/google-cloud-network-security/testing/constraints-3.7.txt b/packages/google-cloud-network-security/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-network-security/testing/constraints-3.7.txt +++ b/packages/google-cloud-network-security/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-network-services/README.rst b/packages/google-cloud-network-services/README.rst index 925ef2bc8feb..092ac25694e4 100644 --- a/packages/google-cloud-network-services/README.rst +++ b/packages/google-cloud-network-services/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Network Services.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Network Services.: https://cloud.google.com -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-network-services/google/cloud/network_services/gapic_version.py b/packages/google-cloud-network-services/google/cloud/network_services/gapic_version.py index d26af44492c7..558c8aab67c5 100644 --- a/packages/google-cloud-network-services/google/cloud/network_services/gapic_version.py +++ b/packages/google-cloud-network-services/google/cloud/network_services/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.5.18" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-services/google/cloud/network_services_v1/gapic_version.py b/packages/google-cloud-network-services/google/cloud/network_services_v1/gapic_version.py index d26af44492c7..558c8aab67c5 100644 --- a/packages/google-cloud-network-services/google/cloud/network_services_v1/gapic_version.py +++ b/packages/google-cloud-network-services/google/cloud/network_services_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.5.18" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-network-services/noxfile.py b/packages/google-cloud-network-services/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-network-services/noxfile.py +++ b/packages/google-cloud-network-services/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-network-services/samples/generated_samples/snippet_metadata_google.cloud.networkservices.v1.json b/packages/google-cloud-network-services/samples/generated_samples/snippet_metadata_google.cloud.networkservices.v1.json index b87e870fdb16..c9caccff1bd4 100644 --- a/packages/google-cloud-network-services/samples/generated_samples/snippet_metadata_google.cloud.networkservices.v1.json +++ b/packages/google-cloud-network-services/samples/generated_samples/snippet_metadata_google.cloud.networkservices.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-network-services", - "version": "0.5.18" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-network-services/setup.py b/packages/google-cloud-network-services/setup.py index 7aa9d6a38783..6043a32744e1 100644 --- a/packages/google-cloud-network-services/setup.py +++ b/packages/google-cloud-network-services/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-network-services" diff --git a/packages/google-cloud-network-services/testing/constraints-3.7.txt b/packages/google-cloud-network-services/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-network-services/testing/constraints-3.7.txt +++ b/packages/google-cloud-network-services/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-notebooks/README.rst b/packages/google-cloud-notebooks/README.rst index 552adb66e6b3..4ffe14cef4f4 100644 --- a/packages/google-cloud-notebooks/README.rst +++ b/packages/google-cloud-notebooks/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the AI Platform Notebooks.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the AI Platform Notebooks.: https://cloud.google.com/ai-platform/notebooks/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-notebooks/google/cloud/notebooks/gapic_version.py b/packages/google-cloud-notebooks/google/cloud/notebooks/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-notebooks/google/cloud/notebooks/gapic_version.py +++ b/packages/google-cloud-notebooks/google/cloud/notebooks/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-notebooks/google/cloud/notebooks_v1/gapic_version.py b/packages/google-cloud-notebooks/google/cloud/notebooks_v1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-notebooks/google/cloud/notebooks_v1/gapic_version.py +++ b/packages/google-cloud-notebooks/google/cloud/notebooks_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-notebooks/google/cloud/notebooks_v1beta1/gapic_version.py b/packages/google-cloud-notebooks/google/cloud/notebooks_v1beta1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-notebooks/google/cloud/notebooks_v1beta1/gapic_version.py +++ b/packages/google-cloud-notebooks/google/cloud/notebooks_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.13.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-notebooks/google/cloud/notebooks_v2/gapic_version.py b/packages/google-cloud-notebooks/google/cloud/notebooks_v2/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-notebooks/google/cloud/notebooks_v2/gapic_version.py +++ b/packages/google-cloud-notebooks/google/cloud/notebooks_v2/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-notebooks/noxfile.py b/packages/google-cloud-notebooks/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-notebooks/noxfile.py +++ b/packages/google-cloud-notebooks/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1.json b/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1.json index 06443536bb5f..220b755f8ced 100644 --- a/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1.json +++ b/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-notebooks", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1beta1.json b/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1beta1.json index e52f5b8599f9..508ef241d01c 100644 --- a/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1beta1.json +++ b/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-notebooks", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v2.json b/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v2.json index d9ed1dd193b0..11d18ed44573 100644 --- a/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v2.json +++ b/packages/google-cloud-notebooks/samples/generated_samples/snippet_metadata_google.cloud.notebooks.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-notebooks", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-notebooks/setup.py b/packages/google-cloud-notebooks/setup.py index 516337184d9b..2b449b7afba5 100644 --- a/packages/google-cloud-notebooks/setup.py +++ b/packages/google-cloud-notebooks/setup.py @@ -46,7 +46,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-notebooks" diff --git a/packages/google-cloud-notebooks/testing/constraints-3.7.txt b/packages/google-cloud-notebooks/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-notebooks/testing/constraints-3.7.txt +++ b/packages/google-cloud-notebooks/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-parametermanager/README.rst b/packages/google-cloud-parametermanager/README.rst index b8240d1b09d6..70fc00ac59ea 100644 --- a/packages/google-cloud-parametermanager/README.rst +++ b/packages/google-cloud-parametermanager/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Parameter Manager API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Parameter Manager API.: https://cloud.google.com/secret-manager/parameter-manager/docs/overview -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-parametermanager/google/cloud/parametermanager/gapic_version.py b/packages/google-cloud-parametermanager/google/cloud/parametermanager/gapic_version.py index 20d1d778beb7..558c8aab67c5 100644 --- a/packages/google-cloud-parametermanager/google/cloud/parametermanager/gapic_version.py +++ b/packages/google-cloud-parametermanager/google/cloud/parametermanager/gapic_version.py @@ -13,5 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # - -__version__ = "0.1.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/gapic_version.py b/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/gapic_version.py index 20d1d778beb7..558c8aab67c5 100644 --- a/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/gapic_version.py +++ b/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/gapic_version.py @@ -13,5 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # - -__version__ = "0.1.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/client.py b/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/client.py index ab672811c4ec..0e24b01f5e28 100644 --- a/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/client.py +++ b/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -513,6 +515,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2003,16 +2032,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, @@ -2058,16 +2091,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-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/transports/rest.py b/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/transports/rest.py index 7b16bef8564b..7ae12f27e942 100644 --- a/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/transports/rest.py +++ b/packages/google-cloud-parametermanager/google/cloud/parametermanager_v1/services/parameter_manager/transports/rest.py @@ -171,12 +171,35 @@ def pre_create_parameter( def post_create_parameter(self, response: service.Parameter) -> service.Parameter: """Post-rpc interceptor for create_parameter - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_parameter_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_create_parameter` interceptor runs + before the `post_create_parameter_with_metadata` interceptor. """ return response + def post_create_parameter_with_metadata( + self, + response: service.Parameter, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Parameter, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_parameter + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_create_parameter_with_metadata` + interceptor in new development instead of the `post_create_parameter` interceptor. + When both interceptors are used, this `post_create_parameter_with_metadata` interceptor runs after the + `post_create_parameter` interceptor. The (possibly modified) response returned by + `post_create_parameter` will be passed to + `post_create_parameter_with_metadata`. + """ + return response, metadata + def pre_create_parameter_version( self, request: service.CreateParameterVersionRequest, @@ -196,12 +219,35 @@ def post_create_parameter_version( ) -> service.ParameterVersion: """Post-rpc interceptor for create_parameter_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_parameter_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_create_parameter_version` interceptor runs + before the `post_create_parameter_version_with_metadata` interceptor. """ return response + def post_create_parameter_version_with_metadata( + self, + response: service.ParameterVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ParameterVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_parameter_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_create_parameter_version_with_metadata` + interceptor in new development instead of the `post_create_parameter_version` interceptor. + When both interceptors are used, this `post_create_parameter_version_with_metadata` interceptor runs after the + `post_create_parameter_version` interceptor. The (possibly modified) response returned by + `post_create_parameter_version` will be passed to + `post_create_parameter_version_with_metadata`. + """ + return response, metadata + def pre_delete_parameter( self, request: service.DeleteParameterRequest, @@ -243,12 +289,35 @@ def pre_get_parameter( def post_get_parameter(self, response: service.Parameter) -> service.Parameter: """Post-rpc interceptor for get_parameter - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_parameter_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_parameter` interceptor runs + before the `post_get_parameter_with_metadata` interceptor. """ return response + def post_get_parameter_with_metadata( + self, + response: service.Parameter, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Parameter, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_parameter + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_get_parameter_with_metadata` + interceptor in new development instead of the `post_get_parameter` interceptor. + When both interceptors are used, this `post_get_parameter_with_metadata` interceptor runs after the + `post_get_parameter` interceptor. The (possibly modified) response returned by + `post_get_parameter` will be passed to + `post_get_parameter_with_metadata`. + """ + return response, metadata + def pre_get_parameter_version( self, request: service.GetParameterVersionRequest, @@ -268,12 +337,35 @@ def post_get_parameter_version( ) -> service.ParameterVersion: """Post-rpc interceptor for get_parameter_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_parameter_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_parameter_version` interceptor runs + before the `post_get_parameter_version_with_metadata` interceptor. """ return response + def post_get_parameter_version_with_metadata( + self, + response: service.ParameterVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ParameterVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_parameter_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_get_parameter_version_with_metadata` + interceptor in new development instead of the `post_get_parameter_version` interceptor. + When both interceptors are used, this `post_get_parameter_version_with_metadata` interceptor runs after the + `post_get_parameter_version` interceptor. The (possibly modified) response returned by + `post_get_parameter_version` will be passed to + `post_get_parameter_version_with_metadata`. + """ + return response, metadata + def pre_list_parameters( self, request: service.ListParametersRequest, @@ -291,12 +383,35 @@ def post_list_parameters( ) -> service.ListParametersResponse: """Post-rpc interceptor for list_parameters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_parameters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_list_parameters` interceptor runs + before the `post_list_parameters_with_metadata` interceptor. """ return response + def post_list_parameters_with_metadata( + self, + response: service.ListParametersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListParametersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_parameters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_list_parameters_with_metadata` + interceptor in new development instead of the `post_list_parameters` interceptor. + When both interceptors are used, this `post_list_parameters_with_metadata` interceptor runs after the + `post_list_parameters` interceptor. The (possibly modified) response returned by + `post_list_parameters` will be passed to + `post_list_parameters_with_metadata`. + """ + return response, metadata + def pre_list_parameter_versions( self, request: service.ListParameterVersionsRequest, @@ -316,12 +431,37 @@ def post_list_parameter_versions( ) -> service.ListParameterVersionsResponse: """Post-rpc interceptor for list_parameter_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_parameter_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_list_parameter_versions` interceptor runs + before the `post_list_parameter_versions_with_metadata` interceptor. """ return response + def post_list_parameter_versions_with_metadata( + self, + response: service.ListParameterVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListParameterVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_parameter_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_list_parameter_versions_with_metadata` + interceptor in new development instead of the `post_list_parameter_versions` interceptor. + When both interceptors are used, this `post_list_parameter_versions_with_metadata` interceptor runs after the + `post_list_parameter_versions` interceptor. The (possibly modified) response returned by + `post_list_parameter_versions` will be passed to + `post_list_parameter_versions_with_metadata`. + """ + return response, metadata + def pre_render_parameter_version( self, request: service.RenderParameterVersionRequest, @@ -341,12 +481,37 @@ def post_render_parameter_version( ) -> service.RenderParameterVersionResponse: """Post-rpc interceptor for render_parameter_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_render_parameter_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_render_parameter_version` interceptor runs + before the `post_render_parameter_version_with_metadata` interceptor. """ return response + def post_render_parameter_version_with_metadata( + self, + response: service.RenderParameterVersionResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.RenderParameterVersionResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for render_parameter_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_render_parameter_version_with_metadata` + interceptor in new development instead of the `post_render_parameter_version` interceptor. + When both interceptors are used, this `post_render_parameter_version_with_metadata` interceptor runs after the + `post_render_parameter_version` interceptor. The (possibly modified) response returned by + `post_render_parameter_version` will be passed to + `post_render_parameter_version_with_metadata`. + """ + return response, metadata + def pre_update_parameter( self, request: service.UpdateParameterRequest, @@ -362,12 +527,35 @@ def pre_update_parameter( def post_update_parameter(self, response: service.Parameter) -> service.Parameter: """Post-rpc interceptor for update_parameter - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_parameter_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_update_parameter` interceptor runs + before the `post_update_parameter_with_metadata` interceptor. """ return response + def post_update_parameter_with_metadata( + self, + response: service.Parameter, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Parameter, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_parameter + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_update_parameter_with_metadata` + interceptor in new development instead of the `post_update_parameter` interceptor. + When both interceptors are used, this `post_update_parameter_with_metadata` interceptor runs after the + `post_update_parameter` interceptor. The (possibly modified) response returned by + `post_update_parameter` will be passed to + `post_update_parameter_with_metadata`. + """ + return response, metadata + def pre_update_parameter_version( self, request: service.UpdateParameterVersionRequest, @@ -387,12 +575,35 @@ def post_update_parameter_version( ) -> service.ParameterVersion: """Post-rpc interceptor for update_parameter_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_parameter_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ParameterManager server but before - it is returned to user code. + it is returned to user code. This `post_update_parameter_version` interceptor runs + before the `post_update_parameter_version_with_metadata` interceptor. """ return response + def post_update_parameter_version_with_metadata( + self, + response: service.ParameterVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ParameterVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_parameter_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ParameterManager server but before it is returned to user code. + + We recommend only using this `post_update_parameter_version_with_metadata` + interceptor in new development instead of the `post_update_parameter_version` interceptor. + When both interceptors are used, this `post_update_parameter_version_with_metadata` interceptor runs after the + `post_update_parameter_version` interceptor. The (possibly modified) response returned by + `post_update_parameter_version` will be passed to + `post_update_parameter_version_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -656,6 +867,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_parameter(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_parameter_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -810,6 +1025,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_parameter_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_parameter_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1171,6 +1390,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_parameter(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_parameter_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1317,6 +1540,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_parameter_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_parameter_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1460,6 +1687,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_parameters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_parameters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1608,6 +1839,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_parameter_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_parameter_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1758,6 +1993,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_render_parameter_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_render_parameter_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1909,6 +2148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_parameter(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_parameter_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2063,6 +2306,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_parameter_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_parameter_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-parametermanager/noxfile.py b/packages/google-cloud-parametermanager/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-parametermanager/noxfile.py +++ b/packages/google-cloud-parametermanager/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-parametermanager/tests/unit/gapic/parametermanager_v1/test_parameter_manager.py b/packages/google-cloud-parametermanager/tests/unit/gapic/parametermanager_v1/test_parameter_manager.py index 77d9d19abadc..aa096467a262 100644 --- a/packages/google-cloud-parametermanager/tests/unit/gapic/parametermanager_v1/test_parameter_manager.py +++ b/packages/google-cloud-parametermanager/tests/unit/gapic/parametermanager_v1/test_parameter_manager.py @@ -64,6 +64,13 @@ ) from google.cloud.parametermanager_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 @@ -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 = ParameterManagerClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = ParameterManagerClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -8269,10 +8319,13 @@ def test_list_parameters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_list_parameters" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, "post_list_parameters_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_list_parameters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListParametersRequest.pb(service.ListParametersRequest()) transcode.return_value = { "method": "post", @@ -8296,6 +8349,7 @@ def test_list_parameters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListParametersResponse() + post_with_metadata.return_value = service.ListParametersResponse(), metadata client.list_parameters( request, @@ -8307,6 +8361,7 @@ def test_list_parameters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_parameter_rest_bad_request(request_type=service.GetParameterRequest): @@ -8391,10 +8446,13 @@ def test_get_parameter_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_get_parameter" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, "post_get_parameter_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_get_parameter" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetParameterRequest.pb(service.GetParameterRequest()) transcode.return_value = { "method": "post", @@ -8416,6 +8474,7 @@ def test_get_parameter_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Parameter() + post_with_metadata.return_value = service.Parameter(), metadata client.get_parameter( request, @@ -8427,6 +8486,7 @@ def test_get_parameter_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_parameter_rest_bad_request(request_type=service.CreateParameterRequest): @@ -8589,10 +8649,14 @@ def test_create_parameter_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_create_parameter" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_create_parameter_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_create_parameter" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateParameterRequest.pb(service.CreateParameterRequest()) transcode.return_value = { "method": "post", @@ -8614,6 +8678,7 @@ def test_create_parameter_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Parameter() + post_with_metadata.return_value = service.Parameter(), metadata client.create_parameter( request, @@ -8625,6 +8690,7 @@ def test_create_parameter_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_parameter_rest_bad_request(request_type=service.UpdateParameterRequest): @@ -8791,10 +8857,14 @@ def test_update_parameter_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_update_parameter" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_update_parameter_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_update_parameter" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateParameterRequest.pb(service.UpdateParameterRequest()) transcode.return_value = { "method": "post", @@ -8816,6 +8886,7 @@ def test_update_parameter_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Parameter() + post_with_metadata.return_value = service.Parameter(), metadata client.update_parameter( request, @@ -8827,6 +8898,7 @@ def test_update_parameter_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_parameter_rest_bad_request(request_type=service.DeleteParameterRequest): @@ -9018,10 +9090,14 @@ def test_list_parameter_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_list_parameter_versions" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_list_parameter_versions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_list_parameter_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListParameterVersionsRequest.pb( service.ListParameterVersionsRequest() ) @@ -9047,6 +9123,10 @@ def test_list_parameter_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListParameterVersionsResponse() + post_with_metadata.return_value = ( + service.ListParameterVersionsResponse(), + metadata, + ) client.list_parameter_versions( request, @@ -9058,6 +9138,7 @@ def test_list_parameter_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_parameter_version_rest_bad_request( @@ -9148,10 +9229,14 @@ def test_get_parameter_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_get_parameter_version" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_get_parameter_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_get_parameter_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetParameterVersionRequest.pb( service.GetParameterVersionRequest() ) @@ -9175,6 +9260,7 @@ def test_get_parameter_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ParameterVersion() + post_with_metadata.return_value = service.ParameterVersion(), metadata client.get_parameter_version( request, @@ -9186,6 +9272,7 @@ def test_get_parameter_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_render_parameter_version_rest_bad_request( @@ -9276,10 +9363,14 @@ def test_render_parameter_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_render_parameter_version" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_render_parameter_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_render_parameter_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RenderParameterVersionRequest.pb( service.RenderParameterVersionRequest() ) @@ -9305,6 +9396,10 @@ def test_render_parameter_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.RenderParameterVersionResponse() + post_with_metadata.return_value = ( + service.RenderParameterVersionResponse(), + metadata, + ) client.render_parameter_version( request, @@ -9316,6 +9411,7 @@ def test_render_parameter_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_parameter_version_rest_bad_request( @@ -9476,10 +9572,14 @@ def test_create_parameter_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_create_parameter_version" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_create_parameter_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_create_parameter_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateParameterVersionRequest.pb( service.CreateParameterVersionRequest() ) @@ -9503,6 +9603,7 @@ def test_create_parameter_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ParameterVersion() + post_with_metadata.return_value = service.ParameterVersion(), metadata client.create_parameter_version( request, @@ -9514,6 +9615,7 @@ def test_create_parameter_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_parameter_version_rest_bad_request( @@ -9682,10 +9784,14 @@ def test_update_parameter_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ParameterManagerRestInterceptor, "post_update_parameter_version" ) as post, mock.patch.object( + transports.ParameterManagerRestInterceptor, + "post_update_parameter_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ParameterManagerRestInterceptor, "pre_update_parameter_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateParameterVersionRequest.pb( service.UpdateParameterVersionRequest() ) @@ -9709,6 +9815,7 @@ def test_update_parameter_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ParameterVersion() + post_with_metadata.return_value = service.ParameterVersion(), metadata client.update_parameter_version( request, @@ -9720,6 +9827,7 @@ def test_update_parameter_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_parameter_version_rest_bad_request( diff --git a/packages/google-cloud-policy-troubleshooter/README.rst b/packages/google-cloud-policy-troubleshooter/README.rst index 5930501e4ad7..5766b03cf98a 100644 --- a/packages/google-cloud-policy-troubleshooter/README.rst +++ b/packages/google-cloud-policy-troubleshooter/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the IAM Policy Troubleshooter API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the IAM Policy Troubleshooter API.: https://cloud.google.com/iam/docs/troubleshooting-access#rest-api/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter/gapic_version.py b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter/gapic_version.py +++ b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter/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-policy-troubleshooter/google/cloud/policytroubleshooter_v1/gapic_version.py b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/gapic_version.py +++ b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_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-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/client.py b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/client.py index 7b4813324e3a..b3e878ff84c3 100644 --- a/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/client.py +++ b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/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-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/transports/rest.py b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/transports/rest.py index 90722d7080de..130195462595 100644 --- a/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/transports/rest.py +++ b/packages/google-cloud-policy-troubleshooter/google/cloud/policytroubleshooter_v1/services/iam_checker/transports/rest.py @@ -101,12 +101,37 @@ def post_troubleshoot_iam_policy( ) -> checker.TroubleshootIamPolicyResponse: """Post-rpc interceptor for troubleshoot_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_troubleshoot_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IamChecker server but before - it is returned to user code. + it is returned to user code. This `post_troubleshoot_iam_policy` interceptor runs + before the `post_troubleshoot_iam_policy_with_metadata` interceptor. """ return response + def post_troubleshoot_iam_policy_with_metadata( + self, + response: checker.TroubleshootIamPolicyResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + checker.TroubleshootIamPolicyResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for troubleshoot_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IamChecker server but before it is returned to user code. + + We recommend only using this `post_troubleshoot_iam_policy_with_metadata` + interceptor in new development instead of the `post_troubleshoot_iam_policy` interceptor. + When both interceptors are used, this `post_troubleshoot_iam_policy_with_metadata` interceptor runs after the + `post_troubleshoot_iam_policy` interceptor. The (possibly modified) response returned by + `post_troubleshoot_iam_policy` will be passed to + `post_troubleshoot_iam_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class IamCheckerRestStub: @@ -325,6 +350,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_troubleshoot_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_troubleshoot_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-policy-troubleshooter/noxfile.py b/packages/google-cloud-policy-troubleshooter/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-policy-troubleshooter/noxfile.py +++ b/packages/google-cloud-policy-troubleshooter/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-policy-troubleshooter/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.v1.json b/packages/google-cloud-policy-troubleshooter/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.v1.json index 71a44d1fca9d..24a7fb5b901c 100644 --- a/packages/google-cloud-policy-troubleshooter/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.v1.json +++ b/packages/google-cloud-policy-troubleshooter/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-policy-troubleshooter", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-policy-troubleshooter/setup.py b/packages/google-cloud-policy-troubleshooter/setup.py index 3ababbab8ff8..d312bc69e44f 100644 --- a/packages/google-cloud-policy-troubleshooter/setup.py +++ b/packages/google-cloud-policy-troubleshooter/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-policy-troubleshooter" diff --git a/packages/google-cloud-policy-troubleshooter/testing/constraints-3.7.txt b/packages/google-cloud-policy-troubleshooter/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-policy-troubleshooter/testing/constraints-3.7.txt +++ b/packages/google-cloud-policy-troubleshooter/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-policy-troubleshooter/tests/unit/gapic/policytroubleshooter_v1/test_iam_checker.py b/packages/google-cloud-policy-troubleshooter/tests/unit/gapic/policytroubleshooter_v1/test_iam_checker.py index de24ce06f458..83ce4a17e9bf 100644 --- a/packages/google-cloud-policy-troubleshooter/tests/unit/gapic/policytroubleshooter_v1/test_iam_checker.py +++ b/packages/google-cloud-policy-troubleshooter/tests/unit/gapic/policytroubleshooter_v1/test_iam_checker.py @@ -60,6 +60,13 @@ ) from google.cloud.policytroubleshooter_v1.types import checker, explanations +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -295,6 +302,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = IamCheckerClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = IamCheckerClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1508,10 +1558,14 @@ def test_troubleshoot_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IamCheckerRestInterceptor, "post_troubleshoot_iam_policy" ) as post, mock.patch.object( + transports.IamCheckerRestInterceptor, + "post_troubleshoot_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IamCheckerRestInterceptor, "pre_troubleshoot_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = checker.TroubleshootIamPolicyRequest.pb( checker.TroubleshootIamPolicyRequest() ) @@ -1537,6 +1591,10 @@ def test_troubleshoot_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = checker.TroubleshootIamPolicyResponse() + post_with_metadata.return_value = ( + checker.TroubleshootIamPolicyResponse(), + metadata, + ) client.troubleshoot_iam_policy( request, @@ -1548,6 +1606,7 @@ def test_troubleshoot_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-policysimulator/README.rst b/packages/google-cloud-policysimulator/README.rst index 35b8b7db54eb..9369f940f46d 100644 --- a/packages/google-cloud-policysimulator/README.rst +++ b/packages/google-cloud-policysimulator/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Policy Simulator API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Policy Simulator API.: https://cloud.google.com/policy-intelligence/docs/iam-simulator-overview -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-policysimulator/google/cloud/policysimulator/gapic_version.py b/packages/google-cloud-policysimulator/google/cloud/policysimulator/gapic_version.py index 4b834789ba9e..558c8aab67c5 100644 --- a/packages/google-cloud-policysimulator/google/cloud/policysimulator/gapic_version.py +++ b/packages/google-cloud-policysimulator/google/cloud/policysimulator/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.11" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/gapic_version.py b/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/gapic_version.py index 4b834789ba9e..558c8aab67c5 100644 --- a/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/gapic_version.py +++ b/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.11" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/client.py b/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/client.py index b0f78f897d30..b830304f041a 100644 --- a/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/client.py +++ b/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/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. @@ -1152,16 +1181,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, @@ -1207,16 +1240,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-policysimulator/google/cloud/policysimulator_v1/services/simulator/transports/rest.py b/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/transports/rest.py index a33fc9056af4..7bfd15ca2adb 100644 --- a/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/transports/rest.py +++ b/packages/google-cloud-policysimulator/google/cloud/policysimulator_v1/services/simulator/transports/rest.py @@ -116,12 +116,35 @@ def post_create_replay( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_replay - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_replay_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Simulator server but before - it is returned to user code. + it is returned to user code. This `post_create_replay` interceptor runs + before the `post_create_replay_with_metadata` interceptor. """ return response + def post_create_replay_with_metadata( + self, + response: 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_replay + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Simulator server but before it is returned to user code. + + We recommend only using this `post_create_replay_with_metadata` + interceptor in new development instead of the `post_create_replay` interceptor. + When both interceptors are used, this `post_create_replay_with_metadata` interceptor runs after the + `post_create_replay` interceptor. The (possibly modified) response returned by + `post_create_replay` will be passed to + `post_create_replay_with_metadata`. + """ + return response, metadata + def pre_get_replay( self, request: simulator.GetReplayRequest, @@ -137,12 +160,35 @@ def pre_get_replay( def post_get_replay(self, response: simulator.Replay) -> simulator.Replay: """Post-rpc interceptor for get_replay - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_replay_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Simulator server but before - it is returned to user code. + it is returned to user code. This `post_get_replay` interceptor runs + before the `post_get_replay_with_metadata` interceptor. """ return response + def post_get_replay_with_metadata( + self, + response: simulator.Replay, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[simulator.Replay, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_replay + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Simulator server but before it is returned to user code. + + We recommend only using this `post_get_replay_with_metadata` + interceptor in new development instead of the `post_get_replay` interceptor. + When both interceptors are used, this `post_get_replay_with_metadata` interceptor runs after the + `post_get_replay` interceptor. The (possibly modified) response returned by + `post_get_replay` will be passed to + `post_get_replay_with_metadata`. + """ + return response, metadata + def pre_list_replay_results( self, request: simulator.ListReplayResultsRequest, @@ -162,12 +208,37 @@ def post_list_replay_results( ) -> simulator.ListReplayResultsResponse: """Post-rpc interceptor for list_replay_results - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_replay_results_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Simulator server but before - it is returned to user code. + it is returned to user code. This `post_list_replay_results` interceptor runs + before the `post_list_replay_results_with_metadata` interceptor. """ return response + def post_list_replay_results_with_metadata( + self, + response: simulator.ListReplayResultsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + simulator.ListReplayResultsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_replay_results + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Simulator server but before it is returned to user code. + + We recommend only using this `post_list_replay_results_with_metadata` + interceptor in new development instead of the `post_list_replay_results` interceptor. + When both interceptors are used, this `post_list_replay_results_with_metadata` interceptor runs after the + `post_list_replay_results` interceptor. The (possibly modified) response returned by + `post_list_replay_results` will be passed to + `post_list_replay_results_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -511,6 +582,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_replay(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_replay_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -654,6 +729,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_replay(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_replay_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -799,6 +878,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_replay_results(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_replay_results_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-policysimulator/noxfile.py b/packages/google-cloud-policysimulator/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-policysimulator/noxfile.py +++ b/packages/google-cloud-policysimulator/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-policysimulator/samples/generated_samples/snippet_metadata_google.cloud.policysimulator.v1.json b/packages/google-cloud-policysimulator/samples/generated_samples/snippet_metadata_google.cloud.policysimulator.v1.json index 5857fb9d6888..a6025abb1eff 100644 --- a/packages/google-cloud-policysimulator/samples/generated_samples/snippet_metadata_google.cloud.policysimulator.v1.json +++ b/packages/google-cloud-policysimulator/samples/generated_samples/snippet_metadata_google.cloud.policysimulator.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-policysimulator", - "version": "0.1.11" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-policysimulator/setup.py b/packages/google-cloud-policysimulator/setup.py index 2310756692a7..41461d7cdee9 100644 --- a/packages/google-cloud-policysimulator/setup.py +++ b/packages/google-cloud-policysimulator/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-policysimulator" diff --git a/packages/google-cloud-policysimulator/testing/constraints-3.7.txt b/packages/google-cloud-policysimulator/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-policysimulator/testing/constraints-3.7.txt +++ b/packages/google-cloud-policysimulator/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-policysimulator/tests/unit/gapic/policysimulator_v1/test_simulator.py b/packages/google-cloud-policysimulator/tests/unit/gapic/policysimulator_v1/test_simulator.py index f480031f602e..6c38ef950569 100644 --- a/packages/google-cloud-policysimulator/tests/unit/gapic/policysimulator_v1/test_simulator.py +++ b/packages/google-cloud-policysimulator/tests/unit/gapic/policysimulator_v1/test_simulator.py @@ -73,6 +73,13 @@ ) from google.cloud.policysimulator_v1.types import simulator +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = 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 = SimulatorClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = SimulatorClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3209,10 +3259,13 @@ def test_get_replay_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SimulatorRestInterceptor, "post_get_replay" ) as post, mock.patch.object( + transports.SimulatorRestInterceptor, "post_get_replay_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SimulatorRestInterceptor, "pre_get_replay" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = simulator.GetReplayRequest.pb(simulator.GetReplayRequest()) transcode.return_value = { "method": "post", @@ -3234,6 +3287,7 @@ def test_get_replay_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = simulator.Replay() + post_with_metadata.return_value = simulator.Replay(), metadata client.get_replay( request, @@ -3245,6 +3299,7 @@ def test_get_replay_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_replay_rest_bad_request(request_type=simulator.CreateReplayRequest): @@ -3401,10 +3456,13 @@ def test_create_replay_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SimulatorRestInterceptor, "post_create_replay" ) as post, mock.patch.object( + transports.SimulatorRestInterceptor, "post_create_replay_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SimulatorRestInterceptor, "pre_create_replay" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = simulator.CreateReplayRequest.pb(simulator.CreateReplayRequest()) transcode.return_value = { "method": "post", @@ -3426,6 +3484,7 @@ def test_create_replay_rest_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_replay( request, @@ -3437,6 +3496,7 @@ def test_create_replay_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_replay_results_rest_bad_request( @@ -3519,10 +3579,13 @@ def test_list_replay_results_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SimulatorRestInterceptor, "post_list_replay_results" ) as post, mock.patch.object( + transports.SimulatorRestInterceptor, "post_list_replay_results_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SimulatorRestInterceptor, "pre_list_replay_results" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = simulator.ListReplayResultsRequest.pb( simulator.ListReplayResultsRequest() ) @@ -3548,6 +3611,10 @@ def test_list_replay_results_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = simulator.ListReplayResultsResponse() + post_with_metadata.return_value = ( + simulator.ListReplayResultsResponse(), + metadata, + ) client.list_replay_results( request, @@ -3559,6 +3626,7 @@ def test_list_replay_results_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-policytroubleshooter-iam/README.rst b/packages/google-cloud-policytroubleshooter-iam/README.rst index cb8030c0a888..0101d3eb3abf 100644 --- a/packages/google-cloud-policytroubleshooter-iam/README.rst +++ b/packages/google-cloud-policytroubleshooter-iam/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Policy Troubleshooter API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Policy Troubleshooter API.: https://cloud.google.com/policy-intelligence/docs/troubleshoot-access -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam/gapic_version.py b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam/gapic_version.py index 9413c3341313..558c8aab67c5 100644 --- a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam/gapic_version.py +++ b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.10" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/gapic_version.py b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/gapic_version.py index 9413c3341313..558c8aab67c5 100644 --- a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/gapic_version.py +++ b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.10" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/client.py b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/client.py index 0686abdd9876..7f7ca9470e99 100644 --- a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/client.py +++ b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/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-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/transports/rest.py b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/transports/rest.py index b86635758a38..3ed759ea84e9 100644 --- a/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/transports/rest.py +++ b/packages/google-cloud-policytroubleshooter-iam/google/cloud/policytroubleshooter_iam_v3/services/policy_troubleshooter/transports/rest.py @@ -102,12 +102,38 @@ def post_troubleshoot_iam_policy( ) -> troubleshooter.TroubleshootIamPolicyResponse: """Post-rpc interceptor for troubleshoot_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_troubleshoot_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PolicyTroubleshooter server but before - it is returned to user code. + it is returned to user code. This `post_troubleshoot_iam_policy` interceptor runs + before the `post_troubleshoot_iam_policy_with_metadata` interceptor. """ return response + def post_troubleshoot_iam_policy_with_metadata( + self, + response: troubleshooter.TroubleshootIamPolicyResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + troubleshooter.TroubleshootIamPolicyResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for troubleshoot_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PolicyTroubleshooter server but before it is returned to user code. + + We recommend only using this `post_troubleshoot_iam_policy_with_metadata` + interceptor in new development instead of the `post_troubleshoot_iam_policy` interceptor. + When both interceptors are used, this `post_troubleshoot_iam_policy_with_metadata` interceptor runs after the + `post_troubleshoot_iam_policy` interceptor. The (possibly modified) response returned by + `post_troubleshoot_iam_policy` will be passed to + `post_troubleshoot_iam_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class PolicyTroubleshooterRestStub: @@ -329,6 +355,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_troubleshoot_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_troubleshoot_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-policytroubleshooter-iam/noxfile.py b/packages/google-cloud-policytroubleshooter-iam/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-policytroubleshooter-iam/noxfile.py +++ b/packages/google-cloud-policytroubleshooter-iam/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-policytroubleshooter-iam/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.iam.v3.json b/packages/google-cloud-policytroubleshooter-iam/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.iam.v3.json index 4fd41c9fb941..3ec65c7e8d34 100644 --- a/packages/google-cloud-policytroubleshooter-iam/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.iam.v3.json +++ b/packages/google-cloud-policytroubleshooter-iam/samples/generated_samples/snippet_metadata_google.cloud.policytroubleshooter.iam.v3.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-policytroubleshooter-iam", - "version": "0.1.10" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-policytroubleshooter-iam/setup.py b/packages/google-cloud-policytroubleshooter-iam/setup.py index c6e561ca03a8..65ae4898ee85 100644 --- a/packages/google-cloud-policytroubleshooter-iam/setup.py +++ b/packages/google-cloud-policytroubleshooter-iam/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", "google-cloud-iam >= 2.12.2, <3.0.0dev", ] extras = {} diff --git a/packages/google-cloud-policytroubleshooter-iam/testing/constraints-3.7.txt b/packages/google-cloud-policytroubleshooter-iam/testing/constraints-3.7.txt index 351bc6a04ece..47b74ba1a8fa 100644 --- a/packages/google-cloud-policytroubleshooter-iam/testing/constraints-3.7.txt +++ b/packages/google-cloud-policytroubleshooter-iam/testing/constraints-3.7.txt @@ -8,5 +8,5 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 google-cloud-iam==2.12.2 diff --git a/packages/google-cloud-policytroubleshooter-iam/tests/unit/gapic/policytroubleshooter_iam_v3/test_policy_troubleshooter.py b/packages/google-cloud-policytroubleshooter-iam/tests/unit/gapic/policytroubleshooter_iam_v3/test_policy_troubleshooter.py index ba1ad796eeec..a12d94d22edd 100644 --- a/packages/google-cloud-policytroubleshooter-iam/tests/unit/gapic/policytroubleshooter_iam_v3/test_policy_troubleshooter.py +++ b/packages/google-cloud-policytroubleshooter-iam/tests/unit/gapic/policytroubleshooter_iam_v3/test_policy_troubleshooter.py @@ -60,6 +60,13 @@ ) from google.cloud.policytroubleshooter_iam_v3.types import troubleshooter +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -333,6 +340,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PolicyTroubleshooterClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = PolicyTroubleshooterClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1619,10 +1669,14 @@ def test_troubleshoot_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PolicyTroubleshooterRestInterceptor, "post_troubleshoot_iam_policy" ) as post, mock.patch.object( + transports.PolicyTroubleshooterRestInterceptor, + "post_troubleshoot_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PolicyTroubleshooterRestInterceptor, "pre_troubleshoot_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = troubleshooter.TroubleshootIamPolicyRequest.pb( troubleshooter.TroubleshootIamPolicyRequest() ) @@ -1648,6 +1702,10 @@ def test_troubleshoot_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = troubleshooter.TroubleshootIamPolicyResponse() + post_with_metadata.return_value = ( + troubleshooter.TroubleshootIamPolicyResponse(), + metadata, + ) client.troubleshoot_iam_policy( request, @@ -1659,6 +1717,7 @@ def test_troubleshoot_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-private-ca/README.rst b/packages/google-cloud-private-ca/README.rst index 897a00e3f147..cdd98746dc3b 100644 --- a/packages/google-cloud-private-ca/README.rst +++ b/packages/google-cloud-private-ca/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Private Certificate Authority.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Private Certificate Authority.: https://cloud.google.com/certificate-authority-service -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-private-ca/google/cloud/security/privateca/gapic_version.py b/packages/google-cloud-private-ca/google/cloud/security/privateca/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca/gapic_version.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/gapic_version.py b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/gapic_version.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/client.py b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/client.py index 606be23f4074..a27e9d5cec70 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/client.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_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. @@ -4623,16 +4652,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, @@ -4678,16 +4711,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, @@ -4910,16 +4947,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, @@ -5032,16 +5073,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, @@ -5092,16 +5137,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, @@ -5147,16 +5196,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, @@ -5202,16 +5255,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-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/transports/rest.py b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/transports/rest.py index c317a66afd11..dc4c76d032eb 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/transports/rest.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1/services/certificate_authority_service/transports/rest.py @@ -330,12 +330,35 @@ def post_activate_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for activate_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_activate_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_activate_certificate_authority` interceptor runs + before the `post_activate_certificate_authority_with_metadata` interceptor. """ return response + def post_activate_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for activate_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_activate_certificate_authority_with_metadata` + interceptor in new development instead of the `post_activate_certificate_authority` interceptor. + When both interceptors are used, this `post_activate_certificate_authority_with_metadata` interceptor runs after the + `post_activate_certificate_authority` interceptor. The (possibly modified) response returned by + `post_activate_certificate_authority` will be passed to + `post_activate_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_create_ca_pool( self, request: service.CreateCaPoolRequest, @@ -353,12 +376,35 @@ def post_create_ca_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_ca_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_ca_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_create_ca_pool` interceptor runs + before the `post_create_ca_pool_with_metadata` interceptor. """ return response + def post_create_ca_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_ca_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_create_ca_pool_with_metadata` + interceptor in new development instead of the `post_create_ca_pool` interceptor. + When both interceptors are used, this `post_create_ca_pool_with_metadata` interceptor runs after the + `post_create_ca_pool` interceptor. The (possibly modified) response returned by + `post_create_ca_pool` will be passed to + `post_create_ca_pool_with_metadata`. + """ + return response, metadata + def pre_create_certificate( self, request: service.CreateCertificateRequest, @@ -378,12 +424,35 @@ def post_create_certificate( ) -> resources.Certificate: """Post-rpc interceptor for create_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate` interceptor runs + before the `post_create_certificate_with_metadata` interceptor. """ return response + def post_create_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_create_certificate_with_metadata` + interceptor in new development instead of the `post_create_certificate` interceptor. + When both interceptors are used, this `post_create_certificate_with_metadata` interceptor runs after the + `post_create_certificate` interceptor. The (possibly modified) response returned by + `post_create_certificate` will be passed to + `post_create_certificate_with_metadata`. + """ + return response, metadata + def pre_create_certificate_authority( self, request: service.CreateCertificateAuthorityRequest, @@ -404,12 +473,35 @@ def post_create_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate_authority` interceptor runs + before the `post_create_certificate_authority_with_metadata` interceptor. """ return response + def post_create_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_create_certificate_authority_with_metadata` + interceptor in new development instead of the `post_create_certificate_authority` interceptor. + When both interceptors are used, this `post_create_certificate_authority_with_metadata` interceptor runs after the + `post_create_certificate_authority` interceptor. The (possibly modified) response returned by + `post_create_certificate_authority` will be passed to + `post_create_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_create_certificate_template( self, request: service.CreateCertificateTemplateRequest, @@ -430,12 +522,35 @@ def post_create_certificate_template( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate_template` interceptor runs + before the `post_create_certificate_template_with_metadata` interceptor. """ return response + def post_create_certificate_template_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_certificate_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_create_certificate_template_with_metadata` + interceptor in new development instead of the `post_create_certificate_template` interceptor. + When both interceptors are used, this `post_create_certificate_template_with_metadata` interceptor runs after the + `post_create_certificate_template` interceptor. The (possibly modified) response returned by + `post_create_certificate_template` will be passed to + `post_create_certificate_template_with_metadata`. + """ + return response, metadata + def pre_delete_ca_pool( self, request: service.DeleteCaPoolRequest, @@ -453,12 +568,35 @@ def post_delete_ca_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_ca_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_ca_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_delete_ca_pool` interceptor runs + before the `post_delete_ca_pool_with_metadata` interceptor. """ return response + def post_delete_ca_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_ca_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_delete_ca_pool_with_metadata` + interceptor in new development instead of the `post_delete_ca_pool` interceptor. + When both interceptors are used, this `post_delete_ca_pool_with_metadata` interceptor runs after the + `post_delete_ca_pool` interceptor. The (possibly modified) response returned by + `post_delete_ca_pool` will be passed to + `post_delete_ca_pool_with_metadata`. + """ + return response, metadata + def pre_delete_certificate_authority( self, request: service.DeleteCertificateAuthorityRequest, @@ -479,12 +617,35 @@ def post_delete_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_delete_certificate_authority` interceptor runs + before the `post_delete_certificate_authority_with_metadata` interceptor. """ return response + def post_delete_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_delete_certificate_authority_with_metadata` + interceptor in new development instead of the `post_delete_certificate_authority` interceptor. + When both interceptors are used, this `post_delete_certificate_authority_with_metadata` interceptor runs after the + `post_delete_certificate_authority` interceptor. The (possibly modified) response returned by + `post_delete_certificate_authority` will be passed to + `post_delete_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_delete_certificate_template( self, request: service.DeleteCertificateTemplateRequest, @@ -505,12 +666,35 @@ def post_delete_certificate_template( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_certificate_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_certificate_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_delete_certificate_template` interceptor runs + before the `post_delete_certificate_template_with_metadata` interceptor. """ return response + def post_delete_certificate_template_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_certificate_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_delete_certificate_template_with_metadata` + interceptor in new development instead of the `post_delete_certificate_template` interceptor. + When both interceptors are used, this `post_delete_certificate_template_with_metadata` interceptor runs after the + `post_delete_certificate_template` interceptor. The (possibly modified) response returned by + `post_delete_certificate_template` will be passed to + `post_delete_certificate_template_with_metadata`. + """ + return response, metadata + def pre_disable_certificate_authority( self, request: service.DisableCertificateAuthorityRequest, @@ -531,12 +715,35 @@ def post_disable_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for disable_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_disable_certificate_authority` interceptor runs + before the `post_disable_certificate_authority_with_metadata` interceptor. """ return response + def post_disable_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_disable_certificate_authority_with_metadata` + interceptor in new development instead of the `post_disable_certificate_authority` interceptor. + When both interceptors are used, this `post_disable_certificate_authority_with_metadata` interceptor runs after the + `post_disable_certificate_authority` interceptor. The (possibly modified) response returned by + `post_disable_certificate_authority` will be passed to + `post_disable_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_enable_certificate_authority( self, request: service.EnableCertificateAuthorityRequest, @@ -557,12 +764,35 @@ def post_enable_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for enable_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_enable_certificate_authority` interceptor runs + before the `post_enable_certificate_authority_with_metadata` interceptor. """ return response + def post_enable_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_enable_certificate_authority_with_metadata` + interceptor in new development instead of the `post_enable_certificate_authority` interceptor. + When both interceptors are used, this `post_enable_certificate_authority_with_metadata` interceptor runs after the + `post_enable_certificate_authority` interceptor. The (possibly modified) response returned by + `post_enable_certificate_authority` will be passed to + `post_enable_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_fetch_ca_certs( self, request: service.FetchCaCertsRequest, @@ -580,12 +810,35 @@ def post_fetch_ca_certs( ) -> service.FetchCaCertsResponse: """Post-rpc interceptor for fetch_ca_certs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_ca_certs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_fetch_ca_certs` interceptor runs + before the `post_fetch_ca_certs_with_metadata` interceptor. """ return response + def post_fetch_ca_certs_with_metadata( + self, + response: service.FetchCaCertsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.FetchCaCertsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for fetch_ca_certs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_fetch_ca_certs_with_metadata` + interceptor in new development instead of the `post_fetch_ca_certs` interceptor. + When both interceptors are used, this `post_fetch_ca_certs_with_metadata` interceptor runs after the + `post_fetch_ca_certs` interceptor. The (possibly modified) response returned by + `post_fetch_ca_certs` will be passed to + `post_fetch_ca_certs_with_metadata`. + """ + return response, metadata + def pre_fetch_certificate_authority_csr( self, request: service.FetchCertificateAuthorityCsrRequest, @@ -606,12 +859,38 @@ def post_fetch_certificate_authority_csr( ) -> service.FetchCertificateAuthorityCsrResponse: """Post-rpc interceptor for fetch_certificate_authority_csr - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_certificate_authority_csr_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_fetch_certificate_authority_csr` interceptor runs + before the `post_fetch_certificate_authority_csr_with_metadata` interceptor. """ return response + def post_fetch_certificate_authority_csr_with_metadata( + self, + response: service.FetchCertificateAuthorityCsrResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.FetchCertificateAuthorityCsrResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for fetch_certificate_authority_csr + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_fetch_certificate_authority_csr_with_metadata` + interceptor in new development instead of the `post_fetch_certificate_authority_csr` interceptor. + When both interceptors are used, this `post_fetch_certificate_authority_csr_with_metadata` interceptor runs after the + `post_fetch_certificate_authority_csr` interceptor. The (possibly modified) response returned by + `post_fetch_certificate_authority_csr` will be passed to + `post_fetch_certificate_authority_csr_with_metadata`. + """ + return response, metadata + def pre_get_ca_pool( self, request: service.GetCaPoolRequest, @@ -627,12 +906,35 @@ def pre_get_ca_pool( def post_get_ca_pool(self, response: resources.CaPool) -> resources.CaPool: """Post-rpc interceptor for get_ca_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ca_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_ca_pool` interceptor runs + before the `post_get_ca_pool_with_metadata` interceptor. """ return response + def post_get_ca_pool_with_metadata( + self, + response: resources.CaPool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CaPool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ca_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_ca_pool_with_metadata` + interceptor in new development instead of the `post_get_ca_pool` interceptor. + When both interceptors are used, this `post_get_ca_pool_with_metadata` interceptor runs after the + `post_get_ca_pool` interceptor. The (possibly modified) response returned by + `post_get_ca_pool` will be passed to + `post_get_ca_pool_with_metadata`. + """ + return response, metadata + def pre_get_certificate( self, request: service.GetCertificateRequest, @@ -650,12 +952,35 @@ def post_get_certificate( ) -> resources.Certificate: """Post-rpc interceptor for get_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate` interceptor runs + before the `post_get_certificate_with_metadata` interceptor. """ return response + def post_get_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_with_metadata` + interceptor in new development instead of the `post_get_certificate` interceptor. + When both interceptors are used, this `post_get_certificate_with_metadata` interceptor runs after the + `post_get_certificate` interceptor. The (possibly modified) response returned by + `post_get_certificate` will be passed to + `post_get_certificate_with_metadata`. + """ + return response, metadata + def pre_get_certificate_authority( self, request: service.GetCertificateAuthorityRequest, @@ -675,12 +1000,35 @@ def post_get_certificate_authority( ) -> resources.CertificateAuthority: """Post-rpc interceptor for get_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_authority` interceptor runs + before the `post_get_certificate_authority_with_metadata` interceptor. """ return response + def post_get_certificate_authority_with_metadata( + self, + response: resources.CertificateAuthority, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CertificateAuthority, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_authority_with_metadata` + interceptor in new development instead of the `post_get_certificate_authority` interceptor. + When both interceptors are used, this `post_get_certificate_authority_with_metadata` interceptor runs after the + `post_get_certificate_authority` interceptor. The (possibly modified) response returned by + `post_get_certificate_authority` will be passed to + `post_get_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_get_certificate_revocation_list( self, request: service.GetCertificateRevocationListRequest, @@ -701,12 +1049,37 @@ def post_get_certificate_revocation_list( ) -> resources.CertificateRevocationList: """Post-rpc interceptor for get_certificate_revocation_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_revocation_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_revocation_list` interceptor runs + before the `post_get_certificate_revocation_list_with_metadata` interceptor. """ return response + def post_get_certificate_revocation_list_with_metadata( + self, + response: resources.CertificateRevocationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + resources.CertificateRevocationList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_certificate_revocation_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_revocation_list_with_metadata` + interceptor in new development instead of the `post_get_certificate_revocation_list` interceptor. + When both interceptors are used, this `post_get_certificate_revocation_list_with_metadata` interceptor runs after the + `post_get_certificate_revocation_list` interceptor. The (possibly modified) response returned by + `post_get_certificate_revocation_list` will be passed to + `post_get_certificate_revocation_list_with_metadata`. + """ + return response, metadata + def pre_get_certificate_template( self, request: service.GetCertificateTemplateRequest, @@ -726,12 +1099,35 @@ def post_get_certificate_template( ) -> resources.CertificateTemplate: """Post-rpc interceptor for get_certificate_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_template` interceptor runs + before the `post_get_certificate_template_with_metadata` interceptor. """ return response + def post_get_certificate_template_with_metadata( + self, + response: resources.CertificateTemplate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CertificateTemplate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_certificate_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_template_with_metadata` + interceptor in new development instead of the `post_get_certificate_template` interceptor. + When both interceptors are used, this `post_get_certificate_template_with_metadata` interceptor runs after the + `post_get_certificate_template` interceptor. The (possibly modified) response returned by + `post_get_certificate_template` will be passed to + `post_get_certificate_template_with_metadata`. + """ + return response, metadata + def pre_list_ca_pools( self, request: service.ListCaPoolsRequest, @@ -749,12 +1145,35 @@ def post_list_ca_pools( ) -> service.ListCaPoolsResponse: """Post-rpc interceptor for list_ca_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_ca_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_ca_pools` interceptor runs + before the `post_list_ca_pools_with_metadata` interceptor. """ return response + def post_list_ca_pools_with_metadata( + self, + response: service.ListCaPoolsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListCaPoolsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_ca_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_ca_pools_with_metadata` + interceptor in new development instead of the `post_list_ca_pools` interceptor. + When both interceptors are used, this `post_list_ca_pools_with_metadata` interceptor runs after the + `post_list_ca_pools` interceptor. The (possibly modified) response returned by + `post_list_ca_pools` will be passed to + `post_list_ca_pools_with_metadata`. + """ + return response, metadata + def pre_list_certificate_authorities( self, request: service.ListCertificateAuthoritiesRequest, @@ -775,12 +1194,38 @@ def post_list_certificate_authorities( ) -> service.ListCertificateAuthoritiesResponse: """Post-rpc interceptor for list_certificate_authorities - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_authorities_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_authorities` interceptor runs + before the `post_list_certificate_authorities_with_metadata` interceptor. """ return response + def post_list_certificate_authorities_with_metadata( + self, + response: service.ListCertificateAuthoritiesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificateAuthoritiesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_authorities + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificate_authorities_with_metadata` + interceptor in new development instead of the `post_list_certificate_authorities` interceptor. + When both interceptors are used, this `post_list_certificate_authorities_with_metadata` interceptor runs after the + `post_list_certificate_authorities` interceptor. The (possibly modified) response returned by + `post_list_certificate_authorities` will be passed to + `post_list_certificate_authorities_with_metadata`. + """ + return response, metadata + def pre_list_certificate_revocation_lists( self, request: service.ListCertificateRevocationListsRequest, @@ -801,12 +1246,38 @@ def post_list_certificate_revocation_lists( ) -> service.ListCertificateRevocationListsResponse: """Post-rpc interceptor for list_certificate_revocation_lists - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_revocation_lists_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_revocation_lists` interceptor runs + before the `post_list_certificate_revocation_lists_with_metadata` interceptor. """ return response + def post_list_certificate_revocation_lists_with_metadata( + self, + response: service.ListCertificateRevocationListsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificateRevocationListsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_revocation_lists + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificate_revocation_lists_with_metadata` + interceptor in new development instead of the `post_list_certificate_revocation_lists` interceptor. + When both interceptors are used, this `post_list_certificate_revocation_lists_with_metadata` interceptor runs after the + `post_list_certificate_revocation_lists` interceptor. The (possibly modified) response returned by + `post_list_certificate_revocation_lists` will be passed to + `post_list_certificate_revocation_lists_with_metadata`. + """ + return response, metadata + def pre_list_certificates( self, request: service.ListCertificatesRequest, @@ -826,12 +1297,37 @@ def post_list_certificates( ) -> service.ListCertificatesResponse: """Post-rpc interceptor for list_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificates` interceptor runs + before the `post_list_certificates_with_metadata` interceptor. """ return response + def post_list_certificates_with_metadata( + self, + response: service.ListCertificatesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificatesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificates_with_metadata` + interceptor in new development instead of the `post_list_certificates` interceptor. + When both interceptors are used, this `post_list_certificates_with_metadata` interceptor runs after the + `post_list_certificates` interceptor. The (possibly modified) response returned by + `post_list_certificates` will be passed to + `post_list_certificates_with_metadata`. + """ + return response, metadata + def pre_list_certificate_templates( self, request: service.ListCertificateTemplatesRequest, @@ -851,12 +1347,38 @@ def post_list_certificate_templates( ) -> service.ListCertificateTemplatesResponse: """Post-rpc interceptor for list_certificate_templates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_templates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_templates` interceptor runs + before the `post_list_certificate_templates_with_metadata` interceptor. """ return response + def post_list_certificate_templates_with_metadata( + self, + response: service.ListCertificateTemplatesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificateTemplatesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_templates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificate_templates_with_metadata` + interceptor in new development instead of the `post_list_certificate_templates` interceptor. + When both interceptors are used, this `post_list_certificate_templates_with_metadata` interceptor runs after the + `post_list_certificate_templates` interceptor. The (possibly modified) response returned by + `post_list_certificate_templates` will be passed to + `post_list_certificate_templates_with_metadata`. + """ + return response, metadata + def pre_revoke_certificate( self, request: service.RevokeCertificateRequest, @@ -876,12 +1398,35 @@ def post_revoke_certificate( ) -> resources.Certificate: """Post-rpc interceptor for revoke_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_revoke_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_revoke_certificate` interceptor runs + before the `post_revoke_certificate_with_metadata` interceptor. """ return response + def post_revoke_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for revoke_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_revoke_certificate_with_metadata` + interceptor in new development instead of the `post_revoke_certificate` interceptor. + When both interceptors are used, this `post_revoke_certificate_with_metadata` interceptor runs after the + `post_revoke_certificate` interceptor. The (possibly modified) response returned by + `post_revoke_certificate` will be passed to + `post_revoke_certificate_with_metadata`. + """ + return response, metadata + def pre_undelete_certificate_authority( self, request: service.UndeleteCertificateAuthorityRequest, @@ -902,12 +1447,35 @@ def post_undelete_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_undelete_certificate_authority` interceptor runs + before the `post_undelete_certificate_authority_with_metadata` interceptor. """ return response + def post_undelete_certificate_authority_with_metadata( + self, + response: 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_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_undelete_certificate_authority_with_metadata` + interceptor in new development instead of the `post_undelete_certificate_authority` interceptor. + When both interceptors are used, this `post_undelete_certificate_authority_with_metadata` interceptor runs after the + `post_undelete_certificate_authority` interceptor. The (possibly modified) response returned by + `post_undelete_certificate_authority` will be passed to + `post_undelete_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_update_ca_pool( self, request: service.UpdateCaPoolRequest, @@ -925,12 +1493,35 @@ def post_update_ca_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_ca_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_ca_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_ca_pool` interceptor runs + before the `post_update_ca_pool_with_metadata` interceptor. """ return response + def post_update_ca_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_ca_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_ca_pool_with_metadata` + interceptor in new development instead of the `post_update_ca_pool` interceptor. + When both interceptors are used, this `post_update_ca_pool_with_metadata` interceptor runs after the + `post_update_ca_pool` interceptor. The (possibly modified) response returned by + `post_update_ca_pool` will be passed to + `post_update_ca_pool_with_metadata`. + """ + return response, metadata + def pre_update_certificate( self, request: service.UpdateCertificateRequest, @@ -950,12 +1541,35 @@ def post_update_certificate( ) -> resources.Certificate: """Post-rpc interceptor for update_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate` interceptor runs + before the `post_update_certificate_with_metadata` interceptor. """ return response + def post_update_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_with_metadata` + interceptor in new development instead of the `post_update_certificate` interceptor. + When both interceptors are used, this `post_update_certificate_with_metadata` interceptor runs after the + `post_update_certificate` interceptor. The (possibly modified) response returned by + `post_update_certificate` will be passed to + `post_update_certificate_with_metadata`. + """ + return response, metadata + def pre_update_certificate_authority( self, request: service.UpdateCertificateAuthorityRequest, @@ -976,12 +1590,35 @@ def post_update_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_authority` interceptor runs + before the `post_update_certificate_authority_with_metadata` interceptor. """ return response + def post_update_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_authority_with_metadata` + interceptor in new development instead of the `post_update_certificate_authority` interceptor. + When both interceptors are used, this `post_update_certificate_authority_with_metadata` interceptor runs after the + `post_update_certificate_authority` interceptor. The (possibly modified) response returned by + `post_update_certificate_authority` will be passed to + `post_update_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_update_certificate_revocation_list( self, request: service.UpdateCertificateRevocationListRequest, @@ -1002,12 +1639,35 @@ def post_update_certificate_revocation_list( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_revocation_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_revocation_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_revocation_list` interceptor runs + before the `post_update_certificate_revocation_list_with_metadata` interceptor. """ return response + def post_update_certificate_revocation_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 update_certificate_revocation_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_revocation_list_with_metadata` + interceptor in new development instead of the `post_update_certificate_revocation_list` interceptor. + When both interceptors are used, this `post_update_certificate_revocation_list_with_metadata` interceptor runs after the + `post_update_certificate_revocation_list` interceptor. The (possibly modified) response returned by + `post_update_certificate_revocation_list` will be passed to + `post_update_certificate_revocation_list_with_metadata`. + """ + return response, metadata + def pre_update_certificate_template( self, request: service.UpdateCertificateTemplateRequest, @@ -1028,12 +1688,35 @@ def post_update_certificate_template( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_template` interceptor runs + before the `post_update_certificate_template_with_metadata` interceptor. """ return response + def post_update_certificate_template_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_certificate_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_template_with_metadata` + interceptor in new development instead of the `post_update_certificate_template` interceptor. + When both interceptors are used, this `post_update_certificate_template_with_metadata` interceptor runs after the + `post_update_certificate_template` interceptor. The (possibly modified) response returned by + `post_update_certificate_template` will be passed to + `post_update_certificate_template_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1528,6 +2211,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_activate_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_activate_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1679,6 +2369,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_ca_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_ca_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1833,6 +2527,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1987,6 +2685,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2141,6 +2843,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2286,6 +2992,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_ca_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_ca_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2434,6 +3144,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2582,6 +3296,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_certificate_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_certificate_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2736,6 +3454,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_disable_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2890,6 +3615,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3042,6 +3771,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_ca_certs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_ca_certs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3191,6 +3924,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_certificate_authority_csr(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_fetch_certificate_authority_csr_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3346,6 +4086,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ca_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ca_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3494,6 +4238,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3646,6 +4394,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3798,6 +4550,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_revocation_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_certificate_revocation_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3949,6 +4708,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4095,6 +4858,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_ca_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_ca_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4244,6 +5011,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_authorities(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificate_authorities_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4395,6 +5166,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_revocation_lists(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_certificate_revocation_lists_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4543,6 +5321,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4694,6 +5476,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_templates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificate_templates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4850,6 +5636,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_revoke_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_revoke_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5004,6 +5794,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_undelete_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5155,6 +5952,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_ca_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_ca_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5309,6 +6110,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5463,6 +6268,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5620,6 +6429,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_revocation_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_certificate_revocation_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5774,6 +6590,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/gapic_version.py b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/gapic_version.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/client.py b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/client.py index 51f06dda205b..a3655a2d4adb 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/client.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_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 @@ -571,6 +573,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(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-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/transports/rest.py b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/transports/rest.py index 3c171c10269a..77cdeafccdf0 100644 --- a/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/transports/rest.py +++ b/packages/google-cloud-private-ca/google/cloud/security/privateca_v1beta1/services/certificate_authority_service/transports/rest.py @@ -255,12 +255,35 @@ def post_activate_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for activate_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_activate_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_activate_certificate_authority` interceptor runs + before the `post_activate_certificate_authority_with_metadata` interceptor. """ return response + def post_activate_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for activate_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_activate_certificate_authority_with_metadata` + interceptor in new development instead of the `post_activate_certificate_authority` interceptor. + When both interceptors are used, this `post_activate_certificate_authority_with_metadata` interceptor runs after the + `post_activate_certificate_authority` interceptor. The (possibly modified) response returned by + `post_activate_certificate_authority` will be passed to + `post_activate_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_create_certificate( self, request: service.CreateCertificateRequest, @@ -280,12 +303,35 @@ def post_create_certificate( ) -> resources.Certificate: """Post-rpc interceptor for create_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate` interceptor runs + before the `post_create_certificate_with_metadata` interceptor. """ return response + def post_create_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_create_certificate_with_metadata` + interceptor in new development instead of the `post_create_certificate` interceptor. + When both interceptors are used, this `post_create_certificate_with_metadata` interceptor runs after the + `post_create_certificate` interceptor. The (possibly modified) response returned by + `post_create_certificate` will be passed to + `post_create_certificate_with_metadata`. + """ + return response, metadata + def pre_create_certificate_authority( self, request: service.CreateCertificateAuthorityRequest, @@ -306,12 +352,35 @@ def post_create_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate_authority` interceptor runs + before the `post_create_certificate_authority_with_metadata` interceptor. """ return response + def post_create_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_create_certificate_authority_with_metadata` + interceptor in new development instead of the `post_create_certificate_authority` interceptor. + When both interceptors are used, this `post_create_certificate_authority_with_metadata` interceptor runs after the + `post_create_certificate_authority` interceptor. The (possibly modified) response returned by + `post_create_certificate_authority` will be passed to + `post_create_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_disable_certificate_authority( self, request: service.DisableCertificateAuthorityRequest, @@ -332,12 +401,35 @@ def post_disable_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for disable_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_disable_certificate_authority` interceptor runs + before the `post_disable_certificate_authority_with_metadata` interceptor. """ return response + def post_disable_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_disable_certificate_authority_with_metadata` + interceptor in new development instead of the `post_disable_certificate_authority` interceptor. + When both interceptors are used, this `post_disable_certificate_authority_with_metadata` interceptor runs after the + `post_disable_certificate_authority` interceptor. The (possibly modified) response returned by + `post_disable_certificate_authority` will be passed to + `post_disable_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_enable_certificate_authority( self, request: service.EnableCertificateAuthorityRequest, @@ -358,12 +450,35 @@ def post_enable_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for enable_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_enable_certificate_authority` interceptor runs + before the `post_enable_certificate_authority_with_metadata` interceptor. """ return response + def post_enable_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_enable_certificate_authority_with_metadata` + interceptor in new development instead of the `post_enable_certificate_authority` interceptor. + When both interceptors are used, this `post_enable_certificate_authority_with_metadata` interceptor runs after the + `post_enable_certificate_authority` interceptor. The (possibly modified) response returned by + `post_enable_certificate_authority` will be passed to + `post_enable_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_fetch_certificate_authority_csr( self, request: service.FetchCertificateAuthorityCsrRequest, @@ -384,12 +499,38 @@ def post_fetch_certificate_authority_csr( ) -> service.FetchCertificateAuthorityCsrResponse: """Post-rpc interceptor for fetch_certificate_authority_csr - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_certificate_authority_csr_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_fetch_certificate_authority_csr` interceptor runs + before the `post_fetch_certificate_authority_csr_with_metadata` interceptor. """ return response + def post_fetch_certificate_authority_csr_with_metadata( + self, + response: service.FetchCertificateAuthorityCsrResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.FetchCertificateAuthorityCsrResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for fetch_certificate_authority_csr + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_fetch_certificate_authority_csr_with_metadata` + interceptor in new development instead of the `post_fetch_certificate_authority_csr` interceptor. + When both interceptors are used, this `post_fetch_certificate_authority_csr_with_metadata` interceptor runs after the + `post_fetch_certificate_authority_csr` interceptor. The (possibly modified) response returned by + `post_fetch_certificate_authority_csr` will be passed to + `post_fetch_certificate_authority_csr_with_metadata`. + """ + return response, metadata + def pre_get_certificate( self, request: service.GetCertificateRequest, @@ -407,12 +548,35 @@ def post_get_certificate( ) -> resources.Certificate: """Post-rpc interceptor for get_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate` interceptor runs + before the `post_get_certificate_with_metadata` interceptor. """ return response + def post_get_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_with_metadata` + interceptor in new development instead of the `post_get_certificate` interceptor. + When both interceptors are used, this `post_get_certificate_with_metadata` interceptor runs after the + `post_get_certificate` interceptor. The (possibly modified) response returned by + `post_get_certificate` will be passed to + `post_get_certificate_with_metadata`. + """ + return response, metadata + def pre_get_certificate_authority( self, request: service.GetCertificateAuthorityRequest, @@ -432,12 +596,35 @@ def post_get_certificate_authority( ) -> resources.CertificateAuthority: """Post-rpc interceptor for get_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_authority` interceptor runs + before the `post_get_certificate_authority_with_metadata` interceptor. """ return response + def post_get_certificate_authority_with_metadata( + self, + response: resources.CertificateAuthority, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CertificateAuthority, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_authority_with_metadata` + interceptor in new development instead of the `post_get_certificate_authority` interceptor. + When both interceptors are used, this `post_get_certificate_authority_with_metadata` interceptor runs after the + `post_get_certificate_authority` interceptor. The (possibly modified) response returned by + `post_get_certificate_authority` will be passed to + `post_get_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_get_certificate_revocation_list( self, request: service.GetCertificateRevocationListRequest, @@ -458,12 +645,37 @@ def post_get_certificate_revocation_list( ) -> resources.CertificateRevocationList: """Post-rpc interceptor for get_certificate_revocation_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_revocation_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_revocation_list` interceptor runs + before the `post_get_certificate_revocation_list_with_metadata` interceptor. """ return response + def post_get_certificate_revocation_list_with_metadata( + self, + response: resources.CertificateRevocationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + resources.CertificateRevocationList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_certificate_revocation_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_certificate_revocation_list_with_metadata` + interceptor in new development instead of the `post_get_certificate_revocation_list` interceptor. + When both interceptors are used, this `post_get_certificate_revocation_list_with_metadata` interceptor runs after the + `post_get_certificate_revocation_list` interceptor. The (possibly modified) response returned by + `post_get_certificate_revocation_list` will be passed to + `post_get_certificate_revocation_list_with_metadata`. + """ + return response, metadata + def pre_get_reusable_config( self, request: service.GetReusableConfigRequest, @@ -483,12 +695,35 @@ def post_get_reusable_config( ) -> resources.ReusableConfig: """Post-rpc interceptor for get_reusable_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_reusable_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_get_reusable_config` interceptor runs + before the `post_get_reusable_config_with_metadata` interceptor. """ return response + def post_get_reusable_config_with_metadata( + self, + response: resources.ReusableConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ReusableConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_reusable_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_get_reusable_config_with_metadata` + interceptor in new development instead of the `post_get_reusable_config` interceptor. + When both interceptors are used, this `post_get_reusable_config_with_metadata` interceptor runs after the + `post_get_reusable_config` interceptor. The (possibly modified) response returned by + `post_get_reusable_config` will be passed to + `post_get_reusable_config_with_metadata`. + """ + return response, metadata + def pre_list_certificate_authorities( self, request: service.ListCertificateAuthoritiesRequest, @@ -509,12 +744,38 @@ def post_list_certificate_authorities( ) -> service.ListCertificateAuthoritiesResponse: """Post-rpc interceptor for list_certificate_authorities - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_authorities_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_authorities` interceptor runs + before the `post_list_certificate_authorities_with_metadata` interceptor. """ return response + def post_list_certificate_authorities_with_metadata( + self, + response: service.ListCertificateAuthoritiesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificateAuthoritiesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_authorities + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificate_authorities_with_metadata` + interceptor in new development instead of the `post_list_certificate_authorities` interceptor. + When both interceptors are used, this `post_list_certificate_authorities_with_metadata` interceptor runs after the + `post_list_certificate_authorities` interceptor. The (possibly modified) response returned by + `post_list_certificate_authorities` will be passed to + `post_list_certificate_authorities_with_metadata`. + """ + return response, metadata + def pre_list_certificate_revocation_lists( self, request: service.ListCertificateRevocationListsRequest, @@ -535,12 +796,38 @@ def post_list_certificate_revocation_lists( ) -> service.ListCertificateRevocationListsResponse: """Post-rpc interceptor for list_certificate_revocation_lists - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_revocation_lists_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_revocation_lists` interceptor runs + before the `post_list_certificate_revocation_lists_with_metadata` interceptor. """ return response + def post_list_certificate_revocation_lists_with_metadata( + self, + response: service.ListCertificateRevocationListsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificateRevocationListsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_revocation_lists + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificate_revocation_lists_with_metadata` + interceptor in new development instead of the `post_list_certificate_revocation_lists` interceptor. + When both interceptors are used, this `post_list_certificate_revocation_lists_with_metadata` interceptor runs after the + `post_list_certificate_revocation_lists` interceptor. The (possibly modified) response returned by + `post_list_certificate_revocation_lists` will be passed to + `post_list_certificate_revocation_lists_with_metadata`. + """ + return response, metadata + def pre_list_certificates( self, request: service.ListCertificatesRequest, @@ -560,12 +847,37 @@ def post_list_certificates( ) -> service.ListCertificatesResponse: """Post-rpc interceptor for list_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_certificates` interceptor runs + before the `post_list_certificates_with_metadata` interceptor. """ return response + def post_list_certificates_with_metadata( + self, + response: service.ListCertificatesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCertificatesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_certificates_with_metadata` + interceptor in new development instead of the `post_list_certificates` interceptor. + When both interceptors are used, this `post_list_certificates_with_metadata` interceptor runs after the + `post_list_certificates` interceptor. The (possibly modified) response returned by + `post_list_certificates` will be passed to + `post_list_certificates_with_metadata`. + """ + return response, metadata + def pre_list_reusable_configs( self, request: service.ListReusableConfigsRequest, @@ -585,12 +897,37 @@ def post_list_reusable_configs( ) -> service.ListReusableConfigsResponse: """Post-rpc interceptor for list_reusable_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_reusable_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_list_reusable_configs` interceptor runs + before the `post_list_reusable_configs_with_metadata` interceptor. """ return response + def post_list_reusable_configs_with_metadata( + self, + response: service.ListReusableConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListReusableConfigsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_reusable_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_list_reusable_configs_with_metadata` + interceptor in new development instead of the `post_list_reusable_configs` interceptor. + When both interceptors are used, this `post_list_reusable_configs_with_metadata` interceptor runs after the + `post_list_reusable_configs` interceptor. The (possibly modified) response returned by + `post_list_reusable_configs` will be passed to + `post_list_reusable_configs_with_metadata`. + """ + return response, metadata + def pre_restore_certificate_authority( self, request: service.RestoreCertificateAuthorityRequest, @@ -611,12 +948,35 @@ def post_restore_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for restore_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restore_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_restore_certificate_authority` interceptor runs + before the `post_restore_certificate_authority_with_metadata` interceptor. """ return response + def post_restore_certificate_authority_with_metadata( + self, + response: 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_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_restore_certificate_authority_with_metadata` + interceptor in new development instead of the `post_restore_certificate_authority` interceptor. + When both interceptors are used, this `post_restore_certificate_authority_with_metadata` interceptor runs after the + `post_restore_certificate_authority` interceptor. The (possibly modified) response returned by + `post_restore_certificate_authority` will be passed to + `post_restore_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_revoke_certificate( self, request: service.RevokeCertificateRequest, @@ -636,12 +996,35 @@ def post_revoke_certificate( ) -> resources.Certificate: """Post-rpc interceptor for revoke_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_revoke_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_revoke_certificate` interceptor runs + before the `post_revoke_certificate_with_metadata` interceptor. """ return response + def post_revoke_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for revoke_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_revoke_certificate_with_metadata` + interceptor in new development instead of the `post_revoke_certificate` interceptor. + When both interceptors are used, this `post_revoke_certificate_with_metadata` interceptor runs after the + `post_revoke_certificate` interceptor. The (possibly modified) response returned by + `post_revoke_certificate` will be passed to + `post_revoke_certificate_with_metadata`. + """ + return response, metadata + def pre_schedule_delete_certificate_authority( self, request: service.ScheduleDeleteCertificateAuthorityRequest, @@ -662,12 +1045,35 @@ def post_schedule_delete_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for schedule_delete_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_schedule_delete_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_schedule_delete_certificate_authority` interceptor runs + before the `post_schedule_delete_certificate_authority_with_metadata` interceptor. """ return response + def post_schedule_delete_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for schedule_delete_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_schedule_delete_certificate_authority_with_metadata` + interceptor in new development instead of the `post_schedule_delete_certificate_authority` interceptor. + When both interceptors are used, this `post_schedule_delete_certificate_authority_with_metadata` interceptor runs after the + `post_schedule_delete_certificate_authority` interceptor. The (possibly modified) response returned by + `post_schedule_delete_certificate_authority` will be passed to + `post_schedule_delete_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_update_certificate( self, request: service.UpdateCertificateRequest, @@ -687,12 +1093,35 @@ def post_update_certificate( ) -> resources.Certificate: """Post-rpc interceptor for update_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate` interceptor runs + before the `post_update_certificate_with_metadata` interceptor. """ return response + def post_update_certificate_with_metadata( + self, + response: resources.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Certificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_with_metadata` + interceptor in new development instead of the `post_update_certificate` interceptor. + When both interceptors are used, this `post_update_certificate_with_metadata` interceptor runs after the + `post_update_certificate` interceptor. The (possibly modified) response returned by + `post_update_certificate` will be passed to + `post_update_certificate_with_metadata`. + """ + return response, metadata + def pre_update_certificate_authority( self, request: service.UpdateCertificateAuthorityRequest, @@ -713,12 +1142,35 @@ def post_update_certificate_authority( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_authority - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_authority_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_authority` interceptor runs + before the `post_update_certificate_authority_with_metadata` interceptor. """ return response + def post_update_certificate_authority_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_certificate_authority + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_authority_with_metadata` + interceptor in new development instead of the `post_update_certificate_authority` interceptor. + When both interceptors are used, this `post_update_certificate_authority_with_metadata` interceptor runs after the + `post_update_certificate_authority` interceptor. The (possibly modified) response returned by + `post_update_certificate_authority` will be passed to + `post_update_certificate_authority_with_metadata`. + """ + return response, metadata + def pre_update_certificate_revocation_list( self, request: service.UpdateCertificateRevocationListRequest, @@ -739,12 +1191,35 @@ def post_update_certificate_revocation_list( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_revocation_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_revocation_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateAuthorityService server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_revocation_list` interceptor runs + before the `post_update_certificate_revocation_list_with_metadata` interceptor. """ return response + def post_update_certificate_revocation_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 update_certificate_revocation_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateAuthorityService server but before it is returned to user code. + + We recommend only using this `post_update_certificate_revocation_list_with_metadata` + interceptor in new development instead of the `post_update_certificate_revocation_list` interceptor. + When both interceptors are used, this `post_update_certificate_revocation_list_with_metadata` interceptor runs after the + `post_update_certificate_revocation_list` interceptor. The (possibly modified) response returned by + `post_update_certificate_revocation_list` will be passed to + `post_update_certificate_revocation_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CertificateAuthorityServiceRestStub: @@ -1021,6 +1496,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_activate_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_activate_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1175,6 +1657,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1329,6 +1815,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1483,6 +1973,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_disable_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1637,6 +2134,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1786,6 +2287,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_certificate_authority_csr(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_fetch_certificate_authority_csr_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1936,6 +2444,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2088,6 +2600,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2240,6 +2756,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_revocation_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_certificate_revocation_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2394,6 +2917,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_reusable_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_reusable_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2543,6 +3070,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_authorities(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificate_authorities_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2694,6 +3225,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_revocation_lists(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_certificate_revocation_lists_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2842,6 +3380,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2990,6 +3532,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_reusable_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_reusable_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3146,6 +3692,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restore_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_restore_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3300,6 +3853,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_revoke_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_revoke_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3457,6 +4014,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_schedule_delete_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_schedule_delete_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3611,6 +4175,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3765,6 +4333,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_authority(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_authority_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3922,6 +4494,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_revocation_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_certificate_revocation_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-private-ca/noxfile.py b/packages/google-cloud-private-ca/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-private-ca/noxfile.py +++ b/packages/google-cloud-private-ca/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1.json b/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1.json index aac0f3c6ce6c..ca2ab4a8547d 100644 --- a/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1.json +++ b/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-private-ca", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1beta1.json b/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1beta1.json index 96948e797a89..a2c343c16a72 100644 --- a/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1beta1.json +++ b/packages/google-cloud-private-ca/samples/generated_samples/snippet_metadata_google.cloud.security.privateca.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-private-ca", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-private-ca/setup.py b/packages/google-cloud-private-ca/setup.py index ad9c59b492ad..18bc6586b4b6 100644 --- a/packages/google-cloud-private-ca/setup.py +++ b/packages/google-cloud-private-ca/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-private-ca" diff --git a/packages/google-cloud-private-ca/testing/constraints-3.7.txt b/packages/google-cloud-private-ca/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-private-ca/testing/constraints-3.7.txt +++ b/packages/google-cloud-private-ca/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1/test_certificate_authority_service.py b/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1/test_certificate_authority_service.py index d0c66d880a29..cac20a925e81 100644 --- a/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1/test_certificate_authority_service.py +++ b/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1/test_certificate_authority_service.py @@ -79,6 +79,13 @@ ) from google.cloud.security.privateca_v1.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -362,6 +369,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CertificateAuthorityServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = CertificateAuthorityServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -20315,10 +20365,14 @@ def test_create_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_create_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_create_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_create_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCertificateRequest.pb( service.CreateCertificateRequest() ) @@ -20342,6 +20396,7 @@ def test_create_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.create_certificate( request, @@ -20353,6 +20408,7 @@ def test_create_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_rest_bad_request(request_type=service.GetCertificateRequest): @@ -20450,10 +20506,14 @@ def test_get_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateRequest.pb(service.GetCertificateRequest()) transcode.return_value = { "method": "post", @@ -20475,6 +20535,7 @@ def test_get_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.get_certificate( request, @@ -20486,6 +20547,7 @@ def test_get_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificates_rest_bad_request( @@ -20572,10 +20634,14 @@ def test_list_certificates_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificates" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificates" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificatesRequest.pb( service.ListCertificatesRequest() ) @@ -20601,6 +20667,7 @@ def test_list_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificatesResponse() + post_with_metadata.return_value = service.ListCertificatesResponse(), metadata client.list_certificates( request, @@ -20612,6 +20679,7 @@ def test_list_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_revoke_certificate_rest_bad_request( @@ -20711,10 +20779,14 @@ def test_revoke_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_revoke_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_revoke_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_revoke_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RevokeCertificateRequest.pb( service.RevokeCertificateRequest() ) @@ -20738,6 +20810,7 @@ def test_revoke_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.revoke_certificate( request, @@ -20749,6 +20822,7 @@ def test_revoke_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_rest_bad_request( @@ -21057,10 +21131,14 @@ def test_update_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateRequest.pb( service.UpdateCertificateRequest() ) @@ -21084,6 +21162,7 @@ def test_update_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.update_certificate( request, @@ -21095,6 +21174,7 @@ def test_update_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_activate_certificate_authority_rest_bad_request( @@ -21180,11 +21260,15 @@ def test_activate_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_activate_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_activate_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_activate_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ActivateCertificateAuthorityRequest.pb( service.ActivateCertificateAuthorityRequest() ) @@ -21208,6 +21292,7 @@ def test_activate_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.activate_certificate_authority( request, @@ -21219,6 +21304,7 @@ def test_activate_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_authority_rest_bad_request( @@ -21525,11 +21611,15 @@ def test_create_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_create_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_create_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_create_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCertificateAuthorityRequest.pb( service.CreateCertificateAuthorityRequest() ) @@ -21553,6 +21643,7 @@ def test_create_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_certificate_authority( request, @@ -21564,6 +21655,7 @@ def test_create_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_certificate_authority_rest_bad_request( @@ -21649,11 +21741,15 @@ def test_disable_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_disable_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_disable_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_disable_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DisableCertificateAuthorityRequest.pb( service.DisableCertificateAuthorityRequest() ) @@ -21677,6 +21773,7 @@ def test_disable_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.disable_certificate_authority( request, @@ -21688,6 +21785,7 @@ def test_disable_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_certificate_authority_rest_bad_request( @@ -21773,11 +21871,15 @@ def test_enable_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_enable_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_enable_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_enable_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.EnableCertificateAuthorityRequest.pb( service.EnableCertificateAuthorityRequest() ) @@ -21801,6 +21903,7 @@ def test_enable_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.enable_certificate_authority( request, @@ -21812,6 +21915,7 @@ def test_enable_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_certificate_authority_csr_rest_bad_request( @@ -21901,11 +22005,15 @@ def test_fetch_certificate_authority_csr_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_fetch_certificate_authority_csr", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_fetch_certificate_authority_csr_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_fetch_certificate_authority_csr", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.FetchCertificateAuthorityCsrRequest.pb( service.FetchCertificateAuthorityCsrRequest() ) @@ -21931,6 +22039,10 @@ def test_fetch_certificate_authority_csr_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.FetchCertificateAuthorityCsrResponse() + post_with_metadata.return_value = ( + service.FetchCertificateAuthorityCsrResponse(), + metadata, + ) client.fetch_certificate_authority_csr( request, @@ -21942,6 +22054,7 @@ def test_fetch_certificate_authority_csr_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_authority_rest_bad_request( @@ -22041,11 +22154,15 @@ def test_get_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateAuthorityRequest.pb( service.GetCertificateAuthorityRequest() ) @@ -22071,6 +22188,7 @@ def test_get_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CertificateAuthority() + post_with_metadata.return_value = resources.CertificateAuthority(), metadata client.get_certificate_authority( request, @@ -22082,6 +22200,7 @@ def test_get_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_authorities_rest_bad_request( @@ -22169,11 +22288,15 @@ def test_list_certificate_authorities_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificate_authorities", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificate_authorities_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificate_authorities", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificateAuthoritiesRequest.pb( service.ListCertificateAuthoritiesRequest() ) @@ -22199,6 +22322,10 @@ def test_list_certificate_authorities_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificateAuthoritiesResponse() + post_with_metadata.return_value = ( + service.ListCertificateAuthoritiesResponse(), + metadata, + ) client.list_certificate_authorities( request, @@ -22210,6 +22337,7 @@ def test_list_certificate_authorities_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_certificate_authority_rest_bad_request( @@ -22295,11 +22423,15 @@ def test_undelete_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_undelete_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_undelete_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_undelete_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UndeleteCertificateAuthorityRequest.pb( service.UndeleteCertificateAuthorityRequest() ) @@ -22323,6 +22455,7 @@ def test_undelete_certificate_authority_rest_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_certificate_authority( request, @@ -22334,6 +22467,7 @@ def test_undelete_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_certificate_authority_rest_bad_request( @@ -22419,11 +22553,15 @@ def test_delete_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_delete_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_delete_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_delete_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteCertificateAuthorityRequest.pb( service.DeleteCertificateAuthorityRequest() ) @@ -22447,6 +22585,7 @@ def test_delete_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_certificate_authority( request, @@ -22458,6 +22597,7 @@ def test_delete_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_authority_rest_bad_request( @@ -22772,11 +22912,15 @@ def test_update_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateAuthorityRequest.pb( service.UpdateCertificateAuthorityRequest() ) @@ -22800,6 +22944,7 @@ def test_update_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_certificate_authority( request, @@ -22811,6 +22956,7 @@ def test_update_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_ca_pool_rest_bad_request(request_type=service.CreateCaPoolRequest): @@ -23058,10 +23204,14 @@ def test_create_ca_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_create_ca_pool" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_create_ca_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_create_ca_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCaPoolRequest.pb(service.CreateCaPoolRequest()) transcode.return_value = { "method": "post", @@ -23083,6 +23233,7 @@ def test_create_ca_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_ca_pool( request, @@ -23094,6 +23245,7 @@ def test_create_ca_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_ca_pool_rest_bad_request(request_type=service.UpdateCaPoolRequest): @@ -23345,10 +23497,14 @@ def test_update_ca_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_update_ca_pool" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_ca_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_ca_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCaPoolRequest.pb(service.UpdateCaPoolRequest()) transcode.return_value = { "method": "post", @@ -23370,6 +23526,7 @@ def test_update_ca_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_ca_pool( request, @@ -23381,6 +23538,7 @@ def test_update_ca_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_ca_pool_rest_bad_request(request_type=service.GetCaPoolRequest): @@ -23465,10 +23623,14 @@ def test_get_ca_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_get_ca_pool" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_ca_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_ca_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCaPoolRequest.pb(service.GetCaPoolRequest()) transcode.return_value = { "method": "post", @@ -23490,6 +23652,7 @@ def test_get_ca_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CaPool() + post_with_metadata.return_value = resources.CaPool(), metadata client.get_ca_pool( request, @@ -23501,6 +23664,7 @@ def test_get_ca_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_ca_pools_rest_bad_request(request_type=service.ListCaPoolsRequest): @@ -23585,10 +23749,14 @@ def test_list_ca_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_list_ca_pools" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_ca_pools_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_ca_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCaPoolsRequest.pb(service.ListCaPoolsRequest()) transcode.return_value = { "method": "post", @@ -23612,6 +23780,7 @@ def test_list_ca_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCaPoolsResponse() + post_with_metadata.return_value = service.ListCaPoolsResponse(), metadata client.list_ca_pools( request, @@ -23623,6 +23792,7 @@ def test_list_ca_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_ca_pool_rest_bad_request(request_type=service.DeleteCaPoolRequest): @@ -23701,10 +23871,14 @@ def test_delete_ca_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_delete_ca_pool" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_delete_ca_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_delete_ca_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteCaPoolRequest.pb(service.DeleteCaPoolRequest()) transcode.return_value = { "method": "post", @@ -23726,6 +23900,7 @@ def test_delete_ca_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_ca_pool( request, @@ -23737,6 +23912,7 @@ def test_delete_ca_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_ca_certs_rest_bad_request(request_type=service.FetchCaCertsRequest): @@ -23816,10 +23992,14 @@ def test_fetch_ca_certs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_fetch_ca_certs" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_fetch_ca_certs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_fetch_ca_certs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.FetchCaCertsRequest.pb(service.FetchCaCertsRequest()) transcode.return_value = { "method": "post", @@ -23843,6 +24023,7 @@ def test_fetch_ca_certs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.FetchCaCertsResponse() + post_with_metadata.return_value = service.FetchCaCertsResponse(), metadata client.fetch_ca_certs( request, @@ -23854,6 +24035,7 @@ def test_fetch_ca_certs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_revocation_list_rest_bad_request( @@ -23953,11 +24135,15 @@ def test_get_certificate_revocation_list_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate_revocation_list", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_revocation_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate_revocation_list", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateRevocationListRequest.pb( service.GetCertificateRevocationListRequest() ) @@ -23983,6 +24169,10 @@ def test_get_certificate_revocation_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CertificateRevocationList() + post_with_metadata.return_value = ( + resources.CertificateRevocationList(), + metadata, + ) client.get_certificate_revocation_list( request, @@ -23994,6 +24184,7 @@ def test_get_certificate_revocation_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_revocation_lists_rest_bad_request( @@ -24085,11 +24276,15 @@ def test_list_certificate_revocation_lists_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificate_revocation_lists", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificate_revocation_lists_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificate_revocation_lists", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificateRevocationListsRequest.pb( service.ListCertificateRevocationListsRequest() ) @@ -24115,6 +24310,10 @@ def test_list_certificate_revocation_lists_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificateRevocationListsResponse() + post_with_metadata.return_value = ( + service.ListCertificateRevocationListsResponse(), + metadata, + ) client.list_certificate_revocation_lists( request, @@ -24126,6 +24325,7 @@ def test_list_certificate_revocation_lists_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_revocation_list_rest_bad_request( @@ -24306,11 +24506,15 @@ def test_update_certificate_revocation_list_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate_revocation_list", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_revocation_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate_revocation_list", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateRevocationListRequest.pb( service.UpdateCertificateRevocationListRequest() ) @@ -24334,6 +24538,7 @@ def test_update_certificate_revocation_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.update_certificate_revocation_list( request, @@ -24345,6 +24550,7 @@ def test_update_certificate_revocation_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_template_rest_bad_request( @@ -24578,11 +24784,15 @@ def test_create_certificate_template_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_create_certificate_template", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_create_certificate_template_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_create_certificate_template", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCertificateTemplateRequest.pb( service.CreateCertificateTemplateRequest() ) @@ -24606,6 +24816,7 @@ def test_create_certificate_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_certificate_template( request, @@ -24617,6 +24828,7 @@ def test_create_certificate_template_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_certificate_template_rest_bad_request( @@ -24702,11 +24914,15 @@ def test_delete_certificate_template_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_delete_certificate_template", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_delete_certificate_template_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_delete_certificate_template", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteCertificateTemplateRequest.pb( service.DeleteCertificateTemplateRequest() ) @@ -24730,6 +24946,7 @@ def test_delete_certificate_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_certificate_template( request, @@ -24741,6 +24958,7 @@ def test_delete_certificate_template_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_template_rest_bad_request( @@ -24832,11 +25050,15 @@ def test_get_certificate_template_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate_template", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_template_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate_template", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateTemplateRequest.pb( service.GetCertificateTemplateRequest() ) @@ -24862,6 +25084,7 @@ def test_get_certificate_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CertificateTemplate() + post_with_metadata.return_value = resources.CertificateTemplate(), metadata client.get_certificate_template( request, @@ -24873,6 +25096,7 @@ def test_get_certificate_template_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_templates_rest_bad_request( @@ -24960,11 +25184,15 @@ def test_list_certificate_templates_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificate_templates", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificate_templates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificate_templates", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificateTemplatesRequest.pb( service.ListCertificateTemplatesRequest() ) @@ -24990,6 +25218,10 @@ def test_list_certificate_templates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificateTemplatesResponse() + post_with_metadata.return_value = ( + service.ListCertificateTemplatesResponse(), + metadata, + ) client.list_certificate_templates( request, @@ -25001,6 +25233,7 @@ def test_list_certificate_templates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_template_rest_bad_request( @@ -25242,11 +25475,15 @@ def test_update_certificate_template_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate_template", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_template_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate_template", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateTemplateRequest.pb( service.UpdateCertificateTemplateRequest() ) @@ -25270,6 +25507,7 @@ def test_update_certificate_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_certificate_template( request, @@ -25281,6 +25519,7 @@ def test_update_certificate_template_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-private-ca/tests/unit/gapic/privateca_v1beta1/test_certificate_authority_service.py b/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1beta1/test_certificate_authority_service.py index 6cb3ffdafd03..f3096bdb68bb 100644 --- a/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1beta1/test_certificate_authority_service.py +++ b/packages/google-cloud-private-ca/tests/unit/gapic/privateca_v1beta1/test_certificate_authority_service.py @@ -74,6 +74,13 @@ ) from google.cloud.security.privateca_v1beta1.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -357,6 +364,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CertificateAuthorityServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = CertificateAuthorityServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -14672,10 +14722,14 @@ def test_create_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_create_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_create_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_create_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCertificateRequest.pb( service.CreateCertificateRequest() ) @@ -14699,6 +14753,7 @@ def test_create_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.create_certificate( request, @@ -14710,6 +14765,7 @@ def test_create_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_rest_bad_request(request_type=service.GetCertificateRequest): @@ -14801,10 +14857,14 @@ def test_get_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateRequest.pb(service.GetCertificateRequest()) transcode.return_value = { "method": "post", @@ -14826,6 +14886,7 @@ def test_get_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.get_certificate( request, @@ -14837,6 +14898,7 @@ def test_get_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificates_rest_bad_request( @@ -14927,10 +14989,14 @@ def test_list_certificates_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificates" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificates" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificatesRequest.pb( service.ListCertificatesRequest() ) @@ -14956,6 +15022,7 @@ def test_list_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificatesResponse() + post_with_metadata.return_value = service.ListCertificatesResponse(), metadata client.list_certificates( request, @@ -14967,6 +15034,7 @@ def test_list_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_revoke_certificate_rest_bad_request( @@ -15060,10 +15128,14 @@ def test_revoke_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_revoke_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_revoke_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_revoke_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RevokeCertificateRequest.pb( service.RevokeCertificateRequest() ) @@ -15087,6 +15159,7 @@ def test_revoke_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.revoke_certificate( request, @@ -15098,6 +15171,7 @@ def test_revoke_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_rest_bad_request( @@ -15371,10 +15445,14 @@ def test_update_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate" ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateRequest.pb( service.UpdateCertificateRequest() ) @@ -15398,6 +15476,7 @@ def test_update_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Certificate() + post_with_metadata.return_value = resources.Certificate(), metadata client.update_certificate( request, @@ -15409,6 +15488,7 @@ def test_update_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_activate_certificate_authority_rest_bad_request( @@ -15494,11 +15574,15 @@ def test_activate_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_activate_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_activate_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_activate_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ActivateCertificateAuthorityRequest.pb( service.ActivateCertificateAuthorityRequest() ) @@ -15522,6 +15606,7 @@ def test_activate_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.activate_certificate_authority( request, @@ -15533,6 +15618,7 @@ def test_activate_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_authority_rest_bad_request( @@ -15844,11 +15930,15 @@ def test_create_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_create_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_create_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_create_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCertificateAuthorityRequest.pb( service.CreateCertificateAuthorityRequest() ) @@ -15872,6 +15962,7 @@ def test_create_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_certificate_authority( request, @@ -15883,6 +15974,7 @@ def test_create_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_certificate_authority_rest_bad_request( @@ -15968,11 +16060,15 @@ def test_disable_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_disable_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_disable_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_disable_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DisableCertificateAuthorityRequest.pb( service.DisableCertificateAuthorityRequest() ) @@ -15996,6 +16092,7 @@ def test_disable_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.disable_certificate_authority( request, @@ -16007,6 +16104,7 @@ def test_disable_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_certificate_authority_rest_bad_request( @@ -16092,11 +16190,15 @@ def test_enable_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_enable_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_enable_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_enable_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.EnableCertificateAuthorityRequest.pb( service.EnableCertificateAuthorityRequest() ) @@ -16120,6 +16222,7 @@ def test_enable_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.enable_certificate_authority( request, @@ -16131,6 +16234,7 @@ def test_enable_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_certificate_authority_csr_rest_bad_request( @@ -16220,11 +16324,15 @@ def test_fetch_certificate_authority_csr_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_fetch_certificate_authority_csr", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_fetch_certificate_authority_csr_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_fetch_certificate_authority_csr", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.FetchCertificateAuthorityCsrRequest.pb( service.FetchCertificateAuthorityCsrRequest() ) @@ -16250,6 +16358,10 @@ def test_fetch_certificate_authority_csr_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.FetchCertificateAuthorityCsrResponse() + post_with_metadata.return_value = ( + service.FetchCertificateAuthorityCsrResponse(), + metadata, + ) client.fetch_certificate_authority_csr( request, @@ -16261,6 +16373,7 @@ def test_fetch_certificate_authority_csr_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_authority_rest_bad_request( @@ -16360,11 +16473,15 @@ def test_get_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateAuthorityRequest.pb( service.GetCertificateAuthorityRequest() ) @@ -16390,6 +16507,7 @@ def test_get_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CertificateAuthority() + post_with_metadata.return_value = resources.CertificateAuthority(), metadata client.get_certificate_authority( request, @@ -16401,6 +16519,7 @@ def test_get_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_authorities_rest_bad_request( @@ -16488,11 +16607,15 @@ def test_list_certificate_authorities_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificate_authorities", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificate_authorities_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificate_authorities", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificateAuthoritiesRequest.pb( service.ListCertificateAuthoritiesRequest() ) @@ -16518,6 +16641,10 @@ def test_list_certificate_authorities_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificateAuthoritiesResponse() + post_with_metadata.return_value = ( + service.ListCertificateAuthoritiesResponse(), + metadata, + ) client.list_certificate_authorities( request, @@ -16529,6 +16656,7 @@ def test_list_certificate_authorities_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restore_certificate_authority_rest_bad_request( @@ -16614,11 +16742,15 @@ def test_restore_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_restore_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_restore_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_restore_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestoreCertificateAuthorityRequest.pb( service.RestoreCertificateAuthorityRequest() ) @@ -16642,6 +16774,7 @@ def test_restore_certificate_authority_rest_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_certificate_authority( request, @@ -16653,6 +16786,7 @@ def test_restore_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_schedule_delete_certificate_authority_rest_bad_request( @@ -16738,11 +16872,15 @@ def test_schedule_delete_certificate_authority_rest_interceptors(null_intercepto transports.CertificateAuthorityServiceRestInterceptor, "post_schedule_delete_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_schedule_delete_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_schedule_delete_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ScheduleDeleteCertificateAuthorityRequest.pb( service.ScheduleDeleteCertificateAuthorityRequest() ) @@ -16766,6 +16904,7 @@ def test_schedule_delete_certificate_authority_rest_interceptors(null_intercepto ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.schedule_delete_certificate_authority( request, @@ -16777,6 +16916,7 @@ def test_schedule_delete_certificate_authority_rest_interceptors(null_intercepto pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_authority_rest_bad_request( @@ -17096,11 +17236,15 @@ def test_update_certificate_authority_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate_authority", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_authority_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate_authority", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateAuthorityRequest.pb( service.UpdateCertificateAuthorityRequest() ) @@ -17124,6 +17268,7 @@ def test_update_certificate_authority_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_certificate_authority( request, @@ -17135,6 +17280,7 @@ def test_update_certificate_authority_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_revocation_list_rest_bad_request( @@ -17232,11 +17378,15 @@ def test_get_certificate_revocation_list_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_get_certificate_revocation_list", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_certificate_revocation_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_certificate_revocation_list", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCertificateRevocationListRequest.pb( service.GetCertificateRevocationListRequest() ) @@ -17262,6 +17412,10 @@ def test_get_certificate_revocation_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CertificateRevocationList() + post_with_metadata.return_value = ( + resources.CertificateRevocationList(), + metadata, + ) client.get_certificate_revocation_list( request, @@ -17273,6 +17427,7 @@ def test_get_certificate_revocation_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_revocation_lists_rest_bad_request( @@ -17364,11 +17519,15 @@ def test_list_certificate_revocation_lists_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_list_certificate_revocation_lists", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_certificate_revocation_lists_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_certificate_revocation_lists", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCertificateRevocationListsRequest.pb( service.ListCertificateRevocationListsRequest() ) @@ -17394,6 +17553,10 @@ def test_list_certificate_revocation_lists_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCertificateRevocationListsResponse() + post_with_metadata.return_value = ( + service.ListCertificateRevocationListsResponse(), + metadata, + ) client.list_certificate_revocation_lists( request, @@ -17405,6 +17568,7 @@ def test_list_certificate_revocation_lists_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_revocation_list_rest_bad_request( @@ -17584,11 +17748,15 @@ def test_update_certificate_revocation_list_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_update_certificate_revocation_list", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_update_certificate_revocation_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_update_certificate_revocation_list", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCertificateRevocationListRequest.pb( service.UpdateCertificateRevocationListRequest() ) @@ -17612,6 +17780,7 @@ def test_update_certificate_revocation_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.update_certificate_revocation_list( request, @@ -17623,6 +17792,7 @@ def test_update_certificate_revocation_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_reusable_config_rest_bad_request( @@ -17714,10 +17884,14 @@ def test_get_reusable_config_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_get_reusable_config", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_get_reusable_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_get_reusable_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetReusableConfigRequest.pb( service.GetReusableConfigRequest() ) @@ -17741,6 +17915,7 @@ def test_get_reusable_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ReusableConfig() + post_with_metadata.return_value = resources.ReusableConfig(), metadata client.get_reusable_config( request, @@ -17752,6 +17927,7 @@ def test_get_reusable_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_reusable_configs_rest_bad_request( @@ -17839,11 +18015,15 @@ def test_list_reusable_configs_rest_interceptors(null_interceptor): transports.CertificateAuthorityServiceRestInterceptor, "post_list_reusable_configs", ) as post, mock.patch.object( + transports.CertificateAuthorityServiceRestInterceptor, + "post_list_reusable_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateAuthorityServiceRestInterceptor, "pre_list_reusable_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListReusableConfigsRequest.pb( service.ListReusableConfigsRequest() ) @@ -17869,6 +18049,10 @@ def test_list_reusable_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListReusableConfigsResponse() + post_with_metadata.return_value = ( + service.ListReusableConfigsResponse(), + metadata, + ) client.list_reusable_configs( request, @@ -17880,6 +18064,7 @@ def test_list_reusable_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-resource-manager/README.rst b/packages/google-cloud-resource-manager/README.rst index 2fdde75593cc..b28638ac70ea 100644 --- a/packages/google-cloud-resource-manager/README.rst +++ b/packages/google-cloud-resource-manager/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Resource Manager.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Resource Manager.: https://cloud.google.com/resource-manager -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager/gapic_version.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager/gapic_version.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/gapic_version.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/gapic_version.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/client.py index 38bccb239b15..738df2385053 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -487,6 +489,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2239,16 +2268,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-resource-manager/google/cloud/resourcemanager_v3/services/folders/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/transports/rest.py index ea8b18e665ed..06f58a1b0c55 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/folders/transports/rest.py @@ -182,12 +182,35 @@ def post_create_folder( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_folder - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_folder_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_create_folder` interceptor runs + before the `post_create_folder_with_metadata` interceptor. """ return response + def post_create_folder_with_metadata( + self, + response: 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_folder + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_create_folder_with_metadata` + interceptor in new development instead of the `post_create_folder` interceptor. + When both interceptors are used, this `post_create_folder_with_metadata` interceptor runs after the + `post_create_folder` interceptor. The (possibly modified) response returned by + `post_create_folder` will be passed to + `post_create_folder_with_metadata`. + """ + return response, metadata + def pre_delete_folder( self, request: folders.DeleteFolderRequest, @@ -205,12 +228,35 @@ def post_delete_folder( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_folder - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_folder_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_delete_folder` interceptor runs + before the `post_delete_folder_with_metadata` interceptor. """ return response + def post_delete_folder_with_metadata( + self, + response: 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_folder + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_delete_folder_with_metadata` + interceptor in new development instead of the `post_delete_folder` interceptor. + When both interceptors are used, this `post_delete_folder_with_metadata` interceptor runs after the + `post_delete_folder` interceptor. The (possibly modified) response returned by + `post_delete_folder` will be passed to + `post_delete_folder_with_metadata`. + """ + return response, metadata + def pre_get_folder( self, request: folders.GetFolderRequest, @@ -226,12 +272,35 @@ def pre_get_folder( def post_get_folder(self, response: folders.Folder) -> folders.Folder: """Post-rpc interceptor for get_folder - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_folder_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_get_folder` interceptor runs + before the `post_get_folder_with_metadata` interceptor. """ return response + def post_get_folder_with_metadata( + self, + response: folders.Folder, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[folders.Folder, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_folder + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_get_folder_with_metadata` + interceptor in new development instead of the `post_get_folder` interceptor. + When both interceptors are used, this `post_get_folder_with_metadata` interceptor runs after the + `post_get_folder` interceptor. The (possibly modified) response returned by + `post_get_folder` will be passed to + `post_get_folder_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -249,12 +318,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_list_folders( self, request: folders.ListFoldersRequest, @@ -272,12 +364,35 @@ def post_list_folders( ) -> folders.ListFoldersResponse: """Post-rpc interceptor for list_folders - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_folders_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_list_folders` interceptor runs + before the `post_list_folders_with_metadata` interceptor. """ return response + def post_list_folders_with_metadata( + self, + response: folders.ListFoldersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[folders.ListFoldersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_folders + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_list_folders_with_metadata` + interceptor in new development instead of the `post_list_folders` interceptor. + When both interceptors are used, this `post_list_folders_with_metadata` interceptor runs after the + `post_list_folders` interceptor. The (possibly modified) response returned by + `post_list_folders` will be passed to + `post_list_folders_with_metadata`. + """ + return response, metadata + def pre_move_folder( self, request: folders.MoveFolderRequest, @@ -295,12 +410,35 @@ def post_move_folder( ) -> operations_pb2.Operation: """Post-rpc interceptor for move_folder - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_folder_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_move_folder` interceptor runs + before the `post_move_folder_with_metadata` interceptor. """ return response + def post_move_folder_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move_folder + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_move_folder_with_metadata` + interceptor in new development instead of the `post_move_folder` interceptor. + When both interceptors are used, this `post_move_folder_with_metadata` interceptor runs after the + `post_move_folder` interceptor. The (possibly modified) response returned by + `post_move_folder` will be passed to + `post_move_folder_with_metadata`. + """ + return response, metadata + def pre_search_folders( self, request: folders.SearchFoldersRequest, @@ -318,12 +456,35 @@ def post_search_folders( ) -> folders.SearchFoldersResponse: """Post-rpc interceptor for search_folders - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_folders_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_search_folders` interceptor runs + before the `post_search_folders_with_metadata` interceptor. """ return response + def post_search_folders_with_metadata( + self, + response: folders.SearchFoldersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[folders.SearchFoldersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for search_folders + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_search_folders_with_metadata` + interceptor in new development instead of the `post_search_folders` interceptor. + When both interceptors are used, this `post_search_folders_with_metadata` interceptor runs after the + `post_search_folders` interceptor. The (possibly modified) response returned by + `post_search_folders` will be passed to + `post_search_folders_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -341,12 +502,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -367,12 +551,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_undelete_folder( self, request: folders.UndeleteFolderRequest, @@ -390,12 +600,35 @@ def post_undelete_folder( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_folder - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_folder_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_undelete_folder` interceptor runs + before the `post_undelete_folder_with_metadata` interceptor. """ return response + def post_undelete_folder_with_metadata( + self, + response: 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_folder + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_undelete_folder_with_metadata` + interceptor in new development instead of the `post_undelete_folder` interceptor. + When both interceptors are used, this `post_undelete_folder_with_metadata` interceptor runs after the + `post_undelete_folder` interceptor. The (possibly modified) response returned by + `post_undelete_folder` will be passed to + `post_undelete_folder_with_metadata`. + """ + return response, metadata + def pre_update_folder( self, request: folders.UpdateFolderRequest, @@ -413,12 +646,35 @@ def post_update_folder( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_folder - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_folder_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Folders server but before - it is returned to user code. + it is returned to user code. This `post_update_folder` interceptor runs + before the `post_update_folder_with_metadata` interceptor. """ return response + def post_update_folder_with_metadata( + self, + response: 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_folder + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Folders server but before it is returned to user code. + + We recommend only using this `post_update_folder_with_metadata` + interceptor in new development instead of the `post_update_folder` interceptor. + When both interceptors are used, this `post_update_folder_with_metadata` interceptor runs after the + `post_update_folder` interceptor. The (possibly modified) response returned by + `post_update_folder` will be passed to + `post_update_folder_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -695,6 +951,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_folder(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_folder_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -838,6 +1098,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_folder(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_folder_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -981,6 +1245,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_folder(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_folder_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1204,6 +1472,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1346,6 +1618,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_folders(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_folders_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1493,6 +1769,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_move_folder(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_folder_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1638,6 +1918,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_folders(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_folders_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1861,6 +2145,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2009,6 +2297,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2160,6 +2452,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_folder(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undelete_folder_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2316,6 +2612,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_folder(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_folder_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/client.py index eec927ece34a..5dc69db80531 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/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. @@ -1392,16 +1421,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-resource-manager/google/cloud/resourcemanager_v3/services/organizations/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/transports/rest.py index 338156e473b6..1d8b1b11c834 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/organizations/transports/rest.py @@ -134,12 +134,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Organizations server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Organizations server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_get_organization( self, request: organizations.GetOrganizationRequest, @@ -159,12 +182,35 @@ def post_get_organization( ) -> organizations.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 Organizations 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: organizations.Organization, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[organizations.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 Organizations 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_search_organizations( self, request: organizations.SearchOrganizationsRequest, @@ -185,12 +231,38 @@ def post_search_organizations( ) -> organizations.SearchOrganizationsResponse: """Post-rpc interceptor for search_organizations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_organizations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Organizations server but before - it is returned to user code. + it is returned to user code. This `post_search_organizations` interceptor runs + before the `post_search_organizations_with_metadata` interceptor. """ return response + def post_search_organizations_with_metadata( + self, + response: organizations.SearchOrganizationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + organizations.SearchOrganizationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_organizations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Organizations server but before it is returned to user code. + + We recommend only using this `post_search_organizations_with_metadata` + interceptor in new development instead of the `post_search_organizations` interceptor. + When both interceptors are used, this `post_search_organizations_with_metadata` interceptor runs after the + `post_search_organizations` interceptor. The (possibly modified) response returned by + `post_search_organizations` will be passed to + `post_search_organizations_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -208,12 +280,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Organizations server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Organizations server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -234,12 +329,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Organizations server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Organizations server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -550,6 +671,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -698,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 @@ -842,6 +971,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_organizations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_organizations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1065,6 +1198,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1213,6 +1350,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/client.py index 9f50334b832e..cab93580f57a 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/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. @@ -2295,16 +2324,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-resource-manager/google/cloud/resourcemanager_v3/services/projects/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/transports/rest.py index 55312200c880..55fb98bc80fa 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/projects/transports/rest.py @@ -182,12 +182,35 @@ def post_create_project( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_project - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_project_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_create_project` interceptor runs + before the `post_create_project_with_metadata` interceptor. """ return response + def post_create_project_with_metadata( + self, + response: 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_project + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_create_project_with_metadata` + interceptor in new development instead of the `post_create_project` interceptor. + When both interceptors are used, this `post_create_project_with_metadata` interceptor runs after the + `post_create_project` interceptor. The (possibly modified) response returned by + `post_create_project` will be passed to + `post_create_project_with_metadata`. + """ + return response, metadata + def pre_delete_project( self, request: projects.DeleteProjectRequest, @@ -205,12 +228,35 @@ def post_delete_project( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_project - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_project_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_delete_project` interceptor runs + before the `post_delete_project_with_metadata` interceptor. """ return response + def post_delete_project_with_metadata( + self, + response: 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_project + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_delete_project_with_metadata` + interceptor in new development instead of the `post_delete_project` interceptor. + When both interceptors are used, this `post_delete_project_with_metadata` interceptor runs after the + `post_delete_project` interceptor. The (possibly modified) response returned by + `post_delete_project` will be passed to + `post_delete_project_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -228,12 +274,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_get_project( self, request: projects.GetProjectRequest, @@ -249,12 +318,35 @@ def pre_get_project( def post_get_project(self, response: projects.Project) -> projects.Project: """Post-rpc interceptor for get_project - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_project_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_get_project` interceptor runs + before the `post_get_project_with_metadata` interceptor. """ return response + def post_get_project_with_metadata( + self, + response: projects.Project, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[projects.Project, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_project + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_get_project_with_metadata` + interceptor in new development instead of the `post_get_project` interceptor. + When both interceptors are used, this `post_get_project_with_metadata` interceptor runs after the + `post_get_project` interceptor. The (possibly modified) response returned by + `post_get_project` will be passed to + `post_get_project_with_metadata`. + """ + return response, metadata + def pre_list_projects( self, request: projects.ListProjectsRequest, @@ -272,12 +364,35 @@ def post_list_projects( ) -> projects.ListProjectsResponse: """Post-rpc interceptor for list_projects - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_projects_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_list_projects` interceptor runs + before the `post_list_projects_with_metadata` interceptor. """ return response + def post_list_projects_with_metadata( + self, + response: projects.ListProjectsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[projects.ListProjectsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_projects + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_list_projects_with_metadata` + interceptor in new development instead of the `post_list_projects` interceptor. + When both interceptors are used, this `post_list_projects_with_metadata` interceptor runs after the + `post_list_projects` interceptor. The (possibly modified) response returned by + `post_list_projects` will be passed to + `post_list_projects_with_metadata`. + """ + return response, metadata + def pre_move_project( self, request: projects.MoveProjectRequest, @@ -295,12 +410,35 @@ def post_move_project( ) -> operations_pb2.Operation: """Post-rpc interceptor for move_project - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_project_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_move_project` interceptor runs + before the `post_move_project_with_metadata` interceptor. """ return response + def post_move_project_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move_project + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_move_project_with_metadata` + interceptor in new development instead of the `post_move_project` interceptor. + When both interceptors are used, this `post_move_project_with_metadata` interceptor runs after the + `post_move_project` interceptor. The (possibly modified) response returned by + `post_move_project` will be passed to + `post_move_project_with_metadata`. + """ + return response, metadata + def pre_search_projects( self, request: projects.SearchProjectsRequest, @@ -318,12 +456,37 @@ def post_search_projects( ) -> projects.SearchProjectsResponse: """Post-rpc interceptor for search_projects - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_projects_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_search_projects` interceptor runs + before the `post_search_projects_with_metadata` interceptor. """ return response + def post_search_projects_with_metadata( + self, + response: projects.SearchProjectsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + projects.SearchProjectsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for search_projects + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_search_projects_with_metadata` + interceptor in new development instead of the `post_search_projects` interceptor. + When both interceptors are used, this `post_search_projects_with_metadata` interceptor runs after the + `post_search_projects` interceptor. The (possibly modified) response returned by + `post_search_projects` will be passed to + `post_search_projects_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -341,12 +504,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -367,12 +553,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_undelete_project( self, request: projects.UndeleteProjectRequest, @@ -392,12 +604,35 @@ def post_undelete_project( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_project - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_project_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_undelete_project` interceptor runs + before the `post_undelete_project_with_metadata` interceptor. """ return response + def post_undelete_project_with_metadata( + self, + response: 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_project + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_undelete_project_with_metadata` + interceptor in new development instead of the `post_undelete_project` interceptor. + When both interceptors are used, this `post_undelete_project_with_metadata` interceptor runs after the + `post_undelete_project` interceptor. The (possibly modified) response returned by + `post_undelete_project` will be passed to + `post_undelete_project_with_metadata`. + """ + return response, metadata + def pre_update_project( self, request: projects.UpdateProjectRequest, @@ -415,12 +650,35 @@ def post_update_project( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_project - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_project_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_update_project` interceptor runs + before the `post_update_project_with_metadata` interceptor. """ return response + def post_update_project_with_metadata( + self, + response: 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_project + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_update_project_with_metadata` + interceptor in new development instead of the `post_update_project` interceptor. + When both interceptors are used, this `post_update_project_with_metadata` interceptor runs after the + `post_update_project` interceptor. The (possibly modified) response returned by + `post_update_project` will be passed to + `post_update_project_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -698,6 +956,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_project(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_project_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -844,6 +1106,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_project(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_project_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1067,6 +1333,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1215,6 +1485,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_project(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_project_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1370,6 +1644,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_projects(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_projects_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1521,6 +1799,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_move_project(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_project_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1674,6 +1956,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_projects(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_projects_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1897,6 +2183,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2045,6 +2335,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2202,6 +2496,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_project(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undelete_project_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2360,6 +2658,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_project(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_project_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/client.py index 72886ad92428..c1eb995e72b2 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -513,6 +515,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1244,16 +1273,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-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/transports/rest.py index da6ad505f359..8831353800cc 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_bindings/transports/rest.py @@ -126,12 +126,35 @@ def post_create_tag_binding( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tag_binding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tag_binding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagBindings server but before - it is returned to user code. + it is returned to user code. This `post_create_tag_binding` interceptor runs + before the `post_create_tag_binding_with_metadata` interceptor. """ return response + def post_create_tag_binding_with_metadata( + self, + response: 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_tag_binding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagBindings server but before it is returned to user code. + + We recommend only using this `post_create_tag_binding_with_metadata` + interceptor in new development instead of the `post_create_tag_binding` interceptor. + When both interceptors are used, this `post_create_tag_binding_with_metadata` interceptor runs after the + `post_create_tag_binding` interceptor. The (possibly modified) response returned by + `post_create_tag_binding` will be passed to + `post_create_tag_binding_with_metadata`. + """ + return response, metadata + def pre_delete_tag_binding( self, request: tag_bindings.DeleteTagBindingRequest, @@ -151,12 +174,35 @@ def post_delete_tag_binding( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_tag_binding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_tag_binding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagBindings server but before - it is returned to user code. + it is returned to user code. This `post_delete_tag_binding` interceptor runs + before the `post_delete_tag_binding_with_metadata` interceptor. """ return response + def post_delete_tag_binding_with_metadata( + self, + response: 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_tag_binding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagBindings server but before it is returned to user code. + + We recommend only using this `post_delete_tag_binding_with_metadata` + interceptor in new development instead of the `post_delete_tag_binding` interceptor. + When both interceptors are used, this `post_delete_tag_binding_with_metadata` interceptor runs after the + `post_delete_tag_binding` interceptor. The (possibly modified) response returned by + `post_delete_tag_binding` will be passed to + `post_delete_tag_binding_with_metadata`. + """ + return response, metadata + def pre_list_effective_tags( self, request: tag_bindings.ListEffectiveTagsRequest, @@ -176,12 +222,37 @@ def post_list_effective_tags( ) -> tag_bindings.ListEffectiveTagsResponse: """Post-rpc interceptor for list_effective_tags - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_effective_tags_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagBindings server but before - it is returned to user code. + it is returned to user code. This `post_list_effective_tags` interceptor runs + before the `post_list_effective_tags_with_metadata` interceptor. """ return response + def post_list_effective_tags_with_metadata( + self, + response: tag_bindings.ListEffectiveTagsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + tag_bindings.ListEffectiveTagsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_effective_tags + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagBindings server but before it is returned to user code. + + We recommend only using this `post_list_effective_tags_with_metadata` + interceptor in new development instead of the `post_list_effective_tags` interceptor. + When both interceptors are used, this `post_list_effective_tags_with_metadata` interceptor runs after the + `post_list_effective_tags` interceptor. The (possibly modified) response returned by + `post_list_effective_tags` will be passed to + `post_list_effective_tags_with_metadata`. + """ + return response, metadata + def pre_list_tag_bindings( self, request: tag_bindings.ListTagBindingsRequest, @@ -201,12 +272,37 @@ def post_list_tag_bindings( ) -> tag_bindings.ListTagBindingsResponse: """Post-rpc interceptor for list_tag_bindings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tag_bindings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagBindings server but before - it is returned to user code. + it is returned to user code. This `post_list_tag_bindings` interceptor runs + before the `post_list_tag_bindings_with_metadata` interceptor. """ return response + def post_list_tag_bindings_with_metadata( + self, + response: tag_bindings.ListTagBindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + tag_bindings.ListTagBindingsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tag_bindings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagBindings server but before it is returned to user code. + + We recommend only using this `post_list_tag_bindings_with_metadata` + interceptor in new development instead of the `post_list_tag_bindings` interceptor. + When both interceptors are used, this `post_list_tag_bindings_with_metadata` interceptor runs after the + `post_list_tag_bindings` interceptor. The (possibly modified) response returned by + `post_list_tag_bindings` will be passed to + `post_list_tag_bindings_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -483,6 +579,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tag_binding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tag_binding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -627,6 +727,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_tag_binding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_tag_binding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -770,6 +874,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_effective_tags(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_effective_tags_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -915,6 +1023,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tag_bindings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tag_bindings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/client.py index 1b12b6948881..4507c4268395 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/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. @@ -1121,16 +1150,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-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/transports/rest.py index 483d926d7b84..464049616e72 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_holds/transports/rest.py @@ -116,12 +116,35 @@ def post_create_tag_hold( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tag_hold - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tag_hold_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagHolds server but before - it is returned to user code. + it is returned to user code. This `post_create_tag_hold` interceptor runs + before the `post_create_tag_hold_with_metadata` interceptor. """ return response + def post_create_tag_hold_with_metadata( + self, + response: 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_tag_hold + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagHolds server but before it is returned to user code. + + We recommend only using this `post_create_tag_hold_with_metadata` + interceptor in new development instead of the `post_create_tag_hold` interceptor. + When both interceptors are used, this `post_create_tag_hold_with_metadata` interceptor runs after the + `post_create_tag_hold` interceptor. The (possibly modified) response returned by + `post_create_tag_hold` will be passed to + `post_create_tag_hold_with_metadata`. + """ + return response, metadata + def pre_delete_tag_hold( self, request: tag_holds.DeleteTagHoldRequest, @@ -139,12 +162,35 @@ def post_delete_tag_hold( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_tag_hold - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_tag_hold_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagHolds server but before - it is returned to user code. + it is returned to user code. This `post_delete_tag_hold` interceptor runs + before the `post_delete_tag_hold_with_metadata` interceptor. """ return response + def post_delete_tag_hold_with_metadata( + self, + response: 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_tag_hold + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagHolds server but before it is returned to user code. + + We recommend only using this `post_delete_tag_hold_with_metadata` + interceptor in new development instead of the `post_delete_tag_hold` interceptor. + When both interceptors are used, this `post_delete_tag_hold_with_metadata` interceptor runs after the + `post_delete_tag_hold` interceptor. The (possibly modified) response returned by + `post_delete_tag_hold` will be passed to + `post_delete_tag_hold_with_metadata`. + """ + return response, metadata + def pre_list_tag_holds( self, request: tag_holds.ListTagHoldsRequest, @@ -162,12 +208,35 @@ def post_list_tag_holds( ) -> tag_holds.ListTagHoldsResponse: """Post-rpc interceptor for list_tag_holds - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tag_holds_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagHolds server but before - it is returned to user code. + it is returned to user code. This `post_list_tag_holds` interceptor runs + before the `post_list_tag_holds_with_metadata` interceptor. """ return response + def post_list_tag_holds_with_metadata( + self, + response: tag_holds.ListTagHoldsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tag_holds.ListTagHoldsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_tag_holds + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagHolds server but before it is returned to user code. + + We recommend only using this `post_list_tag_holds_with_metadata` + interceptor in new development instead of the `post_list_tag_holds` interceptor. + When both interceptors are used, this `post_list_tag_holds_with_metadata` interceptor runs after the + `post_list_tag_holds` interceptor. The (possibly modified) response returned by + `post_list_tag_holds` will be passed to + `post_list_tag_holds_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -449,6 +518,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tag_hold(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tag_hold_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -595,6 +668,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_tag_hold(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_tag_hold_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -738,6 +815,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tag_holds(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tag_holds_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/client.py index 0a5bcb8828d7..b4b01b920950 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_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 @@ -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. @@ -1849,16 +1878,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-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/transports/rest.py index 33d03a329e50..d3f0a366944c 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_keys/transports/rest.py @@ -166,12 +166,35 @@ def post_create_tag_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tag_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tag_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_create_tag_key` interceptor runs + before the `post_create_tag_key_with_metadata` interceptor. """ return response + def post_create_tag_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_tag_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_create_tag_key_with_metadata` + interceptor in new development instead of the `post_create_tag_key` interceptor. + When both interceptors are used, this `post_create_tag_key_with_metadata` interceptor runs after the + `post_create_tag_key` interceptor. The (possibly modified) response returned by + `post_create_tag_key` will be passed to + `post_create_tag_key_with_metadata`. + """ + return response, metadata + def pre_delete_tag_key( self, request: tag_keys.DeleteTagKeyRequest, @@ -189,12 +212,35 @@ def post_delete_tag_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_tag_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_tag_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_delete_tag_key` interceptor runs + before the `post_delete_tag_key_with_metadata` interceptor. """ return response + def post_delete_tag_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_tag_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_delete_tag_key_with_metadata` + interceptor in new development instead of the `post_delete_tag_key` interceptor. + When both interceptors are used, this `post_delete_tag_key_with_metadata` interceptor runs after the + `post_delete_tag_key` interceptor. The (possibly modified) response returned by + `post_delete_tag_key` will be passed to + `post_delete_tag_key_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -212,12 +258,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_get_namespaced_tag_key( self, request: tag_keys.GetNamespacedTagKeyRequest, @@ -235,12 +304,35 @@ def pre_get_namespaced_tag_key( def post_get_namespaced_tag_key(self, response: tag_keys.TagKey) -> tag_keys.TagKey: """Post-rpc interceptor for get_namespaced_tag_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_namespaced_tag_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_get_namespaced_tag_key` interceptor runs + before the `post_get_namespaced_tag_key_with_metadata` interceptor. """ return response + def post_get_namespaced_tag_key_with_metadata( + self, + response: tag_keys.TagKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tag_keys.TagKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_namespaced_tag_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_get_namespaced_tag_key_with_metadata` + interceptor in new development instead of the `post_get_namespaced_tag_key` interceptor. + When both interceptors are used, this `post_get_namespaced_tag_key_with_metadata` interceptor runs after the + `post_get_namespaced_tag_key` interceptor. The (possibly modified) response returned by + `post_get_namespaced_tag_key` will be passed to + `post_get_namespaced_tag_key_with_metadata`. + """ + return response, metadata + def pre_get_tag_key( self, request: tag_keys.GetTagKeyRequest, @@ -256,12 +348,35 @@ def pre_get_tag_key( def post_get_tag_key(self, response: tag_keys.TagKey) -> tag_keys.TagKey: """Post-rpc interceptor for get_tag_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tag_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_get_tag_key` interceptor runs + before the `post_get_tag_key_with_metadata` interceptor. """ return response + def post_get_tag_key_with_metadata( + self, + response: tag_keys.TagKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tag_keys.TagKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tag_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_get_tag_key_with_metadata` + interceptor in new development instead of the `post_get_tag_key` interceptor. + When both interceptors are used, this `post_get_tag_key_with_metadata` interceptor runs after the + `post_get_tag_key` interceptor. The (possibly modified) response returned by + `post_get_tag_key` will be passed to + `post_get_tag_key_with_metadata`. + """ + return response, metadata + def pre_list_tag_keys( self, request: tag_keys.ListTagKeysRequest, @@ -279,12 +394,35 @@ def post_list_tag_keys( ) -> tag_keys.ListTagKeysResponse: """Post-rpc interceptor for list_tag_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tag_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_list_tag_keys` interceptor runs + before the `post_list_tag_keys_with_metadata` interceptor. """ return response + def post_list_tag_keys_with_metadata( + self, + response: tag_keys.ListTagKeysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tag_keys.ListTagKeysResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_tag_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_list_tag_keys_with_metadata` + interceptor in new development instead of the `post_list_tag_keys` interceptor. + When both interceptors are used, this `post_list_tag_keys_with_metadata` interceptor runs after the + `post_list_tag_keys` interceptor. The (possibly modified) response returned by + `post_list_tag_keys` will be passed to + `post_list_tag_keys_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -302,12 +440,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -328,12 +489,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_update_tag_key( self, request: tag_keys.UpdateTagKeyRequest, @@ -351,12 +538,35 @@ def post_update_tag_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_tag_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tag_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagKeys server but before - it is returned to user code. + it is returned to user code. This `post_update_tag_key` interceptor runs + before the `post_update_tag_key_with_metadata` interceptor. """ return response + def post_update_tag_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_tag_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagKeys server but before it is returned to user code. + + We recommend only using this `post_update_tag_key_with_metadata` + interceptor in new development instead of the `post_update_tag_key` interceptor. + When both interceptors are used, this `post_update_tag_key_with_metadata` interceptor runs after the + `post_update_tag_key` interceptor. The (possibly modified) response returned by + `post_update_tag_key` will be passed to + `post_update_tag_key_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -631,6 +841,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tag_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tag_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -775,6 +989,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_tag_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_tag_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -998,6 +1216,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1143,6 +1365,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_namespaced_tag_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_namespaced_tag_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1286,6 +1512,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tag_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tag_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1429,6 +1659,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tag_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tag_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1652,6 +1886,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1800,6 +2038,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1950,6 +2192,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tag_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tag_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/client.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/client.py index fd081c6cd176..7b012aedc7b0 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/client.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/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. @@ -1856,16 +1885,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-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/transports/rest.py b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/transports/rest.py index bad4838b1c73..607da88b926c 100644 --- a/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/transports/rest.py +++ b/packages/google-cloud-resource-manager/google/cloud/resourcemanager_v3/services/tag_values/transports/rest.py @@ -168,12 +168,35 @@ def post_create_tag_value( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_tag_value - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tag_value_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_create_tag_value` interceptor runs + before the `post_create_tag_value_with_metadata` interceptor. """ return response + def post_create_tag_value_with_metadata( + self, + response: 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_tag_value + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_create_tag_value_with_metadata` + interceptor in new development instead of the `post_create_tag_value` interceptor. + When both interceptors are used, this `post_create_tag_value_with_metadata` interceptor runs after the + `post_create_tag_value` interceptor. The (possibly modified) response returned by + `post_create_tag_value` will be passed to + `post_create_tag_value_with_metadata`. + """ + return response, metadata + def pre_delete_tag_value( self, request: tag_values.DeleteTagValueRequest, @@ -193,12 +216,35 @@ def post_delete_tag_value( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_tag_value - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_tag_value_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_delete_tag_value` interceptor runs + before the `post_delete_tag_value_with_metadata` interceptor. """ return response + def post_delete_tag_value_with_metadata( + self, + response: 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_tag_value + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_delete_tag_value_with_metadata` + interceptor in new development instead of the `post_delete_tag_value` interceptor. + When both interceptors are used, this `post_delete_tag_value_with_metadata` interceptor runs after the + `post_delete_tag_value` interceptor. The (possibly modified) response returned by + `post_delete_tag_value` will be passed to + `post_delete_tag_value_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -216,12 +262,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_get_namespaced_tag_value( self, request: tag_values.GetNamespacedTagValueRequest, @@ -241,12 +310,35 @@ def post_get_namespaced_tag_value( ) -> tag_values.TagValue: """Post-rpc interceptor for get_namespaced_tag_value - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_namespaced_tag_value_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_get_namespaced_tag_value` interceptor runs + before the `post_get_namespaced_tag_value_with_metadata` interceptor. """ return response + def post_get_namespaced_tag_value_with_metadata( + self, + response: tag_values.TagValue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tag_values.TagValue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_namespaced_tag_value + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_get_namespaced_tag_value_with_metadata` + interceptor in new development instead of the `post_get_namespaced_tag_value` interceptor. + When both interceptors are used, this `post_get_namespaced_tag_value_with_metadata` interceptor runs after the + `post_get_namespaced_tag_value` interceptor. The (possibly modified) response returned by + `post_get_namespaced_tag_value` will be passed to + `post_get_namespaced_tag_value_with_metadata`. + """ + return response, metadata + def pre_get_tag_value( self, request: tag_values.GetTagValueRequest, @@ -262,12 +354,35 @@ def pre_get_tag_value( def post_get_tag_value(self, response: tag_values.TagValue) -> tag_values.TagValue: """Post-rpc interceptor for get_tag_value - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tag_value_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_get_tag_value` interceptor runs + before the `post_get_tag_value_with_metadata` interceptor. """ return response + def post_get_tag_value_with_metadata( + self, + response: tag_values.TagValue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[tag_values.TagValue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tag_value + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_get_tag_value_with_metadata` + interceptor in new development instead of the `post_get_tag_value` interceptor. + When both interceptors are used, this `post_get_tag_value_with_metadata` interceptor runs after the + `post_get_tag_value` interceptor. The (possibly modified) response returned by + `post_get_tag_value` will be passed to + `post_get_tag_value_with_metadata`. + """ + return response, metadata + def pre_list_tag_values( self, request: tag_values.ListTagValuesRequest, @@ -287,12 +402,37 @@ def post_list_tag_values( ) -> tag_values.ListTagValuesResponse: """Post-rpc interceptor for list_tag_values - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tag_values_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_list_tag_values` interceptor runs + before the `post_list_tag_values_with_metadata` interceptor. """ return response + def post_list_tag_values_with_metadata( + self, + response: tag_values.ListTagValuesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + tag_values.ListTagValuesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tag_values + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_list_tag_values_with_metadata` + interceptor in new development instead of the `post_list_tag_values` interceptor. + When both interceptors are used, this `post_list_tag_values_with_metadata` interceptor runs after the + `post_list_tag_values` interceptor. The (possibly modified) response returned by + `post_list_tag_values` will be passed to + `post_list_tag_values_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -310,12 +450,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -336,12 +499,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_update_tag_value( self, request: tag_values.UpdateTagValueRequest, @@ -361,12 +550,35 @@ def post_update_tag_value( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_tag_value - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tag_value_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TagValues server but before - it is returned to user code. + it is returned to user code. This `post_update_tag_value` interceptor runs + before the `post_update_tag_value_with_metadata` interceptor. """ return response + def post_update_tag_value_with_metadata( + self, + response: 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_tag_value + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TagValues server but before it is returned to user code. + + We recommend only using this `post_update_tag_value_with_metadata` + interceptor in new development instead of the `post_update_tag_value` interceptor. + When both interceptors are used, this `post_update_tag_value_with_metadata` interceptor runs after the + `post_update_tag_value` interceptor. The (possibly modified) response returned by + `post_update_tag_value` will be passed to + `post_update_tag_value_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -647,6 +859,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tag_value(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tag_value_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -795,6 +1011,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_tag_value(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_tag_value_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1020,6 +1240,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1167,6 +1391,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_namespaced_tag_value(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_namespaced_tag_value_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1314,6 +1542,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tag_value(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tag_value_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1461,6 +1693,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tag_values(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tag_values_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1688,6 +1924,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1836,6 +2076,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1992,6 +2236,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tag_value(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tag_value_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-resource-manager/noxfile.py b/packages/google-cloud-resource-manager/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-resource-manager/noxfile.py +++ b/packages/google-cloud-resource-manager/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-resource-manager/samples/generated_samples/snippet_metadata_google.cloud.resourcemanager.v3.json b/packages/google-cloud-resource-manager/samples/generated_samples/snippet_metadata_google.cloud.resourcemanager.v3.json index 68149d644114..18bac0c91496 100644 --- a/packages/google-cloud-resource-manager/samples/generated_samples/snippet_metadata_google.cloud.resourcemanager.v3.json +++ b/packages/google-cloud-resource-manager/samples/generated_samples/snippet_metadata_google.cloud.resourcemanager.v3.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-resource-manager", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-resource-manager/setup.py b/packages/google-cloud-resource-manager/setup.py index cb4b232baa9e..0d6d4718b8cc 100644 --- a/packages/google-cloud-resource-manager/setup.py +++ b/packages/google-cloud-resource-manager/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-resource-manager" diff --git a/packages/google-cloud-resource-manager/testing/constraints-3.7.txt b/packages/google-cloud-resource-manager/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-resource-manager/testing/constraints-3.7.txt +++ b/packages/google-cloud-resource-manager/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_folders.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_folders.py index 5142b5a5fa6c..0cd4c7bc6aa2 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_folders.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_folders.py @@ -76,6 +76,13 @@ ) from google.cloud.resourcemanager_v3.types import folders +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = 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 = FoldersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = FoldersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -7655,10 +7705,13 @@ def test_get_folder_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FoldersRestInterceptor, "post_get_folder" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_get_folder_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_get_folder" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.GetFolderRequest.pb(folders.GetFolderRequest()) transcode.return_value = { "method": "post", @@ -7680,6 +7733,7 @@ def test_get_folder_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = folders.Folder() + post_with_metadata.return_value = folders.Folder(), metadata client.get_folder( request, @@ -7691,6 +7745,7 @@ def test_get_folder_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_folders_rest_bad_request(request_type=folders.ListFoldersRequest): @@ -7771,10 +7826,13 @@ def test_list_folders_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FoldersRestInterceptor, "post_list_folders" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_list_folders_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_list_folders" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.ListFoldersRequest.pb(folders.ListFoldersRequest()) transcode.return_value = { "method": "post", @@ -7798,6 +7856,7 @@ def test_list_folders_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = folders.ListFoldersResponse() + post_with_metadata.return_value = folders.ListFoldersResponse(), metadata client.list_folders( request, @@ -7809,6 +7868,7 @@ def test_list_folders_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_folders_rest_bad_request(request_type=folders.SearchFoldersRequest): @@ -7889,10 +7949,13 @@ def test_search_folders_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FoldersRestInterceptor, "post_search_folders" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_search_folders_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_search_folders" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.SearchFoldersRequest.pb(folders.SearchFoldersRequest()) transcode.return_value = { "method": "post", @@ -7916,6 +7979,7 @@ def test_search_folders_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = folders.SearchFoldersResponse() + post_with_metadata.return_value = folders.SearchFoldersResponse(), metadata client.search_folders( request, @@ -7927,6 +7991,7 @@ def test_search_folders_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_folder_rest_bad_request(request_type=folders.CreateFolderRequest): @@ -8080,10 +8145,13 @@ def test_create_folder_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FoldersRestInterceptor, "post_create_folder" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_create_folder_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_create_folder" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.CreateFolderRequest.pb(folders.CreateFolderRequest()) transcode.return_value = { "method": "post", @@ -8105,6 +8173,7 @@ def test_create_folder_rest_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_folder( request, @@ -8116,6 +8185,7 @@ def test_create_folder_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_folder_rest_bad_request(request_type=folders.UpdateFolderRequest): @@ -8269,10 +8339,13 @@ def test_update_folder_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FoldersRestInterceptor, "post_update_folder" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_update_folder_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_update_folder" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.UpdateFolderRequest.pb(folders.UpdateFolderRequest()) transcode.return_value = { "method": "post", @@ -8294,6 +8367,7 @@ def test_update_folder_rest_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_folder( request, @@ -8305,6 +8379,7 @@ def test_update_folder_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_folder_rest_bad_request(request_type=folders.MoveFolderRequest): @@ -8381,10 +8456,13 @@ def test_move_folder_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FoldersRestInterceptor, "post_move_folder" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_move_folder_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_move_folder" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.MoveFolderRequest.pb(folders.MoveFolderRequest()) transcode.return_value = { "method": "post", @@ -8406,6 +8484,7 @@ def test_move_folder_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.move_folder( request, @@ -8417,6 +8496,7 @@ def test_move_folder_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_folder_rest_bad_request(request_type=folders.DeleteFolderRequest): @@ -8493,10 +8573,13 @@ def test_delete_folder_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FoldersRestInterceptor, "post_delete_folder" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_delete_folder_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_delete_folder" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.DeleteFolderRequest.pb(folders.DeleteFolderRequest()) transcode.return_value = { "method": "post", @@ -8518,6 +8601,7 @@ def test_delete_folder_rest_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_folder( request, @@ -8529,6 +8613,7 @@ def test_delete_folder_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_folder_rest_bad_request(request_type=folders.UndeleteFolderRequest): @@ -8605,10 +8690,13 @@ def test_undelete_folder_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FoldersRestInterceptor, "post_undelete_folder" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_undelete_folder_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_undelete_folder" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = folders.UndeleteFolderRequest.pb(folders.UndeleteFolderRequest()) transcode.return_value = { "method": "post", @@ -8630,6 +8718,7 @@ def test_undelete_folder_rest_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_folder( request, @@ -8641,6 +8730,7 @@ def test_undelete_folder_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -8722,10 +8812,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FoldersRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -8747,6 +8840,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -8758,6 +8852,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -8839,10 +8934,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FoldersRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -8864,6 +8962,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -8875,6 +8974,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -8954,10 +9054,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FoldersRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.FoldersRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FoldersRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -8981,6 +9084,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -8992,6 +9099,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_organizations.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_organizations.py index 18afea0f64d2..ee2e7473ff80 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_organizations.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_organizations.py @@ -67,6 +67,13 @@ ) from google.cloud.resourcemanager_v3.types import organizations +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -321,6 +328,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = OrganizationsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = OrganizationsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -4289,10 +4339,13 @@ def test_get_organization_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrganizationsRestInterceptor, "post_get_organization" ) as post, mock.patch.object( + transports.OrganizationsRestInterceptor, "post_get_organization_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.OrganizationsRestInterceptor, "pre_get_organization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = organizations.GetOrganizationRequest.pb( organizations.GetOrganizationRequest() ) @@ -4316,6 +4369,7 @@ def test_get_organization_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = organizations.Organization() + post_with_metadata.return_value = organizations.Organization(), metadata client.get_organization( request, @@ -4327,6 +4381,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_search_organizations_rest_bad_request( @@ -4411,10 +4466,14 @@ def test_search_organizations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrganizationsRestInterceptor, "post_search_organizations" ) as post, mock.patch.object( + transports.OrganizationsRestInterceptor, + "post_search_organizations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.OrganizationsRestInterceptor, "pre_search_organizations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = organizations.SearchOrganizationsRequest.pb( organizations.SearchOrganizationsRequest() ) @@ -4440,6 +4499,10 @@ def test_search_organizations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = organizations.SearchOrganizationsResponse() + post_with_metadata.return_value = ( + organizations.SearchOrganizationsResponse(), + metadata, + ) client.search_organizations( request, @@ -4451,6 +4514,7 @@ def test_search_organizations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -4534,10 +4598,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrganizationsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.OrganizationsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.OrganizationsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -4559,6 +4626,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -4570,6 +4638,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -4653,10 +4722,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrganizationsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.OrganizationsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.OrganizationsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -4678,6 +4750,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -4689,6 +4762,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -4770,10 +4844,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.OrganizationsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.OrganizationsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.OrganizationsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -4797,6 +4875,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -4808,6 +4890,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_projects.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_projects.py index ce0a5344f899..2642100bacc6 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_projects.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_projects.py @@ -76,6 +76,13 @@ ) from google.cloud.resourcemanager_v3.types import projects +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = 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 = ProjectsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = ProjectsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -7681,10 +7731,13 @@ def test_get_project_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_get_project" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_get_project_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_get_project" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.GetProjectRequest.pb(projects.GetProjectRequest()) transcode.return_value = { "method": "post", @@ -7706,6 +7759,7 @@ def test_get_project_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = projects.Project() + post_with_metadata.return_value = projects.Project(), metadata client.get_project( request, @@ -7717,6 +7771,7 @@ def test_get_project_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_projects_rest_bad_request(request_type=projects.ListProjectsRequest): @@ -7797,10 +7852,13 @@ def test_list_projects_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_list_projects" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_list_projects_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_list_projects" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.ListProjectsRequest.pb(projects.ListProjectsRequest()) transcode.return_value = { "method": "post", @@ -7824,6 +7882,7 @@ def test_list_projects_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = projects.ListProjectsResponse() + post_with_metadata.return_value = projects.ListProjectsResponse(), metadata client.list_projects( request, @@ -7835,6 +7894,7 @@ def test_list_projects_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_projects_rest_bad_request(request_type=projects.SearchProjectsRequest): @@ -7915,10 +7975,13 @@ def test_search_projects_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_search_projects" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_search_projects_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_search_projects" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.SearchProjectsRequest.pb(projects.SearchProjectsRequest()) transcode.return_value = { "method": "post", @@ -7942,6 +8005,7 @@ def test_search_projects_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = projects.SearchProjectsResponse() + post_with_metadata.return_value = projects.SearchProjectsResponse(), metadata client.search_projects( request, @@ -7953,6 +8017,7 @@ def test_search_projects_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_project_rest_bad_request(request_type=projects.CreateProjectRequest): @@ -8108,10 +8173,13 @@ def test_create_project_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProjectsRestInterceptor, "post_create_project" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_create_project_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_create_project" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.CreateProjectRequest.pb(projects.CreateProjectRequest()) transcode.return_value = { "method": "post", @@ -8133,6 +8201,7 @@ def test_create_project_rest_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_project( request, @@ -8144,6 +8213,7 @@ def test_create_project_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_project_rest_bad_request(request_type=projects.UpdateProjectRequest): @@ -8299,10 +8369,13 @@ def test_update_project_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProjectsRestInterceptor, "post_update_project" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_update_project_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_update_project" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.UpdateProjectRequest.pb(projects.UpdateProjectRequest()) transcode.return_value = { "method": "post", @@ -8324,6 +8397,7 @@ def test_update_project_rest_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_project( request, @@ -8335,6 +8409,7 @@ def test_update_project_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_project_rest_bad_request(request_type=projects.MoveProjectRequest): @@ -8411,10 +8486,13 @@ def test_move_project_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProjectsRestInterceptor, "post_move_project" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_move_project_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_move_project" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.MoveProjectRequest.pb(projects.MoveProjectRequest()) transcode.return_value = { "method": "post", @@ -8436,6 +8514,7 @@ def test_move_project_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.move_project( request, @@ -8447,6 +8526,7 @@ def test_move_project_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_project_rest_bad_request(request_type=projects.DeleteProjectRequest): @@ -8523,10 +8603,13 @@ def test_delete_project_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProjectsRestInterceptor, "post_delete_project" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_delete_project_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_delete_project" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.DeleteProjectRequest.pb(projects.DeleteProjectRequest()) transcode.return_value = { "method": "post", @@ -8548,6 +8631,7 @@ def test_delete_project_rest_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_project( request, @@ -8559,6 +8643,7 @@ def test_delete_project_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_project_rest_bad_request( @@ -8637,10 +8722,13 @@ def test_undelete_project_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ProjectsRestInterceptor, "post_undelete_project" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_undelete_project_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_undelete_project" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = projects.UndeleteProjectRequest.pb( projects.UndeleteProjectRequest() ) @@ -8664,6 +8752,7 @@ def test_undelete_project_rest_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_project( request, @@ -8675,6 +8764,7 @@ def test_undelete_project_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -8756,10 +8846,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -8781,6 +8874,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -8792,6 +8886,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -8873,10 +8968,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -8898,6 +8996,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -8909,6 +9008,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -8988,10 +9088,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -9015,6 +9118,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -9026,6 +9133,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_bindings.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_bindings.py index ebdb04a2be99..5a3ff85b1d99 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_bindings.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_bindings.py @@ -71,6 +71,13 @@ ) from google.cloud.resourcemanager_v3.types import tag_bindings +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -310,6 +317,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TagBindingsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = TagBindingsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3915,10 +3965,13 @@ def test_list_tag_bindings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagBindingsRestInterceptor, "post_list_tag_bindings" ) as post, mock.patch.object( + transports.TagBindingsRestInterceptor, "post_list_tag_bindings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagBindingsRestInterceptor, "pre_list_tag_bindings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_bindings.ListTagBindingsRequest.pb( tag_bindings.ListTagBindingsRequest() ) @@ -3944,6 +3997,10 @@ def test_list_tag_bindings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_bindings.ListTagBindingsResponse() + post_with_metadata.return_value = ( + tag_bindings.ListTagBindingsResponse(), + metadata, + ) client.list_tag_bindings( request, @@ -3955,6 +4012,7 @@ def test_list_tag_bindings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tag_binding_rest_bad_request( @@ -4108,10 +4166,13 @@ def test_create_tag_binding_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagBindingsRestInterceptor, "post_create_tag_binding" ) as post, mock.patch.object( + transports.TagBindingsRestInterceptor, "post_create_tag_binding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagBindingsRestInterceptor, "pre_create_tag_binding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_bindings.CreateTagBindingRequest.pb( tag_bindings.CreateTagBindingRequest() ) @@ -4135,6 +4196,7 @@ def test_create_tag_binding_rest_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_tag_binding( request, @@ -4146,6 +4208,7 @@ def test_create_tag_binding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tag_binding_rest_bad_request( @@ -4226,10 +4289,13 @@ def test_delete_tag_binding_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagBindingsRestInterceptor, "post_delete_tag_binding" ) as post, mock.patch.object( + transports.TagBindingsRestInterceptor, "post_delete_tag_binding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagBindingsRestInterceptor, "pre_delete_tag_binding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_bindings.DeleteTagBindingRequest.pb( tag_bindings.DeleteTagBindingRequest() ) @@ -4253,6 +4319,7 @@ def test_delete_tag_binding_rest_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_tag_binding( request, @@ -4264,6 +4331,7 @@ def test_delete_tag_binding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_effective_tags_rest_bad_request( @@ -4348,10 +4416,13 @@ def test_list_effective_tags_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagBindingsRestInterceptor, "post_list_effective_tags" ) as post, mock.patch.object( + transports.TagBindingsRestInterceptor, "post_list_effective_tags_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagBindingsRestInterceptor, "pre_list_effective_tags" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_bindings.ListEffectiveTagsRequest.pb( tag_bindings.ListEffectiveTagsRequest() ) @@ -4377,6 +4448,10 @@ def test_list_effective_tags_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_bindings.ListEffectiveTagsResponse() + post_with_metadata.return_value = ( + tag_bindings.ListEffectiveTagsResponse(), + metadata, + ) client.list_effective_tags( request, @@ -4388,6 +4463,7 @@ def test_list_effective_tags_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-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_holds.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_holds.py index fb079f4babac..1f42864aafba 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_holds.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_holds.py @@ -72,6 +72,13 @@ ) from google.cloud.resourcemanager_v3.types import tag_holds +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -302,6 +309,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TagHoldsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = TagHoldsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3238,10 +3288,13 @@ def test_create_tag_hold_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagHoldsRestInterceptor, "post_create_tag_hold" ) as post, mock.patch.object( + transports.TagHoldsRestInterceptor, "post_create_tag_hold_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagHoldsRestInterceptor, "pre_create_tag_hold" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_holds.CreateTagHoldRequest.pb(tag_holds.CreateTagHoldRequest()) transcode.return_value = { "method": "post", @@ -3263,6 +3316,7 @@ def test_create_tag_hold_rest_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_tag_hold( request, @@ -3274,6 +3328,7 @@ def test_create_tag_hold_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tag_hold_rest_bad_request(request_type=tag_holds.DeleteTagHoldRequest): @@ -3350,10 +3405,13 @@ def test_delete_tag_hold_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagHoldsRestInterceptor, "post_delete_tag_hold" ) as post, mock.patch.object( + transports.TagHoldsRestInterceptor, "post_delete_tag_hold_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagHoldsRestInterceptor, "pre_delete_tag_hold" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_holds.DeleteTagHoldRequest.pb(tag_holds.DeleteTagHoldRequest()) transcode.return_value = { "method": "post", @@ -3375,6 +3433,7 @@ def test_delete_tag_hold_rest_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_tag_hold( request, @@ -3386,6 +3445,7 @@ def test_delete_tag_hold_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tag_holds_rest_bad_request(request_type=tag_holds.ListTagHoldsRequest): @@ -3466,10 +3526,13 @@ def test_list_tag_holds_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagHoldsRestInterceptor, "post_list_tag_holds" ) as post, mock.patch.object( + transports.TagHoldsRestInterceptor, "post_list_tag_holds_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagHoldsRestInterceptor, "pre_list_tag_holds" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_holds.ListTagHoldsRequest.pb(tag_holds.ListTagHoldsRequest()) transcode.return_value = { "method": "post", @@ -3493,6 +3556,7 @@ def test_list_tag_holds_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_holds.ListTagHoldsResponse() + post_with_metadata.return_value = tag_holds.ListTagHoldsResponse(), metadata client.list_tag_holds( request, @@ -3504,6 +3568,7 @@ def test_list_tag_holds_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-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_keys.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_keys.py index a80ef3dd50af..0b1279b2c21f 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_keys.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_keys.py @@ -76,6 +76,13 @@ ) from google.cloud.resourcemanager_v3.types import tag_keys +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = 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 = TagKeysClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = TagKeysClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -6454,10 +6504,13 @@ def test_list_tag_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagKeysRestInterceptor, "post_list_tag_keys" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_list_tag_keys_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_list_tag_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_keys.ListTagKeysRequest.pb(tag_keys.ListTagKeysRequest()) transcode.return_value = { "method": "post", @@ -6481,6 +6534,7 @@ def test_list_tag_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_keys.ListTagKeysResponse() + post_with_metadata.return_value = tag_keys.ListTagKeysResponse(), metadata client.list_tag_keys( request, @@ -6492,6 +6546,7 @@ def test_list_tag_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tag_key_rest_bad_request(request_type=tag_keys.GetTagKeyRequest): @@ -6584,10 +6639,13 @@ def test_get_tag_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagKeysRestInterceptor, "post_get_tag_key" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_get_tag_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_get_tag_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_keys.GetTagKeyRequest.pb(tag_keys.GetTagKeyRequest()) transcode.return_value = { "method": "post", @@ -6609,6 +6667,7 @@ def test_get_tag_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_keys.TagKey() + post_with_metadata.return_value = tag_keys.TagKey(), metadata client.get_tag_key( request, @@ -6620,6 +6679,7 @@ def test_get_tag_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_namespaced_tag_key_rest_bad_request( @@ -6714,10 +6774,13 @@ def test_get_namespaced_tag_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagKeysRestInterceptor, "post_get_namespaced_tag_key" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_get_namespaced_tag_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_get_namespaced_tag_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_keys.GetNamespacedTagKeyRequest.pb( tag_keys.GetNamespacedTagKeyRequest() ) @@ -6741,6 +6804,7 @@ def test_get_namespaced_tag_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_keys.TagKey() + post_with_metadata.return_value = tag_keys.TagKey(), metadata client.get_namespaced_tag_key( request, @@ -6752,6 +6816,7 @@ def test_get_namespaced_tag_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tag_key_rest_bad_request(request_type=tag_keys.CreateTagKeyRequest): @@ -6907,10 +6972,13 @@ def test_create_tag_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagKeysRestInterceptor, "post_create_tag_key" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_create_tag_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_create_tag_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_keys.CreateTagKeyRequest.pb(tag_keys.CreateTagKeyRequest()) transcode.return_value = { "method": "post", @@ -6932,6 +7000,7 @@ def test_create_tag_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_tag_key( request, @@ -6943,6 +7012,7 @@ def test_create_tag_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tag_key_rest_bad_request(request_type=tag_keys.UpdateTagKeyRequest): @@ -7098,10 +7168,13 @@ def test_update_tag_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagKeysRestInterceptor, "post_update_tag_key" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_update_tag_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_update_tag_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_keys.UpdateTagKeyRequest.pb(tag_keys.UpdateTagKeyRequest()) transcode.return_value = { "method": "post", @@ -7123,6 +7196,7 @@ def test_update_tag_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_tag_key( request, @@ -7134,6 +7208,7 @@ def test_update_tag_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tag_key_rest_bad_request(request_type=tag_keys.DeleteTagKeyRequest): @@ -7210,10 +7285,13 @@ def test_delete_tag_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagKeysRestInterceptor, "post_delete_tag_key" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_delete_tag_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_delete_tag_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_keys.DeleteTagKeyRequest.pb(tag_keys.DeleteTagKeyRequest()) transcode.return_value = { "method": "post", @@ -7235,6 +7313,7 @@ def test_delete_tag_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_tag_key( request, @@ -7246,6 +7325,7 @@ def test_delete_tag_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -7327,10 +7407,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagKeysRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -7352,6 +7435,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -7363,6 +7447,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -7444,10 +7529,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagKeysRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -7469,6 +7557,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -7480,6 +7569,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -7559,10 +7649,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagKeysRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.TagKeysRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagKeysRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -7586,6 +7679,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -7597,6 +7694,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_values.py b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_values.py index bc47dde37a98..b296aeab0234 100644 --- a/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_values.py +++ b/packages/google-cloud-resource-manager/tests/unit/gapic/resourcemanager_v3/test_tag_values.py @@ -76,6 +76,13 @@ ) from google.cloud.resourcemanager_v3.types import tag_values +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -309,6 +316,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TagValuesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = TagValuesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -6493,10 +6543,13 @@ def test_list_tag_values_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagValuesRestInterceptor, "post_list_tag_values" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_list_tag_values_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_list_tag_values" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_values.ListTagValuesRequest.pb( tag_values.ListTagValuesRequest() ) @@ -6522,6 +6575,7 @@ def test_list_tag_values_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_values.ListTagValuesResponse() + post_with_metadata.return_value = tag_values.ListTagValuesResponse(), metadata client.list_tag_values( request, @@ -6533,6 +6587,7 @@ def test_list_tag_values_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tag_value_rest_bad_request(request_type=tag_values.GetTagValueRequest): @@ -6623,10 +6678,13 @@ def test_get_tag_value_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagValuesRestInterceptor, "post_get_tag_value" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_get_tag_value_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_get_tag_value" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_values.GetTagValueRequest.pb(tag_values.GetTagValueRequest()) transcode.return_value = { "method": "post", @@ -6648,6 +6706,7 @@ def test_get_tag_value_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_values.TagValue() + post_with_metadata.return_value = tag_values.TagValue(), metadata client.get_tag_value( request, @@ -6659,6 +6718,7 @@ def test_get_tag_value_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_namespaced_tag_value_rest_bad_request( @@ -6751,10 +6811,14 @@ def test_get_namespaced_tag_value_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagValuesRestInterceptor, "post_get_namespaced_tag_value" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, + "post_get_namespaced_tag_value_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_get_namespaced_tag_value" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_values.GetNamespacedTagValueRequest.pb( tag_values.GetNamespacedTagValueRequest() ) @@ -6778,6 +6842,7 @@ def test_get_namespaced_tag_value_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tag_values.TagValue() + post_with_metadata.return_value = tag_values.TagValue(), metadata client.get_namespaced_tag_value( request, @@ -6789,6 +6854,7 @@ def test_get_namespaced_tag_value_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tag_value_rest_bad_request( @@ -6944,10 +7010,13 @@ def test_create_tag_value_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagValuesRestInterceptor, "post_create_tag_value" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_create_tag_value_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_create_tag_value" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_values.CreateTagValueRequest.pb( tag_values.CreateTagValueRequest() ) @@ -6971,6 +7040,7 @@ def test_create_tag_value_rest_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_tag_value( request, @@ -6982,6 +7052,7 @@ def test_create_tag_value_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tag_value_rest_bad_request( @@ -7137,10 +7208,13 @@ def test_update_tag_value_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagValuesRestInterceptor, "post_update_tag_value" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_update_tag_value_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_update_tag_value" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_values.UpdateTagValueRequest.pb( tag_values.UpdateTagValueRequest() ) @@ -7164,6 +7238,7 @@ def test_update_tag_value_rest_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_tag_value( request, @@ -7175,6 +7250,7 @@ def test_update_tag_value_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tag_value_rest_bad_request( @@ -7253,10 +7329,13 @@ def test_delete_tag_value_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TagValuesRestInterceptor, "post_delete_tag_value" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_delete_tag_value_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_delete_tag_value" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tag_values.DeleteTagValueRequest.pb( tag_values.DeleteTagValueRequest() ) @@ -7280,6 +7359,7 @@ def test_delete_tag_value_rest_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_tag_value( request, @@ -7291,6 +7371,7 @@ def test_delete_tag_value_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -7372,10 +7453,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagValuesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -7397,6 +7481,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -7408,6 +7493,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -7489,10 +7575,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagValuesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -7514,6 +7603,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -7525,6 +7615,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -7604,10 +7695,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TagValuesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.TagValuesRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TagValuesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -7631,6 +7725,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -7642,6 +7740,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-run/README.rst b/packages/google-cloud-run/README.rst index 2faead2dd549..09fdb6e57db6 100644 --- a/packages/google-cloud-run/README.rst +++ b/packages/google-cloud-run/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Cloud Run.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Cloud Run.: https://cloud.google.com/run/docs -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-run/google/cloud/run/gapic_version.py b/packages/google-cloud-run/google/cloud/run/gapic_version.py index 7008b740153b..558c8aab67c5 100644 --- a/packages/google-cloud-run/google/cloud/run/gapic_version.py +++ b/packages/google-cloud-run/google/cloud/run/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-run/google/cloud/run_v2/gapic_version.py b/packages/google-cloud-run/google/cloud/run_v2/gapic_version.py index 7008b740153b..558c8aab67c5 100644 --- a/packages/google-cloud-run/google/cloud/run_v2/gapic_version.py +++ b/packages/google-cloud-run/google/cloud/run_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-run/noxfile.py b/packages/google-cloud-run/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-run/noxfile.py +++ b/packages/google-cloud-run/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-run/samples/generated_samples/snippet_metadata_google.cloud.run.v2.json b/packages/google-cloud-run/samples/generated_samples/snippet_metadata_google.cloud.run.v2.json index 564a70dc7866..91a10655bff1 100644 --- a/packages/google-cloud-run/samples/generated_samples/snippet_metadata_google.cloud.run.v2.json +++ b/packages/google-cloud-run/samples/generated_samples/snippet_metadata_google.cloud.run.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-run", - "version": "0.10.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-run/setup.py b/packages/google-cloud-run/setup.py index a110b1cbca4b..659aa7537c14 100644 --- a/packages/google-cloud-run/setup.py +++ b/packages/google-cloud-run/setup.py @@ -46,7 +46,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-run" diff --git a/packages/google-cloud-run/testing/constraints-3.7.txt b/packages/google-cloud-run/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-run/testing/constraints-3.7.txt +++ b/packages/google-cloud-run/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-secret-manager/README.rst b/packages/google-cloud-secret-manager/README.rst index 40a0e912bad0..55716fd5a20b 100644 --- a/packages/google-cloud-secret-manager/README.rst +++ b/packages/google-cloud-secret-manager/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Secret Manager.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Secret Manager.: https://cloud.google.com/secret-manager/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py index 411b87d337df..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.23.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py index 411b87d337df..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.23.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py index 411b87d337df..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.23.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py index 411b87d337df..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.23.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/noxfile.py b/packages/google-cloud-secret-manager/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-secret-manager/noxfile.py +++ b/packages/google-cloud-secret-manager/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json index 5850fce1d713..e75ffe273c93 100644 --- a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json +++ b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-secret-manager", - "version": "2.23.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json index 0a11bae7aef9..f2d2a2eaea8e 100644 --- a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json +++ b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-secretmanager", - "version": "2.23.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json index 692df783d6a4..cdba6a34a0ba 100644 --- a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json +++ b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-secretmanager", - "version": "2.23.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-secret-manager/setup.py b/packages/google-cloud-secret-manager/setup.py index 65f3dc2826a5..fcd0dabdd209 100644 --- a/packages/google-cloud-secret-manager/setup.py +++ b/packages/google-cloud-secret-manager/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-secret-manager" diff --git a/packages/google-cloud-secret-manager/testing/constraints-3.7.txt b/packages/google-cloud-secret-manager/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-secret-manager/testing/constraints-3.7.txt +++ b/packages/google-cloud-secret-manager/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-securesourcemanager/README.rst b/packages/google-cloud-securesourcemanager/README.rst index 7fa094107a63..a0e17518a3b0 100644 --- a/packages/google-cloud-securesourcemanager/README.rst +++ b/packages/google-cloud-securesourcemanager/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Secure Source Manager API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Secure Source Manager API.: https://cloud.google.com/secure-source-manager/docs/overview -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py index 7daf9a1dd221..558c8aab67c5 100644 --- a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py +++ b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.13" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py index 7daf9a1dd221..558c8aab67c5 100644 --- a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py +++ b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.13" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securesourcemanager/noxfile.py b/packages/google-cloud-securesourcemanager/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-securesourcemanager/noxfile.py +++ b/packages/google-cloud-securesourcemanager/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json b/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json index 965aa493cde5..61b28fdc2e03 100644 --- a/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json +++ b/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securesourcemanager", - "version": "0.1.13" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securesourcemanager/setup.py b/packages/google-cloud-securesourcemanager/setup.py index 79ffdc683040..0454983f07ba 100644 --- a/packages/google-cloud-securesourcemanager/setup.py +++ b/packages/google-cloud-securesourcemanager/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-securesourcemanager" diff --git a/packages/google-cloud-securesourcemanager/testing/constraints-3.7.txt b/packages/google-cloud-securesourcemanager/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-securesourcemanager/testing/constraints-3.7.txt +++ b/packages/google-cloud-securesourcemanager/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-securitycenter/README.rst b/packages/google-cloud-securitycenter/README.rst index af0c588c2fcc..947f0ced471e 100644 --- a/packages/google-cloud-securitycenter/README.rst +++ b/packages/google-cloud-securitycenter/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Google Cloud Security Command Center.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Google Cloud Security Command Center.: https://cloud.google.com/security-command-center -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py index 3026e41db675..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py index 3026e41db675..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py index 3026e41db675..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py index 3026e41db675..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py index 3026e41db675..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/noxfile.py b/packages/google-cloud-securitycenter/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-securitycenter/noxfile.py +++ b/packages/google-cloud-securitycenter/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json index 44c212ec6ce8..efb11fe5de6c 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.37.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json index 974d02cb150b..dc6a6d6dd78d 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.37.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json index 9ec27e16b8f1..7eed8e8dc8ab 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.37.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json index 8a3b13727fb0..e176e0b8c043 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.37.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/setup.py b/packages/google-cloud-securitycenter/setup.py index d6fdc50d0cc5..8ca5dbb9b581 100644 --- a/packages/google-cloud-securitycenter/setup.py +++ b/packages/google-cloud-securitycenter/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-securitycenter" diff --git a/packages/google-cloud-securitycenter/testing/constraints-3.7.txt b/packages/google-cloud-securitycenter/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-securitycenter/testing/constraints-3.7.txt +++ b/packages/google-cloud-securitycenter/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-securitycentermanagement/README.rst b/packages/google-cloud-securitycentermanagement/README.rst index 75b9aba90be0..46715c0c6133 100644 --- a/packages/google-cloud-securitycentermanagement/README.rst +++ b/packages/google-cloud-securitycentermanagement/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Security Center Management API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Security Center Management API.: https://cloud.google.com/securitycentermanagement/docs/overview -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py index ba2789011e90..558c8aab67c5 100644 --- a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py +++ b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.19" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py index ba2789011e90..558c8aab67c5 100644 --- a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py +++ b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.19" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycentermanagement/noxfile.py b/packages/google-cloud-securitycentermanagement/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-securitycentermanagement/noxfile.py +++ b/packages/google-cloud-securitycentermanagement/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json b/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json index 82bc77853286..aa268d46e53c 100644 --- a/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json +++ b/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycentermanagement", - "version": "0.1.19" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycentermanagement/setup.py b/packages/google-cloud-securitycentermanagement/setup.py index a372229d21c9..bf9c042e91de 100644 --- a/packages/google-cloud-securitycentermanagement/setup.py +++ b/packages/google-cloud-securitycentermanagement/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-securitycentermanagement" diff --git a/packages/google-cloud-securitycentermanagement/testing/constraints-3.7.txt b/packages/google-cloud-securitycentermanagement/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-securitycentermanagement/testing/constraints-3.7.txt +++ b/packages/google-cloud-securitycentermanagement/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-service-directory/README.rst b/packages/google-cloud-service-directory/README.rst index a3010fc55232..4e86c8d7b750 100644 --- a/packages/google-cloud-service-directory/README.rst +++ b/packages/google-cloud-service-directory/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Service Directory.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Service Directory.: https://cloud.google.com/service-directory/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-directory/noxfile.py b/packages/google-cloud-service-directory/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-service-directory/noxfile.py +++ b/packages/google-cloud-service-directory/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json index 26b66b5127a5..bb916a8e137a 100644 --- a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json +++ b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-directory", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json index 9d08342b3bdc..bbc7749e9905 100644 --- a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json +++ b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-directory", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-directory/setup.py b/packages/google-cloud-service-directory/setup.py index 38c563e3f54b..397e68b0b7ba 100644 --- a/packages/google-cloud-service-directory/setup.py +++ b/packages/google-cloud-service-directory/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-service-directory" diff --git a/packages/google-cloud-service-directory/testing/constraints-3.7.txt b/packages/google-cloud-service-directory/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-service-directory/testing/constraints-3.7.txt +++ b/packages/google-cloud-service-directory/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-service-management/README.rst b/packages/google-cloud-service-management/README.rst index fb364280c9c1..7fea5f070a99 100644 --- a/packages/google-cloud-service-management/README.rst +++ b/packages/google-cloud-service-management/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Service Management.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Service Management.: https://cloud.google.com/service-infrastructure/docs/overview/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-service-management/google/cloud/servicemanagement/gapic_version.py b/packages/google-cloud-service-management/google/cloud/servicemanagement/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-service-management/google/cloud/servicemanagement/gapic_version.py +++ b/packages/google-cloud-service-management/google/cloud/servicemanagement/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.13.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-management/google/cloud/servicemanagement_v1/gapic_version.py b/packages/google-cloud-service-management/google/cloud/servicemanagement_v1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-service-management/google/cloud/servicemanagement_v1/gapic_version.py +++ b/packages/google-cloud-service-management/google/cloud/servicemanagement_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.13.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-management/noxfile.py b/packages/google-cloud-service-management/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-service-management/noxfile.py +++ b/packages/google-cloud-service-management/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-service-management/samples/generated_samples/snippet_metadata_google.api.servicemanagement.v1.json b/packages/google-cloud-service-management/samples/generated_samples/snippet_metadata_google.api.servicemanagement.v1.json index e804c8c73812..fb37827cecec 100644 --- a/packages/google-cloud-service-management/samples/generated_samples/snippet_metadata_google.api.servicemanagement.v1.json +++ b/packages/google-cloud-service-management/samples/generated_samples/snippet_metadata_google.api.servicemanagement.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-management", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-management/setup.py b/packages/google-cloud-service-management/setup.py index 163edfbbd2b4..eb917ce9f7c5 100644 --- a/packages/google-cloud-service-management/setup.py +++ b/packages/google-cloud-service-management/setup.py @@ -48,7 +48,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-service-management" diff --git a/packages/google-cloud-service-management/testing/constraints-3.7.txt b/packages/google-cloud-service-management/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-service-management/testing/constraints-3.7.txt +++ b/packages/google-cloud-service-management/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-service-management/tests/unit/gapic/servicemanagement_v1/test_service_manager.py b/packages/google-cloud-service-management/tests/unit/gapic/servicemanagement_v1/test_service_manager.py index f90a335534cc..8fc2f71c2ccc 100644 --- a/packages/google-cloud-service-management/tests/unit/gapic/servicemanagement_v1/test_service_manager.py +++ b/packages/google-cloud-service-management/tests/unit/gapic/servicemanagement_v1/test_service_manager.py @@ -10787,6 +10787,7 @@ def test_create_service_config_rest_call_success(request_type): "experimental_features": { "rest_async_io_enabled": True, "protobuf_pythonic_types_enabled": True, + "unversioned_package_disabled": True, }, }, "node_settings": {"common": {}}, diff --git a/packages/google-cloud-tasks/README.rst b/packages/google-cloud-tasks/README.rst index c104f1d386df..ee8c1e6b3cdf 100644 --- a/packages/google-cloud-tasks/README.rst +++ b/packages/google-cloud-tasks/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Cloud Tasks.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Cloud Tasks.: https://cloud.google.com/tasks/docs/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/noxfile.py b/packages/google-cloud-tasks/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-tasks/noxfile.py +++ b/packages/google-cloud-tasks/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json index 657f83e1c1d0..a40f846fdcce 100644 --- a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json +++ b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tasks", - "version": "2.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json index 8d6c089251da..2b3fcc2324d1 100644 --- a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json +++ b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tasks", - "version": "2.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json index 74cdfab33943..c3812fadd698 100644 --- a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json +++ b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tasks", - "version": "2.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tasks/setup.py b/packages/google-cloud-tasks/setup.py index 6b238b4edf74..9e5d18b88912 100644 --- a/packages/google-cloud-tasks/setup.py +++ b/packages/google-cloud-tasks/setup.py @@ -46,7 +46,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-tasks" diff --git a/packages/google-cloud-tasks/testing/constraints-3.7.txt b/packages/google-cloud-tasks/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-tasks/testing/constraints-3.7.txt +++ b/packages/google-cloud-tasks/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-translate/README.rst b/packages/google-cloud-translate/README.rst index c8a652c6289e..51cc8497ca60 100644 --- a/packages/google-cloud-translate/README.rst +++ b/packages/google-cloud-translate/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Cloud Translation.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Cloud Translation.: https://cloud.google.com/translate/docs/ -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-translate/google/cloud/translate/gapic_version.py b/packages/google-cloud-translate/google/cloud/translate/gapic_version.py index c3ababdf3b1a..558c8aab67c5 100644 --- a/packages/google-cloud-translate/google/cloud/translate/gapic_version.py +++ b/packages/google-cloud-translate/google/cloud/translate/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.20.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-translate/google/cloud/translate_v3/gapic_version.py b/packages/google-cloud-translate/google/cloud/translate_v3/gapic_version.py index c3ababdf3b1a..558c8aab67c5 100644 --- a/packages/google-cloud-translate/google/cloud/translate_v3/gapic_version.py +++ b/packages/google-cloud-translate/google/cloud/translate_v3/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.20.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-translate/google/cloud/translate_v3beta1/gapic_version.py b/packages/google-cloud-translate/google/cloud/translate_v3beta1/gapic_version.py index c3ababdf3b1a..558c8aab67c5 100644 --- a/packages/google-cloud-translate/google/cloud/translate_v3beta1/gapic_version.py +++ b/packages/google-cloud-translate/google/cloud/translate_v3beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.20.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-translate/noxfile.py b/packages/google-cloud-translate/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-translate/noxfile.py +++ b/packages/google-cloud-translate/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3.json b/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3.json index d8f81b5c92f2..de406536e428 100644 --- a/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3.json +++ b/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-translate", - "version": "3.20.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3beta1.json b/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3beta1.json index 295b93fbc1db..74f2e4c9def9 100644 --- a/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3beta1.json +++ b/packages/google-cloud-translate/samples/generated_samples/snippet_metadata_google.cloud.translation.v3beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-translate", - "version": "3.20.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-translate/setup.py b/packages/google-cloud-translate/setup.py index 6b316e21b7a0..367fda9a8894 100644 --- a/packages/google-cloud-translate/setup.py +++ b/packages/google-cloud-translate/setup.py @@ -47,7 +47,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-translate" diff --git a/packages/google-cloud-translate/testing/constraints-3.7.txt b/packages/google-cloud-translate/testing/constraints-3.7.txt index 6ef964d6f0d7..557202a78088 100644 --- a/packages/google-cloud-translate/testing/constraints-3.7.txt +++ b/packages/google-cloud-translate/testing/constraints-3.7.txt @@ -9,4 +9,4 @@ google-auth==2.14.1 proto-plus==1.22.3 google-cloud-core==1.4.4 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0 diff --git a/packages/google-cloud-visionai/README.rst b/packages/google-cloud-visionai/README.rst index 50d8bde3dd97..1ad00d55d4fd 100644 --- a/packages/google-cloud-visionai/README.rst +++ b/packages/google-cloud-visionai/README.rst @@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps: 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Vision AI API.`_ -4. `Setup Authentication.`_ +4. `Set up Authentication.`_ .. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project .. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project .. _Enable the Vision AI API.: https://cloud.google.com/vision-ai/docs -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ diff --git a/packages/google-cloud-visionai/google/cloud/visionai/gapic_version.py b/packages/google-cloud-visionai/google/cloud/visionai/gapic_version.py index cf5493b86bbc..558c8aab67c5 100644 --- a/packages/google-cloud-visionai/google/cloud/visionai/gapic_version.py +++ b/packages/google-cloud-visionai/google/cloud/visionai/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-visionai/google/cloud/visionai_v1/gapic_version.py b/packages/google-cloud-visionai/google/cloud/visionai_v1/gapic_version.py index cf5493b86bbc..558c8aab67c5 100644 --- a/packages/google-cloud-visionai/google/cloud/visionai_v1/gapic_version.py +++ b/packages/google-cloud-visionai/google/cloud/visionai_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-visionai/google/cloud/visionai_v1alpha1/gapic_version.py b/packages/google-cloud-visionai/google/cloud/visionai_v1alpha1/gapic_version.py index cf5493b86bbc..558c8aab67c5 100644 --- a/packages/google-cloud-visionai/google/cloud/visionai_v1alpha1/gapic_version.py +++ b/packages/google-cloud-visionai/google/cloud/visionai_v1alpha1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.7" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-visionai/noxfile.py b/packages/google-cloud-visionai/noxfile.py index a9ceef47133c..0acc836b384e 100644 --- a/packages/google-cloud-visionai/noxfile.py +++ b/packages/google-cloud-visionai/noxfile.py @@ -382,20 +382,29 @@ def docfx(session): ["python", "upb", "cpp"], ) def prerelease_deps(session, protobuf_implementation): - """Run all tests with prerelease versions of dependencies installed.""" + """ + Run all tests with pre-release versions of dependencies installed + rather than the standard non pre-release versions. + Pre-releases versions can be installed using + `pip install --pre `. + """ if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies - session.install("-e", ".[all, tests, tracing]") + session.install("-e", ".") + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + # Install dependencies for the unit test environment session.install(*unit_deps_all) + system_deps_all = ( SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + SYSTEM_TEST_EXTRAS ) + # Install dependencies for the system test environment session.install(*system_deps_all) # Because we test minimum dependency versions on the minimum Python @@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation): ) ] + # Install dependencies specified in `testing/constraints-X.txt`. session.install(*constraints_deps) prerel_deps = [ @@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation): "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, }, ) + + +@nox.session(python="3.13") +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def core_deps_from_source(session, protobuf_implementation): + """Run all tests with local versions of core dependencies installed, + rather than pulling core dependencies from PyPI. + """ + + # Install all dependencies + session.install(".") + + # Install dependencies for the unit test environment + unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES + session.install(*unit_deps_all) + + # Install dependencies for the system test environment + system_deps_all = ( + SYSTEM_TEST_STANDARD_DEPENDENCIES + + SYSTEM_TEST_EXTERNAL_DEPENDENCIES + + SYSTEM_TEST_EXTRAS + ) + session.install(*system_deps_all) + + # Because we test minimum dependency versions on the minimum Python + # version, the first version we test with in the unit tests sessions has a + # constraints file containing all dependencies and extras that should be installed. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + # Install dependencies specified in `testing/constraints-X.txt`. + session.install(*constraints_deps) + + core_dependencies_from_source = [ + "google-api-core @ git+https://github.com/googleapis/python-api-core.git", + "google-auth @ git+https://github.com/googleapis/google-auth-library-python.git", + f"{CURRENT_DIRECTORY}/../googleapis-common-protos", + f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1", + "proto-plus @ git+https://github.com/googleapis/proto-plus-python.git", + ] + + for dep in core_dependencies_from_source: + session.install(dep, "--ignore-installed", "--no-deps") + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1.json b/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1.json index 591c6f900c16..55144efe90c6 100644 --- a/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1.json +++ b/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-visionai", - "version": "0.1.7" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1alpha1.json b/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1alpha1.json index e1e9280c3fa8..11704c120259 100644 --- a/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1alpha1.json +++ b/packages/google-cloud-visionai/samples/generated_samples/snippet_metadata_google.cloud.visionai.v1alpha1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-visionai", - "version": "0.1.7" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-visionai/setup.py b/packages/google-cloud-visionai/setup.py index 42d46fd11a71..1486c4a2c695 100644 --- a/packages/google-cloud-visionai/setup.py +++ b/packages/google-cloud-visionai/setup.py @@ -46,7 +46,7 @@ "proto-plus >= 1.22.3, <2.0.0dev", "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0dev", ] extras = {} url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-visionai" diff --git a/packages/google-cloud-visionai/testing/constraints-3.7.txt b/packages/google-cloud-visionai/testing/constraints-3.7.txt index a81fb6bcd05c..fb7e93a1b473 100644 --- a/packages/google-cloud-visionai/testing/constraints-3.7.txt +++ b/packages/google-cloud-visionai/testing/constraints-3.7.txt @@ -8,4 +8,4 @@ google-api-core==1.34.1 google-auth==2.14.1 proto-plus==1.22.3 protobuf==3.20.2 -grpc-google-iam-v1==0.12.4 +grpc-google-iam-v1==0.14.0