From fd5645be008eb085a847af6eb7fc7f716d6eea9e Mon Sep 17 00:00:00 2001 From: Aaron Gabriel Neyer Date: Tue, 1 Feb 2022 14:55:09 -0700 Subject: [PATCH 001/509] cleanup: add turbo rep samples and fix spacing on fileio samples (#708) * cleanup: add turbo rep samples and fix spacing on fileio samples * fix links * woops, missed that --- samples/README.md | 45 ++++++++++++++++++- .../storage_create_bucket_location.py | 45 +++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 samples/snippets/storage_create_bucket_location.py diff --git a/samples/README.md b/samples/README.md index 2751bf722..fbbc45aa2 100644 --- a/samples/README.md +++ b/samples/README.md @@ -64,6 +64,7 @@ for more detailed instructions. * [Create Bucket](#create-bucket) * [Create Bucket Class Location](#create-bucket-class-location) * [Create Bucket Notifications](#create-bucket-notifications) +* [Create Bucket Turbo Replication](#create-bucket-turbo-replication) * [Create HMAC Key](#create-hmac-key) * [Deactivate HMAC Key](#deactivate-hmac-key) * [Define Bucket Website Configuration](#define-bucket-website-configuration) @@ -88,8 +89,8 @@ for more detailed instructions. * [Enable Requester Pays](#enable-requester-pays) * [Enable Uniform Bucket Level Access](#enable-uniform-bucket-level-access) * [Enable Versioning](#enable-versioning) -* [FileIO Write-Read] (#fileio-write-read) -* [FileIO Pandas] (#fileio-pandas) +* [FileIO Write-Read](#fileio-write-read) +* [FileIO Pandas](#fileio-pandas) * [Generate Encryption Key](#generate-encryption-key) * [Generate Signed Post Policy V4](#generate-signed-post-policy-v4) * [Generate Signed Url V2](#generate-signed-url-v2) @@ -103,6 +104,7 @@ for more detailed instructions. * [Get Public Access Prevention](#get-public-access-prevention) * [Get Requester Pays Status](#get-requester-pays-status) * [Get Retention Policy](#get-retention-policy) +* [Get RPO](#get-rpo) * [Get Service Account](#get-service-account) * [Get Uniform Bucket Level Access](#get-uniform-bucket-level-access) * [List Buckets](#list-buckets) @@ -139,6 +141,8 @@ for more detailed instructions. * [Set Metadata](#set-metadata) * [Set Public Access Prevention Enforced](#set-public-access-prevention-enforced) * [Set Public Access Prevention Inherited](#set-public-access-prevention-inherited) +* [Set RPO Async Turbo](#set-rpo-async-turbo) +* [Set RPO Default](#set-rpo-default) * [Set Retention Policy](#set-retention-policy) * [Set Temporary Hold](#set-temporary-hold) * [Upload Encrypted File](#upload-encrypted-file) @@ -321,6 +325,15 @@ View the [source code](https://github.com/googleapis/python-storage/blob/main/sa `python storage_create_bucket_notifications.py ` +----- +### Create Bucket Turbo Replication +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_create_bucket_turbo_replication.py,samples/README.md) + +View the [source code](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_create_bucket_turbo_replication.py). To run this sample: + + +`python storage_create_bucket_turbo_replication.py ` + ----- ### Create HMAC Key [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_create_hmac_key.py,samples/README.md) @@ -672,6 +685,15 @@ View the [source code](https://github.com/googleapis/python-storage/blob/main/sa `python storage_get_retention_policy.py ` +----- +### Get RPO +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_get_rpo.py,samples/README.md) + +View the [source code](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_get_rpo.py). To run this sample: + + +`python storage_get_rpo.py ` + ----- ### Get Service Account [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_get_service_account.py,samples/README.md) @@ -1005,6 +1027,25 @@ View the [source code](https://github.com/googleapis/python-storage/blob/main/sa `python storage_set_retention_policy.py ` + +----- +### Set RPO Async Turbo +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_set_rpo_async_turbo.py,samples/README.md) + +View the [source code](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_set_rpo_async_turbo.py). To run this sample: + + +`python storage_set_rpo_async_turbo.py ` + +----- +### Set RPO Default +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_set_rpo_default.py,samples/README.md) + +View the [source code](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_set_rpo_default.py). To run this sample: + + +`python storage_set_rpo_default.py ` + ----- ### Set Temporary Hold [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_set_temporary_hold.py,samples/README.md) diff --git a/samples/snippets/storage_create_bucket_location.py b/samples/snippets/storage_create_bucket_location.py new file mode 100644 index 000000000..c94894a5b --- /dev/null +++ b/samples/snippets/storage_create_bucket_location.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +"""Sample that creates a new bucket in a specified region +""" + +# [START storage_create_bucket_location] + +from google.cloud import storage + + +def create_bucket_location(bucket_name, bucket_location): + """Creates bucket in specified region.""" + # The ID of your GCS bucket + # bucket_name = "my-bucket" + # bucket_location = 'us-west1' # region + # bucket_location = 'nam4' # dual-region + # bucket_location = 'us' #multi-region + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + bucket.create(location=bucket_location) + + print(f"{bucket.name} created in {bucket.location}.") + + +# [END storage_create_bucket_location] + +if __name__ == "__main__": + create_bucket_location(bucket_name=sys.argv[1], bucket_location=sys.argv[2]) From 126d94c638433f8248a19171f05c53e00f9d810e Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 2 Feb 2022 16:30:57 -0800 Subject: [PATCH 002/509] samples: Add snippets for upload/download from file-like object/stream (#709) * samples: Add snippets for upload/download from file-like object/stream * change sample region tags to be uniform with other libraries * lint --- samples/snippets/snippets_test.py | 28 ++++++++++ .../snippets/storage_download_to_stream.py | 50 ++++++++++++++++++ .../snippets/storage_upload_from_memory.py | 7 ++- .../snippets/storage_upload_from_stream.py | 52 +++++++++++++++++++ 4 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 samples/snippets/storage_download_to_stream.py create mode 100644 samples/snippets/storage_upload_from_stream.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 28b35340b..9f1f444af 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -13,6 +13,7 @@ # limitations under the License. import asyncio +import io import os import tempfile import time @@ -44,6 +45,7 @@ import storage_download_file import storage_download_into_memory import storage_download_public_file +import storage_download_to_stream import storage_enable_bucket_lifecycle_management import storage_enable_versioning import storage_generate_signed_post_policy_v4 @@ -68,6 +70,7 @@ import storage_set_metadata import storage_upload_file import storage_upload_from_memory +import storage_upload_from_stream import storage_upload_with_kms_key KMS_KEY = os.environ["CLOUD_KMS_KEY"] @@ -204,6 +207,17 @@ def test_upload_blob_from_memory(test_bucket, capsys): assert "Hello, is it me you're looking for?" in out +def test_upload_blob_from_stream(test_bucket, capsys): + file_obj = io.StringIO() + file_obj.write("This is test data.") + storage_upload_from_stream.upload_blob_from_stream( + test_bucket.name, file_obj, "test_upload_blob" + ) + out, _ = capsys.readouterr() + + assert "Stream data uploaded to {}".format("test_upload_blob") in out + + def test_upload_blob_with_kms(test_bucket): with tempfile.NamedTemporaryFile() as source_file: source_file.write(b"test") @@ -247,6 +261,20 @@ def test_download_blob_into_memory(test_blob, capsys): assert "Hello, is it me you're looking for?" in out +def test_download_blob_to_stream(test_blob, capsys): + file_obj = io.BytesIO() + storage_download_to_stream.download_blob_to_stream( + test_blob.bucket.name, test_blob.name, file_obj + ) + out, _ = capsys.readouterr() + + file_obj.seek(0) + content = file_obj.read() + + assert "Downloaded blob" in out + assert b"Hello, is it me you're looking for?" in content + + def test_blob_metadata(test_blob, capsys): storage_get_metadata.blob_metadata(test_blob.bucket.name, test_blob.name) out, _ = capsys.readouterr() diff --git a/samples/snippets/storage_download_to_stream.py b/samples/snippets/storage_download_to_stream.py new file mode 100644 index 000000000..1cb8dcc7b --- /dev/null +++ b/samples/snippets/storage_download_to_stream.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_stream_file_download] +from google.cloud import storage + + +def download_blob_to_stream(bucket_name, source_blob_name, file_obj): + """Downloads a blob to a stream or other file-like object.""" + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The ID of your GCS object (blob) + # source_blob_name = "storage-object-name" + + # The stream or file (file-like object) to which the blob will be written + # import io + # file_obj = io.BytesIO() + + storage_client = storage.Client() + + bucket = storage_client.bucket(bucket_name) + + # Construct a client-side representation of a blob. + # Note `Bucket.blob` differs from `Bucket.get_blob` in that it doesn't + # retrieve metadata from Google Cloud Storage. As we don't use metadata in + # this example, using `Bucket.blob` is preferred here. + blob = bucket.blob(source_blob_name) + blob.download_to_file(file_obj) + + print("Downloaded blob {} to file-like object.".format(source_blob_name)) + + return file_obj + # Before reading from file_obj, remember to rewind with file_obj.seek(0). + +# [END storage_stream_file_download] diff --git a/samples/snippets/storage_upload_from_memory.py b/samples/snippets/storage_upload_from_memory.py index e5f61ff93..ee8a9828c 100644 --- a/samples/snippets/storage_upload_from_memory.py +++ b/samples/snippets/storage_upload_from_memory.py @@ -22,10 +22,13 @@ def upload_blob_from_memory(bucket_name, contents, destination_blob_name): """Uploads a file to the bucket.""" + # The ID of your GCS bucket # bucket_name = "your-bucket-name" + # The contents to upload to the file # contents = "these are my contents" + # The ID of your GCS object # destination_blob_name = "storage-object-name" @@ -37,13 +40,13 @@ def upload_blob_from_memory(bucket_name, contents, destination_blob_name): print( "{} with contents {} uploaded to {}.".format( - destination_blob_name, contents, destination_blob_name + destination_blob_name, contents, bucket_name ) ) - # [END storage_file_upload_from_memory] + if __name__ == "__main__": upload_blob_from_memory( bucket_name=sys.argv[1], diff --git a/samples/snippets/storage_upload_from_stream.py b/samples/snippets/storage_upload_from_stream.py new file mode 100644 index 000000000..d43365e08 --- /dev/null +++ b/samples/snippets/storage_upload_from_stream.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_stream_file_upload] +from google.cloud import storage + + +def upload_blob_from_stream(bucket_name, file_obj, destination_blob_name): + """Uploads bytes from a stream or other file-like object to a blob.""" + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The stream or file (file-like object) from which to read + # import io + # file_obj = io.StringIO() + # file_obj.write("This is test data.") + + # The desired name of the uploaded GCS object (blob) + # destination_blob_name = "storage-object-name" + + # Construct a client-side representation of the blob. + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(destination_blob_name) + + # Rewind the stream to the beginning. This step can be omitted if the input + # stream will always be at a correct position. + file_obj.seek(0) + + # Upload data from the stream to your bucket. + blob.upload_from_file(file_obj) + + print( + "Stream data uploaded to {} in bucket {}.".format( + destination_blob_name, bucket_name + ) + ) + +# [END storage_stream_file_upload] From bcde0ec619d7d303892bcc0863b7f977c79f7649 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 3 Feb 2022 16:41:34 -0800 Subject: [PATCH 003/509] feat: allow no project in client methods using storage emulator (#703) * feat: allow no project in client methods using storage emulator and remove client side validation * changes from comments --- google/cloud/storage/_helpers.py | 6 +- google/cloud/storage/client.py | 34 ++++-- tests/unit/test_client.py | 202 ++++++++++++++++++++++++++++--- 3 files changed, 217 insertions(+), 25 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index c3b104edd..5be46832b 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -32,7 +32,11 @@ STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" """Environment variable defining host for Storage emulator.""" -_DEFAULT_STORAGE_HOST = u"https://storage.googleapis.com" +_DEFAULT_STORAGE_HOST = "https://storage.googleapis.com" +"""Default storage host for JSON API.""" + +_BASE_STORAGE_URI = "storage.googleapis.com" +"""Base request endpoint URI for JSON API.""" # etag match parameters in snake case and equivalent header _ETAG_MATCH_PARAMETERS = ( diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index a62ed711f..76fa1a9cf 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -33,6 +33,7 @@ from google.cloud.exceptions import NotFound from google.cloud.storage._helpers import _get_environ_project from google.cloud.storage._helpers import _get_storage_host +from google.cloud.storage._helpers import _BASE_STORAGE_URI from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _add_etag_match_headers @@ -146,7 +147,7 @@ def __init__( # STORAGE_EMULATOR_HOST or a non-default api_endpoint is set. if ( kw_args["api_endpoint"] is not None - and kw_args["api_endpoint"].find("storage.googleapis.com") < 0 + and _BASE_STORAGE_URI not in kw_args["api_endpoint"] ): if credentials is None: credentials = AnonymousCredentials() @@ -932,12 +933,22 @@ def create_bucket( """ bucket = self._bucket_arg_to_bucket(bucket_or_name) + query_params = {} if project is None: project = self.project - if project is None: - raise ValueError("Client project not set: pass an explicit project.") + # Use no project if STORAGE_EMULATOR_HOST is set + if _BASE_STORAGE_URI not in _get_storage_host(): + if project is None: + project = _get_environ_project() + if project is None: + project = "" + + # Only include the project parameter if a project is set. + # If a project is not set, falls back to API validation (BadRequest). + if project is not None: + query_params = {"project": project} if requester_pays is not None: warnings.warn( @@ -947,8 +958,6 @@ def create_bucket( ) bucket.requester_pays = requester_pays - query_params = {"project": project} - if predefined_acl is not None: predefined_acl = BucketACL.validate_predefined(predefined_acl) query_params["predefinedAcl"] = predefined_acl @@ -1375,13 +1384,22 @@ def list_buckets( :returns: Iterator of all :class:`~google.cloud.storage.bucket.Bucket` belonging to this project. """ + extra_params = {} + if project is None: project = self.project - if project is None: - raise ValueError("Client project not set: pass an explicit project.") + # Use no project if STORAGE_EMULATOR_HOST is set + if _BASE_STORAGE_URI not in _get_storage_host(): + if project is None: + project = _get_environ_project() + if project is None: + project = "" - extra_params = {"project": project} + # Only include the project parameter if a project is set. + # If a project is not set, falls back to API validation (BadRequest). + if project is not None: + extra_params = {"project": project} if prefix is not None: extra_params["prefix"] = prefix diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 2f76041bd..52a1bea44 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -23,15 +23,15 @@ import unittest import urllib - from google.api_core import exceptions - +from google.auth.credentials import AnonymousCredentials from google.oauth2.service_account import Credentials -from . import _read_local_json +from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED +from . import _read_local_json _SERVICE_ACCOUNT_JSON = _read_local_json("url_signer_v4_test_account.json") _CONFORMANCE_TESTS = _read_local_json("url_signer_v4_test_data.json")[ @@ -237,9 +237,6 @@ def test_ctor_mtls(self): self.assertEqual(client._connection.API_BASE_URL, "http://foo") def test_ctor_w_emulator_wo_project(self): - from google.auth.credentials import AnonymousCredentials - from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR - # avoids authentication if STORAGE_EMULATOR_ENV_VAR is set host = "http://localhost:8080" environ = {STORAGE_EMULATOR_ENV_VAR: host} @@ -259,9 +256,6 @@ def test_ctor_w_emulator_wo_project(self): self.assertIsInstance(client._connection.credentials, AnonymousCredentials) def test_ctor_w_emulator_w_environ_project(self): - from google.auth.credentials import AnonymousCredentials - from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR - # avoids authentication and infers the project from the environment host = "http://localhost:8080" environ_project = "environ-project" @@ -277,9 +271,6 @@ def test_ctor_w_emulator_w_environ_project(self): self.assertIsInstance(client._connection.credentials, AnonymousCredentials) def test_ctor_w_emulator_w_project_arg(self): - from google.auth.credentials import AnonymousCredentials - from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR - # project argument overrides project set in the enviroment host = "http://localhost:8080" environ_project = "environ-project" @@ -296,7 +287,6 @@ def test_ctor_w_emulator_w_project_arg(self): self.assertIsInstance(client._connection.credentials, AnonymousCredentials) def test_create_anonymous_client(self): - from google.auth.credentials import AnonymousCredentials from google.cloud.storage._http import Connection klass = self._get_target_class() @@ -1187,11 +1177,91 @@ def test_lookup_bucket_hit_w_retry(self): ) def test_create_bucket_w_missing_client_project(self): + from google.cloud.exceptions import BadRequest + credentials = _make_credentials() client = self._make_one(project=None, credentials=credentials) - with self.assertRaises(ValueError): - client.create_bucket("bucket") + client._post_resource = mock.Mock() + client._post_resource.side_effect = BadRequest("Required parameter: project") + + bucket_name = "bucket-name" + + with self.assertRaises(BadRequest): + client.create_bucket(bucket_name) + + expected_path = "/b" + expected_data = {"name": bucket_name} + # no required parameter: project + expected_query_params = {} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=mock.ANY, + ) + + def test_create_bucket_w_missing_client_project_w_emulator(self): + # mock STORAGE_EMULATOR_ENV_VAR is set + host = "http://localhost:8080" + environ = {STORAGE_EMULATOR_ENV_VAR: host} + with mock.patch("os.environ", environ): + client = self._make_one() + + bucket_name = "bucket-name" + api_response = {"name": bucket_name} + client._post_resource = mock.Mock() + client._post_resource.return_value = api_response + + # mock STORAGE_EMULATOR_ENV_VAR is set + with mock.patch("os.environ", environ): + bucket = client.create_bucket(bucket_name) + + expected_path = "/b" + expected_data = api_response + expected_query_params = {"project": ""} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=bucket, + ) + + def test_create_bucket_w_environ_project_w_emulator(self): + # mock STORAGE_EMULATOR_ENV_VAR is set + host = "http://localhost:8080" + environ_project = "environ-project" + environ = { + STORAGE_EMULATOR_ENV_VAR: host, + "GOOGLE_CLOUD_PROJECT": environ_project, + } + with mock.patch("os.environ", environ): + client = self._make_one() + + bucket_name = "bucket-name" + api_response = {"name": bucket_name} + client._post_resource = mock.Mock() + client._post_resource.return_value = api_response + + # mock STORAGE_EMULATOR_ENV_VAR is set + with mock.patch("os.environ", environ): + bucket = client.create_bucket(bucket_name) + + expected_path = "/b" + expected_data = api_response + expected_query_params = {"project": environ_project} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=bucket, + ) def test_create_bucket_w_conflict_w_user_project(self): from google.cloud.exceptions import Conflict @@ -1787,12 +1857,112 @@ def test_list_blobs_w_explicit_w_user_project(self): ) def test_list_buckets_wo_project(self): + from google.cloud.exceptions import BadRequest + from google.cloud.storage.client import _item_to_bucket + credentials = _make_credentials() client = self._make_one(project=None, credentials=credentials) - with self.assertRaises(ValueError): + client._list_resource = mock.Mock() + client._list_resource.side_effect = BadRequest("Required parameter: project") + + with self.assertRaises(BadRequest): client.list_buckets() + expected_path = "/b" + expected_item_to_value = _item_to_bucket + expected_page_token = None + expected_max_results = None + expected_page_size = None + # no required parameter: project + expected_extra_params = { + "projection": "noAcl", + } + client._list_resource.assert_called_once_with( + expected_path, + expected_item_to_value, + page_token=expected_page_token, + max_results=expected_max_results, + extra_params=expected_extra_params, + page_size=expected_page_size, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + ) + + def test_list_buckets_wo_project_w_emulator(self): + from google.cloud.storage.client import _item_to_bucket + + # mock STORAGE_EMULATOR_ENV_VAR is set + host = "http://localhost:8080" + environ = {STORAGE_EMULATOR_ENV_VAR: host} + with mock.patch("os.environ", environ): + client = self._make_one() + + client._list_resource = mock.Mock(spec=[]) + + # mock STORAGE_EMULATOR_ENV_VAR is set + with mock.patch("os.environ", environ): + client.list_buckets() + + expected_path = "/b" + expected_item_to_value = _item_to_bucket + expected_page_token = None + expected_max_results = None + expected_page_size = None + expected_extra_params = { + "project": "", + "projection": "noAcl", + } + client._list_resource.assert_called_once_with( + expected_path, + expected_item_to_value, + page_token=expected_page_token, + max_results=expected_max_results, + extra_params=expected_extra_params, + page_size=expected_page_size, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + ) + + def test_list_buckets_w_environ_project_w_emulator(self): + from google.cloud.storage.client import _item_to_bucket + + # mock STORAGE_EMULATOR_ENV_VAR is set + host = "http://localhost:8080" + environ_project = "environ-project" + environ = { + STORAGE_EMULATOR_ENV_VAR: host, + "GOOGLE_CLOUD_PROJECT": environ_project, + } + with mock.patch("os.environ", environ): + client = self._make_one() + + client._list_resource = mock.Mock(spec=[]) + + # mock STORAGE_EMULATOR_ENV_VAR is set + with mock.patch("os.environ", environ): + client.list_buckets() + + expected_path = "/b" + expected_item_to_value = _item_to_bucket + expected_page_token = None + expected_max_results = None + expected_page_size = None + expected_extra_params = { + "project": environ_project, + "projection": "noAcl", + } + client._list_resource.assert_called_once_with( + expected_path, + expected_item_to_value, + page_token=expected_page_token, + max_results=expected_max_results, + extra_params=expected_extra_params, + page_size=expected_page_size, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + ) + def test_list_buckets_w_defaults(self): from google.cloud.storage.client import _item_to_bucket From 9f534fa4a3d508d729066254e7d730361afb83b0 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 7 Feb 2022 17:15:02 +0100 Subject: [PATCH 004/509] chore(deps): update dependency pytest to v7 (#711) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 0a7557580..15deafb7b 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==6.2.5 +pytest==7.0.0 mock==4.0.3 backoff==1.11.1 \ No newline at end of file From cc58283d0fd1775fb921d6ddda46803af581a821 Mon Sep 17 00:00:00 2001 From: Aaron Gabriel Neyer Date: Wed, 9 Feb 2022 17:16:23 -0700 Subject: [PATCH 005/509] samples: add endpoint sample (#710) * samples: add endpoint sample * lint * properly check endpoint from client --- samples/snippets/snippets_test.py | 8 +++++++ ...tion.py => storage_set_client_endpoint.py} | 24 ++++++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) rename samples/snippets/{storage_create_bucket_location.py => storage_set_client_endpoint.py} (53%) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 9f1f444af..581134102 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -67,6 +67,7 @@ import storage_remove_cors_configuration import storage_rename_file import storage_set_bucket_default_kms_key +import storage_set_client_endpoint import storage_set_metadata import storage_upload_file import storage_upload_from_memory @@ -589,3 +590,10 @@ def test_batch_request(test_bucket): assert blob1.metadata.get("your-metadata-key") == "your-metadata-value" assert blob2.metadata.get("your-metadata-key") == "your-metadata-value" + + +def test_storage_set_client_endpoint(capsys): + storage_set_client_endpoint.set_client_endpoint('https://storage.googleapis.com') + out, _ = capsys.readouterr() + + assert "client initiated with endpoint: https://storage.googleapis.com" in out diff --git a/samples/snippets/storage_create_bucket_location.py b/samples/snippets/storage_set_client_endpoint.py similarity index 53% rename from samples/snippets/storage_create_bucket_location.py rename to samples/snippets/storage_set_client_endpoint.py index c94894a5b..99ca283a1 100644 --- a/samples/snippets/storage_create_bucket_location.py +++ b/samples/snippets/storage_set_client_endpoint.py @@ -19,27 +19,23 @@ """Sample that creates a new bucket in a specified region """ -# [START storage_create_bucket_location] +# [START storage_set_client_endpoint] from google.cloud import storage -def create_bucket_location(bucket_name, bucket_location): - """Creates bucket in specified region.""" - # The ID of your GCS bucket - # bucket_name = "my-bucket" - # bucket_location = 'us-west1' # region - # bucket_location = 'nam4' # dual-region - # bucket_location = 'us' #multi-region +def set_client_endpoint(api_endpoint): + """Initiates client with specified endpoint.""" + # api_endpoint = 'https://storage.googleapis.com' - storage_client = storage.Client() - bucket = storage_client.bucket(bucket_name) - bucket.create(location=bucket_location) + storage_client = storage.Client(client_options={'api_endpoint': api_endpoint}) - print(f"{bucket.name} created in {bucket.location}.") + print(f"client initiated with endpoint: {storage_client._connection.API_BASE_URL}") + return storage_client -# [END storage_create_bucket_location] + +# [END storage_set_client_endpoint] if __name__ == "__main__": - create_bucket_location(bucket_name=sys.argv[1], bucket_location=sys.argv[2]) + set_client_endpoint(api_endpoint=sys.argv[1]) From d72a9de5adc260ed9b8e52f42475c944c1ba2543 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 11 Feb 2022 23:59:35 +0100 Subject: [PATCH 006/509] chore(deps): update dependency pytest to v7.0.1 (#713) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 15deafb7b..dbdc6bb81 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.0.0 +pytest==7.0.1 mock==4.0.3 backoff==1.11.1 \ No newline at end of file From e8a8abc8e4cebcdeea06df5d9afd47791050c2a0 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 17 Feb 2022 15:21:26 -0800 Subject: [PATCH 007/509] chore: add py.typed file for PEP 561 (#716) --- google/__init__.py | 2 +- google/cloud/__init__.py | 2 +- google/cloud/storage/_helpers.py | 2 +- google/cloud/storage/_http.py | 4 ++-- google/cloud/storage/acl.py | 2 +- google/cloud/storage/batch.py | 2 +- google/cloud/storage/blob.py | 2 +- google/cloud/storage/client.py | 2 +- google/cloud/storage/py.typed | 2 ++ google/cloud/storage/retry.py | 4 ++-- mypy.ini | 4 ++++ noxfile.py | 10 ++++++++++ 12 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 google/cloud/storage/py.typed create mode 100644 mypy.ini diff --git a/google/__init__.py b/google/__init__.py index 0e1bc5131..18e75b457 100644 --- a/google/__init__.py +++ b/google/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. try: - import pkg_resources + import pkg_resources # type: ignore pkg_resources.declare_namespace(__name__) except ImportError: diff --git a/google/cloud/__init__.py b/google/cloud/__init__.py index 0e1bc5131..18e75b457 100644 --- a/google/cloud/__init__.py +++ b/google/cloud/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. try: - import pkg_resources + import pkg_resources # type: ignore pkg_resources.declare_namespace(__name__) except ImportError: diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 5be46832b..80283c8e8 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -22,7 +22,7 @@ import os from urllib.parse import urlsplit -from google import resumable_media +from google import resumable_media # type: ignore from google.auth import environment_vars from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.retry import DEFAULT_RETRY diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index 6c9d11700..99114cbf8 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -16,9 +16,9 @@ import functools import os -import pkg_resources +import pkg_resources # type: ignore -from google.cloud import _http +from google.cloud import _http # type: ignore from google.cloud.storage import __version__ diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index b3b77766f..fc4714ab5 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -412,7 +412,7 @@ def get_entities(self): self._ensure_loaded() return list(self.entities.values()) - @property + @property # type: ignore def client(self): """Abstract getter for the object client.""" raise NotImplementedError diff --git a/google/cloud/storage/batch.py b/google/cloud/storage/batch.py index cbc93397f..36a292d3c 100644 --- a/google/cloud/storage/batch.py +++ b/google/cloud/storage/batch.py @@ -23,7 +23,7 @@ import io import json -import requests +import requests # type: ignore from google.cloud import _helpers from google.cloud import exceptions diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 36a090af2..2f5f0bffa 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -42,7 +42,7 @@ from urllib.parse import urlunsplit import warnings -from google import resumable_media +from google import resumable_media # type: ignore from google.resumable_media.requests import ChunkedDownload from google.resumable_media.requests import Download from google.resumable_media.requests import RawDownload diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 76fa1a9cf..f1221292a 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -25,7 +25,7 @@ from google.auth.credentials import AnonymousCredentials -from google import resumable_media +from google import resumable_media # type: ignore from google.api_core import page_iterator from google.cloud._helpers import _LocalStack, _NOW diff --git a/google/cloud/storage/py.typed b/google/cloud/storage/py.typed new file mode 100644 index 000000000..4a062998d --- /dev/null +++ b/google/cloud/storage/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-cloud-storage package uses inline types. \ No newline at end of file diff --git a/google/cloud/storage/retry.py b/google/cloud/storage/retry.py index 6037cbe1d..03a6bec5c 100644 --- a/google/cloud/storage/retry.py +++ b/google/cloud/storage/retry.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import requests -import requests.exceptions as requests_exceptions +import requests # type: ignore +import requests.exceptions as requests_exceptions # type: ignore from google.api_core import exceptions as api_exceptions from google.api_core import retry diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 000000000..958e4b770 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,4 @@ +[mypy] +python_version = 3.7 +namespace_packages = True +ignore_missing_imports = True \ No newline at end of file diff --git a/noxfile.py b/noxfile.py index 069a486c1..a93e098f9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -63,6 +63,16 @@ def blacken(session): ) +@nox.session(python=DEFAULT_PYTHON_VERSION) +def mypy(session): + """Verify type hints are mypy compatible.""" + session.install("-e", ".") + session.install( + "mypy", "types-setuptools", "types-requests", + ) + session.run("mypy", "-p", "google.cloud.storage", "--no-incremental") + + @nox.session(python=DEFAULT_PYTHON_VERSION) def lint_setup_py(session): """Verify that setup.py is valid (including RST check).""" From b9f9fe1a537bcedb6dc2ab1b75234fa0396cf7ef Mon Sep 17 00:00:00 2001 From: Sydney Munro <97561403+sydney-munro@users.noreply.github.com> Date: Thu, 17 Feb 2022 16:57:51 -0800 Subject: [PATCH 008/509] samples: Adding MediaLink to Get Metadata sample (#717) --- samples/snippets/storage_get_metadata.py | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/snippets/storage_get_metadata.py b/samples/snippets/storage_get_metadata.py index c5ef0b4cc..3ce7ecea8 100644 --- a/samples/snippets/storage_get_metadata.py +++ b/samples/snippets/storage_get_metadata.py @@ -52,6 +52,7 @@ def blob_metadata(bucket_name, blob_name): print("Content-encoding: {}".format(blob.content_encoding)) print("Content-language: {}".format(blob.content_language)) print("Metadata: {}".format(blob.metadata)) + print("Medialink: {}".format(blob.media_link)) print("Custom Time: {}".format(blob.custom_time)) print("Temporary hold: ", "enabled" if blob.temporary_hold else "disabled") print( From c6bf78d608832d69031cccb7e4f252dd6241ade7 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 25 Feb 2022 11:09:37 -0800 Subject: [PATCH 009/509] tests: add retry conf s8 test cases and data integrity checks (#702) * test: update retry conf test schema with s8 * update tests to utilize shared test data * update test design and fixture usage * demo adding group download to test schema --- tests/conformance/conftest.py | 124 ++++++++++++ .../conformance/retry_strategy_test_data.json | 25 +++ tests/conformance/test_conformance.py | 179 +++++++++--------- 3 files changed, 237 insertions(+), 91 deletions(-) create mode 100644 tests/conformance/conftest.py diff --git a/tests/conformance/conftest.py b/tests/conformance/conftest.py new file mode 100644 index 000000000..91e9d0a71 --- /dev/null +++ b/tests/conformance/conftest.py @@ -0,0 +1,124 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import uuid + +import pytest + +from google.auth.credentials import AnonymousCredentials +from google.cloud import storage +from google.cloud.exceptions import NotFound + + +"""Environment variable or default host for Storage testbench emulator.""" +_HOST = os.environ.get("STORAGE_EMULATOR_HOST", "http://localhost:9000") + + +"""Emulated project information for the storage testbench.""" +_CONF_TEST_PROJECT_ID = "my-project-id" +_CONF_TEST_SERVICE_ACCOUNT_EMAIL = ( + "my-service-account@my-project-id.iam.gserviceaccount.com" +) +_CONF_TEST_PUBSUB_TOPIC_NAME = "my-topic-name" + +"""Create content payload in different sizes.""" + + +def _create_block(desired_kib): + line = "abc123XYZ" * 14 + "!" + "\n" + return 1024 * int(desired_kib / len(line)) * line + + +_STRING_CONTENT = "hello world" +_SIZE_16MB = 16384 # 16*1024 KiB + + +######################################################################################################################################## +### Pytest Fixtures to Populate Retry Conformance Test Resources ####################################################################### +######################################################################################################################################## + + +@pytest.fixture +def client(): + client = storage.Client( + project=_CONF_TEST_PROJECT_ID, + credentials=AnonymousCredentials(), + client_options={"api_endpoint": _HOST}, + ) + return client + + +@pytest.fixture +def bucket(client): + bucket = client.bucket(uuid.uuid4().hex) + client.create_bucket(bucket) + yield bucket + try: + bucket.delete(force=True) + except NotFound: # in cases where bucket is deleted within the test + pass + + +@pytest.fixture +def object(client, bucket): + blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + blob.upload_from_string(_STRING_CONTENT) + blob.reload() + yield blob + try: + blob.delete() + except NotFound: # in cases where object is deleted within the test + pass + + +@pytest.fixture +def notification(client, bucket): + notification = client.bucket(bucket.name).notification( + topic_name=_CONF_TEST_PUBSUB_TOPIC_NAME + ) + notification.create() + notification.reload() + yield notification + try: + notification.delete() + except NotFound: # in cases where notification is deleted within the test + pass + + +@pytest.fixture +def hmac_key(client): + hmac_key, _secret = client.create_hmac_key( + service_account_email=_CONF_TEST_SERVICE_ACCOUNT_EMAIL, + project_id=_CONF_TEST_PROJECT_ID, + ) + yield hmac_key + try: + hmac_key.state = "INACTIVE" + hmac_key.update() + hmac_key.delete() + except NotFound: # in cases where hmac_key is deleted within the test + pass + + +@pytest.fixture +def file_data(client, bucket): + blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + payload = _create_block(_SIZE_16MB) + blob.upload_from_string(payload) + yield blob, payload + try: + blob.delete() + except NotFound: # in cases where object is deleted within the test + pass diff --git a/tests/conformance/retry_strategy_test_data.json b/tests/conformance/retry_strategy_test_data.json index b807c6a72..9c2213560 100644 --- a/tests/conformance/retry_strategy_test_data.json +++ b/tests/conformance/retry_strategy_test_data.json @@ -239,6 +239,31 @@ ], "preconditionProvided": true, "expectSuccess": false + }, + { + "id": 7, + "description": "resumable_uploads_handle_complex_retries", + "cases": [], + "methods": [], + "preconditionProvided": true, + "expectSuccess": true + }, + { + "id": 8, + "description": "downloads_handle_complex_retries", + "cases": [ + { + "instructions": ["return-broken-stream", "return-broken-stream"] + }, + { + "instructions": ["return-broken-stream-after-256K"] + } + ], + "methods": [ + {"name": "storage.objects.get", "group": "storage.objects.download", "resources": ["BUCKET", "OBJECT"]} + ], + "preconditionProvided": false, + "expectSuccess": true } ] } \ No newline at end of file diff --git a/tests/conformance/test_conformance.py b/tests/conformance/test_conformance.py index cf4c026a8..ff70c6e16 100644 --- a/tests/conformance/test_conformance.py +++ b/tests/conformance/test_conformance.py @@ -24,12 +24,10 @@ import pytest import requests - -from six.moves.urllib import parse as urlparse +import urllib from google.auth.credentials import AnonymousCredentials from google.cloud import storage -from google.cloud.exceptions import NotFound from google.cloud.storage.hmac_key import HMACKeyMetadata from . import _read_local_json @@ -39,7 +37,7 @@ """Environment variable or default host for Storage testbench emulator.""" _HOST = os.environ.get("STORAGE_EMULATOR_HOST", "http://localhost:9000") -_PORT = urlparse.urlsplit(_HOST).port +_PORT = urllib.parse.urlsplit(_HOST).port """The storage testbench docker image info and commands.""" _DEFAULT_IMAGE_NAME = "gcr.io/cloud-devrel-public-resources/storage-testbench" @@ -79,39 +77,72 @@ def blob_exists(client, _preconditions, **resources): def blob_download_as_bytes(client, _preconditions, **resources): bucket = resources.get("bucket") - object = resources.get("object") - blob = client.bucket(bucket.name).blob(object.name) - blob.download_as_bytes() + file, data = resources.get("file_data") + # download the file and assert data integrity + blob = client.bucket(bucket.name).blob(file.name) + stored_contents = blob.download_as_bytes() + assert stored_contents == data.encode("utf-8") + + +def blob_download_as_bytes_w_range(client, _preconditions, **resources): + bucket = resources.get("bucket") + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name) + start_byte = 0 + end_byte = 1000000 + stored_contents = blob.download_as_bytes(start=start_byte, end=end_byte - 1) + assert stored_contents == data.encode("utf-8")[start_byte:end_byte] def blob_download_as_text(client, _preconditions, **resources): bucket = resources.get("bucket") - object = resources.get("object") - blob = client.bucket(bucket.name).blob(object.name) - blob.download_as_text() + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name) + stored_contents = blob.download_as_text() + assert stored_contents == data def blob_download_to_filename(client, _preconditions, **resources): bucket = resources.get("bucket") - object = resources.get("object") - blob = client.bucket(bucket.name).blob(object.name) + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name) + with tempfile.NamedTemporaryFile() as temp_f: + blob.download_to_filename(temp_f.name) + with open(temp_f.name, "r") as file_obj: + stored_contents = file_obj.read() + assert stored_contents == data + + +def blob_download_to_filename_chunked(client, _preconditions, **resources): + bucket = resources.get("bucket") + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name, chunk_size=40 * 1024 * 1024) with tempfile.NamedTemporaryFile() as temp_f: blob.download_to_filename(temp_f.name) + with open(temp_f.name, "r") as file_obj: + stored_contents = file_obj.read() + assert stored_contents == data def client_download_blob_to_file(client, _preconditions, **resources): - object = resources.get("object") + bucket = resources.get("bucket") + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name) with tempfile.NamedTemporaryFile() as temp_f: with open(temp_f.name, "wb") as file_obj: - client.download_blob_to_file(object, file_obj) + client.download_blob_to_file(blob, file_obj) + with open(temp_f.name, "r") as to_read: + stored_contents = to_read.read() + assert stored_contents == data def blobreader_read(client, _preconditions, **resources): bucket = resources.get("bucket") - object = resources.get("object") - blob = client.bucket(bucket.name).blob(object.name) - with blob.open() as reader: - reader.read() + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name) + with blob.open(mode="r") as reader: + stored_contents = reader.read() + assert stored_contents == data def client_list_blobs(client, _preconditions, **resources): @@ -428,11 +459,14 @@ def blob_compose(client, _preconditions, **resources): def blob_upload_from_string(client, _preconditions, **resources): bucket = resources.get("bucket") + _, data = resources.get("file_data") blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + blob.chunk_size = 4 * 1024 * 1024 if _preconditions: - blob.upload_from_string(_STRING_CONTENT, if_generation_match=0) + blob.upload_from_string(data, if_generation_match=0) else: - blob.upload_from_string(_STRING_CONTENT) + blob.upload_from_string(data) + assert blob.size == len(data) def blob_upload_from_file(client, _preconditions, **resources): @@ -672,10 +706,20 @@ def object_acl_clear(client, _preconditions, **resources): blob_exists, client_download_blob_to_file, blob_download_to_filename, + blob_download_to_filename_chunked, blob_download_as_bytes, blob_download_as_text, blobreader_read, ], + "storage.objects.download": [ + client_download_blob_to_file, + blob_download_to_filename, + blob_download_to_filename_chunked, + blob_download_as_bytes, + blob_download_as_bytes_w_range, + blob_download_as_text, + blobreader_read, + ], "storage.objects.list": [client_list_blobs, bucket_list_blobs, bucket_delete], "storage.serviceaccount.get": [client_get_service_account_email], # S1 end "storage.buckets.patch": [ @@ -722,73 +766,6 @@ def object_acl_clear(client, _preconditions, **resources): } -######################################################################################################################################## -### Pytest Fixtures to Populate Resources ############################################################################################## -######################################################################################################################################## - - -@pytest.fixture -def client(): - client = storage.Client( - project=_CONF_TEST_PROJECT_ID, - credentials=AnonymousCredentials(), - client_options={"api_endpoint": _HOST}, - ) - return client - - -@pytest.fixture -def bucket(client): - bucket = client.bucket(uuid.uuid4().hex) - client.create_bucket(bucket) - yield bucket - try: - bucket.delete(force=True) - except NotFound: # in cases where bucket is deleted within the test - pass - - -@pytest.fixture -def object(client, bucket): - blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) - blob.upload_from_string(_STRING_CONTENT) - blob.reload() - yield blob - try: - blob.delete() - except NotFound: # in cases where object is deleted within the test - pass - - -@pytest.fixture -def notification(client, bucket): - notification = client.bucket(bucket.name).notification( - topic_name=_CONF_TEST_PUBSUB_TOPIC_NAME - ) - notification.create() - notification.reload() - yield notification - try: - notification.delete() - except NotFound: # in cases where notification is deleted within the test - pass - - -@pytest.fixture -def hmac_key(client): - hmac_key, _secret = client.create_hmac_key( - service_account_email=_CONF_TEST_SERVICE_ACCOUNT_EMAIL, - project_id=_CONF_TEST_PROJECT_ID, - ) - yield hmac_key - try: - hmac_key.state = "INACTIVE" - hmac_key.update() - hmac_key.delete() - except NotFound: # in cases where hmac_key is deleted within the test - pass - - ######################################################################################################################################## ### Helper Methods for Testbench Retry Test API ######################################################################################## ######################################################################################################################################## @@ -833,7 +810,15 @@ def _get_retry_test(host, id): def _run_retry_test( - host, id, lib_func, _preconditions, bucket, object, notification, hmac_key + host, + id, + lib_func, + _preconditions, + bucket, + object, + notification, + hmac_key, + file_data, ): """ To execute tests against the list of instrucions sent to the Retry Test API, @@ -855,6 +840,7 @@ def _run_retry_test( object=object, notification=notification, hmac_key=hmac_key, + file_data=file_data, ) @@ -874,7 +860,16 @@ def _delete_retry_test(host, id): def run_test_case( - scenario_id, method, case, lib_func, host, bucket, object, notification, hmac_key + scenario_id, + method, + case, + lib_func, + host, + bucket, + object, + notification, + hmac_key, + file_data, ): scenario = _CONFORMANCE_TESTS[scenario_id - 1] expect_success = scenario["expectSuccess"] @@ -901,6 +896,7 @@ def run_test_case( object, notification, hmac_key, + file_data, ) except Exception as e: logging.exception( @@ -948,11 +944,12 @@ def run_test_case( for i, c in enumerate(cases): for m in methods: method_name = m["name"] - if method_name not in method_mapping: + method_group = m["group"] if m.get("group", None) else m["name"] + if method_group not in method_mapping: logging.info("No tests for operation {}".format(method_name)) continue - for lib_func in method_mapping[method_name]: + for lib_func in method_mapping[method_group]: test_name = "test-S{}-{}-{}-{}".format( id, method_name, lib_func.__name__, i ) From e9aab389f868799d4425133954bad4f1cbb85786 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Fri, 4 Mar 2022 11:12:48 -0500 Subject: [PATCH 010/509] fix(deps): require google-api-core>=1.31.5, >=2.3.2 (#722) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8dae147d9..33b6733eb 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ release_status = "Development Status :: 5 - Production/Stable" dependencies = [ "google-auth >= 1.25.0, < 3.0dev", - "google-api-core >= 1.29.0, < 3.0dev", + "google-api-core >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", "google-cloud-core >= 1.6.0, < 3.0dev", "google-resumable-media >= 1.3.0", "requests >= 2.18.0, < 3.0.0dev", From dbfe520008a25c4e6f5b94e332129affa0f0d869 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 4 Mar 2022 19:16:46 +0100 Subject: [PATCH 011/509] chore(deps): update dependency google-cloud-pubsub to v2.10.0 (#724) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index df515cde4..e9487c310 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.9.0 +google-cloud-pubsub==2.10.0 google-cloud-storage==2.1.0 pandas==1.3.5; python_version == '3.7' pandas==1.4.0; python_version >= '3.8' From 4fbbf02d3d2fb7e16c3db32eee0474655247c3bc Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 14:34:16 -0500 Subject: [PATCH 012/509] chore: Adding support for pytest-xdist and pytest-parallel (#723) Source-Link: https://github.com/googleapis/synthtool/commit/82f5cb283efffe96e1b6cd634738e0e7de2cd90a Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:5d8da01438ece4021d135433f2cf3227aa39ef0eaccc941d62aa35e6902832ae Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- samples/snippets/noxfile.py | 80 +++++++++++++++++++++---------------- 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 8cb43804d..7e08e05a3 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:ed1f9983d5a935a89fe8085e8bb97d94e41015252c5b6c9771257cf8624367e6 + digest: sha256:5d8da01438ece4021d135433f2cf3227aa39ef0eaccc941d62aa35e6902832ae diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 20cdfc620..4c808af73 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -188,42 +188,54 @@ def _session_tests( # check for presence of tests test_list = glob.glob("*_test.py") + glob.glob("test_*.py") test_list.extend(glob.glob("tests")) + if len(test_list) == 0: print("No tests found, skipping directory.") - else: - if TEST_CONFIG["pip_version_override"]: - pip_version = TEST_CONFIG["pip_version_override"] - session.install(f"pip=={pip_version}") - """Runs py.test for a particular project.""" - if os.path.exists("requirements.txt"): - if os.path.exists("constraints.txt"): - session.install("-r", "requirements.txt", "-c", "constraints.txt") - else: - session.install("-r", "requirements.txt") - - if os.path.exists("requirements-test.txt"): - if os.path.exists("constraints-test.txt"): - session.install( - "-r", "requirements-test.txt", "-c", "constraints-test.txt" - ) - else: - session.install("-r", "requirements-test.txt") - - if INSTALL_LIBRARY_FROM_SOURCE: - session.install("-e", _get_repo_root()) - - if post_install: - post_install(session) - - session.run( - "pytest", - *(PYTEST_COMMON_ARGS + session.posargs), - # Pytest will return 5 when no tests are collected. This can happen - # on travis where slow and flaky tests are excluded. - # See http://doc.pytest.org/en/latest/_modules/_pytest/main.html - success_codes=[0, 5], - env=get_pytest_env_vars(), - ) + return + + if TEST_CONFIG["pip_version_override"]: + pip_version = TEST_CONFIG["pip_version_override"] + session.install(f"pip=={pip_version}") + """Runs py.test for a particular project.""" + concurrent_args = [] + if os.path.exists("requirements.txt"): + if os.path.exists("constraints.txt"): + session.install("-r", "requirements.txt", "-c", "constraints.txt") + else: + session.install("-r", "requirements.txt") + with open("requirements.txt") as rfile: + packages = rfile.read() + + if os.path.exists("requirements-test.txt"): + if os.path.exists("constraints-test.txt"): + session.install( + "-r", "requirements-test.txt", "-c", "constraints-test.txt" + ) + else: + session.install("-r", "requirements-test.txt") + with open("requirements-test.txt") as rtfile: + packages += rtfile.read() + + if INSTALL_LIBRARY_FROM_SOURCE: + session.install("-e", _get_repo_root()) + + if post_install: + post_install(session) + + if "pytest-parallel" in packages: + concurrent_args.extend(['--workers', 'auto', '--tests-per-worker', 'auto']) + elif "pytest-xdist" in packages: + concurrent_args.extend(['-n', 'auto']) + + session.run( + "pytest", + *(PYTEST_COMMON_ARGS + session.posargs + concurrent_args), + # Pytest will return 5 when no tests are collected. This can happen + # on travis where slow and flaky tests are excluded. + # See http://doc.pytest.org/en/latest/_modules/_pytest/main.html + success_codes=[0, 5], + env=get_pytest_env_vars(), + ) @nox.session(python=ALL_VERSIONS) From c7bf615909a04f3bab3efb1047a9f4ba659bba19 Mon Sep 17 00:00:00 2001 From: Aaron Gabriel Neyer Date: Wed, 9 Mar 2022 12:01:19 -0700 Subject: [PATCH 013/509] fix: add user agent in python-storage when calling resumable media (WIP) (#715) * fix: add user agent in python-storage when calling resumable media (WIP) * put the things in the right places * starting to get some tests working * a bit closer, still some things not quite working * almost there * first cleanup * ensure up to date resumable media * next round of cleanup * lint * update resumable media * get tests passing * lint --- google/cloud/storage/_helpers.py | 22 ++++++++ google/cloud/storage/blob.py | 16 +++--- google/cloud/storage/client.py | 2 + setup.py | 2 +- tests/unit/test_blob.py | 87 +++++++++++++++++++++++--------- tests/unit/test_client.py | 12 ++++- 6 files changed, 107 insertions(+), 34 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 80283c8e8..e1f0ddbc3 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -581,3 +581,25 @@ def _api_core_retry_to_resumable_media_retry(retry, num_retries=None): return resumable_media.RetryStrategy(max_retries=num_retries) else: return resumable_media.RetryStrategy(max_retries=0) + + +def _get_default_headers( + user_agent, + content_type="application/json; charset=UTF-8", + x_upload_content_type=None, +): + """Get the headers for a request. + + Args: + user_agent (str): The user-agent for requests. + Returns: + Dict: The headers to be used for the request. + """ + return { + "Accept": "application/json", + "Accept-Encoding": "gzip, deflate", + "User-Agent": user_agent, + "x-goog-api-client": user_agent, + "content-type": content_type, + "x-upload-content-type": x_upload_content_type or content_type, + } diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 2f5f0bffa..bed7b1966 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -64,6 +64,7 @@ from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _raise_if_more_than_one_set from google.cloud.storage._helpers import _api_core_retry_to_resumable_media_retry +from google.cloud.storage._helpers import _get_default_headers from google.cloud.storage._signing import generate_signed_url_v2 from google.cloud.storage._signing import generate_signed_url_v4 from google.cloud.storage._helpers import _NUM_RETRIES_MESSAGE @@ -1720,7 +1721,7 @@ def _get_writable_metadata(self): return object_metadata - def _get_upload_arguments(self, content_type): + def _get_upload_arguments(self, client, content_type): """Get required arguments for performing an upload. The content type returned will be determined in order of precedence: @@ -1739,9 +1740,12 @@ def _get_upload_arguments(self, content_type): * An object metadata dictionary * The ``content_type`` as a string (according to precedence) """ - headers = _get_encryption_headers(self._encryption_key) - object_metadata = self._get_writable_metadata() content_type = self._get_content_type(content_type) + headers = { + **_get_default_headers(client._connection.user_agent, content_type), + **_get_encryption_headers(self._encryption_key), + } + object_metadata = self._get_writable_metadata() return headers, object_metadata, content_type def _do_multipart_upload( @@ -1860,7 +1864,7 @@ def _do_multipart_upload( transport = self._get_transport(client) if "metadata" in self._properties and "metadata" not in self._changes: self._changes.add("metadata") - info = self._get_upload_arguments(content_type) + info = self._get_upload_arguments(client, content_type) headers, object_metadata, content_type = info hostname = _get_host_name(client._connection) @@ -2045,7 +2049,7 @@ def _initiate_resumable_upload( transport = self._get_transport(client) if "metadata" in self._properties and "metadata" not in self._changes: self._changes.add("metadata") - info = self._get_upload_arguments(content_type) + info = self._get_upload_arguments(client, content_type) headers, object_metadata, content_type = info if extra_headers is not None: headers.update(extra_headers) @@ -2230,7 +2234,6 @@ def _do_resumable_upload( checksum=checksum, retry=retry, ) - while not upload.finished: try: response = upload.transmit_next_chunk(transport, timeout=timeout) @@ -2238,7 +2241,6 @@ def _do_resumable_upload( # Attempt to delete the corrupted object. self.delete() raise - return response def _do_upload( diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index f1221292a..b116cb011 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -31,6 +31,7 @@ from google.cloud._helpers import _LocalStack, _NOW from google.cloud.client import ClientWithProject from google.cloud.exceptions import NotFound +from google.cloud.storage._helpers import _get_default_headers from google.cloud.storage._helpers import _get_environ_project from google.cloud.storage._helpers import _get_storage_host from google.cloud.storage._helpers import _BASE_STORAGE_URI @@ -1131,6 +1132,7 @@ def download_blob_to_file( _add_etag_match_headers( headers, if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match, ) + headers = {**_get_default_headers(self._connection.user_agent), **headers} transport = self._http try: diff --git a/setup.py b/setup.py index 33b6733eb..3f5b157c1 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ "google-auth >= 1.25.0, < 3.0dev", "google-api-core >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", "google-cloud-core >= 1.6.0, < 3.0dev", - "google-resumable-media >= 1.3.0", + "google-resumable-media >= 2.3.2", "requests >= 2.18.0, < 3.0.0dev", "protobuf", ] diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index a70c16e75..ba1b38752 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -26,6 +26,7 @@ import mock import pytest +from google.cloud.storage._helpers import _get_default_headers from google.cloud.storage.retry import ( DEFAULT_RETRY, DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED, @@ -2212,16 +2213,19 @@ def test__set_metadata_to_none(self): def test__get_upload_arguments(self): name = u"blob-name" key = b"[pXw@,p@@AfBfrR3x-2b2SCHR,.?YwRO" + client = mock.Mock(_connection=_Connection) + client._connection.user_agent = "testing 1.2.3" blob = self._make_one(name, bucket=None, encryption_key=key) blob.content_disposition = "inline" content_type = u"image/jpeg" - info = blob._get_upload_arguments(content_type) + info = blob._get_upload_arguments(client, content_type) headers, object_metadata, new_content_type = info header_key_value = "W3BYd0AscEBAQWZCZnJSM3gtMmIyU0NIUiwuP1l3Uk8=" header_key_hash_value = "G0++dxF4q5rG4o9kE8gvEKn15RH6wLm0wXV1MgAlXOg=" expected_headers = { + **_get_default_headers(client._connection.user_agent, content_type), "X-Goog-Encryption-Algorithm": "AES256", "X-Goog-Encryption-Key": header_key_value, "X-Goog-Encryption-Key-Sha256": header_key_hash_value, @@ -2368,7 +2372,11 @@ def _do_multipart_success( + data_read + b"\r\n--==0==--" ) - headers = {"content-type": b'multipart/related; boundary="==0=="'} + headers = _get_default_headers( + client._connection.user_agent, + b'multipart/related; boundary="==0=="', + "application/xml", + ) client._http.request.assert_called_once_with( "POST", upload_url, data=payload, headers=headers, timeout=expected_timeout ) @@ -2614,10 +2622,17 @@ def _initiate_resumable_helper( self.assertEqual(upload.upload_url, upload_url) if extra_headers is None: - self.assertEqual(upload._headers, {}) + self.assertEqual( + upload._headers, + _get_default_headers(client._connection.user_agent, content_type), + ) else: - self.assertEqual(upload._headers, extra_headers) - self.assertIsNot(upload._headers, extra_headers) + expected_headers = { + **_get_default_headers(client._connection.user_agent, content_type), + **extra_headers, + } + self.assertEqual(upload._headers, expected_headers) + self.assertIsNot(upload._headers, expected_headers) self.assertFalse(upload.finished) if chunk_size is None: if blob_chunk_size is None: @@ -2656,10 +2671,9 @@ def _initiate_resumable_helper( # Check the mocks. blob._get_writable_metadata.assert_called_once_with() payload = json.dumps(object_metadata).encode("utf-8") - expected_headers = { - "content-type": "application/json; charset=UTF-8", - "x-upload-content-type": content_type, - } + expected_headers = _get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ) if size is not None: expected_headers["x-upload-content-length"] = str(size) if extra_headers is not None: @@ -2778,6 +2792,7 @@ def _make_resumable_transport( @staticmethod def _do_resumable_upload_call0( + client, blob, content_type, size=None, @@ -2796,10 +2811,9 @@ def _do_resumable_upload_call0( ) if predefined_acl is not None: upload_url += "&predefinedAcl={}".format(predefined_acl) - expected_headers = { - "content-type": "application/json; charset=UTF-8", - "x-upload-content-type": content_type, - } + expected_headers = _get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ) if size is not None: expected_headers["x-upload-content-length"] = str(size) payload = json.dumps({"name": blob.name}).encode("utf-8") @@ -2809,6 +2823,7 @@ def _do_resumable_upload_call0( @staticmethod def _do_resumable_upload_call1( + client, blob, content_type, data, @@ -2828,6 +2843,9 @@ def _do_resumable_upload_call1( content_range = "bytes 0-{:d}/{:d}".format(blob.chunk_size - 1, size) expected_headers = { + **_get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ), "content-type": content_type, "content-range": content_range, } @@ -2842,6 +2860,7 @@ def _do_resumable_upload_call1( @staticmethod def _do_resumable_upload_call2( + client, blob, content_type, data, @@ -2859,6 +2878,9 @@ def _do_resumable_upload_call2( blob.chunk_size, total_bytes - 1, total_bytes ) expected_headers = { + **_get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ), "content-type": content_type, "content-range": content_range, } @@ -2884,13 +2906,11 @@ def _do_resumable_helper( data_corruption=False, retry=None, ): - bucket = _Bucket(name="yesterday") - blob = self._make_one(u"blob-name", bucket=bucket) - blob.chunk_size = blob._CHUNK_SIZE_MULTIPLE - self.assertIsNotNone(blob.chunk_size) - + CHUNK_SIZE = 256 * 1024 + USER_AGENT = "testing 1.2.3" + content_type = u"text/html" # Data to be uploaded. - data = b"" + (b"A" * blob.chunk_size) + b"" + data = b"" + (b"A" * CHUNK_SIZE) + b"" total_bytes = len(data) if use_size: size = total_bytes @@ -2899,17 +2919,29 @@ def _do_resumable_helper( # Create mocks to be checked for doing transport. resumable_url = "http://test.invalid?upload_id=and-then-there-was-1" - headers1 = {"location": resumable_url} - headers2 = {"range": "bytes=0-{:d}".format(blob.chunk_size - 1)} + headers1 = { + **_get_default_headers(USER_AGENT, content_type), + "location": resumable_url, + } + headers2 = { + **_get_default_headers(USER_AGENT, content_type), + "range": "bytes=0-{:d}".format(CHUNK_SIZE - 1), + } + headers3 = _get_default_headers(USER_AGENT, content_type) transport, responses = self._make_resumable_transport( - headers1, headers2, {}, total_bytes, data_corruption=data_corruption + headers1, headers2, headers3, total_bytes, data_corruption=data_corruption ) # Create some mock arguments and call the method under test. client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._connection.user_agent = USER_AGENT stream = io.BytesIO(data) - content_type = u"text/html" + + bucket = _Bucket(name="yesterday") + blob = self._make_one(u"blob-name", bucket=bucket) + blob.chunk_size = blob._CHUNK_SIZE_MULTIPLE + self.assertIsNotNone(blob.chunk_size) if timeout is None: expected_timeout = self._get_default_timeout() @@ -2939,6 +2971,7 @@ def _do_resumable_helper( # Check the mocks. call0 = self._do_resumable_upload_call0( + client, blob, content_type, size=size, @@ -2950,6 +2983,7 @@ def _do_resumable_helper( timeout=expected_timeout, ) call1 = self._do_resumable_upload_call1( + client, blob, content_type, data, @@ -2963,6 +2997,7 @@ def _do_resumable_helper( timeout=expected_timeout, ) call2 = self._do_resumable_upload_call2( + client, blob, content_type, data, @@ -3510,6 +3545,7 @@ def _create_resumable_upload_session_helper( size = 10000 client = mock.Mock(_http=transport, _connection=_Connection, spec=[u"_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._connection.user_agent = "testing 1.2.3" if timeout is None: expected_timeout = self._get_default_timeout() @@ -3556,7 +3592,9 @@ def _create_resumable_upload_session_helper( upload_url += "?" + urlencode(qs_params) payload = b'{"name": "blob-name"}' expected_headers = { - "content-type": "application/json; charset=UTF-8", + **_get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ), "x-upload-content-length": str(size), "x-upload-content-type": content_type, } @@ -5739,6 +5777,7 @@ class _Connection(object): API_BASE_URL = "http://example.com" USER_AGENT = "testing 1.2.3" + user_agent = "testing 1.2.3" credentials = object() diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 52a1bea44..d97d25390 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -28,6 +28,7 @@ from google.oauth2.service_account import Credentials from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR +from google.cloud.storage._helpers import _get_default_headers from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED @@ -1567,7 +1568,10 @@ def test_download_blob_to_file_with_failure(self): self.assertEqual(file_obj.tell(), 0) - headers = {"accept-encoding": "gzip"} + headers = { + **_get_default_headers(client._connection.user_agent), + "accept-encoding": "gzip", + } blob._do_download.assert_called_once_with( client._http, file_obj, @@ -1598,7 +1602,10 @@ def test_download_blob_to_file_with_uri(self): ): client.download_blob_to_file("gs://bucket_name/path/to/object", file_obj) - headers = {"accept-encoding": "gzip"} + headers = { + **_get_default_headers(client._connection.user_agent), + "accept-encoding": "gzip", + } blob._do_download.assert_called_once_with( client._http, file_obj, @@ -1714,6 +1721,7 @@ def _download_blob_to_file_helper( if_etag_not_match = [if_etag_not_match] headers["If-None-Match"] = ", ".join(if_etag_not_match) + headers = {**_get_default_headers(client._connection.user_agent), **headers} blob._do_download.assert_called_once_with( client._http, file_obj, From 2cb0892f4965a42c51b8d6b7127087a6f435b07b Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 9 Mar 2022 15:15:27 -0800 Subject: [PATCH 014/509] tests: add retry conf s7 resumable upload test cases (#720) * tests: add retry conf s7 resumable upload test cases * adjust fixture and chunk size from design discussion --- tests/conformance/conftest.py | 14 ++-- .../conformance/retry_strategy_test_data.json | 16 ++++- tests/conformance/test_conformance.py | 69 +++++++++++++++++-- 3 files changed, 86 insertions(+), 13 deletions(-) diff --git a/tests/conformance/conftest.py b/tests/conformance/conftest.py index 91e9d0a71..e62b74e8b 100644 --- a/tests/conformance/conftest.py +++ b/tests/conformance/conftest.py @@ -13,6 +13,7 @@ # limitations under the License. import os +import random import uuid import pytest @@ -33,16 +34,21 @@ ) _CONF_TEST_PUBSUB_TOPIC_NAME = "my-topic-name" + """Create content payload in different sizes.""" def _create_block(desired_kib): - line = "abc123XYZ" * 14 + "!" + "\n" - return 1024 * int(desired_kib / len(line)) * line + line = "abcdefXYZ123456789ADDINGrandom#" # len(line) = 31 + multiplier = int(desired_kib / (len(line) + 1)) + lines = "".join( + line + str(random.randint(0, 9)) for _ in range(multiplier) + ) # add random single digit integers + return 1024 * lines _STRING_CONTENT = "hello world" -_SIZE_16MB = 16384 # 16*1024 KiB +_SIZE_9MB = 9216 # 9*1024 KiB ######################################################################################################################################## @@ -115,7 +121,7 @@ def hmac_key(client): @pytest.fixture def file_data(client, bucket): blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) - payload = _create_block(_SIZE_16MB) + payload = _create_block(_SIZE_9MB) blob.upload_from_string(payload) yield blob, payload try: diff --git a/tests/conformance/retry_strategy_test_data.json b/tests/conformance/retry_strategy_test_data.json index 9c2213560..eec1b8b6c 100644 --- a/tests/conformance/retry_strategy_test_data.json +++ b/tests/conformance/retry_strategy_test_data.json @@ -243,8 +243,20 @@ { "id": 7, "description": "resumable_uploads_handle_complex_retries", - "cases": [], - "methods": [], + "cases": [ + { + "instructions": ["return-reset-connection", "return-503"] + }, + { + "instructions": ["return-503-after-256K"] + }, + { + "instructions": ["return-503-after-8192K"] + } + ], + "methods": [ + {"name": "storage.objects.insert", "group": "storage.resumable.upload", "resources": ["BUCKET"]} + ], "preconditionProvided": true, "expectSuccess": true }, diff --git a/tests/conformance/test_conformance.py b/tests/conformance/test_conformance.py index ff70c6e16..fa842630e 100644 --- a/tests/conformance/test_conformance.py +++ b/tests/conformance/test_conformance.py @@ -54,6 +54,7 @@ _STRING_CONTENT = "hello world" _BYTE_CONTENT = b"12345678" +_RESUMABLE_UPLOAD_CHUNK_SIZE = 2 * 1024 * 1024 ######################################################################################################################################## @@ -461,7 +462,7 @@ def blob_upload_from_string(client, _preconditions, **resources): bucket = resources.get("bucket") _, data = resources.get("file_data") blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) - blob.chunk_size = 4 * 1024 * 1024 + blob.chunk_size = _RESUMABLE_UPLOAD_CHUNK_SIZE if _preconditions: blob.upload_from_string(data, if_generation_match=0) else: @@ -471,26 +472,67 @@ def blob_upload_from_string(client, _preconditions, **resources): def blob_upload_from_file(client, _preconditions, **resources): bucket = resources.get("bucket") - blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + file, data = resources.get("file_data") + file_blob = client.bucket(bucket.name).blob(file.name) + upload_blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + upload_blob.chunk_size = _RESUMABLE_UPLOAD_CHUNK_SIZE + with tempfile.NamedTemporaryFile() as temp_f: + # Create a named temporary file with payload. + with open(temp_f.name, "wb") as file_obj: + client.download_blob_to_file(file_blob, file_obj) + # Upload the temporary file and assert data integrity. if _preconditions: - blob.upload_from_file(temp_f, if_generation_match=0) + upload_blob.upload_from_file(temp_f, if_generation_match=0) else: - blob.upload_from_file(temp_f) + upload_blob.upload_from_file(temp_f) + + upload_blob.reload() + assert upload_blob.size == len(data) def blob_upload_from_filename(client, _preconditions, **resources): bucket = resources.get("bucket") blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + blob.chunk_size = _RESUMABLE_UPLOAD_CHUNK_SIZE + + bucket = resources.get("bucket") + file, data = resources.get("file_data") + file_blob = client.bucket(bucket.name).blob(file.name) + upload_blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + upload_blob.chunk_size = _RESUMABLE_UPLOAD_CHUNK_SIZE with tempfile.NamedTemporaryFile() as temp_f: + # Create a named temporary file with payload. + with open(temp_f.name, "wb") as file_obj: + client.download_blob_to_file(file_blob, file_obj) + # Upload the temporary file and assert data integrity. if _preconditions: - blob.upload_from_filename(temp_f.name, if_generation_match=0) + upload_blob.upload_from_filename(temp_f.name, if_generation_match=0) else: - blob.upload_from_filename(temp_f.name) + upload_blob.upload_from_filename(temp_f.name) + + upload_blob.reload() + assert upload_blob.size == len(data) def blobwriter_write(client, _preconditions, **resources): + bucket = resources.get("bucket") + _, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + if _preconditions: + with blob.open( + "w", chunk_size=_RESUMABLE_UPLOAD_CHUNK_SIZE, if_generation_match=0 + ) as writer: + writer.write(data) + else: + with blob.open("w", chunk_size=_RESUMABLE_UPLOAD_CHUNK_SIZE) as writer: + writer.write(data) + blob.reload() + assert blob.size == len(data) + + +def blobwriter_write_multipart(client, _preconditions, **resources): chunk_size = 256 * 1024 bucket = resources.get("bucket") blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) @@ -502,6 +544,15 @@ def blobwriter_write(client, _preconditions, **resources): writer.write(_BYTE_CONTENT) +def blob_upload_from_string_multipart(client, _preconditions, **resources): + bucket = resources.get("bucket") + blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) + if _preconditions: + blob.upload_from_string(_STRING_CONTENT, if_generation_match=0) + else: + blob.upload_from_string(_STRING_CONTENT) + + def blob_create_resumable_upload_session(client, _preconditions, **resources): bucket = resources.get("bucket") blob = client.bucket(bucket.name).blob(uuid.uuid4().hex) @@ -745,11 +796,15 @@ def object_acl_clear(client, _preconditions, **resources): bucket_rename_blob, ], "storage.objects.insert": [ + blob_upload_from_string_multipart, + blobwriter_write_multipart, + blob_create_resumable_upload_session, + ], + "storage.resumable.upload": [ blob_upload_from_string, blob_upload_from_file, blob_upload_from_filename, blobwriter_write, - blob_create_resumable_upload_session, ], "storage.objects.patch": [ blob_patch, From c64779df2fb22d22e76adee00b8a40f3b5bb4b14 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 10 Mar 2022 11:41:30 +0100 Subject: [PATCH 015/509] chore(deps): update dependency google-cloud-pubsub to v2.11.0 (#729) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index e9487c310..8e7837b43 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.10.0 +google-cloud-pubsub==2.11.0 google-cloud-storage==2.1.0 pandas==1.3.5; python_version == '3.7' pandas==1.4.0; python_version >= '3.8' From e0b3b354d51e4be7c563d7f2f628a7139df842c0 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 10 Mar 2022 15:23:53 -0800 Subject: [PATCH 016/509] fix: retry client side requests timeout (#727) Co-authored-by: Anthonios Partheniou --- google/cloud/storage/retry.py | 1 + 1 file changed, 1 insertion(+) diff --git a/google/cloud/storage/retry.py b/google/cloud/storage/retry.py index 03a6bec5c..9a6ec853b 100644 --- a/google/cloud/storage/retry.py +++ b/google/cloud/storage/retry.py @@ -29,6 +29,7 @@ ConnectionError, requests.ConnectionError, requests_exceptions.ChunkedEncodingError, + requests_exceptions.Timeout, ) From 5d1cfd2050321481a3bc4acbe80537ea666506fa Mon Sep 17 00:00:00 2001 From: allenc97 <35978194+allenc97@users.noreply.github.com> Date: Thu, 10 Mar 2022 21:39:38 -0800 Subject: [PATCH 017/509] fix: Fix BlobReader handling of interleaved reads and seeks (#721) * tests (fileio): add tarfile based test case for reader seek Background info: https://github.com/googleapis/python-storage/issues/462 * fix: Patch blob reader to return correct seek/tell values (#462) Co-authored-by: Andrew Gorcester --- google/cloud/storage/fileio.py | 38 ++++++++++++++++++++-------------- tests/unit/test_fileio.py | 35 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index 95bb12b1f..e05663675 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -123,9 +123,12 @@ def read(self, size=-1): # If the read request demands more bytes than are buffered, fetch more. remaining_size = size - len(result) if remaining_size > 0 or size < 0: + self._pos += self._buffer.tell() + read_size = len(result) + self._buffer.seek(0) self._buffer.truncate(0) # Clear the buffer to make way for new data. - fetch_start = self._pos + len(result) + fetch_start = self._pos if size > 0: # Fetch the larger of self._chunk_size or the remaining_size. fetch_end = fetch_start + max(remaining_size, self._chunk_size) @@ -154,9 +157,8 @@ def read(self, size=-1): self._buffer.write(result[size:]) self._buffer.seek(0) result = result[:size] - - self._pos += len(result) - + # Increment relative offset by true amount read. + self._pos += len(result) - read_size return result def read1(self, size=-1): @@ -174,29 +176,33 @@ def seek(self, pos, whence=0): if self._blob.size is None: self._blob.reload(**self._download_kwargs) - initial_pos = self._pos + initial_offset = self._pos + self._buffer.tell() if whence == 0: - self._pos = pos + target_pos = pos elif whence == 1: - self._pos += pos + target_pos = initial_offset + pos elif whence == 2: - self._pos = self._blob.size + pos + target_pos = self._blob.size + pos if whence not in {0, 1, 2}: raise ValueError("invalid whence value") - if self._pos > self._blob.size: - self._pos = self._blob.size + if target_pos > self._blob.size: + target_pos = self._blob.size # Seek or invalidate buffer as needed. - difference = self._pos - initial_pos - new_buffer_pos = self._buffer.seek(difference, 1) - if new_buffer_pos != difference: # Buffer does not contain new pos. - # Invalidate buffer. + if target_pos < self._pos: + # Target position < relative offset <= true offset. + # As data is not in buffer, invalidate buffer. self._buffer.seek(0) self._buffer.truncate(0) - - return self._pos + new_pos = target_pos + self._pos = target_pos + else: + # relative offset <= target position <= size of file. + difference = target_pos - initial_offset + new_pos = self._pos + self._buffer.seek(difference, 1) + return new_pos def close(self): self._buffer.close() diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index d71103707..a6d4e7544 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -247,6 +247,41 @@ def initialize_size(**_): reader.close() + def test_advanced_seek(self): + blob = mock.Mock() + + def read_from_fake_data(start=0, end=None, **_): + return TEST_BINARY_DATA[start:end] * 1024 + + blob.download_as_bytes = mock.Mock(side_effect=read_from_fake_data) + blob.size = None + download_kwargs = {"if_metageneration_match": 1} + reader = self._make_blob_reader(blob, chunk_size=1024, **download_kwargs) + + # Seek needs the blob size to work and should call reload() if the size + # is not known. Set a mock to initialize the size if reload() is called. + def initialize_size(**_): + blob.size = len(TEST_BINARY_DATA) * 1024 + + blob.reload = mock.Mock(side_effect=initialize_size) + + self.assertEqual(reader.tell(), 0) + # Mimic tarfile access pattern. Read tarinfo block. + reader.read(512) + self.assertEqual(reader.tell(), 512) + self.assertEqual(reader.seek(512), 512) + # Mimic read actual tar content. + reader.read(400) + self.assertEqual(reader.tell(), 912) + # Tarfile offsets are rounded up by block size + # A sanity seek/read is used to check for unexpected ends. + reader.seek(1023) + reader.read(1) + self.assertEqual(reader.tell(), 1024) + reader.read(512) + self.assertEqual(reader.tell(), 1536) + reader.close() + def test_close(self): blob = mock.Mock() reader = self._make_blob_reader(blob) From eae1df0f4526eefb21f14eb3f5a319b9395b90c7 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Sun, 13 Mar 2022 21:02:26 +0100 Subject: [PATCH 018/509] chore(deps): update dependency pytest to v7.1.0 (#732) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index dbdc6bb81..2777a5d9f 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.0.1 +pytest==7.1.0 mock==4.0.3 backoff==1.11.1 \ No newline at end of file From f80f69516b0eaa6ebef6a28d1fd12c9d78f362ce Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 14 Mar 2022 11:02:23 -0600 Subject: [PATCH 019/509] chore(main): release 2.2.0 (#705) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 20 ++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 298620b4b..853f4b26f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.2.0](https://github.com/googleapis/python-storage/compare/v2.1.0...v2.2.0) (2022-03-14) + + +### Features + +* allow no project in client methods using storage emulator ([#703](https://github.com/googleapis/python-storage/issues/703)) ([bcde0ec](https://github.com/googleapis/python-storage/commit/bcde0ec619d7d303892bcc0863b7f977c79f7649)) + + +### Bug Fixes + +* add user agent in python-storage when calling resumable media ([c7bf615](https://github.com/googleapis/python-storage/commit/c7bf615909a04f3bab3efb1047a9f4ba659bba19)) +* **deps:** require google-api-core>=1.31.5, >=2.3.2 ([#722](https://github.com/googleapis/python-storage/issues/722)) ([e9aab38](https://github.com/googleapis/python-storage/commit/e9aab389f868799d4425133954bad4f1cbb85786)) +* Fix BlobReader handling of interleaved reads and seeks ([#721](https://github.com/googleapis/python-storage/issues/721)) ([5d1cfd2](https://github.com/googleapis/python-storage/commit/5d1cfd2050321481a3bc4acbe80537ea666506fa)) +* retry client side requests timeout ([#727](https://github.com/googleapis/python-storage/issues/727)) ([e0b3b35](https://github.com/googleapis/python-storage/commit/e0b3b354d51e4be7c563d7f2f628a7139df842c0)) + + +### Documentation + +* fixed download_blob_to_file example ([#704](https://github.com/googleapis/python-storage/issues/704)) ([2c94d98](https://github.com/googleapis/python-storage/commit/2c94d98ed21cc768cfa54fac3d734254fc4d8480)) + ## [2.1.0](https://github.com/googleapis/python-storage/compare/v2.0.0...v2.1.0) (2022-01-19) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 8b5d3328c..bd0f8e5c7 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.1.0" +__version__ = "2.2.0" From bc99bd18718a3eafcdcb3083ca10e9159ae09308 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 14 Mar 2022 21:07:04 +0100 Subject: [PATCH 020/509] chore(deps): update dependency google-cloud-storage to v2.2.0 (#733) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 8e7837b43..b95a96f88 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.11.0 -google-cloud-storage==2.1.0 +google-cloud-storage==2.2.0 pandas==1.3.5; python_version == '3.7' pandas==1.4.0; python_version >= '3.8' From f77d2f787f435f2f898e9babcdab81225672ad4f Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 15 Mar 2022 12:22:13 -0700 Subject: [PATCH 021/509] fix: remove py.typed marker file for PEP 561 (#735) Reverts googleapis/python-storage#716 Fixes #734 --- google/__init__.py | 2 +- google/cloud/__init__.py | 2 +- google/cloud/storage/_helpers.py | 2 +- google/cloud/storage/_http.py | 4 ++-- google/cloud/storage/acl.py | 2 +- google/cloud/storage/batch.py | 2 +- google/cloud/storage/blob.py | 2 +- google/cloud/storage/client.py | 2 +- google/cloud/storage/py.typed | 2 -- google/cloud/storage/retry.py | 4 ++-- mypy.ini | 4 ---- noxfile.py | 10 ---------- 12 files changed, 11 insertions(+), 27 deletions(-) delete mode 100644 google/cloud/storage/py.typed delete mode 100644 mypy.ini diff --git a/google/__init__.py b/google/__init__.py index 18e75b457..0e1bc5131 100644 --- a/google/__init__.py +++ b/google/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. try: - import pkg_resources # type: ignore + import pkg_resources pkg_resources.declare_namespace(__name__) except ImportError: diff --git a/google/cloud/__init__.py b/google/cloud/__init__.py index 18e75b457..0e1bc5131 100644 --- a/google/cloud/__init__.py +++ b/google/cloud/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. try: - import pkg_resources # type: ignore + import pkg_resources pkg_resources.declare_namespace(__name__) except ImportError: diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index e1f0ddbc3..5a1c86c48 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -22,7 +22,7 @@ import os from urllib.parse import urlsplit -from google import resumable_media # type: ignore +from google import resumable_media from google.auth import environment_vars from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.retry import DEFAULT_RETRY diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index 99114cbf8..6c9d11700 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -16,9 +16,9 @@ import functools import os -import pkg_resources # type: ignore +import pkg_resources -from google.cloud import _http # type: ignore +from google.cloud import _http from google.cloud.storage import __version__ diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index fc4714ab5..b3b77766f 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -412,7 +412,7 @@ def get_entities(self): self._ensure_loaded() return list(self.entities.values()) - @property # type: ignore + @property def client(self): """Abstract getter for the object client.""" raise NotImplementedError diff --git a/google/cloud/storage/batch.py b/google/cloud/storage/batch.py index 36a292d3c..cbc93397f 100644 --- a/google/cloud/storage/batch.py +++ b/google/cloud/storage/batch.py @@ -23,7 +23,7 @@ import io import json -import requests # type: ignore +import requests from google.cloud import _helpers from google.cloud import exceptions diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index bed7b1966..caa4a164f 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -42,7 +42,7 @@ from urllib.parse import urlunsplit import warnings -from google import resumable_media # type: ignore +from google import resumable_media from google.resumable_media.requests import ChunkedDownload from google.resumable_media.requests import Download from google.resumable_media.requests import RawDownload diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index b116cb011..4e0c51e70 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -25,7 +25,7 @@ from google.auth.credentials import AnonymousCredentials -from google import resumable_media # type: ignore +from google import resumable_media from google.api_core import page_iterator from google.cloud._helpers import _LocalStack, _NOW diff --git a/google/cloud/storage/py.typed b/google/cloud/storage/py.typed deleted file mode 100644 index 4a062998d..000000000 --- a/google/cloud/storage/py.typed +++ /dev/null @@ -1,2 +0,0 @@ -# Marker file for PEP 561. -# The google-cloud-storage package uses inline types. \ No newline at end of file diff --git a/google/cloud/storage/retry.py b/google/cloud/storage/retry.py index 9a6ec853b..fb7a8e4de 100644 --- a/google/cloud/storage/retry.py +++ b/google/cloud/storage/retry.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import requests # type: ignore -import requests.exceptions as requests_exceptions # type: ignore +import requests +import requests.exceptions as requests_exceptions from google.api_core import exceptions as api_exceptions from google.api_core import retry diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 958e4b770..000000000 --- a/mypy.ini +++ /dev/null @@ -1,4 +0,0 @@ -[mypy] -python_version = 3.7 -namespace_packages = True -ignore_missing_imports = True \ No newline at end of file diff --git a/noxfile.py b/noxfile.py index a93e098f9..069a486c1 100644 --- a/noxfile.py +++ b/noxfile.py @@ -63,16 +63,6 @@ def blacken(session): ) -@nox.session(python=DEFAULT_PYTHON_VERSION) -def mypy(session): - """Verify type hints are mypy compatible.""" - session.install("-e", ".") - session.install( - "mypy", "types-setuptools", "types-requests", - ) - session.run("mypy", "-p", "google.cloud.storage", "--no-incremental") - - @nox.session(python=DEFAULT_PYTHON_VERSION) def lint_setup_py(session): """Verify that setup.py is valid (including RST check).""" From 9ad868fe156028cf6fa544803e8aa421d51217f2 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 15 Mar 2022 12:56:31 -0700 Subject: [PATCH 022/509] chore(main): release 2.2.1 (#736) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 853f4b26f..893066183 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +### [2.2.1](https://github.com/googleapis/python-storage/compare/v2.2.0...v2.2.1) (2022-03-15) + + +### Bug Fixes + +* remove py.typed marker file for PEP 561 ([#735](https://github.com/googleapis/python-storage/issues/735)) ([f77d2f7](https://github.com/googleapis/python-storage/commit/f77d2f787f435f2f898e9babcdab81225672ad4f)), closes [#734](https://github.com/googleapis/python-storage/issues/734) + ## [2.2.0](https://github.com/googleapis/python-storage/compare/v2.1.0...v2.2.0) (2022-03-14) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index bd0f8e5c7..b1be7d8c9 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.2.0" +__version__ = "2.2.1" From c1465fc63816c6ce339f4f99b964c02830b4bc07 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 15 Mar 2022 21:40:16 +0100 Subject: [PATCH 023/509] chore(deps): update dependency google-cloud-storage to v2.2.1 (#737) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index b95a96f88..82d925eda 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.11.0 -google-cloud-storage==2.2.0 +google-cloud-storage==2.2.1 pandas==1.3.5; python_version == '3.7' pandas==1.4.0; python_version >= '3.8' From 8642df034ceeea98ca14e27fd693cd55b3317391 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 17 Mar 2022 13:25:10 -0700 Subject: [PATCH 024/509] tests: cleanup and remove duplicate tests (#728) --- tests/unit/test_retry.py | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/tests/unit/test_retry.py b/tests/unit/test_retry.py index b985e5c16..8ebe405d3 100644 --- a/tests/unit/test_retry.py +++ b/tests/unit/test_retry.py @@ -34,7 +34,7 @@ def test_w_retryable_transport_error(self): exc = eTransportError(caught_exc) self.assertTrue(retry._should_retry(exc)) - def test_w_wrapped_type(self): + def test_w_retryable_types(self): from google.cloud.storage import retry for exc_type in retry._RETRYABLE_TYPES: @@ -55,26 +55,10 @@ def test_w_google_api_call_error_miss(self): exc.code = 999 self.assertFalse(self._call_fut(exc)) - def test_w_requests_connection_error(self): - import requests - - exc = requests.ConnectionError() - self.assertTrue(self._call_fut(exc)) - - def test_w_requests_chunked_encoding_error(self): - import requests.exceptions - - exc = requests.exceptions.ChunkedEncodingError() - self.assertTrue(self._call_fut(exc)) - - def test_miss_w_stdlib_error(self): + def test_w_stdlib_error_miss(self): exc = ValueError("testing") self.assertFalse(self._call_fut(exc)) - def test_w_stdlib_connection_error(self): - exc = ConnectionError() - self.assertTrue(self._call_fut(exc)) - class TestConditionalRetryPolicy(unittest.TestCase): def _make_one(self, retry_policy, conditional_predicate, required_kwargs): From a8fcebb901abc297126cbb183eedbbd603ac5add Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Sat, 19 Mar 2022 11:10:35 +0100 Subject: [PATCH 025/509] chore(deps): update dependency pytest to v7.1.1 (#738) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 2777a5d9f..6fa4b2753 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.1.0 +pytest==7.1.1 mock==4.0.3 backoff==1.11.1 \ No newline at end of file From ad3911610a5178942c1ebdd5d8280ca70b890231 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 06:02:41 -0400 Subject: [PATCH 026/509] chore(python): use black==22.3.0 (#742) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(python): use black==22.3.0 Source-Link: https://github.com/googleapis/synthtool/commit/6fab84af09f2cf89a031fd8671d1def6b2931b11 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:7cffbc10910c3ab1b852c05114a08d374c195a81cdec1d4a67a1d129331d0bfe * chore(python): use black==22.3.0 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- docs/conf.py | 5 +- google/cloud/storage/_helpers.py | 3 +- google/cloud/storage/_signing.py | 2 +- google/cloud/storage/acl.py | 5 +- google/cloud/storage/blob.py | 12 +- google/cloud/storage/bucket.py | 8 +- google/cloud/storage/client.py | 10 +- google/cloud/storage/hmac_key.py | 21 ++- google/cloud/storage/notification.py | 33 ++-- noxfile.py | 9 +- samples/snippets/noxfile.py | 2 +- tests/perf/storage_pb2_grpc.py | 12 +- tests/system/conftest.py | 4 +- tests/system/test__signing.py | 49 ++++-- tests/system/test_blob.py | 119 +++++++++++---- tests/system/test_bucket.py | 83 +++++++--- tests/system/test_client.py | 17 ++- tests/system/test_fileio.py | 11 +- tests/system/test_kms_integration.py | 21 ++- tests/system/test_notification.py | 11 +- tests/unit/test__helpers.py | 7 +- tests/unit/test__signing.py | 10 +- tests/unit/test_batch.py | 6 +- tests/unit/test_blob.py | 218 +++++++++++++++------------ tests/unit/test_bucket.py | 33 +++- tests/unit/test_client.py | 29 +++- tests/unit/test_fileio.py | 22 ++- 28 files changed, 527 insertions(+), 237 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 7e08e05a3..87dd00611 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:5d8da01438ece4021d135433f2cf3227aa39ef0eaccc941d62aa35e6902832ae + digest: sha256:7cffbc10910c3ab1b852c05114a08d374c195a81cdec1d4a67a1d129331d0bfe diff --git a/docs/conf.py b/docs/conf.py index fc9d1fd34..7a2f13fca 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -361,7 +361,10 @@ intersphinx_mapping = { "python": ("https://python.readthedocs.org/en/latest/", None), "google-auth": ("https://googleapis.dev/python/google-auth/latest/", None), - "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None,), + "google.api_core": ( + "https://googleapis.dev/python/google-api-core/latest/", + None, + ), "grpc": ("https://grpc.github.io/grpc/python/", None), "proto-plus": ("https://proto-plus-python.readthedocs.io/en/latest/", None), "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 5a1c86c48..30866c8a3 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -69,7 +69,8 @@ def _get_storage_host(): def _get_environ_project(): return os.getenv( - environment_vars.PROJECT, os.getenv(environment_vars.LEGACY_PROJECT), + environment_vars.PROJECT, + os.getenv(environment_vars.LEGACY_PROJECT), ) diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index a2b7209bc..837ef6211 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -109,7 +109,7 @@ def get_expiration_seconds_v2(expiration): # If it's a datetime, convert to a timestamp. if isinstance(expiration, datetime.datetime): micros = _helpers._microseconds_from_datetime(expiration) - expiration = micros // 10 ** 6 + expiration = micros // 10**6 if not isinstance(expiration, int): raise TypeError( diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index b3b77766f..ef2bca356 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -460,7 +460,10 @@ def reload(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): self.entities.clear() found = client._get_resource( - path, query_params=query_params, timeout=timeout, retry=retry, + path, + query_params=query_params, + timeout=timeout, + retry=retry, ) self.loaded = True diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index caa4a164f..a4e1d402d 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -87,11 +87,11 @@ _API_ACCESS_ENDPOINT = "https://storage.googleapis.com" -_DEFAULT_CONTENT_TYPE = u"application/octet-stream" -_DOWNLOAD_URL_TEMPLATE = u"{hostname}/download/storage/v1{path}?alt=media" -_BASE_UPLOAD_TEMPLATE = u"{hostname}/upload/storage/v1{bucket_path}/o?uploadType=" -_MULTIPART_URL_TEMPLATE = _BASE_UPLOAD_TEMPLATE + u"multipart" -_RESUMABLE_URL_TEMPLATE = _BASE_UPLOAD_TEMPLATE + u"resumable" +_DEFAULT_CONTENT_TYPE = "application/octet-stream" +_DOWNLOAD_URL_TEMPLATE = "{hostname}/download/storage/v1{path}?alt=media" +_BASE_UPLOAD_TEMPLATE = "{hostname}/upload/storage/v1{bucket_path}/o?uploadType=" +_MULTIPART_URL_TEMPLATE = _BASE_UPLOAD_TEMPLATE + "multipart" +_RESUMABLE_URL_TEMPLATE = _BASE_UPLOAD_TEMPLATE + "resumable" # NOTE: "acl" is also writeable but we defer ACL management to # the classes in the google.cloud.storage.acl module. _CONTENT_TYPE_FIELD = "contentType" @@ -4459,7 +4459,7 @@ def _raise_from_invalid_response(error): else: error_message = str(error) - message = u"{method} {url}: {error}".format( + message = "{method} {url}: {error}".format( method=response.request.method, url=response.request.url, error=error_message ) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index d071615ef..0fa5894b7 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1383,7 +1383,10 @@ def list_notifications( client = self._require_client(client) path = self.path + "/notificationConfigs" iterator = client._list_resource( - path, _item_to_notification, timeout=timeout, retry=retry, + path, + _item_to_notification, + timeout=timeout, + retry=retry, ) iterator.bucket = self return iterator @@ -2952,7 +2955,8 @@ def make_public( for blob in blobs: blob.acl.all().grant_read() blob.acl.save( - client=client, timeout=timeout, + client=client, + timeout=timeout, ) def make_private( diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 4e0c51e70..3b335cf7b 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1130,7 +1130,9 @@ def download_blob_to_file( headers = _get_encryption_headers(blob_or_uri._encryption_key) headers["accept-encoding"] = "gzip" _add_etag_match_headers( - headers, if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match, + headers, + if_etag_match=if_etag_match, + if_etag_not_match=if_etag_not_match, ) headers = {**_get_default_headers(self._connection.user_agent), **headers} @@ -1475,7 +1477,11 @@ def create_hmac_key( qs_params["userProject"] = user_project api_response = self._post_resource( - path, None, query_params=qs_params, timeout=timeout, retry=retry, + path, + None, + query_params=qs_params, + timeout=timeout, + retry=retry, ) metadata = HMACKeyMetadata(self) metadata._properties = api_response["metadata"] diff --git a/google/cloud/storage/hmac_key.py b/google/cloud/storage/hmac_key.py index 5cec51fa7..1636aaba4 100644 --- a/google/cloud/storage/hmac_key.py +++ b/google/cloud/storage/hmac_key.py @@ -211,7 +211,10 @@ def exists(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): qs_params["userProject"] = self.user_project self._client._get_resource( - self.path, query_params=qs_params, timeout=timeout, retry=retry, + self.path, + query_params=qs_params, + timeout=timeout, + retry=retry, ) except NotFound: return False @@ -239,7 +242,10 @@ def reload(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): qs_params["userProject"] = self.user_project self._properties = self._client._get_resource( - self.path, query_params=qs_params, timeout=timeout, retry=retry, + self.path, + query_params=qs_params, + timeout=timeout, + retry=retry, ) def update(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_ETAG_IN_JSON): @@ -263,7 +269,11 @@ def update(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_ETAG_IN_JSON): payload = {"state": self.state} self._properties = self._client._put_resource( - self.path, payload, query_params=qs_params, timeout=timeout, retry=retry, + self.path, + payload, + query_params=qs_params, + timeout=timeout, + retry=retry, ) def delete(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): @@ -289,5 +299,8 @@ def delete(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): qs_params["userProject"] = self.user_project self._client._delete_resource( - self.path, query_params=qs_params, timeout=timeout, retry=retry, + self.path, + query_params=qs_params, + timeout=timeout, + retry=retry, ) diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index 57faea571..0cdb87fa8 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -156,26 +156,22 @@ def topic_name(self): @property def topic_project(self): - """Project ID of topic to which notifications are published. - """ + """Project ID of topic to which notifications are published.""" return self._topic_project @property def custom_attributes(self): - """Custom attributes passed with notification events. - """ + """Custom attributes passed with notification events.""" return self._properties.get("custom_attributes") @property def event_types(self): - """Event types for which notification events are published. - """ + """Event types for which notification events are published.""" return self._properties.get("event_types") @property def blob_name_prefix(self): - """Prefix of blob names for which notification events are published. - """ + """Prefix of blob names for which notification events are published.""" return self._properties.get("object_name_prefix") @property @@ -278,7 +274,11 @@ def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): ) self._properties = client._post_resource( - path, properties, query_params=query_params, timeout=timeout, retry=retry, + path, + properties, + query_params=query_params, + timeout=timeout, + retry=retry, ) def exists(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): @@ -318,7 +318,10 @@ def exists(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): try: client._get_resource( - self.path, query_params=query_params, timeout=timeout, retry=retry, + self.path, + query_params=query_params, + timeout=timeout, + retry=retry, ) except NotFound: return False @@ -360,7 +363,10 @@ def reload(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): query_params["userProject"] = self.bucket.user_project response = client._get_resource( - self.path, query_params=query_params, timeout=timeout, retry=retry, + self.path, + query_params=query_params, + timeout=timeout, + retry=retry, ) self._set_properties(response) @@ -400,7 +406,10 @@ def delete(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): query_params["userProject"] = self.bucket.user_project client._delete_resource( - self.path, query_params=query_params, timeout=timeout, retry=retry, + self.path, + query_params=query_params, + timeout=timeout, + retry=retry, ) diff --git a/noxfile.py b/noxfile.py index 069a486c1..ac02aa1f5 100644 --- a/noxfile.py +++ b/noxfile.py @@ -24,7 +24,7 @@ import nox -BLACK_VERSION = "black==19.10b0" +BLACK_VERSION = "black==22.3.0" BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] DEFAULT_PYTHON_VERSION = "3.8" @@ -46,7 +46,9 @@ def lint(session): """ session.install("flake8", BLACK_VERSION) session.run( - "black", "--check", *BLACK_PATHS, + "black", + "--check", + *BLACK_PATHS, ) session.run("flake8", "google", "tests") @@ -59,7 +61,8 @@ def blacken(session): """ session.install(BLACK_VERSION) session.run( - "black", *BLACK_PATHS, + "black", + *BLACK_PATHS, ) diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 4c808af73..949e0fde9 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -29,7 +29,7 @@ # WARNING - WARNING - WARNING - WARNING - WARNING # WARNING - WARNING - WARNING - WARNING - WARNING -BLACK_VERSION = "black==19.10b0" +BLACK_VERSION = "black==22.3.0" # Copy `noxfile_config.py` to your directory and modify it instead. diff --git a/tests/perf/storage_pb2_grpc.py b/tests/perf/storage_pb2_grpc.py index 1b3a2c82f..913c40558 100644 --- a/tests/perf/storage_pb2_grpc.py +++ b/tests/perf/storage_pb2_grpc.py @@ -11,9 +11,9 @@ class StorageBenchWrapperStub(object): def __init__(self, channel): """Constructor. - Args: - channel: A grpc.Channel. - """ + Args: + channel: A grpc.Channel. + """ self.Write = channel.unary_unary( "/storage_bench.StorageBenchWrapper/Write", request_serializer=storage__pb2.ObjectWrite.SerializeToString, @@ -31,15 +31,13 @@ class StorageBenchWrapperServicer(object): pass def Write(self, request, context): - """Performs an upload from a specific object. - """ + """Performs an upload from a specific object.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") def Read(self, request, context): - """Read a specific object. - """ + """Read a specific object.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") diff --git a/tests/system/conftest.py b/tests/system/conftest.py index 02a13d140..c42f62e99 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -108,7 +108,9 @@ def listable_bucket(storage_client, listable_bucket_name, file_data): for filename in _listable_filenames[1:]: _helpers.retry_bad_copy(bucket.copy_blob)( - source_blob, bucket, filename, + source_blob, + bucket, + filename, ) yield bucket diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index 04c3687a4..a33f2db4e 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -50,7 +50,9 @@ def _create_signed_list_blobs_url_helper( def test_create_signed_list_blobs_url_v2(storage_client, signing_bucket, no_mtls): _create_signed_list_blobs_url_helper( - storage_client, signing_bucket, version="v2", + storage_client, + signing_bucket, + version="v2", ) @@ -61,13 +63,18 @@ def test_create_signed_list_blobs_url_v2_w_expiration( delta = datetime.timedelta(seconds=10) _create_signed_list_blobs_url_helper( - storage_client, signing_bucket, expiration=now + delta, version="v2", + storage_client, + signing_bucket, + expiration=now + delta, + version="v2", ) def test_create_signed_list_blobs_url_v4(storage_client, signing_bucket, no_mtls): _create_signed_list_blobs_url_helper( - storage_client, signing_bucket, version="v4", + storage_client, + signing_bucket, + version="v4", ) @@ -77,7 +84,10 @@ def test_create_signed_list_blobs_url_v4_w_expiration( now = datetime.datetime.utcnow() delta = datetime.timedelta(seconds=10) _create_signed_list_blobs_url_helper( - storage_client, signing_bucket, expiration=now + delta, version="v4", + storage_client, + signing_bucket, + expiration=now + delta, + version="v4", ) @@ -135,7 +145,9 @@ def test_create_signed_read_url_v2(storage_client, signing_bucket, no_mtls): def test_create_signed_read_url_v4(storage_client, signing_bucket, no_mtls): _create_signed_read_url_helper( - storage_client, signing_bucket, version="v4", + storage_client, + signing_bucket, + version="v4", ) @@ -180,7 +192,7 @@ def test_create_signed_read_url_v2_w_non_ascii_name( _create_signed_read_url_helper( storage_client, signing_bucket, - blob_name=u"Caf\xe9.txt", + blob_name="Caf\xe9.txt", payload=b"Test signed URL for blob w/ non-ASCII name", ) @@ -191,7 +203,7 @@ def test_create_signed_read_url_v4_w_non_ascii_name( _create_signed_read_url_helper( storage_client, signing_bucket, - blob_name=u"Caf\xe9.txt", + blob_name="Caf\xe9.txt", payload=b"Test signed URL for blob w/ non-ASCII name", version="v4", ) @@ -276,7 +288,10 @@ def _create_signed_delete_url_helper(client, bucket, version="v2", expiration=No blob.upload_from_string(b"DELETE ME!") signed_delete_url = blob.generate_signed_url( - expiration=expiration, method="DELETE", client=client, version=version, + expiration=expiration, + method="DELETE", + client=client, + version=version, ) response = requests.request("DELETE", signed_delete_url) @@ -303,7 +318,10 @@ def _create_signed_resumable_upload_url_helper( # Initiate the upload using a signed URL. signed_resumable_upload_url = blob.generate_signed_url( - expiration=expiration, method="RESUMABLE", client=client, version=version, + expiration=expiration, + method="RESUMABLE", + client=client, + version=version, ) post_headers = {"x-goog-resumable": "start"} @@ -327,7 +345,10 @@ def _create_signed_resumable_upload_url_helper( # Finally, delete the blob using a signed URL. signed_delete_url = blob.generate_signed_url( - expiration=expiration, method="DELETE", client=client, version=version, + expiration=expiration, + method="DELETE", + client=client, + version=version, ) delete_response = requests.delete(signed_delete_url) @@ -336,13 +357,17 @@ def _create_signed_resumable_upload_url_helper( def test_create_signed_resumable_upload_url_v2(storage_client, signing_bucket, no_mtls): _create_signed_resumable_upload_url_helper( - storage_client, signing_bucket, version="v2", + storage_client, + signing_bucket, + version="v2", ) def test_create_signed_resumable_upload_url_v4(storage_client, signing_bucket, no_mtls): _create_signed_resumable_upload_url_helper( - storage_client, signing_bucket, version="v4", + storage_client, + signing_bucket, + version="v4", ) diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index b6d5216a7..acbc5745f 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -39,7 +39,10 @@ def _check_blob_hash(blob, info): def test_large_file_write_from_stream( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("LargeFile") @@ -52,7 +55,10 @@ def test_large_file_write_from_stream( def test_large_file_write_from_stream_w_checksum( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("LargeFile") @@ -65,7 +71,10 @@ def test_large_file_write_from_stream_w_checksum( def test_large_file_write_from_stream_w_failed_checksum( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("LargeFile") @@ -88,7 +97,11 @@ def test_large_file_write_from_stream_w_failed_checksum( def test_large_file_write_from_stream_w_encryption_key( - storage_client, shared_bucket, blobs_to_delete, file_data, service_account, + storage_client, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("LargeFile", encryption_key=encryption_key) @@ -110,7 +123,10 @@ def test_large_file_write_from_stream_w_encryption_key( def test_small_file_write_from_filename( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("SmallFile") @@ -122,7 +138,10 @@ def test_small_file_write_from_filename( def test_small_file_write_from_filename_with_checksum( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("SmallFile") @@ -134,7 +153,10 @@ def test_small_file_write_from_filename_with_checksum( def test_small_file_write_from_filename_with_failed_checksum( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("SmallFile") @@ -235,7 +257,10 @@ def test_blob_crud_w_user_project( def test_blob_crud_w_etag_match( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): wrong_etag = "kittens" @@ -281,7 +306,10 @@ def test_blob_crud_w_etag_match( def test_blob_crud_w_generation_match( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): wrong_generation_number = 6 wrong_metageneration_number = 9 @@ -373,7 +401,10 @@ def test_blob_acl_w_user_project( def test_blob_acl_w_metageneration_match( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): wrong_metageneration_number = 9 wrong_generation_number = 6 @@ -408,7 +439,10 @@ def test_blob_acl_w_metageneration_match( def test_blob_acl_upload_predefined( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): control = shared_bucket.blob("logo") control_info = file_data["logo"] @@ -438,7 +472,10 @@ def test_blob_acl_upload_predefined( def test_blob_patch_metadata( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): filename = file_data["logo"]["path"] blob_name = os.path.basename(filename) @@ -467,7 +504,9 @@ def test_blob_patch_metadata( def test_blob_direct_write_and_read_into_file( - shared_bucket, blobs_to_delete, service_account, + shared_bucket, + blobs_to_delete, + service_account, ): payload = b"Hello World" blob = shared_bucket.blob("MyBuffer") @@ -489,7 +528,9 @@ def test_blob_direct_write_and_read_into_file( def test_blob_download_w_generation_match( - shared_bucket, blobs_to_delete, service_account, + shared_bucket, + blobs_to_delete, + service_account, ): wrong_generation_number = 6 @@ -522,7 +563,9 @@ def test_blob_download_w_generation_match( def test_blob_download_w_failed_crc32c_checksum( - shared_bucket, blobs_to_delete, service_account, + shared_bucket, + blobs_to_delete, + service_account, ): blob = shared_bucket.blob("FailedChecksumBlob") payload = b"Hello World" @@ -555,7 +598,9 @@ def test_blob_download_w_failed_crc32c_checksum( def test_blob_download_as_text( - shared_bucket, blobs_to_delete, service_account, + shared_bucket, + blobs_to_delete, + service_account, ): blob = shared_bucket.blob("MyBuffer") payload = "Hello World" @@ -571,7 +616,9 @@ def test_blob_download_as_text( def test_blob_upload_w_gzip_encoded_download_raw( - shared_bucket, blobs_to_delete, service_account, + shared_bucket, + blobs_to_delete, + service_account, ): payload = b"DEADBEEF" * 1000 raw_stream = io.BytesIO() @@ -592,7 +639,10 @@ def test_blob_upload_w_gzip_encoded_download_raw( def test_blob_upload_from_file_resumable_with_generation( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("LargeFile") wrong_generation = 3 @@ -616,18 +666,23 @@ def test_blob_upload_from_file_resumable_with_generation( with pytest.raises(exceptions.PreconditionFailed): with open(info["path"], "rb") as file_obj: blob.upload_from_file( - file_obj, if_generation_match=wrong_generation, + file_obj, + if_generation_match=wrong_generation, ) with pytest.raises(exceptions.PreconditionFailed): with open(info["path"], "rb") as file_obj: blob.upload_from_file( - file_obj, if_metageneration_match=wrong_meta_generation, + file_obj, + if_metageneration_match=wrong_meta_generation, ) def test_blob_upload_from_string_w_owner( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("MyBuffer") payload = b"Hello World" @@ -642,7 +697,10 @@ def test_blob_upload_from_string_w_owner( def test_blob_upload_from_string_w_custom_time( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("CustomTimeBlob") payload = b"Hello World" @@ -658,7 +716,10 @@ def test_blob_upload_from_string_w_custom_time( def test_blob_upload_from_string_w_custom_time_no_micros( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): # Test that timestamps without microseconds are treated correctly by # custom_time encoding/decoding. @@ -676,7 +737,10 @@ def test_blob_upload_from_string_w_custom_time_no_micros( def test_blob_upload_download_crc32_md5_hash( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("MyBuffer") payload = b"Hello World" @@ -693,8 +757,8 @@ def test_blob_upload_download_crc32_md5_hash( @pytest.mark.parametrize( "blob_name,payload", [ - (u"Caf\u00e9", b"Normalization Form C"), - (u"Cafe\u0301", b"Normalization Form D"), + ("Caf\u00e9", b"Normalization Form C"), + ("Cafe\u0301", b"Normalization Form D"), ], ) def test_blob_w_unicode_names(blob_name, payload, shared_bucket, blobs_to_delete): @@ -841,7 +905,8 @@ def test_blob_compose_w_source_generation_match(shared_bucket, blobs_to_delete): with pytest.raises(exceptions.PreconditionFailed): original.compose( - [original, to_append], if_source_generation_match=wrong_source_generations, + [original, to_append], + if_source_generation_match=wrong_source_generations, ) original.compose( diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index dc1869d2f..4826ce8a6 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -117,7 +117,9 @@ def test_bucket_update_labels(storage_client, buckets_to_delete): def test_bucket_get_set_iam_policy( - storage_client, buckets_to_delete, service_account, + storage_client, + buckets_to_delete, + service_account, ): from google.cloud.storage.iam import STORAGE_OBJECT_VIEWER_ROLE from google.api_core.exceptions import BadRequest @@ -177,7 +179,10 @@ def test_bucket_crud_w_requester_pays(storage_client, buckets_to_delete, user_pr assert created.name == bucket_name assert created.requester_pays - with_user_project = storage_client.bucket(bucket_name, user_project=user_project,) + with_user_project = storage_client.bucket( + bucket_name, + user_project=user_project, + ) try: # Exercise 'buckets.get' w/ userProject. @@ -210,7 +215,8 @@ def test_bucket_acls_iam_w_user_project( ): bucket_name = _helpers.unique_name("acl-w-user-project") created = _helpers.retry_429_503(storage_client.create_bucket)( - bucket_name, requester_pays=True, + bucket_name, + requester_pays=True, ) buckets_to_delete.append(created) @@ -282,7 +288,10 @@ def test_bucket_acls_w_metageneration_match(storage_client, buckets_to_delete): def test_bucket_copy_blob( - storage_client, buckets_to_delete, blobs_to_delete, user_project, + storage_client, + buckets_to_delete, + blobs_to_delete, + user_project, ): payload = b"DEADBEEF" bucket_name = _helpers.unique_name("copy-blob") @@ -304,7 +313,10 @@ def test_bucket_copy_blob( def test_bucket_copy_blob_w_user_project( - storage_client, buckets_to_delete, blobs_to_delete, user_project, + storage_client, + buckets_to_delete, + blobs_to_delete, + user_project, ): payload = b"DEADBEEF" bucket_name = _helpers.unique_name("copy-w-requester-pays") @@ -330,7 +342,9 @@ def test_bucket_copy_blob_w_user_project( def test_bucket_copy_blob_w_generation_match( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): payload = b"DEADBEEF" bucket_name = _helpers.unique_name("generation-match") @@ -345,7 +359,10 @@ def test_bucket_copy_blob_w_generation_match( dest_bucket = storage_client.bucket(bucket_name) new_blob = dest_bucket.copy_blob( - blob, dest_bucket, "simple-copy", if_source_generation_match=blob.generation, + blob, + dest_bucket, + "simple-copy", + if_source_generation_match=blob.generation, ) blobs_to_delete.append(new_blob) @@ -353,7 +370,9 @@ def test_bucket_copy_blob_w_generation_match( def test_bucket_copy_blob_w_metageneration_match( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): payload = b"DEADBEEF" bucket_name = _helpers.unique_name("generation-match") @@ -381,7 +400,10 @@ def test_bucket_copy_blob_w_metageneration_match( def test_bucket_get_blob_with_user_project( - storage_client, buckets_to_delete, blobs_to_delete, user_project, + storage_client, + buckets_to_delete, + blobs_to_delete, + user_project, ): blob_name = "blob-name" payload = b"DEADBEEF" @@ -413,7 +435,10 @@ def test_bucket_list_blobs(listable_bucket, listable_filenames): @_helpers.retry_failures def test_bucket_list_blobs_w_user_project( - storage_client, listable_bucket, listable_filenames, user_project, + storage_client, + listable_bucket, + listable_filenames, + user_project, ): with_user_project = storage_client.bucket( listable_bucket.name, user_project=user_project @@ -545,7 +570,8 @@ def test_bucket_list_blobs_hierarchy_third_level(hierarchy_bucket, hierarchy_fil @_helpers.retry_failures def test_bucket_list_blobs_hierarchy_w_include_trailing_delimiter( - hierarchy_bucket, hierarchy_filenames, + hierarchy_bucket, + hierarchy_filenames, ): expected_names = ["file01.txt", "parent/"] expected_prefixes = set(["parent/"]) @@ -562,7 +588,9 @@ def test_bucket_list_blobs_hierarchy_w_include_trailing_delimiter( def test_bucket_w_retention_period( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): period_secs = 10 bucket_name = _helpers.unique_name("w-retention-period") @@ -613,7 +641,9 @@ def test_bucket_w_retention_period( def test_bucket_w_default_event_based_hold( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): bucket_name = _helpers.unique_name("w-def-ebh") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) @@ -670,7 +700,9 @@ def test_bucket_w_default_event_based_hold( def test_blob_w_temporary_hold( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): bucket_name = _helpers.unique_name("w-tmp-hold") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) @@ -702,7 +734,8 @@ def test_blob_w_temporary_hold( def test_bucket_lock_retention_policy( - storage_client, buckets_to_delete, + storage_client, + buckets_to_delete, ): period_secs = 10 bucket_name = _helpers.unique_name("loc-ret-policy") @@ -728,7 +761,9 @@ def test_bucket_lock_retention_policy( def test_new_bucket_w_ubla( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): bucket_name = _helpers.unique_name("new-w-ubla") bucket = storage_client.bucket(bucket_name) @@ -765,7 +800,9 @@ def test_new_bucket_w_ubla( def test_ubla_set_unset_preserves_acls( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): bucket_name = _helpers.unique_name("ubla-acls") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) @@ -806,7 +843,9 @@ def test_ubla_set_unset_preserves_acls( def test_new_bucket_created_w_inherited_pap( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): from google.cloud.storage import constants @@ -857,7 +896,9 @@ def test_new_bucket_created_w_inherited_pap( @pytest.mark.skip(reason="Unspecified PAP is changing to inherited") def test_new_bucket_created_w_enforced_pap( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): from google.cloud.storage import constants @@ -888,7 +929,9 @@ def test_new_bucket_created_w_enforced_pap( def test_new_bucket_with_rpo( - storage_client, buckets_to_delete, blobs_to_delete, + storage_client, + buckets_to_delete, + blobs_to_delete, ): from google.cloud.storage import constants diff --git a/tests/system/test_client.py b/tests/system/test_client.py index f531f4bb4..3329ee7a3 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -33,7 +33,8 @@ def test_anonymous_client_access_to_public_bucket(): anonymous_client = Client.create_anonymous_client() bucket = anonymous_client.bucket(public_bucket) (blob,) = _helpers.retry_429_503(anonymous_client.list_blobs)( - bucket, max_results=1, + bucket, + max_results=1, ) with tempfile.TemporaryFile() as stream: _helpers.retry_429_503(blob.download_to_file)(stream) @@ -85,7 +86,10 @@ def test_list_buckets(storage_client, buckets_to_delete): def test_download_blob_to_file_w_uri( - storage_client, shared_bucket, blobs_to_delete, service_account, + storage_client, + shared_bucket, + blobs_to_delete, + service_account, ): blob = shared_bucket.blob("MyBuffer") payload = b"Hello World" @@ -106,7 +110,10 @@ def test_download_blob_to_file_w_uri( def test_download_blob_to_file_w_etag( - storage_client, shared_bucket, blobs_to_delete, service_account, + storage_client, + shared_bucket, + blobs_to_delete, + service_account, ): filename = "kittens" blob = shared_bucket.blob(filename) @@ -140,6 +147,8 @@ def test_download_blob_to_file_w_etag( buffer = io.BytesIO() storage_client.download_blob_to_file( - "gs://" + shared_bucket.name + "/" + filename, buffer, if_etag_match=blob.etag, + "gs://" + shared_bucket.name + "/" + filename, + buffer, + if_etag_match=blob.etag, ) assert buffer.getvalue() == payload diff --git a/tests/system/test_fileio.py b/tests/system/test_fileio.py index 79bf0c1eb..79e0ab7da 100644 --- a/tests/system/test_fileio.py +++ b/tests/system/test_fileio.py @@ -18,7 +18,10 @@ def test_blobwriter_and_blobreader( - shared_bucket, blobs_to_delete, file_data, service_account, + shared_bucket, + blobs_to_delete, + file_data, + service_account, ): blob = shared_bucket.blob("LargeFile") @@ -49,12 +52,14 @@ def test_blobwriter_and_blobreader( def test_blobwriter_and_blobreader_text_mode( - shared_bucket, blobs_to_delete, service_account, + shared_bucket, + blobs_to_delete, + service_account, ): blob = shared_bucket.blob("MultibyteTextFile") # Construct a multibyte text_data sample file. - base_multibyte_text_string = u"abcde あいうえお line: " + base_multibyte_text_string = "abcde あいうえお line: " text_data = "\n".join([base_multibyte_text_string + str(x) for x in range(100)]) # Test text BlobWriter works. diff --git a/tests/system/test_kms_integration.py b/tests/system/test_kms_integration.py index 67dc5351f..9636acd54 100644 --- a/tests/system/test_kms_integration.py +++ b/tests/system/test_kms_integration.py @@ -28,7 +28,10 @@ def _kms_key_name(client, bucket, key_name): return _key_name_format.format( - client.project, bucket.location.lower(), keyring_name, key_name, + client.project, + bucket.location.lower(), + keyring_name, + key_name, ) @@ -127,7 +130,11 @@ def test_blob_w_explicit_kms_key_name( @_helpers.retry_failures def test_bucket_w_default_kms_key_name( - kms_bucket, blobs_to_delete, kms_key_name, alt_kms_key_name, file_data, + kms_bucket, + blobs_to_delete, + kms_key_name, + alt_kms_key_name, + file_data, ): blob_name = "default-kms-key-name" override_blob_name = "override-default-kms-key-name" @@ -183,7 +190,10 @@ def test_bucket_w_default_kms_key_name( def test_blob_rewrite_rotate_csek_to_cmek( - kms_bucket, blobs_to_delete, kms_key_name, file_data, + kms_bucket, + blobs_to_delete, + kms_key_name, + file_data, ): blob_name = "rotating-keys" source_key = os.urandom(32) @@ -216,7 +226,10 @@ def test_blob_rewrite_rotate_csek_to_cmek( def test_blob_upload_w_bucket_cmek_enabled( - kms_bucket, blobs_to_delete, kms_key_name, file_data, + kms_bucket, + blobs_to_delete, + kms_key_name, + file_data, ): blob_name = "test-blob" payload = b"DEADBEEF" diff --git a/tests/system/test_notification.py b/tests/system/test_notification.py index 6c49064aa..59d0dfafd 100644 --- a/tests/system/test_notification.py +++ b/tests/system/test_notification.py @@ -70,7 +70,10 @@ def notification_topic(storage_client, publisher_client, topic_path, no_mtls): def test_notification_create_minimal( - storage_client, buckets_to_delete, topic_name, notification_topic, + storage_client, + buckets_to_delete, + topic_name, + notification_topic, ): bucket_name = _helpers.unique_name("notification-minimal") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) @@ -126,7 +129,11 @@ def test_notification_create_explicit( def test_notification_create_w_user_project( - storage_client, buckets_to_delete, topic_name, notification_topic, user_project, + storage_client, + buckets_to_delete, + topic_name, + notification_topic, + user_project, ): bucket_name = _helpers.unique_name("notification-w-up") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index 1b0a033dc..6c8770576 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -176,7 +176,9 @@ def test_reload_w_etag_match(self): derived._changes = object() derived.client = client - derived.reload(if_etag_match=etag,) + derived.reload( + if_etag_match=etag, + ) self.assertEqual(derived._properties, response) self.assertEqual(derived._changes, set()) @@ -453,7 +455,8 @@ def test_update_with_metageneration_not_match_w_timeout_w_retry(self): timeout = 42 derived.update( - if_metageneration_not_match=generation_number, timeout=timeout, + if_metageneration_not_match=generation_number, + timeout=timeout, ) self.assertEqual(derived._properties, {"foo": "Foo"}) diff --git a/tests/unit/test__signing.py b/tests/unit/test__signing.py index f863460c5..48c9a00e1 100644 --- a/tests/unit/test__signing.py +++ b/tests/unit/test__signing.py @@ -678,7 +678,9 @@ def test_with_signer_email(self): credentials = _make_credentials(signer_email=signer_email) credentials.sign_bytes.return_value = b"DEADBEEF" self._call_fut( - credentials, resource=resource, expiration=datetime.timedelta(days=5), + credentials, + resource=resource, + expiration=datetime.timedelta(days=5), ) def test_with_service_account_email_and_signer_email(self): @@ -873,8 +875,10 @@ def test_conformance_blob(test_data): # For the VIRTUAL_HOSTED_STYLE else: - _API_ACCESS_ENDPOINT = "{scheme}://{bucket_name}.storage.googleapis.com".format( - scheme=test_data["scheme"], bucket_name=test_data["bucket"] + _API_ACCESS_ENDPOINT = ( + "{scheme}://{bucket_name}.storage.googleapis.com".format( + scheme=test_data["scheme"], bucket_name=test_data["bucket"] + ) ) resource = "/{}".format(test_data["object"]) _run_conformance_test(resource, test_data, _API_ACCESS_ENDPOINT) diff --git a/tests/unit/test_batch.py b/tests/unit/test_batch.py index 89bf583e9..8b347fcf8 100644 --- a/tests/unit/test_batch.py +++ b/tests/unit/test_batch.py @@ -577,9 +577,9 @@ def _unpack_helper(self, response, content): self.assertEqual(len(result), 3) self.assertEqual(result[0].status_code, http.client.OK) - self.assertEqual(result[0].json(), {u"bar": 2, u"foo": 1}) + self.assertEqual(result[0].json(), {"bar": 2, "foo": 1}) self.assertEqual(result[1].status_code, http.client.OK) - self.assertEqual(result[1].json(), {u"foo": 1, u"bar": 3}) + self.assertEqual(result[1].json(), {"foo": 1, "bar": 3}) self.assertEqual(result[2].status_code, http.client.NO_CONTENT) def test_bytes_headers(self): @@ -588,7 +588,7 @@ def test_bytes_headers(self): self._unpack_helper(RESPONSE, CONTENT) def test_unicode_headers(self): - RESPONSE = {"content-type": u'multipart/mixed; boundary="DEADBEEF="'} + RESPONSE = {"content-type": 'multipart/mixed; boundary="DEADBEEF="'} CONTENT = _THREE_PART_MIME_RESPONSE self._unpack_helper(RESPONSE, CONTENT) diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index ba1b38752..f48b4a1e2 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -79,7 +79,7 @@ def test_ctor_wo_encryption_key(self): def test_ctor_with_encoded_unicode(self): blob_name = b"wet \xe2\x9b\xb5" blob = self._make_one(blob_name, bucket=None) - unicode_name = u"wet \N{sailboat}" + unicode_name = "wet \N{sailboat}" self.assertNotIsInstance(blob.name, bytes) self.assertIsInstance(blob.name, str) self.assertEqual(blob.name, unicode_name) @@ -262,7 +262,7 @@ def test_acl_property(self): from google.cloud.storage.acl import ObjectACL fake_bucket = _Bucket() - blob = self._make_one(u"name", bucket=fake_bucket) + blob = self._make_one("name", bucket=fake_bucket) acl = blob.acl self.assertIsInstance(acl, ObjectACL) self.assertIs(acl, blob._acl) @@ -305,13 +305,13 @@ def test_kms_key_name_setter(self): def test_path_bad_bucket(self): fake_bucket = object() - name = u"blob-name" + name = "blob-name" blob = self._make_one(name, bucket=fake_bucket) self.assertRaises(AttributeError, getattr, blob, "path") def test_path_no_name(self): bucket = _Bucket() - blob = self._make_one(u"", bucket=bucket) + blob = self._make_one("", bucket=bucket) self.assertRaises(ValueError, getattr, blob, "path") def test_path_normal(self): @@ -327,7 +327,7 @@ def test_path_w_slash_in_name(self): self.assertEqual(blob.path, "/b/name/o/parent%2Fchild") def test_path_with_non_ascii(self): - blob_name = u"Caf\xe9" + blob_name = "Caf\xe9" bucket = _Bucket() blob = self._make_one(blob_name, bucket=bucket) self.assertEqual(blob.path, "/b/name/o/Caf%C3%A9") @@ -417,7 +417,7 @@ def test_public_url_w_tilde_in_name(self): self.assertEqual(blob.public_url, "https://storage.googleapis.com/name/foo~bar") def test_public_url_with_non_ascii(self): - blob_name = u"winter \N{snowman}" + blob_name = "winter \N{snowman}" bucket = _Bucket() blob = self._make_one(blob_name, bucket=bucket) expected_url = "https://storage.googleapis.com/name/winter%20%E2%98%83" @@ -570,7 +570,7 @@ def test_generate_signed_url_v2_w_expiration(self): self._generate_signed_url_v2_helper(expiration=expiration) def test_generate_signed_url_v2_w_non_ascii_name(self): - BLOB_NAME = u"\u0410\u043a\u043a\u043e\u0440\u0434\u044b.txt" + BLOB_NAME = "\u0410\u043a\u043a\u043e\u0440\u0434\u044b.txt" self._generate_signed_url_v2_helper(blob_name=BLOB_NAME) def test_generate_signed_url_v2_w_slash_in_name(self): @@ -630,7 +630,7 @@ def test_generate_signed_url_v4_w_defaults(self): self._generate_signed_url_v4_helper() def test_generate_signed_url_v4_w_non_ascii_name(self): - BLOB_NAME = u"\u0410\u043a\u043a\u043e\u0440\u0434\u044b.txt" + BLOB_NAME = "\u0410\u043a\u043a\u043e\u0440\u0434\u044b.txt" self._generate_signed_url_v4_helper(blob_name=BLOB_NAME) def test_generate_signed_url_v4_w_slash_in_name(self): @@ -770,7 +770,12 @@ def test_exists_w_etag_match(self): bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket) - self.assertTrue(blob.exists(if_etag_match=etag, retry=None,)) + self.assertTrue( + blob.exists( + if_etag_match=etag, + retry=None, + ) + ) expected_query_params = { "fields": "name", @@ -901,9 +906,9 @@ def test_delete_w_generation_match(self): ) def test__get_transport(self): - client = mock.Mock(spec=[u"_credentials", "_http"]) + client = mock.Mock(spec=["_credentials", "_http"]) client._http = mock.sentinel.transport - blob = self._make_one(u"blob-name", bucket=None) + blob = self._make_one("blob-name", bucket=None) transport = blob._get_transport(client) @@ -1896,7 +1901,7 @@ def _download_as_text_helper( encoding=None, charset=None, no_charset=False, - expected_value=u"DEADBEEF", + expected_value="DEADBEEF", payload=None, **extra_kwargs ): @@ -2002,22 +2007,26 @@ def test_download_as_text_w_custom_timeout(self): def test_download_as_text_w_if_etag_match_str(self): self._download_as_text_helper( - raw_download=False, if_etag_match="kittens", + raw_download=False, + if_etag_match="kittens", ) def test_download_as_text_w_if_etag_match_list(self): self._download_as_text_helper( - raw_download=False, if_etag_match=["kittens", "fluffy"], + raw_download=False, + if_etag_match=["kittens", "fluffy"], ) def test_download_as_text_w_if_etag_not_match_str(self): self._download_as_text_helper( - raw_download=False, if_etag_not_match="kittens", + raw_download=False, + if_etag_not_match="kittens", ) def test_download_as_text_w_if_etag_not_match_list(self): self._download_as_text_helper( - raw_download=False, if_etag_not_match=["kittens", "fluffy"], + raw_download=False, + if_etag_not_match=["kittens", "fluffy"], ) def test_download_as_text_w_if_generation_match(self): @@ -2035,16 +2044,18 @@ def test_download_as_text_w_if_metageneration_not_match(self): def test_download_as_text_w_encoding(self): encoding = "utf-16" self._download_as_text_helper( - raw_download=False, encoding=encoding, + raw_download=False, + encoding=encoding, ) def test_download_as_text_w_no_charset(self): self._download_as_text_helper( - raw_download=False, no_charset=True, + raw_download=False, + no_charset=True, ) def test_download_as_text_w_non_ascii_w_explicit_encoding(self): - expected_value = u"\x0AFe" + expected_value = "\x0AFe" encoding = "utf-16" charset = "latin1" payload = expected_value.encode(encoding) @@ -2057,7 +2068,7 @@ def test_download_as_text_w_non_ascii_w_explicit_encoding(self): ) def test_download_as_text_w_non_ascii_wo_explicit_encoding_w_charset(self): - expected_value = u"\x0AFe" + expected_value = "\x0AFe" charset = "utf-16" payload = expected_value.encode(charset) self._download_as_text_helper( @@ -2100,7 +2111,9 @@ def test_download_as_string(self, mock_warn): ) mock_warn.assert_called_once_with( - _DOWNLOAD_AS_STRING_DEPRECATED, PendingDeprecationWarning, stacklevel=2, + _DOWNLOAD_AS_STRING_DEPRECATED, + PendingDeprecationWarning, + stacklevel=2, ) @mock.patch("warnings.warn") @@ -2136,37 +2149,39 @@ def test_download_as_string_no_retry(self, mock_warn): ) mock_warn.assert_called_once_with( - _DOWNLOAD_AS_STRING_DEPRECATED, PendingDeprecationWarning, stacklevel=2, + _DOWNLOAD_AS_STRING_DEPRECATED, + PendingDeprecationWarning, + stacklevel=2, ) def test__get_content_type_explicit(self): - blob = self._make_one(u"blob-name", bucket=None) + blob = self._make_one("blob-name", bucket=None) - content_type = u"text/plain" + content_type = "text/plain" return_value = blob._get_content_type(content_type) self.assertEqual(return_value, content_type) def test__get_content_type_from_blob(self): - blob = self._make_one(u"blob-name", bucket=None) - blob.content_type = u"video/mp4" + blob = self._make_one("blob-name", bucket=None) + blob.content_type = "video/mp4" return_value = blob._get_content_type(None) self.assertEqual(return_value, blob.content_type) def test__get_content_type_from_filename(self): - blob = self._make_one(u"blob-name", bucket=None) + blob = self._make_one("blob-name", bucket=None) return_value = blob._get_content_type(None, filename="archive.tar") self.assertEqual(return_value, "application/x-tar") def test__get_content_type_default(self): - blob = self._make_one(u"blob-name", bucket=None) + blob = self._make_one("blob-name", bucket=None) return_value = blob._get_content_type(None) - self.assertEqual(return_value, u"application/octet-stream") + self.assertEqual(return_value, "application/octet-stream") def test__get_writable_metadata_no_changes(self): - name = u"blob-name" + name = "blob-name" blob = self._make_one(name, bucket=None) object_metadata = blob._get_writable_metadata() @@ -2174,7 +2189,7 @@ def test__get_writable_metadata_no_changes(self): self.assertEqual(object_metadata, expected) def test__get_writable_metadata_with_changes(self): - name = u"blob-name" + name = "blob-name" blob = self._make_one(name, bucket=None) blob.storage_class = "NEARLINE" blob.cache_control = "max-age=3600" @@ -2190,7 +2205,7 @@ def test__get_writable_metadata_with_changes(self): self.assertEqual(object_metadata, expected) def test__get_writable_metadata_unwritable_field(self): - name = u"blob-name" + name = "blob-name" properties = {"updated": "2016-10-16T18:18:18.181Z"} blob = self._make_one(name, bucket=None, properties=properties) # Fake that `updated` is in changes. @@ -2201,7 +2216,7 @@ def test__get_writable_metadata_unwritable_field(self): self.assertEqual(object_metadata, expected) def test__set_metadata_to_none(self): - name = u"blob-name" + name = "blob-name" blob = self._make_one(name, bucket=None) blob.storage_class = "NEARLINE" blob.cache_control = "max-age=3600" @@ -2211,14 +2226,14 @@ def test__set_metadata_to_none(self): patch_prop.assert_called_once_with("metadata", None) def test__get_upload_arguments(self): - name = u"blob-name" + name = "blob-name" key = b"[pXw@,p@@AfBfrR3x-2b2SCHR,.?YwRO" client = mock.Mock(_connection=_Connection) client._connection.user_agent = "testing 1.2.3" blob = self._make_one(name, bucket=None, encryption_key=key) blob.content_disposition = "inline" - content_type = u"image/jpeg" + content_type = "image/jpeg" info = blob._get_upload_arguments(client, content_type) headers, object_metadata, new_content_type = info @@ -2265,7 +2280,7 @@ def _do_multipart_success( retry=None, ): bucket = _Bucket(name="w00t", user_project=user_project) - blob = self._make_one(u"blob-name", bucket=bucket, kms_key_name=kms_key_name) + blob = self._make_one("blob-name", bucket=bucket, kms_key_name=kms_key_name) self.assertIsNone(blob.chunk_size) if metadata: self.assertIsNone(blob.metadata) @@ -2289,7 +2304,7 @@ def _do_multipart_success( data = b"data here hear hier" stream = io.BytesIO(data) - content_type = u"application/xml" + content_type = "application/xml" if timeout is None: expected_timeout = self._get_default_timeout() @@ -2381,23 +2396,23 @@ def _do_multipart_success( "POST", upload_url, data=payload, headers=headers, timeout=expected_timeout ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_no_size(self, mock_get_boundary): self._do_multipart_success(mock_get_boundary, predefined_acl="private") - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_no_size_retry(self, mock_get_boundary): self._do_multipart_success( mock_get_boundary, predefined_acl="private", retry=DEFAULT_RETRY ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_no_size_num_retries(self, mock_get_boundary): self._do_multipart_success( mock_get_boundary, predefined_acl="private", num_retries=2 ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_no_size_retry_conflict(self, mock_get_boundary): with self.assertRaises(ValueError): self._do_multipart_success( @@ -2407,22 +2422,22 @@ def test__do_multipart_upload_no_size_retry_conflict(self, mock_get_boundary): retry=DEFAULT_RETRY, ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_no_size_mtls(self, mock_get_boundary): self._do_multipart_success( mock_get_boundary, predefined_acl="private", mtls=True ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_size(self, mock_get_boundary): self._do_multipart_success(mock_get_boundary, size=10) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_user_project(self, mock_get_boundary): user_project = "user-project-123" self._do_multipart_success(mock_get_boundary, user_project=user_project) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_kms(self, mock_get_boundary): kms_resource = ( "projects/test-project-123/" @@ -2432,7 +2447,7 @@ def test__do_multipart_upload_with_kms(self, mock_get_boundary): ) self._do_multipart_success(mock_get_boundary, kms_key_name=kms_resource) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_kms_with_version(self, mock_get_boundary): kms_resource = ( "projects/test-project-123/" @@ -2443,39 +2458,39 @@ def test__do_multipart_upload_with_kms_with_version(self, mock_get_boundary): ) self._do_multipart_success(mock_get_boundary, kms_key_name=kms_resource) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_retry(self, mock_get_boundary): self._do_multipart_success(mock_get_boundary, retry=DEFAULT_RETRY) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_generation_match(self, mock_get_boundary): self._do_multipart_success( mock_get_boundary, if_generation_match=4, if_metageneration_match=4 ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_custom_timeout(self, mock_get_boundary): self._do_multipart_success(mock_get_boundary, timeout=9.58) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_generation_not_match(self, mock_get_boundary): self._do_multipart_success( mock_get_boundary, if_generation_not_match=4, if_metageneration_not_match=4 ) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_client(self, mock_get_boundary): transport = self._mock_transport(http.client.OK, {}) client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" self._do_multipart_success(mock_get_boundary, client=client) - @mock.patch(u"google.resumable_media._upload.get_boundary", return_value=b"==0==") + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") def test__do_multipart_upload_with_metadata(self, mock_get_boundary): self._do_multipart_success(mock_get_boundary, metadata={"test": "test"}) def test__do_multipart_upload_bad_size(self): - blob = self._make_one(u"blob-name", bucket=None) + blob = self._make_one("blob-name", bucket=None) data = b"data here hear hier" stream = io.BytesIO(data) @@ -2515,7 +2530,7 @@ def _initiate_resumable_helper( from google.cloud.storage.blob import _DEFAULT_CHUNKSIZE bucket = _Bucket(name="whammy", user_project=user_project) - blob = self._make_one(u"blob-name", bucket=bucket, kms_key_name=kms_key_name) + blob = self._make_one("blob-name", bucket=bucket, kms_key_name=kms_key_name) if metadata: self.assertIsNone(blob.metadata) blob._properties["metadata"] = metadata @@ -2543,9 +2558,7 @@ def _initiate_resumable_helper( transport = self._mock_transport(http.client.OK, response_headers) # Create some mock arguments and call the method under test. - client = mock.Mock( - _http=transport, _connection=_Connection, spec=[u"_http"] - ) + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" # Mock get_api_base_url_for_mtls function. @@ -2557,7 +2570,7 @@ def _initiate_resumable_helper( data = b"hello hallo halo hi-low" stream = io.BytesIO(data) - content_type = u"text/plain" + content_type = "text/plain" if timeout is None: expected_timeout = self._get_default_timeout() @@ -2666,7 +2679,7 @@ def _initiate_resumable_helper( self.assertEqual(stream.tell(), 0) if metadata: - object_metadata = {"name": u"blob-name", "metadata": metadata} + object_metadata = {"name": "blob-name", "metadata": metadata} else: # Check the mocks. blob._get_writable_metadata.assert_called_once_with() @@ -2763,7 +2776,7 @@ def test__initiate_resumable_upload_with_client(self): response_headers = {"location": resumable_url} transport = self._mock_transport(http.client.OK, response_headers) - client = mock.Mock(_http=transport, _connection=_Connection, spec=[u"_http"]) + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" self._initiate_resumable_helper(client=client) @@ -2908,7 +2921,7 @@ def _do_resumable_helper( ): CHUNK_SIZE = 256 * 1024 USER_AGENT = "testing 1.2.3" - content_type = u"text/html" + content_type = "text/html" # Data to be uploaded. data = b"" + (b"A" * CHUNK_SIZE) + b"" total_bytes = len(data) @@ -2939,7 +2952,7 @@ def _do_resumable_helper( stream = io.BytesIO(data) bucket = _Bucket(name="yesterday") - blob = self._make_one(u"blob-name", bucket=bucket) + blob = self._make_one("blob-name", bucket=bucket) blob.chunk_size = blob._CHUNK_SIZE_MULTIPLE self.assertIsNotNone(blob.chunk_size) @@ -3059,10 +3072,10 @@ def _do_upload_helper( ): from google.cloud.storage.blob import _MAX_MULTIPART_SIZE - blob = self._make_one(u"blob-name", bucket=None) + blob = self._make_one("blob-name", bucket=None) # Create a fake response. - response = mock.Mock(spec=[u"json"]) + response = mock.Mock(spec=["json"]) response.json.return_value = mock.sentinel.json # Mock **both** helpers. blob._do_multipart_upload = mock.Mock(return_value=response, spec=[]) @@ -3076,7 +3089,7 @@ def _do_upload_helper( client = mock.sentinel.client stream = mock.sentinel.stream - content_type = u"video/mp4" + content_type = "video/mp4" if size is None: size = 12345654321 @@ -3196,7 +3209,7 @@ def _upload_from_file_helper(self, side_effect=None, **kwargs): data = b"data is here" stream = io.BytesIO(data) stream.seek(2) # Not at zero. - content_type = u"font/woff" + content_type = "font/woff" client = mock.sentinel.client predefined_acl = kwargs.get("predefined_acl", None) if_generation_match = kwargs.get("if_generation_match", None) @@ -3250,7 +3263,9 @@ def test_upload_from_file_w_num_retries(self, mock_warn): self._upload_from_file_helper(num_retries=2) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) @mock.patch("warnings.warn") @@ -3263,7 +3278,9 @@ def test_upload_from_file_with_retry_conflict(self, mock_warn): self._upload_from_file_helper(retry=DEFAULT_RETRY, num_retries=2) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) def test_upload_from_file_with_rewind(self): @@ -3336,7 +3353,7 @@ def test_upload_from_filename(self): self.assertIsNone(blob.metadata) data = b"soooo much data" - content_type = u"image/svg+xml" + content_type = "image/svg+xml" client = mock.sentinel.client with _NamedTemporaryFile() as temp: with open(temp.name, "wb") as file_obj: @@ -3367,7 +3384,7 @@ def test_upload_from_filename_with_retry(self): self.assertIsNone(blob.metadata) data = b"soooo much data" - content_type = u"image/svg+xml" + content_type = "image/svg+xml" client = mock.sentinel.client with _NamedTemporaryFile() as temp: with open(temp.name, "wb") as file_obj: @@ -3402,7 +3419,7 @@ def test_upload_from_filename_w_num_retries(self, mock_warn): self.assertIsNone(blob.metadata) data = b"soooo much data" - content_type = u"image/svg+xml" + content_type = "image/svg+xml" client = mock.sentinel.client with _NamedTemporaryFile() as temp: with open(temp.name, "wb") as file_obj: @@ -3425,7 +3442,9 @@ def test_upload_from_filename_w_num_retries(self, mock_warn): self.assertEqual(stream.name, temp.name) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) def test_upload_from_filename_w_custom_timeout(self): @@ -3439,7 +3458,7 @@ def test_upload_from_filename_w_custom_timeout(self): self.assertIsNone(blob.metadata) data = b"soooo much data" - content_type = u"image/svg+xml" + content_type = "image/svg+xml" client = mock.sentinel.client with _NamedTemporaryFile() as temp: with open(temp.name, "wb") as file_obj: @@ -3499,22 +3518,24 @@ def test_upload_from_string_w_bytes(self): self._upload_from_string_helper(data) def test_upload_from_string_w_text(self): - data = u"\N{snowman} \N{sailboat}" + data = "\N{snowman} \N{sailboat}" self._upload_from_string_helper(data) def test_upload_from_string_w_text_w_retry(self): - data = u"\N{snowman} \N{sailboat}" + data = "\N{snowman} \N{sailboat}" self._upload_from_string_helper(data, retry=DEFAULT_RETRY) @mock.patch("warnings.warn") def test_upload_from_string_with_num_retries(self, mock_warn): from google.cloud.storage._helpers import _NUM_RETRIES_MESSAGE - data = u"\N{snowman} \N{sailboat}" + data = "\N{snowman} \N{sailboat}" self._upload_from_string_helper(data, num_retries=2) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) def _create_resumable_upload_session_helper( @@ -3541,9 +3562,9 @@ def _create_resumable_upload_session_helper( transport.request.side_effect = side_effect # Create some mock arguments and call the method under test. - content_type = u"text/plain" + content_type = "text/plain" size = 10000 - client = mock.Mock(_http=transport, _connection=_Connection, spec=[u"_http"]) + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" client._connection.user_agent = "testing 1.2.3" @@ -3858,7 +3879,10 @@ def test_set_iam_policy_w_user_project_w_explicit_client_w_timeout_retry(self): retry = mock.Mock(spec=[]) returned = blob.set_iam_policy( - policy, client=client, timeout=timeout, retry=retry, + policy, + client=client, + timeout=timeout, + retry=retry, ) self.assertEqual(returned.etag, etag) @@ -4348,7 +4372,8 @@ def test_compose_w_generation_match(self): destination = self._make_one(destination_name, bucket=bucket) destination.compose( - sources=[source_1, source_2], if_generation_match=generation_number, + sources=[source_1, source_2], + if_generation_match=generation_number, ) expected_path = "/b/name/o/%s/compose" % destination_name @@ -4387,7 +4412,8 @@ def test_compose_w_if_generation_match_list_w_warning(self, mock_warn): destination = self._make_one(destination_name, bucket=bucket) destination.compose( - sources=[source_1, source_2], if_generation_match=generation_numbers, + sources=[source_1, source_2], + if_generation_match=generation_numbers, ) expected_path = "/b/name/o/%s/compose" % destination_name @@ -4421,7 +4447,9 @@ def test_compose_w_if_generation_match_list_w_warning(self, mock_warn): ) mock_warn.assert_called_with( - _COMPOSE_IF_GENERATION_LIST_DEPRECATED, DeprecationWarning, stacklevel=2, + _COMPOSE_IF_GENERATION_LIST_DEPRECATED, + DeprecationWarning, + stacklevel=2, ) @mock.patch("warnings.warn") @@ -4449,7 +4477,9 @@ def test_compose_w_if_generation_match_and_if_s_generation_match(self, mock_warn client._post_resource.assert_not_called() mock_warn.assert_called_with( - _COMPOSE_IF_GENERATION_LIST_DEPRECATED, DeprecationWarning, stacklevel=2, + _COMPOSE_IF_GENERATION_LIST_DEPRECATED, + DeprecationWarning, + stacklevel=2, ) @mock.patch("warnings.warn") @@ -4468,7 +4498,8 @@ def test_compose_w_if_metageneration_match_list_w_warning(self, mock_warn): destination = self._make_one(destination_name, bucket=bucket) destination.compose( - sources=[source_1, source_2], if_metageneration_match=metageneration_number, + sources=[source_1, source_2], + if_metageneration_match=metageneration_number, ) expected_path = "/b/name/o/%s/compose" % destination_name @@ -4509,7 +4540,8 @@ def test_compose_w_metageneration_match(self): destination = self._make_one(destination_name, bucket=bucket) destination.compose( - sources=[source_1, source_2], if_metageneration_match=metageneration_number, + sources=[source_1, source_2], + if_metageneration_match=metageneration_number, ) expected_path = "/b/name/o/%s/compose" % destination_name @@ -4883,13 +4915,13 @@ def test_update_storage_class_invalid(self): blob.rewrite = mock.Mock(spec=[]) with self.assertRaises(ValueError): - blob.update_storage_class(u"BOGUS") + blob.update_storage_class("BOGUS") blob.rewrite.assert_not_called() def _update_storage_class_multi_pass_helper(self, **kw): blob_name = "blob-name" - storage_class = u"NEARLINE" + storage_class = "NEARLINE" rewrite_token = "TOKEN" bytes_rewritten = 42 object_size = 84 @@ -5003,7 +5035,7 @@ def test_update_storage_class_multi_pass_w_retry(self): def _update_storage_class_single_pass_helper(self, **kw): blob_name = "blob-name" - storage_class = u"NEARLINE" + storage_class = "NEARLINE" object_size = 84 client = mock.Mock(spec=[]) bucket = _Bucket(client=client) @@ -5647,7 +5679,7 @@ def test_bytes(self): self.assertEqual(quoted, "%DE%AD%BE%EF") def test_unicode(self): - helicopter = u"\U0001f681" + helicopter = "\U0001f681" quoted = self._call_fut(helicopter) self.assertEqual(quoted, "%F0%9F%9A%81") @@ -5679,21 +5711,21 @@ def _call_fut(*args, **kwargs): return _maybe_rewind(*args, **kwargs) def test_default(self): - stream = mock.Mock(spec=[u"seek"]) + stream = mock.Mock(spec=["seek"]) ret_val = self._call_fut(stream) self.assertIsNone(ret_val) stream.seek.assert_not_called() def test_do_not_rewind(self): - stream = mock.Mock(spec=[u"seek"]) + stream = mock.Mock(spec=["seek"]) ret_val = self._call_fut(stream, rewind=False) self.assertIsNone(ret_val) stream.seek.assert_not_called() def test_do_rewind(self): - stream = mock.Mock(spec=[u"seek"]) + stream = mock.Mock(spec=["seek"]) ret_val = self._call_fut(stream, rewind=True) self.assertIsNone(ret_val) diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 122233b6e..c5f1df5d2 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -392,7 +392,8 @@ def test_ctor_explicit_pap(self): bucket = self._make_bucket() config = self._make_one( - bucket, public_access_prevention=PUBLIC_ACCESS_PREVENTION_ENFORCED, + bucket, + public_access_prevention=PUBLIC_ACCESS_PREVENTION_ENFORCED, ) self.assertIs(config.bucket, bucket) @@ -1200,7 +1201,9 @@ def test_list_notifications_w_explicit(self): retry = mock.Mock(spec=[]) iterator = bucket.list_notifications( - client=other_client, timeout=timeout, retry=retry, + client=other_client, + timeout=timeout, + retry=retry, ) self.assertIs(iterator, other_client._list_resource.return_value) @@ -1209,7 +1212,10 @@ def test_list_notifications_w_explicit(self): expected_path = "/b/{}/notificationConfigs".format(bucket_name) expected_item_to_value = _item_to_notification other_client._list_resource.assert_called_once_with( - expected_path, expected_item_to_value, timeout=timeout, retry=retry, + expected_path, + expected_item_to_value, + timeout=timeout, + retry=retry, ) def test_get_notification_miss_w_defaults(self): @@ -1262,7 +1268,9 @@ def test_get_notification_hit_w_explicit_w_user_project(self): bucket = self._make_one(client=client, name=name, user_project=user_project) notification = bucket.get_notification( - notification_id=notification_id, timeout=timeout, retry=retry, + notification_id=notification_id, + timeout=timeout, + retry=retry, ) self.assertIsInstance(notification, BucketNotification) @@ -1311,7 +1319,8 @@ def test_delete_hit_w_metageneration_match_w_explicit_client(self): bucket = self._make_one(client=None, name=name) result = bucket.delete( - client=client, if_metageneration_match=metageneration_number, + client=client, + if_metageneration_match=metageneration_number, ) self.assertIsNone(result) @@ -1348,7 +1357,11 @@ def test_delete_hit_w_force_w_user_project_w_explicit_timeout_retry(self): ) bucket.delete_blobs.assert_called_once_with( - [], on_error=mock.ANY, client=client, timeout=timeout, retry=retry, + [], + on_error=mock.ANY, + client=client, + timeout=timeout, + retry=retry, ) expected_query_params = {"userProject": user_project} @@ -1595,7 +1608,8 @@ def test_delete_blobs_w_generation_match_wrong_len(self): with self.assertRaises(ValueError): bucket.delete_blobs( - [blob_name, blob_name2], if_generation_not_match=[generation_number], + [blob_name, blob_name2], + if_generation_not_match=[generation_number], ) bucket.delete_blob.assert_not_called() @@ -1895,7 +1909,10 @@ def test_copy_blob_w_source_generation_w_timeout(self): timeout = 42 new_blob = source.copy_blob( - blob, dest, source_generation=generation, timeout=timeout, + blob, + dest, + source_generation=generation, + timeout=timeout, ) self.assertIs(new_blob.bucket, dest) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index d97d25390..2292c6acd 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -532,7 +532,10 @@ def test__list_resource_w_defaults(self): client = self._make_one(project=project, credentials=credentials) connection = client._base_connection = _make_connection() - iterator = client._list_resource(path=path, item_to_value=item_to_value,) + iterator = client._list_resource( + path=path, + item_to_value=item_to_value, + ) self.assertIsInstance(iterator, HTTPIterator) self.assertIs(iterator.client, client) @@ -1356,7 +1359,9 @@ def test_create_bucket_w_predefined_acl_valid_w_timeout(self): timeout = 42 bucket = client.create_bucket( - bucket_name, predefined_acl="publicRead", timeout=timeout, + bucket_name, + predefined_acl="publicRead", + timeout=timeout, ) expected_path = "/b" @@ -1398,7 +1403,9 @@ def test_create_bucket_w_predefined_default_object_acl_valid_w_retry(self): retry = mock.Mock(spec=[]) bucket = client.create_bucket( - bucket_name, predefined_default_object_acl="publicRead", retry=retry, + bucket_name, + predefined_default_object_acl="publicRead", + retry=retry, ) expected_path = "/b" @@ -1635,7 +1642,10 @@ def test_download_blob_to_file_w_no_retry(self): def test_download_blob_to_file_w_conditional_etag_match_string(self): self._download_blob_to_file_helper( - use_chunks=True, raw_download=True, retry=None, if_etag_match="kittens", + use_chunks=True, + raw_download=True, + retry=None, + if_etag_match="kittens", ) def test_download_blob_to_file_w_conditional_etag_match_list(self): @@ -1648,7 +1658,10 @@ def test_download_blob_to_file_w_conditional_etag_match_list(self): def test_download_blob_to_file_w_conditional_etag_not_match_string(self): self._download_blob_to_file_helper( - use_chunks=True, raw_download=True, retry=None, if_etag_not_match="kittens", + use_chunks=True, + raw_download=True, + retry=None, + if_etag_not_match="kittens", ) def test_download_blob_to_file_w_conditional_etag_not_match_list(self): @@ -2057,7 +2070,11 @@ def test_list_buckets_w_explicit(self): ) def _create_hmac_key_helper( - self, explicit_project=None, user_project=None, timeout=None, retry=None, + self, + explicit_project=None, + user_project=None, + timeout=None, + retry=None, ): import datetime from google.cloud._helpers import UTC diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index a6d4e7544..c0b2d1d70 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -25,7 +25,7 @@ TEST_TEXT_DATA = string.ascii_lowercase + "\n" + string.ascii_uppercase + "\n" TEST_BINARY_DATA = TEST_TEXT_DATA.encode("utf-8") -TEST_MULTIBYTE_TEXT_DATA = u"あいうえおかきくけこさしすせそたちつてと" +TEST_MULTIBYTE_TEXT_DATA = "あいうえおかきくけこさしすせそたちつてと" PLAIN_CONTENT_TYPE = "text/plain" NUM_RETRIES = 2 @@ -397,7 +397,9 @@ def test_write(self, mock_warn): self.assertEqual(upload.transmit_next_chunk.call_count, 5) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) def test_flush_fails(self): @@ -428,7 +430,9 @@ def test_conditional_retry_failure(self): # gives us more control over close() for test purposes. chunk_size = 8 # Note: Real upload requires a multiple of 256KiB. writer = self._make_blob_writer( - blob, chunk_size=chunk_size, content_type=PLAIN_CONTENT_TYPE, + blob, + chunk_size=chunk_size, + content_type=PLAIN_CONTENT_TYPE, ) # The transmit_next_chunk method must actually consume bytes from the @@ -609,7 +613,9 @@ def test_num_retries_and_retry_conflict(self, mock_warn): ) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) @mock.patch("warnings.warn") @@ -926,8 +932,8 @@ def test_write(self, mock_warn): # The transmit_next_chunk method must actually consume bytes from the # sliding buffer for the flush() feature to work properly. - upload.transmit_next_chunk.side_effect = lambda _: unwrapped_writer._buffer.read( - chunk_size + upload.transmit_next_chunk.side_effect = ( + lambda _: unwrapped_writer._buffer.read(chunk_size) ) # Write under chunk_size. This should be buffered and the upload not @@ -951,5 +957,7 @@ def test_write(self, mock_warn): upload.transmit_next_chunk.assert_called_with(transport) mock_warn.assert_called_once_with( - _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, + _NUM_RETRIES_MESSAGE, + DeprecationWarning, + stacklevel=2, ) From e963f33ced2852b64d721d69928b54443461ec9c Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Wed, 30 Mar 2022 19:37:39 -0400 Subject: [PATCH 027/509] fix(deps): drop pkg_resources (#744) --- google/cloud/storage/_http.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index 6c9d11700..0ade1525f 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -15,20 +15,11 @@ """Create / interact with Google Cloud Storage connections.""" import functools -import os -import pkg_resources from google.cloud import _http - from google.cloud.storage import __version__ -if os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true": # pragma: NO COVER - release = pkg_resources.get_distribution("google-cloud-core").parsed_version - if release < pkg_resources.parse_version("1.6.0"): - raise ImportError("google-cloud-core >= 1.6.0 is required to use mTLS feature") - - class Connection(_http.JSONConnection): """A connection to Google Cloud Storage via the JSON REST API. Mutual TLS feature will be enabled if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "true". From 58ecf21634510b9a8d1f5968c9ff431869268819 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 1 Apr 2022 00:12:23 +0000 Subject: [PATCH 028/509] chore(python): update .pre-commit-config.yaml to use black==22.3.0 (#747) Source-Link: https://github.com/googleapis/synthtool/commit/7804ade3daae0d66649bee8df6c55484c6580b8d Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:eede5672562a32821444a8e803fb984a6f61f2237ea3de229d2de24453f4ae7d --- .flake8 | 2 +- .github/.OwlBot.lock.yaml | 3 ++- .pre-commit-config.yaml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.flake8 b/.flake8 index 29227d4cf..2e4387498 100644 --- a/.flake8 +++ b/.flake8 @@ -16,7 +16,7 @@ # Generated by synthtool. DO NOT EDIT! [flake8] -ignore = E203, E266, E501, W503 +ignore = E203, E231, E266, E501, W503 exclude = # Exclude generated code. **/proto/** diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 87dd00611..22cc254af 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:7cffbc10910c3ab1b852c05114a08d374c195a81cdec1d4a67a1d129331d0bfe + digest: sha256:eede5672562a32821444a8e803fb984a6f61f2237ea3de229d2de24453f4ae7d +# created: 2022-03-30T23:44:26.560599165Z diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 62eb5a77d..46d237160 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,7 +22,7 @@ repos: - id: end-of-file-fixer - id: check-yaml - repo: https://github.com/psf/black - rev: 19.10b0 + rev: 22.3.0 hooks: - id: black - repo: https://gitlab.com/pycqa/flake8 From 63a5c733b80c9964474b13e9f9da69210588f6d8 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 1 Apr 2022 02:16:16 +0000 Subject: [PATCH 029/509] chore(python): Enable size-label bot (#749) Source-Link: https://github.com/googleapis/synthtool/commit/06e82790dd719a165ad32b8a06f8f6ec3e3cae0f Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:b3500c053313dc34e07b1632ba9e4e589f4f77036a7cf39e1fe8906811ae0fce --- .github/.OwlBot.lock.yaml | 4 ++-- .github/auto-label.yaml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 .github/auto-label.yaml diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 22cc254af..58a0b153b 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:eede5672562a32821444a8e803fb984a6f61f2237ea3de229d2de24453f4ae7d -# created: 2022-03-30T23:44:26.560599165Z + digest: sha256:b3500c053313dc34e07b1632ba9e4e589f4f77036a7cf39e1fe8906811ae0fce +# created: 2022-04-01T01:42:03.609279246Z diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml new file mode 100644 index 000000000..09c8d735b --- /dev/null +++ b/.github/auto-label.yaml @@ -0,0 +1,2 @@ +requestsize: + enabled: true From 525de03d467ef9bb026423ee6970f75c12221f03 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Sun, 3 Apr 2022 22:02:20 +0200 Subject: [PATCH 030/509] chore(deps): update dependency pandas to v1.4.2 (#751) * chore(deps): update dependency pandas to v1.4.2 * revert pin change for py37; use === to prevent updates for environment specific pins Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 82d925eda..f13df193d 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.11.0 google-cloud-storage==2.2.1 -pandas==1.3.5; python_version == '3.7' -pandas==1.4.0; python_version >= '3.8' +pandas===1.3.5; python_version == '3.7' +pandas==1.4.2; python_version >= '3.8' From 924b65f89c128ba567b984814ede82606bcaead5 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:00:57 +0000 Subject: [PATCH 031/509] chore(python): add license header to auto-label.yaml (#754) Source-Link: https://github.com/googleapis/synthtool/commit/eb78c980b52c7c6746d2edb77d9cf7aaa99a2aab Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:8a5d3f6a2e43ed8293f34e06a2f56931d1e88a2694c3bb11b15df4eb256ad163 --- .github/.OwlBot.lock.yaml | 4 ++-- .github/auto-label.yaml | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 58a0b153b..bc893c979 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:b3500c053313dc34e07b1632ba9e4e589f4f77036a7cf39e1fe8906811ae0fce -# created: 2022-04-01T01:42:03.609279246Z + digest: sha256:8a5d3f6a2e43ed8293f34e06a2f56931d1e88a2694c3bb11b15df4eb256ad163 +# created: 2022-04-06T10:30:21.687684602Z diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml index 09c8d735b..41bff0b53 100644 --- a/.github/auto-label.yaml +++ b/.github/auto-label.yaml @@ -1,2 +1,15 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. requestsize: enabled: true From 752e8ab42d23afd68738e4d7ca6cdeee416dfd50 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 6 Apr 2022 14:18:35 -0700 Subject: [PATCH 032/509] feat: add dual region bucket support and sample (#748) * feat: add dual region bucket support and tests * add dual region bucket sample * fix lint * update docstrings and doc ref links Co-authored-by: Daniel Bankhead --- google/cloud/storage/bucket.py | 2 +- google/cloud/storage/client.py | 5 +- samples/README.md | 10 ++++ samples/snippets/snippets_test.py | 11 ++++ .../storage_create_bucket_dual_region.py | 50 +++++++++++++++++++ tests/system/test_client.py | 21 ++++++++ 6 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 samples/snippets/storage_create_bucket_dual_region.py diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 0fa5894b7..85c9302f7 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2316,7 +2316,7 @@ def location(self): """Retrieve location configured for this bucket. See https://cloud.google.com/storage/docs/json_api/v1/buckets and - https://cloud.google.com/storage/docs/bucket-locations + https://cloud.google.com/storage/docs/locations Returns ``None`` if the property has not been set before creation, or if the bucket's resource has not been loaded from the server. diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 3b335cf7b..8b63a0198 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -875,8 +875,9 @@ def create_bucket( made via created bucket. location (str): (Optional) The location of the bucket. If not passed, - the default location, US, will be used. See - https://cloud.google.com/storage/docs/bucket-locations + the default location, US, will be used. If specifying a dual-region, + can be specified as a string, e.g., 'US-CENTRAL1+US-WEST1'. See: + https://cloud.google.com/storage/docs/locations predefined_acl (str): (Optional) Name of predefined ACL to apply to bucket. See: https://cloud.google.com/storage/docs/access-control/lists#predefined-acl diff --git a/samples/README.md b/samples/README.md index fbbc45aa2..2d9080067 100644 --- a/samples/README.md +++ b/samples/README.md @@ -63,6 +63,7 @@ for more detailed instructions. * [CORS Configuration](#cors-configuration) * [Create Bucket](#create-bucket) * [Create Bucket Class Location](#create-bucket-class-location) +* [Create Bucket Dual Region](#create-bucket-dual-region) * [Create Bucket Notifications](#create-bucket-notifications) * [Create Bucket Turbo Replication](#create-bucket-turbo-replication) * [Create HMAC Key](#create-hmac-key) @@ -316,6 +317,15 @@ View the [source code](https://github.com/googleapis/python-storage/blob/main/sa `python storage_create_bucket_class_location.py ` +----- +### Create Bucket Dual Region +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_create_bucket_dual_region.py,samples/README.md) + +View the [source code](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_create_bucket_dual_region.py). To run this sample: + + +`python storage_create_bucket_dual_region.py ` + ----- ### Create Bucket Notifications [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/snippets/storage_create_bucket_notifications.py,samples/README.md) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 581134102..7a5a3a64f 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -36,6 +36,7 @@ import storage_copy_file_archived_generation import storage_cors_configuration import storage_create_bucket_class_location +import storage_create_bucket_dual_region import storage_define_bucket_website_configuration import storage_delete_file import storage_delete_file_archived_generation @@ -433,6 +434,16 @@ def test_create_bucket_class_location(test_bucket_create): assert bucket.storage_class == "COLDLINE" +def test_create_bucket_dual_region(test_bucket_create, capsys): + region_1 = "US-EAST1" + region_2 = "US-WEST1" + storage_create_bucket_dual_region.create_bucket_dual_region( + test_bucket_create.name, region_1, region_2 + ) + out, _ = capsys.readouterr() + assert f"Bucket {test_bucket_create.name} created in {region_1}+{region_2}" in out + + def test_bucket_delete_default_kms_key(test_bucket, capsys): test_bucket.default_kms_key_name = KMS_KEY test_bucket.patch() diff --git a/samples/snippets/storage_create_bucket_dual_region.py b/samples/snippets/storage_create_bucket_dual_region.py new file mode 100644 index 000000000..e6f4ac01f --- /dev/null +++ b/samples/snippets/storage_create_bucket_dual_region.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +# Copyright 2022 Google LLC. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +""" +Sample that creates a dual region bucket. +""" + +# [START storage_create_bucket_dual_region] +from google.cloud import storage + + +def create_bucket_dual_region(bucket_name, region_1, region_2): + """Creates a Dual-Region Bucket with provided locations.""" + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The bucket's pair of regions. Case-insensitive. + # See this documentation for other valid locations: + # https://cloud.google.com/storage/docs/locations + # region_1 = "US-EAST1" + # region_2 = "US-WEST1" + + storage_client = storage.Client() + storage_client.create_bucket(bucket_name, location=f"{region_1}+{region_2}") + + print(f"Bucket {bucket_name} created in {region_1}+{region_2}.") + + +# [END storage_create_bucket_dual_region] + + +if __name__ == "__main__": + create_bucket_dual_region( + bucket_name=sys.argv[1], region_1=sys.argv[2], region_2=sys.argv[3] + ) diff --git a/tests/system/test_client.py b/tests/system/test_client.py index 3329ee7a3..9d9526a03 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -64,6 +64,27 @@ def test_create_bucket_simple(storage_client, buckets_to_delete): assert created.name == new_bucket_name +def test_create_bucket_dual_region(storage_client, buckets_to_delete): + from google.cloud.storage.constants import DUAL_REGION_LOCATION_TYPE + + new_bucket_name = _helpers.unique_name("dual-region-bucket") + region_1 = "US-EAST1" + region_2 = "US-WEST1" + dual_region = f"{region_1}+{region_2}" + + with pytest.raises(exceptions.NotFound): + storage_client.get_bucket(new_bucket_name) + + created = _helpers.retry_429_503(storage_client.create_bucket)( + new_bucket_name, location=dual_region + ) + buckets_to_delete.append(created) + + assert created.name == new_bucket_name + assert created.location == dual_region + assert created.location_type == DUAL_REGION_LOCATION_TYPE + + def test_list_buckets(storage_client, buckets_to_delete): buckets_to_create = [ _helpers.unique_name("new"), From 149175714dac0408713b33916dfcd068b8ebda85 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 7 Apr 2022 13:15:05 +0200 Subject: [PATCH 033/509] chore(deps): update dependency google-cloud-pubsub to v2.12.0 (#758) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index f13df193d..9074c1573 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.11.0 +google-cloud-pubsub==2.12.0 google-cloud-storage==2.2.1 pandas===1.3.5; python_version == '3.7' pandas==1.4.2; python_version >= '3.8' From bd5693164e7331df5f14186fd002e72e5203d7ee Mon Sep 17 00:00:00 2001 From: Aaron Gabriel Neyer Date: Tue, 12 Apr 2022 15:42:04 -0600 Subject: [PATCH 034/509] feat: track invocation id for retry metrics (#741) * feat: track invocation id for retry metrics * woops, fix the context * slight adjustment to stringify * old tests pass * lint * adjust based on new python-cloud-core changes * updated cloud core, and all working * test that invocation id changes between calls * lint and fix test name Co-authored-by: Anthonios Partheniou --- google/cloud/storage/_helpers.py | 7 +- google/cloud/storage/_http.py | 2 + setup.py | 2 +- tests/unit/test__helpers.py | 2 + tests/unit/test__http.py | 13 +- tests/unit/test_blob.py | 336 +++++++++++++++++-------------- tests/unit/test_client.py | 81 +++++--- 7 files changed, 267 insertions(+), 176 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 30866c8a3..cc85525d8 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -21,6 +21,7 @@ from hashlib import md5 import os from urllib.parse import urlsplit +from uuid import uuid4 from google import resumable_media from google.auth import environment_vars @@ -584,6 +585,10 @@ def _api_core_retry_to_resumable_media_retry(retry, num_retries=None): return resumable_media.RetryStrategy(max_retries=0) +def _get_invocation_id(): + return "gccl-invocation-id/" + str(uuid4()) + + def _get_default_headers( user_agent, content_type="application/json; charset=UTF-8", @@ -600,7 +605,7 @@ def _get_default_headers( "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "User-Agent": user_agent, - "x-goog-api-client": user_agent, + "X-Goog-API-Client": f"{user_agent} {_get_invocation_id()}", "content-type": content_type, "x-upload-content-type": x_upload_content_type or content_type, } diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index 0ade1525f..9b29f6280 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -18,6 +18,7 @@ from google.cloud import _http from google.cloud.storage import __version__ +from google.cloud.storage import _helpers class Connection(_http.JSONConnection): @@ -59,6 +60,7 @@ def __init__(self, client, client_info=None, api_endpoint=None): def api_request(self, *args, **kwargs): retry = kwargs.pop("retry", None) + kwargs["extra_api_info"] = _helpers._get_invocation_id() call = functools.partial(super(Connection, self).api_request, *args, **kwargs) if retry: # If this is a ConditionalRetryPolicy, check conditions. diff --git a/setup.py b/setup.py index 3f5b157c1..af6c97fb2 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ dependencies = [ "google-auth >= 1.25.0, < 3.0dev", "google-api-core >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", - "google-cloud-core >= 1.6.0, < 3.0dev", + "google-cloud-core >= 2.3.0, < 3.0dev", "google-resumable-media >= 2.3.2", "requests >= 2.18.0, < 3.0.0dev", "protobuf", diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index 6c8770576..dbe0055df 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -19,6 +19,8 @@ from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED +GCCL_INVOCATION_TEST_CONST = "gccl-invocation-id/test-invocation-123" + class Test__get_storage_host(unittest.TestCase): @staticmethod diff --git a/tests/unit/test__http.py b/tests/unit/test__http.py index fcdb5d1a7..890fd1352 100644 --- a/tests/unit/test__http.py +++ b/tests/unit/test__http.py @@ -13,9 +13,13 @@ # limitations under the License. import unittest +from unittest.mock import patch import mock +from google.cloud.storage import _helpers +from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST + class TestConnection(unittest.TestCase): @staticmethod @@ -44,12 +48,17 @@ def test_extra_headers(self): conn = self._make_one(client) req_data = "hey-yoooouuuuu-guuuuuyyssss" - result = conn.api_request("GET", "/rainbow", data=req_data, expect_json=False) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + result = conn.api_request( + "GET", "/rainbow", data=req_data, expect_json=False + ) self.assertEqual(result, data) expected_headers = { "Accept-Encoding": "gzip", - base_http.CLIENT_INFO_HEADER: conn.user_agent, + base_http.CLIENT_INFO_HEADER: f"{conn.user_agent} {GCCL_INVOCATION_TEST_CONST}", "User-Agent": conn.user_agent, } expected_uri = conn.build_api_url("/rainbow") diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index f48b4a1e2..8c86c002e 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -21,11 +21,13 @@ import tempfile import unittest import http.client +from unittest.mock import patch from urllib.parse import urlencode import mock import pytest +from google.cloud.storage import _helpers from google.cloud.storage._helpers import _get_default_headers from google.cloud.storage.retry import ( DEFAULT_RETRY, @@ -33,6 +35,7 @@ ) from google.cloud.storage.retry import DEFAULT_RETRY_IF_ETAG_IN_JSON from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED +from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST def _make_credentials(): @@ -2234,17 +2237,23 @@ def test__get_upload_arguments(self): blob.content_disposition = "inline" content_type = "image/jpeg" - info = blob._get_upload_arguments(client, content_type) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + info = blob._get_upload_arguments(client, content_type) headers, object_metadata, new_content_type = info header_key_value = "W3BYd0AscEBAQWZCZnJSM3gtMmIyU0NIUiwuP1l3Uk8=" header_key_hash_value = "G0++dxF4q5rG4o9kE8gvEKn15RH6wLm0wXV1MgAlXOg=" - expected_headers = { - **_get_default_headers(client._connection.user_agent, content_type), - "X-Goog-Encryption-Algorithm": "AES256", - "X-Goog-Encryption-Key": header_key_value, - "X-Goog-Encryption-Key-Sha256": header_key_hash_value, - } + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + expected_headers = { + **_get_default_headers(client._connection.user_agent, content_type), + "X-Goog-Encryption-Algorithm": "AES256", + "X-Goog-Encryption-Key": header_key_value, + "X-Goog-Encryption-Key-Sha256": header_key_hash_value, + } self.assertEqual(headers, expected_headers) expected_metadata = { "contentDisposition": blob.content_disposition, @@ -2313,20 +2322,23 @@ def _do_multipart_success( expected_timeout = timeout timeout_kwarg = {"timeout": timeout} - response = blob._do_multipart_upload( - client, - stream, - content_type, - size, - num_retries, - predefined_acl, - if_generation_match, - if_generation_not_match, - if_metageneration_match, - if_metageneration_not_match, - retry=retry, - **timeout_kwarg - ) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + response = blob._do_multipart_upload( + client, + stream, + content_type, + size, + num_retries, + predefined_acl, + if_generation_match, + if_generation_not_match, + if_metageneration_match, + if_metageneration_not_match, + retry=retry, + **timeout_kwarg + ) # Clean up the get_api_base_url_for_mtls mock. if mtls: @@ -2387,11 +2399,14 @@ def _do_multipart_success( + data_read + b"\r\n--==0==--" ) - headers = _get_default_headers( - client._connection.user_agent, - b'multipart/related; boundary="==0=="', - "application/xml", - ) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + headers = _get_default_headers( + client._connection.user_agent, + b'multipart/related; boundary="==0=="', + "application/xml", + ) client._http.request.assert_called_once_with( "POST", upload_url, data=payload, headers=headers, timeout=expected_timeout ) @@ -2578,23 +2593,25 @@ def _initiate_resumable_helper( else: expected_timeout = timeout timeout_kwarg = {"timeout": timeout} - - upload, transport = blob._initiate_resumable_upload( - client, - stream, - content_type, - size, - num_retries, - extra_headers=extra_headers, - chunk_size=chunk_size, - predefined_acl=predefined_acl, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - retry=retry, - **timeout_kwarg - ) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + upload, transport = blob._initiate_resumable_upload( + client, + stream, + content_type, + size, + num_retries, + extra_headers=extra_headers, + chunk_size=chunk_size, + predefined_acl=predefined_acl, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + retry=retry, + **timeout_kwarg + ) # Clean up the get_api_base_url_for_mtls mock. if mtls: @@ -2634,18 +2651,21 @@ def _initiate_resumable_helper( upload_url += "?" + urlencode(qs_params) self.assertEqual(upload.upload_url, upload_url) - if extra_headers is None: - self.assertEqual( - upload._headers, - _get_default_headers(client._connection.user_agent, content_type), - ) - else: - expected_headers = { - **_get_default_headers(client._connection.user_agent, content_type), - **extra_headers, - } - self.assertEqual(upload._headers, expected_headers) - self.assertIsNot(upload._headers, expected_headers) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + if extra_headers is None: + self.assertEqual( + upload._headers, + _get_default_headers(client._connection.user_agent, content_type), + ) + else: + expected_headers = { + **_get_default_headers(client._connection.user_agent, content_type), + **extra_headers, + } + self.assertEqual(upload._headers, expected_headers) + self.assertIsNot(upload._headers, expected_headers) self.assertFalse(upload.finished) if chunk_size is None: if blob_chunk_size is None: @@ -2684,9 +2704,13 @@ def _initiate_resumable_helper( # Check the mocks. blob._get_writable_metadata.assert_called_once_with() payload = json.dumps(object_metadata).encode("utf-8") - expected_headers = _get_default_headers( - client._connection.user_agent, x_upload_content_type=content_type - ) + + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + expected_headers = _get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ) if size is not None: expected_headers["x-upload-content-length"] = str(size) if extra_headers is not None: @@ -2932,18 +2956,25 @@ def _do_resumable_helper( # Create mocks to be checked for doing transport. resumable_url = "http://test.invalid?upload_id=and-then-there-was-1" - headers1 = { - **_get_default_headers(USER_AGENT, content_type), - "location": resumable_url, - } - headers2 = { - **_get_default_headers(USER_AGENT, content_type), - "range": "bytes=0-{:d}".format(CHUNK_SIZE - 1), - } - headers3 = _get_default_headers(USER_AGENT, content_type) - transport, responses = self._make_resumable_transport( - headers1, headers2, headers3, total_bytes, data_corruption=data_corruption - ) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + headers1 = { + **_get_default_headers(USER_AGENT, content_type), + "location": resumable_url, + } + headers2 = { + **_get_default_headers(USER_AGENT, content_type), + "range": "bytes=0-{:d}".format(CHUNK_SIZE - 1), + } + headers3 = _get_default_headers(USER_AGENT, content_type) + transport, responses = self._make_resumable_transport( + headers1, + headers2, + headers3, + total_bytes, + data_corruption=data_corruption, + ) # Create some mock arguments and call the method under test. client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) @@ -2963,66 +2994,70 @@ def _do_resumable_helper( expected_timeout = timeout timeout_kwarg = {"timeout": timeout} - response = blob._do_resumable_upload( - client, - stream, - content_type, - size, - num_retries, - predefined_acl, - if_generation_match, - if_generation_not_match, - if_metageneration_match, - if_metageneration_not_match, - retry=retry, - **timeout_kwarg - ) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): - # Check the returned values. - self.assertIs(response, responses[2]) - self.assertEqual(stream.tell(), total_bytes) + response = blob._do_resumable_upload( + client, + stream, + content_type, + size, + num_retries, + predefined_acl, + if_generation_match, + if_generation_not_match, + if_metageneration_match, + if_metageneration_not_match, + retry=retry, + **timeout_kwarg + ) - # Check the mocks. - call0 = self._do_resumable_upload_call0( - client, - blob, - content_type, - size=size, - predefined_acl=predefined_acl, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - timeout=expected_timeout, - ) - call1 = self._do_resumable_upload_call1( - client, - blob, - content_type, - data, - resumable_url, - size=size, - predefined_acl=predefined_acl, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - timeout=expected_timeout, - ) - call2 = self._do_resumable_upload_call2( - client, - blob, - content_type, - data, - resumable_url, - total_bytes, - predefined_acl=predefined_acl, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - timeout=expected_timeout, - ) + # Check the returned values. + self.assertIs(response, responses[2]) + self.assertEqual(stream.tell(), total_bytes) + + # Check the mocks. + call0 = self._do_resumable_upload_call0( + client, + blob, + content_type, + size=size, + predefined_acl=predefined_acl, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + timeout=expected_timeout, + ) + call1 = self._do_resumable_upload_call1( + client, + blob, + content_type, + data, + resumable_url, + size=size, + predefined_acl=predefined_acl, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + timeout=expected_timeout, + ) + call2 = self._do_resumable_upload_call2( + client, + blob, + content_type, + data, + resumable_url, + total_bytes, + predefined_acl=predefined_acl, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + timeout=expected_timeout, + ) self.assertEqual(transport.request.mock_calls, [call0, call1, call2]) def test__do_resumable_upload_with_custom_timeout(self): @@ -3574,19 +3609,21 @@ def _create_resumable_upload_session_helper( else: expected_timeout = timeout timeout_kwarg = {"timeout": timeout} - - new_url = blob.create_resumable_upload_session( - content_type=content_type, - size=size, - origin=origin, - client=client, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - retry=retry, - **timeout_kwarg - ) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + new_url = blob.create_resumable_upload_session( + content_type=content_type, + size=size, + origin=origin, + client=client, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + retry=retry, + **timeout_kwarg + ) # Check the returned value and (lack of) side-effect. self.assertEqual(new_url, resumable_url) @@ -3612,13 +3649,16 @@ def _create_resumable_upload_session_helper( upload_url += "?" + urlencode(qs_params) payload = b'{"name": "blob-name"}' - expected_headers = { - **_get_default_headers( - client._connection.user_agent, x_upload_content_type=content_type - ), - "x-upload-content-length": str(size), - "x-upload-content-type": content_type, - } + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + expected_headers = { + **_get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ), + "x-upload-content-length": str(size), + "x-upload-content-type": content_type, + } if origin is not None: expected_headers["Origin"] = origin transport.request.assert_called_once_with( diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 2292c6acd..6a97d8d41 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -16,6 +16,7 @@ import http.client import io import json +from unittest.mock import patch import mock import pytest import re @@ -29,9 +30,10 @@ from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR from google.cloud.storage._helpers import _get_default_headers +from google.cloud.storage import _helpers from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED - +from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST from . import _read_local_json _SERVICE_ACCOUNT_JSON = _read_local_json("url_signer_v4_test_account.json") @@ -1570,15 +1572,17 @@ def test_download_blob_to_file_with_failure(self): blob._do_download.side_effect = grmp_response file_obj = io.BytesIO() - with self.assertRaises(exceptions.NotFound): - client.download_blob_to_file(blob, file_obj) - - self.assertEqual(file_obj.tell(), 0) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + with self.assertRaises(exceptions.NotFound): + client.download_blob_to_file(blob, file_obj) - headers = { - **_get_default_headers(client._connection.user_agent), - "accept-encoding": "gzip", - } + self.assertEqual(file_obj.tell(), 0) + headers = { + **_get_default_headers(client._connection.user_agent), + "accept-encoding": "gzip", + } blob._do_download.assert_called_once_with( client._http, file_obj, @@ -1604,15 +1608,20 @@ def test_download_blob_to_file_with_uri(self): blob._get_download_url = mock.Mock() blob._do_download = mock.Mock() - with mock.patch( - "google.cloud.storage.client.Blob.from_string", return_value=blob + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): - client.download_blob_to_file("gs://bucket_name/path/to/object", file_obj) + with mock.patch( + "google.cloud.storage.client.Blob.from_string", return_value=blob + ): + client.download_blob_to_file( + "gs://bucket_name/path/to/object", file_obj + ) - headers = { - **_get_default_headers(client._connection.user_agent), - "accept-encoding": "gzip", - } + headers = { + **_get_default_headers(client._connection.user_agent), + "accept-encoding": "gzip", + } blob._do_download.assert_called_once_with( client._http, file_obj, @@ -1704,14 +1713,16 @@ def _download_blob_to_file_helper( blob._CHUNK_SIZE_MULTIPLE = 1 blob.chunk_size = 3 blob._do_download = mock.Mock() - file_obj = io.BytesIO() - if raw_download: - client.download_blob_to_file( - blob, file_obj, raw_download=True, **extra_kwargs - ) - else: - client.download_blob_to_file(blob, file_obj, **extra_kwargs) + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + if raw_download: + client.download_blob_to_file( + blob, file_obj, raw_download=True, **extra_kwargs + ) + else: + client.download_blob_to_file(blob, file_obj, **extra_kwargs) expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) if ( @@ -1734,7 +1745,11 @@ def _download_blob_to_file_helper( if_etag_not_match = [if_etag_not_match] headers["If-None-Match"] = ", ".join(if_etag_not_match) - headers = {**_get_default_headers(client._connection.user_agent), **headers} + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + headers = {**_get_default_headers(client._connection.user_agent), **headers} + blob._do_download.assert_called_once_with( client._http, file_obj, @@ -1760,6 +1775,24 @@ def test_download_blob_to_file_wo_chunks_w_raw(self): def test_download_blob_to_file_w_chunks_w_raw(self): self._download_blob_to_file_helper(use_chunks=True, raw_download=True) + def test_download_blob_have_different_uuid(self): + from google.cloud.storage.blob import Blob + + project = "PROJECT" + credentials = _make_credentials(project=project) + client = self._make_one(credentials=credentials) + blob = mock.create_autospec(Blob) + blob._encryption_key = None + blob._do_download = mock.Mock() + file_obj = io.BytesIO() + client.download_blob_to_file(blob, file_obj) + client.download_blob_to_file(blob, file_obj) + + self.assertNotEqual( + blob._do_download.call_args_list[0][0][3]["X-Goog-API-Client"], + blob._do_download.call_args_list[1][0][3]["X-Goog-API-Client"], + ) + def test_list_blobs_w_defaults_w_bucket_obj(self): from google.cloud.storage.bucket import Bucket from google.cloud.storage.bucket import _blobs_page_start From 9b2931430b0796ffb23ec4efacd82dacad36f40f Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 12 Apr 2022 15:06:12 -0700 Subject: [PATCH 035/509] docs: fix links in blob module (#759) Link formatting was causing the Blob module to not render correctly on c.g.c https://cloud.google.com/python/docs/reference/storage/latest/google.cloud.storage.blob Fix links according to python style guide and make the links more readable. --- google/cloud/storage/blob.py | 69 +++++++++++++++--------------------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index a4e1d402d..8a2b5861c 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -15,14 +15,6 @@ # pylint: disable=too-many-lines """Create / interact with Google Cloud Storage blobs. - -.. _API reference docs: https://cloud.google.com/storage/docs/\ - json_api/v1/objects -.. _customer-supplied: https://cloud.google.com/storage/docs/\ - encryption#customer-supplied -.. _google-resumable-media: https://googleapis.github.io/\ - google-resumable-media-python/latest/\ - google.resumable_media.requests.html """ import base64 @@ -1048,7 +1040,8 @@ def download_to_file( If the server-set property, :attr:`media_link`, is not yet initialized, makes an additional API request to load it. - Downloading a file that has been encrypted with a `customer-supplied`_ + Downloading a file that has been encrypted with a + [`customer-supplied`](https://cloud.google.com/storage/docs/encryption#customer-supplied) encryption key: .. literalinclude:: snippets.py @@ -1064,8 +1057,8 @@ def download_to_file( of data in each request. For more fine-grained control over the download process, check out - `google-resumable-media`_. For example, this library allows - downloading **parts** of a blob rather than the whole thing. + [`google-resumable-media`](https://googleapis.dev/python/google-resumable-media/latest/index.html). + For example, this library allows downloading **parts** of a blob rather than the whole thing. If :attr:`user_project` is set on the bucket, bills the API request to that project. @@ -1694,8 +1687,8 @@ def _get_writable_metadata(self): This is intended to be used when creating a new object / blob. - See the `API reference docs`_ for more information, the fields - marked as writable are: + See the [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects) + for more information, the fields marked as writable are: * ``acl`` * ``cacheControl`` @@ -2445,7 +2438,8 @@ def upload_from_file( See the `object versioning`_ and `lifecycle`_ API documents for details. - Uploading a file with a `customer-supplied`_ encryption key: + Uploading a file with a + [`customer-supplied`](https://cloud.google.com/storage/docs/encryption#customer-supplied) encryption key: .. literalinclude:: snippets.py :start-after: [START upload_from_file] @@ -2460,7 +2454,7 @@ def upload_from_file( uploaded in a single multipart upload request. For more fine-grained over the upload process, check out - `google-resumable-media`_. + [`google-resumable-media`](https://googleapis.dev/python/google-resumable-media/latest/index.html). If :attr:`user_project` is set on the bucket, bills the API request to that project. @@ -2911,7 +2905,8 @@ def create_resumable_upload_session( API documents for details. If :attr:`encryption_key` is set, the blob will be encrypted with - a `customer-supplied`_ encryption key. + a [`customer-supplied`](https://cloud.google.com/storage/docs/encryption#customer-supplied) + encryption key. If :attr:`user_project` is set on the bucket, bills the API request to that project. @@ -3931,51 +3926,47 @@ def open( cache_control = _scalar_property("cacheControl") """HTTP 'Cache-Control' header for this object. - See `RFC 7234`_ and `API reference docs`_. + See [`RFC 7234`](https://tools.ietf.org/html/rfc7234#section-5.2) + and [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). :rtype: str or ``NoneType`` - .. _RFC 7234: https://tools.ietf.org/html/rfc7234#section-5.2 """ content_disposition = _scalar_property("contentDisposition") """HTTP 'Content-Disposition' header for this object. - See `RFC 6266`_ and `API reference docs`_. + See [`RFC 6266`](https://tools.ietf.org/html/rfc7234#section-5.2) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). :rtype: str or ``NoneType`` - - .. _RFC 6266: https://tools.ietf.org/html/rfc7234#section-5.2 """ content_encoding = _scalar_property("contentEncoding") """HTTP 'Content-Encoding' header for this object. - See `RFC 7231`_ and `API reference docs`_. + See [`RFC 7231`](https://tools.ietf.org/html/rfc7231#section-3.1.2.2) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). :rtype: str or ``NoneType`` - - .. _RFC 7231: https://tools.ietf.org/html/rfc7231#section-3.1.2.2 """ content_language = _scalar_property("contentLanguage") """HTTP 'Content-Language' header for this object. - See `BCP47`_ and `API reference docs`_. + See [`BCP47`](https://tools.ietf.org/html/bcp47) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). :rtype: str or ``NoneType`` - - .. _BCP47: https://tools.ietf.org/html/bcp47 """ content_type = _scalar_property(_CONTENT_TYPE_FIELD) """HTTP 'Content-Type' header for this object. - See `RFC 2616`_ and `API reference docs`_. + See [`RFC 2616`](https://tools.ietf.org/html/rfc2616#section-14.17) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). :rtype: str or ``NoneType`` - - .. _RFC 2616: https://tools.ietf.org/html/rfc2616#section-14.17 """ crc32c = _scalar_property("crc32c") @@ -3984,13 +3975,13 @@ def open( This returns the blob's CRC32C checksum. To retrieve the value, first use a reload method of the Blob class which loads the blob's properties from the server. - See `RFC 4960`_ and `API reference docs`_. + See [`RFC 4960`](https://tools.ietf.org/html/rfc4960#appendix-B) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). If not set before upload, the server will compute the hash. :rtype: str or ``NoneType`` - .. _RFC 4960: https://tools.ietf.org/html/rfc4960#appendix-B Example: Retrieve the crc32c hash of blob. @@ -4029,20 +4020,19 @@ def component_count(self): def etag(self): """Retrieve the ETag for the object. - See `RFC 2616 (etags)`_ and `API reference docs`_. + See [`RFC 2616 (etags)`](https://tools.ietf.org/html/rfc2616#section-3.11) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). :rtype: str or ``NoneType`` :returns: The blob etag or ``None`` if the blob's resource has not been loaded from the server. - - .. _RFC 2616 (etags): https://tools.ietf.org/html/rfc2616#section-3.11 """ return self._properties.get("etag") event_based_hold = _scalar_property("eventBasedHold") """Is an event-based hold active on the object? - See `API reference docs`_. + See [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). If the property is not set locally, returns :data:`None`. @@ -4083,14 +4073,13 @@ def id(self): This returns the blob's MD5 hash. To retrieve the value, first use a reload method of the Blob class which loads the blob's properties from the server. - See `RFC 1321`_ and `API reference docs`_. + See [`RFC 1321`](https://tools.ietf.org/html/rfc1321) and + [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). If not set before upload, the server will compute the hash. :rtype: str or ``NoneType`` - .. _RFC 1321: https://tools.ietf.org/html/rfc1321 - Example: Retrieve the md5 hash of blob. @@ -4265,7 +4254,7 @@ def kms_key_name(self, value): temporary_hold = _scalar_property("temporaryHold") """Is a temporary hold active on the object? - See `API reference docs`_. + See [`API reference docs`](https://cloud.google.com/storage/docs/json_api/v1/objects). If the property is not set locally, returns :data:`None`. From 980466072c744bf1deddc01ca11f19d62709ac9f Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 13 Apr 2022 11:18:49 -0600 Subject: [PATCH 036/509] chore(main): release 2.3.0 (#746) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 18 ++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 893066183..e9c28050d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.3.0](https://github.com/googleapis/python-storage/compare/v2.2.1...v2.3.0) (2022-04-12) + + +### Features + +* add dual region bucket support and sample ([#748](https://github.com/googleapis/python-storage/issues/748)) ([752e8ab](https://github.com/googleapis/python-storage/commit/752e8ab42d23afd68738e4d7ca6cdeee416dfd50)) +* track invocation id for retry metrics ([#741](https://github.com/googleapis/python-storage/issues/741)) ([bd56931](https://github.com/googleapis/python-storage/commit/bd5693164e7331df5f14186fd002e72e5203d7ee)) + + +### Bug Fixes + +* **deps:** drop pkg_resources ([#744](https://github.com/googleapis/python-storage/issues/744)) ([e963f33](https://github.com/googleapis/python-storage/commit/e963f33ced2852b64d721d69928b54443461ec9c)) + + +### Documentation + +* fix links in blob module ([#759](https://github.com/googleapis/python-storage/issues/759)) ([9b29314](https://github.com/googleapis/python-storage/commit/9b2931430b0796ffb23ec4efacd82dacad36f40f)) + ### [2.2.1](https://github.com/googleapis/python-storage/compare/v2.2.0...v2.2.1) (2022-03-15) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index b1be7d8c9..999199f5a 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.2.1" +__version__ = "2.3.0" From cd695e37f1f34a70b76cda578099b753a77c5983 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 14 Apr 2022 01:54:21 +0200 Subject: [PATCH 037/509] chore(deps): update dependency google-cloud-storage to v2.3.0 (#766) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 9074c1573..d87433b82 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.12.0 -google-cloud-storage==2.2.1 +google-cloud-storage==2.3.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.2; python_version >= '3.8' From 50ef911b1e8c9d8cd9852d729ecd84103bddc5c4 Mon Sep 17 00:00:00 2001 From: Tianzi Cai Date: Thu, 14 Apr 2022 13:48:07 -0700 Subject: [PATCH 038/509] samples(docs): remove beta tag in gcloud command (#767) --- samples/snippets/notification_polling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/notification_polling.py b/samples/snippets/notification_polling.py index 3182db6da..34fd8cc3e 100644 --- a/samples/snippets/notification_polling.py +++ b/samples/snippets/notification_polling.py @@ -38,7 +38,7 @@ $ gsutil notification create -f json -t testtopic gs://testbucket 5. Create a subscription for your new topic: - $ gcloud beta pubsub subscriptions create testsubscription --topic=testtopic + $ gcloud pubsub subscriptions create testsubscription --topic=testtopic 6. Run this program: $ python notification_polling.py my-project-id testsubscription From b2e5150f191c04acb47ad98cef88512451aff81d Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Fri, 15 Apr 2022 10:42:12 -0700 Subject: [PATCH 039/509] feat: add AbortIncompleteMultipartUpload lifecycle rule (#765) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #753 🦕 --- google/cloud/storage/bucket.py | 58 +++++++++++++++++++++++++++--- tests/system/_helpers.py | 2 +- tests/system/test_bucket.py | 17 +++++++++ tests/unit/test_bucket.py | 65 +++++++++++++++++++++++++++++++++- 4 files changed, 136 insertions(+), 6 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 85c9302f7..be99ad141 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -323,7 +323,7 @@ class LifecycleRuleDelete(dict): def __init__(self, **kw): conditions = LifecycleRuleConditions(**kw) rule = {"action": {"type": "Delete"}, "condition": dict(conditions)} - super(LifecycleRuleDelete, self).__init__(rule) + super().__init__(rule) @classmethod def from_api_repr(cls, resource): @@ -356,7 +356,7 @@ def __init__(self, storage_class, **kw): "action": {"type": "SetStorageClass", "storageClass": storage_class}, "condition": dict(conditions), } - super(LifecycleRuleSetStorageClass, self).__init__(rule) + super().__init__(rule) @classmethod def from_api_repr(cls, resource): @@ -365,7 +365,7 @@ def from_api_repr(cls, resource): :type resource: dict :param resource: mapping as returned from API call. - :rtype: :class:`LifecycleRuleDelete` + :rtype: :class:`LifecycleRuleSetStorageClass` :returns: Instance created from resource. """ action = resource["action"] @@ -374,6 +374,38 @@ def from_api_repr(cls, resource): return instance +class LifecycleRuleAbortIncompleteMultipartUpload(dict): + """Map a rule aborting incomplete multipart uploads of matching items. + + The "age" lifecycle condition is the only supported condition for this rule. + + :type kw: dict + :params kw: arguments passed to :class:`LifecycleRuleConditions`. + """ + + def __init__(self, **kw): + conditions = LifecycleRuleConditions(**kw) + rule = { + "action": {"type": "AbortIncompleteMultipartUpload"}, + "condition": dict(conditions), + } + super().__init__(rule) + + @classmethod + def from_api_repr(cls, resource): + """Factory: construct instance from resource. + + :type resource: dict + :param resource: mapping as returned from API call. + + :rtype: :class:`LifecycleRuleAbortIncompleteMultipartUpload` + :returns: Instance created from resource. + """ + instance = cls(_factory=True) + instance.update(resource) + return instance + + _default = object() @@ -2240,6 +2272,8 @@ def lifecycle_rules(self): yield LifecycleRuleDelete.from_api_repr(rule) elif action_type == "SetStorageClass": yield LifecycleRuleSetStorageClass.from_api_repr(rule) + elif action_type == "AbortIncompleteMultipartUpload": + yield LifecycleRuleAbortIncompleteMultipartUpload.from_api_repr(rule) else: warnings.warn( "Unknown lifecycle rule type received: {}. Please upgrade to the latest version of google-cloud-storage.".format( @@ -2289,7 +2323,7 @@ def add_lifecycle_delete_rule(self, **kw): self.lifecycle_rules = rules def add_lifecycle_set_storage_class_rule(self, storage_class, **kw): - """Add a "delete" rule to lifestyle rules configured for this bucket. + """Add a "set storage class" rule to lifestyle rules. See https://cloud.google.com/storage/docs/lifecycle and https://cloud.google.com/storage/docs/json_api/v1/buckets @@ -2309,6 +2343,22 @@ def add_lifecycle_set_storage_class_rule(self, storage_class, **kw): rules.append(LifecycleRuleSetStorageClass(storage_class, **kw)) self.lifecycle_rules = rules + def add_lifecycle_abort_incomplete_multipart_upload_rule(self, **kw): + """Add a "abort incomplete multipart upload" rule to lifestyle rules. + + Note that the "age" lifecycle condition is the only supported condition + for this rule. + + See https://cloud.google.com/storage/docs/lifecycle and + https://cloud.google.com/storage/docs/json_api/v1/buckets + + :type kw: dict + :params kw: arguments passed to :class:`LifecycleRuleConditions`. + """ + rules = list(self.lifecycle_rules) + rules.append(LifecycleRuleAbortIncompleteMultipartUpload(**kw)) + self.lifecycle_rules = rules + _location = _scalar_property("location") @property diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index c172129d6..70c1f2a5d 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -23,7 +23,7 @@ retry_429 = RetryErrors(exceptions.TooManyRequests) retry_429_harder = RetryErrors(exceptions.TooManyRequests, max_tries=10) retry_429_503 = RetryErrors( - [exceptions.TooManyRequests, exceptions.ServiceUnavailable], max_tries=10 + (exceptions.TooManyRequests, exceptions.ServiceUnavailable), max_tries=10 ) retry_failures = RetryErrors(AssertionError) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 4826ce8a6..de1a04aa9 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -42,6 +42,7 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): from google.cloud.storage import constants from google.cloud.storage.bucket import LifecycleRuleDelete from google.cloud.storage.bucket import LifecycleRuleSetStorageClass + from google.cloud.storage.bucket import LifecycleRuleAbortIncompleteMultipartUpload bucket_name = _helpers.unique_name("w-lifcycle-rules") custom_time_before = datetime.date(2018, 8, 1) @@ -64,6 +65,9 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): is_live=False, matches_storage_class=[constants.NEARLINE_STORAGE_CLASS], ) + bucket.add_lifecycle_abort_incomplete_multipart_upload_rule( + age=42, + ) expected_rules = [ LifecycleRuleDelete( @@ -79,6 +83,9 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): is_live=False, matches_storage_class=[constants.NEARLINE_STORAGE_CLASS], ), + LifecycleRuleAbortIncompleteMultipartUpload( + age=42, + ), ] _helpers.retry_429_503(bucket.create)(location="us") @@ -87,6 +94,16 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): assert bucket.name == bucket_name assert list(bucket.lifecycle_rules) == expected_rules + # Test modifying lifecycle rules + expected_rules[0] = LifecycleRuleDelete(age=30) + rules = list(bucket.lifecycle_rules) + rules[0]["condition"] = {"age": 30} + bucket.lifecycle_rules = rules + bucket.patch() + + assert list(bucket.lifecycle_rules) == expected_rules + + # Test clearing lifecycle rules bucket.clear_lifecyle_rules() bucket.patch() diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index c5f1df5d2..eb402de9e 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -337,6 +337,43 @@ def test_from_api_repr(self): self.assertEqual(dict(rule), resource) +class Test_LifecycleRuleAbortIncompleteMultipartUpload(unittest.TestCase): + @staticmethod + def _get_target_class(): + from google.cloud.storage.bucket import ( + LifecycleRuleAbortIncompleteMultipartUpload, + ) + + return LifecycleRuleAbortIncompleteMultipartUpload + + def _make_one(self, **kw): + return self._get_target_class()(**kw) + + def test_ctor_wo_conditions(self): + with self.assertRaises(ValueError): + self._make_one() + + def test_ctor_w_condition(self): + rule = self._make_one(age=10) + expected = { + "action": {"type": "AbortIncompleteMultipartUpload"}, + "condition": {"age": 10}, + } + self.assertEqual(dict(rule), expected) + + def test_from_api_repr(self): + klass = self._get_target_class() + conditions = { + "age": 10, + } + resource = { + "action": {"type": "AbortIncompleteMultipartUpload"}, + "condition": conditions, + } + rule = klass.from_api_repr(resource) + self.assertEqual(dict(rule), resource) + + class Test_IAMConfiguration(unittest.TestCase): @staticmethod def _get_target_class(): @@ -2242,6 +2279,7 @@ def test_lifecycle_rules_getter(self): from google.cloud.storage.bucket import ( LifecycleRuleDelete, LifecycleRuleSetStorageClass, + LifecycleRuleAbortIncompleteMultipartUpload, ) NAME = "name" @@ -2250,7 +2288,11 @@ def test_lifecycle_rules_getter(self): "action": {"type": "SetStorageClass", "storageClass": "NEARLINE"}, "condition": {"isLive": False}, } - rules = [DELETE_RULE, SSC_RULE] + MULTIPART_RULE = { + "action": {"type": "AbortIncompleteMultipartUpload"}, + "condition": {"age": 42}, + } + rules = [DELETE_RULE, SSC_RULE, MULTIPART_RULE] properties = {"lifecycle": {"rule": rules}} bucket = self._make_one(name=NAME, properties=properties) @@ -2264,6 +2306,12 @@ def test_lifecycle_rules_getter(self): self.assertIsInstance(ssc_rule, LifecycleRuleSetStorageClass) self.assertEqual(dict(ssc_rule), SSC_RULE) + multipart_rule = found[2] + self.assertIsInstance( + multipart_rule, LifecycleRuleAbortIncompleteMultipartUpload + ) + self.assertEqual(dict(multipart_rule), MULTIPART_RULE) + def test_lifecycle_rules_setter_w_dicts(self): NAME = "name" DELETE_RULE = {"action": {"type": "Delete"}, "condition": {"age": 42}} @@ -2348,6 +2396,21 @@ def test_add_lifecycle_set_storage_class_rule(self): self.assertEqual([dict(rule) for rule in bucket.lifecycle_rules], rules) self.assertTrue("lifecycle" in bucket._changes) + def test_add_lifecycle_abort_incomplete_multipart_upload_rule(self): + NAME = "name" + AIMPU_RULE = { + "action": {"type": "AbortIncompleteMultipartUpload"}, + "condition": {"age": 42}, + } + rules = [AIMPU_RULE] + bucket = self._make_one(name=NAME) + self.assertEqual(list(bucket.lifecycle_rules), []) + + bucket.add_lifecycle_abort_incomplete_multipart_upload_rule(age=42) + + self.assertEqual([dict(rule) for rule in bucket.lifecycle_rules], rules) + self.assertTrue("lifecycle" in bucket._changes) + def test_cors_getter(self): NAME = "name" CORS_ENTRY = { From 01ddae8f13fb13cfa3768ae931c16207fa6a8406 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 20 Apr 2022 20:35:30 -0400 Subject: [PATCH 040/509] chore(python): add nox session to sort python imports (#774) Source-Link: https://github.com/googleapis/synthtool/commit/1b71c10e20de7ed3f97f692f99a0e3399b67049f Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:00c9d764fd1cd56265f12a5ef4b99a0c9e87cf261018099141e2ca5158890416 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- samples/snippets/noxfile.py | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index bc893c979..7c454abf7 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:8a5d3f6a2e43ed8293f34e06a2f56931d1e88a2694c3bb11b15df4eb256ad163 -# created: 2022-04-06T10:30:21.687684602Z + digest: sha256:00c9d764fd1cd56265f12a5ef4b99a0c9e87cf261018099141e2ca5158890416 +# created: 2022-04-20T23:42:53.970438194Z diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 949e0fde9..38bb0a572 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -30,6 +30,7 @@ # WARNING - WARNING - WARNING - WARNING - WARNING BLACK_VERSION = "black==22.3.0" +ISORT_VERSION = "isort==5.10.1" # Copy `noxfile_config.py` to your directory and modify it instead. @@ -168,12 +169,32 @@ def lint(session: nox.sessions.Session) -> None: @nox.session def blacken(session: nox.sessions.Session) -> None: + """Run black. Format code to uniform standard.""" session.install(BLACK_VERSION) python_files = [path for path in os.listdir(".") if path.endswith(".py")] session.run("black", *python_files) +# +# format = isort + black +# + +@nox.session +def format(session: nox.sessions.Session) -> None: + """ + Run isort to sort imports. Then run black + to format code to uniform standard. + """ + session.install(BLACK_VERSION, ISORT_VERSION) + python_files = [path for path in os.listdir(".") if path.endswith(".py")] + + # Use the --fss option to sort imports using strict alphabetical order. + # See https://pycqa.github.io/isort/docs/configuration/options.html#force-sort-within-sections + session.run("isort", "--fss", *python_files) + session.run("black", *python_files) + + # # Sample Tests # From fbff4ef8c9d977a5123d6bad1d1cd0ec19d84a6b Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 16:26:23 +0000 Subject: [PATCH 041/509] chore(python): use ubuntu 22.04 in docs image (#776) Source-Link: https://github.com/googleapis/synthtool/commit/f15cc72fb401b4861cedebb10af74afe428fb1f8 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:bc5eed3804aec2f05fad42aacf973821d9500c174015341f721a984a0825b6fd --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/docker/docs/Dockerfile | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 7c454abf7..64f82d6bf 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:00c9d764fd1cd56265f12a5ef4b99a0c9e87cf261018099141e2ca5158890416 -# created: 2022-04-20T23:42:53.970438194Z + digest: sha256:bc5eed3804aec2f05fad42aacf973821d9500c174015341f721a984a0825b6fd +# created: 2022-04-21T15:43:16.246106921Z diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index 4e1b1fb8b..238b87b9d 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from ubuntu:20.04 +from ubuntu:22.04 ENV DEBIAN_FRONTEND noninteractive @@ -60,8 +60,24 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && rm -f /var/cache/apt/archives/*.deb +###################### Install python 3.8.11 + +# Download python 3.8.11 +RUN wget https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tgz + +# Extract files +RUN tar -xvf Python-3.8.11.tgz + +# Install python 3.8.11 +RUN ./Python-3.8.11/configure --enable-optimizations +RUN make altinstall + +###################### Install pip RUN wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \ - && python3.8 /tmp/get-pip.py \ + && python3 /tmp/get-pip.py \ && rm /tmp/get-pip.py +# Test pip +RUN python3 -m pip + CMD ["python3.8"] From 8de5b962829d445635fe513b50faffb946858b9c Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 25 Apr 2022 17:12:06 +0200 Subject: [PATCH 042/509] chore(deps): update dependency pytest to v7.1.2 (#777) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 6fa4b2753..cf4bca942 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.1.1 +pytest==7.1.2 mock==4.0.3 backoff==1.11.1 \ No newline at end of file From 7ddfcba0d3008eb7ed1fc8cf8755386dd5afd396 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 26 Apr 2022 20:31:15 +0200 Subject: [PATCH 043/509] chore(deps): update dependency backoff to v2 (#778) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index cf4bca942..c54832809 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.1.2 mock==4.0.3 -backoff==1.11.1 \ No newline at end of file +backoff==2.0.0 \ No newline at end of file From b452477ccc7818d2199bddb76151ce12b128721c Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 27 Apr 2022 18:10:35 +0200 Subject: [PATCH 044/509] chore(deps): update dependency backoff to v2.0.1 (#779) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index c54832809..88beb7ba2 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.1.2 mock==4.0.3 -backoff==2.0.0 \ No newline at end of file +backoff==2.0.1 \ No newline at end of file From 36fce3262fb1c646ff9acd1f1b9eade48c13db58 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 5 May 2022 12:39:28 -0400 Subject: [PATCH 045/509] chore: [autoapprove] update readme_gen.py to include autoescape True (#781) Source-Link: https://github.com/googleapis/synthtool/commit/6b4d5a6407d740beb4158b302194a62a4108a8a6 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:f792ee1320e03eda2d13a5281a2989f7ed8a9e50b73ef6da97fac7e1e850b149 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- scripts/readme-gen/readme_gen.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 64f82d6bf..b631901e9 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:bc5eed3804aec2f05fad42aacf973821d9500c174015341f721a984a0825b6fd -# created: 2022-04-21T15:43:16.246106921Z + digest: sha256:f792ee1320e03eda2d13a5281a2989f7ed8a9e50b73ef6da97fac7e1e850b149 +# created: 2022-05-05T15:17:27.599381182Z diff --git a/scripts/readme-gen/readme_gen.py b/scripts/readme-gen/readme_gen.py index d309d6e97..91b59676b 100644 --- a/scripts/readme-gen/readme_gen.py +++ b/scripts/readme-gen/readme_gen.py @@ -28,7 +28,10 @@ jinja_env = jinja2.Environment( trim_blocks=True, loader=jinja2.FileSystemLoader( - os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates')))) + os.path.abspath(os.path.join(os.path.dirname(__file__), "templates")) + ), + autoescape=True, +) README_TMPL = jinja_env.get_template('README.tmpl.rst') From c9bf5bfd9b8fc32b3c3565872df64110e006b77b Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 5 May 2022 23:04:20 +0000 Subject: [PATCH 046/509] chore(python): auto approve template changes (#782) Source-Link: https://github.com/googleapis/synthtool/commit/453a5d9c9a55d1969240a37d36cec626d20a9024 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:81ed5ecdfc7cac5b699ba4537376f3563f6f04122c4ec9e735d3b3dc1d43dd32 --- .github/.OwlBot.lock.yaml | 4 ++-- .github/auto-approve.yml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .github/auto-approve.yml diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index b631901e9..757c9dca7 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:f792ee1320e03eda2d13a5281a2989f7ed8a9e50b73ef6da97fac7e1e850b149 -# created: 2022-05-05T15:17:27.599381182Z + digest: sha256:81ed5ecdfc7cac5b699ba4537376f3563f6f04122c4ec9e735d3b3dc1d43dd32 +# created: 2022-05-05T22:08:23.383410683Z diff --git a/.github/auto-approve.yml b/.github/auto-approve.yml new file mode 100644 index 000000000..311ebbb85 --- /dev/null +++ b/.github/auto-approve.yml @@ -0,0 +1,3 @@ +# https://github.com/googleapis/repo-automation-bots/tree/main/packages/auto-approve +processes: + - "OwlBotTemplateChanges" From 841ab04f1b875317ec8bdba19675f4885602d4e8 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 10 May 2022 12:32:19 -0700 Subject: [PATCH 047/509] tests: move range read test (#787) Move range read test to system testing. Skip conf test as the testbench is now aligned with XML and returns complete object checksum. Range reads headers are returned differently in JSON vs XML. The JSON response omits the x-goog-hash header whereas the XML response returns checksum that covers the complete object content for range reads. --- tests/conformance/test_conformance.py | 11 ----------- tests/system/test_blob.py | 5 +++++ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/tests/conformance/test_conformance.py b/tests/conformance/test_conformance.py index fa842630e..f84131f2f 100644 --- a/tests/conformance/test_conformance.py +++ b/tests/conformance/test_conformance.py @@ -85,16 +85,6 @@ def blob_download_as_bytes(client, _preconditions, **resources): assert stored_contents == data.encode("utf-8") -def blob_download_as_bytes_w_range(client, _preconditions, **resources): - bucket = resources.get("bucket") - file, data = resources.get("file_data") - blob = client.bucket(bucket.name).blob(file.name) - start_byte = 0 - end_byte = 1000000 - stored_contents = blob.download_as_bytes(start=start_byte, end=end_byte - 1) - assert stored_contents == data.encode("utf-8")[start_byte:end_byte] - - def blob_download_as_text(client, _preconditions, **resources): bucket = resources.get("bucket") file, data = resources.get("file_data") @@ -767,7 +757,6 @@ def object_acl_clear(client, _preconditions, **resources): blob_download_to_filename, blob_download_to_filename_chunked, blob_download_as_bytes, - blob_download_as_bytes_w_range, blob_download_as_text, blobreader_read, ], diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index acbc5745f..773dbdf81 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -614,6 +614,11 @@ def test_blob_download_as_text( assert stored_contents == payload assert blob.etag == etag + # Test download with byte range + end_byte = 5 + stored_contents = blob.download_as_text(start=0, end=end_byte - 1) + assert stored_contents == payload[0:end_byte] + def test_blob_upload_w_gzip_encoded_download_raw( shared_bucket, From 3c90d611cbc3b9944bbd46b0dc9f0d8fcb38d83d Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 10 May 2022 14:53:01 -0700 Subject: [PATCH 048/509] chore: add internal benchmarking script (#760) * chore: add internal benchmarking script and readme * archive benchwrapper to subdirectory * blacken lint * fix typo * update script with preconditions and upload from disk * download to file * update multiprocessing and readme * clean up * update benchmarking script * update checksumming options and default num processes * replace tempfile package usage --- tests/perf/README.md | 48 ++- tests/perf/benchmarking.py | 274 ++++++++++++++++++ tests/perf/benchwrapper/README.md | 21 ++ tests/perf/{ => benchwrapper}/benchwrapper.py | 0 tests/perf/{ => benchwrapper}/storage.proto | 0 tests/perf/{ => benchwrapper}/storage_pb2.py | 0 .../{ => benchwrapper}/storage_pb2_grpc.py | 0 7 files changed, 331 insertions(+), 12 deletions(-) create mode 100644 tests/perf/benchmarking.py create mode 100644 tests/perf/benchwrapper/README.md rename tests/perf/{ => benchwrapper}/benchwrapper.py (100%) rename tests/perf/{ => benchwrapper}/storage.proto (100%) rename tests/perf/{ => benchwrapper}/storage_pb2.py (100%) rename tests/perf/{ => benchwrapper}/storage_pb2_grpc.py (100%) diff --git a/tests/perf/README.md b/tests/perf/README.md index e77589f61..d530b12d9 100644 --- a/tests/perf/README.md +++ b/tests/perf/README.md @@ -1,21 +1,45 @@ -# storage benchwrapp +# python-storage benchmarking -main.py is a gRPC wrapper around the storage library for benchmarking purposes. +**This is not an officially supported Google product** -## Running +This benchmarking script is used by Storage client library maintainers to benchmark various workloads and collect metrics in order to improve performance of the library. +Currently the benchmarking runs a Write-1-Read-3 workload and measures the usual two QoS performance attributes, latency and throughput. +## Run example: +This runs 10K iterations of Write-1-Read-3 on 5KiB to 16KiB files, and generates output to a default csv file `benchmarking.csv`: ```bash -$ export STORAGE_EMULATOR_HOST=http://localhost:8080 -$ pip install grpcio -$ cd storage +$ cd python-storage $ pip install -e . # install google.cloud.storage locally $ cd tests/perf -$ python3 benchwrapper.py --port 8081 +$ python3 benchmarking.py --num_samples 10000 --max_size 16384 ``` -## Re-generating protos +## CLI parameters -```bash -$ pip install grpcio-tools -$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. *.proto -``` +| Parameter | Description | Possible values | Default | +| --------- | ----------- | --------------- |:-------:| +| --min_size | minimum object size in bytes | any positive integer | `5120` (5 KiB) | +| --max_size | maximum object size in bytes | any positive integer | `2147483648` (2 GiB) | +| --num_samples | number of W1R3 iterations | any positive integer | `1000` | +| --r | bucket region for benchmarks | any GCS region | `US` | +| --p | number of processes (multiprocessing enabled) | any positive integer | 16 (recommend not to exceed 16) | +| --o | file to output results to | any file path | `benchmarking.csv` | + + +## Workload definition and CSV headers + +For each invocation of the benchmark, write a new object of random size between `min_size` and `max_size` . After the successful write, download the object in full three times. For each of the 4 operations record the following fields: + +| Field | Description | +| ----- | ----------- | +| Op | the name of the operations (WRITE, READ[{0,1,2}]) | +| ObjectSize | the number of bytes of the object | +| LibBufferSize | configured to use the [library default of 100 MiB](https://github.com/googleapis/python-storage/blob/main/google/cloud/storage/blob.py#L135) | +| Crc32cEnabled | bool: whether crc32c was computed for the operation | +| MD5Enabled | bool: whether MD5 was computed for the operation | +| ApiName | default to JSON| +| ElapsedTimeUs | the elapsed time in microseconds the operation took | +| Status | completion state of the operation [OK, FAIL] | +| RunID | timestamp from the benchmarking run | +| AppBufferSize | N/A | +| CpuTimeUs | N/A | \ No newline at end of file diff --git a/tests/perf/benchmarking.py b/tests/perf/benchmarking.py new file mode 100644 index 000000000..2389b00e6 --- /dev/null +++ b/tests/perf/benchmarking.py @@ -0,0 +1,274 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Performance benchmarking script. This is not an officially supported Google product.""" + +import argparse +import csv +import logging +import multiprocessing +import os +import random +import time +import uuid + +from functools import partial, update_wrapper + +from google.cloud import storage + + +##### DEFAULTS & CONSTANTS ##### +HEADER = [ + "Op", + "ObjectSize", + "AppBufferSize", + "LibBufferSize", + "Crc32cEnabled", + "MD5Enabled", + "ApiName", + "ElapsedTimeUs", + "CpuTimeUs", + "Status", + "RunID", +] +CHECKSUM = ["md5", "crc32c", None] +TIMESTAMP = time.strftime("%Y%m%d-%H%M%S") +DEFAULT_API = "JSON" +DEFAULT_BUCKET_LOCATION = "US" +DEFAULT_MIN_SIZE = 5120 # 5 KiB +DEFAULT_MAX_SIZE = 2147483648 # 2 GiB +DEFAULT_NUM_SAMPLES = 1000 +DEFAULT_NUM_PROCESSES = 16 +DEFAULT_LIB_BUFFER_SIZE = 104857600 # https://github.com/googleapis/python-storage/blob/main/google/cloud/storage/blob.py#L135 +NOT_SUPPORTED = -1 + + +def log_performance(func): + """Log latency and throughput output per operation call.""" + # Holds benchmarking results for each operation + res = { + "ApiName": DEFAULT_API, + "RunID": TIMESTAMP, + "CpuTimeUs": NOT_SUPPORTED, + "AppBufferSize": NOT_SUPPORTED, + "LibBufferSize": DEFAULT_LIB_BUFFER_SIZE, + } + + try: + elapsed_time = func() + except Exception as e: + logging.exception( + f"Caught an exception while running operation {func.__name__}\n {e}" + ) + res["Status"] = ["FAIL"] + elapsed_time = NOT_SUPPORTED + else: + res["Status"] = ["OK"] + + checksum = func.keywords.get("checksum") + num = func.keywords.get("num", None) + res["ElapsedTimeUs"] = elapsed_time + res["ObjectSize"] = func.keywords.get("size") + res["Crc32cEnabled"] = checksum == "crc32c" + res["MD5Enabled"] = checksum == "md5" + res["Op"] = func.__name__ + if res["Op"] == "READ": + res["Op"] += f"[{num}]" + + return [ + res["Op"], + res["ObjectSize"], + res["AppBufferSize"], + res["LibBufferSize"], + res["Crc32cEnabled"], + res["MD5Enabled"], + res["ApiName"], + res["ElapsedTimeUs"], + res["CpuTimeUs"], + res["Status"], + res["RunID"], + ] + + +def WRITE(bucket, blob_name, checksum, size, **kwargs): + """Perform an upload and return latency.""" + blob = bucket.blob(blob_name) + file_path = f"{os.getcwd()}/{uuid.uuid4().hex}" + # Create random file locally on disk + with open(file_path, "wb") as file_obj: + file_obj.write(os.urandom(size)) + + start_time = time.monotonic_ns() + blob.upload_from_filename(file_path, checksum=checksum, if_generation_match=0) + end_time = time.monotonic_ns() + + elapsed_time = round( + (end_time - start_time) / 1000 + ) # convert nanoseconds to microseconds + + # Clean up local file + cleanup_file(file_path) + + return elapsed_time + + +def READ(bucket, blob_name, checksum, **kwargs): + """Perform a download and return latency.""" + blob = bucket.blob(blob_name) + if not blob.exists(): + raise Exception("Blob does not exist. Previous WRITE failed.") + + file_path = f"{os.getcwd()}/{blob_name}" + with open(file_path, "wb") as file_obj: + start_time = time.monotonic_ns() + blob.download_to_file(file_obj, checksum=checksum) + end_time = time.monotonic_ns() + + elapsed_time = round( + (end_time - start_time) / 1000 + ) # convert nanoseconds to microseconds + + # Clean up local file + cleanup_file(file_path) + + return elapsed_time + + +def cleanup_file(file_path): + """Clean up local file on disk.""" + try: + os.remove(file_path) + except Exception as e: + logging.exception(f"Caught an exception while deleting local file\n {e}") + + +def _wrapped_partial(func, *args, **kwargs): + """Helper method to create partial and propagate function name and doc from original function.""" + partial_func = partial(func, *args, **kwargs) + update_wrapper(partial_func, func) + return partial_func + + +def _generate_func_list(bucket_name, min_size, max_size): + """Generate Write-1-Read-3 workload.""" + # generate randmon size in bytes using a uniform distribution + size = random.randrange(min_size, max_size) + blob_name = f"{TIMESTAMP}-{uuid.uuid4().hex}" + + # generate random checksumming type: md5, crc32c or None + idx_checksum = random.choice([0, 1, 2]) + checksum = CHECKSUM[idx_checksum] + + func_list = [ + _wrapped_partial( + WRITE, + storage.Client().bucket(bucket_name), + blob_name, + size=size, + checksum=checksum, + ), + *[ + _wrapped_partial( + READ, + storage.Client().bucket(bucket_name), + blob_name, + size=size, + checksum=checksum, + num=i, + ) + for i in range(3) + ], + ] + return func_list + + +def benchmark_runner(args): + """Run benchmarking iterations.""" + results = [] + for func in _generate_func_list(args.b, args.min_size, args.max_size): + results.append(log_performance(func)) + + return results + + +def main(args): + # Create a storage bucket to run benchmarking + client = storage.Client() + if not client.bucket(args.b).exists(): + bucket = client.create_bucket(args.b, location=args.r) + + # Launch benchmark_runner using multiprocessing + p = multiprocessing.Pool(args.p) + pool_output = p.map(benchmark_runner, [args for _ in range(args.num_samples)]) + + # Output to CSV file + with open(args.o, "w") as file: + writer = csv.writer(file) + writer.writerow(HEADER) + for result in pool_output: + for row in result: + writer.writerow(row) + print(f"Succesfully ran benchmarking. Please find your output log at {args.o}") + + # Cleanup and delete bucket + try: + bucket.delete(force=True) + except Exception as e: + logging.exception(f"Caught an exception while deleting bucket\n {e}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--min_size", + type=int, + default=DEFAULT_MIN_SIZE, + help="Minimum object size in bytes", + ) + parser.add_argument( + "--max_size", + type=int, + default=DEFAULT_MAX_SIZE, + help="Maximum object size in bytes", + ) + parser.add_argument( + "--num_samples", + type=int, + default=DEFAULT_NUM_SAMPLES, + help="Number of iterations", + ) + parser.add_argument( + "--p", + type=int, + default=DEFAULT_NUM_PROCESSES, + help="Number of processes- multiprocessing enabled", + ) + parser.add_argument( + "--r", type=str, default=DEFAULT_BUCKET_LOCATION, help="Bucket location" + ) + parser.add_argument( + "--o", + type=str, + default=f"benchmarking{TIMESTAMP}.csv", + help="File to output results to", + ) + parser.add_argument( + "--b", + type=str, + default=f"benchmarking{TIMESTAMP}", + help="Storage bucket name", + ) + args = parser.parse_args() + + main(args) diff --git a/tests/perf/benchwrapper/README.md b/tests/perf/benchwrapper/README.md new file mode 100644 index 000000000..e77589f61 --- /dev/null +++ b/tests/perf/benchwrapper/README.md @@ -0,0 +1,21 @@ +# storage benchwrapp + +main.py is a gRPC wrapper around the storage library for benchmarking purposes. + +## Running + +```bash +$ export STORAGE_EMULATOR_HOST=http://localhost:8080 +$ pip install grpcio +$ cd storage +$ pip install -e . # install google.cloud.storage locally +$ cd tests/perf +$ python3 benchwrapper.py --port 8081 +``` + +## Re-generating protos + +```bash +$ pip install grpcio-tools +$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. *.proto +``` diff --git a/tests/perf/benchwrapper.py b/tests/perf/benchwrapper/benchwrapper.py similarity index 100% rename from tests/perf/benchwrapper.py rename to tests/perf/benchwrapper/benchwrapper.py diff --git a/tests/perf/storage.proto b/tests/perf/benchwrapper/storage.proto similarity index 100% rename from tests/perf/storage.proto rename to tests/perf/benchwrapper/storage.proto diff --git a/tests/perf/storage_pb2.py b/tests/perf/benchwrapper/storage_pb2.py similarity index 100% rename from tests/perf/storage_pb2.py rename to tests/perf/benchwrapper/storage_pb2.py diff --git a/tests/perf/storage_pb2_grpc.py b/tests/perf/benchwrapper/storage_pb2_grpc.py similarity index 100% rename from tests/perf/storage_pb2_grpc.py rename to tests/perf/benchwrapper/storage_pb2_grpc.py From 235171001287eb77003906f0fa4b83132ecada49 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 12 May 2022 09:31:09 -0700 Subject: [PATCH 049/509] chore: publish docs for missing modules (#784) --- docs/fileio.rst | 6 ++++++ docs/index.rst | 2 ++ docs/retry.rst | 6 ++++++ docs/retry_timeout.rst | 8 -------- google/cloud/storage/constants.py | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 docs/fileio.rst create mode 100644 docs/retry.rst diff --git a/docs/fileio.rst b/docs/fileio.rst new file mode 100644 index 000000000..9ad214a25 --- /dev/null +++ b/docs/fileio.rst @@ -0,0 +1,6 @@ +FileIO +~~~~~~~ + +.. automodule:: google.cloud.storage.fileio + :members: + :show-inheritance: \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 777926af3..154c76d5e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -18,9 +18,11 @@ API Reference buckets acl batch + fileio constants hmac_key notification + retry retry_timeout generation_metageneration diff --git a/docs/retry.rst b/docs/retry.rst new file mode 100644 index 000000000..bb5690539 --- /dev/null +++ b/docs/retry.rst @@ -0,0 +1,6 @@ +Retry +---------------- + +.. automodule:: google.cloud.storage.retry + :members: + :show-inheritance: \ No newline at end of file diff --git a/docs/retry_timeout.rst b/docs/retry_timeout.rst index 7c3ad3084..db072013b 100644 --- a/docs/retry_timeout.rst +++ b/docs/retry_timeout.rst @@ -142,11 +142,3 @@ explicit policy in your code. my_cond_policy = ConditionalRetryPolicy( my_retry_policy, conditional_predicate=is_etag_in_data) bucket = client.get_bucket(BUCKET_NAME, retry=my_cond_policy) - - -Retry Module API ----------------- - -.. automodule:: google.cloud.storage.retry - :members: - :show-inheritance: diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index 132f4e40a..b8ac87886 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Constants used acros google.cloud.storage modules.""" +"""Constants used across google.cloud.storage modules.""" # Storage classes From 1b4413cc086dd8b0045469e3bbecce98e7d6051d Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 12 May 2022 21:48:18 +0200 Subject: [PATCH 050/509] chore(deps): update dependency google-cloud-pubsub to v2.12.1 (#788) Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index d87433b82..843c608cd 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.12.0 +google-cloud-pubsub==2.12.1 google-cloud-storage==2.3.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.2; python_version >= '3.8' From 3664ddebe8746d0395acd86d5efa1ef973eeac3d Mon Sep 17 00:00:00 2001 From: Pal Szabo Date: Mon, 16 May 2022 17:39:39 +0200 Subject: [PATCH 051/509] cleanup: f-string formatting (#789) * cleanup: f-string formatting * cleanup: f-string formatting * remove unnecessary :d specifier Co-authored-by: Mariatta Wijaya * remove unnecessary :d specifier Co-authored-by: Mariatta Wijaya * cleanup: f-string formatting * cleanup: f-string formatting Co-authored-by: Mariatta Wijaya --- docs/snippets.py | 12 +- google/cloud/storage/_helpers.py | 8 +- google/cloud/storage/_http.py | 4 +- google/cloud/storage/_signing.py | 14 +- google/cloud/storage/acl.py | 12 +- google/cloud/storage/batch.py | 16 +-- google/cloud/storage/blob.py | 32 ++--- google/cloud/storage/bucket.py | 26 ++-- google/cloud/storage/client.py | 10 +- google/cloud/storage/fileio.py | 10 +- google/cloud/storage/hmac_key.py | 6 +- google/cloud/storage/notification.py | 8 +- samples/snippets/acl_test.py | 4 +- samples/snippets/bucket_lock_test.py | 10 +- samples/snippets/encryption_test.py | 4 +- samples/snippets/fileio_test.py | 4 +- samples/snippets/iam_test.py | 4 +- samples/snippets/notification_polling.py | 12 +- samples/snippets/notification_test.py | 2 +- samples/snippets/noxfile.py | 4 +- samples/snippets/quickstart.py | 2 +- samples/snippets/requester_pays_test.py | 6 +- samples/snippets/rpo_test.py | 4 +- samples/snippets/snippets_test.py | 20 +-- samples/snippets/storage_activate_hmac_key.py | 16 +-- ...rage_add_bucket_conditional_iam_binding.py | 10 +- .../snippets/storage_add_bucket_iam_member.py | 2 +- samples/snippets/storage_add_bucket_label.py | 2 +- samples/snippets/storage_add_bucket_owner.py | 4 +- .../storage_bucket_delete_default_kms_key.py | 2 +- .../storage_change_default_storage_class.py | 2 +- samples/snippets/storage_configure_retries.py | 2 +- .../snippets/storage_cors_configuration.py | 2 +- samples/snippets/storage_create_bucket.py | 2 +- samples/snippets/storage_create_hmac_key.py | 18 +-- .../snippets/storage_deactivate_hmac_key.py | 16 +-- samples/snippets/storage_delete_bucket.py | 2 +- samples/snippets/storage_delete_file.py | 2 +- ...storage_delete_file_archived_generation.py | 4 +- ...age_disable_bucket_lifecycle_management.py | 2 +- ...torage_disable_default_event_based_hold.py | 2 +- .../storage_disable_requester_pays.py | 2 +- ...age_disable_uniform_bucket_level_access.py | 2 +- .../snippets/storage_disable_versioning.py | 2 +- .../storage_download_encrypted_file.py | 4 +- .../snippets/storage_download_to_stream.py | 2 +- ...rage_enable_bucket_lifecycle_management.py | 4 +- ...storage_enable_default_event_based_hold.py | 2 +- .../snippets/storage_enable_requester_pays.py | 2 +- ...rage_enable_uniform_bucket_level_access.py | 2 +- samples/snippets/storage_enable_versioning.py | 2 +- .../storage_generate_encryption_key.py | 2 +- .../storage_generate_signed_post_policy_v4.py | 2 +- .../storage_generate_signed_url_v2.py | 2 +- .../storage_generate_signed_url_v4.py | 2 +- .../storage_get_default_event_based_hold.py | 6 +- samples/snippets/storage_get_hmac_key.py | 16 +-- samples/snippets/storage_get_metadata.py | 46 ++++--- .../storage_get_requester_pays_status.py | 4 +- .../snippets/storage_get_retention_policy.py | 6 +- .../snippets/storage_get_service_account.py | 4 +- ...storage_get_uniform_bucket_level_access.py | 8 +- .../storage_list_file_archived_generations.py | 2 +- samples/snippets/storage_list_hmac_keys.py | 4 +- .../snippets/storage_lock_retention_policy.py | 6 +- samples/snippets/storage_make_public.py | 4 +- .../snippets/storage_object_get_kms_key.py | 2 +- samples/snippets/storage_print_bucket_acl.py | 2 +- samples/snippets/storage_print_file_acl.py | 2 +- .../storage_release_event_based_hold.py | 2 +- .../storage_remove_bucket_default_owner.py | 4 +- .../storage_remove_bucket_iam_member.py | 2 +- .../snippets/storage_remove_bucket_label.py | 2 +- .../snippets/storage_remove_bucket_owner.py | 2 +- .../storage_remove_cors_configuration.py | 2 +- samples/snippets/storage_remove_file_owner.py | 4 +- .../storage_remove_retention_policy.py | 2 +- samples/snippets/storage_rename_file.py | 2 +- .../snippets/storage_rotate_encryption_key.py | 2 +- .../snippets/storage_set_bucket_public_iam.py | 2 +- .../snippets/storage_set_event_based_hold.py | 2 +- samples/snippets/storage_set_metadata.py | 2 +- .../snippets/storage_upload_encrypted_file.py | 4 +- samples/snippets/storage_upload_file.py | 4 +- .../snippets/storage_upload_from_memory.py | 4 +- .../snippets/storage_upload_from_stream.py | 4 +- .../storage_view_bucket_iam_members.py | 2 +- .../uniform_bucket_level_access_test.py | 6 +- tests/conformance/test_conformance.py | 24 ++-- tests/system/test_bucket.py | 2 +- tests/system/test_notification.py | 4 +- tests/unit/test__http.py | 8 +- tests/unit/test__signing.py | 18 +-- tests/unit/test_acl.py | 32 ++--- tests/unit/test_batch.py | 10 +- tests/unit/test_blob.py | 122 ++++++++---------- tests/unit/test_bucket.py | 72 +++++------ tests/unit/test_client.py | 46 +++---- tests/unit/test_hmac_key.py | 26 ++-- tests/unit/test_notification.py | 6 +- 100 files changed, 403 insertions(+), 489 deletions(-) diff --git a/docs/snippets.py b/docs/snippets.py index 89f92a20b..7ee3a62a0 100644 --- a/docs/snippets.py +++ b/docs/snippets.py @@ -260,9 +260,7 @@ def policy_document(client): # Generate an upload form using the form fields. policy_fields = "".join( - ''.format( - key=key, value=value - ) + f'' for key, value in policy.items() ) @@ -301,13 +299,15 @@ def main(): client = storage.Client() for example in _find_examples(): to_delete = [] - print("%-25s: %s" % _name_and_doc(example)) + name, doc = _name_and_doc(example) + print(f"{name:>25}: {doc}") + try: example(client, to_delete) except AssertionError as failure: - print(" FAIL: %s" % (failure,)) + print(f" FAIL: {failure}") except Exception as error: # pylint: disable=broad-except - print(" ERROR: %r" % (error,)) + print(f" ERROR: {error!r}") for item in to_delete: item.delete() diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index cc85525d8..282d9bcfb 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -519,14 +519,12 @@ def _raise_if_more_than_one_set(**kwargs): :raises: :class:`~ValueError` containing the fields that were set """ if sum(arg is not None for arg in kwargs.values()) > 1: - escaped_keys = ["'%s'" % name for name in kwargs.keys()] + escaped_keys = [f"'{name}'" for name in kwargs.keys()] keys_but_last = ", ".join(escaped_keys[:-1]) last_key = escaped_keys[-1] - msg = "Pass at most one of {keys_but_last} and {last_key}".format( - keys_but_last=keys_but_last, last_key=last_key - ) + msg = f"Pass at most one of {keys_but_last} and {last_key}" raise ValueError(msg) @@ -548,7 +546,7 @@ def _bucket_bound_hostname_url(host, scheme=None): if url_parts.scheme and url_parts.netloc: return host - return "{scheme}://{host}/".format(scheme=scheme, host=host) + return f"{scheme}://{host}/" def _api_core_retry_to_resumable_media_retry(retry, num_retries=None): diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index 9b29f6280..3a739bba6 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -48,9 +48,9 @@ def __init__(self, client, client_info=None, api_endpoint=None): # TODO: When metrics all use gccl, this should be removed #9552 if self._client_info.user_agent is None: # pragma: no branch self._client_info.user_agent = "" - agent_version = "gcloud-python/{}".format(__version__) + agent_version = f"gcloud-python/{__version__}" if agent_version not in self._client_info.user_agent: - self._client_info.user_agent += " {} ".format(agent_version) + self._client_info.user_agent += f" {agent_version} " API_VERSION = "v1" """The version of the API, used in building the API call's URL.""" diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index 837ef6211..036ea6385 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -157,9 +157,7 @@ def get_expiration_seconds_v4(expiration): seconds = int(expiration.total_seconds()) if seconds > SEVEN_DAYS: - raise ValueError( - "Max allowed expiration interval is seven days {}".format(SEVEN_DAYS) - ) + raise ValueError(f"Max allowed expiration interval is seven days {SEVEN_DAYS}") return seconds @@ -252,7 +250,7 @@ def canonicalize_v2(method, resource, query_parameters, headers): for key, value in query_parameters.items() ) encoded_qp = urllib.parse.urlencode(normalized_qp) - canonical_resource = "{}?{}".format(resource, encoded_qp) + canonical_resource = f"{resource}?{encoded_qp}" return _Canonical(method, canonical_resource, normalized_qp, headers) @@ -550,8 +548,8 @@ def generate_signed_url_v4( ensure_signed_credentials(credentials) client_email = credentials.signer_email - credential_scope = "{}/auto/storage/goog4_request".format(datestamp) - credential = "{}/{}".format(client_email, credential_scope) + credential_scope = f"{datestamp}/auto/storage/goog4_request" + credential = f"{client_email}/{credential_scope}" if headers is None: headers = {} @@ -689,7 +687,7 @@ def _sign_message(message, access_token, service_account_email): if response.status != http.client.OK: raise exceptions.TransportError( - "Error calling the IAM signBytes API: {}".format(response.data) + f"Error calling the IAM signBytes API: {response.data}" ) data = json.loads(response.data.decode("utf-8")) @@ -706,7 +704,7 @@ def _url_encode(query_params): :returns: URL encoded query params. """ params = [ - "{}={}".format(_quote_param(name), _quote_param(value)) + f"{_quote_param(name)}={_quote_param(value)}" for name, value in query_params.items() ] diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index ef2bca356..e876c152c 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -120,9 +120,7 @@ def __str__(self): return "{acl.type}-{acl.identifier}".format(acl=self) def __repr__(self): - return "".format( - acl=self, roles=", ".join(self.roles) - ) + return f"" def get_roles(self): """Get the list of roles permitted by this entity. @@ -242,7 +240,7 @@ def validate_predefined(cls, predefined): """ predefined = cls.PREDEFINED_XML_ACLS.get(predefined, predefined) if predefined and predefined not in cls.PREDEFINED_JSON_ACLS: - raise ValueError("Invalid predefined ACL: %s" % (predefined,)) + raise ValueError(f"Invalid predefined ACL: {predefined}") return predefined def reset(self): @@ -285,7 +283,7 @@ def entity_from_dict(self, entity_dict): entity = self.entity(entity_type=entity_type, identifier=identifier) if not isinstance(entity, _ACLEntity): - raise ValueError("Invalid dictionary: %s" % entity_dict) + raise ValueError(f"Invalid dictionary: {entity_dict}") entity.grant(role) return entity @@ -770,7 +768,7 @@ def client(self): @property def reload_path(self): """Compute the path for GET API requests for this ACL.""" - return "%s/%s" % (self.bucket.path, self._URL_PATH_ELEM) + return f"{self.bucket.path}/{self._URL_PATH_ELEM}" @property def save_path(self): @@ -809,7 +807,7 @@ def client(self): @property def reload_path(self): """Compute the path for GET API requests for this ACL.""" - return "%s/acl" % self.blob.path + return f"{self.blob.path}/acl" @property def save_path(self): diff --git a/google/cloud/storage/batch.py b/google/cloud/storage/batch.py index cbc93397f..599aa3a7f 100644 --- a/google/cloud/storage/batch.py +++ b/google/cloud/storage/batch.py @@ -57,10 +57,8 @@ def __init__(self, method, uri, headers, body): headers["Content-Length"] = len(body) if body is None: body = "" - lines = ["%s %s HTTP/1.1" % (method, uri)] - lines.extend( - ["%s: %s" % (key, value) for key, value in sorted(headers.items())] - ) + lines = [f"{method} {uri} HTTP/1.1"] + lines.extend([f"{key}: {value}" for key, value in sorted(headers.items())]) lines.append("") lines.append(body) payload = "\r\n".join(lines) @@ -86,7 +84,7 @@ def get(key, default=None): :raises: :class:`KeyError` always since the future is intended to fail as a dictionary. """ - raise KeyError("Cannot get(%r, default=%r) on a future" % (key, default)) + raise KeyError(f"Cannot get({key!r}, default={default!r}) on a future") def __getitem__(self, key): """Stand-in for dict[key]. @@ -97,7 +95,7 @@ def __getitem__(self, key): :raises: :class:`KeyError` always since the future is intended to fail as a dictionary. """ - raise KeyError("Cannot get item %r from a future" % (key,)) + raise KeyError(f"Cannot get item {key!r} from a future") def __setitem__(self, key, value): """Stand-in for dict[key] = value. @@ -111,7 +109,7 @@ def __setitem__(self, key, value): :raises: :class:`KeyError` always since the future is intended to fail as a dictionary. """ - raise KeyError("Cannot set %r -> %r on a future" % (key, value)) + raise KeyError(f"Cannot set {key!r} -> {value!r} on a future") class _FutureResponse(requests.Response): @@ -257,7 +255,7 @@ def finish(self): """ headers, body, timeout = self._prepare_batch_request() - url = "%s/batch/storage/v1" % self.API_BASE_URL + url = f"{self.API_BASE_URL}/batch/storage/v1" # Use the private ``_base_connection`` rather than the property # ``_connection``, since the property may be this @@ -332,7 +330,7 @@ def _unpack_batch_response(response): subresponse = requests.Response() subresponse.request = requests.Request( - method="BATCH", url="contentid://{}".format(content_id) + method="BATCH", url=f"contentid://{content_id}" ).prepare() subresponse.status_code = int(status) subresponse.headers.update(msg_headers) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 8a2b5861c..a3ea714ef 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -312,7 +312,7 @@ def __repr__(self): else: bucket_name = None - return "" % (bucket_name, self.name, self.generation) + return f"" @property def path(self): @@ -575,20 +575,16 @@ def generate_signed_url( quoted_name = _quote(self.name, safe=b"/~") if virtual_hosted_style: - api_access_endpoint = "https://{bucket_name}.storage.googleapis.com".format( - bucket_name=self.bucket.name - ) + api_access_endpoint = f"https://{self.bucket.name}.storage.googleapis.com" elif bucket_bound_hostname: api_access_endpoint = _bucket_bound_hostname_url( bucket_bound_hostname, scheme ) else: - resource = "/{bucket_name}/{quoted_name}".format( - bucket_name=self.bucket.name, quoted_name=quoted_name - ) + resource = f"/{self.bucket.name}/{quoted_name}" if virtual_hosted_style or bucket_bound_hostname: - resource = "/{quoted_name}".format(quoted_name=quoted_name) + resource = f"/{quoted_name}" if credentials is None: client = self._require_client(client) @@ -840,7 +836,7 @@ def _get_download_url( hostname = _get_host_name(client._connection) base_url = _DOWNLOAD_URL_TEMPLATE.format(hostname=hostname, path=self.path) if self.generation is not None: - name_value_pairs.append(("generation", "{:d}".format(self.generation))) + name_value_pairs.append(("generation", f"{self.generation:d}")) else: base_url = self.media_link @@ -3095,7 +3091,7 @@ def get_iam_policy( query_params["optionsRequestedPolicyVersion"] = requested_policy_version info = client._get_resource( - "%s/iam" % (self.path,), + f"{self.path}/iam", query_params=query_params, timeout=timeout, retry=retry, @@ -3151,7 +3147,7 @@ def set_iam_policy( if self.user_project is not None: query_params["userProject"] = self.user_project - path = "{}/iam".format(self.path) + path = f"{self.path}/iam" resource = policy.to_api_repr() resource["resourceId"] = self.path info = client._put_resource( @@ -3207,7 +3203,7 @@ def test_iam_permissions( if self.user_project is not None: query_params["userProject"] = self.user_project - path = "%s/iam/testPermissions" % (self.path,) + path = f"{self.path}/iam/testPermissions" resp = client._get_resource( path, query_params=query_params, @@ -3462,7 +3458,7 @@ def compose( ) api_response = client._post_resource( - "{}/compose".format(self.path), + f"{self.path}/compose", request, query_params=query_params, timeout=timeout, @@ -3595,7 +3591,7 @@ def rewrite( if_source_metageneration_not_match=if_source_metageneration_not_match, ) - path = "{}/rewriteTo{}".format(source.path, self.path) + path = f"{source.path}/rewriteTo{self.path}" api_response = client._post_resource( path, self._properties, @@ -3712,7 +3708,7 @@ def update_storage_class( (Optional) How to retry the RPC. See: :ref:`configuring_retries` """ if new_class not in self.STORAGE_CLASSES: - raise ValueError("Invalid storage class: %s" % (new_class,)) + raise ValueError(f"Invalid storage class: {new_class}") # Update current blob's storage class prior to rewrite self._patch_property("storageClass", new_class) @@ -3755,7 +3751,7 @@ def open( encoding=None, errors=None, newline=None, - **kwargs + **kwargs, ): r"""Create a file handler for file-like I/O to or from this blob. @@ -4448,9 +4444,7 @@ def _raise_from_invalid_response(error): else: error_message = str(error) - message = "{method} {url}: {error}".format( - method=response.request.method, url=response.request.url, error=error_message - ) + message = f"{response.request.method} {response.request.url}: {error_message}" raise exceptions.from_http_status(response.status_code, message, response=response) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index be99ad141..143629236 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -647,7 +647,7 @@ def __init__(self, client, name=None, user_project=None): self._user_project = user_project def __repr__(self): - return "" % (self.name,) + return f"" @property def client(self): @@ -1166,7 +1166,7 @@ def get_blob( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, - **kwargs + **kwargs, ): """Get a blob object by name. @@ -1241,7 +1241,7 @@ def get_blob( name=blob_name, encryption_key=encryption_key, generation=generation, - **kwargs + **kwargs, ) try: # NOTE: This will not fail immediately in a batch. However, when @@ -2600,7 +2600,7 @@ def storage_class(self, value): :attr:`~google.cloud.storage.constants.DURABLE_REDUCED_AVAILABILITY_LEGACY_STORAGE_CLASS`, """ if value not in self.STORAGE_CLASSES: - raise ValueError("Invalid storage class: %s" % (value,)) + raise ValueError(f"Invalid storage class: {value}") self._patch_property("storageClass", value) @property @@ -2801,7 +2801,7 @@ def get_iam_policy( query_params["optionsRequestedPolicyVersion"] = requested_policy_version info = client._get_resource( - "%s/iam" % (self.path,), + f"{self.path}/iam", query_params=query_params, timeout=timeout, retry=retry, @@ -2850,7 +2850,7 @@ def set_iam_policy( if self.user_project is not None: query_params["userProject"] = self.user_project - path = "{}/iam".format(self.path) + path = f"{self.path}/iam" resource = policy.to_api_repr() resource["resourceId"] = self.path @@ -2902,7 +2902,7 @@ def test_iam_permissions( if self.user_project is not None: query_params["userProject"] = self.user_project - path = "%s/iam/testPermissions" % (self.path,) + path = f"{self.path}/iam/testPermissions" resp = client._get_resource( path, query_params=query_params, @@ -3207,7 +3207,7 @@ def lock_retention_policy( if self.user_project is not None: query_params["userProject"] = self.user_project - path = "/b/{}/lockRetentionPolicy".format(self.name) + path = f"/b/{self.name}/lockRetentionPolicy" api_response = client._post_resource( path, None, @@ -3341,15 +3341,13 @@ def generate_signed_url( raise ValueError("'version' must be either 'v2' or 'v4'") if virtual_hosted_style: - api_access_endpoint = "https://{bucket_name}.storage.googleapis.com".format( - bucket_name=self.name - ) + api_access_endpoint = f"https://{self.name}.storage.googleapis.com" elif bucket_bound_hostname: api_access_endpoint = _bucket_bound_hostname_url( bucket_bound_hostname, scheme ) else: - resource = "/{bucket_name}".format(bucket_name=self.name) + resource = f"/{self.name}" if virtual_hosted_style or bucket_bound_hostname: resource = "/" @@ -3389,6 +3387,4 @@ def _raise_if_len_differs(expected_len, **generation_match_args): """ for name, value in generation_match_args.items(): if value is not None and len(value) != expected_len: - raise ValueError( - "'{}' length must be the same as 'blobs' length".format(name) - ) + raise ValueError(f"'{name}' length must be the same as 'blobs' length") diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 8b63a0198..f905e1be0 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -272,7 +272,7 @@ def get_service_account_email( if project is None: project = self.project - path = "/projects/%s/serviceAccount" % (project,) + path = f"/projects/{project}/serviceAccount" api_response = self._get_resource(path, timeout=timeout, retry=retry) return api_response["email_address"] @@ -1471,7 +1471,7 @@ def create_hmac_key( if project_id is None: project_id = self.project - path = "/projects/{}/hmacKeys".format(project_id) + path = f"/projects/{project_id}/hmacKeys" qs_params = {"serviceAccountEmail": service_account_email} if user_project is not None: @@ -1537,7 +1537,7 @@ def list_hmac_keys( if project_id is None: project_id = self.project - path = "/projects/{}/hmacKeys".format(project_id) + path = f"/projects/{project_id}/hmacKeys" extra_params = {} if service_account_email is not None: @@ -1747,11 +1747,11 @@ def generate_signed_post_policy_v4( ) # designate URL if virtual_hosted_style: - url = "https://{}.storage.googleapis.com/".format(bucket_name) + url = f"https://{bucket_name}.storage.googleapis.com/" elif bucket_bound_hostname: url = _bucket_bound_hostname_url(bucket_bound_hostname, scheme) else: - url = "https://storage.googleapis.com/{}/".format(bucket_name) + url = f"https://storage.googleapis.com/{bucket_name}/" return {"url": url, "fields": policy_fields} diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index e05663675..cc04800eb 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -106,7 +106,7 @@ def __init__(self, blob, chunk_size=None, retry=DEFAULT_RETRY, **download_kwargs for kwarg in download_kwargs: if kwarg not in VALID_DOWNLOAD_KWARGS: raise ValueError( - "BlobReader does not support keyword argument {}.".format(kwarg) + f"BlobReader does not support keyword argument {kwarg}." ) self._blob = blob @@ -144,7 +144,7 @@ def read(self, size=-1): end=fetch_end, checksum=None, retry=self._retry, - **self._download_kwargs + **self._download_kwargs, ) except RequestRangeNotSatisfiable: # We've reached the end of the file. Python file objects should @@ -299,12 +299,12 @@ def __init__( text_mode=False, ignore_flush=False, retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, - **upload_kwargs + **upload_kwargs, ): for kwarg in upload_kwargs: if kwarg not in VALID_UPLOAD_KWARGS: raise ValueError( - "BlobWriter does not support keyword argument {}.".format(kwarg) + f"BlobWriter does not support keyword argument {kwarg}." ) self._blob = blob self._buffer = SlidingBuffer() @@ -390,7 +390,7 @@ def _initiate_upload(self): num_retries, chunk_size=self._chunk_size, retry=retry, - **self._upload_kwargs + **self._upload_kwargs, ) def _upload_chunks_from_buffer(self, num_chunks): diff --git a/google/cloud/storage/hmac_key.py b/google/cloud/storage/hmac_key.py index 1636aaba4..944bc7f87 100644 --- a/google/cloud/storage/hmac_key.py +++ b/google/cloud/storage/hmac_key.py @@ -133,9 +133,7 @@ def state(self): def state(self, value): if value not in self._SETTABLE_STATES: raise ValueError( - "State may only be set to one of: {}".format( - ", ".join(self._SETTABLE_STATES) - ) + f"State may only be set to one of: {', '.join(self._SETTABLE_STATES)}" ) self._properties["state"] = value @@ -177,7 +175,7 @@ def path(self): if project is None: project = self._client.project - return "/projects/{}/hmacKeys/{}".format(project, self.access_id) + return f"/projects/{project}/hmacKeys/{self.access_id}" @property def user_project(self): diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index 0cdb87fa8..f7e72e710 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -202,9 +202,7 @@ def client(self): @property def path(self): """The URL path for this notification.""" - return "/b/{}/notificationConfigs/{}".format( - self.bucket.name, self.notification_id - ) + return f"/b/{self.bucket.name}/notificationConfigs/{self.notification_id}" def _require_client(self, client): """Check client or verify over-ride. @@ -254,7 +252,7 @@ def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): """ if self.notification_id is not None: raise ValueError( - "Notification already exists w/ id: {}".format(self.notification_id) + f"Notification already exists w/ id: {self.notification_id}" ) client = self._require_client(client) @@ -263,7 +261,7 @@ def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): if self.bucket.user_project is not None: query_params["userProject"] = self.bucket.user_project - path = "/b/{}/notificationConfigs".format(self.bucket.name) + path = f"/b/{self.bucket.name}/notificationConfigs" properties = self._properties.copy() if self.topic_name is None: diff --git a/samples/snippets/acl_test.py b/samples/snippets/acl_test.py index 91856d816..eecee522b 100644 --- a/samples/snippets/acl_test.py +++ b/samples/snippets/acl_test.py @@ -46,7 +46,7 @@ def test_bucket(): os.environ["GOOGLE_CLOUD_PROJECT"] = os.environ["MAIN_GOOGLE_CLOUD_PROJECT"] bucket = None while bucket is None or bucket.exists(): - bucket_name = "acl-test-{}".format(uuid.uuid4()) + bucket_name = f"acl-test-{uuid.uuid4()}" bucket = storage.Client().bucket(bucket_name) bucket.create() yield bucket @@ -59,7 +59,7 @@ def test_bucket(): def test_blob(test_bucket): """Yields a blob that is deleted after the test completes.""" bucket = test_bucket - blob = bucket.blob("storage_acl_test_sigil-{}".format(uuid.uuid4())) + blob = bucket.blob(f"storage_acl_test_sigil-{uuid.uuid4()}") blob.upload_from_string("Hello, is it me you're looking for?") yield blob diff --git a/samples/snippets/bucket_lock_test.py b/samples/snippets/bucket_lock_test.py index 67d4ec685..9b7b4fa2a 100644 --- a/samples/snippets/bucket_lock_test.py +++ b/samples/snippets/bucket_lock_test.py @@ -42,7 +42,7 @@ def bucket(): """Yields a bucket that is deleted after the test completes.""" bucket = None while bucket is None or bucket.exists(): - bucket_name = "bucket-lock-{}".format(uuid.uuid4()) + bucket_name = f"bucket-lock-{uuid.uuid4()}" bucket = storage.Client().bucket(bucket_name) bucket.create() yield bucket @@ -61,7 +61,7 @@ def test_retention_policy_no_lock(bucket, capsys): storage_get_retention_policy.get_retention_policy(bucket.name) out, _ = capsys.readouterr() - assert "Retention Policy for {}".format(bucket.name) in out + assert f"Retention Policy for {bucket.name}" in out assert "Retention Period: 5" in out assert "Effective Time: " in out assert "Retention Policy is locked" not in out @@ -100,11 +100,11 @@ def test_enable_disable_bucket_default_event_based_hold(bucket, capsys): ) out, _ = capsys.readouterr() assert ( - "Default event-based hold is not enabled for {}".format(bucket.name) + f"Default event-based hold is not enabled for {bucket.name}" in out ) assert ( - "Default event-based hold is enabled for {}".format(bucket.name) + f"Default event-based hold is enabled for {bucket.name}" not in out ) @@ -120,7 +120,7 @@ def test_enable_disable_bucket_default_event_based_hold(bucket, capsys): ) out, _ = capsys.readouterr() assert ( - "Default event-based hold is enabled for {}".format(bucket.name) in out + f"Default event-based hold is enabled for {bucket.name}" in out ) # Changes to the bucket will be readable immediately after writing, diff --git a/samples/snippets/encryption_test.py b/samples/snippets/encryption_test.py index 6c2377e0f..536c5d334 100644 --- a/samples/snippets/encryption_test.py +++ b/samples/snippets/encryption_test.py @@ -62,7 +62,7 @@ def test_upload_encrypted_blob(): def test_blob(): """Provides a pre-existing blob in the test bucket.""" bucket = storage.Client().bucket(BUCKET) - blob_name = "test_blob_{}".format(uuid.uuid4().hex) + blob_name = f"test_blob_{uuid.uuid4().hex}" blob = Blob( blob_name, bucket, @@ -81,7 +81,7 @@ def test_blob(): blob.delete() except NotFound as e: # For the case that the rotation succeeded. - print("Ignoring 404, detail: {}".format(e)) + print(f"Ignoring 404, detail: {e}") blob = Blob( blob_name, bucket, diff --git a/samples/snippets/fileio_test.py b/samples/snippets/fileio_test.py index cf98ce1ab..b8a4b8272 100644 --- a/samples/snippets/fileio_test.py +++ b/samples/snippets/fileio_test.py @@ -19,14 +19,14 @@ def test_fileio_write_read(bucket, capsys): - blob_name = "test-fileio-{}".format(uuid.uuid4()) + blob_name = f"test-fileio-{uuid.uuid4()}" storage_fileio_write_read.write_read(bucket.name, blob_name) out, _ = capsys.readouterr() assert "Hello world" in out def test_fileio_pandas(bucket, capsys): - blob_name = "test-fileio-{}".format(uuid.uuid4()) + blob_name = f"test-fileio-{uuid.uuid4()}" storage_fileio_pandas.pandas_write(bucket.name, blob_name) out, _ = capsys.readouterr() assert f"Wrote csv with pandas with name {blob_name} from bucket {bucket.name}." in out diff --git a/samples/snippets/iam_test.py b/samples/snippets/iam_test.py index edeb8427d..7700b6c6a 100644 --- a/samples/snippets/iam_test.py +++ b/samples/snippets/iam_test.py @@ -42,7 +42,7 @@ def bucket(): bucket = None while bucket is None or bucket.exists(): storage_client = storage.Client() - bucket_name = "test-iam-{}".format(uuid.uuid4()) + bucket_name = f"test-iam-{uuid.uuid4()}" bucket = storage_client.bucket(bucket_name) bucket.iam_configuration.uniform_bucket_level_access_enabled = True storage_client.create_bucket(bucket) @@ -60,7 +60,7 @@ def public_bucket(): bucket = None while bucket is None or bucket.exists(): storage_client = storage.Client() - bucket_name = "test-iam-{}".format(uuid.uuid4()) + bucket_name = f"test-iam-{uuid.uuid4()}" bucket = storage_client.bucket(bucket_name) bucket.iam_configuration.uniform_bucket_level_access_enabled = True storage_client.create_bucket(bucket) diff --git a/samples/snippets/notification_polling.py b/samples/snippets/notification_polling.py index 34fd8cc3e..2ee6789c3 100644 --- a/samples/snippets/notification_polling.py +++ b/samples/snippets/notification_polling.py @@ -76,13 +76,9 @@ def summarize(message): ) if "overwroteGeneration" in attributes: - description += "\tOverwrote generation: %s\n" % ( - attributes["overwroteGeneration"] - ) + description += f"\tOverwrote generation: {attributes['overwroteGeneration']}\n" if "overwrittenByGeneration" in attributes: - description += "\tOverwritten by generation: %s\n" % ( - attributes["overwrittenByGeneration"] - ) + description += f"\tOverwritten by generation: {attributes['overwrittenByGeneration']}\n" payload_format = attributes["payloadFormat"] if payload_format == "JSON_API_V1": @@ -110,14 +106,14 @@ def poll_notifications(project, subscription_name): ) def callback(message): - print("Received message:\n{}".format(summarize(message))) + print(f"Received message:\n{summarize(message)}") message.ack() subscriber.subscribe(subscription_path, callback=callback) # The subscriber is non-blocking, so we must keep the main thread from # exiting to allow it to process messages in the background. - print("Listening for messages on {}".format(subscription_path)) + print(f"Listening for messages on {subscription_path}") while True: time.sleep(60) diff --git a/samples/snippets/notification_test.py b/samples/snippets/notification_test.py index 13553c844..a2fdbe3ef 100644 --- a/samples/snippets/notification_test.py +++ b/samples/snippets/notification_test.py @@ -55,7 +55,7 @@ def _notification_topic(storage_client, publisher_client): binding = policy.bindings.add() binding.role = "roles/pubsub.publisher" binding.members.append( - "serviceAccount:{}".format(storage_client.get_service_account_email()) + f"serviceAccount:{storage_client.get_service_account_email()}" ) publisher_client.set_iam_policy(request={"resource": topic_path, "policy": policy}) diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 38bb0a572..9f1cc8fb1 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -66,7 +66,7 @@ sys.path.append(".") from noxfile_config import TEST_CONFIG_OVERRIDE except ImportError as e: - print("No user noxfile_config found: detail: {}".format(e)) + print(f"No user noxfile_config found: detail: {e}") TEST_CONFIG_OVERRIDE = {} # Update the TEST_CONFIG with the user supplied values. @@ -266,7 +266,7 @@ def py(session: nox.sessions.Session) -> None: _session_tests(session) else: session.skip( - "SKIPPED: {} tests are disabled for this sample.".format(session.python) + f"SKIPPED: {session.python} tests are disabled for this sample." ) diff --git a/samples/snippets/quickstart.py b/samples/snippets/quickstart.py index 578e50753..54148b1fb 100644 --- a/samples/snippets/quickstart.py +++ b/samples/snippets/quickstart.py @@ -29,7 +29,7 @@ def run_quickstart(): # Creates the new bucket bucket = storage_client.create_bucket(bucket_name) - print("Bucket {} created.".format(bucket.name)) + print(f"Bucket {bucket.name} created.") # [END storage_quickstart] diff --git a/samples/snippets/requester_pays_test.py b/samples/snippets/requester_pays_test.py index 9a178edb0..cf8c2d097 100644 --- a/samples/snippets/requester_pays_test.py +++ b/samples/snippets/requester_pays_test.py @@ -34,19 +34,19 @@ def test_enable_requester_pays(capsys): storage_enable_requester_pays.enable_requester_pays(BUCKET) out, _ = capsys.readouterr() - assert "Requester Pays has been enabled for {}".format(BUCKET) in out + assert f"Requester Pays has been enabled for {BUCKET}" in out def test_disable_requester_pays(capsys): storage_disable_requester_pays.disable_requester_pays(BUCKET) out, _ = capsys.readouterr() - assert "Requester Pays has been disabled for {}".format(BUCKET) in out + assert f"Requester Pays has been disabled for {BUCKET}" in out def test_get_requester_pays_status(capsys): storage_get_requester_pays_status.get_requester_pays_status(BUCKET) out, _ = capsys.readouterr() - assert "Requester Pays is disabled for {}".format(BUCKET) in out + assert f"Requester Pays is disabled for {BUCKET}" in out @pytest.fixture diff --git a/samples/snippets/rpo_test.py b/samples/snippets/rpo_test.py index d084710a9..f1f16e7fb 100644 --- a/samples/snippets/rpo_test.py +++ b/samples/snippets/rpo_test.py @@ -28,7 +28,7 @@ def dual_region_bucket(): """Yields a dual region bucket that is deleted after the test completes.""" bucket = None while bucket is None or bucket.exists(): - bucket_name = "bucket-lock-{}".format(uuid.uuid4()) + bucket_name = f"bucket-lock-{uuid.uuid4()}" bucket = storage.Client().bucket(bucket_name) bucket.location = "NAM4" bucket.create() @@ -55,7 +55,7 @@ def test_set_rpo_default(dual_region_bucket, capsys): def test_create_bucket_turbo_replication(capsys): - bucket_name = "test-rpo-{}".format(uuid.uuid4()) + bucket_name = f"test-rpo-{uuid.uuid4()}" storage_create_bucket_turbo_replication.create_bucket_turbo_replication(bucket_name) out, _ = capsys.readouterr() assert f"{bucket_name} created with RPO ASYNC_TURBO in NAM4." in out diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 7a5a3a64f..bdd8c528e 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -111,7 +111,7 @@ def test_bucket(): """Yields a bucket that is deleted after the test completes.""" bucket = None while bucket is None or bucket.exists(): - bucket_name = "storage-snippets-test-{}".format(uuid.uuid4()) + bucket_name = f"storage-snippets-test-{uuid.uuid4()}" bucket = storage.Client().bucket(bucket_name) bucket.create() yield bucket @@ -127,7 +127,7 @@ def test_public_bucket(): bucket = None while bucket is None or bucket.exists(): storage_client = storage.Client() - bucket_name = "storage-snippets-test-{}".format(uuid.uuid4()) + bucket_name = f"storage-snippets-test-{uuid.uuid4()}" bucket = storage_client.bucket(bucket_name) storage_client.create_bucket(bucket) yield bucket @@ -140,7 +140,7 @@ def test_public_bucket(): def test_blob(test_bucket): """Yields a blob that is deleted after the test completes.""" bucket = test_bucket - blob = bucket.blob("storage_snippets_test_sigil-{}".format(uuid.uuid4())) + blob = bucket.blob(f"storage_snippets_test_sigil-{uuid.uuid4()}") blob.upload_from_string("Hello, is it me you're looking for?") yield blob @@ -149,7 +149,7 @@ def test_blob(test_bucket): def test_public_blob(test_public_bucket): """Yields a blob that is deleted after the test completes.""" bucket = test_public_bucket - blob = bucket.blob("storage_snippets_test_sigil-{}".format(uuid.uuid4())) + blob = bucket.blob(f"storage_snippets_test_sigil-{uuid.uuid4()}") blob.upload_from_string("Hello, is it me you're looking for?") yield blob @@ -159,7 +159,7 @@ def test_bucket_create(): """Yields a bucket object that is deleted after the test completes.""" bucket = None while bucket is None or bucket.exists(): - bucket_name = "storage-snippets-test-{}".format(uuid.uuid4()) + bucket_name = f"storage-snippets-test-{uuid.uuid4()}" bucket = storage.Client().bucket(bucket_name) yield bucket bucket.delete(force=True) @@ -217,7 +217,7 @@ def test_upload_blob_from_stream(test_bucket, capsys): ) out, _ = capsys.readouterr() - assert "Stream data uploaded to {}".format("test_upload_blob") in out + assert "Stream data uploaded to test_upload_blob" in out def test_upload_blob_with_kms(test_bucket): @@ -339,7 +339,7 @@ def test_generate_signed_policy_v4(test_bucket, capsys): blob_name = "storage_snippets_test_form" short_name = storage_generate_signed_post_policy_v4 form = short_name.generate_signed_post_policy_v4(test_bucket.name, blob_name) - assert "name='key' value='{}'".format(blob_name) in form + assert f"name='key' value='{blob_name}'" in form assert "name='x-goog-signature'" in form assert "name='x-goog-date'" in form assert "name='x-goog-credential'" in form @@ -355,7 +355,7 @@ def test_rename_blob(test_blob): try: bucket.delete_blob("test_rename_blob") except google.cloud.exceptions.exceptions.NotFound: - print("test_rename_blob not found in bucket {}".format(bucket.name)) + print(f"test_rename_blob not found in bucket {bucket.name}") storage_rename_file.rename_blob(bucket.name, test_blob.name, "test_rename_blob") @@ -370,7 +370,7 @@ def test_move_blob(test_bucket_create, test_blob): try: test_bucket_create.delete_blob("test_move_blob") except google.cloud.exceptions.NotFound: - print("test_move_blob not found in bucket {}".format(test_bucket_create.name)) + print(f"test_move_blob not found in bucket {test_bucket_create.name}") storage_move_file.move_blob( bucket.name, test_blob.name, test_bucket_create.name, "test_move_blob" @@ -551,7 +551,7 @@ def test_change_file_storage_class(test_blob, capsys): test_blob.bucket.name, test_blob.name ) out, _ = capsys.readouterr() - assert "Blob {} in bucket {}". format(blob.name, blob.bucket.name) in out + assert f"Blob {blob.name} in bucket {blob.bucket.name}" in out assert blob.storage_class == 'NEARLINE' diff --git a/samples/snippets/storage_activate_hmac_key.py b/samples/snippets/storage_activate_hmac_key.py index e77cd8066..d3960eb62 100644 --- a/samples/snippets/storage_activate_hmac_key.py +++ b/samples/snippets/storage_activate_hmac_key.py @@ -36,14 +36,14 @@ def activate_key(access_id, project_id): hmac_key.update() print("The HMAC key metadata is:") - print("Service Account Email: {}".format(hmac_key.service_account_email)) - print("Key ID: {}".format(hmac_key.id)) - print("Access ID: {}".format(hmac_key.access_id)) - print("Project ID: {}".format(hmac_key.project)) - print("State: {}".format(hmac_key.state)) - print("Created At: {}".format(hmac_key.time_created)) - print("Updated At: {}".format(hmac_key.updated)) - print("Etag: {}".format(hmac_key.etag)) + print(f"Service Account Email: {hmac_key.service_account_email}") + print(f"Key ID: {hmac_key.id}") + print(f"Access ID: {hmac_key.access_id}") + print(f"Project ID: {hmac_key.project}") + print(f"State: {hmac_key.state}") + print(f"Created At: {hmac_key.time_created}") + print(f"Updated At: {hmac_key.updated}") + print(f"Etag: {hmac_key.etag}") return hmac_key diff --git a/samples/snippets/storage_add_bucket_conditional_iam_binding.py b/samples/snippets/storage_add_bucket_conditional_iam_binding.py index ddc0fc028..d09f528cf 100644 --- a/samples/snippets/storage_add_bucket_conditional_iam_binding.py +++ b/samples/snippets/storage_add_bucket_conditional_iam_binding.py @@ -53,15 +53,15 @@ def add_bucket_conditional_iam_binding( bucket.set_iam_policy(policy) - print("Added the following member(s) with role {} to {}:".format(role, bucket_name)) + print(f"Added the following member(s) with role {role} to {bucket_name}:") for member in members: - print(" {}".format(member)) + print(f" {member}") print("with condition:") - print(" Title: {}".format(title)) - print(" Description: {}".format(description)) - print(" Expression: {}".format(expression)) + print(f" Title: {title}") + print(f" Description: {description}") + print(f" Expression: {expression}") # [END storage_add_bucket_conditional_iam_binding] diff --git a/samples/snippets/storage_add_bucket_iam_member.py b/samples/snippets/storage_add_bucket_iam_member.py index 727f18483..0d610eae7 100644 --- a/samples/snippets/storage_add_bucket_iam_member.py +++ b/samples/snippets/storage_add_bucket_iam_member.py @@ -35,7 +35,7 @@ def add_bucket_iam_member(bucket_name, role, member): bucket.set_iam_policy(policy) - print("Added {} with role {} to {}.".format(member, role, bucket_name)) + print(f"Added {member} with role {role} to {bucket_name}.") # [END storage_add_bucket_iam_member] diff --git a/samples/snippets/storage_add_bucket_label.py b/samples/snippets/storage_add_bucket_label.py index 8ae8fe1f4..9c6fcff7a 100644 --- a/samples/snippets/storage_add_bucket_label.py +++ b/samples/snippets/storage_add_bucket_label.py @@ -36,7 +36,7 @@ def add_bucket_label(bucket_name): bucket.labels = labels bucket.patch() - print("Updated labels on {}.".format(bucket.name)) + print(f"Updated labels on {bucket.name}.") pprint.pprint(bucket.labels) diff --git a/samples/snippets/storage_add_bucket_owner.py b/samples/snippets/storage_add_bucket_owner.py index acdb60dc5..bac1f3f64 100644 --- a/samples/snippets/storage_add_bucket_owner.py +++ b/samples/snippets/storage_add_bucket_owner.py @@ -40,9 +40,7 @@ def add_bucket_owner(bucket_name, user_email): bucket.acl.save() print( - "Added user {} as an owner on bucket {}.".format( - user_email, bucket_name - ) + f"Added user {user_email} as an owner on bucket {bucket_name}." ) diff --git a/samples/snippets/storage_bucket_delete_default_kms_key.py b/samples/snippets/storage_bucket_delete_default_kms_key.py index 3df23767d..0db293756 100644 --- a/samples/snippets/storage_bucket_delete_default_kms_key.py +++ b/samples/snippets/storage_bucket_delete_default_kms_key.py @@ -30,7 +30,7 @@ def bucket_delete_default_kms_key(bucket_name): bucket.default_kms_key_name = None bucket.patch() - print("Default KMS key was removed from {}".format(bucket.name)) + print(f"Default KMS key was removed from {bucket.name}") return bucket diff --git a/samples/snippets/storage_change_default_storage_class.py b/samples/snippets/storage_change_default_storage_class.py index 8a72719ba..5d2f924ad 100644 --- a/samples/snippets/storage_change_default_storage_class.py +++ b/samples/snippets/storage_change_default_storage_class.py @@ -31,7 +31,7 @@ def change_default_storage_class(bucket_name): bucket.storage_class = constants.COLDLINE_STORAGE_CLASS bucket.patch() - print("Default storage class for bucket {} has been set to {}".format(bucket_name, bucket.storage_class)) + print(f"Default storage class for bucket {bucket_name} has been set to {bucket.storage_class}") return bucket diff --git a/samples/snippets/storage_configure_retries.py b/samples/snippets/storage_configure_retries.py index 9543111b3..ef1e422b6 100644 --- a/samples/snippets/storage_configure_retries.py +++ b/samples/snippets/storage_configure_retries.py @@ -53,7 +53,7 @@ def configure_retries(bucket_name, blob_name): ) blob.delete(retry=modified_retry) - print("Blob {} deleted with a customized retry strategy.".format(blob_name)) + print(f"Blob {blob_name} deleted with a customized retry strategy.") # [END storage_configure_retries] diff --git a/samples/snippets/storage_cors_configuration.py b/samples/snippets/storage_cors_configuration.py index 3d2595a9d..2c5dd2428 100644 --- a/samples/snippets/storage_cors_configuration.py +++ b/samples/snippets/storage_cors_configuration.py @@ -38,7 +38,7 @@ def cors_configuration(bucket_name): ] bucket.patch() - print("Set CORS policies for bucket {} is {}".format(bucket.name, bucket.cors)) + print(f"Set CORS policies for bucket {bucket.name} is {bucket.cors}") return bucket diff --git a/samples/snippets/storage_create_bucket.py b/samples/snippets/storage_create_bucket.py index aaee9e234..c95f32f56 100644 --- a/samples/snippets/storage_create_bucket.py +++ b/samples/snippets/storage_create_bucket.py @@ -28,7 +28,7 @@ def create_bucket(bucket_name): bucket = storage_client.create_bucket(bucket_name) - print("Bucket {} created".format(bucket.name)) + print(f"Bucket {bucket.name} created") # [END storage_create_bucket] diff --git a/samples/snippets/storage_create_hmac_key.py b/samples/snippets/storage_create_hmac_key.py index 27a418c39..d845738b7 100644 --- a/samples/snippets/storage_create_hmac_key.py +++ b/samples/snippets/storage_create_hmac_key.py @@ -33,17 +33,17 @@ def create_key(project_id, service_account_email): service_account_email=service_account_email, project_id=project_id ) - print("The base64 encoded secret is {}".format(secret)) + print(f"The base64 encoded secret is {secret}") print("Do not miss that secret, there is no API to recover it.") print("The HMAC key metadata is:") - print("Service Account Email: {}".format(hmac_key.service_account_email)) - print("Key ID: {}".format(hmac_key.id)) - print("Access ID: {}".format(hmac_key.access_id)) - print("Project ID: {}".format(hmac_key.project)) - print("State: {}".format(hmac_key.state)) - print("Created At: {}".format(hmac_key.time_created)) - print("Updated At: {}".format(hmac_key.updated)) - print("Etag: {}".format(hmac_key.etag)) + print(f"Service Account Email: {hmac_key.service_account_email}") + print(f"Key ID: {hmac_key.id}") + print(f"Access ID: {hmac_key.access_id}") + print(f"Project ID: {hmac_key.project}") + print(f"State: {hmac_key.state}") + print(f"Created At: {hmac_key.time_created}") + print(f"Updated At: {hmac_key.updated}") + print(f"Etag: {hmac_key.etag}") return hmac_key diff --git a/samples/snippets/storage_deactivate_hmac_key.py b/samples/snippets/storage_deactivate_hmac_key.py index 389efb998..007f7b5a5 100644 --- a/samples/snippets/storage_deactivate_hmac_key.py +++ b/samples/snippets/storage_deactivate_hmac_key.py @@ -37,14 +37,14 @@ def deactivate_key(access_id, project_id): print("The HMAC key is now inactive.") print("The HMAC key metadata is:") - print("Service Account Email: {}".format(hmac_key.service_account_email)) - print("Key ID: {}".format(hmac_key.id)) - print("Access ID: {}".format(hmac_key.access_id)) - print("Project ID: {}".format(hmac_key.project)) - print("State: {}".format(hmac_key.state)) - print("Created At: {}".format(hmac_key.time_created)) - print("Updated At: {}".format(hmac_key.updated)) - print("Etag: {}".format(hmac_key.etag)) + print(f"Service Account Email: {hmac_key.service_account_email}") + print(f"Key ID: {hmac_key.id}") + print(f"Access ID: {hmac_key.access_id}") + print(f"Project ID: {hmac_key.project}") + print(f"State: {hmac_key.state}") + print(f"Created At: {hmac_key.time_created}") + print(f"Updated At: {hmac_key.updated}") + print(f"Etag: {hmac_key.etag}") return hmac_key diff --git a/samples/snippets/storage_delete_bucket.py b/samples/snippets/storage_delete_bucket.py index b3e264c74..b12c06636 100644 --- a/samples/snippets/storage_delete_bucket.py +++ b/samples/snippets/storage_delete_bucket.py @@ -29,7 +29,7 @@ def delete_bucket(bucket_name): bucket = storage_client.get_bucket(bucket_name) bucket.delete() - print("Bucket {} deleted".format(bucket.name)) + print(f"Bucket {bucket.name} deleted") # [END storage_delete_bucket] diff --git a/samples/snippets/storage_delete_file.py b/samples/snippets/storage_delete_file.py index 1105f3725..b2997c86b 100644 --- a/samples/snippets/storage_delete_file.py +++ b/samples/snippets/storage_delete_file.py @@ -31,7 +31,7 @@ def delete_blob(bucket_name, blob_name): blob = bucket.blob(blob_name) blob.delete() - print("Blob {} deleted.".format(blob_name)) + print(f"Blob {blob_name} deleted.") # [END storage_delete_file] diff --git a/samples/snippets/storage_delete_file_archived_generation.py b/samples/snippets/storage_delete_file_archived_generation.py index 4e4909001..ff02bca23 100644 --- a/samples/snippets/storage_delete_file_archived_generation.py +++ b/samples/snippets/storage_delete_file_archived_generation.py @@ -31,9 +31,7 @@ def delete_file_archived_generation(bucket_name, blob_name, generation): bucket = storage_client.get_bucket(bucket_name) bucket.delete_blob(blob_name, generation=generation) print( - "Generation {} of blob {} was deleted from {}".format( - generation, blob_name, bucket_name - ) + f"Generation {generation} of blob {blob_name} was deleted from {bucket_name}" ) diff --git a/samples/snippets/storage_disable_bucket_lifecycle_management.py b/samples/snippets/storage_disable_bucket_lifecycle_management.py index 9ef6971fb..a5fa56fcf 100644 --- a/samples/snippets/storage_disable_bucket_lifecycle_management.py +++ b/samples/snippets/storage_disable_bucket_lifecycle_management.py @@ -31,7 +31,7 @@ def disable_bucket_lifecycle_management(bucket_name): bucket.patch() rules = bucket.lifecycle_rules - print("Lifecycle management is disable for bucket {} and the rules are {}".format(bucket_name, list(rules))) + print(f"Lifecycle management is disable for bucket {bucket_name} and the rules are {list(rules)}") return bucket diff --git a/samples/snippets/storage_disable_default_event_based_hold.py b/samples/snippets/storage_disable_default_event_based_hold.py index dff3ed3c1..48becdac1 100644 --- a/samples/snippets/storage_disable_default_event_based_hold.py +++ b/samples/snippets/storage_disable_default_event_based_hold.py @@ -30,7 +30,7 @@ def disable_default_event_based_hold(bucket_name): bucket.default_event_based_hold = False bucket.patch() - print("Default event based hold was disabled for {}".format(bucket_name)) + print(f"Default event based hold was disabled for {bucket_name}") # [END storage_disable_default_event_based_hold] diff --git a/samples/snippets/storage_disable_requester_pays.py b/samples/snippets/storage_disable_requester_pays.py index c49cc28ea..78e195d8a 100644 --- a/samples/snippets/storage_disable_requester_pays.py +++ b/samples/snippets/storage_disable_requester_pays.py @@ -30,7 +30,7 @@ def disable_requester_pays(bucket_name): bucket.requester_pays = False bucket.patch() - print("Requester Pays has been disabled for {}".format(bucket_name)) + print(f"Requester Pays has been disabled for {bucket_name}") # [END storage_disable_requester_pays] diff --git a/samples/snippets/storage_disable_uniform_bucket_level_access.py b/samples/snippets/storage_disable_uniform_bucket_level_access.py index 4f4691611..20a045686 100644 --- a/samples/snippets/storage_disable_uniform_bucket_level_access.py +++ b/samples/snippets/storage_disable_uniform_bucket_level_access.py @@ -31,7 +31,7 @@ def disable_uniform_bucket_level_access(bucket_name): bucket.patch() print( - "Uniform bucket-level access was disabled for {}.".format(bucket.name) + f"Uniform bucket-level access was disabled for {bucket.name}." ) diff --git a/samples/snippets/storage_disable_versioning.py b/samples/snippets/storage_disable_versioning.py index 98832ba68..9dfd0ff90 100644 --- a/samples/snippets/storage_disable_versioning.py +++ b/samples/snippets/storage_disable_versioning.py @@ -30,7 +30,7 @@ def disable_versioning(bucket_name): bucket.versioning_enabled = False bucket.patch() - print("Versioning was disabled for bucket {}".format(bucket)) + print(f"Versioning was disabled for bucket {bucket}") return bucket diff --git a/samples/snippets/storage_download_encrypted_file.py b/samples/snippets/storage_download_encrypted_file.py index ac7071fbe..8a81b0de5 100644 --- a/samples/snippets/storage_download_encrypted_file.py +++ b/samples/snippets/storage_download_encrypted_file.py @@ -52,9 +52,7 @@ def download_encrypted_blob( blob.download_to_filename(destination_file_name) print( - "Blob {} downloaded to {}.".format( - source_blob_name, destination_file_name - ) + f"Blob {source_blob_name} downloaded to {destination_file_name}." ) diff --git a/samples/snippets/storage_download_to_stream.py b/samples/snippets/storage_download_to_stream.py index 1cb8dcc7b..3834e34c9 100644 --- a/samples/snippets/storage_download_to_stream.py +++ b/samples/snippets/storage_download_to_stream.py @@ -42,7 +42,7 @@ def download_blob_to_stream(bucket_name, source_blob_name, file_obj): blob = bucket.blob(source_blob_name) blob.download_to_file(file_obj) - print("Downloaded blob {} to file-like object.".format(source_blob_name)) + print(f"Downloaded blob {source_blob_name} to file-like object.") return file_obj # Before reading from file_obj, remember to rewind with file_obj.seek(0). diff --git a/samples/snippets/storage_enable_bucket_lifecycle_management.py b/samples/snippets/storage_enable_bucket_lifecycle_management.py index 61c7d7b20..0bbff079c 100644 --- a/samples/snippets/storage_enable_bucket_lifecycle_management.py +++ b/samples/snippets/storage_enable_bucket_lifecycle_management.py @@ -29,12 +29,12 @@ def enable_bucket_lifecycle_management(bucket_name): bucket = storage_client.get_bucket(bucket_name) rules = bucket.lifecycle_rules - print("Lifecycle management rules for bucket {} are {}".format(bucket_name, list(rules))) + print(f"Lifecycle management rules for bucket {bucket_name} are {list(rules)}") bucket.add_lifecycle_delete_rule(age=2) bucket.patch() rules = bucket.lifecycle_rules - print("Lifecycle management is enable for bucket {} and the rules are {}".format(bucket_name, list(rules))) + print(f"Lifecycle management is enable for bucket {bucket_name} and the rules are {list(rules)}") return bucket diff --git a/samples/snippets/storage_enable_default_event_based_hold.py b/samples/snippets/storage_enable_default_event_based_hold.py index a535390c9..5dfdf94a9 100644 --- a/samples/snippets/storage_enable_default_event_based_hold.py +++ b/samples/snippets/storage_enable_default_event_based_hold.py @@ -30,7 +30,7 @@ def enable_default_event_based_hold(bucket_name): bucket.default_event_based_hold = True bucket.patch() - print("Default event based hold was enabled for {}".format(bucket_name)) + print(f"Default event based hold was enabled for {bucket_name}") # [END storage_enable_default_event_based_hold] diff --git a/samples/snippets/storage_enable_requester_pays.py b/samples/snippets/storage_enable_requester_pays.py index 9787008dd..fbecb04f4 100644 --- a/samples/snippets/storage_enable_requester_pays.py +++ b/samples/snippets/storage_enable_requester_pays.py @@ -30,7 +30,7 @@ def enable_requester_pays(bucket_name): bucket.requester_pays = True bucket.patch() - print("Requester Pays has been enabled for {}".format(bucket_name)) + print(f"Requester Pays has been enabled for {bucket_name}") # [END storage_enable_requester_pays] diff --git a/samples/snippets/storage_enable_uniform_bucket_level_access.py b/samples/snippets/storage_enable_uniform_bucket_level_access.py index c689bb735..9ab71ae37 100644 --- a/samples/snippets/storage_enable_uniform_bucket_level_access.py +++ b/samples/snippets/storage_enable_uniform_bucket_level_access.py @@ -31,7 +31,7 @@ def enable_uniform_bucket_level_access(bucket_name): bucket.patch() print( - "Uniform bucket-level access was enabled for {}.".format(bucket.name) + f"Uniform bucket-level access was enabled for {bucket.name}." ) diff --git a/samples/snippets/storage_enable_versioning.py b/samples/snippets/storage_enable_versioning.py index 89693e426..9cdc98001 100644 --- a/samples/snippets/storage_enable_versioning.py +++ b/samples/snippets/storage_enable_versioning.py @@ -30,7 +30,7 @@ def enable_versioning(bucket_name): bucket.versioning_enabled = True bucket.patch() - print("Versioning was enabled for bucket {}".format(bucket.name)) + print(f"Versioning was enabled for bucket {bucket.name}") return bucket diff --git a/samples/snippets/storage_generate_encryption_key.py b/samples/snippets/storage_generate_encryption_key.py index a973418a6..dbeb46b91 100644 --- a/samples/snippets/storage_generate_encryption_key.py +++ b/samples/snippets/storage_generate_encryption_key.py @@ -30,7 +30,7 @@ def generate_encryption_key(): key = os.urandom(32) encoded_key = base64.b64encode(key).decode("utf-8") - print("Base 64 encoded encryption key: {}".format(encoded_key)) + print(f"Base 64 encoded encryption key: {encoded_key}") # [END storage_generate_encryption_key] diff --git a/samples/snippets/storage_generate_signed_post_policy_v4.py b/samples/snippets/storage_generate_signed_post_policy_v4.py index 8217714e2..0c06ddc2f 100644 --- a/samples/snippets/storage_generate_signed_post_policy_v4.py +++ b/samples/snippets/storage_generate_signed_post_policy_v4.py @@ -46,7 +46,7 @@ def generate_signed_post_policy_v4(bucket_name, blob_name): # Include all fields returned in the HTML form as they're required for key, value in policy["fields"].items(): - form += " \n".format(key, value) + form += f" \n" form += "
\n" form += "
\n" diff --git a/samples/snippets/storage_generate_signed_url_v2.py b/samples/snippets/storage_generate_signed_url_v2.py index abea3dd54..f1317ea2f 100644 --- a/samples/snippets/storage_generate_signed_url_v2.py +++ b/samples/snippets/storage_generate_signed_url_v2.py @@ -44,7 +44,7 @@ def generate_signed_url(bucket_name, blob_name): method="GET", ) - print("The signed url for {} is {}".format(blob.name, url)) + print(f"The signed url for {blob.name} is {url}") return url diff --git a/samples/snippets/storage_generate_signed_url_v4.py b/samples/snippets/storage_generate_signed_url_v4.py index 2a45b23e9..80625a7b3 100644 --- a/samples/snippets/storage_generate_signed_url_v4.py +++ b/samples/snippets/storage_generate_signed_url_v4.py @@ -49,7 +49,7 @@ def generate_download_signed_url_v4(bucket_name, blob_name): print("Generated GET signed URL:") print(url) print("You can use this URL with any user agent, for example:") - print("curl '{}'".format(url)) + print(f"curl '{url}'") return url diff --git a/samples/snippets/storage_get_default_event_based_hold.py b/samples/snippets/storage_get_default_event_based_hold.py index 4cf13914d..08a05f8ef 100644 --- a/samples/snippets/storage_get_default_event_based_hold.py +++ b/samples/snippets/storage_get_default_event_based_hold.py @@ -29,12 +29,10 @@ def get_default_event_based_hold(bucket_name): bucket = storage_client.get_bucket(bucket_name) if bucket.default_event_based_hold: - print("Default event-based hold is enabled for {}".format(bucket_name)) + print(f"Default event-based hold is enabled for {bucket_name}") else: print( - "Default event-based hold is not enabled for {}".format( - bucket_name - ) + f"Default event-based hold is not enabled for {bucket_name}" ) diff --git a/samples/snippets/storage_get_hmac_key.py b/samples/snippets/storage_get_hmac_key.py index 4dc52240d..82b28ff99 100644 --- a/samples/snippets/storage_get_hmac_key.py +++ b/samples/snippets/storage_get_hmac_key.py @@ -34,14 +34,14 @@ def get_key(access_id, project_id): ) print("The HMAC key metadata is:") - print("Service Account Email: {}".format(hmac_key.service_account_email)) - print("Key ID: {}".format(hmac_key.id)) - print("Access ID: {}".format(hmac_key.access_id)) - print("Project ID: {}".format(hmac_key.project)) - print("State: {}".format(hmac_key.state)) - print("Created At: {}".format(hmac_key.time_created)) - print("Updated At: {}".format(hmac_key.updated)) - print("Etag: {}".format(hmac_key.etag)) + print(f"Service Account Email: {hmac_key.service_account_email}") + print(f"Key ID: {hmac_key.id}") + print(f"Access ID: {hmac_key.access_id}") + print(f"Project ID: {hmac_key.project}") + print(f"State: {hmac_key.state}") + print(f"Created At: {hmac_key.time_created}") + print(f"Updated At: {hmac_key.updated}") + print(f"Etag: {hmac_key.etag}") return hmac_key diff --git a/samples/snippets/storage_get_metadata.py b/samples/snippets/storage_get_metadata.py index 3ce7ecea8..eece8028a 100644 --- a/samples/snippets/storage_get_metadata.py +++ b/samples/snippets/storage_get_metadata.py @@ -33,27 +33,27 @@ def blob_metadata(bucket_name, blob_name): # make an HTTP request. blob = bucket.get_blob(blob_name) - print("Blob: {}".format(blob.name)) - print("Bucket: {}".format(blob.bucket.name)) - print("Storage class: {}".format(blob.storage_class)) - print("ID: {}".format(blob.id)) - print("Size: {} bytes".format(blob.size)) - print("Updated: {}".format(blob.updated)) - print("Generation: {}".format(blob.generation)) - print("Metageneration: {}".format(blob.metageneration)) - print("Etag: {}".format(blob.etag)) - print("Owner: {}".format(blob.owner)) - print("Component count: {}".format(blob.component_count)) - print("Crc32c: {}".format(blob.crc32c)) - print("md5_hash: {}".format(blob.md5_hash)) - print("Cache-control: {}".format(blob.cache_control)) - print("Content-type: {}".format(blob.content_type)) - print("Content-disposition: {}".format(blob.content_disposition)) - print("Content-encoding: {}".format(blob.content_encoding)) - print("Content-language: {}".format(blob.content_language)) - print("Metadata: {}".format(blob.metadata)) - print("Medialink: {}".format(blob.media_link)) - print("Custom Time: {}".format(blob.custom_time)) + print(f"Blob: {blob.name}") + print(f"Bucket: {blob.bucket.name}") + print(f"Storage class: {blob.storage_class}") + print(f"ID: {blob.id}") + print(f"Size: {blob.size} bytes") + print(f"Updated: {blob.updated}") + print(f"Generation: {blob.generation}") + print(f"Metageneration: {blob.metageneration}") + print(f"Etag: {blob.etag}") + print(f"Owner: {blob.owner}") + print(f"Component count: {blob.component_count}") + print(f"Crc32c: {blob.crc32c}") + print(f"md5_hash: {blob.md5_hash}") + print(f"Cache-control: {blob.cache_control}") + print(f"Content-type: {blob.content_type}") + print(f"Content-disposition: {blob.content_disposition}") + print(f"Content-encoding: {blob.content_encoding}") + print(f"Content-language: {blob.content_language}") + print(f"Metadata: {blob.metadata}") + print(f"Medialink: {blob.media_link}") + print(f"Custom Time: {blob.custom_time}") print("Temporary hold: ", "enabled" if blob.temporary_hold else "disabled") print( "Event based hold: ", @@ -61,9 +61,7 @@ def blob_metadata(bucket_name, blob_name): ) if blob.retention_expiration_time: print( - "retentionExpirationTime: {}".format( - blob.retention_expiration_time - ) + f"retentionExpirationTime: {blob.retention_expiration_time}" ) diff --git a/samples/snippets/storage_get_requester_pays_status.py b/samples/snippets/storage_get_requester_pays_status.py index 2014d654c..a2eeb34d7 100644 --- a/samples/snippets/storage_get_requester_pays_status.py +++ b/samples/snippets/storage_get_requester_pays_status.py @@ -29,9 +29,9 @@ def get_requester_pays_status(bucket_name): requester_pays_status = bucket.requester_pays if requester_pays_status: - print("Requester Pays is enabled for {}".format(bucket_name)) + print(f"Requester Pays is enabled for {bucket_name}") else: - print("Requester Pays is disabled for {}".format(bucket_name)) + print(f"Requester Pays is disabled for {bucket_name}") # [END storage_get_requester_pays_status] diff --git a/samples/snippets/storage_get_retention_policy.py b/samples/snippets/storage_get_retention_policy.py index f2ca26d26..215f80d5a 100644 --- a/samples/snippets/storage_get_retention_policy.py +++ b/samples/snippets/storage_get_retention_policy.py @@ -28,14 +28,14 @@ def get_retention_policy(bucket_name): bucket = storage_client.bucket(bucket_name) bucket.reload() - print("Retention Policy for {}".format(bucket_name)) - print("Retention Period: {}".format(bucket.retention_period)) + print(f"Retention Policy for {bucket_name}") + print(f"Retention Period: {bucket.retention_period}") if bucket.retention_policy_locked: print("Retention Policy is locked") if bucket.retention_policy_effective_time: print( - "Effective Time: {}".format(bucket.retention_policy_effective_time) + f"Effective Time: {bucket.retention_policy_effective_time}" ) diff --git a/samples/snippets/storage_get_service_account.py b/samples/snippets/storage_get_service_account.py index 58ababb91..5ac0e5638 100644 --- a/samples/snippets/storage_get_service_account.py +++ b/samples/snippets/storage_get_service_account.py @@ -25,9 +25,7 @@ def get_service_account(): email = storage_client.get_service_account_email() print( - "The GCS service account for project {} is: {} ".format( - storage_client.project, email - ) + f"The GCS service account for project {storage_client.project} is: {email} " ) diff --git a/samples/snippets/storage_get_uniform_bucket_level_access.py b/samples/snippets/storage_get_uniform_bucket_level_access.py index eddb8bc1a..206b9f1ff 100644 --- a/samples/snippets/storage_get_uniform_bucket_level_access.py +++ b/samples/snippets/storage_get_uniform_bucket_level_access.py @@ -30,9 +30,7 @@ def get_uniform_bucket_level_access(bucket_name): if iam_configuration.uniform_bucket_level_access_enabled: print( - "Uniform bucket-level access is enabled for {}.".format( - bucket.name - ) + f"Uniform bucket-level access is enabled for {bucket.name}." ) print( "Bucket will be locked on {}.".format( @@ -41,9 +39,7 @@ def get_uniform_bucket_level_access(bucket_name): ) else: print( - "Uniform bucket-level access is disabled for {}.".format( - bucket.name - ) + f"Uniform bucket-level access is disabled for {bucket.name}." ) diff --git a/samples/snippets/storage_list_file_archived_generations.py b/samples/snippets/storage_list_file_archived_generations.py index dc2f5eaf5..419cc3da4 100644 --- a/samples/snippets/storage_list_file_archived_generations.py +++ b/samples/snippets/storage_list_file_archived_generations.py @@ -29,7 +29,7 @@ def list_file_archived_generations(bucket_name): blobs = storage_client.list_blobs(bucket_name, versions=True) for blob in blobs: - print("{},{}".format(blob.name, blob.generation)) + print(f"{blob.name},{blob.generation}") # [END storage_list_file_archived_generations] diff --git a/samples/snippets/storage_list_hmac_keys.py b/samples/snippets/storage_list_hmac_keys.py index 8e5c53b58..a09616fa5 100644 --- a/samples/snippets/storage_list_hmac_keys.py +++ b/samples/snippets/storage_list_hmac_keys.py @@ -31,9 +31,9 @@ def list_keys(project_id): print("HMAC Keys:") for hmac_key in hmac_keys: print( - "Service Account Email: {}".format(hmac_key.service_account_email) + f"Service Account Email: {hmac_key.service_account_email}" ) - print("Access ID: {}".format(hmac_key.access_id)) + print(f"Access ID: {hmac_key.access_id}") return hmac_keys diff --git a/samples/snippets/storage_lock_retention_policy.py b/samples/snippets/storage_lock_retention_policy.py index d59572f5d..adff364d7 100644 --- a/samples/snippets/storage_lock_retention_policy.py +++ b/samples/snippets/storage_lock_retention_policy.py @@ -33,11 +33,9 @@ def lock_retention_policy(bucket_name): # and retention period can only be increased. bucket.lock_retention_policy() - print("Retention policy for {} is now locked".format(bucket_name)) + print(f"Retention policy for {bucket_name} is now locked") print( - "Retention policy effective as of {}".format( - bucket.retention_policy_effective_time - ) + f"Retention policy effective as of {bucket.retention_policy_effective_time}" ) diff --git a/samples/snippets/storage_make_public.py b/samples/snippets/storage_make_public.py index 79ae40d12..489508cf6 100644 --- a/samples/snippets/storage_make_public.py +++ b/samples/snippets/storage_make_public.py @@ -32,9 +32,7 @@ def make_blob_public(bucket_name, blob_name): blob.make_public() print( - "Blob {} is publicly accessible at {}".format( - blob.name, blob.public_url - ) + f"Blob {blob.name} is publicly accessible at {blob.public_url}" ) diff --git a/samples/snippets/storage_object_get_kms_key.py b/samples/snippets/storage_object_get_kms_key.py index dddfc9151..7604e6eba 100644 --- a/samples/snippets/storage_object_get_kms_key.py +++ b/samples/snippets/storage_object_get_kms_key.py @@ -32,7 +32,7 @@ def object_get_kms_key(bucket_name, blob_name): kms_key = blob.kms_key_name - print("The KMS key of a blob is {}".format(blob.kms_key_name)) + print(f"The KMS key of a blob is {blob.kms_key_name}") return kms_key diff --git a/samples/snippets/storage_print_bucket_acl.py b/samples/snippets/storage_print_bucket_acl.py index 0804f7a9a..55417f1bc 100644 --- a/samples/snippets/storage_print_bucket_acl.py +++ b/samples/snippets/storage_print_bucket_acl.py @@ -27,7 +27,7 @@ def print_bucket_acl(bucket_name): bucket = storage_client.bucket(bucket_name) for entry in bucket.acl: - print("{}: {}".format(entry["role"], entry["entity"])) + print(f"{entry['role']}: {entry['entity']}") # [END storage_print_bucket_acl] diff --git a/samples/snippets/storage_print_file_acl.py b/samples/snippets/storage_print_file_acl.py index f34a5283b..8dfc4e984 100644 --- a/samples/snippets/storage_print_file_acl.py +++ b/samples/snippets/storage_print_file_acl.py @@ -28,7 +28,7 @@ def print_blob_acl(bucket_name, blob_name): blob = bucket.blob(blob_name) for entry in blob.acl: - print("{}: {}".format(entry["role"], entry["entity"])) + print(f"{entry['role']}: {entry['entity']}") # [END storage_print_file_acl] diff --git a/samples/snippets/storage_release_event_based_hold.py b/samples/snippets/storage_release_event_based_hold.py index 8c3c11b6f..1db637cd9 100644 --- a/samples/snippets/storage_release_event_based_hold.py +++ b/samples/snippets/storage_release_event_based_hold.py @@ -33,7 +33,7 @@ def release_event_based_hold(bucket_name, blob_name): blob.event_based_hold = False blob.patch() - print("Event based hold was released for {}".format(blob_name)) + print(f"Event based hold was released for {blob_name}") # [END storage_release_event_based_hold] diff --git a/samples/snippets/storage_remove_bucket_default_owner.py b/samples/snippets/storage_remove_bucket_default_owner.py index beaf6be84..e6f3c495e 100644 --- a/samples/snippets/storage_remove_bucket_default_owner.py +++ b/samples/snippets/storage_remove_bucket_default_owner.py @@ -40,9 +40,7 @@ def remove_bucket_default_owner(bucket_name, user_email): bucket.default_object_acl.save() print( - "Removed user {} from the default acl of bucket {}.".format( - user_email, bucket_name - ) + f"Removed user {user_email} from the default acl of bucket {bucket_name}." ) diff --git a/samples/snippets/storage_remove_bucket_iam_member.py b/samples/snippets/storage_remove_bucket_iam_member.py index ef75a1a15..2efc29e30 100644 --- a/samples/snippets/storage_remove_bucket_iam_member.py +++ b/samples/snippets/storage_remove_bucket_iam_member.py @@ -38,7 +38,7 @@ def remove_bucket_iam_member(bucket_name, role, member): bucket.set_iam_policy(policy) - print("Removed {} with role {} from {}.".format(member, role, bucket_name)) + print(f"Removed {member} with role {role} from {bucket_name}.") # [END storage_remove_bucket_iam_member] diff --git a/samples/snippets/storage_remove_bucket_label.py b/samples/snippets/storage_remove_bucket_label.py index 58bbfef2d..fc4a5b4e7 100644 --- a/samples/snippets/storage_remove_bucket_label.py +++ b/samples/snippets/storage_remove_bucket_label.py @@ -39,7 +39,7 @@ def remove_bucket_label(bucket_name): bucket.labels = labels bucket.patch() - print("Removed labels on {}.".format(bucket.name)) + print(f"Removed labels on {bucket.name}.") pprint.pprint(bucket.labels) diff --git a/samples/snippets/storage_remove_bucket_owner.py b/samples/snippets/storage_remove_bucket_owner.py index f54e7a7cc..561ba9175 100644 --- a/samples/snippets/storage_remove_bucket_owner.py +++ b/samples/snippets/storage_remove_bucket_owner.py @@ -38,7 +38,7 @@ def remove_bucket_owner(bucket_name, user_email): bucket.acl.user(user_email).revoke_owner() bucket.acl.save() - print("Removed user {} from bucket {}.".format(user_email, bucket_name)) + print(f"Removed user {user_email} from bucket {bucket_name}.") # [END storage_remove_bucket_owner] diff --git a/samples/snippets/storage_remove_cors_configuration.py b/samples/snippets/storage_remove_cors_configuration.py index 48ee74338..ad97371f4 100644 --- a/samples/snippets/storage_remove_cors_configuration.py +++ b/samples/snippets/storage_remove_cors_configuration.py @@ -29,7 +29,7 @@ def remove_cors_configuration(bucket_name): bucket.cors = [] bucket.patch() - print("Remove CORS policies for bucket {}.".format(bucket.name)) + print(f"Remove CORS policies for bucket {bucket.name}.") return bucket diff --git a/samples/snippets/storage_remove_file_owner.py b/samples/snippets/storage_remove_file_owner.py index 9db83cce0..315a747ad 100644 --- a/samples/snippets/storage_remove_file_owner.py +++ b/samples/snippets/storage_remove_file_owner.py @@ -39,9 +39,7 @@ def remove_blob_owner(bucket_name, blob_name, user_email): blob.acl.save() print( - "Removed user {} from blob {} in bucket {}.".format( - user_email, blob_name, bucket_name - ) + f"Removed user {user_email} from blob {blob_name} in bucket {bucket_name}." ) diff --git a/samples/snippets/storage_remove_retention_policy.py b/samples/snippets/storage_remove_retention_policy.py index cb8ee548c..9ede8053a 100644 --- a/samples/snippets/storage_remove_retention_policy.py +++ b/samples/snippets/storage_remove_retention_policy.py @@ -37,7 +37,7 @@ def remove_retention_policy(bucket_name): bucket.retention_period = None bucket.patch() - print("Removed bucket {} retention policy".format(bucket.name)) + print(f"Removed bucket {bucket.name} retention policy") # [END storage_remove_retention_policy] diff --git a/samples/snippets/storage_rename_file.py b/samples/snippets/storage_rename_file.py index b47e18621..1125007c6 100644 --- a/samples/snippets/storage_rename_file.py +++ b/samples/snippets/storage_rename_file.py @@ -35,7 +35,7 @@ def rename_blob(bucket_name, blob_name, new_name): new_blob = bucket.rename_blob(blob, new_name) - print("Blob {} has been renamed to {}".format(blob.name, new_blob.name)) + print(f"Blob {blob.name} has been renamed to {new_blob.name}") # [END storage_rename_file] diff --git a/samples/snippets/storage_rotate_encryption_key.py b/samples/snippets/storage_rotate_encryption_key.py index 663ee4796..828b7d5ef 100644 --- a/samples/snippets/storage_rotate_encryption_key.py +++ b/samples/snippets/storage_rotate_encryption_key.py @@ -52,7 +52,7 @@ def rotate_encryption_key( if token is None: break - print("Key rotation complete for Blob {}".format(blob_name)) + print(f"Key rotation complete for Blob {blob_name}") # [END storage_rotate_encryption_key] diff --git a/samples/snippets/storage_set_bucket_public_iam.py b/samples/snippets/storage_set_bucket_public_iam.py index 4b7df89df..0fb33f59c 100644 --- a/samples/snippets/storage_set_bucket_public_iam.py +++ b/samples/snippets/storage_set_bucket_public_iam.py @@ -39,7 +39,7 @@ def set_bucket_public_iam( bucket.set_iam_policy(policy) - print("Bucket {} is now publicly readable".format(bucket.name)) + print(f"Bucket {bucket.name} is now publicly readable") # [END storage_set_bucket_public_iam] diff --git a/samples/snippets/storage_set_event_based_hold.py b/samples/snippets/storage_set_event_based_hold.py index 52a89b88e..e04ed7552 100644 --- a/samples/snippets/storage_set_event_based_hold.py +++ b/samples/snippets/storage_set_event_based_hold.py @@ -32,7 +32,7 @@ def set_event_based_hold(bucket_name, blob_name): blob.event_based_hold = True blob.patch() - print("Event based hold was set for {}".format(blob_name)) + print(f"Event based hold was set for {blob_name}") # [END storage_set_event_based_hold] diff --git a/samples/snippets/storage_set_metadata.py b/samples/snippets/storage_set_metadata.py index 07529ac68..90b6838c0 100644 --- a/samples/snippets/storage_set_metadata.py +++ b/samples/snippets/storage_set_metadata.py @@ -32,7 +32,7 @@ def set_blob_metadata(bucket_name, blob_name): blob.metadata = metadata blob.patch() - print("The metadata for the blob {} is {}".format(blob.name, blob.metadata)) + print(f"The metadata for the blob {blob.name} is {blob.metadata}") # [END storage_set_metadata] diff --git a/samples/snippets/storage_upload_encrypted_file.py b/samples/snippets/storage_upload_encrypted_file.py index e7d02c67b..5f4987238 100644 --- a/samples/snippets/storage_upload_encrypted_file.py +++ b/samples/snippets/storage_upload_encrypted_file.py @@ -51,9 +51,7 @@ def upload_encrypted_blob( blob.upload_from_filename(source_file_name) print( - "File {} uploaded to {}.".format( - source_file_name, destination_blob_name - ) + f"File {source_file_name} uploaded to {destination_blob_name}." ) diff --git a/samples/snippets/storage_upload_file.py b/samples/snippets/storage_upload_file.py index fb02c3632..8e7d98630 100644 --- a/samples/snippets/storage_upload_file.py +++ b/samples/snippets/storage_upload_file.py @@ -36,9 +36,7 @@ def upload_blob(bucket_name, source_file_name, destination_blob_name): blob.upload_from_filename(source_file_name) print( - "File {} uploaded to {}.".format( - source_file_name, destination_blob_name - ) + f"File {source_file_name} uploaded to {destination_blob_name}." ) diff --git a/samples/snippets/storage_upload_from_memory.py b/samples/snippets/storage_upload_from_memory.py index ee8a9828c..eff3d222a 100644 --- a/samples/snippets/storage_upload_from_memory.py +++ b/samples/snippets/storage_upload_from_memory.py @@ -39,9 +39,7 @@ def upload_blob_from_memory(bucket_name, contents, destination_blob_name): blob.upload_from_string(contents) print( - "{} with contents {} uploaded to {}.".format( - destination_blob_name, contents, bucket_name - ) + f"{destination_blob_name} with contents {contents} uploaded to {bucket_name}." ) # [END storage_file_upload_from_memory] diff --git a/samples/snippets/storage_upload_from_stream.py b/samples/snippets/storage_upload_from_stream.py index d43365e08..e2d31a5e3 100644 --- a/samples/snippets/storage_upload_from_stream.py +++ b/samples/snippets/storage_upload_from_stream.py @@ -44,9 +44,7 @@ def upload_blob_from_stream(bucket_name, file_obj, destination_blob_name): blob.upload_from_file(file_obj) print( - "Stream data uploaded to {} in bucket {}.".format( - destination_blob_name, bucket_name - ) + f"Stream data uploaded to {destination_blob_name} in bucket {bucket_name}." ) # [END storage_stream_file_upload] diff --git a/samples/snippets/storage_view_bucket_iam_members.py b/samples/snippets/storage_view_bucket_iam_members.py index 5272f0ddb..184a1361f 100644 --- a/samples/snippets/storage_view_bucket_iam_members.py +++ b/samples/snippets/storage_view_bucket_iam_members.py @@ -30,7 +30,7 @@ def view_bucket_iam_members(bucket_name): policy = bucket.get_iam_policy(requested_policy_version=3) for binding in policy.bindings: - print("Role: {}, Members: {}".format(binding["role"], binding["members"])) + print(f"Role: {binding['role']}, Members: {binding['members']}") # [END storage_view_bucket_iam_members] diff --git a/samples/snippets/uniform_bucket_level_access_test.py b/samples/snippets/uniform_bucket_level_access_test.py index b43fa016f..8b7964038 100644 --- a/samples/snippets/uniform_bucket_level_access_test.py +++ b/samples/snippets/uniform_bucket_level_access_test.py @@ -23,7 +23,7 @@ def test_get_uniform_bucket_level_access(bucket, capsys): ) out, _ = capsys.readouterr() assert ( - "Uniform bucket-level access is disabled for {}.".format(bucket.name) + f"Uniform bucket-level access is disabled for {bucket.name}." in out ) @@ -35,7 +35,7 @@ def test_enable_uniform_bucket_level_access(bucket, capsys): ) out, _ = capsys.readouterr() assert ( - "Uniform bucket-level access was enabled for {}.".format(bucket.name) + f"Uniform bucket-level access was enabled for {bucket.name}." in out ) @@ -47,6 +47,6 @@ def test_disable_uniform_bucket_level_access(bucket, capsys): ) out, _ = capsys.readouterr() assert ( - "Uniform bucket-level access was disabled for {}.".format(bucket.name) + f"Uniform bucket-level access was disabled for {bucket.name}." in out ) diff --git a/tests/conformance/test_conformance.py b/tests/conformance/test_conformance.py index f84131f2f..4d16fc36f 100644 --- a/tests/conformance/test_conformance.py +++ b/tests/conformance/test_conformance.py @@ -42,9 +42,9 @@ """The storage testbench docker image info and commands.""" _DEFAULT_IMAGE_NAME = "gcr.io/cloud-devrel-public-resources/storage-testbench" _DEFAULT_IMAGE_TAG = "latest" -_DOCKER_IMAGE = "{}:{}".format(_DEFAULT_IMAGE_NAME, _DEFAULT_IMAGE_TAG) +_DOCKER_IMAGE = f"{_DEFAULT_IMAGE_NAME}:{_DEFAULT_IMAGE_TAG}" _PULL_CMD = ["docker", "pull", _DOCKER_IMAGE] -_RUN_CMD = ["docker", "run", "--rm", "-d", "-p", "{}:9000".format(_PORT), _DOCKER_IMAGE] +_RUN_CMD = ["docker", "run", "--rm", "-d", "-p", f"{_PORT}:9000", _DOCKER_IMAGE] _CONF_TEST_PROJECT_ID = "my-project-id" _CONF_TEST_SERVICE_ACCOUNT_EMAIL = ( @@ -846,9 +846,7 @@ def _get_retry_test(host, id): instructions, and a boolean status "completed". This can be used to verify if all instructions were used as expected. """ - get_retry_test_uri = "{base}{retry}/{id}".format( - base=host, retry="/retry_test", id=id - ) + get_retry_test_uri = f"{host}/retry_test/{id}" r = requests.get(get_retry_test_uri) return r.json() @@ -892,9 +890,7 @@ def _delete_retry_test(host, id): """ Delete the Retry Test resource by id. """ - get_retry_test_uri = "{base}{retry}/{id}".format( - base=host, retry="/retry_test", id=id - ) + get_retry_test_uri = f"{host}/retry_test/{id}" requests.delete(get_retry_test_uri) @@ -926,7 +922,7 @@ def run_test_case( id = r["id"] except Exception as e: raise Exception( - "Error creating retry test for {}: {}".format(method_name, e) + f"Error creating retry test for {method_name}: {e}" ).with_traceback(e.__traceback__) # Run retry tests on library methods. @@ -943,9 +939,7 @@ def run_test_case( file_data, ) except Exception as e: - logging.exception( - "Caught an exception while running retry instructions\n {}".format(e) - ) + logging.exception(f"Caught an exception while running retry instructions\n {e}") success_results = False else: success_results = True @@ -990,13 +984,11 @@ def run_test_case( method_name = m["name"] method_group = m["group"] if m.get("group", None) else m["name"] if method_group not in method_mapping: - logging.info("No tests for operation {}".format(method_name)) + logging.info(f"No tests for operation {method_name}") continue for lib_func in method_mapping[method_group]: - test_name = "test-S{}-{}-{}-{}".format( - id, method_name, lib_func.__name__, i - ) + test_name = f"test-S{id}-{method_name}-{lib_func.__name__}-{i}" globals()[test_name] = functools.partial( run_test_case, id, m, c, lib_func, _HOST ) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index de1a04aa9..d8796f5b3 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -153,7 +153,7 @@ def test_bucket_get_set_iam_policy( policy = bucket.get_iam_policy(requested_policy_version=3) assert policy == policy_no_version - member = "serviceAccount:{}".format(storage_client.get_service_account_email()) + member = f"serviceAccount:{storage_client.get_service_account_email()}" binding_w_condition = { "role": STORAGE_OBJECT_VIEWER_ROLE, diff --git a/tests/system/test_notification.py b/tests/system/test_notification.py index 59d0dfafd..f52ae3219 100644 --- a/tests/system/test_notification.py +++ b/tests/system/test_notification.py @@ -54,7 +54,7 @@ def topic_name(): @pytest.fixture(scope="session") def topic_path(storage_client, topic_name): - return "projects/{}/topics/{}".format(storage_client.project, topic_name) + return f"projects/{storage_client.project}/topics/{topic_name}" @pytest.fixture(scope="session") @@ -64,7 +64,7 @@ def notification_topic(storage_client, publisher_client, topic_path, no_mtls): binding = policy.bindings.add() binding.role = "roles/pubsub.publisher" binding.members.append( - "serviceAccount:{}".format(storage_client.get_service_account_email()) + f"serviceAccount:{storage_client.get_service_account_email()}" ) publisher_client.set_iam_policy(topic_path, policy) diff --git a/tests/unit/test__http.py b/tests/unit/test__http.py index 890fd1352..9e7bf216b 100644 --- a/tests/unit/test__http.py +++ b/tests/unit/test__http.py @@ -77,7 +77,7 @@ def test_build_api_url_no_extra_query_params(self): conn = self._make_one(object()) uri = conn.build_api_url("/foo") scheme, netloc, path, qs, _ = urlsplit(uri) - self.assertEqual("%s://%s" % (scheme, netloc), conn.API_BASE_URL) + self.assertEqual(f"{scheme}://{netloc}", conn.API_BASE_URL) self.assertEqual(path, "/".join(["", "storage", conn.API_VERSION, "foo"])) parms = dict(parse_qsl(qs)) pretty_print = parms.pop("prettyPrint", "false") @@ -92,7 +92,7 @@ def test_build_api_url_w_custom_endpoint(self): conn = self._make_one(object(), api_endpoint=custom_endpoint) uri = conn.build_api_url("/foo") scheme, netloc, path, qs, _ = urlsplit(uri) - self.assertEqual("%s://%s" % (scheme, netloc), custom_endpoint) + self.assertEqual(f"{scheme}://{netloc}", custom_endpoint) self.assertEqual(path, "/".join(["", "storage", conn.API_VERSION, "foo"])) parms = dict(parse_qsl(qs)) pretty_print = parms.pop("prettyPrint", "false") @@ -106,7 +106,7 @@ def test_build_api_url_w_extra_query_params(self): conn = self._make_one(object()) uri = conn.build_api_url("/foo", {"bar": "baz"}) scheme, netloc, path, qs, _ = urlsplit(uri) - self.assertEqual("%s://%s" % (scheme, netloc), conn.API_BASE_URL) + self.assertEqual(f"{scheme}://{netloc}", conn.API_BASE_URL) self.assertEqual(path, "/".join(["", "storage", conn.API_VERSION, "foo"])) parms = dict(parse_qsl(qs)) self.assertEqual(parms["bar"], "baz") @@ -246,7 +246,7 @@ def test_duplicate_user_agent(self): client_info = ClientInfo(user_agent="test/123") conn = self._make_one(object(), client_info=client_info) - expected_user_agent = "test/123 gcloud-python/{} ".format(__version__) + expected_user_agent = f"test/123 gcloud-python/{__version__} " self.assertEqual(conn._client_info.user_agent, expected_user_agent) client = mock.Mock(_connection=conn, spec=["_connection"]) diff --git a/tests/unit/test__signing.py b/tests/unit/test__signing.py index 48c9a00e1..a7fed514d 100644 --- a/tests/unit/test__signing.py +++ b/tests/unit/test__signing.py @@ -326,7 +326,7 @@ def test_w_query_parameters(self): query_parameters = {"foo": "bar", "baz": "qux"} canonical = self._call_fut(method, resource, query_parameters, None) self.assertEqual(canonical.method, method) - self.assertEqual(canonical.resource, "{}?baz=qux&foo=bar".format(resource)) + self.assertEqual(canonical.resource, f"{resource}?baz=qux&foo=bar") self.assertEqual(canonical.query_parameters, [("baz", "qux"), ("foo", "bar")]) self.assertEqual(canonical.headers, []) @@ -399,7 +399,7 @@ def _generate_helper( for key, value in query_parameters.items() } expected_qp = urlencode(sorted(normalized_qp.items())) - expected_resource = "{}?{}".format(resource, expected_qp) + expected_resource = f"{resource}?{expected_qp}" elements.append(content_md5 or "") elements.append(content_type or "") @@ -568,9 +568,7 @@ def _generate_helper( self.assertEqual(params["X-Goog-Algorithm"], "GOOG4-RSA-SHA256") now_date = now.date().strftime("%Y%m%d") - expected_cred = "{}/{}/auto/storage/goog4_request".format( - signer_email, now_date - ) + expected_cred = f"{signer_email}/{now_date}/auto/storage/goog4_request" self.assertEqual(params["X-Goog-Credential"], expected_cred) now_stamp = now.strftime("%Y%m%dT%H%M%SZ") @@ -859,7 +857,7 @@ def test_conformance_bucket(test_data): resource = "/" _run_conformance_test(resource, test_data, _API_ACCESS_ENDPOINT) else: - resource = "/{}".format(test_data["bucket"]) + resource = f"/{test_data['bucket']}" _run_conformance_test(resource, test_data) @@ -876,14 +874,12 @@ def test_conformance_blob(test_data): # For the VIRTUAL_HOSTED_STYLE else: _API_ACCESS_ENDPOINT = ( - "{scheme}://{bucket_name}.storage.googleapis.com".format( - scheme=test_data["scheme"], bucket_name=test_data["bucket"] - ) + f"{test_data['scheme']}://{test_data['bucket']}.storage.googleapis.com" ) - resource = "/{}".format(test_data["object"]) + resource = f"/{test_data['object']}" _run_conformance_test(resource, test_data, _API_ACCESS_ENDPOINT) else: - resource = "/{}/{}".format(test_data["bucket"], test_data["object"]) + resource = f"/{test_data['bucket']}/{test_data['object']}" _run_conformance_test(resource, test_data) diff --git a/tests/unit/test_acl.py b/tests/unit/test_acl.py index 6083ef1e1..3c5e6515a 100644 --- a/tests/unit/test_acl.py +++ b/tests/unit/test_acl.py @@ -56,7 +56,7 @@ def test___str__w_identifier(self): TYPE = "type" ID = "id" entity = self._make_one(TYPE, ID) - self.assertEqual(str(entity), "%s-%s" % (TYPE, ID)) + self.assertEqual(str(entity), f"{TYPE}-{ID}") def test_grant_simple(self): TYPE = "type" @@ -229,7 +229,7 @@ def test___iter___non_empty_w_roles(self): acl.loaded = True entity = acl.entity(TYPE, ID) entity.grant(ROLE) - self.assertEqual(list(acl), [{"entity": "%s-%s" % (TYPE, ID), "role": ROLE}]) + self.assertEqual(list(acl), [{"entity": f"{TYPE}-{ID}", "role": ROLE}]) def test___iter___non_empty_w_empty_role(self): TYPE = "type" @@ -313,7 +313,7 @@ def test_has_entity_hit_str(self): acl = self._make_one() acl.loaded = True acl.entity(TYPE, ID) - self.assertTrue(acl.has_entity("%s-%s" % (TYPE, ID))) + self.assertTrue(acl.has_entity(f"{TYPE}-{ID}")) def test_has_entity_hit_entity(self): TYPE = "type" @@ -371,7 +371,7 @@ def test_get_entity_hit_str(self): acl = self._make_one() acl.loaded = True acl.entity(TYPE, ID) - self.assertTrue(acl.has_entity("%s-%s" % (TYPE, ID))) + self.assertTrue(acl.has_entity(f"{TYPE}-{ID}")) def test_get_entity_hit_entity(self): TYPE = "type" @@ -422,7 +422,7 @@ def test_add_entity_hit(self): TYPE = "type" ID = "id" - ENTITY_VAL = "%s-%s" % (TYPE, ID) + ENTITY_VAL = f"{TYPE}-{ID}" ROLE = "role" entity = _ACLEntity(TYPE, ID) entity.grant(ROLE) @@ -470,7 +470,7 @@ def test_user(self): entity.grant(ROLE) self.assertEqual(entity.type, "user") self.assertEqual(entity.identifier, ID) - self.assertEqual(list(acl), [{"entity": "user-%s" % ID, "role": ROLE}]) + self.assertEqual(list(acl), [{"entity": f"user-{ID}", "role": ROLE}]) def test_group(self): ID = "id" @@ -481,7 +481,7 @@ def test_group(self): entity.grant(ROLE) self.assertEqual(entity.type, "group") self.assertEqual(entity.identifier, ID) - self.assertEqual(list(acl), [{"entity": "group-%s" % ID, "role": ROLE}]) + self.assertEqual(list(acl), [{"entity": f"group-{ID}", "role": ROLE}]) def test_domain(self): ID = "id" @@ -492,7 +492,7 @@ def test_domain(self): entity.grant(ROLE) self.assertEqual(entity.type, "domain") self.assertEqual(entity.identifier, ID) - self.assertEqual(list(acl), [{"entity": "domain-%s" % ID, "role": ROLE}]) + self.assertEqual(list(acl), [{"entity": f"domain-{ID}", "role": ROLE}]) def test_all(self): ROLE = "role" @@ -1003,8 +1003,8 @@ def test_ctor(self): self.assertEqual(acl.entities, {}) self.assertFalse(acl.loaded) self.assertIs(acl.bucket, bucket) - self.assertEqual(acl.reload_path, "/b/%s/acl" % NAME) - self.assertEqual(acl.save_path, "/b/%s" % NAME) + self.assertEqual(acl.reload_path, f"/b/{NAME}/acl") + self.assertEqual(acl.save_path, f"/b/{NAME}") def test_user_project(self): NAME = "name" @@ -1033,8 +1033,8 @@ def test_ctor(self): self.assertEqual(acl.entities, {}) self.assertFalse(acl.loaded) self.assertIs(acl.bucket, bucket) - self.assertEqual(acl.reload_path, "/b/%s/defaultObjectAcl" % NAME) - self.assertEqual(acl.save_path, "/b/%s" % NAME) + self.assertEqual(acl.reload_path, f"/b/{NAME}/defaultObjectAcl") + self.assertEqual(acl.save_path, f"/b/{NAME}") class Test_ObjectACL(unittest.TestCase): @@ -1056,8 +1056,8 @@ def test_ctor(self): self.assertEqual(acl.entities, {}) self.assertFalse(acl.loaded) self.assertIs(acl.blob, blob) - self.assertEqual(acl.reload_path, "/b/%s/o/%s/acl" % (NAME, BLOB_NAME)) - self.assertEqual(acl.save_path, "/b/%s/o/%s" % (NAME, BLOB_NAME)) + self.assertEqual(acl.reload_path, f"/b/{NAME}/o/{BLOB_NAME}/acl") + self.assertEqual(acl.save_path, f"/b/{NAME}/o/{BLOB_NAME}") def test_user_project(self): NAME = "name" @@ -1081,7 +1081,7 @@ def __init__(self, bucket, blob): @property def path(self): - return "%s/o/%s" % (self.bucket.path, self.blob) + return f"{self.bucket.path}/o/{self.blob}" class _Bucket(object): @@ -1093,4 +1093,4 @@ def __init__(self, name): @property def path(self): - return "/b/%s" % self.name + return f"/b/{self.name}" diff --git a/tests/unit/test_batch.py b/tests/unit/test_batch.py index 8b347fcf8..72b54769f 100644 --- a/tests/unit/test_batch.py +++ b/tests/unit/test_batch.py @@ -280,7 +280,7 @@ def _check_subrequest_no_payload(self, chunk, method, url): self.assertEqual(lines[1], "Content-Type: application/http") self.assertEqual(lines[2], "MIME-Version: 1.0") self.assertEqual(lines[3], "") - self.assertEqual(lines[4], "%s %s HTTP/1.1" % (method, url)) + self.assertEqual(lines[4], f"{method} {url} HTTP/1.1") self.assertEqual(lines[5], "") self.assertEqual(lines[6], "") @@ -294,14 +294,14 @@ def _check_subrequest_payload(self, chunk, method, url, payload): self.assertEqual(lines[1], "Content-Type: application/http") self.assertEqual(lines[2], "MIME-Version: 1.0") self.assertEqual(lines[3], "") - self.assertEqual(lines[4], "%s %s HTTP/1.1" % (method, url)) + self.assertEqual(lines[4], f"{method} {url} HTTP/1.1") if method == "GET": self.assertEqual(len(lines), 7) self.assertEqual(lines[5], "") self.assertEqual(lines[6], "") else: self.assertEqual(len(lines), 9) - self.assertEqual(lines[5], "Content-Length: %d" % len(payload_str)) + self.assertEqual(lines[5], f"Content-Length: {len(payload_str)}") self.assertEqual(lines[6], "Content-Type: application/json") self.assertEqual(lines[7], "") self.assertEqual(json.loads(lines[8]), payload) @@ -352,7 +352,7 @@ def test_finish_nonempty(self): self.assertEqual(response3.headers, {"Content-Length": "0"}) self.assertEqual(response3.status_code, NO_CONTENT) - expected_url = "{}/batch/storage/v1".format(batch.API_BASE_URL) + expected_url = f"{batch.API_BASE_URL}/batch/storage/v1" http.request.assert_called_once_with( method="POST", url=expected_url, @@ -422,7 +422,7 @@ def test_finish_nonempty_with_status_failure(self): self.assertEqual(target1._properties, {"foo": 1, "bar": 2}) self.assertIs(target2._properties, target2_future_before) - expected_url = "{}/batch/storage/v1".format(batch.API_BASE_URL) + expected_url = f"{batch.API_BASE_URL}/batch/storage/v1" http.request.assert_called_once_with( method="POST", url=expected_url, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 8c86c002e..cea384846 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -140,7 +140,7 @@ def _set_properties_helper(self, kms_key_name=None): NOW = now.strftime(_RFC3339_MICROS) BLOB_NAME = "blob-name" GENERATION = 12345 - BLOB_ID = "name/{}/{}".format(BLOB_NAME, GENERATION) + BLOB_ID = f"name/{BLOB_NAME}/{GENERATION}" SELF_LINK = "http://example.com/self/" METAGENERATION = 23456 SIZE = 12345 @@ -321,7 +321,7 @@ def test_path_normal(self): BLOB_NAME = "blob-name" bucket = _Bucket() blob = self._make_one(BLOB_NAME, bucket=bucket) - self.assertEqual(blob.path, "/b/name/o/%s" % BLOB_NAME) + self.assertEqual(blob.path, f"/b/name/o/{BLOB_NAME}") def test_path_w_slash_in_name(self): BLOB_NAME = "parent/child" @@ -402,7 +402,7 @@ def test_public_url(self): bucket = _Bucket() blob = self._make_one(BLOB_NAME, bucket=bucket) self.assertEqual( - blob.public_url, "https://storage.googleapis.com/name/%s" % BLOB_NAME + blob.public_url, f"https://storage.googleapis.com/name/{BLOB_NAME}" ) def test_public_url_w_slash_in_name(self): @@ -486,9 +486,7 @@ def _generate_signed_url_helper( else: effective_version = version - to_patch = "google.cloud.storage.blob.generate_signed_url_{}".format( - effective_version - ) + to_patch = f"google.cloud.storage.blob.generate_signed_url_{effective_version}" with mock.patch(to_patch) as signer: signed_uri = blob.generate_signed_url( @@ -525,10 +523,10 @@ def _generate_signed_url_helper( ) else: expected_api_access_endpoint = api_access_endpoint - expected_resource = "/{}/{}".format(bucket.name, quoted_name) + expected_resource = f"/{bucket.name}/{quoted_name}" if virtual_hosted_style or bucket_bound_hostname: - expected_resource = "/{}".format(quoted_name) + expected_resource = f"/{quoted_name}" if encryption_key is not None: expected_headers = headers or {} @@ -946,7 +944,7 @@ def test__get_download_url_with_generation_match(self): ) self.assertEqual( download_url, - "{}?ifGenerationMatch={}".format(MEDIA_LINK, GENERATION_NUMBER), + f"{MEDIA_LINK}?ifGenerationMatch={GENERATION_NUMBER}", ) def test__get_download_url_with_media_link_w_user_project(self): @@ -962,9 +960,7 @@ def test__get_download_url_with_media_link_w_user_project(self): client._connection.API_BASE_URL = "https://storage.googleapis.com" download_url = blob._get_download_url(client) - self.assertEqual( - download_url, "{}?userProject={}".format(media_link, user_project) - ) + self.assertEqual(download_url, f"{media_link}?userProject={user_project}") def test__get_download_url_on_the_fly(self): blob_name = "bzzz-fly.txt" @@ -1212,7 +1208,7 @@ def _do_download_helper_wo_chunks( start=1, end=3, raw_download=raw_download, - **extra_kwargs + **extra_kwargs, ) else: blob._do_download( @@ -1221,7 +1217,7 @@ def _do_download_helper_wo_chunks( download_url, headers, raw_download=raw_download, - **extra_kwargs + **extra_kwargs, ) if w_range: @@ -1350,7 +1346,7 @@ def side_effect(*args, **kwargs): end=3, raw_download=raw_download, checksum=checksum, - **timeout_kwarg + **timeout_kwarg, ) else: blob._do_download( @@ -1360,7 +1356,7 @@ def side_effect(*args, **kwargs): headers, raw_download=raw_download, checksum=checksum, - **timeout_kwarg + **timeout_kwarg, ) if w_range: @@ -1616,7 +1612,7 @@ def _download_to_filename_helper( temp.name, raw_download=raw_download, timeout=timeout, - **extra_kwargs + **extra_kwargs, ) if updated is None: @@ -1906,7 +1902,7 @@ def _download_as_text_helper( no_charset=False, expected_value="DEADBEEF", payload=None, - **extra_kwargs + **extra_kwargs, ): if payload is None: if encoding is not None: @@ -1920,7 +1916,7 @@ def _download_as_text_helper( properties = {} if charset is not None: - properties["contentType"] = "text/plain; charset={}".format(charset) + properties["contentType"] = f"text/plain; charset={charset}" elif no_charset: properties = {"contentType": "text/plain"} @@ -2337,7 +2333,7 @@ def _do_multipart_success( if_metageneration_match, if_metageneration_not_match, retry=retry, - **timeout_kwarg + **timeout_kwarg, ) # Clean up the get_api_base_url_for_mtls mock. @@ -2610,7 +2606,7 @@ def _initiate_resumable_helper( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=retry, - **timeout_kwarg + **timeout_kwarg, ) # Clean up the get_api_base_url_for_mtls mock. @@ -2815,7 +2811,7 @@ def _make_resumable_transport( fake_response2 = self._mock_requests_response( resumable_media.PERMANENT_REDIRECT, headers2 ) - json_body = '{{"size": "{:d}"}}'.format(total_bytes) + json_body = f'{{"size": "{total_bytes:d}"}}' if data_corruption: fake_response3 = resumable_media.DataCorruption(None) else: @@ -2847,7 +2843,7 @@ def _do_resumable_upload_call0( + "/o?uploadType=resumable" ) if predefined_acl is not None: - upload_url += "&predefinedAcl={}".format(predefined_acl) + upload_url += f"&predefinedAcl={predefined_acl}" expected_headers = _get_default_headers( client._connection.user_agent, x_upload_content_type=content_type ) @@ -2875,9 +2871,9 @@ def _do_resumable_upload_call1( ): # Second mock transport.request() does sends first chunk. if size is None: - content_range = "bytes 0-{:d}/*".format(blob.chunk_size - 1) + content_range = f"bytes 0-{blob.chunk_size - 1:}/*" else: - content_range = "bytes 0-{:d}/{:d}".format(blob.chunk_size - 1, size) + content_range = f"bytes 0-{blob.chunk_size - 1}/{size}" expected_headers = { **_get_default_headers( @@ -2911,9 +2907,7 @@ def _do_resumable_upload_call2( timeout=None, ): # Third mock transport.request() does sends last chunk. - content_range = "bytes {:d}-{:d}/{:d}".format( - blob.chunk_size, total_bytes - 1, total_bytes - ) + content_range = f"bytes {blob.chunk_size:d}-{total_bytes - 1:d}/{total_bytes:d}" expected_headers = { **_get_default_headers( client._connection.user_agent, x_upload_content_type=content_type @@ -2965,7 +2959,7 @@ def _do_resumable_helper( } headers2 = { **_get_default_headers(USER_AGENT, content_type), - "range": "bytes=0-{:d}".format(CHUNK_SIZE - 1), + "range": f"bytes=0-{CHUNK_SIZE - 1:d}", } headers3 = _get_default_headers(USER_AGENT, content_type) transport, responses = self._make_resumable_transport( @@ -3010,7 +3004,7 @@ def _do_resumable_helper( if_metageneration_match, if_metageneration_not_match, retry=retry, - **timeout_kwarg + **timeout_kwarg, ) # Check the returned values. @@ -3148,7 +3142,7 @@ def _do_upload_helper( if_metageneration_match, if_metageneration_not_match, retry=retry, - **timeout_kwarg + **timeout_kwarg, ) if retry is DEFAULT_RETRY_IF_GENERATION_SPECIFIED: @@ -3539,7 +3533,7 @@ def _upload_from_string_helper(self, data, **kwargs): "text/plain", len(payload), kwargs.get("timeout", self._get_default_timeout()), - **extra_kwargs + **extra_kwargs, ) self.assertIsInstance(stream, io.BytesIO) self.assertEqual(stream.getvalue(), payload) @@ -3622,7 +3616,7 @@ def _create_resumable_upload_session_helper( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=retry, - **timeout_kwarg + **timeout_kwarg, ) # Check the returned value and (lack of) side-effect. @@ -3721,7 +3715,7 @@ def test_get_iam_policy_defaults(self): from google.api_core.iam import Policy blob_name = "blob-name" - path = "/b/name/o/%s" % (blob_name,) + path = f"/b/name/o/{blob_name}" etag = "DEADBEEF" version = 1 owner1 = "user:phred@example.com" @@ -3756,7 +3750,7 @@ def test_get_iam_policy_defaults(self): self.assertEqual(policy.version, api_response["version"]) self.assertEqual(dict(policy), expected_policy) - expected_path = "%s/iam" % (path,) + expected_path = f"{path}/iam" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -3772,7 +3766,7 @@ def test_get_iam_policy_w_user_project_w_timeout(self): blob_name = "blob-name" user_project = "user-project-123" timeout = 42 - path = "/b/name/o/%s" % (blob_name,) + path = f"/b/name/o/{blob_name}" etag = "DEADBEEF" version = 1 api_response = { @@ -3794,7 +3788,7 @@ def test_get_iam_policy_w_user_project_w_timeout(self): self.assertEqual(policy.version, api_response["version"]) self.assertEqual(dict(policy), expected_policy) - expected_path = "%s/iam" % (path,) + expected_path = f"{path}/iam" expected_query_params = {"userProject": user_project} client._get_resource.assert_called_once_with( expected_path, @@ -3808,7 +3802,7 @@ def test_get_iam_policy_w_requested_policy_version(self): from google.cloud.storage.iam import STORAGE_OWNER_ROLE blob_name = "blob-name" - path = "/b/name/o/%s" % (blob_name,) + path = f"/b/name/o/{blob_name}" etag = "DEADBEEF" version = 3 owner1 = "user:phred@example.com" @@ -3828,7 +3822,7 @@ def test_get_iam_policy_w_requested_policy_version(self): self.assertEqual(policy.version, version) - expected_path = "%s/iam" % (path,) + expected_path = f"{path}/iam" expected_query_params = {"optionsRequestedPolicyVersion": version} client._get_resource.assert_called_once_with( expected_path, @@ -3846,7 +3840,7 @@ def test_set_iam_policy(self): from google.api_core.iam import Policy blob_name = "blob-name" - path = "/b/name/o/%s" % (blob_name,) + path = f"/b/name/o/{blob_name}" etag = "DEADBEEF" version = 1 owner1 = "user:phred@example.com" @@ -3876,7 +3870,7 @@ def test_set_iam_policy(self): self.assertEqual(returned.version, version) self.assertEqual(dict(returned), dict(policy)) - expected_path = "%s/iam" % (path,) + expected_path = f"{path}/iam" expected_data = { "resourceId": path, "bindings": mock.ANY, @@ -3904,7 +3898,7 @@ def test_set_iam_policy_w_user_project_w_explicit_client_w_timeout_retry(self): blob_name = "blob-name" user_project = "user-project-123" - path = "/b/name/o/%s" % (blob_name,) + path = f"/b/name/o/{blob_name}" etag = "DEADBEEF" version = 1 bindings = [] @@ -3929,7 +3923,7 @@ def test_set_iam_policy_w_user_project_w_explicit_client_w_timeout_retry(self): self.assertEqual(returned.version, version) self.assertEqual(dict(returned), dict(policy)) - expected_path = "%s/iam" % (path,) + expected_path = f"{path}/iam" expected_data = { # bindings omitted "resourceId": path, } @@ -3965,7 +3959,7 @@ def test_test_iam_permissions_defaults(self): self.assertEqual(found, expected) - expected_path = "/b/name/o/%s/iam/testPermissions" % (blob_name,) + expected_path = f"/b/name/o/{blob_name}/iam/testPermissions" expected_query_params = {"permissions": permissions} client._get_resource.assert_called_once_with( expected_path, @@ -4000,7 +3994,7 @@ def test_test_iam_permissions_w_user_project_w_timeout_w_retry(self): self.assertEqual(found, expected) - expected_path = "/b/name/o/%s/iam/testPermissions" % (blob_name,) + expected_path = f"/b/name/o/{blob_name}/iam/testPermissions" expected_query_params = { "permissions": permissions, "userProject": user_project, @@ -4190,7 +4184,7 @@ def test_compose_wo_content_type_set(self): self.assertIsNone(destination.content_type) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ {"name": source_1.name, "generation": source_1.generation}, @@ -4227,7 +4221,7 @@ def test_compose_minimal_w_user_project_w_timeout(self): self.assertEqual(destination.etag, "DEADBEEF") - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ {"name": source_1.name, "generation": source_1.generation}, @@ -4265,7 +4259,7 @@ def test_compose_w_additional_property_changes_w_retry(self): self.assertEqual(destination.etag, "DEADBEEF") - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ {"name": source_1.name, "generation": source_1.generation}, @@ -4306,7 +4300,7 @@ def test_compose_w_source_generation_match(self): if_source_generation_match=source_generation_numbers, ) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ { @@ -4374,7 +4368,7 @@ def test_compose_w_source_generation_match_nones(self): if_source_generation_match=source_generation_numbers, ) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ { @@ -4416,7 +4410,7 @@ def test_compose_w_generation_match(self): if_generation_match=generation_number, ) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ {"name": source_1.name, "generation": source_1.generation}, @@ -4456,7 +4450,7 @@ def test_compose_w_if_generation_match_list_w_warning(self, mock_warn): if_generation_match=generation_numbers, ) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ { @@ -4542,7 +4536,7 @@ def test_compose_w_if_metageneration_match_list_w_warning(self, mock_warn): if_metageneration_match=metageneration_number, ) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ {"name": source_1_name, "generation": None}, @@ -4584,7 +4578,7 @@ def test_compose_w_metageneration_match(self): if_metageneration_match=metageneration_number, ) - expected_path = "/b/name/o/%s/compose" % destination_name + expected_path = f"/b/name/o/{destination_name}/compose" expected_data = { "sourceObjects": [ {"name": source_1.name, "generation": source_1.generation}, @@ -4830,7 +4824,7 @@ def test_rewrite_same_name_no_old_key_new_key_done_w_user_project(self): self.assertEqual(rewritten, bytes_rewritten) self.assertEqual(size, object_size) - expected_path = "/b/name/o/%s/rewriteTo/b/name/o/%s" % (blob_name, blob_name) + expected_path = f"/b/name/o/{blob_name}/rewriteTo/b/name/o/{blob_name}" expected_query_params = {"userProject": user_project} expected_data = {} expected_headers = { @@ -4878,7 +4872,7 @@ def test_rewrite_same_name_no_key_new_key_w_token(self): self.assertEqual(rewritten, bytes_rewritten) self.assertEqual(size, object_size) - expected_path = "/b/name/o/%s/rewriteTo/b/name/o/%s" % (blob_name, blob_name) + expected_path = f"/b/name/o/{blob_name}/rewriteTo/b/name/o/{blob_name}" expected_data = {} expected_query_params = {"rewriteToken": previous_token} expected_headers = { @@ -4930,7 +4924,7 @@ def test_rewrite_same_name_w_old_key_new_kms_key(self): self.assertEqual(rewritten, bytes_rewritten) self.assertEqual(size, object_size) - expected_path = "/b/name/o/%s/rewriteTo/b/name/o/%s" % (blob_name, blob_name) + expected_path = f"/b/name/o/{blob_name}/rewriteTo/b/name/o/{blob_name}" expected_data = {"kmsKeyName": dest_kms_resource} expected_query_params = {"destinationKmsKeyName": dest_kms_resource} expected_headers = { @@ -5799,7 +5793,7 @@ def _helper(self, message, code=http.client.BAD_REQUEST, reason=None, args=()): def test_default(self): message = "Failure" exc_info = self._helper(message) - expected = "GET http://example.com/: {}".format(message) + expected = f"GET http://example.com/: {message}" self.assertEqual(exc_info.exception.message, expected) self.assertEqual(exc_info.exception.errors, []) @@ -5831,18 +5825,14 @@ def test_w_empty_list(self): def test_wo_existing_qs(self): BASE_URL = "https://test.example.com/base" NV_LIST = [("one", "One"), ("two", "Two")] - expected = "&".join(["{}={}".format(name, value) for name, value in NV_LIST]) - self.assertEqual( - self._call_fut(BASE_URL, NV_LIST), "{}?{}".format(BASE_URL, expected) - ) + expected = "&".join([f"{name}={value}" for name, value in NV_LIST]) + self.assertEqual(self._call_fut(BASE_URL, NV_LIST), f"{BASE_URL}?{expected}") def test_w_existing_qs(self): BASE_URL = "https://test.example.com/base?one=Three" NV_LIST = [("one", "One"), ("two", "Two")] - expected = "&".join(["{}={}".format(name, value) for name, value in NV_LIST]) - self.assertEqual( - self._call_fut(BASE_URL, NV_LIST), "{}&{}".format(BASE_URL, expected) - ) + expected = "&".join([f"{name}={value}" for name, value in NV_LIST]) + self.assertEqual(self._call_fut(BASE_URL, NV_LIST), f"{BASE_URL}&{expected}") class _Connection(object): diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index eb402de9e..f253db3e1 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -902,7 +902,7 @@ def test_path_no_name(self): def test_path_w_name(self): NAME = "name" bucket = self._make_one(name=NAME) - self.assertEqual(bucket.path, "/b/%s" % NAME) + self.assertEqual(bucket.path, f"/b/{NAME}") def test_get_blob_miss_w_defaults(self): from google.cloud.exceptions import NotFound @@ -918,7 +918,7 @@ def test_get_blob_miss_w_defaults(self): self.assertIsNone(result) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -952,7 +952,7 @@ def test_get_blob_hit_w_user_project(self): self.assertIs(blob.bucket, bucket) self.assertEqual(blob.name, blob_name) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = { "userProject": user_project, "projection": "noAcl", @@ -986,7 +986,7 @@ def test_get_blob_hit_w_generation_w_timeout(self): self.assertEqual(blob.name, blob_name) self.assertEqual(blob.generation, generation) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = { "generation": generation, "projection": "noAcl", @@ -1020,7 +1020,7 @@ def test_get_blob_w_etag_match_w_retry(self): self.assertEqual(blob.name, blob_name) self.assertEqual(blob.etag, etag) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = { "projection": "noAcl", } @@ -1055,7 +1055,7 @@ def test_get_blob_w_generation_match_w_retry(self): self.assertEqual(blob.name, blob_name) self.assertEqual(blob.generation, generation) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = { "ifGenerationMatch": generation, "projection": "noAcl", @@ -1093,7 +1093,7 @@ def test_get_blob_hit_with_kwargs_w_explicit_client(self): self.assertEqual(blob.chunk_size, chunk_size) self.assertEqual(blob._encryption_key, key) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = { "projection": "noAcl", } @@ -1218,7 +1218,7 @@ def test_list_notifications_w_defaults(self): self.assertIs(iterator, client._list_resource.return_value) self.assertIs(iterator.bucket, bucket) - expected_path = "/b/{}/notificationConfigs".format(bucket_name) + expected_path = f"/b/{bucket_name}/notificationConfigs" expected_item_to_value = _item_to_notification client._list_resource.assert_called_once_with( expected_path, @@ -1246,7 +1246,7 @@ def test_list_notifications_w_explicit(self): self.assertIs(iterator, other_client._list_resource.return_value) self.assertIs(iterator.bucket, bucket) - expected_path = "/b/{}/notificationConfigs".format(bucket_name) + expected_path = f"/b/{bucket_name}/notificationConfigs" expected_item_to_value = _item_to_notification other_client._list_resource.assert_called_once_with( expected_path, @@ -1270,7 +1270,7 @@ def test_get_notification_miss_w_defaults(self): with self.assertRaises(NotFound): bucket.get_notification(notification_id=notification_id) - expected_path = "/b/{}/notificationConfigs/{}".format(name, notification_id) + expected_path = f"/b/{name}/notificationConfigs/{notification_id}" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -1319,7 +1319,7 @@ def test_get_notification_hit_w_explicit_w_user_project(self): self.assertIsNone(notification.blob_name_prefix) self.assertEqual(notification.payload_format, JSON_API_V1_PAYLOAD_FORMAT) - expected_path = "/b/{}/notificationConfigs/{}".format(name, notification_id) + expected_path = f"/b/{name}/notificationConfigs/{notification_id}" expected_query_params = {"userProject": user_project} client._get_resource.assert_called_once_with( expected_path, @@ -1519,7 +1519,7 @@ def test_delete_blob_miss_w_defaults(self): with self.assertRaises(NotFound): bucket.delete_blob(blob_name) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = {} client._delete_resource.assert_called_once_with( expected_path, @@ -1542,7 +1542,7 @@ def test_delete_blob_hit_w_user_project_w_timeout(self): self.assertIsNone(result) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = {"userProject": user_project} client._delete_resource.assert_called_once_with( expected_path, @@ -1565,7 +1565,7 @@ def test_delete_blob_hit_w_generation_w_retry(self): self.assertIsNone(result) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = {"generation": generation} client._delete_resource.assert_called_once_with( expected_path, @@ -1592,7 +1592,7 @@ def test_delete_blob_hit_w_generation_match(self): self.assertIsNone(result) - expected_path = "/b/%s/o/%s" % (name, blob_name) + expected_path = f"/b/{name}/o/{blob_name}" expected_query_params = { "ifGenerationMatch": generation, "ifMetagenerationMatch": metageneration, @@ -1811,7 +1811,7 @@ def test_reload_w_etag_match(self): bucket.reload(if_etag_match=etag) - expected_path = "/b/%s" % (name,) + expected_path = f"/b/{name}" expected_query_params = { "projection": "noAcl", } @@ -1837,7 +1837,7 @@ def test_reload_w_metageneration_match(self): bucket.reload(if_metageneration_match=metageneration_number) - expected_path = "/b/%s" % (name,) + expected_path = f"/b/{name}" expected_query_params = { "projection": "noAcl", "ifMetagenerationMatch": metageneration_number, @@ -1899,7 +1899,7 @@ def _make_blob(bucket_name, blob_name): blob = mock.create_autospec(Blob) blob.name = blob_name - blob.path = "/b/{}/o/{}".format(bucket_name, blob_name) + blob.path = f"/b/{bucket_name}/o/{blob_name}" return blob def test_copy_blobs_wo_name(self): @@ -2048,7 +2048,7 @@ def test_copy_blob_w_preserve_acl_false_w_explicit_client(self): _target_object=new_blob, ) - expected_patch_path = "/b/{}/o/{}".format(dest_name, new_name) + expected_patch_path = f"/b/{dest_name}/o/{new_name}" expected_patch_data = {"acl": []} expected_patch_query_params = {"projection": "full"} client._patch_resource.assert_called_once_with( @@ -2960,7 +2960,7 @@ def test_get_iam_policy_defaults(self): from google.api_core.iam import Policy bucket_name = "name" - path = "/b/%s" % (bucket_name,) + path = f"/b/{bucket_name}" etag = "DEADBEEF" version = 1 owner1 = "user:phred@example.com" @@ -2994,7 +2994,7 @@ def test_get_iam_policy_defaults(self): self.assertEqual(policy.version, api_response["version"]) self.assertEqual(dict(policy), expected_policy) - expected_path = "/b/%s/iam" % (bucket_name,) + expected_path = f"/b/{bucket_name}/iam" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -3010,7 +3010,7 @@ def test_get_iam_policy_w_user_project_w_timeout(self): bucket_name = "name" timeout = 42 user_project = "user-project-123" - path = "/b/%s" % (bucket_name,) + path = f"/b/{bucket_name}" etag = "DEADBEEF" version = 1 api_response = { @@ -3033,7 +3033,7 @@ def test_get_iam_policy_w_user_project_w_timeout(self): self.assertEqual(policy.version, api_response["version"]) self.assertEqual(dict(policy), expected_policy) - expected_path = "/b/%s/iam" % (bucket_name,) + expected_path = f"/b/{bucket_name}/iam" expected_query_params = {"userProject": user_project} client._get_resource.assert_called_once_with( expected_path, @@ -3047,7 +3047,7 @@ def test_get_iam_policy_w_requested_policy_version_w_retry(self): from google.cloud.storage.iam import STORAGE_OWNER_ROLE bucket_name = "name" - path = "/b/%s" % (bucket_name,) + path = f"/b/{bucket_name}" etag = "DEADBEEF" version = 3 owner1 = "user:phred@example.com" @@ -3067,7 +3067,7 @@ def test_get_iam_policy_w_requested_policy_version_w_retry(self): self.assertEqual(policy.version, version) - expected_path = "/b/%s/iam" % (bucket_name,) + expected_path = f"/b/{bucket_name}/iam" expected_query_params = {"optionsRequestedPolicyVersion": version} client._get_resource.assert_called_once_with( expected_path, @@ -3113,7 +3113,7 @@ def test_set_iam_policy_w_defaults(self): self.assertEqual(returned.version, version) self.assertEqual(dict(returned), dict(policy)) - expected_path = "%s/iam" % (bucket.path,) + expected_path = f"{bucket.path}/iam" expected_data = { "resourceId": bucket.path, "bindings": mock.ANY, @@ -3177,7 +3177,7 @@ def test_set_iam_policy_w_user_project_w_expl_client_w_timeout_retry(self): self.assertEqual(returned.version, version) self.assertEqual(dict(returned), dict(policy)) - expected_path = "%s/iam" % (bucket.path,) + expected_path = f"{bucket.path}/iam" expected_data = { "resourceId": bucket.path, "bindings": mock.ANY, @@ -3221,7 +3221,7 @@ def test_test_iam_permissions_defaults(self): self.assertEqual(found, expected) - expected_path = "/b/%s/iam/testPermissions" % (name,) + expected_path = f"/b/{name}/iam/testPermissions" expected_query_params = {} expected_query_params = {"permissions": permissions} client._get_resource.assert_called_once_with( @@ -3256,7 +3256,7 @@ def test_test_iam_permissions_w_user_project_w_timeout_w_retry(self): self.assertEqual(found, expected) - expected_path = "/b/%s/iam/testPermissions" % (name,) + expected_path = f"/b/{name}/iam/testPermissions" expected_query_params = { "permissions": permissions, "userProject": user_project, @@ -3369,7 +3369,7 @@ def _make_public_w_future_helper(self, default_object_acl_loaded=True): ) if not default_object_acl_loaded: - expected_path = "/b/%s/defaultObjectAcl" % (name,) + expected_path = f"/b/{name}/defaultObjectAcl" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -3581,7 +3581,7 @@ def _make_private_w_future_helper(self, default_object_acl_loaded=True): ) if not default_object_acl_loaded: - expected_path = "/b/%s/defaultObjectAcl" % (name,) + expected_path = f"/b/{name}/defaultObjectAcl" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -3724,9 +3724,7 @@ def _generate_upload_policy_helper(self, **kwargs): break else: # pragma: NO COVER self.fail( - "Condition {} not found in {}".format( - expected_condition, policy_conditions - ) + f"Condition {expected_condition} not found in {policy_conditions}" ) return policy_fields, policy @@ -3831,7 +3829,7 @@ def test_lock_retention_policy_ok_w_timeout_w_retry(self): bucket.lock_retention_policy(timeout=timeout, retry=retry) - expected_path = "/b/{}/lockRetentionPolicy".format(name) + expected_path = f"/b/{name}/lockRetentionPolicy" expected_data = None expected_query_params = {"ifMetagenerationMatch": metageneration} client._post_resource.assert_called_once_with( @@ -3869,7 +3867,7 @@ def test_lock_retention_policy_w_user_project(self): bucket.lock_retention_policy() - expected_path = "/b/{}/lockRetentionPolicy".format(name) + expected_path = f"/b/{name}/lockRetentionPolicy" expected_data = None expected_query_params = { "ifMetagenerationMatch": metageneration, @@ -3964,7 +3962,7 @@ def _generate_signed_url_helper( ) else: expected_api_access_endpoint = api_access_endpoint - expected_resource = "/{}".format(parse.quote(bucket_name)) + expected_resource = f"/{parse.quote(bucket_name)}" if virtual_hosted_style or bucket_bound_hostname: expected_resource = "/" diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 6a97d8d41..07d1b0655 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -371,7 +371,7 @@ def test_get_service_account_email_wo_project(self): ) _, kwargs = http.request.call_args scheme, netloc, path, qs, _ = urllib.parse.urlsplit(kwargs.get("url")) - self.assertEqual("%s://%s" % (scheme, netloc), client._connection.API_BASE_URL) + self.assertEqual(f"{scheme}://{netloc}", client._connection.API_BASE_URL) self.assertEqual( path, "/".join( @@ -409,7 +409,7 @@ def test_get_service_account_email_w_project(self): ) _, kwargs = http.request.call_args scheme, netloc, path, qs, _ = urllib.parse.urlsplit(kwargs.get("url")) - self.assertEqual("%s://%s" % (scheme, netloc), client._connection.API_BASE_URL) + self.assertEqual(f"{scheme}://{netloc}", client._connection.API_BASE_URL) self.assertEqual( path, "/".join( @@ -899,7 +899,7 @@ def test_get_bucket_miss_w_string_w_defaults(self): with self.assertRaises(NotFound): client.get_bucket(bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -931,7 +931,7 @@ def test_get_bucket_hit_w_string_w_timeout(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -961,7 +961,7 @@ def test_get_bucket_hit_w_string_w_metageneration_match(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = { "projection": "noAcl", "ifMetagenerationMatch": metageneration_number, @@ -991,7 +991,7 @@ def test_get_bucket_miss_w_object_w_retry(self): with self.assertRaises(NotFound): client.get_bucket(bucket_obj, retry=retry) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -1023,7 +1023,7 @@ def test_get_bucket_hit_w_object_defaults(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -1051,7 +1051,7 @@ def test_get_bucket_hit_w_object_w_retry_none(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -1077,7 +1077,7 @@ def test_lookup_bucket_miss_w_defaults(self): self.assertIsNone(bucket) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -1109,7 +1109,7 @@ def test_lookup_bucket_hit_w_timeout(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -1139,7 +1139,7 @@ def test_lookup_bucket_hit_w_metageneration_match(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = { "projection": "noAcl", "ifMetagenerationMatch": metageneration_number, @@ -1170,7 +1170,7 @@ def test_lookup_bucket_hit_w_retry(self): self.assertIsInstance(bucket, Bucket) self.assertEqual(bucket.name, bucket_name) - expected_path = "/b/%s" % (bucket_name,) + expected_path = f"/b/{bucket_name}" expected_query_params = {"projection": "noAcl"} expected_headers = {} client._get_resource.assert_called_once_with( @@ -1811,7 +1811,7 @@ def test_list_blobs_w_defaults_w_bucket_obj(self): self.assertIs(iterator.bucket, bucket) self.assertEqual(iterator.prefixes, set()) - expected_path = "/b/{}/o".format(bucket_name) + expected_path = f"/b/{bucket_name}/o" expected_item_to_value = _item_to_blob expected_page_token = None expected_max_results = None @@ -1855,7 +1855,7 @@ def test_list_blobs_w_explicit_w_user_project(self): bucket = client._bucket_arg_to_bucket.return_value = mock.Mock( spec=["path", "user_project"], ) - bucket.path = "/b/{}".format(bucket_name) + bucket.path = f"/b/{bucket_name}" bucket.user_project = user_project timeout = 42 retry = mock.Mock(spec=[]) @@ -1881,7 +1881,7 @@ def test_list_blobs_w_explicit_w_user_project(self): self.assertIs(iterator.bucket, bucket) self.assertEqual(iterator.prefixes, set()) - expected_path = "/b/{}/o".format(bucket_name) + expected_path = f"/b/{bucket_name}/o" expected_item_to_value = _item_to_blob expected_page_token = page_token expected_max_results = max_results @@ -2119,7 +2119,7 @@ def _create_hmac_key_helper( email = "storage-user-123@example.com" secret = "a" * 40 now = datetime.datetime.utcnow().replace(tzinfo=UTC) - now_stamp = "{}Z".format(now.isoformat()) + now_stamp = f"{now.isoformat()}Z" if explicit_project is not None: expected_project = explicit_project @@ -2131,7 +2131,7 @@ def _create_hmac_key_helper( "metadata": { "accessId": access_id, "etag": "ETAG", - "id": "projects/{}/hmacKeys/{}".format(project, access_id), + "id": f"projects/{project}/hmacKeys/{access_id}", "project": expected_project, "state": "ACTIVE", "serviceAccountEmail": email, @@ -2170,7 +2170,7 @@ def _create_hmac_key_helper( self.assertEqual(metadata._properties, api_response["metadata"]) self.assertEqual(secret, api_response["secret"]) - expected_path = "/projects/{}/hmacKeys".format(expected_project) + expected_path = f"/projects/{expected_project}/hmacKeys" expected_data = None expected_query_params = {"serviceAccountEmail": email} @@ -2212,7 +2212,7 @@ def test_list_hmac_keys_w_defaults(self): self.assertIs(iterator, client._list_resource.return_value) - expected_path = "/projects/{}/hmacKeys".format(project) + expected_path = f"/projects/{project}/hmacKeys" expected_item_to_value = _item_to_hmac_key_metadata expected_max_results = None expected_extra_params = {} @@ -2252,7 +2252,7 @@ def test_list_hmac_keys_w_explicit(self): self.assertIs(iterator, client._list_resource.return_value) - expected_path = "/projects/{}/hmacKeys".format(other_project) + expected_path = f"/projects/{other_project}/hmacKeys" expected_item_to_value = _item_to_hmac_key_metadata expected_max_results = max_results expected_extra_params = { @@ -2300,7 +2300,7 @@ def test_get_hmac_key_metadata_wo_project(self): ) _, kwargs = http.request.call_args scheme, netloc, path, qs, _ = urllib.parse.urlsplit(kwargs.get("url")) - self.assertEqual("%s://%s" % (scheme, netloc), client._connection.API_BASE_URL) + self.assertEqual(f"{scheme}://{netloc}", client._connection.API_BASE_URL) self.assertEqual( path, "/".join( @@ -2355,7 +2355,7 @@ def test_get_hmac_key_metadata_w_project(self): ) _, kwargs = http.request.call_args scheme, netloc, path, qs, _ = urllib.parse.urlsplit(kwargs.get("url")) - self.assertEqual("%s://%s" % (scheme, netloc), client._connection.API_BASE_URL) + self.assertEqual(f"{scheme}://{netloc}", client._connection.API_BASE_URL) self.assertEqual( path, "/".join( @@ -2515,7 +2515,7 @@ def test_get_signed_policy_v4_virtual_hosted_style(self): credentials=_create_signing_credentials(), ) self.assertEqual( - policy["url"], "https://{}.storage.googleapis.com/".format(BUCKET_NAME) + policy["url"], f"https://{BUCKET_NAME}.storage.googleapis.com/" ) def test_get_signed_policy_v4_bucket_bound_hostname(self): diff --git a/tests/unit/test_hmac_key.py b/tests/unit/test_hmac_key.py index 59a2b221f..917006b96 100644 --- a/tests/unit/test_hmac_key.py +++ b/tests/unit/test_hmac_key.py @@ -177,7 +177,7 @@ def test_time_created_getter(self): metadata = self._make_one() now = datetime.datetime.utcnow() - now_stamp = "{}Z".format(now.isoformat()) + now_stamp = f"{now.isoformat()}Z" metadata._properties["timeCreated"] = now_stamp self.assertEqual(metadata.time_created, now.replace(tzinfo=UTC)) @@ -187,7 +187,7 @@ def test_updated_getter(self): metadata = self._make_one() now = datetime.datetime.utcnow() - now_stamp = "{}Z".format(now.isoformat()) + now_stamp = f"{now.isoformat()}Z" metadata._properties["updated"] = now_stamp self.assertEqual(metadata.updated, now.replace(tzinfo=UTC)) @@ -203,9 +203,7 @@ def test_path_w_access_id_wo_project(self): metadata = self._make_one() metadata._properties["accessId"] = access_id - expected_path = "/projects/{}/hmacKeys/{}".format( - client.DEFAULT_PROJECT, access_id - ) + expected_path = f"/projects/{client.DEFAULT_PROJECT}/hmacKeys/{access_id}" self.assertEqual(metadata.path, expected_path) def test_path_w_access_id_w_explicit_project(self): @@ -215,7 +213,7 @@ def test_path_w_access_id_w_explicit_project(self): metadata._properties["accessId"] = access_id metadata._properties["projectId"] = project - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" self.assertEqual(metadata.path, expected_path) def test_exists_miss_w_defaults(self): @@ -231,7 +229,7 @@ def test_exists_miss_w_defaults(self): self.assertFalse(metadata.exists()) - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -260,7 +258,7 @@ def test_exists_hit_w_explicit_w_user_project(self): self.assertTrue(metadata.exists(timeout=timeout, retry=retry)) - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_query_params = {"userProject": user_project} client._get_resource.assert_called_once_with( expected_path, @@ -283,7 +281,7 @@ def test_reload_miss_w_defaults(self): with self.assertRaises(NotFound): metadata.reload() - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_query_params = {} client._get_resource.assert_called_once_with( expected_path, @@ -314,7 +312,7 @@ def test_reload_hit_w_project_set(self): self.assertEqual(metadata._properties, resource) - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_query_params = {"userProject": user_project} client._get_resource.assert_called_once_with( expected_path, @@ -338,7 +336,7 @@ def test_update_miss_no_project_set_w_defaults(self): with self.assertRaises(NotFound): metadata.update() - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_data = {"state": "INACTIVE"} expected_query_params = {} client._put_resource.assert_called_once_with( @@ -373,7 +371,7 @@ def test_update_hit_w_project_set_w_timeout_w_retry(self): self.assertEqual(metadata._properties, resource) - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_data = {"state": "ACTIVE"} expected_query_params = {"userProject": user_project} client._put_resource.assert_called_once_with( @@ -411,7 +409,7 @@ def test_delete_miss_no_project_set_w_defaults(self): with self.assertRaises(NotFound): metadata.delete() - expected_path = "/projects/{}/hmacKeys/{}".format(client.project, access_id) + expected_path = f"/projects/{client.project}/hmacKeys/{access_id}" expected_query_params = {} client._delete_resource.assert_called_once_with( expected_path, @@ -436,7 +434,7 @@ def test_delete_hit_w_project_set_w_explicit_timeout_retry(self): metadata.delete(timeout=timeout, retry=retry) - expected_path = "/projects/{}/hmacKeys/{}".format(project, access_id) + expected_path = f"/projects/{project}/hmacKeys/{access_id}" expected_query_params = {"userProject": user_project} client._delete_resource.assert_called_once_with( expected_path, diff --git a/tests/unit/test_notification.py b/tests/unit/test_notification.py index cf4e15c13..e5f07d5c7 100644 --- a/tests/unit/test_notification.py +++ b/tests/unit/test_notification.py @@ -33,10 +33,8 @@ class TestBucketNotification(unittest.TestCase): NOTIFICATION_ID = "123" SELF_LINK = "https://example.com/notification/123" ETAG = "DEADBEEF" - CREATE_PATH = "/b/{}/notificationConfigs".format(BUCKET_NAME) - NOTIFICATION_PATH = "/b/{}/notificationConfigs/{}".format( - BUCKET_NAME, NOTIFICATION_ID - ) + CREATE_PATH = f"/b/{BUCKET_NAME}/notificationConfigs" + NOTIFICATION_PATH = f"/b/{BUCKET_NAME}/notificationConfigs/{NOTIFICATION_ID}" @staticmethod def event_types(): From b0bf411f8fec8712b3eeb99a2dd33de6d82312f8 Mon Sep 17 00:00:00 2001 From: Rebecca Peterson <44721098+rebecca-pete@users.noreply.github.com> Date: Fri, 20 May 2022 10:54:14 -0700 Subject: [PATCH 052/509] docs(samples): Update the Recovery Point Objective (RPO) sample output (#725) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ddelgrosso1 Related to b/217259317. Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/python-storage/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) Fixes # 🦕 --- google/cloud/storage/constants.py | 6 ++++-- samples/snippets/rpo_test.py | 6 +++--- samples/snippets/storage_create_bucket_turbo_replication.py | 2 +- samples/snippets/storage_set_rpo_async_turbo.py | 2 +- samples/snippets/storage_set_rpo_default.py | 4 ++-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index b8ac87886..babbc5a42 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -119,13 +119,15 @@ """ RPO_ASYNC_TURBO = "ASYNC_TURBO" -"""Turbo Replication RPO +"""The recovery point objective (RPO) indicates how quickly newly written objects are asynchronously replicated to a separate geographic location. +When the RPO value is set to ASYNC_TURBO, the turbo replication feature is enabled. See: https://cloud.google.com/storage/docs/managing-turbo-replication """ RPO_DEFAULT = "DEFAULT" -"""Default RPO +"""The recovery point objective (RPO) indicates how quickly newly written objects are asynchronously replicated to a separate geographic location. +When the RPO value is set to DEFAULT, the default replication behavior is enabled. See: https://cloud.google.com/storage/docs/managing-turbo-replication """ diff --git a/samples/snippets/rpo_test.py b/samples/snippets/rpo_test.py index f1f16e7fb..befc0334a 100644 --- a/samples/snippets/rpo_test.py +++ b/samples/snippets/rpo_test.py @@ -45,17 +45,17 @@ def test_get_rpo(dual_region_bucket, capsys): def test_set_rpo_async_turbo(dual_region_bucket, capsys): storage_set_rpo_async_turbo.set_rpo_async_turbo(dual_region_bucket.name) out, _ = capsys.readouterr() - assert f"RPO is ASYNC_TURBO for {dual_region_bucket.name}." in out + assert f"RPO is set to ASYNC_TURBO for {dual_region_bucket.name}." in out def test_set_rpo_default(dual_region_bucket, capsys): storage_set_rpo_default.set_rpo_default(dual_region_bucket.name) out, _ = capsys.readouterr() - assert f"RPO is DEFAULT for {dual_region_bucket.name}." in out + assert f"RPO is set to DEFAULT for {dual_region_bucket.name}." in out def test_create_bucket_turbo_replication(capsys): bucket_name = f"test-rpo-{uuid.uuid4()}" storage_create_bucket_turbo_replication.create_bucket_turbo_replication(bucket_name) out, _ = capsys.readouterr() - assert f"{bucket_name} created with RPO ASYNC_TURBO in NAM4." in out + assert f"{bucket_name} created with the recovery point objective (RPO) set to ASYNC_TURBO in NAM4." in out diff --git a/samples/snippets/storage_create_bucket_turbo_replication.py b/samples/snippets/storage_create_bucket_turbo_replication.py index 68f0ba482..3d26616ec 100644 --- a/samples/snippets/storage_create_bucket_turbo_replication.py +++ b/samples/snippets/storage_create_bucket_turbo_replication.py @@ -39,7 +39,7 @@ def create_bucket_turbo_replication(bucket_name): bucket.rpo = RPO_ASYNC_TURBO bucket.create() - print(f"{bucket.name} created with RPO {bucket.rpo} in {bucket.location}.") + print(f"{bucket.name} created with the recovery point objective (RPO) set to {bucket.rpo} in {bucket.location}.") # [END storage_create_bucket_turbo_replication] diff --git a/samples/snippets/storage_set_rpo_async_turbo.py b/samples/snippets/storage_set_rpo_async_turbo.py index 10b4c67a3..a351cb8f8 100644 --- a/samples/snippets/storage_set_rpo_async_turbo.py +++ b/samples/snippets/storage_set_rpo_async_turbo.py @@ -39,7 +39,7 @@ def set_rpo_async_turbo(bucket_name): bucket.rpo = RPO_ASYNC_TURBO bucket.patch() - print(f"RPO is ASYNC_TURBO for {bucket.name}.") + print(f"RPO is set to ASYNC_TURBO for {bucket.name}.") # [END storage_set_rpo_async_turbo] diff --git a/samples/snippets/storage_set_rpo_default.py b/samples/snippets/storage_set_rpo_default.py index 8d41b1fe0..883fee0c9 100644 --- a/samples/snippets/storage_set_rpo_default.py +++ b/samples/snippets/storage_set_rpo_default.py @@ -16,7 +16,7 @@ import sys -"""Sample that sets RPO (Recovery Point Objective) to default +"""Sample that sets the replication behavior or recovery point objective (RPO) to default. This sample is used on this page: https://cloud.google.com/storage/docs/managing-turbo-replication For more information, see README.md. @@ -39,7 +39,7 @@ def set_rpo_default(bucket_name): bucket.rpo = RPO_DEFAULT bucket.patch() - print(f"RPO is DEFAULT for {bucket.name}.") + print(f"RPO is set to DEFAULT for {bucket.name}.") # [END storage_set_rpo_default] From 7ec6f4d0bb11f86a184e5bf1099464d98b24796c Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 26 May 2022 15:18:54 -0700 Subject: [PATCH 053/509] chore: fix requests intersphinx url (#801) --- docs/conf.py | 4 +++- docs/retry_timeout.rst | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 7a2f13fca..082c4a145 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -368,7 +368,9 @@ "grpc": ("https://grpc.github.io/grpc/python/", None), "proto-plus": ("https://proto-plus-python.readthedocs.io/en/latest/", None), "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), - "requests": ("https://docs.python-requests.org/en/master/", None), + # python-requests url temporary change related to + # https://github.com/psf/requests/issues/6140#issuecomment-1135071992 + "python-requests": ("https://requests.readthedocs.io/en/stable/", None), } diff --git a/docs/retry_timeout.rst b/docs/retry_timeout.rst index db072013b..18e25304a 100644 --- a/docs/retry_timeout.rst +++ b/docs/retry_timeout.rst @@ -47,7 +47,7 @@ in your code, using one of three forms: See also: - :ref:`Timeouts in requests ` + `Timeouts in requests `_ .. _configuring_retries: From 32ed45f564f602fc03d45a2938ea9efb596e0421 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 26 May 2022 17:14:14 -0700 Subject: [PATCH 054/509] chore: pin protobuf (#799) --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index af6c97fb2..8686745f7 100644 --- a/setup.py +++ b/setup.py @@ -33,9 +33,8 @@ "google-cloud-core >= 2.3.0, < 3.0dev", "google-resumable-media >= 2.3.2", "requests >= 2.18.0, < 3.0.0dev", - "protobuf", ] -extras = {} +extras = {"protobuf": ["protobuf<5.0.0dev"]} # Setup boilerplate below this line. From 18bbbd32194e88bdcea3b902ba6a0e5cee0a42c6 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 27 May 2022 14:31:00 -0700 Subject: [PATCH 055/509] chore: update sphinx arrangement to remove duplicate entries on cloudsite (#790) * chore: move module docs under storage * cleanup acl docstring and remove incorrect tags * merge conflict --- docs/acl.rst | 6 -- docs/index.rst | 13 +-- docs/storage/acl.rst | 89 +++++++++++++++++++ docs/{ => storage}/batch.rst | 0 docs/{ => storage}/blobs.rst | 0 docs/{ => storage}/buckets.rst | 0 docs/{ => storage}/client.rst | 0 docs/{ => storage}/constants.rst | 0 docs/{ => storage}/fileio.rst | 0 .../generation_metageneration.rst | 0 docs/{ => storage}/hmac_key.rst | 0 docs/storage/modules.rst | 17 ++++ docs/{ => storage}/notification.rst | 0 docs/{ => storage}/retry.rst | 0 docs/{ => storage}/retry_timeout.rst | 0 docs/{ => storage}/snippets.py | 84 ++++++++--------- google/cloud/storage/__init__.py | 4 +- google/cloud/storage/acl.py | 72 +-------------- google/cloud/storage/blob.py | 8 +- google/cloud/storage/bucket.py | 32 +++---- google/cloud/storage/client.py | 16 ++-- 21 files changed, 180 insertions(+), 161 deletions(-) delete mode 100644 docs/acl.rst create mode 100644 docs/storage/acl.rst rename docs/{ => storage}/batch.rst (100%) rename docs/{ => storage}/blobs.rst (100%) rename docs/{ => storage}/buckets.rst (100%) rename docs/{ => storage}/client.rst (100%) rename docs/{ => storage}/constants.rst (100%) rename docs/{ => storage}/fileio.rst (100%) rename docs/{ => storage}/generation_metageneration.rst (100%) rename docs/{ => storage}/hmac_key.rst (100%) create mode 100644 docs/storage/modules.rst rename docs/{ => storage}/notification.rst (100%) rename docs/{ => storage}/retry.rst (100%) rename docs/{ => storage}/retry_timeout.rst (100%) rename docs/{ => storage}/snippets.py (86%) diff --git a/docs/acl.rst b/docs/acl.rst deleted file mode 100644 index f1f7d0289..000000000 --- a/docs/acl.rst +++ /dev/null @@ -1,6 +0,0 @@ -ACL -~~~ - -.. automodule:: google.cloud.storage.acl - :members: - :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst index 154c76d5e..5a9109944 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,18 +13,7 @@ API Reference .. toctree:: :maxdepth: 2 - client - blobs - buckets - acl - batch - fileio - constants - hmac_key - notification - retry - retry_timeout - generation_metageneration + storage/modules More Examples ------------- diff --git a/docs/storage/acl.rst b/docs/storage/acl.rst new file mode 100644 index 000000000..f96cd6597 --- /dev/null +++ b/docs/storage/acl.rst @@ -0,0 +1,89 @@ +ACL +=== + +Cloud Storage uses access control lists (ACLs) to manage object and bucket access. +ACLs are the mechanism you use to share files with other users and allow +other users to access your buckets and files. + +ACLs are suitable for fine-grained control, but you may prefer using IAM to +control access at the project level. See also: +`Cloud Storage Control Access to Data `_ + + +:class:`google.cloud.storage.bucket.Bucket` has a getting method that creates +an ACL object under the hood, and you can interact with that using +:func:`google.cloud.storage.bucket.Bucket.acl`: + +.. code-block:: python + + client = storage.Client() + bucket = client.get_bucket(bucket_name) + acl = bucket.acl + +Adding and removing permissions can be done with the following methods +(in increasing order of granularity): + +- :func:`ACL.all` + corresponds to access for all users. +- :func:`ACL.all_authenticated` corresponds + to access for all users that are signed into a Google account. +- :func:`ACL.domain` corresponds to access on a + per Google Apps domain (ie, ``example.com``). +- :func:`ACL.group` corresponds to access on a + per group basis (either by ID or e-mail address). +- :func:`ACL.user` corresponds to access on a + per user basis (either by ID or e-mail address). + +And you are able to ``grant`` and ``revoke`` the following roles: + +- **Reading**: + :func:`_ACLEntity.grant_read` and :func:`_ACLEntity.revoke_read` +- **Writing**: + :func:`_ACLEntity.grant_write` and :func:`_ACLEntity.revoke_write` +- **Owning**: + :func:`_ACLEntity.grant_owner` and :func:`_ACLEntity.revoke_owner` + +You can use any of these like any other factory method (these happen to +be :class:`_ACLEntity` factories): + +.. code-block:: python + + acl.user("me@example.org").grant_read() + acl.all_authenticated().grant_write() + +After that, you can save any changes you make with the +:func:`google.cloud.storage.acl.ACL.save` method: + +.. code-block:: python + + acl.save() + + +You can alternatively save any existing :class:`google.cloud.storage.acl.ACL` +object (whether it was created by a factory method or not) from a +:class:`google.cloud.storage.bucket.Bucket`: + +.. code-block:: python + + bucket.acl.save(acl=acl) + + +To get the list of ``entity`` and ``role`` for each unique pair, the +:class:`ACL` class is iterable: + +.. code-block:: python + + print(list(acl)) + # [{'role': 'OWNER', 'entity': 'allUsers'}, ...] + + +This list of tuples can be used as the ``entity`` and ``role`` fields +when sending metadata for ACLs to the API. + + +ACL Module +---------- + +.. automodule:: google.cloud.storage.acl + :members: + :show-inheritance: diff --git a/docs/batch.rst b/docs/storage/batch.rst similarity index 100% rename from docs/batch.rst rename to docs/storage/batch.rst diff --git a/docs/blobs.rst b/docs/storage/blobs.rst similarity index 100% rename from docs/blobs.rst rename to docs/storage/blobs.rst diff --git a/docs/buckets.rst b/docs/storage/buckets.rst similarity index 100% rename from docs/buckets.rst rename to docs/storage/buckets.rst diff --git a/docs/client.rst b/docs/storage/client.rst similarity index 100% rename from docs/client.rst rename to docs/storage/client.rst diff --git a/docs/constants.rst b/docs/storage/constants.rst similarity index 100% rename from docs/constants.rst rename to docs/storage/constants.rst diff --git a/docs/fileio.rst b/docs/storage/fileio.rst similarity index 100% rename from docs/fileio.rst rename to docs/storage/fileio.rst diff --git a/docs/generation_metageneration.rst b/docs/storage/generation_metageneration.rst similarity index 100% rename from docs/generation_metageneration.rst rename to docs/storage/generation_metageneration.rst diff --git a/docs/hmac_key.rst b/docs/storage/hmac_key.rst similarity index 100% rename from docs/hmac_key.rst rename to docs/storage/hmac_key.rst diff --git a/docs/storage/modules.rst b/docs/storage/modules.rst new file mode 100644 index 000000000..9148a4385 --- /dev/null +++ b/docs/storage/modules.rst @@ -0,0 +1,17 @@ +Modules for Python Storage +-------------------------- +.. toctree:: + :maxdepth: 2 + + client + blobs + buckets + acl + batch + fileio + constants + hmac_key + notification + retry + retry_timeout + generation_metageneration \ No newline at end of file diff --git a/docs/notification.rst b/docs/storage/notification.rst similarity index 100% rename from docs/notification.rst rename to docs/storage/notification.rst diff --git a/docs/retry.rst b/docs/storage/retry.rst similarity index 100% rename from docs/retry.rst rename to docs/storage/retry.rst diff --git a/docs/retry_timeout.rst b/docs/storage/retry_timeout.rst similarity index 100% rename from docs/retry_timeout.rst rename to docs/storage/retry_timeout.rst diff --git a/docs/snippets.py b/docs/storage/snippets.py similarity index 86% rename from docs/snippets.py rename to docs/storage/snippets.py index 7ee3a62a0..93884900f 100644 --- a/docs/snippets.py +++ b/docs/storage/snippets.py @@ -34,7 +34,7 @@ def snippet(func): @snippet def storage_get_started(to_delete): - # [START storage_get_started] + # START storage_get_started client = storage.Client() bucket = client.get_bucket("bucket-id-here") # Then do other things... @@ -43,7 +43,7 @@ def storage_get_started(to_delete): blob.upload_from_string("New contents!") blob2 = bucket.blob("/remote/path/storage.txt") blob2.upload_from_filename(filename="/local/path.txt") - # [END storage_get_started] + # END storage_get_started to_delete.append(bucket) @@ -53,40 +53,40 @@ def client_bucket_acl(client, to_delete): bucket_name = "system-test-bucket" client.create_bucket(bucket_name) - # [START client_bucket_acl] + # START client_bucket_acl client = storage.Client() bucket = client.get_bucket(bucket_name) acl = bucket.acl - # [END client_bucket_acl] + # END client_bucket_acl to_delete.append(bucket) - # [START acl_user_settings] + # START acl_user_settings acl.user("me@example.org").grant_read() acl.all_authenticated().grant_write() - # [END acl_user_settings] + # END acl_user_settings - # [START acl_save] + # START acl_save acl.save() - # [END acl_save] + # END acl_save - # [START acl_revoke_write] + # START acl_revoke_write acl.all().grant_read() acl.all().revoke_write() - # [END acl_revoke_write] + # END acl_revoke_write - # [START acl_save_bucket] + # START acl_save_bucket bucket.acl.save(acl=acl) - # [END acl_save_bucket] + # END acl_save_bucket - # [START acl_print] + # START acl_print print(list(acl)) # [{'role': 'OWNER', 'entity': 'allUsers'}, ...] - # [END acl_print] + # END acl_print @snippet def download_to_file(to_delete): - # [START download_to_file] + # START download_to_file from google.cloud.storage import Blob client = storage.Client(project="my-project") @@ -96,14 +96,14 @@ def download_to_file(to_delete): blob.upload_from_string("my secret message.") with open("/tmp/my-secure-file", "wb") as file_obj: client.download_to_file(blob, file_obj) - # [END download_to_file] + # END download_to_file to_delete.append(blob) @snippet def upload_from_file(to_delete): - # [START upload_from_file] + # START upload_from_file from google.cloud.storage import Blob client = storage.Client(project="my-project") @@ -112,7 +112,7 @@ def upload_from_file(to_delete): blob = Blob("secure-data", bucket, encryption_key=encryption_key) with open("my-file", "rb") as my_file: blob.upload_from_file(my_file) - # [END upload_from_file] + # END upload_from_file to_delete.append(blob) @@ -121,21 +121,21 @@ def upload_from_file(to_delete): def get_blob(to_delete): from google.cloud.storage.blob import Blob - # [START get_blob] + # START get_blob client = storage.Client() bucket = client.get_bucket("my-bucket") assert isinstance(bucket.get_blob("/path/to/blob.txt"), Blob) # assert not bucket.get_blob("/does-not-exist.txt") # None - # [END get_blob] + # END get_blob to_delete.append(bucket) @snippet def delete_blob(to_delete): - # [START delete_blob] + # START delete_blob from google.cloud.exceptions import NotFound client = storage.Client() @@ -148,12 +148,12 @@ def delete_blob(to_delete): bucket.delete_blob("doesnt-exist") except NotFound: pass - # [END delete_blob] + # END delete_blob blob = None - # [START delete_blobs] + # START delete_blobs bucket.delete_blobs([blob], on_error=lambda blob: None) - # [END delete_blobs] + # END delete_blobs to_delete.append(bucket) @@ -161,15 +161,15 @@ def delete_blob(to_delete): @snippet def configure_website(to_delete): bucket_name = "test-bucket" - # [START configure_website] + # START configure_website client = storage.Client() bucket = client.get_bucket(bucket_name) bucket.configure_website("index.html", "404.html") - # [END configure_website] + # END configure_website - # [START make_public] + # START make_public bucket.make_public(recursive=True, future=True) - # [END make_public] + # END make_public to_delete.append(bucket) @@ -178,34 +178,34 @@ def configure_website(to_delete): def get_bucket(client, to_delete): import google - # [START get_bucket] + # START get_bucket try: bucket = client.get_bucket("my-bucket") except google.cloud.exceptions.NotFound: print("Sorry, that bucket does not exist!") - # [END get_bucket] + # END get_bucket to_delete.append(bucket) @snippet def add_lifecycle_delete_rule(client, to_delete): - # [START add_lifecycle_delete_rule] + # START add_lifecycle_delete_rule bucket = client.get_bucket("my-bucket") bucket.add_lifecycle_delete_rule(age=2) bucket.patch() - # [END add_lifecycle_delete_rule] + # END add_lifecycle_delete_rule to_delete.append(bucket) @snippet def add_lifecycle_set_storage_class_rule(client, to_delete): - # [START add_lifecycle_set_storage_class_rule] + # START add_lifecycle_set_storage_class_rule bucket = client.get_bucket("my-bucket") bucket.add_lifecycle_set_storage_class_rule( "COLD_LINE", matches_storage_class=["NEARLINE"] ) bucket.patch() - # [END add_lifecycle_set_storage_class_rule] + # END add_lifecycle_set_storage_class_rule to_delete.append(bucket) @@ -213,14 +213,14 @@ def add_lifecycle_set_storage_class_rule(client, to_delete): def lookup_bucket(client, to_delete): from google.cloud.storage.bucket import Bucket - # [START lookup_bucket] + # START lookup_bucket bucket = client.lookup_bucket("doesnt-exist") assert not bucket # None bucket = client.lookup_bucket("my-bucket") assert isinstance(bucket, Bucket) # - # [END lookup_bucket] + # END lookup_bucket to_delete.append(bucket) @@ -229,21 +229,21 @@ def lookup_bucket(client, to_delete): def create_bucket(client, to_delete): from google.cloud.storage import Bucket - # [START create_bucket] + # START create_bucket bucket = client.create_bucket("my-bucket") assert isinstance(bucket, Bucket) # - # [END create_bucket] + # END create_bucket to_delete.append(bucket) @snippet def list_buckets(client, to_delete): - # [START list_buckets] + # START list_buckets for bucket in client.list_buckets(): print(bucket) - # [END list_buckets] + # END list_buckets for bucket in client.list_buckets(): to_delete.append(bucket) @@ -252,7 +252,7 @@ def list_buckets(client, to_delete): @snippet def policy_document(client): # pylint: disable=unused-argument - # [START policy_document] + # START policy_document bucket = client.bucket("my-bucket") conditions = [["starts-with", "$key", ""], {"acl": "public-read"}] @@ -277,7 +277,7 @@ def policy_document(client): ).format(bucket_name=bucket.name, policy_fields=policy_fields) print(upload_form) - # [END policy_document] + # END policy_document def _line_no(func): diff --git a/google/cloud/storage/__init__.py b/google/cloud/storage/__init__.py index b05efab8c..4e9c47f4a 100644 --- a/google/cloud/storage/__init__.py +++ b/google/cloud/storage/__init__.py @@ -17,8 +17,8 @@ You'll typically use these to get started with the API: .. literalinclude:: snippets.py - :start-after: [START storage_get_started] - :end-before: [END storage_get_started] + :start-after: START storage_get_started + :end-before: END storage_get_started :dedent: 4 The main concepts with this API are: diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index e876c152c..4458966ce 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -12,77 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Manipulate access control lists that Cloud Storage provides. - -:class:`google.cloud.storage.bucket.Bucket` has a getting method that creates -an ACL object under the hood, and you can interact with that using -:func:`google.cloud.storage.bucket.Bucket.acl`: - -.. literalinclude:: snippets.py - :start-after: [START client_bucket_acl] - :end-before: [END client_bucket_acl] - :dedent: 4 - - -Adding and removing permissions can be done with the following methods -(in increasing order of granularity): - -- :func:`ACL.all` - corresponds to access for all users. -- :func:`ACL.all_authenticated` corresponds - to access for all users that are signed into a Google account. -- :func:`ACL.domain` corresponds to access on a - per Google Apps domain (ie, ``example.com``). -- :func:`ACL.group` corresponds to access on a - per group basis (either by ID or e-mail address). -- :func:`ACL.user` corresponds to access on a - per user basis (either by ID or e-mail address). - -And you are able to ``grant`` and ``revoke`` the following roles: - -- **Reading**: - :func:`_ACLEntity.grant_read` and :func:`_ACLEntity.revoke_read` -- **Writing**: - :func:`_ACLEntity.grant_write` and :func:`_ACLEntity.revoke_write` -- **Owning**: - :func:`_ACLEntity.grant_owner` and :func:`_ACLEntity.revoke_owner` - -You can use any of these like any other factory method (these happen to -be :class:`_ACLEntity` factories): - -.. literalinclude:: snippets.py - :start-after: [START acl_user_settings] - :end-before: [END acl_user_settings] - :dedent: 4 - -After that, you can save any changes you make with the -:func:`google.cloud.storage.acl.ACL.save` method: - -.. literalinclude:: snippets.py - :start-after: [START acl_save] - :end-before: [END acl_save] - :dedent: 4 - -You can alternatively save any existing :class:`google.cloud.storage.acl.ACL` -object (whether it was created by a factory method or not) from a -:class:`google.cloud.storage.bucket.Bucket`: - -.. literalinclude:: snippets.py - :start-after: [START acl_save_bucket] - :end-before: [END acl_save_bucket] - :dedent: 4 - -To get the list of ``entity`` and ``role`` for each unique pair, the -:class:`ACL` class is iterable: - -.. literalinclude:: snippets.py - :start-after: [START acl_print] - :end-before: [END acl_print] - :dedent: 4 - -This list of tuples can be used as the ``entity`` and ``role`` fields -when sending metadata for ACLs to the API. -""" +"""Manage access to objects and buckets.""" from google.cloud.storage._helpers import _add_generation_match_parameters from google.cloud.storage.constants import _DEFAULT_TIMEOUT diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index a3ea714ef..752290b59 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -1041,8 +1041,8 @@ def download_to_file( encryption key: .. literalinclude:: snippets.py - :start-after: [START download_to_file] - :end-before: [END download_to_file] + :start-after: START download_to_file + :end-before: END download_to_file :dedent: 4 The ``encryption_key`` should be a str or bytes with a length of at @@ -2438,8 +2438,8 @@ def upload_from_file( [`customer-supplied`](https://cloud.google.com/storage/docs/encryption#customer-supplied) encryption key: .. literalinclude:: snippets.py - :start-after: [START upload_from_file] - :end-before: [END upload_from_file] + :start-after: START upload_from_file + :end-before: END upload_from_file :dedent: 4 The ``encryption_key`` should be a str or bytes with a length of at diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 143629236..c98f005c3 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1173,8 +1173,8 @@ def get_blob( This will return None if the blob doesn't exist: .. literalinclude:: snippets.py - :start-after: [START get_blob] - :end-before: [END get_blob] + :start-after: START get_blob + :end-before: END get_blob :dedent: 4 If :attr:`user_project` is set, bills the API request to that project. @@ -1592,8 +1592,8 @@ def delete_blob( For example: .. literalinclude:: snippets.py - :start-after: [START delete_blob] - :end-before: [END delete_blob] + :start-after: START delete_blob + :end-before: END delete_blob :dedent: 4 If :attr:`user_project` is set, bills the API request to that project. @@ -1640,8 +1640,8 @@ def delete_blob( ``on_error`` callback, e.g.: .. literalinclude:: snippets.py - :start-after: [START delete_blobs] - :end-before: [END delete_blobs] + :start-after: START delete_blobs + :end-before: END delete_blobs :dedent: 4 """ @@ -2311,8 +2311,8 @@ def add_lifecycle_delete_rule(self, **kw): https://cloud.google.com/storage/docs/json_api/v1/buckets .. literalinclude:: snippets.py - :start-after: [START add_lifecycle_delete_rule] - :end-before: [END add_lifecycle_delete_rule] + :start-after: START add_lifecycle_delete_rule + :end-before: END add_lifecycle_delete_rule :dedent: 4 :type kw: dict @@ -2329,8 +2329,8 @@ def add_lifecycle_set_storage_class_rule(self, storage_class, **kw): https://cloud.google.com/storage/docs/json_api/v1/buckets .. literalinclude:: snippets.py - :start-after: [START add_lifecycle_set_storage_class_rule] - :end-before: [END add_lifecycle_set_storage_class_rule] + :start-after: START add_lifecycle_set_storage_class_rule + :end-before: END add_lifecycle_set_storage_class_rule :dedent: 4 :type storage_class: str, one of :attr:`STORAGE_CLASSES`. @@ -2689,15 +2689,15 @@ def configure_website(self, main_page_suffix=None, not_found_page=None): of an index page and a page to use when a blob isn't found: .. literalinclude:: snippets.py - :start-after: [START configure_website] - :end-before: [END configure_website] + :start-after: START configure_website + :end-before: END configure_website :dedent: 4 You probably should also make the whole bucket public: .. literalinclude:: snippets.py - :start-after: [START make_public] - :end-before: [END make_public] + :start-after: START make_public + :end-before: END make_public :dedent: 4 This says: "Make the bucket public, and all the stuff already in @@ -3112,8 +3112,8 @@ def generate_upload_policy(self, conditions, expiration=None, client=None): For example: .. literalinclude:: snippets.py - :start-after: [START policy_document] - :end-before: [END policy_document] + :start-after: START policy_document + :end-before: END policy_document :dedent: 4 .. _policy documents: diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index f905e1be0..a22b70f9a 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -761,8 +761,8 @@ def get_bucket( Retrieve a bucket using a string. .. literalinclude:: snippets.py - :start-after: [START get_bucket] - :end-before: [END get_bucket] + :start-after: START get_bucket + :end-before: END get_bucket :dedent: 4 Get a bucket using a resource. @@ -802,8 +802,8 @@ def lookup_bucket( than catching an exception: .. literalinclude:: snippets.py - :start-after: [START lookup_bucket] - :end-before: [END lookup_bucket] + :start-after: START lookup_bucket + :end-before: END lookup_bucket :dedent: 4 :type bucket_name: str @@ -916,8 +916,8 @@ def create_bucket( Create a bucket using a string. .. literalinclude:: snippets.py - :start-after: [START create_bucket] - :end-before: [END create_bucket] + :start-after: START create_bucket + :end-before: END create_bucket :dedent: 4 Create a bucket using a resource. @@ -1333,8 +1333,8 @@ def list_buckets( bucket. .. literalinclude:: snippets.py - :start-after: [START list_buckets] - :end-before: [END list_buckets] + :start-after: START list_buckets + :end-before: END list_buckets :dedent: 4 This implements "storage.buckets.list". From 29bf346c5dfc017f344eb9231f7ef34cdcded5c8 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 1 Jun 2022 10:43:31 -0700 Subject: [PATCH 056/509] chore: update owlbot requests intersphinx url (#803) --- owlbot.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/owlbot.py b/owlbot.py index 42e3fdda8..2388b408c 100644 --- a/owlbot.py +++ b/owlbot.py @@ -34,7 +34,9 @@ "google-cloud-kms < 2.0dev", ], intersphinx_dependencies={ - "requests": "https://docs.python-requests.org/en/master/" + # python-requests url temporary change related to + # https://github.com/psf/requests/issues/6140#issuecomment-1135071992 + "requests": "https://requests.readthedocs.io/en/stable/" }, ) From 4dd0907b68e20d1ffcd0fe350831867197917e0d Mon Sep 17 00:00:00 2001 From: Dan Lee <71398022+dandhlee@users.noreply.github.com> Date: Wed, 1 Jun 2022 16:08:50 -0400 Subject: [PATCH 057/509] docs: fix changelog header to consistent size (#802) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: fix changelog header to consistent size * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot Co-authored-by: cojenco --- CHANGELOG.md | 24 ++++++++++++------------ docs/conf.py | 4 +--- samples/snippets/noxfile.py | 4 ++-- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9c28050d..58fb809de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ * fix links in blob module ([#759](https://github.com/googleapis/python-storage/issues/759)) ([9b29314](https://github.com/googleapis/python-storage/commit/9b2931430b0796ffb23ec4efacd82dacad36f40f)) -### [2.2.1](https://github.com/googleapis/python-storage/compare/v2.2.0...v2.2.1) (2022-03-15) +## [2.2.1](https://github.com/googleapis/python-storage/compare/v2.2.0...v2.2.1) (2022-03-15) ### Bug Fixes @@ -105,7 +105,7 @@ * add README to samples subdirectory ([#639](https://www.github.com/googleapis/python-storage/issues/639)) ([58af882](https://www.github.com/googleapis/python-storage/commit/58af882c047c31f59486513c568737082bca6350)) * update samples readme with cli args ([#651](https://www.github.com/googleapis/python-storage/issues/651)) ([75dda81](https://www.github.com/googleapis/python-storage/commit/75dda810e808074d18dfe7915f1403ad01bf2f02)) -### [1.42.3](https://www.github.com/googleapis/python-storage/compare/v1.42.2...v1.42.3) (2021-09-30) +## [1.42.3](https://www.github.com/googleapis/python-storage/compare/v1.42.2...v1.42.3) (2021-09-30) ### Bug Fixes @@ -114,7 +114,7 @@ * check response code in batch.finish ([#609](https://www.github.com/googleapis/python-storage/issues/609)) ([318a286](https://www.github.com/googleapis/python-storage/commit/318a286d709427bfe9f3a37e933c255ac51b3033)) * skip tests that use unspecified pap until we get the change in ([#600](https://www.github.com/googleapis/python-storage/issues/600)) ([38b9b55](https://www.github.com/googleapis/python-storage/commit/38b9b5582e2c6bbd1acab2b49410084170466fad)) -### [1.42.2](https://www.github.com/googleapis/python-storage/compare/v1.42.1...v1.42.2) (2021-09-16) +## [1.42.2](https://www.github.com/googleapis/python-storage/compare/v1.42.1...v1.42.2) (2021-09-16) ### Bug Fixes @@ -123,7 +123,7 @@ * add unpinned protobuf for python3 ([#592](https://www.github.com/googleapis/python-storage/issues/592)) ([53f7ad0](https://www.github.com/googleapis/python-storage/commit/53f7ad0204ad425011da9162d1a78f8276c837eb)) * pin six as a required dependency ([#589](https://www.github.com/googleapis/python-storage/issues/589)) ([9ca97bf](https://www.github.com/googleapis/python-storage/commit/9ca97bf9139c71cd033c78af73da904b27d8ff50)) -### [1.42.1](https://www.github.com/googleapis/python-storage/compare/v1.42.0...v1.42.1) (2021-09-07) +## [1.42.1](https://www.github.com/googleapis/python-storage/compare/v1.42.0...v1.42.1) (2021-09-07) ### Bug Fixes @@ -154,7 +154,7 @@ * update supported / removed Python versions in README ([#519](https://www.github.com/googleapis/python-storage/issues/519)) ([1f1b138](https://www.github.com/googleapis/python-storage/commit/1f1b138865fb171535ee0cf768aff1987ed58914)) -### [1.41.1](https://www.github.com/googleapis/python-storage/compare/v1.41.0...v1.41.1) (2021-07-20) +## [1.41.1](https://www.github.com/googleapis/python-storage/compare/v1.41.0...v1.41.1) (2021-07-20) ### Bug Fixes @@ -232,7 +232,7 @@ * revise docstrings for generate_signed_url ([#408](https://www.github.com/googleapis/python-storage/issues/408)) ([f090548](https://www.github.com/googleapis/python-storage/commit/f090548437142b635191e90dcee1acd4c38e565c)) -### [1.37.1](https://www.github.com/googleapis/python-storage/compare/v1.37.0...v1.37.1) (2021-04-02) +## [1.37.1](https://www.github.com/googleapis/python-storage/compare/v1.37.0...v1.37.1) (2021-04-02) ### Bug Fixes @@ -252,14 +252,14 @@ * update user_project usage and documentation in bucket/client class methods ([#396](https://www.github.com/googleapis/python-storage/issues/396)) ([1a2734b](https://www.github.com/googleapis/python-storage/commit/1a2734ba6d316ce51e4e141571331e86196462b9)) -### [1.36.2](https://www.github.com/googleapis/python-storage/compare/v1.36.1...v1.36.2) (2021-03-09) +## [1.36.2](https://www.github.com/googleapis/python-storage/compare/v1.36.1...v1.36.2) (2021-03-09) ### Bug Fixes * update batch connection to request api endpoint info from client ([#392](https://www.github.com/googleapis/python-storage/issues/392)) ([91fc6d9](https://www.github.com/googleapis/python-storage/commit/91fc6d9870a36308b15a827ed6a691e5b4669b62)) -### [1.36.1](https://www.github.com/googleapis/python-storage/compare/v1.36.0...v1.36.1) (2021-02-19) +## [1.36.1](https://www.github.com/googleapis/python-storage/compare/v1.36.0...v1.36.1) (2021-02-19) ### Bug Fixes @@ -283,7 +283,7 @@ * pass the unused parameter ([#349](https://www.github.com/googleapis/python-storage/issues/349)) ([5c60d24](https://www.github.com/googleapis/python-storage/commit/5c60d240aa98d2a1dcc6933d6da2ce60ea1b7559)) * set custom_time on uploads ([#374](https://www.github.com/googleapis/python-storage/issues/374)) ([f048be1](https://www.github.com/googleapis/python-storage/commit/f048be10416f51cea4e6c8c5b805df7b5d9c4d32)), closes [#372](https://www.github.com/googleapis/python-storage/issues/372) -### [1.35.1](https://www.github.com/googleapis/python-storage/compare/v1.35.0...v1.35.1) (2021-01-28) +## [1.35.1](https://www.github.com/googleapis/python-storage/compare/v1.35.0...v1.35.1) (2021-01-28) ### Bug Fixes @@ -342,14 +342,14 @@ * self-upload files for Unicode system test ([#296](https://www.github.com/googleapis/python-storage/issues/296)) ([6f865d9](https://www.github.com/googleapis/python-storage/commit/6f865d97a19278884356055dfeeaae92f7c63cc1)) * use version.py for versioning, avoid issues with discovering version via get_distribution ([#288](https://www.github.com/googleapis/python-storage/issues/288)) ([fcd1c4f](https://www.github.com/googleapis/python-storage/commit/fcd1c4f7c947eb95d6937783fd69670a570f145e)) -### [1.31.2](https://www.github.com/googleapis/python-storage/compare/v1.31.1...v1.31.2) (2020-09-23) +## [1.31.2](https://www.github.com/googleapis/python-storage/compare/v1.31.1...v1.31.2) (2020-09-23) ### Documentation * fix docstring example for 'blob.generate_signed_url' ([#278](https://www.github.com/googleapis/python-storage/issues/278)) ([2dc91c9](https://www.github.com/googleapis/python-storage/commit/2dc91c947e3693023b4478a15c460693808ea2d9)) -### [1.31.1](https://www.github.com/googleapis/python-storage/compare/v1.31.0...v1.31.1) (2020-09-16) +## [1.31.1](https://www.github.com/googleapis/python-storage/compare/v1.31.0...v1.31.1) (2020-09-16) ### Bug Fixes @@ -442,7 +442,7 @@ * fix upload object with bucket cmek enabled ([#158](https://www.github.com/googleapis/python-storage/issues/158)) ([5f27ffa](https://www.github.com/googleapis/python-storage/commit/5f27ffa3b1b55681453b594a0ef9e2811fc5f0c8)) * set default POST policy scheme to "http" ([#172](https://www.github.com/googleapis/python-storage/issues/172)) ([90c020d](https://www.github.com/googleapis/python-storage/commit/90c020d69a69ebc396416e4086a2e0838932130c)) -### [1.28.1](https://www.github.com/googleapis/python-storage/compare/v1.28.0...v1.28.1) (2020-04-28) +## [1.28.1](https://www.github.com/googleapis/python-storage/compare/v1.28.0...v1.28.1) (2020-04-28) ### Bug Fixes diff --git a/docs/conf.py b/docs/conf.py index 082c4a145..0e6ccdff0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -368,9 +368,7 @@ "grpc": ("https://grpc.github.io/grpc/python/", None), "proto-plus": ("https://proto-plus-python.readthedocs.io/en/latest/", None), "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), - # python-requests url temporary change related to - # https://github.com/psf/requests/issues/6140#issuecomment-1135071992 - "python-requests": ("https://requests.readthedocs.io/en/stable/", None), + "requests": ("https://requests.readthedocs.io/en/stable/", None), } diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 9f1cc8fb1..38bb0a572 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -66,7 +66,7 @@ sys.path.append(".") from noxfile_config import TEST_CONFIG_OVERRIDE except ImportError as e: - print(f"No user noxfile_config found: detail: {e}") + print("No user noxfile_config found: detail: {}".format(e)) TEST_CONFIG_OVERRIDE = {} # Update the TEST_CONFIG with the user supplied values. @@ -266,7 +266,7 @@ def py(session: nox.sessions.Session) -> None: _session_tests(session) else: session.skip( - f"SKIPPED: {session.python} tests are disabled for this sample." + "SKIPPED: {} tests are disabled for this sample.".format(session.python) ) From 9b3cbf3789c21462eac3c776cd29df12701e792f Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 3 Jun 2022 09:47:21 -0700 Subject: [PATCH 058/509] fix: fix rewrite object in CMEK enabled bucket (#807) --- google/cloud/storage/blob.py | 10 +++++- tests/system/test_kms_integration.py | 11 ++++++ tests/unit/test_blob.py | 52 ++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 752290b59..f47c09181 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -3576,7 +3576,15 @@ def rewrite( if source.generation: query_params["sourceGeneration"] = source.generation - if self.kms_key_name is not None: + # When a Customer Managed Encryption Key is used to encrypt Cloud Storage object + # at rest, object resource metadata will store the version of the Key Management + # Service cryptographic material. If a Blob instance with KMS Key metadata set is + # used to rewrite the object, then the existing kmsKeyName version + # value can't be used in the rewrite request and the client instead ignores it. + if ( + self.kms_key_name is not None + and "cryptoKeyVersions" not in self.kms_key_name + ): query_params["destinationKmsKeyName"] = self.kms_key_name _add_generation_match_parameters( diff --git a/tests/system/test_kms_integration.py b/tests/system/test_kms_integration.py index 9636acd54..87c1a7c07 100644 --- a/tests/system/test_kms_integration.py +++ b/tests/system/test_kms_integration.py @@ -224,6 +224,17 @@ def test_blob_rewrite_rotate_csek_to_cmek( assert dest.download_as_bytes() == source_data + # Test existing kmsKeyName version is ignored in the rewrite request + dest = kms_bucket.get_blob(blob_name) + source = kms_bucket.get_blob(blob_name) + token, rewritten, total = dest.rewrite(source) + + while token is not None: + token, rewritten, total = dest.rewrite(source, token=token) + + assert rewritten == len(source_data) + assert dest.download_as_bytes() == source_data + def test_blob_upload_w_bucket_cmek_enabled( kms_bucket, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index cea384846..018ea4505 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -4942,6 +4942,58 @@ def test_rewrite_same_name_w_old_key_new_kms_key(self): _target_object=dest, ) + def test_rewrite_same_name_w_kms_key_w_version(self): + blob_name = "blob" + source_key = b"01234567890123456789012345678901" # 32 bytes + source_key_b64 = base64.b64encode(source_key).rstrip().decode("ascii") + source_key_hash = hashlib.sha256(source_key).digest() + source_key_hash_b64 = base64.b64encode(source_key_hash).rstrip().decode("ascii") + dest_kms_resource = ( + "projects/test-project-123/" + "locations/us/" + "keyRings/test-ring/" + "cryptoKeys/test-key" + "cryptoKeyVersions/1" + ) + bytes_rewritten = object_size = 42 + api_response = { + "totalBytesRewritten": bytes_rewritten, + "objectSize": object_size, + "done": True, + "resource": {"etag": "DEADBEEF"}, + } + client = mock.Mock(spec=["_post_resource"]) + client._post_resource.return_value = api_response + bucket = _Bucket(client=client) + source = self._make_one(blob_name, bucket=bucket, encryption_key=source_key) + dest = self._make_one(blob_name, bucket=bucket, kms_key_name=dest_kms_resource) + + token, rewritten, size = dest.rewrite(source) + + self.assertIsNone(token) + self.assertEqual(rewritten, bytes_rewritten) + self.assertEqual(size, object_size) + + expected_path = f"/b/name/o/{blob_name}/rewriteTo/b/name/o/{blob_name}" + expected_data = {"kmsKeyName": dest_kms_resource} + # The kmsKeyName version value can't be used in the rewrite request, + # so the client instead ignores it. + expected_query_params = {} + expected_headers = { + "X-Goog-Copy-Source-Encryption-Algorithm": "AES256", + "X-Goog-Copy-Source-Encryption-Key": source_key_b64, + "X-Goog-Copy-Source-Encryption-Key-Sha256": source_key_hash_b64, + } + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + headers=expected_headers, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + _target_object=dest, + ) + def test_update_storage_class_invalid(self): blob_name = "blob-name" bucket = _Bucket() From c365d5bbd78292adb6861da3cdfae9ab7b39b844 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 3 Jun 2022 10:11:23 -0700 Subject: [PATCH 059/509] docs: update retry docs (#808) --- docs/storage/retry_timeout.rst | 19 +++++++++++++++++-- google/cloud/storage/retry.py | 3 ++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/storage/retry_timeout.rst b/docs/storage/retry_timeout.rst index 18e25304a..bc1912658 100644 --- a/docs/storage/retry_timeout.rst +++ b/docs/storage/retry_timeout.rst @@ -73,7 +73,8 @@ for each method, base on its semantics: the same "generation", the library uses its :data:`~google.cloud.storage.retry.DEFAULT_RETRY_IF_GENERATION_SPECIFIED` policy, which retries API requests which returns a "transient" error, - but only if the original request includes an ``ifGenerationMatch`` header. + but only if the original request includes a ``generation`` or + ``ifGenerationMatch`` header. - For API requests which are idempotent only if the bucket or blob has the same "metageneration", the library uses its @@ -99,6 +100,20 @@ explicit policy in your code. bucket = client.get_bucket(BUCKET_NAME, retry=None) +- You can modify the default retry behavior and create a copy of :data:`~google.cloud.storage.retry.DEFAULT_RETRY` + by calling it with a ``with_XXX`` method. E.g.: + +.. code-block:: python + + from google.cloud.storage.retry import DEFAULT_RETRY + + # Customize retry with a deadline of 500 seconds (default=120 seconds). + modified_retry = DEFAULT_RETRY.with_deadline(500.0) + # Customize retry with an initial wait time of 1.5 (default=1.0). + # Customize retry with a wait time multiplier per iteration of 1.2 (default=2.0). + # Customize retry with a maximum wait time of 45.0 (default=60.0). + modified_retry = modified_retry.with_delay(initial=1.5, multiplier=1.2, maximum=45.0) + - You can pass an instance of :class:`google.api_core.retry.Retry` to enable retries; the passed object will define retriable response codes and errors, as well as configuring backoff and retry interval options. E.g.: @@ -140,5 +155,5 @@ explicit policy in your code. my_retry_policy = Retry(predicate=is_retryable) my_cond_policy = ConditionalRetryPolicy( - my_retry_policy, conditional_predicate=is_etag_in_data) + my_retry_policy, conditional_predicate=is_etag_in_data, ["query_params"]) bucket = client.get_bucket(BUCKET_NAME, retry=my_cond_policy) diff --git a/google/cloud/storage/retry.py b/google/cloud/storage/retry.py index fb7a8e4de..a9fb3bb3f 100644 --- a/google/cloud/storage/retry.py +++ b/google/cloud/storage/retry.py @@ -88,7 +88,8 @@ class ConditionalRetryPolicy(object): :type required_kwargs: list(str) :param required_kwargs: A list of keyword argument keys that will be extracted from the API call - and passed into the ``conditional predicate`` in order. + and passed into the ``conditional predicate`` in order. For example, + ``["query_params"]`` is commmonly used for preconditions in query_params. """ def __init__(self, retry_policy, conditional_predicate, required_kwargs): From 1e7cdb655beb2a61a0d1b984c4d0468ec31bf463 Mon Sep 17 00:00:00 2001 From: Jakub Czaplicki Date: Mon, 6 Jun 2022 17:26:10 +0200 Subject: [PATCH 060/509] docs: Update generation_metageneration.rst with a missing space (#798) Co-authored-by: cojenco Co-authored-by: Anthonios Partheniou --- docs/storage/generation_metageneration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/storage/generation_metageneration.rst b/docs/storage/generation_metageneration.rst index 4a92e534a..eb77dad15 100644 --- a/docs/storage/generation_metageneration.rst +++ b/docs/storage/generation_metageneration.rst @@ -112,7 +112,7 @@ the blob (e.g., makes the operation conditional on whether the blob's current ``generation`` matches the given value. -As a special case, passing ``0`` as the value for``if_generation_match`` +As a special case, passing ``0`` as the value for ``if_generation_match`` makes the operation succeed only if there are no live versions of the blob. From c7b7faef4a649aea866aaac3dde56990f357b9b5 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 7 Jun 2022 13:09:52 +0200 Subject: [PATCH 061/509] chore(deps): update dependency google-cloud-pubsub to v2.13.0 (#809) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 843c608cd..44c1b701d 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.12.1 +google-cloud-pubsub==2.13.0 google-cloud-storage==2.3.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.2; python_version >= '3.8' From 7b6895c71140d74f25bb6bc1f6d85d7f5d26673f Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 7 Jun 2022 18:52:59 +0200 Subject: [PATCH 062/509] chore(deps): update dependency backoff to v2.1.0 (#810) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 88beb7ba2..ed8c5dde8 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.1.2 mock==4.0.3 -backoff==2.0.1 \ No newline at end of file +backoff==2.1.0 \ No newline at end of file From 187cf503194cf636640ca8ba787f9e8c216ea763 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 7 Jun 2022 13:55:26 -0700 Subject: [PATCH 063/509] feat: support OLM Prefix/Suffix (#773) * feat: support OLM Prefix/Suffix * update tests --- google/cloud/storage/bucket.py | 34 ++++++++++++++++++++++++++++++---- tests/system/test_bucket.py | 18 ++++++++++++++++-- tests/unit/test_bucket.py | 22 ++++++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index c98f005c3..1b31baab7 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -163,11 +163,19 @@ class LifecycleRuleConditions(dict): rule action to versioned items with at least one newer version. + :type matches_prefix: list(str) + :param matches_prefix: (Optional) Apply rule action to items which + any prefix matches the beginning of the item name. + :type matches_storage_class: list(str), one or more of :attr:`Bucket.STORAGE_CLASSES`. - :param matches_storage_class: (Optional) Apply rule action to items which + :param matches_storage_class: (Optional) Apply rule action to items whose storage class matches this value. + :type matches_suffix: list(str) + :param matches_suffix: (Optional) Apply rule action to items which + any suffix matches the end of the item name. + :type number_of_newer_versions: int :param number_of_newer_versions: (Optional) Apply rule action to versioned items having N newer versions. @@ -211,6 +219,8 @@ def __init__( custom_time_before=None, days_since_noncurrent_time=None, noncurrent_time_before=None, + matches_prefix=None, + matches_suffix=None, _factory=False, ): conditions = {} @@ -236,15 +246,21 @@ def __init__( if custom_time_before is not None: conditions["customTimeBefore"] = custom_time_before.isoformat() - if not _factory and not conditions: - raise ValueError("Supply at least one condition") - if days_since_noncurrent_time is not None: conditions["daysSinceNoncurrentTime"] = days_since_noncurrent_time if noncurrent_time_before is not None: conditions["noncurrentTimeBefore"] = noncurrent_time_before.isoformat() + if matches_prefix is not None: + conditions["matchesPrefix"] = matches_prefix + + if matches_suffix is not None: + conditions["matchesSuffix"] = matches_suffix + + if not _factory and not conditions: + raise ValueError("Supply at least one condition") + super(LifecycleRuleConditions, self).__init__(conditions) @classmethod @@ -278,11 +294,21 @@ def is_live(self): """Conditon's 'is_live' value.""" return self.get("isLive") + @property + def matches_prefix(self): + """Conditon's 'matches_prefix' value.""" + return self.get("matchesPrefix") + @property def matches_storage_class(self): """Conditon's 'matches_storage_class' value.""" return self.get("matchesStorageClass") + @property + def matches_suffix(self): + """Conditon's 'matches_suffix' value.""" + return self.get("matchesSuffix") + @property def number_of_newer_versions(self): """Conditon's 'number_of_newer_versions' value.""" diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index d8796f5b3..062cc8998 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -47,6 +47,8 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): bucket_name = _helpers.unique_name("w-lifcycle-rules") custom_time_before = datetime.date(2018, 8, 1) noncurrent_before = datetime.date(2018, 8, 1) + matches_prefix = ["storage-sys-test", "gcs-sys-test"] + matches_suffix = ["suffix-test"] with pytest.raises(exceptions.NotFound): storage_client.get_bucket(bucket_name) @@ -59,6 +61,8 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): custom_time_before=custom_time_before, days_since_noncurrent_time=2, noncurrent_time_before=noncurrent_before, + matches_prefix=matches_prefix, + matches_suffix=matches_suffix, ) bucket.add_lifecycle_set_storage_class_rule( constants.COLDLINE_STORAGE_CLASS, @@ -77,6 +81,8 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): custom_time_before=custom_time_before, days_since_noncurrent_time=2, noncurrent_time_before=noncurrent_before, + matches_prefix=matches_prefix, + matches_suffix=matches_suffix, ), LifecycleRuleSetStorageClass( constants.COLDLINE_STORAGE_CLASS, @@ -95,9 +101,17 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): assert list(bucket.lifecycle_rules) == expected_rules # Test modifying lifecycle rules - expected_rules[0] = LifecycleRuleDelete(age=30) + expected_rules[0] = LifecycleRuleDelete( + age=30, + matches_prefix=["new-prefix"], + matches_suffix=["new-suffix"], + ) rules = list(bucket.lifecycle_rules) - rules[0]["condition"] = {"age": 30} + rules[0]["condition"] = { + "age": 30, + "matchesPrefix": ["new-prefix"], + "matchesSuffix": ["new-suffix"], + } bucket.lifecycle_rules = rules bucket.patch() diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index f253db3e1..d5206f287 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -230,6 +230,28 @@ def test_ctor_w_noncurrent_time_before(self): self.assertEqual(conditions.number_of_newer_versions, 3) self.assertEqual(conditions.noncurrent_time_before, noncurrent_before) + def test_ctor_w_matches_prefix(self): + conditions = self._make_one(matches_prefix=["test-prefix"]) + expected = {"matchesPrefix": ["test-prefix"]} + self.assertEqual(dict(conditions), expected) + self.assertIsNone(conditions.age) + self.assertIsNone(conditions.created_before) + self.assertIsNone(conditions.is_live) + self.assertIsNone(conditions.matches_storage_class) + self.assertIsNone(conditions.matches_suffix) + self.assertEqual(conditions.matches_prefix, ["test-prefix"]) + + def test_ctor_w_matches_suffix(self): + conditions = self._make_one(matches_suffix=["test-suffix"]) + expected = {"matchesSuffix": ["test-suffix"]} + self.assertEqual(dict(conditions), expected) + self.assertIsNone(conditions.age) + self.assertIsNone(conditions.created_before) + self.assertIsNone(conditions.is_live) + self.assertIsNone(conditions.matches_storage_class) + self.assertIsNone(conditions.matches_prefix) + self.assertEqual(conditions.matches_suffix, ["test-suffix"]) + def test_from_api_repr(self): import datetime From a62cbb2d8774c079e15dad3161f3d48297f67686 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 8 Jun 2022 11:07:58 -0700 Subject: [PATCH 064/509] chore(main): release 2.4.0 (#768) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 21 +++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58fb809de..6bc2a1ea9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.4.0](https://github.com/googleapis/python-storage/compare/v2.3.0...v2.4.0) (2022-06-07) + + +### Features + +* add AbortIncompleteMultipartUpload lifecycle rule ([#765](https://github.com/googleapis/python-storage/issues/765)) ([b2e5150](https://github.com/googleapis/python-storage/commit/b2e5150f191c04acb47ad98cef88512451aff81d)) +* support OLM Prefix/Suffix ([#773](https://github.com/googleapis/python-storage/issues/773)) ([187cf50](https://github.com/googleapis/python-storage/commit/187cf503194cf636640ca8ba787f9e8c216ea763)) + + +### Bug Fixes + +* fix rewrite object in CMEK enabled bucket ([#807](https://github.com/googleapis/python-storage/issues/807)) ([9b3cbf3](https://github.com/googleapis/python-storage/commit/9b3cbf3789c21462eac3c776cd29df12701e792f)) + + +### Documentation + +* fix changelog header to consistent size ([#802](https://github.com/googleapis/python-storage/issues/802)) ([4dd0907](https://github.com/googleapis/python-storage/commit/4dd0907b68e20d1ffcd0fe350831867197917e0d)) +* **samples:** Update the Recovery Point Objective (RPO) sample output ([#725](https://github.com/googleapis/python-storage/issues/725)) ([b0bf411](https://github.com/googleapis/python-storage/commit/b0bf411f8fec8712b3eeb99a2dd33de6d82312f8)) +* Update generation_metageneration.rst with a missing space ([#798](https://github.com/googleapis/python-storage/issues/798)) ([1e7cdb6](https://github.com/googleapis/python-storage/commit/1e7cdb655beb2a61a0d1b984c4d0468ec31bf463)) +* update retry docs ([#808](https://github.com/googleapis/python-storage/issues/808)) ([c365d5b](https://github.com/googleapis/python-storage/commit/c365d5bbd78292adb6861da3cdfae9ab7b39b844)) + ## [2.3.0](https://github.com/googleapis/python-storage/compare/v2.2.1...v2.3.0) (2022-04-12) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 999199f5a..fe11624d9 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.3.0" +__version__ = "2.4.0" From 9e5329c7dbab2a8023a288cf276c38f435a72a30 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 9 Jun 2022 02:21:55 +0200 Subject: [PATCH 065/509] chore(deps): update dependency google-cloud-storage to v2.4.0 (#813) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 44c1b701d..a2094a1fd 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.0 -google-cloud-storage==2.3.0 +google-cloud-storage==2.4.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.2; python_version >= '3.8' From 836cc5c1ee4e7c9351cc5ac49bcb58f24db555ee Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 8 Jul 2022 11:57:33 -0400 Subject: [PATCH 066/509] chore: update templated files (#822) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(python): drop python 3.6 Source-Link: https://github.com/googleapis/synthtool/commit/4f89b13af10d086458f9b379e56a614f9d6dab7b Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:e7bb19d47c13839fe8c147e50e02e8b6cf5da8edd1af8b82208cd6f66cc2829c * add api_description to .repo-metadata.json * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/continuous/prerelease-deps.cfg | 7 ++ .kokoro/presubmit/prerelease-deps.cfg | 7 ++ .kokoro/test-samples-impl.sh | 4 +- .repo-metadata.json | 3 +- README.rst | 118 +++++++----------- samples/snippets/noxfile.py | 2 +- .../templates/install_deps.tmpl.rst | 2 +- 8 files changed, 70 insertions(+), 77 deletions(-) create mode 100644 .kokoro/continuous/prerelease-deps.cfg create mode 100644 .kokoro/presubmit/prerelease-deps.cfg diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 757c9dca7..1ce608523 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:81ed5ecdfc7cac5b699ba4537376f3563f6f04122c4ec9e735d3b3dc1d43dd32 -# created: 2022-05-05T22:08:23.383410683Z + digest: sha256:e7bb19d47c13839fe8c147e50e02e8b6cf5da8edd1af8b82208cd6f66cc2829c +# created: 2022-07-05T18:31:20.838186805Z diff --git a/.kokoro/continuous/prerelease-deps.cfg b/.kokoro/continuous/prerelease-deps.cfg new file mode 100644 index 000000000..3595fb43f --- /dev/null +++ b/.kokoro/continuous/prerelease-deps.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "prerelease_deps" +} diff --git a/.kokoro/presubmit/prerelease-deps.cfg b/.kokoro/presubmit/prerelease-deps.cfg new file mode 100644 index 000000000..3595fb43f --- /dev/null +++ b/.kokoro/presubmit/prerelease-deps.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "prerelease_deps" +} diff --git a/.kokoro/test-samples-impl.sh b/.kokoro/test-samples-impl.sh index 8a324c9c7..2c6500cae 100755 --- a/.kokoro/test-samples-impl.sh +++ b/.kokoro/test-samples-impl.sh @@ -33,7 +33,7 @@ export PYTHONUNBUFFERED=1 env | grep KOKORO # Install nox -python3.6 -m pip install --upgrade --quiet nox +python3.9 -m pip install --upgrade --quiet nox # Use secrets acessor service account to get secrets if [[ -f "${KOKORO_GFILE_DIR}/secrets_viewer_service_account.json" ]]; then @@ -76,7 +76,7 @@ for file in samples/**/requirements.txt; do echo "------------------------------------------------------------" # Use nox to execute the tests for the project. - python3.6 -m nox -s "$RUN_TESTS_SESSION" + python3.9 -m nox -s "$RUN_TESTS_SESSION" EXIT=$? # If this is a periodic build, send the test log to the FlakyBot. diff --git a/.repo-metadata.json b/.repo-metadata.json index 2cd2642fe..9e537d52f 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -13,5 +13,6 @@ "requires_billing": true, "default_version": "", "codeowner_team": "@googleapis/cloud-storage-dpe", - "api_shortname": "storage" + "api_shortname": "storage", + "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." } diff --git a/README.rst b/README.rst index 8a1304b73..02d2b7461 100644 --- a/README.rst +++ b/README.rst @@ -1,25 +1,22 @@ -Python Client for Google Cloud Storage -====================================== +Python Client for Google Cloud Storage API +========================================== -|GA| |pypi| |versions| +|stable| |pypi| |versions| -`Google Cloud Storage`_ allows you to store data on -Google infrastructure with very high reliability, performance and -availability, and can be used to distribute large data objects to users -via direct download. +`Google Cloud Storage API`_: is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally. - `Client Library Documentation`_ -- `Storage API docs`_ +- `Product Documentation`_ -.. |GA| image:: https://img.shields.io/badge/support-GA-gold.svg - :target: https://github.com/googleapis/google-cloud-python/blob/main/README.rst#general-availability +.. |stable| image:: https://img.shields.io/badge/support-stable-gold.svg + :target: https://github.com/googleapis/google-cloud-python/blob/main/README.rst#stability-levels .. |pypi| image:: https://img.shields.io/pypi/v/google-cloud-storage.svg - :target: https://pypi.org/project/google-cloud-storage + :target: https://pypi.org/project/google-cloud-storage/ .. |versions| image:: https://img.shields.io/pypi/pyversions/google-cloud-storage.svg - :target: https://pypi.org/project/google-cloud-storage -.. _Google Cloud Storage: https://cloud.google.com/storage/docs -.. _Client Library Documentation: https://googleapis.dev/python/storage/latest -.. _Storage API docs: https://cloud.google.com/storage/docs/json_api/v1 + :target: https://pypi.org/project/google-cloud-storage/ +.. _Google Cloud Storage API: https://cloud.google.com/storage +.. _Client Library Documentation: https://cloud.google.com/python/docs/reference/storage/latest +.. _Product Documentation: https://cloud.google.com/storage Quick Start ----------- @@ -34,51 +31,52 @@ In order to use this library, you first need to go through the following steps: .. _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 Storage API.: https://cloud.google.com/storage -.. _Setup Authentication.: https://cloud.google.com/storage/docs/reference/libraries#setting_up_authentication +.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html Installation ~~~~~~~~~~~~ -`Set up a Python development environment`_ and install this library in a `venv`. -`venv`_ is a tool to create isolated Python environments. The basic problem it -addresses is one of dependencies and versions, and indirectly permissions. +Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to +create isolated Python environments. The basic problem it addresses is one of +dependencies and versions, and indirectly permissions. -Make sure you're using Python 3.7 or later, which includes `venv`_ by default. -With `venv`, it's possible to install this library without needing system +With `virtualenv`_, it's possible to install this library without needing system install permissions, and without clashing with the installed system dependencies. -.. _Set up a Python development environment: https://cloud.google.com/python/docs/setup -.. _`venv`: https://docs.python.org/3/library/venv.html +.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/ + + +Code samples and snippets +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Code samples and snippets live in the `samples/` folder. Supported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^ -Python >= 3.7 +Our client libraries are compatible with all current [active](https://devguide.python.org/devcycle/#in-development-main-branch) and [maintenance](https://devguide.python.org/devcycle/#maintenance-branches) versions of +Python. -Deprecated Python Versions -^^^^^^^^^^^^^^^^^^^^^^^^^^ +Python >= 3.7 Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Python <= 3.6 -Python == 3.6: the last released version which supported Python 3.6 was -``google-cloud-storage 2.0.0``, released 2022-01-12. - -Python == 3.5: the last released version which supported Python 3.5 was -``google-cloud-storage 1.32.0``, released 2020-10-16. +If you are using an [end-of-life](https://devguide.python.org/devcycle/#end-of-life-branches) +version of Python, we recommend that you update as soon as possible to an actively supported version. -Python == 2.7: the last released version which supported Python 2.7 was -``google-cloud-storage 1.44.0``, released 2022-01-05. Mac/Linux ^^^^^^^^^ .. code-block:: console - python -m venv env - source env/bin/activate - pip install google-cloud-storage + pip install virtualenv + virtualenv + source /bin/activate + /bin/pip install google-cloud-storage Windows @@ -86,40 +84,20 @@ Windows .. code-block:: console - py -m venv env - .\env\Scripts\activate - pip install google-cloud-storage - - -Example Usage -~~~~~~~~~~~~~ - -.. code:: python - - # Imports the Google Cloud client library - from google.cloud import storage - - # Instantiates a client - client = storage.Client() - - # Creates a new bucket and uploads an object - new_bucket = client.create_bucket('new-bucket-id') - new_blob = new_bucket.blob('remote/path/storage.txt') - new_blob.upload_from_filename(filename='/local/path.txt') - - # Retrieve an existing bucket - # https://console.cloud.google.com/storage/browser/[bucket-id]/ - bucket = client.get_bucket('bucket-id') - # Then do other things... - blob = bucket.get_blob('remote/path/to/file.txt') - print(blob.download_as_bytes()) - blob.upload_from_string('New contents!') - + pip install virtualenv + virtualenv + \Scripts\activate + \Scripts\pip.exe install google-cloud-storage -What's Next -~~~~~~~~~~~ +Next Steps +~~~~~~~~~~ -Now that you've set up your Python client for Cloud Storage, -you can get started running `Storage samples.`_ +- Read the `Client Library Documentation`_ for Google Cloud Storage API + to see other available methods on the client. +- Read the `Google Cloud Storage API Product documentation`_ to learn + more about the product and see How-to Guides. +- View this `README`_ to see the full list of Cloud + APIs that we cover. -.. _Storage samples.: https://github.com/googleapis/python-storage/tree/main/samples +.. _Google Cloud Storage API Product documentation: https://cloud.google.com/storage +.. _README: https://github.com/googleapis/google-cloud-python/blob/main/README.rst diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 38bb0a572..5fcb9d746 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -89,7 +89,7 @@ def get_pytest_env_vars() -> Dict[str, str]: # DO NOT EDIT - automatically generated. # All versions used to test samples. -ALL_VERSIONS = ["3.6", "3.7", "3.8", "3.9", "3.10"] +ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10"] # Any default versions that should be ignored. IGNORED_VERSIONS = TEST_CONFIG["ignored_versions"] diff --git a/scripts/readme-gen/templates/install_deps.tmpl.rst b/scripts/readme-gen/templates/install_deps.tmpl.rst index 275d64989..6f069c6c8 100644 --- a/scripts/readme-gen/templates/install_deps.tmpl.rst +++ b/scripts/readme-gen/templates/install_deps.tmpl.rst @@ -12,7 +12,7 @@ Install Dependencies .. _Python Development Environment Setup Guide: https://cloud.google.com/python/setup -#. Create a virtualenv. Samples are compatible with Python 3.6+. +#. Create a virtualenv. Samples are compatible with Python 3.7+. .. code-block:: bash From fda745e53e66908298da4759864f1ba573de2878 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 8 Jul 2022 18:22:27 +0200 Subject: [PATCH 067/509] chore(deps): update dependency google-cloud-pubsub to v2.13.1 (#823) Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index a2094a1fd..7764b4153 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.0 +google-cloud-pubsub==2.13.1 google-cloud-storage==2.4.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.2; python_version >= '3.8' From febece76802252278bb7626d931973a76561382a Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 13 Jul 2022 09:48:14 -0700 Subject: [PATCH 068/509] feat: Custom Placement Config Dual Region Support (#819) * refactor: dual-region API update * test coverage --- google/cloud/storage/bucket.py | 18 ++++++++- google/cloud/storage/client.py | 11 +++++- samples/README.md | 2 +- samples/snippets/snippets_test.py | 3 +- .../storage_create_bucket_dual_region.py | 9 +++-- tests/system/test_client.py | 10 ++--- tests/unit/test_client.py | 38 +++++++++++++++++++ 7 files changed, 77 insertions(+), 14 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 1b31baab7..5408b9373 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2418,13 +2418,27 @@ def location(self, value): warnings.warn(_LOCATION_SETTER_MESSAGE, DeprecationWarning, stacklevel=2) self._location = value + @property + def data_locations(self): + """Retrieve the list of regional locations for custom dual-region buckets. + + See https://cloud.google.com/storage/docs/json_api/v1/buckets and + https://cloud.google.com/storage/docs/locations + + Returns ``None`` if the property has not been set before creation, + if the bucket's resource has not been loaded from the server, + or if the bucket is not a dual-regions bucket. + :rtype: list of str or ``NoneType`` + """ + custom_placement_config = self._properties.get("customPlacementConfig", {}) + return custom_placement_config.get("dataLocations") + @property def location_type(self): - """Retrieve or set the location type for the bucket. + """Retrieve the location type for the bucket. See https://cloud.google.com/storage/docs/storage-classes - :setter: Set the location type for this bucket. :getter: Gets the the location type for this bucket. :rtype: str or ``NoneType`` diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index a22b70f9a..acf675fbe 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -602,6 +602,7 @@ def _post_resource( google.cloud.exceptions.NotFound If the bucket is not found. """ + return self._connection.api_request( method="POST", path=path, @@ -847,6 +848,7 @@ def create_bucket( project=None, user_project=None, location=None, + data_locations=None, predefined_acl=None, predefined_default_object_acl=None, timeout=_DEFAULT_TIMEOUT, @@ -876,7 +878,11 @@ def create_bucket( location (str): (Optional) The location of the bucket. If not passed, the default location, US, will be used. If specifying a dual-region, - can be specified as a string, e.g., 'US-CENTRAL1+US-WEST1'. See: + `data_locations` should be set in conjunction.. See: + https://cloud.google.com/storage/docs/locations + data_locations (list of str): + (Optional) The list of regional locations of a custom dual-region bucket. + Dual-regions require exactly 2 regional locations. See: https://cloud.google.com/storage/docs/locations predefined_acl (str): (Optional) Name of predefined ACL to apply to bucket. See: @@ -979,6 +985,9 @@ def create_bucket( if location is not None: properties["location"] = location + if data_locations is not None: + properties["customPlacementConfig"] = {"dataLocations": data_locations} + api_response = self._post_resource( "/b", properties, diff --git a/samples/README.md b/samples/README.md index 2d9080067..173b60eae 100644 --- a/samples/README.md +++ b/samples/README.md @@ -324,7 +324,7 @@ View the [source code](https://github.com/googleapis/python-storage/blob/main/sa View the [source code](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_create_bucket_dual_region.py). To run this sample: -`python storage_create_bucket_dual_region.py ` +`python storage_create_bucket_dual_region.py ` ----- ### Create Bucket Notifications diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index bdd8c528e..d0fefd488 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -435,10 +435,11 @@ def test_create_bucket_class_location(test_bucket_create): def test_create_bucket_dual_region(test_bucket_create, capsys): + location = "US" region_1 = "US-EAST1" region_2 = "US-WEST1" storage_create_bucket_dual_region.create_bucket_dual_region( - test_bucket_create.name, region_1, region_2 + test_bucket_create.name, location, region_1, region_2 ) out, _ = capsys.readouterr() assert f"Bucket {test_bucket_create.name} created in {region_1}+{region_2}" in out diff --git a/samples/snippets/storage_create_bucket_dual_region.py b/samples/snippets/storage_create_bucket_dual_region.py index e6f4ac01f..061f4c1db 100644 --- a/samples/snippets/storage_create_bucket_dual_region.py +++ b/samples/snippets/storage_create_bucket_dual_region.py @@ -24,8 +24,8 @@ from google.cloud import storage -def create_bucket_dual_region(bucket_name, region_1, region_2): - """Creates a Dual-Region Bucket with provided locations.""" +def create_bucket_dual_region(bucket_name, location, region_1, region_2): + """Creates a Dual-Region Bucket with provided location and regions..""" # The ID of your GCS bucket # bucket_name = "your-bucket-name" @@ -34,9 +34,10 @@ def create_bucket_dual_region(bucket_name, region_1, region_2): # https://cloud.google.com/storage/docs/locations # region_1 = "US-EAST1" # region_2 = "US-WEST1" + # location = "US" storage_client = storage.Client() - storage_client.create_bucket(bucket_name, location=f"{region_1}+{region_2}") + storage_client.create_bucket(bucket_name, location=location, data_locations=[region_1, region_2]) print(f"Bucket {bucket_name} created in {region_1}+{region_2}.") @@ -46,5 +47,5 @@ def create_bucket_dual_region(bucket_name, region_1, region_2): if __name__ == "__main__": create_bucket_dual_region( - bucket_name=sys.argv[1], region_1=sys.argv[2], region_2=sys.argv[3] + bucket_name=sys.argv[1], location=sys.argv[2], region_1=sys.argv[3], region_2=sys.argv[4] ) diff --git a/tests/system/test_client.py b/tests/system/test_client.py index 9d9526a03..db912561d 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -68,21 +68,21 @@ def test_create_bucket_dual_region(storage_client, buckets_to_delete): from google.cloud.storage.constants import DUAL_REGION_LOCATION_TYPE new_bucket_name = _helpers.unique_name("dual-region-bucket") - region_1 = "US-EAST1" - region_2 = "US-WEST1" - dual_region = f"{region_1}+{region_2}" + location = "US" + data_locations = ["US-EAST1", "US-WEST1"] with pytest.raises(exceptions.NotFound): storage_client.get_bucket(new_bucket_name) created = _helpers.retry_429_503(storage_client.create_bucket)( - new_bucket_name, location=dual_region + new_bucket_name, location=location, data_locations=data_locations ) buckets_to_delete.append(created) assert created.name == new_bucket_name - assert created.location == dual_region + assert created.location == location assert created.location_type == DUAL_REGION_LOCATION_TYPE + assert created.data_locations == data_locations def test_list_buckets(storage_client, buckets_to_delete): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 07d1b0655..6769f3020 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1451,6 +1451,44 @@ def test_create_bucket_w_explicit_location(self): _target_object=bucket, ) + def test_create_bucket_w_custom_dual_region(self): + project = "PROJECT" + bucket_name = "bucket-name" + location = "US" + data_locations = ["US-EAST1", "US-WEST1"] + api_response = { + "location": location, + "customPlacementConfig": {"dataLocations": data_locations}, + "name": bucket_name, + } + credentials = _make_credentials() + client = self._make_one(project=project, credentials=credentials) + client._post_resource = mock.Mock() + client._post_resource.return_value = api_response + + bucket = client.create_bucket( + bucket_name, location=location, data_locations=data_locations + ) + + self.assertEqual(bucket.location, location) + self.assertEqual(bucket.data_locations, data_locations) + + expected_path = "/b" + expected_data = { + "location": location, + "customPlacementConfig": {"dataLocations": data_locations}, + "name": bucket_name, + } + expected_query_params = {"project": project} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=bucket, + ) + def test_create_bucket_w_explicit_project(self): project = "PROJECT" other_project = "other-project-123" From 060152bec82349ce9089a219cb518524722662ca Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 13 Jul 2022 22:36:49 -0400 Subject: [PATCH 069/509] chore(python): allow client documentation to be customized in README (#827) Source-Link: https://github.com/googleapis/synthtool/commit/95d9289ac3dc1ca2edae06619c82fe7a24d555f1 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:c8878270182edaab99f2927969d4f700c3af265accd472c3425deedff2b7fd93 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- README.rst | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 1ce608523..58fcbeeed 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:e7bb19d47c13839fe8c147e50e02e8b6cf5da8edd1af8b82208cd6f66cc2829c -# created: 2022-07-05T18:31:20.838186805Z + digest: sha256:c8878270182edaab99f2927969d4f700c3af265accd472c3425deedff2b7fd93 +# created: 2022-07-14T01:58:16.015625351Z diff --git a/README.rst b/README.rst index 02d2b7461..3b2f84736 100644 --- a/README.rst +++ b/README.rst @@ -55,18 +55,22 @@ Code samples and snippets live in the `samples/` folder. Supported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^ -Our client libraries are compatible with all current [active](https://devguide.python.org/devcycle/#in-development-main-branch) and [maintenance](https://devguide.python.org/devcycle/#maintenance-branches) versions of +Our client libraries are compatible with all current `active`_ and `maintenance`_ versions of Python. Python >= 3.7 +.. _active: https://devguide.python.org/devcycle/#in-development-main-branch +.. _maintenance: https://devguide.python.org/devcycle/#maintenance-branches + Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Python <= 3.6 -If you are using an [end-of-life](https://devguide.python.org/devcycle/#end-of-life-branches) +If you are using an `end-of-life`_ version of Python, we recommend that you update as soon as possible to an actively supported version. +.. _end-of-life: https://devguide.python.org/devcycle/#end-of-life-branches Mac/Linux ^^^^^^^^^ From 5e06dc02f54fb54f4d1dbd61d273ffcd96fdd112 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 19 Jul 2022 15:30:51 +0200 Subject: [PATCH 070/509] chore(deps): update dependency backoff to v2.1.2 (#811) Co-authored-by: Leah E. Cole <6719667+leahecole@users.noreply.github.com> Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index ed8c5dde8..077bdf929 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.1.2 mock==4.0.3 -backoff==2.1.0 \ No newline at end of file +backoff==2.1.2 \ No newline at end of file From 4bd3d1ddf21196b075bbd84cdcb553c5d7355b93 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 22 Jul 2022 05:28:12 -0700 Subject: [PATCH 071/509] docs: open file-like objects in byte mode for uploads (#824) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit File-like objects should be opened in binary mode for `blob.upload_from_file()` - cpython standard library accorded with [RFC 2616 Section 3.7.1](https://datatracker.ietf.org/doc/html/rfc2616#section-3.7.1) states the text default charset of iso-8859-1 - add clarifying notes in docstring - update code sample Fixes #818 🦕 --- google/cloud/storage/blob.py | 2 +- samples/snippets/storage_upload_from_stream.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index f47c09181..205d4aeb2 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -2456,7 +2456,7 @@ def upload_from_file( to that project. :type file_obj: file - :param file_obj: A file handle open for reading. + :param file_obj: A file handle opened in binary mode for reading. :type rewind: bool :param rewind: diff --git a/samples/snippets/storage_upload_from_stream.py b/samples/snippets/storage_upload_from_stream.py index e2d31a5e3..08eb25889 100644 --- a/samples/snippets/storage_upload_from_stream.py +++ b/samples/snippets/storage_upload_from_stream.py @@ -25,8 +25,8 @@ def upload_blob_from_stream(bucket_name, file_obj, destination_blob_name): # The stream or file (file-like object) from which to read # import io - # file_obj = io.StringIO() - # file_obj.write("This is test data.") + # file_obj = io.BytesIO() + # file_obj.write(b"This is test data.") # The desired name of the uploaded GCS object (blob) # destination_blob_name = "storage-object-name" From 77dcfe7777619d2895bf6b61f0ac2cdaf281629e Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Sun, 24 Jul 2022 14:46:29 +0200 Subject: [PATCH 072/509] chore(deps): update dependency pandas to v1.4.3 (#820) Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 7764b4153..fe1ba5907 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.1 google-cloud-storage==2.4.0 pandas===1.3.5; python_version == '3.7' -pandas==1.4.2; python_version >= '3.8' +pandas==1.4.3; python_version >= '3.8' From a8023faf8644cb0ff78be9543d5e5bbaeb910203 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 09:31:08 -0700 Subject: [PATCH 073/509] chore(main): release 2.5.0 (#825) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bc2a1ea9..5c312a242 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.5.0](https://github.com/googleapis/python-storage/compare/v2.4.0...v2.5.0) (2022-07-24) + + +### Features + +* Custom Placement Config Dual Region Support ([#819](https://github.com/googleapis/python-storage/issues/819)) ([febece7](https://github.com/googleapis/python-storage/commit/febece76802252278bb7626d931973a76561382a)) + + +### Documentation + +* open file-like objects in byte mode for uploads ([#824](https://github.com/googleapis/python-storage/issues/824)) ([4bd3d1d](https://github.com/googleapis/python-storage/commit/4bd3d1ddf21196b075bbd84cdcb553c5d7355b93)) + ## [2.4.0](https://github.com/googleapis/python-storage/compare/v2.3.0...v2.4.0) (2022-06-07) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index fe11624d9..5836d8051 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.4.0" +__version__ = "2.5.0" From 0b8eb058920daa2882568793ec47b7648593e15e Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 5 Aug 2022 19:06:47 +0200 Subject: [PATCH 074/509] chore(deps): update dependency google-cloud-storage to v2.5.0 (#830) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index fe1ba5907..29ee2d106 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.1 -google-cloud-storage==2.4.0 +google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.3; python_version >= '3.8' From 5fa1947c8688139c46bf4df60a099f48d5070f44 Mon Sep 17 00:00:00 2001 From: Frank Natividad Date: Fri, 5 Aug 2022 18:14:26 -0700 Subject: [PATCH 075/509] chore: delete benchwrapper obselete and unmaintained (#833) Project never made it out of prototype phase and we are moving away from this testing method in general. If we do come back to it; this code will still be too old / unmaintained. Co-authored-by: cojenco --- tests/perf/benchwrapper/README.md | 21 -- tests/perf/benchwrapper/benchwrapper.py | 54 ----- tests/perf/benchwrapper/storage.proto | 43 ---- tests/perf/benchwrapper/storage_pb2.py | 252 -------------------- tests/perf/benchwrapper/storage_pb2_grpc.py | 62 ----- 5 files changed, 432 deletions(-) delete mode 100644 tests/perf/benchwrapper/README.md delete mode 100644 tests/perf/benchwrapper/benchwrapper.py delete mode 100644 tests/perf/benchwrapper/storage.proto delete mode 100644 tests/perf/benchwrapper/storage_pb2.py delete mode 100644 tests/perf/benchwrapper/storage_pb2_grpc.py diff --git a/tests/perf/benchwrapper/README.md b/tests/perf/benchwrapper/README.md deleted file mode 100644 index e77589f61..000000000 --- a/tests/perf/benchwrapper/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# storage benchwrapp - -main.py is a gRPC wrapper around the storage library for benchmarking purposes. - -## Running - -```bash -$ export STORAGE_EMULATOR_HOST=http://localhost:8080 -$ pip install grpcio -$ cd storage -$ pip install -e . # install google.cloud.storage locally -$ cd tests/perf -$ python3 benchwrapper.py --port 8081 -``` - -## Re-generating protos - -```bash -$ pip install grpcio-tools -$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. *.proto -``` diff --git a/tests/perf/benchwrapper/benchwrapper.py b/tests/perf/benchwrapper/benchwrapper.py deleted file mode 100644 index c81d6bb20..000000000 --- a/tests/perf/benchwrapper/benchwrapper.py +++ /dev/null @@ -1,54 +0,0 @@ -import argparse -import sys -import time -import grpc -from concurrent import futures -import storage_pb2_grpc -import storage_pb2 -from google.cloud import storage - -_ONE_DAY_IN_SECONDS = 60 * 60 * 24 - -parser = argparse.ArgumentParser() - -# if os.environ.get("STORAGE_EMULATOR_HOST") is None: -# sys.exit( -# "This benchmarking server only works when connected to an emulator. Please set STORAGE_EMULATOR_HOST." -# ) - -parser.add_argument("--port", help="The port to run on.") - -args = parser.parse_args() - -if args.port is None: - sys.exit("Usage: python3 main.py --port 8081") - -# client = storage.Client.create_anonymous_client() -client = storage.Client() - - -class StorageBenchWrapperServicer(storage_pb2_grpc.StorageBenchWrapperServicer): - def Write(self, request, context): - # TODO(deklerk): implement this - return storage_pb2.EmptyResponse() - - def Read(self, request, context): - bucket = client.bucket(request.bucketName) - blob = storage.Blob(request.objectName, bucket) - blob.download_as_string() - return storage_pb2.EmptyResponse() - - -server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) -storage_pb2_grpc.add_StorageBenchWrapperServicer_to_server( - StorageBenchWrapperServicer(), server -) - -print("listening on localhost:" + args.port) -server.add_insecure_port("[::]:" + args.port) -server.start() -try: - while True: - time.sleep(_ONE_DAY_IN_SECONDS) -except KeyboardInterrupt: - server.stop(0) diff --git a/tests/perf/benchwrapper/storage.proto b/tests/perf/benchwrapper/storage.proto deleted file mode 100644 index 055e7e786..000000000 --- a/tests/perf/benchwrapper/storage.proto +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package storage_bench; - -message ObjectRead{ - // The bucket string identifier. - string bucketName = 1; - // The object/blob string identifier. - string objectName = 2; -} - -message ObjectWrite{ - // The bucket string identifier. - string bucketName = 1; - // The object/blob string identifiers. - string objectName = 2; - // The string containing the upload file path. - string destination = 3; -} - -message EmptyResponse{ -} - -service StorageBenchWrapper{ - // Performs an upload from a specific object. - rpc Write(ObjectWrite) returns (EmptyResponse) {} - // Read a specific object. - rpc Read(ObjectRead) returns (EmptyResponse){} -} \ No newline at end of file diff --git a/tests/perf/benchwrapper/storage_pb2.py b/tests/perf/benchwrapper/storage_pb2.py deleted file mode 100644 index 59ea52f91..000000000 --- a/tests/perf/benchwrapper/storage_pb2.py +++ /dev/null @@ -1,252 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: storage.proto - -import sys - -_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode("latin1")) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -DESCRIPTOR = _descriptor.FileDescriptor( - name="storage.proto", - package="storage_bench", - syntax="proto3", - serialized_options=None, - serialized_pb=_b( - '\n\rstorage.proto\x12\rstorage_bench"4\n\nObjectRead\x12\x12\n\nbucketName\x18\x01 \x01(\t\x12\x12\n\nobjectName\x18\x02 \x01(\t"J\n\x0bObjectWrite\x12\x12\n\nbucketName\x18\x01 \x01(\t\x12\x12\n\nobjectName\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\t"\x0f\n\rEmptyResponse2\x9d\x01\n\x13StorageBenchWrapper\x12\x43\n\x05Write\x12\x1a.storage_bench.ObjectWrite\x1a\x1c.storage_bench.EmptyResponse"\x00\x12\x41\n\x04Read\x12\x19.storage_bench.ObjectRead\x1a\x1c.storage_bench.EmptyResponse"\x00\x62\x06proto3' - ), -) - - -_OBJECTREAD = _descriptor.Descriptor( - name="ObjectRead", - full_name="storage_bench.ObjectRead", - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name="bucketName", - full_name="storage_bench.ObjectRead.bucketName", - index=0, - number=1, - type=9, - cpp_type=9, - label=1, - has_default_value=False, - default_value=_b("").decode("utf-8"), - message_type=None, - enum_type=None, - containing_type=None, - is_extension=False, - extension_scope=None, - serialized_options=None, - file=DESCRIPTOR, - ), - _descriptor.FieldDescriptor( - name="objectName", - full_name="storage_bench.ObjectRead.objectName", - index=1, - number=2, - type=9, - cpp_type=9, - label=1, - has_default_value=False, - default_value=_b("").decode("utf-8"), - message_type=None, - enum_type=None, - containing_type=None, - is_extension=False, - extension_scope=None, - serialized_options=None, - file=DESCRIPTOR, - ), - ], - extensions=[], - nested_types=[], - enum_types=[], - serialized_options=None, - is_extendable=False, - syntax="proto3", - extension_ranges=[], - oneofs=[], - serialized_start=32, - serialized_end=84, -) - - -_OBJECTWRITE = _descriptor.Descriptor( - name="ObjectWrite", - full_name="storage_bench.ObjectWrite", - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name="bucketName", - full_name="storage_bench.ObjectWrite.bucketName", - index=0, - number=1, - type=9, - cpp_type=9, - label=1, - has_default_value=False, - default_value=_b("").decode("utf-8"), - message_type=None, - enum_type=None, - containing_type=None, - is_extension=False, - extension_scope=None, - serialized_options=None, - file=DESCRIPTOR, - ), - _descriptor.FieldDescriptor( - name="objectName", - full_name="storage_bench.ObjectWrite.objectName", - index=1, - number=2, - type=9, - cpp_type=9, - label=1, - has_default_value=False, - default_value=_b("").decode("utf-8"), - message_type=None, - enum_type=None, - containing_type=None, - is_extension=False, - extension_scope=None, - serialized_options=None, - file=DESCRIPTOR, - ), - _descriptor.FieldDescriptor( - name="destination", - full_name="storage_bench.ObjectWrite.destination", - index=2, - number=3, - type=9, - cpp_type=9, - label=1, - has_default_value=False, - default_value=_b("").decode("utf-8"), - message_type=None, - enum_type=None, - containing_type=None, - is_extension=False, - extension_scope=None, - serialized_options=None, - file=DESCRIPTOR, - ), - ], - extensions=[], - nested_types=[], - enum_types=[], - serialized_options=None, - is_extendable=False, - syntax="proto3", - extension_ranges=[], - oneofs=[], - serialized_start=86, - serialized_end=160, -) - - -_EMPTYRESPONSE = _descriptor.Descriptor( - name="EmptyResponse", - full_name="storage_bench.EmptyResponse", - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[], - extensions=[], - nested_types=[], - enum_types=[], - serialized_options=None, - is_extendable=False, - syntax="proto3", - extension_ranges=[], - oneofs=[], - serialized_start=162, - serialized_end=177, -) - -DESCRIPTOR.message_types_by_name["ObjectRead"] = _OBJECTREAD -DESCRIPTOR.message_types_by_name["ObjectWrite"] = _OBJECTWRITE -DESCRIPTOR.message_types_by_name["EmptyResponse"] = _EMPTYRESPONSE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ObjectRead = _reflection.GeneratedProtocolMessageType( - "ObjectRead", - (_message.Message,), - { - "DESCRIPTOR": _OBJECTREAD, - "__module__": "storage_pb2" - # @@protoc_insertion_point(class_scope:storage_bench.ObjectRead) - }, -) -_sym_db.RegisterMessage(ObjectRead) - -ObjectWrite = _reflection.GeneratedProtocolMessageType( - "ObjectWrite", - (_message.Message,), - { - "DESCRIPTOR": _OBJECTWRITE, - "__module__": "storage_pb2" - # @@protoc_insertion_point(class_scope:storage_bench.ObjectWrite) - }, -) -_sym_db.RegisterMessage(ObjectWrite) - -EmptyResponse = _reflection.GeneratedProtocolMessageType( - "EmptyResponse", - (_message.Message,), - { - "DESCRIPTOR": _EMPTYRESPONSE, - "__module__": "storage_pb2" - # @@protoc_insertion_point(class_scope:storage_bench.EmptyResponse) - }, -) -_sym_db.RegisterMessage(EmptyResponse) - - -_STORAGEBENCHWRAPPER = _descriptor.ServiceDescriptor( - name="StorageBenchWrapper", - full_name="storage_bench.StorageBenchWrapper", - file=DESCRIPTOR, - index=0, - serialized_options=None, - serialized_start=180, - serialized_end=337, - methods=[ - _descriptor.MethodDescriptor( - name="Write", - full_name="storage_bench.StorageBenchWrapper.Write", - index=0, - containing_service=None, - input_type=_OBJECTWRITE, - output_type=_EMPTYRESPONSE, - serialized_options=None, - ), - _descriptor.MethodDescriptor( - name="Read", - full_name="storage_bench.StorageBenchWrapper.Read", - index=1, - containing_service=None, - input_type=_OBJECTREAD, - output_type=_EMPTYRESPONSE, - serialized_options=None, - ), - ], -) -_sym_db.RegisterServiceDescriptor(_STORAGEBENCHWRAPPER) - -DESCRIPTOR.services_by_name["StorageBenchWrapper"] = _STORAGEBENCHWRAPPER - -# @@protoc_insertion_point(module_scope) diff --git a/tests/perf/benchwrapper/storage_pb2_grpc.py b/tests/perf/benchwrapper/storage_pb2_grpc.py deleted file mode 100644 index 913c40558..000000000 --- a/tests/perf/benchwrapper/storage_pb2_grpc.py +++ /dev/null @@ -1,62 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -import grpc - -import storage_pb2 as storage__pb2 - - -class StorageBenchWrapperStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Write = channel.unary_unary( - "/storage_bench.StorageBenchWrapper/Write", - request_serializer=storage__pb2.ObjectWrite.SerializeToString, - response_deserializer=storage__pb2.EmptyResponse.FromString, - ) - self.Read = channel.unary_unary( - "/storage_bench.StorageBenchWrapper/Read", - request_serializer=storage__pb2.ObjectRead.SerializeToString, - response_deserializer=storage__pb2.EmptyResponse.FromString, - ) - - -class StorageBenchWrapperServicer(object): - # missing associated documentation comment in .proto file - pass - - def Write(self, request, context): - """Performs an upload from a specific object.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def Read(self, request, context): - """Read a specific object.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - -def add_StorageBenchWrapperServicer_to_server(servicer, server): - rpc_method_handlers = { - "Write": grpc.unary_unary_rpc_method_handler( - servicer.Write, - request_deserializer=storage__pb2.ObjectWrite.FromString, - response_serializer=storage__pb2.EmptyResponse.SerializeToString, - ), - "Read": grpc.unary_unary_rpc_method_handler( - servicer.Read, - request_deserializer=storage__pb2.ObjectRead.FromString, - response_serializer=storage__pb2.EmptyResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - "storage_bench.StorageBenchWrapper", rpc_method_handlers - ) - server.add_generic_rpc_handlers((generic_handler,)) From ef74c3de6fcd894d2511f716d81bbedc21fef2b7 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 10 Aug 2022 09:13:51 -0700 Subject: [PATCH 076/509] tests: unflake system tests ensure config changes are propagated (#836) * tests: unflake system tests ensure config changes are propagated * avoid rate limits by using uuid --- tests/system/_helpers.py | 28 +++++++++++++++++++-- tests/system/test_blob.py | 49 +++++++++++++++++++------------------ tests/system/test_bucket.py | 14 ++++++++--- 3 files changed, 62 insertions(+), 29 deletions(-) diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index 70c1f2a5d..a1f8c38b9 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -46,9 +46,33 @@ def _has_kms_key_name(blob): return blob.kms_key_name is not None +def _has_retention_expiration(blob): + return blob.retention_expiration_time is not None + + +def _no_retention_expiration(blob): + return blob.retention_expiration_time is None + + +def _has_retetion_period(bucket): + return bucket.retention_period is not None + + +def _no_retetion_period(bucket): + return bucket.retention_period is None + + retry_bad_copy = RetryErrors(exceptions.BadRequest, error_predicate=_bad_copy) -retry_no_event_based_hold = RetryInstanceState(_no_event_based_hold) -retry_has_kms_key_name = RetryInstanceState(_has_kms_key_name) +retry_no_event_based_hold = RetryInstanceState(_no_event_based_hold, max_tries=10) +retry_has_kms_key_name = RetryInstanceState(_has_kms_key_name, max_tries=10) +retry_has_retention_expiration = RetryInstanceState( + _has_retention_expiration, max_tries=10 +) +retry_no_retention_expiration = RetryInstanceState( + _no_retention_expiration, max_tries=10 +) +retry_has_retention_period = RetryInstanceState(_has_retetion_period, max_tries=10) +retry_no_retention_period = RetryInstanceState(_no_retetion_period, max_tries=10) def unique_name(prefix): diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 773dbdf81..5046159fd 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -17,6 +17,7 @@ import io import os import tempfile +import uuid import warnings import pytest @@ -44,7 +45,7 @@ def test_large_file_write_from_stream( file_data, service_account, ): - blob = shared_bucket.blob("LargeFile") + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") info = file_data["big"] with open(info["path"], "rb") as file_obj: @@ -60,7 +61,7 @@ def test_large_file_write_from_stream_w_checksum( file_data, service_account, ): - blob = shared_bucket.blob("LargeFile") + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") info = file_data["big"] with open(info["path"], "rb") as file_obj: @@ -76,7 +77,7 @@ def test_large_file_write_from_stream_w_failed_checksum( file_data, service_account, ): - blob = shared_bucket.blob("LargeFile") + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") # Intercept the digest processing at the last stage and replace it # with garbage. This is done with a patch to monkey-patch the @@ -128,7 +129,7 @@ def test_small_file_write_from_filename( file_data, service_account, ): - blob = shared_bucket.blob("SmallFile") + blob = shared_bucket.blob(f"SmallFile{uuid.uuid4().hex}") info = file_data["simple"] blob.upload_from_filename(info["path"]) @@ -143,7 +144,7 @@ def test_small_file_write_from_filename_with_checksum( file_data, service_account, ): - blob = shared_bucket.blob("SmallFile") + blob = shared_bucket.blob(f"SmallFile{uuid.uuid4().hex}") info = file_data["simple"] blob.upload_from_filename(info["path"], checksum="crc32c") @@ -158,7 +159,7 @@ def test_small_file_write_from_filename_with_failed_checksum( file_data, service_account, ): - blob = shared_bucket.blob("SmallFile") + blob = shared_bucket.blob(f"SmallFile{uuid.uuid4().hex}") info = file_data["simple"] # Intercept the digest processing at the last stage and replace @@ -381,7 +382,7 @@ def test_blob_acl_w_user_project( with_user_project = storage_client.bucket( shared_bucket.name, user_project=user_project ) - blob = with_user_project.blob("SmallFile") + blob = with_user_project.blob(f"SmallFile{uuid.uuid4().hex}") info = file_data["simple"] @@ -444,10 +445,10 @@ def test_blob_acl_upload_predefined( file_data, service_account, ): - control = shared_bucket.blob("logo") + control = shared_bucket.blob(f"logo{uuid.uuid4().hex}") control_info = file_data["logo"] - blob = shared_bucket.blob("SmallFile") + blob = shared_bucket.blob(f"SmallFile{uuid.uuid4().hex}") info = file_data["simple"] try: @@ -649,7 +650,7 @@ def test_blob_upload_from_file_resumable_with_generation( file_data, service_account, ): - blob = shared_bucket.blob("LargeFile") + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") wrong_generation = 3 wrong_meta_generation = 3 @@ -826,13 +827,13 @@ def test_blob_compose_new_blob_wo_content_type(shared_bucket, blobs_to_delete): def test_blob_compose_replace_existing_blob(shared_bucket, blobs_to_delete): payload_before = b"AAA\n" - original = shared_bucket.blob("original") + original = shared_bucket.blob(uuid.uuid4().hex) original.content_type = "text/plain" original.upload_from_string(payload_before) blobs_to_delete.append(original) payload_to_append = b"BBB\n" - to_append = shared_bucket.blob("to_append") + to_append = shared_bucket.blob(uuid.uuid4().hex) to_append.upload_from_string(payload_to_append) blobs_to_delete.append(to_append) @@ -843,7 +844,7 @@ def test_blob_compose_replace_existing_blob(shared_bucket, blobs_to_delete): def test_blob_compose_w_generation_match_list(shared_bucket, blobs_to_delete): payload_before = b"AAA\n" - original = shared_bucket.blob("original") + original = shared_bucket.blob(uuid.uuid4().hex) original.content_type = "text/plain" original.upload_from_string(payload_before) blobs_to_delete.append(original) @@ -851,7 +852,7 @@ def test_blob_compose_w_generation_match_list(shared_bucket, blobs_to_delete): wrong_metagenerations = [8, 9] payload_to_append = b"BBB\n" - to_append = shared_bucket.blob("to_append") + to_append = shared_bucket.blob(uuid.uuid4().hex) to_append.upload_from_string(payload_to_append) blobs_to_delete.append(to_append) @@ -877,13 +878,13 @@ def test_blob_compose_w_generation_match_list(shared_bucket, blobs_to_delete): def test_blob_compose_w_generation_match_long(shared_bucket, blobs_to_delete): payload_before = b"AAA\n" - original = shared_bucket.blob("original") + original = shared_bucket.blob(uuid.uuid4().hex) original.content_type = "text/plain" original.upload_from_string(payload_before) blobs_to_delete.append(original) payload_to_append = b"BBB\n" - to_append = shared_bucket.blob("to_append") + to_append = shared_bucket.blob(uuid.uuid4().hex) to_append.upload_from_string(payload_to_append) blobs_to_delete.append(to_append) @@ -897,14 +898,14 @@ def test_blob_compose_w_generation_match_long(shared_bucket, blobs_to_delete): def test_blob_compose_w_source_generation_match(shared_bucket, blobs_to_delete): payload_before = b"AAA\n" - original = shared_bucket.blob("original") + original = shared_bucket.blob(uuid.uuid4().hex) original.content_type = "text/plain" original.upload_from_string(payload_before) blobs_to_delete.append(original) wrong_source_generations = [6, 7] payload_to_append = b"BBB\n" - to_append = shared_bucket.blob("to_append") + to_append = shared_bucket.blob(uuid.uuid4().hex) to_append.upload_from_string(payload_to_append) blobs_to_delete.append(to_append) @@ -929,18 +930,18 @@ def test_blob_compose_w_user_project(storage_client, buckets_to_delete, user_pro created.requester_pays = True payload_1 = b"AAA\n" - source_1 = created.blob("source-1") + source_1 = created.blob(uuid.uuid4().hex) source_1.upload_from_string(payload_1) payload_2 = b"BBB\n" - source_2 = created.blob("source-2") + source_2 = created.blob(uuid.uuid4().hex) source_2.upload_from_string(payload_2) with_user_project = storage_client.bucket( new_bucket_name, user_project=user_project ) - destination = with_user_project.blob("destination") + destination = with_user_project.blob(uuid.uuid4().hex) destination.content_type = "text/plain" destination.compose([source_1, source_2]) @@ -949,13 +950,13 @@ def test_blob_compose_w_user_project(storage_client, buckets_to_delete, user_pro def test_blob_rewrite_new_blob_add_key(shared_bucket, blobs_to_delete, file_data): info = file_data["simple"] - source = shared_bucket.blob("source") + source = shared_bucket.blob(uuid.uuid4().hex) source.upload_from_filename(info["path"]) blobs_to_delete.append(source) source_data = source.download_as_bytes() key = os.urandom(32) - dest = shared_bucket.blob("dest", encryption_key=key) + dest = shared_bucket.blob(uuid.uuid4().hex, encryption_key=key) token, rewritten, total = dest.rewrite(source) blobs_to_delete.append(dest) @@ -1097,7 +1098,7 @@ def test_blob_update_storage_class_large_file( ): from google.cloud.storage import constants - blob = shared_bucket.blob("BigFile") + blob = shared_bucket.blob(f"BigFile{uuid.uuid4().hex}") info = file_data["big"] blob.upload_from_filename(info["path"]) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 062cc8998..054a29018 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -632,6 +632,10 @@ def test_bucket_w_retention_period( bucket.default_event_based_hold = False bucket.patch() + # Changes to the bucket will be readable immediately after writing, + # but configuration changes may take time to propagate. + _helpers.retry_has_retention_period(bucket.reload)() + assert bucket.retention_period == period_secs assert isinstance(bucket.retention_policy_effective_time, datetime.datetime) assert not bucket.default_event_based_hold @@ -645,6 +649,7 @@ def test_bucket_w_retention_period( blobs_to_delete.append(blob) other = bucket.get_blob(blob_name) + _helpers.retry_has_retention_expiration(other.reload)() assert not other.event_based_hold assert not other.temporary_hold @@ -656,12 +661,16 @@ def test_bucket_w_retention_period( bucket.retention_period = None bucket.patch() + # Changes to the bucket will be readable immediately after writing, + # but configuration changes may take time to propagate. + _helpers.retry_no_retention_period(bucket.reload)() + assert bucket.retention_period is None assert bucket.retention_policy_effective_time is None assert not bucket.default_event_based_hold assert not bucket.retention_policy_locked - _helpers.retry_no_event_based_hold(other.reload)() + _helpers.retry_no_retention_expiration(other.reload)() assert not other.event_based_hold assert not other.temporary_hold @@ -719,8 +728,7 @@ def test_bucket_w_default_event_based_hold( blob.upload_from_string(payload) # https://github.com/googleapis/python-storage/issues/435 - if blob.event_based_hold: - _helpers.retry_no_event_based_hold(blob.reload)() + _helpers.retry_no_event_based_hold(blob.reload)() assert not blob.event_based_hold assert not blob.temporary_hold From 681207c68c4ac9b47e28e4f84773d74d2c5a8999 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 10 Aug 2022 23:53:25 +0200 Subject: [PATCH 077/509] chore(deps): update dependency google-cloud-pubsub to v2.13.4 (#829) Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 29ee2d106..90c172cc5 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.1 +google-cloud-pubsub==2.13.4 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.3; python_version >= '3.8' From 4c92a9afa4be21f979b3f2693f706605128293ea Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 11 Aug 2022 02:25:35 +0200 Subject: [PATCH 078/509] chore(deps): update dependency google-cloud-pubsub to v2.13.5 (#839) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 90c172cc5..969019c8e 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.4 +google-cloud-pubsub==2.13.5 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.3; python_version >= '3.8' From 7101f47fde663eec4bbaaa246c7fe4e973ca2506 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 11 Aug 2022 12:06:10 -0700 Subject: [PATCH 079/509] docs: clarify prefixes entity in list_blobs and link sample (#837) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improve documentation as part of 294 - clarify `prefixes` entity exists as part of the response - add link to sample broswer ["List the objects in a bucket using a prefix filter"](https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix#storage_list_files_with_prefix-python) Fixes #294 🦕 --- google/cloud/storage/client.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index acf675fbe..05a64f57f 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1271,14 +1271,14 @@ def list_blobs( Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. - Example: - List blobs in the bucket with user_project. + As part of the response, you'll also get back an iterator.prefixes entity that lists object names + up to and including the requested delimiter. Duplicate entries are omitted from this list. - >>> from google.cloud import storage - >>> client = storage.Client() + .. note:: + List prefixes (directories) in a bucket using a prefix and delimiter. + See a [sample](https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix#storage_list_files_with_prefix-python) + listing objects using a prefix filter. - >>> bucket = storage.Bucket(client, "my-bucket-name", user_project="my-project") - >>> all_blobs = list(client.list_blobs(bucket)) """ bucket = self._bucket_arg_to_bucket(bucket_or_name) From 93b6f97c867a2c58446b8cf64ee37a806de62aa6 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 12 Aug 2022 13:11:10 +0200 Subject: [PATCH 080/509] chore(deps): update dependency google-cloud-pubsub to v2.13.6 (#842) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 969019c8e..16383115e 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.5 +google-cloud-pubsub==2.13.6 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.4.3; python_version >= '3.8' From 36fb81b5b0e5b7e65b9db434c997617136bfc3fc Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Fri, 12 Aug 2022 09:19:06 -0700 Subject: [PATCH 081/509] docs: Update docstring for lifecycle_rules to match generator behavior (#841) Co-authored-by: Anthonios Partheniou --- google/cloud/storage/bucket.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 5408b9373..8de001f8a 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2273,12 +2273,12 @@ def lifecycle_rules(self): .. note:: - The getter for this property returns a list which contains + The getter for this property returns a generator which yields *copies* of the bucket's lifecycle rules mappings. Mutating the - list or one of its dicts has no effect unless you then re-assign - the dict via the setter. E.g.: + output dicts has no effect unless you then re-assign the dict via + the setter. E.g.: - >>> rules = bucket.lifecycle_rules + >>> rules = list(bucket.lifecycle_rules) >>> rules.append({'origin': '/foo', ...}) >>> rules[1]['rule']['action']['type'] = 'Delete' >>> del rules[0] From 27f2641c7f6b24ff5e750490f87188e648a82a9e Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 12 Aug 2022 13:07:23 -0700 Subject: [PATCH 082/509] samples: update dual-region bucket creation sample output (#843) * samples: update dual-region bucket creation sample output * update snippet test --- samples/snippets/snippets_test.py | 6 +++++- samples/snippets/storage_create_bucket_dual_region.py | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index d0fefd488..bc126010b 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -442,7 +442,11 @@ def test_create_bucket_dual_region(test_bucket_create, capsys): test_bucket_create.name, location, region_1, region_2 ) out, _ = capsys.readouterr() - assert f"Bucket {test_bucket_create.name} created in {region_1}+{region_2}" in out + assert f"Created bucket {test_bucket_create.name}" in out + assert location in out + assert region_1 in out + assert region_2 in out + assert "dual-region" in out def test_bucket_delete_default_kms_key(test_bucket, capsys): diff --git a/samples/snippets/storage_create_bucket_dual_region.py b/samples/snippets/storage_create_bucket_dual_region.py index 061f4c1db..c5a78fa0f 100644 --- a/samples/snippets/storage_create_bucket_dual_region.py +++ b/samples/snippets/storage_create_bucket_dual_region.py @@ -37,9 +37,12 @@ def create_bucket_dual_region(bucket_name, location, region_1, region_2): # location = "US" storage_client = storage.Client() - storage_client.create_bucket(bucket_name, location=location, data_locations=[region_1, region_2]) + bucket = storage_client.create_bucket(bucket_name, location=location, data_locations=[region_1, region_2]) - print(f"Bucket {bucket_name} created in {region_1}+{region_2}.") + print(f"Created bucket {bucket_name}") + print(f" - location: {bucket.location}") + print(f" - location_type: {bucket.location_type}") + print(f" - customPlacementConfig data_locations: {bucket.data_locations}") # [END storage_create_bucket_dual_region] From 3da8b5853c04af8d0cbb67f024afd373c3777e6f Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 23 Aug 2022 10:50:12 -0700 Subject: [PATCH 083/509] chore: exclude `grpcio==1.49.0rc1` in system tests (#845) Unblock ci/cd by excluding pre-release version in question `1.49.0rc1` Update: https://github.com/grpc/grpc/pull/30642 fixes issue https://github.com/grpc/grpc/issues/30651 and https://github.com/grpc/grpc/issues/30640 Restore noxfile once the merged fix is released --- noxfile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index ac02aa1f5..ca14b42cc 100644 --- a/noxfile.py +++ b/noxfile.py @@ -129,7 +129,9 @@ def system(session): session.skip("System tests were not found") # Use pre-release gRPC for system tests. - session.install("--pre", "grpcio") + # TODO: Revert #845 once grpc issue fix is released. + # Pending grpc/grpc#30642 and grpc/grpc#30651. + session.install("--pre", "grpcio!=1.49.0rc1") # Install all test dependencies, then install this package into the # virtualenv's dist-packages. From 8fd4c376bd5f031836feb8101c9c0c0d1c2e969d Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 23 Aug 2022 12:04:15 -0700 Subject: [PATCH 084/509] feat: enable delete_blobs() to preserve generation (#840) This adds a flag `preserve_generation` to the method `bucket.delete_blobs()` - allows preserving and propagating blob generations when set to True (default False) - better ensures backwards compatibility with both `delete_blobs()` and `bucket.delete(force=True)` Fixes #814 --- google/cloud/storage/bucket.py | 15 +++++++++ tests/unit/test_bucket.py | 56 ++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 8de001f8a..6f133b923 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1698,6 +1698,7 @@ def delete_blobs( blobs, on_error=None, client=None, + preserve_generation=False, timeout=_DEFAULT_TIMEOUT, if_generation_match=None, if_generation_not_match=None, @@ -1709,6 +1710,10 @@ def delete_blobs( Uses :meth:`delete_blob` to delete each individual blob. + By default, any generation information in the list of blobs is ignored, and the + live versions of all blobs are deleted. Set `preserve_generation` to True + if blob generation should instead be propagated from the list of blobs. + If :attr:`user_project` is set, bills the API request to that project. :type blobs: list @@ -1725,6 +1730,12 @@ def delete_blobs( :param client: (Optional) The client to use. If not passed, falls back to the ``client`` stored on the current bucket. + :type preserve_generation: bool + :param preserve_generation: (Optional) Deletes only the generation specified on the blob object, + instead of the live version, if set to True. Only :class:~google.cloud.storage.blob.Blob + objects can have their generation set in this way. + Default: False. + :type if_generation_match: list of long :param if_generation_match: (Optional) See :ref:`using-if-generation-match` @@ -1787,11 +1798,15 @@ def delete_blobs( for blob in blobs: try: blob_name = blob + generation = None if not isinstance(blob_name, str): blob_name = blob.name + generation = blob.generation if preserve_generation else None + self.delete_blob( blob_name, client=client, + generation=generation, if_generation_match=next(if_generation_match, None), if_generation_not_match=next(if_generation_not_match, None), if_metageneration_match=next(if_metageneration_match, None), diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index d5206f287..5ff758758 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1490,6 +1490,7 @@ def test_delete_w_force_w_user_project_w_miss_on_blob(self): bucket.delete_blob.assert_called_once_with( blob_name, client=client, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -1649,6 +1650,7 @@ def test_delete_blobs_hit_w_explicit_client_w_timeout(self): bucket.delete_blob.assert_called_once_with( blob_name, client=client, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -1693,6 +1695,7 @@ def test_delete_blobs_w_generation_match_w_retry(self): call_1 = mock.call( blob_name, client=None, + generation=None, if_generation_match=generation_number, if_generation_not_match=None, if_metageneration_match=None, @@ -1703,6 +1706,7 @@ def test_delete_blobs_w_generation_match_w_retry(self): call_2 = mock.call( blob_name2, client=None, + generation=None, if_generation_match=generation_number2, if_generation_not_match=None, if_metageneration_match=None, @@ -1730,6 +1734,7 @@ def test_delete_blobs_w_generation_match_none(self): call_1 = mock.call( blob_name, client=None, + generation=None, if_generation_match=generation_number, if_generation_not_match=None, if_metageneration_match=None, @@ -1740,6 +1745,7 @@ def test_delete_blobs_w_generation_match_none(self): call_2 = mock.call( blob_name2, client=None, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -1749,6 +1755,52 @@ def test_delete_blobs_w_generation_match_none(self): ) bucket.delete_blob.assert_has_calls([call_1, call_2]) + def test_delete_blobs_w_preserve_generation(self): + name = "name" + blob_name = "blob-name" + blob_name2 = "blob-name2" + generation_number = 1234567890 + generation_number2 = 7890123456 + client = mock.Mock(spec=[]) + bucket = self._make_one(client=client, name=name) + blob = self._make_blob(bucket.name, blob_name) + blob.generation = generation_number + blob2 = self._make_blob(bucket.name, blob_name2) + blob2.generation = generation_number2 + bucket.delete_blob = mock.Mock() + retry = mock.Mock(spec=[]) + + # Test generation is propagated from list of blob instances + bucket.delete_blobs( + [blob, blob2], + preserve_generation=True, + retry=retry, + ) + + call_1 = mock.call( + blob_name, + client=None, + generation=generation_number, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=self._get_default_timeout(), + retry=retry, + ) + call_2 = mock.call( + blob_name2, + client=None, + generation=generation_number2, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=self._get_default_timeout(), + retry=retry, + ) + bucket.delete_blob.assert_has_calls([call_1, call_2]) + def test_delete_blobs_miss_wo_on_error(self): from google.cloud.exceptions import NotFound @@ -1766,6 +1818,7 @@ def test_delete_blobs_miss_wo_on_error(self): call_1 = mock.call( blob_name, client=None, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -1776,6 +1829,7 @@ def test_delete_blobs_miss_wo_on_error(self): call_2 = mock.call( blob_name2, client=None, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -1804,6 +1858,7 @@ def test_delete_blobs_miss_w_on_error(self): call_1 = mock.call( blob_name, client=None, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -1814,6 +1869,7 @@ def test_delete_blobs_miss_w_on_error(self): call_2 = mock.call( blob_name2, client=None, + generation=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, From e770f1b0355e22412114159b0558ad753ac9d28e Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 14:09:22 -0400 Subject: [PATCH 085/509] chore: remove 'pip install' statements from python_library templates [autoapprove] (#848) Source-Link: https://github.com/googleapis/synthtool/commit/69fabaee9eca28af7ecaa02c86895e606fbbebd6 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:562802bfac02e012a6ac34eda282f81d06e77326b82a32d7bbb1369ff552b387 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/publish-docs.sh | 4 +- .kokoro/release.sh | 5 +- .kokoro/requirements.in | 8 + .kokoro/requirements.txt | 464 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 476 insertions(+), 9 deletions(-) create mode 100644 .kokoro/requirements.in create mode 100644 .kokoro/requirements.txt diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 58fcbeeed..c6acdf3f9 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:c8878270182edaab99f2927969d4f700c3af265accd472c3425deedff2b7fd93 -# created: 2022-07-14T01:58:16.015625351Z + digest: sha256:562802bfac02e012a6ac34eda282f81d06e77326b82a32d7bbb1369ff552b387 +# created: 2022-08-24T17:07:22.006876712Z diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh index 8acb14e80..1c4d62370 100755 --- a/.kokoro/publish-docs.sh +++ b/.kokoro/publish-docs.sh @@ -21,14 +21,12 @@ export PYTHONUNBUFFERED=1 export PATH="${HOME}/.local/bin:${PATH}" # Install nox -python3 -m pip install --user --upgrade --quiet nox +python3 -m pip install --require-hashes -r .kokoro/requirements.txt python3 -m nox --version # build docs nox -s docs -python3 -m pip install --user gcp-docuploader - # create metadata python3 -m docuploader create-metadata \ --name=$(jq --raw-output '.name // empty' .repo-metadata.json) \ diff --git a/.kokoro/release.sh b/.kokoro/release.sh index 64a3c6ab3..61da01659 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -16,12 +16,9 @@ set -eo pipefail # Start the releasetool reporter -python3 -m pip install gcp-releasetool +python3 -m pip install --require-hashes -r .kokoro/requirements.txt python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script -# Ensure that we have the latest versions of Twine, Wheel, and Setuptools. -python3 -m pip install --upgrade twine wheel setuptools - # Disable buffering, so that the logs stream through. export PYTHONUNBUFFERED=1 diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in new file mode 100644 index 000000000..7718391a3 --- /dev/null +++ b/.kokoro/requirements.in @@ -0,0 +1,8 @@ +gcp-docuploader +gcp-releasetool +importlib-metadata +typing-extensions +twine +wheel +setuptools +nox \ No newline at end of file diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt new file mode 100644 index 000000000..c4b824f24 --- /dev/null +++ b/.kokoro/requirements.txt @@ -0,0 +1,464 @@ +# +# This file is autogenerated by pip-compile with python 3.10 +# To update, run: +# +# pip-compile --allow-unsafe --generate-hashes requirements.in +# +argcomplete==2.0.0 \ + --hash=sha256:6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20 \ + --hash=sha256:cffa11ea77999bb0dd27bb25ff6dc142a6796142f68d45b1a26b11f58724561e + # via nox +attrs==22.1.0 \ + --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ + --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c + # via gcp-releasetool +bleach==5.0.1 \ + --hash=sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a \ + --hash=sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c + # via readme-renderer +cachetools==5.2.0 \ + --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ + --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db + # via google-auth +certifi==2022.6.15 \ + --hash=sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d \ + --hash=sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412 + # via requests +cffi==1.15.1 \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 + # via cryptography +charset-normalizer==2.1.1 \ + --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ + --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f + # via requests +click==8.0.4 \ + --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \ + --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb + # via + # gcp-docuploader + # gcp-releasetool +colorlog==6.6.0 \ + --hash=sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8 \ + --hash=sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e + # via + # gcp-docuploader + # nox +commonmark==0.9.1 \ + --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ + --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 + # via rich +cryptography==37.0.4 \ + --hash=sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59 \ + --hash=sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596 \ + --hash=sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3 \ + --hash=sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5 \ + --hash=sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab \ + --hash=sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884 \ + --hash=sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82 \ + --hash=sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b \ + --hash=sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441 \ + --hash=sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa \ + --hash=sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d \ + --hash=sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b \ + --hash=sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a \ + --hash=sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6 \ + --hash=sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157 \ + --hash=sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280 \ + --hash=sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282 \ + --hash=sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67 \ + --hash=sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8 \ + --hash=sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046 \ + --hash=sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327 \ + --hash=sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9 + # via + # gcp-releasetool + # secretstorage +distlib==0.3.5 \ + --hash=sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe \ + --hash=sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c + # via virtualenv +docutils==0.19 \ + --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ + --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc + # via readme-renderer +filelock==3.8.0 \ + --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ + --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 + # via virtualenv +gcp-docuploader==0.6.3 \ + --hash=sha256:ba8c9d76b3bbac54b0311c503a373b00edc2dc02d6d54ea9507045adb8e870f7 \ + --hash=sha256:c0f5aaa82ce1854a386197e4e359b120ad6d4e57ae2c812fce42219a3288026b + # via -r requirements.in +gcp-releasetool==1.8.6 \ + --hash=sha256:42e51ab8e2e789bc8e22a03c09352962cd3452951c801a2230d564816630304a \ + --hash=sha256:a3518b79d1b243c494eac392a01c7fd65187fd6d52602dcab9b529bc934d4da1 + # via -r requirements.in +google-api-core==2.8.2 \ + --hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \ + --hash=sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50 + # via + # google-cloud-core + # google-cloud-storage +google-auth==2.11.0 \ + --hash=sha256:be62acaae38d0049c21ca90f27a23847245c9f161ff54ede13af2cb6afecbac9 \ + --hash=sha256:ed65ecf9f681832298e29328e1ef0a3676e3732b2e56f41532d45f70a22de0fb + # via + # gcp-releasetool + # google-api-core + # google-cloud-core + # google-cloud-storage +google-cloud-core==2.3.2 \ + --hash=sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe \ + --hash=sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a + # via google-cloud-storage +google-cloud-storage==2.5.0 \ + --hash=sha256:19a26c66c317ce542cea0830b7e787e8dac2588b6bfa4d3fd3b871ba16305ab0 \ + --hash=sha256:382f34b91de2212e3c2e7b40ec079d27ee2e3dbbae99b75b1bcd8c63063ce235 + # via gcp-docuploader +google-crc32c==1.3.0 \ + --hash=sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3 \ + --hash=sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6 \ + --hash=sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206 \ + --hash=sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422 \ + --hash=sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a \ + --hash=sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e \ + --hash=sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0 \ + --hash=sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df \ + --hash=sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407 \ + --hash=sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea \ + --hash=sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48 \ + --hash=sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713 \ + --hash=sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3 \ + --hash=sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267 \ + --hash=sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829 \ + --hash=sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2 \ + --hash=sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a \ + --hash=sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183 \ + --hash=sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942 \ + --hash=sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59 \ + --hash=sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b \ + --hash=sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd \ + --hash=sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c \ + --hash=sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02 \ + --hash=sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328 \ + --hash=sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08 \ + --hash=sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f \ + --hash=sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168 \ + --hash=sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318 \ + --hash=sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d \ + --hash=sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73 \ + --hash=sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4 \ + --hash=sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812 \ + --hash=sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3 \ + --hash=sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d \ + --hash=sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e \ + --hash=sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217 \ + --hash=sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e \ + --hash=sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f \ + --hash=sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125 \ + --hash=sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4 \ + --hash=sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b \ + --hash=sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3 + # via google-resumable-media +google-resumable-media==2.3.3 \ + --hash=sha256:27c52620bd364d1c8116eaac4ea2afcbfb81ae9139fb3199652fcac1724bfb6c \ + --hash=sha256:5b52774ea7a829a8cdaa8bd2d4c3d4bc660c91b30857ab2668d0eb830f4ea8c5 + # via google-cloud-storage +googleapis-common-protos==1.56.4 \ + --hash=sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394 \ + --hash=sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417 + # via google-api-core +idna==3.3 \ + --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ + --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d + # via requests +importlib-metadata==4.12.0 \ + --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ + --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 + # via + # -r requirements.in + # twine +jeepney==0.8.0 \ + --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + # via + # keyring + # secretstorage +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 + # via gcp-releasetool +keyring==23.8.2 \ + --hash=sha256:0d9973f8891850f1ade5f26aafd06bb16865fbbae3fc56b0defb6a14a2624003 \ + --hash=sha256:10d2a8639663fe2090705a00b8c47c687cacdf97598ea9c11456679fa974473a + # via + # gcp-releasetool + # twine +markupsafe==2.1.1 \ + --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ + --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ + --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ + --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ + --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ + --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ + --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ + --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ + --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ + --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ + --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ + --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ + --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ + --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ + --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ + --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ + --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ + --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \ + --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ + --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ + --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ + --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ + --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ + --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ + --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ + --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ + --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ + --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ + --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ + --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ + --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ + --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ + --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ + --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ + --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ + --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ + --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ + --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ + --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ + --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 + # via jinja2 +nox==2022.8.7 \ + --hash=sha256:1b894940551dc5c389f9271d197ca5d655d40bdc6ccf93ed6880e4042760a34b \ + --hash=sha256:96cca88779e08282a699d672258ec01eb7c792d35bbbf538c723172bce23212c + # via -r requirements.in +packaging==21.3 \ + --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ + --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 + # via + # gcp-releasetool + # nox +pkginfo==1.8.3 \ + --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ + --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c + # via twine +platformdirs==2.5.2 \ + --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ + --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 + # via virtualenv +protobuf==3.20.1 \ + --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \ + --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \ + --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \ + --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \ + --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \ + --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \ + --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \ + --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \ + --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \ + --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \ + --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \ + --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \ + --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \ + --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \ + --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \ + --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \ + --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \ + --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \ + --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \ + --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \ + --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \ + --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \ + --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \ + --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3 + # via + # gcp-docuploader + # gcp-releasetool + # google-api-core +py==1.11.0 \ + --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ + --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 + # via nox +pyasn1==0.4.8 \ + --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ + --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba + # via + # pyasn1-modules + # rsa +pyasn1-modules==0.2.8 \ + --hash=sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e \ + --hash=sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74 + # via google-auth +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi +pygments==2.13.0 \ + --hash=sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1 \ + --hash=sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42 + # via + # readme-renderer + # rich +pyjwt==2.4.0 \ + --hash=sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf \ + --hash=sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba + # via gcp-releasetool +pyparsing==3.0.9 \ + --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ + --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc + # via packaging +pyperclip==1.8.2 \ + --hash=sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57 + # via gcp-releasetool +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via gcp-releasetool +readme-renderer==37.0 \ + --hash=sha256:07b7ea234e03e58f77cc222e206e6abb8f4c0435becce5104794ee591f9301c5 \ + --hash=sha256:9fa416704703e509eeb900696751c908ddeb2011319d93700d8f18baff887a69 + # via twine +requests==2.28.1 \ + --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ + --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 + # via + # gcp-releasetool + # google-api-core + # google-cloud-storage + # requests-toolbelt + # twine +requests-toolbelt==0.9.1 \ + --hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f \ + --hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0 + # via twine +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ + --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c + # via twine +rich==12.5.1 \ + --hash=sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb \ + --hash=sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca + # via twine +rsa==4.9 \ + --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ + --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 + # via google-auth +secretstorage==3.3.3 \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via keyring +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # bleach + # gcp-docuploader + # google-auth + # python-dateutil +twine==4.0.1 \ + --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ + --hash=sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0 + # via -r requirements.in +typing-extensions==4.3.0 \ + --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ + --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 + # via -r requirements.in +urllib3==1.26.12 \ + --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ + --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 + # via + # requests + # twine +virtualenv==20.16.3 \ + --hash=sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1 \ + --hash=sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9 + # via nox +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ + --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 + # via bleach +wheel==0.37.1 \ + --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ + --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 + # via -r requirements.in +zipp==3.8.1 \ + --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ + --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 + # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +setuptools==65.2.0 \ + --hash=sha256:7f4bc85450898a09f76ebf28b72fa25bc7111f6c7d665d514a60bba9c75ef2a9 \ + --hash=sha256:a3ca5857c89f82f5c9410e8508cb32f4872a3bafd4aa7ae122a24ca33bccc750 + # via -r requirements.in From 02540438ac74e75f61e23bf86f97ed9a2816defd Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Fri, 26 Aug 2022 12:56:46 -0400 Subject: [PATCH 086/509] chore: use templated renovate.json (#853) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: use templated renovate.json * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot --- owlbot.py | 1 - renovate.json | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/owlbot.py b/owlbot.py index 2388b408c..6ad5e88ba 100644 --- a/owlbot.py +++ b/owlbot.py @@ -45,7 +45,6 @@ excludes=[ "docs/multiprocessing.rst", "noxfile.py", - "renovate.json", # do not bundle reports "CONTRIBUTING.rst", ".kokoro/samples/python3.6", # remove python 3.6 support ".github/workflows", # exclude gh actions as credentials are needed for tests diff --git a/renovate.json b/renovate.json index 9fa8816fe..566a70f3c 100644 --- a/renovate.json +++ b/renovate.json @@ -1,10 +1,11 @@ { "extends": [ "config:base", + "group:all", ":preserveSemverRanges", ":disableDependencyDashboard" ], - "ignorePaths": [".pre-commit-config.yaml"], + "ignorePaths": [".pre-commit-config.yaml", ".kokoro/requirements.txt"], "pip_requirements": { "fileMatch": ["requirements-test.txt", "samples/[\\S/]*constraints.txt", "samples/[\\S/]*constraints-test.txt"] } From f105ed0e8d6664a565f00cc094216ef48291d960 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 08:43:05 -0400 Subject: [PATCH 087/509] chore(python): upgrade dependency distlib (#854) Source-Link: https://github.com/googleapis/synthtool/commit/c4dd5953003d13b239f872d329c3146586bb417e Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:ce3c1686bc81145c81dd269bd12c4025c6b275b22d14641358827334fddb1d72 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index c6acdf3f9..23e106b65 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:562802bfac02e012a6ac34eda282f81d06e77326b82a32d7bbb1369ff552b387 -# created: 2022-08-24T17:07:22.006876712Z + digest: sha256:ce3c1686bc81145c81dd269bd12c4025c6b275b22d14641358827334fddb1d72 +# created: 2022-08-29T17:28:30.441852797Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index c4b824f24..4b29ef247 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -136,9 +136,9 @@ cryptography==37.0.4 \ # via # gcp-releasetool # secretstorage -distlib==0.3.5 \ - --hash=sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe \ - --hash=sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c +distlib==0.3.6 \ + --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ + --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e # via virtualenv docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ From 65053736c8ad2575288c668c06555761ebffafd6 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 31 Aug 2022 16:39:14 +0200 Subject: [PATCH 088/509] chore(deps): update dependency pandas to v1.4.4 (#855) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 16383115e..6ec678121 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.6 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' -pandas==1.4.3; python_version >= '3.8' +pandas==1.4.4; python_version >= '3.8' From d343f08e4df03792f09979f87146eddb48a828eb Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 1 Sep 2022 19:28:17 +0000 Subject: [PATCH 089/509] ci(python): fix path to requirements.txt in release script (#856) Source-Link: https://github.com/googleapis/synthtool/commit/fdba3ed145bdb2f4f3eff434d4284b1d03b80d34 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:1f0dbd02745fb7cf255563dab5968345989308544e52b7f460deadd5e78e63b0 --- .github/.OwlBot.lock.yaml | 3 +-- .kokoro/release.sh | 2 +- .kokoro/requirements.txt | 24 ++++++++++++------------ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 23e106b65..0d9eb2af9 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:ce3c1686bc81145c81dd269bd12c4025c6b275b22d14641358827334fddb1d72 -# created: 2022-08-29T17:28:30.441852797Z + digest: sha256:1f0dbd02745fb7cf255563dab5968345989308544e52b7f460deadd5e78e63b0 diff --git a/.kokoro/release.sh b/.kokoro/release.sh index 61da01659..2b1f28ec0 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -16,7 +16,7 @@ set -eo pipefail # Start the releasetool reporter -python3 -m pip install --require-hashes -r .kokoro/requirements.txt +python3 -m pip install --require-hashes -r github/python-storage/.kokoro/requirements.txt python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script # Disable buffering, so that the logs stream through. diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 4b29ef247..92b2f727e 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -100,9 +100,9 @@ click==8.0.4 \ # via # gcp-docuploader # gcp-releasetool -colorlog==6.6.0 \ - --hash=sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8 \ - --hash=sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e +colorlog==6.7.0 \ + --hash=sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662 \ + --hash=sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5 # via # gcp-docuploader # nox @@ -152,9 +152,9 @@ gcp-docuploader==0.6.3 \ --hash=sha256:ba8c9d76b3bbac54b0311c503a373b00edc2dc02d6d54ea9507045adb8e870f7 \ --hash=sha256:c0f5aaa82ce1854a386197e4e359b120ad6d4e57ae2c812fce42219a3288026b # via -r requirements.in -gcp-releasetool==1.8.6 \ - --hash=sha256:42e51ab8e2e789bc8e22a03c09352962cd3452951c801a2230d564816630304a \ - --hash=sha256:a3518b79d1b243c494eac392a01c7fd65187fd6d52602dcab9b529bc934d4da1 +gcp-releasetool==1.8.7 \ + --hash=sha256:3d2a67c9db39322194afb3b427e9cb0476ce8f2a04033695f0aeb63979fc2b37 \ + --hash=sha256:5e4d28f66e90780d77f3ecf1e9155852b0c3b13cbccb08ab07e66b2357c8da8d # via -r requirements.in google-api-core==2.8.2 \ --hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \ @@ -251,9 +251,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via gcp-releasetool -keyring==23.8.2 \ - --hash=sha256:0d9973f8891850f1ade5f26aafd06bb16865fbbae3fc56b0defb6a14a2624003 \ - --hash=sha256:10d2a8639663fe2090705a00b8c47c687cacdf97598ea9c11456679fa974473a +keyring==23.9.0 \ + --hash=sha256:4c32a31174faaee48f43a7e2c7e9c3216ec5e95acf22a2bebfb4a1d05056ee44 \ + --hash=sha256:98f060ec95ada2ab910c195a2d4317be6ef87936a766b239c46aa3c7aac4f0db # via # gcp-releasetool # twine @@ -440,9 +440,9 @@ urllib3==1.26.12 \ # via # requests # twine -virtualenv==20.16.3 \ - --hash=sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1 \ - --hash=sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9 +virtualenv==20.16.4 \ + --hash=sha256:014f766e4134d0008dcaa1f95bafa0fb0f575795d07cae50b1bee514185d6782 \ + --hash=sha256:035ed57acce4ac35c82c9d8802202b0e71adac011a511ff650cbcf9635006a22 # via nox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ From e92cd90af28854ac4e25024fa1adc0a27f93a4a4 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 2 Sep 2022 00:34:13 +0000 Subject: [PATCH 090/509] chore(python): update .kokoro/requirements.txt (#857) Source-Link: https://github.com/googleapis/synthtool/commit/703554a14c7479542335b62fa69279f93a9e38ec Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:94961fdc5c9ca6d13530a6a414a49d2f607203168215d074cdb0a1df9ec31c0b --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 0d9eb2af9..2fa0f7c4f 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:1f0dbd02745fb7cf255563dab5968345989308544e52b7f460deadd5e78e63b0 + digest: sha256:94961fdc5c9ca6d13530a6a414a49d2f607203168215d074cdb0a1df9ec31c0b diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 92b2f727e..385f2d4d6 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -241,6 +241,10 @@ importlib-metadata==4.12.0 \ # via # -r requirements.in # twine +jaraco-classes==3.2.2 \ + --hash=sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594 \ + --hash=sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647 + # via keyring jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 @@ -299,6 +303,10 @@ markupsafe==2.1.1 \ --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 # via jinja2 +more-itertools==8.14.0 \ + --hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \ + --hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750 + # via jaraco-classes nox==2022.8.7 \ --hash=sha256:1b894940551dc5c389f9271d197ca5d655d40bdc6ccf93ed6880e4042760a34b \ --hash=sha256:96cca88779e08282a699d672258ec01eb7c792d35bbbf538c723172bce23212c From 519074112775c19742522158f612b467cf590219 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 2 Sep 2022 19:32:16 +0000 Subject: [PATCH 091/509] chore(python): exclude setup.py in renovate config (#861) Source-Link: https://github.com/googleapis/synthtool/commit/56da63e80c384a871356d1ea6640802017f213b4 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:993a058718e84a82fda04c3177e58f0a43281a996c7c395e0a56ccc4d6d210d7 --- .github/.OwlBot.lock.yaml | 2 +- renovate.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 2fa0f7c4f..b8dcb4a4a 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:94961fdc5c9ca6d13530a6a414a49d2f607203168215d074cdb0a1df9ec31c0b + digest: sha256:993a058718e84a82fda04c3177e58f0a43281a996c7c395e0a56ccc4d6d210d7 diff --git a/renovate.json b/renovate.json index 566a70f3c..39b2a0ec9 100644 --- a/renovate.json +++ b/renovate.json @@ -5,7 +5,7 @@ ":preserveSemverRanges", ":disableDependencyDashboard" ], - "ignorePaths": [".pre-commit-config.yaml", ".kokoro/requirements.txt"], + "ignorePaths": [".pre-commit-config.yaml", ".kokoro/requirements.txt", "setup.py"], "pip_requirements": { "fileMatch": ["requirements-test.txt", "samples/[\\S/]*constraints.txt", "samples/[\\S/]*constraints-test.txt"] } From 282e3b605e62c4f8d93debff20d40afbf2e718f5 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 6 Sep 2022 19:36:05 +0200 Subject: [PATCH 092/509] chore(deps): update dependency pytest to v7.1.3 (#862) * chore(deps): update all dependencies * revert Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 077bdf929..cbcfa2f4f 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 +pytest==7.1.3 mock==4.0.3 backoff==2.1.2 \ No newline at end of file From dd47bf0293d8687b7620fc5f28ffa068c1119dcb Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 13 Sep 2022 12:39:15 -0400 Subject: [PATCH 093/509] docs(nodejs_mono_repo): update broken links in README (#864) Source-Link: https://github.com/googleapis/synthtool/commit/50db768f450a50d7c1fd62513c113c9bb96fd434 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:e09366bdf0fd9c8976592988390b24d53583dd9f002d476934da43725adbb978 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- samples/snippets/noxfile.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index b8dcb4a4a..aa547962e 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:993a058718e84a82fda04c3177e58f0a43281a996c7c395e0a56ccc4d6d210d7 + digest: sha256:e09366bdf0fd9c8976592988390b24d53583dd9f002d476934da43725adbb978 diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 5fcb9d746..0398d72ff 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -207,8 +207,8 @@ def _session_tests( session: nox.sessions.Session, post_install: Callable = None ) -> None: # check for presence of tests - test_list = glob.glob("*_test.py") + glob.glob("test_*.py") - test_list.extend(glob.glob("tests")) + test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob("**/test_*.py", recursive=True) + test_list.extend(glob.glob("**/tests", recursive=True)) if len(test_list) == 0: print("No tests found, skipping directory.") From 9469f5dd5ca6d546a47efbc3d673a401ead9d632 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 15 Sep 2022 09:54:56 -0700 Subject: [PATCH 094/509] docs: clarify list_blobs usage (#866) --- google/cloud/storage/client.py | 3 ++- samples/snippets/storage_list_files.py | 1 + samples/snippets/storage_list_files_with_prefix.py | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 05a64f57f..e6c4f33c6 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1269,7 +1269,8 @@ def list_blobs( Returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` - in this bucket matching the arguments. + in this bucket matching the arguments. The RPC call + returns a response when the iterator is consumed. As part of the response, you'll also get back an iterator.prefixes entity that lists object names up to and including the requested delimiter. Duplicate entries are omitted from this list. diff --git a/samples/snippets/storage_list_files.py b/samples/snippets/storage_list_files.py index c6a80d9fa..5e80c833a 100644 --- a/samples/snippets/storage_list_files.py +++ b/samples/snippets/storage_list_files.py @@ -29,6 +29,7 @@ def list_blobs(bucket_name): # Note: Client.list_blobs requires at least package version 1.17.0. blobs = storage_client.list_blobs(bucket_name) + # Note: The call returns a response only when the iterator is consumed. for blob in blobs: print(blob.name) diff --git a/samples/snippets/storage_list_files_with_prefix.py b/samples/snippets/storage_list_files_with_prefix.py index f79413fb6..be7468cba 100644 --- a/samples/snippets/storage_list_files_with_prefix.py +++ b/samples/snippets/storage_list_files_with_prefix.py @@ -53,6 +53,7 @@ def list_blobs_with_prefix(bucket_name, prefix, delimiter=None): # Note: Client.list_blobs requires at least package version 1.17.0. blobs = storage_client.list_blobs(bucket_name, prefix=prefix, delimiter=delimiter) + # Note: The call returns a response only when the iterator is consumed. print("Blobs:") for blob in blobs: print(blob.name) From 05e07f248fc010d7a1b24109025e9230cb2a7259 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 19 Sep 2022 21:24:06 +0200 Subject: [PATCH 095/509] chore(deps): update dependency pandas to v1.5.0 (#867) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 6ec678121..56e800303 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.6 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' -pandas==1.4.4; python_version >= '3.8' +pandas==1.5.0; python_version >= '3.8' From 2a6c162d511bf0afbffbc7ccfcac34499f3c2089 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 23 Sep 2022 13:43:29 -0700 Subject: [PATCH 096/509] tests: ensure config changes are propagated in sys tests (#870) * tests: ensure config changes are propagated in sys tests * refactor sys tests * refactor tests --- tests/system/_helpers.py | 20 +++++++---- tests/system/conftest.py | 16 +++++++++ tests/system/test_bucket.py | 15 ++++---- tests/system/test_kms_integration.py | 54 ++++++++++++---------------- 4 files changed, 60 insertions(+), 45 deletions(-) diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index a1f8c38b9..12726db73 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -13,6 +13,7 @@ # limitations under the License. import os +import time from google.api_core import exceptions @@ -63,16 +64,16 @@ def _no_retetion_period(bucket): retry_bad_copy = RetryErrors(exceptions.BadRequest, error_predicate=_bad_copy) -retry_no_event_based_hold = RetryInstanceState(_no_event_based_hold, max_tries=10) -retry_has_kms_key_name = RetryInstanceState(_has_kms_key_name, max_tries=10) +retry_no_event_based_hold = RetryInstanceState(_no_event_based_hold, max_tries=5) +retry_has_kms_key_name = RetryInstanceState(_has_kms_key_name, max_tries=5) retry_has_retention_expiration = RetryInstanceState( - _has_retention_expiration, max_tries=10 + _has_retention_expiration, max_tries=5 ) retry_no_retention_expiration = RetryInstanceState( - _no_retention_expiration, max_tries=10 + _no_retention_expiration, max_tries=5 ) -retry_has_retention_period = RetryInstanceState(_has_retetion_period, max_tries=10) -retry_no_retention_period = RetryInstanceState(_no_retetion_period, max_tries=10) +retry_has_retention_period = RetryInstanceState(_has_retetion_period, max_tries=5) +retry_no_retention_period = RetryInstanceState(_no_retetion_period, max_tries=5) def unique_name(prefix): @@ -106,3 +107,10 @@ def delete_bucket(bucket): retry = RetryErrors(errors, max_tries=15) retry(empty_bucket)(bucket) retry(bucket.delete)(force=True) + + +def await_config_changes_propagate(sec=3): + # Changes to the bucket will be readable immediately after writing, + # but configuration changes may take time to propagate. + # See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch + time.sleep(sec) diff --git a/tests/system/conftest.py b/tests/system/conftest.py index c42f62e99..c4c137007 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -165,6 +165,22 @@ def signing_bucket(storage_client, signing_bucket_name): _helpers.delete_bucket(bucket) +@pytest.fixture(scope="session") +def default_ebh_bucket_name(): + return _helpers.unique_name("gcp-systest-default-ebh") + + +@pytest.fixture(scope="session") +def default_ebh_bucket(storage_client, default_ebh_bucket_name): + bucket = storage_client.bucket(default_ebh_bucket_name) + bucket.default_event_based_hold = True + _helpers.retry_429_503(bucket.create)() + + yield bucket + + _helpers.delete_bucket(bucket) + + @pytest.fixture(scope="function") def buckets_to_delete(): buckets_to_delete = [] diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 054a29018..9fe7aa648 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -682,16 +682,10 @@ def test_bucket_w_retention_period( def test_bucket_w_default_event_based_hold( storage_client, - buckets_to_delete, blobs_to_delete, + default_ebh_bucket, ): - bucket_name = _helpers.unique_name("w-def-ebh") - bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) - buckets_to_delete.append(bucket) - - bucket.default_event_based_hold = True - bucket.patch() - + bucket = storage_client.get_bucket(default_ebh_bucket) assert bucket.default_event_based_hold assert bucket.retention_period is None assert bucket.retention_policy_effective_time is None @@ -725,6 +719,10 @@ def test_bucket_w_default_event_based_hold( assert bucket.retention_policy_effective_time is None assert not bucket.retention_policy_locked + # Changes to the bucket will be readable immediately after writing, + # but configuration changes may take time to propagate. + _helpers.await_config_changes_propagate() + blob.upload_from_string(payload) # https://github.com/googleapis/python-storage/issues/435 @@ -870,6 +868,7 @@ def test_ubla_set_unset_preserves_acls( # Clear UBLA bucket.iam_configuration.uniform_bucket_level_access_enabled = False bucket.patch() + _helpers.await_config_changes_propagate() # Query ACLs after clearing UBLA bucket.acl.reload() diff --git a/tests/system/test_kms_integration.py b/tests/system/test_kms_integration.py index 87c1a7c07..f047baced 100644 --- a/tests/system/test_kms_integration.py +++ b/tests/system/test_kms_integration.py @@ -137,10 +137,6 @@ def test_bucket_w_default_kms_key_name( file_data, ): blob_name = "default-kms-key-name" - override_blob_name = "override-default-kms-key-name" - alt_blob_name = "alt-default-kms-key-name" - cleartext_blob_name = "cleartext" - info = file_data["simple"] with open(info["path"], "rb") as file_obj: @@ -150,6 +146,10 @@ def test_bucket_w_default_kms_key_name( kms_bucket.patch() assert kms_bucket.default_kms_key_name == kms_key_name + # Changes to the bucket will be readable immediately after writing, + # but configuration changes may take time to propagate. + _helpers.await_config_changes_propagate() + defaulted_blob = kms_bucket.blob(blob_name) defaulted_blob.upload_from_filename(info["path"]) blobs_to_delete.append(defaulted_blob) @@ -159,34 +159,15 @@ def test_bucket_w_default_kms_key_name( # We don't know the current version of the key. assert defaulted_blob.kms_key_name.startswith(kms_key_name) - override_blob = kms_bucket.blob(override_blob_name, kms_key_name=alt_kms_key_name) - override_blob.upload_from_filename(info["path"]) - blobs_to_delete.append(override_blob) - - assert override_blob.download_as_bytes() == payload - # We don't know the current version of the key. - assert override_blob.kms_key_name.startswith(alt_kms_key_name) - + # Test changing the default KMS key. kms_bucket.default_kms_key_name = alt_kms_key_name kms_bucket.patch() + assert kms_bucket.default_kms_key_name == alt_kms_key_name - alt_blob = kms_bucket.blob(alt_blob_name) - alt_blob.upload_from_filename(info["path"]) - blobs_to_delete.append(alt_blob) - - assert alt_blob.download_as_bytes() == payload - # We don't know the current version of the key. - assert alt_blob.kms_key_name.startswith(alt_kms_key_name) - + # Test removing the default KMS key. kms_bucket.default_kms_key_name = None kms_bucket.patch() - - cleartext_blob = kms_bucket.blob(cleartext_blob_name) - cleartext_blob.upload_from_filename(info["path"]) - blobs_to_delete.append(cleartext_blob) - - assert cleartext_blob.download_as_bytes() == payload - assert cleartext_blob.kms_key_name is None + assert kms_bucket.default_kms_key_name is None def test_blob_rewrite_rotate_csek_to_cmek( @@ -240,9 +221,10 @@ def test_blob_upload_w_bucket_cmek_enabled( kms_bucket, blobs_to_delete, kms_key_name, - file_data, + alt_kms_key_name, ): blob_name = "test-blob" + override_blob_name = "override-default-kms-key-name" payload = b"DEADBEEF" alt_payload = b"NEWDEADBEEF" @@ -250,19 +232,29 @@ def test_blob_upload_w_bucket_cmek_enabled( kms_bucket.patch() assert kms_bucket.default_kms_key_name == kms_key_name + # Changes to the bucket will be readable immediately after writing, + # but configuration changes may take time to propagate. + _helpers.await_config_changes_propagate() + blob = kms_bucket.blob(blob_name) blob.upload_from_string(payload) blobs_to_delete.append(blob) _helpers.retry_429_harder(_helpers.retry_has_kms_key_name(blob.reload))() - # We don't know the current version of the key. assert blob.kms_key_name.startswith(kms_key_name) blob.upload_from_string(alt_payload, if_generation_match=blob.generation) - assert blob.download_as_bytes() == alt_payload + # Test the specific key is used to encrypt the object if you have both + # a default KMS key set on your bucket and a specific key included in your request. + override_blob = kms_bucket.blob(override_blob_name, kms_key_name=alt_kms_key_name) + override_blob.upload_from_string(payload) + blobs_to_delete.append(override_blob) + + assert override_blob.download_as_bytes() == payload + assert override_blob.kms_key_name.startswith(alt_kms_key_name) + kms_bucket.default_kms_key_name = None _helpers.retry_429_harder(kms_bucket.patch)() - assert kms_bucket.default_kms_key_name is None From 8d5a6c3557c48fb885e7e5966d1d906398edc399 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 23 Sep 2022 23:14:03 +0200 Subject: [PATCH 097/509] chore(deps): update dependency google-cloud-pubsub to v2.13.7 (#869) Co-authored-by: cojenco --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 56e800303..2910de3e1 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.6 +google-cloud-pubsub==2.13.7 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.0; python_version >= '3.8' From e0be1940d3cd49eef7423b0fc9dad91247d5221c Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 14:39:24 -0400 Subject: [PATCH 098/509] chore: exclude requirements.txt file from renovate-bot (#874) Source-Link: https://github.com/googleapis/synthtool/commit/f58d3135a2fab20e225d98741dbc06d57459b816 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 49 +++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index aa547962e..3815c983c 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:e09366bdf0fd9c8976592988390b24d53583dd9f002d476934da43725adbb978 + digest: sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 385f2d4d6..d15994bac 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -325,31 +325,30 @@ platformdirs==2.5.2 \ --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 # via virtualenv -protobuf==3.20.1 \ - --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \ - --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \ - --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \ - --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \ - --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \ - --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \ - --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \ - --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \ - --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \ - --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \ - --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \ - --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \ - --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \ - --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \ - --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \ - --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \ - --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \ - --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \ - --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \ - --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \ - --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \ - --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \ - --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \ - --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3 +protobuf==3.20.2 \ + --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ + --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ + --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ + --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ + --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ + --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ + --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ + --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ + --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ + --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ + --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ + --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ + --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ + --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ + --hash=sha256:9f876a69ca55aed879b43c295a328970306e8e80a263ec91cf6e9189243c613b \ + --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ + --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ + --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ + --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ + --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ + --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ + --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ + --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 # via # gcp-docuploader # gcp-releasetool From 2b3e8f967df95d45c35e150b201e77b8962c7e9b Mon Sep 17 00:00:00 2001 From: ddelange <14880945+ddelange@users.noreply.github.com> Date: Tue, 4 Oct 2022 20:10:49 +0200 Subject: [PATCH 099/509] feat: add predefined_acl to create_resumable_upload_session (#878) Co-authored-by: Denis DelGrosso <85250797+ddelgrosso1@users.noreply.github.com> --- google/cloud/storage/blob.py | 6 +++++- tests/unit/test_blob.py | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 205d4aeb2..f25b928c3 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -2861,6 +2861,7 @@ def create_resumable_upload_session( client=None, timeout=_DEFAULT_TIMEOUT, checksum=None, + predefined_acl=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -2942,6 +2943,9 @@ def create_resumable_upload_session( delete the uploaded object automatically. Supported values are "md5", "crc32c" and None. The default is None. + :type predefined_acl: str + :param predefined_acl: (Optional) Predefined access control list + :type if_generation_match: long :param if_generation_match: (Optional) See :ref:`using-if-generation-match` @@ -3015,7 +3019,7 @@ def create_resumable_upload_session( content_type, size, None, - predefined_acl=None, + predefined_acl=predefined_acl, if_generation_match=if_generation_match, if_generation_not_match=if_generation_not_match, if_metageneration_match=if_metageneration_match, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 018ea4505..d25f0eb39 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -3572,6 +3572,7 @@ def _create_resumable_upload_session_helper( origin=None, side_effect=None, timeout=None, + predefined_acl=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -3611,6 +3612,7 @@ def _create_resumable_upload_session_helper( size=size, origin=origin, client=client, + predefined_acl=predefined_acl, if_generation_match=if_generation_match, if_generation_not_match=if_generation_not_match, if_metageneration_match=if_metageneration_match, @@ -3629,6 +3631,9 @@ def _create_resumable_upload_session_helper( ) qs_params = [("uploadType", "resumable")] + if predefined_acl is not None: + qs_params.append(("predefinedAcl", predefined_acl)) + if if_generation_match is not None: qs_params.append(("ifGenerationMatch", if_generation_match)) @@ -3672,6 +3677,9 @@ def test_create_resumable_upload_session_with_custom_timeout(self): def test_create_resumable_upload_session_with_origin(self): self._create_resumable_upload_session_helper(origin="http://google.com") + def test_create_resumable_upload_session_with_predefined_acl(self): + self._create_resumable_upload_session_helper(predefined_acl="private") + def test_create_resumable_upload_session_with_generation_match(self): self._create_resumable_upload_session_helper( if_generation_match=123456, if_metageneration_match=2 From 8a24add52f0bc7dbcb3ec427bd3e4551b3afcbf5 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 5 Oct 2022 14:27:31 -0700 Subject: [PATCH 100/509] fix: align bucket bound hostname url builder consistency (#875) --- google/cloud/storage/_helpers.py | 2 +- google/cloud/storage/client.py | 2 +- tests/unit/test__helpers.py | 4 ++-- tests/unit/test_client.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 282d9bcfb..c02be2b45 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -546,7 +546,7 @@ def _bucket_bound_hostname_url(host, scheme=None): if url_parts.scheme and url_parts.netloc: return host - return f"{scheme}://{host}/" + return f"{scheme}://{host}" def _api_core_retry_to_resumable_media_retry(retry, num_retries=None): diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index e6c4f33c6..9cccf413b 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1759,7 +1759,7 @@ def generate_signed_post_policy_v4( if virtual_hosted_style: url = f"https://{bucket_name}.storage.googleapis.com/" elif bucket_bound_hostname: - url = _bucket_bound_hostname_url(bucket_bound_hostname, scheme) + url = f"{_bucket_bound_hostname_url(bucket_bound_hostname, scheme)}/" else: url = f"https://storage.googleapis.com/{bucket_name}/" diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index dbe0055df..174b96152 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -675,13 +675,13 @@ def _call_fut(self, **args): return _bucket_bound_hostname_url(**args) def test_full_hostname(self): - HOST = "scheme://domain.tcl/" + HOST = "scheme://domain.tcl" self.assertEqual(self._call_fut(host=HOST), HOST) def test_hostname_and_scheme(self): HOST = "domain.tcl" SCHEME = "scheme" - EXPECTED_URL = SCHEME + "://" + HOST + "/" + EXPECTED_URL = SCHEME + "://" + HOST self.assertEqual(self._call_fut(host=HOST, scheme=SCHEME), EXPECTED_URL) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 6769f3020..c100d35b0 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -2572,7 +2572,7 @@ def test_get_signed_policy_v4_bucket_bound_hostname(self): bucket_bound_hostname="https://bucket.bound_hostname", credentials=_create_signing_credentials(), ) - self.assertEqual(policy["url"], "https://bucket.bound_hostname") + self.assertEqual(policy["url"], "https://bucket.bound_hostname/") def test_get_signed_policy_v4_bucket_bound_hostname_with_scheme(self): import datetime From 0efa4640e19673bb910df1f53655d6634baa7f2d Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 6 Oct 2022 15:40:08 +0200 Subject: [PATCH 101/509] chore(deps): update dependency backoff to v2.2.1 (#881) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index cbcfa2f4f..d999aa86c 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.1.3 mock==4.0.3 -backoff==2.1.2 \ No newline at end of file +backoff==2.2.1 \ No newline at end of file From 928ebbccbe183666f3b35adb7226bd259d4e71c0 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 6 Oct 2022 11:25:31 -0700 Subject: [PATCH 102/509] fix: remove client side validations (#868) * fix: remove client side validation hmac/notifications * remove client validation on storage class values * revive tests for allowing unspecified states --- google/cloud/storage/blob.py | 3 -- google/cloud/storage/bucket.py | 2 -- google/cloud/storage/hmac_key.py | 8 ------ google/cloud/storage/notification.py | 6 ++-- tests/unit/test_blob.py | 43 +++++++++++++++++++++------- tests/unit/test_bucket.py | 10 +++++-- tests/unit/test_hmac_key.py | 9 +++--- 7 files changed, 47 insertions(+), 34 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index f25b928c3..d465039ea 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -3719,9 +3719,6 @@ def update_storage_class( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` """ - if new_class not in self.STORAGE_CLASSES: - raise ValueError(f"Invalid storage class: {new_class}") - # Update current blob's storage class prior to rewrite self._patch_property("storageClass", new_class) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 6f133b923..98cbf892b 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2654,8 +2654,6 @@ def storage_class(self, value): or :attr:`~google.cloud.storage.constants.DURABLE_REDUCED_AVAILABILITY_LEGACY_STORAGE_CLASS`, """ - if value not in self.STORAGE_CLASSES: - raise ValueError(f"Invalid storage class: {value}") self._patch_property("storageClass", value) @property diff --git a/google/cloud/storage/hmac_key.py b/google/cloud/storage/hmac_key.py index 944bc7f87..7f6de7eee 100644 --- a/google/cloud/storage/hmac_key.py +++ b/google/cloud/storage/hmac_key.py @@ -131,11 +131,6 @@ def state(self): @state.setter def state(self, value): - if value not in self._SETTABLE_STATES: - raise ValueError( - f"State may only be set to one of: {', '.join(self._SETTABLE_STATES)}" - ) - self._properties["state"] = value @property @@ -289,9 +284,6 @@ def delete(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): :raises :class:`~google.api_core.exceptions.NotFound`: if the key does not exist on the back-end. """ - if self.state != self.INACTIVE_STATE: - raise ValueError("Cannot delete key if not in 'INACTIVE' state.") - qs_params = {} if self.user_project is not None: qs_params["userProject"] = self.user_project diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index f7e72e710..d9fa79ac6 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -306,7 +306,7 @@ def exists(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): :raises ValueError: if the notification has no ID. """ if self.notification_id is None: - raise ValueError("Notification not intialized by server") + raise ValueError("Notification ID not set: set an explicit notification_id") client = self._require_client(client) @@ -352,7 +352,7 @@ def reload(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): :raises ValueError: if the notification has no ID. """ if self.notification_id is None: - raise ValueError("Notification not intialized by server") + raise ValueError("Notification ID not set: set an explicit notification_id") client = self._require_client(client) @@ -395,7 +395,7 @@ def delete(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): :raises ValueError: if the notification has no ID. """ if self.notification_id is None: - raise ValueError("Notification not intialized by server") + raise ValueError("Notification ID not set: set an explicit notification_id") client = self._require_client(client) diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index d25f0eb39..638db9f4e 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -5002,17 +5002,6 @@ def test_rewrite_same_name_w_kms_key_w_version(self): _target_object=dest, ) - def test_update_storage_class_invalid(self): - blob_name = "blob-name" - bucket = _Bucket() - blob = self._make_one(blob_name, bucket=bucket) - blob.rewrite = mock.Mock(spec=[]) - - with self.assertRaises(ValueError): - blob.update_storage_class("BOGUS") - - blob.rewrite.assert_not_called() - def _update_storage_class_multi_pass_helper(self, **kw): blob_name = "blob-name" storage_class = "NEARLINE" @@ -5223,6 +5212,38 @@ def test_update_storage_class_single_pass_w_retry(self): retry = mock.Mock(spec=[]) self._update_storage_class_single_pass_helper(retry=retry) + def test_update_storage_class_invalid(self): + from google.cloud.exceptions import BadRequest + + storage_class = "BOGUS" + blob_name = "blob-name" + client = mock.Mock(spec=[]) + bucket = _Bucket(client=client) + blob = self._make_one(blob_name, bucket=bucket) + blob.rewrite = mock.Mock(spec=[]) + blob.rewrite.side_effect = BadRequest("Invalid storage class") + + with self.assertRaises(BadRequest): + blob.update_storage_class(storage_class) + + # Test that invalid classes are allowed without client side validation. + # Fall back to server side validation and errors. + self.assertEqual(blob.storage_class, storage_class) + + blob.rewrite.assert_called_once_with( + blob, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + if_source_generation_match=None, + if_source_generation_not_match=None, + if_source_metageneration_match=None, + if_source_metageneration_not_match=None, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + ) + def test_cache_control_getter(self): BLOB_NAME = "blob-name" bucket = _Bucket() diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 5ff758758..163d31fd6 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2813,11 +2813,15 @@ def test_storage_class_getter(self): self.assertEqual(bucket.storage_class, NEARLINE_STORAGE_CLASS) def test_storage_class_setter_invalid(self): + invalid_class = "BOGUS" NAME = "name" bucket = self._make_one(name=NAME) - with self.assertRaises(ValueError): - bucket.storage_class = "BOGUS" - self.assertFalse("storageClass" in bucket._changes) + bucket.storage_class = invalid_class + + # Test that invalid classes are allowed without client side validation. + # Fall back to server side validation and errors. + self.assertEqual(bucket.storage_class, invalid_class) + self.assertTrue("storageClass" in bucket._changes) def test_storage_class_setter_STANDARD(self): from google.cloud.storage.constants import STANDARD_STORAGE_CLASS diff --git a/tests/unit/test_hmac_key.py b/tests/unit/test_hmac_key.py index 917006b96..b74bc1e7e 100644 --- a/tests/unit/test_hmac_key.py +++ b/tests/unit/test_hmac_key.py @@ -149,11 +149,12 @@ def test_state_getter(self): def test_state_setter_invalid_state(self): metadata = self._make_one() expected = "INVALID" + metadata.state = expected - with self.assertRaises(ValueError): - metadata.state = expected - - self.assertIsNone(metadata.state) + # Test that invalid states are allowed without client side validation. + # Fall back to server side validation and errors. + self.assertEqual(metadata.state, expected) + self.assertEqual(metadata._properties["state"], expected) def test_state_setter_inactive(self): metadata = self._make_one() From 3d849728d809950d29e4197dd27f0010d30d3715 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 12 Oct 2022 23:46:57 +0200 Subject: [PATCH 103/509] chore(deps): update dependency google-cloud-pubsub to v2.13.9 (#885) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 2910de3e1..0955d15fd 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.7 +google-cloud-pubsub==2.13.9 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.0; python_version >= '3.8' From 770722034072cfcaafc18340e91746957ef31397 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 13 Oct 2022 17:17:23 -0700 Subject: [PATCH 104/509] Fix: BlobWriter.close() will do nothing if already closed (#887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix: BlobWriter.close() will do nothing if already closed * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot --- google/cloud/storage/fileio.py | 5 ++--- tests/unit/test_fileio.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index cc04800eb..dfdb90c7c 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -423,9 +423,8 @@ def flush(self): ) def close(self): - self._checkClosed() # Raises ValueError if closed. - - self._upload_chunks_from_buffer(1) + if not self._buffer.closed: + self._upload_chunks_from_buffer(1) self._buffer.close() def _checkClosed(self): diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index c0b2d1d70..54e113e55 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -402,6 +402,23 @@ def test_write(self, mock_warn): stacklevel=2, ) + def test_close_errors(self): + blob = mock.Mock(chunk_size=None) + + upload = mock.Mock() + transport = mock.Mock() + + blob._initiate_resumable_upload.return_value = (upload, transport) + + writer = self._make_blob_writer(blob) + + writer.close() + # Close a second time to verify it successfully does nothing. + writer.close() + # Try to write to closed file. + with self.assertRaises(ValueError): + writer.write(TEST_BINARY_DATA) + def test_flush_fails(self): blob = mock.Mock(chunk_size=None) writer = self._make_blob_writer(blob) From 97b4a962d3f64d8a34af5bfa494e700503f450c5 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 14 Oct 2022 20:21:36 +0200 Subject: [PATCH 105/509] chore(deps): update dependency google-cloud-pubsub to v2.13.10 (#888) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 0955d15fd..e17bf9474 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.9 +google-cloud-pubsub==2.13.10 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.0; python_version >= '3.8' From b6cc4d150641745ae8328155fe23428528e68f5c Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 19 Oct 2022 16:04:13 +0200 Subject: [PATCH 106/509] chore(deps): update dependency pandas to v1.5.1 (#889) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index e17bf9474..8e71b2787 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.10 google-cloud-storage==2.5.0 pandas===1.3.5; python_version == '3.7' -pandas==1.5.0; python_version >= '3.8' +pandas==1.5.1; python_version >= '3.8' From 7c8a178978d2022482afd301242ae79b2f9c737a Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 20 Oct 2022 15:50:05 -0700 Subject: [PATCH 107/509] docs: streamline docs for c.g.c migration (#876) * docs: remove literalinclude in client module * remove literalinclude and update samples in Blob * replace literalinclude with samples in Bucket * update docstrings and remove inline samples * update docstrings --- google/cloud/storage/_signing.py | 29 ++-- google/cloud/storage/blob.py | 242 ++++++++------------------ google/cloud/storage/bucket.py | 250 +++++++-------------------- google/cloud/storage/client.py | 134 ++------------ google/cloud/storage/fileio.py | 2 + google/cloud/storage/hmac_key.py | 5 + google/cloud/storage/notification.py | 16 +- google/cloud/storage/retry.py | 5 + 8 files changed, 179 insertions(+), 504 deletions(-) diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index 036ea6385..fb50a2acc 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -282,15 +282,11 @@ def generate_signed_url_v2( .. note:: If you are on Google Compute Engine, you can't generate a signed URL. - Follow `Issue 922`_ for updates on this. If you'd like to be able to - generate a signed URL from GCE, you can use a standard service account - from a JSON file rather than a GCE service account. + If you'd like to be able to generate a signed URL from GCE, you can use a + standard service account from a JSON file rather than a GCE service account. - See headers `reference`_ for more details on optional arguments. - - .. _Issue 922: https://github.com/GoogleCloudPlatform/\ - google-cloud-python/issues/922 - .. _reference: https://cloud.google.com/storage/docs/reference-headers + See headers [reference](https://cloud.google.com/storage/docs/reference-headers) + for more details on optional arguments. :type credentials: :class:`google.auth.credentials.Signing` :param credentials: Credentials object with an associated private key to @@ -382,6 +378,8 @@ def generate_signed_url_v2( elements_to_sign.append(canonical.resource) string_to_sign = "\n".join(elements_to_sign) + # If you are on Google Compute Engine, you can't generate a signed URL. + # See https://github.com/googleapis/google-cloud-python/issues/922 # Set the right query parameters. if access_token and service_account_email: signature = _sign_message(string_to_sign, access_token, service_account_email) @@ -446,16 +444,11 @@ def generate_signed_url_v4( .. note:: If you are on Google Compute Engine, you can't generate a signed URL. - Follow `Issue 922`_ for updates on this. If you'd like to be able to - generate a signed URL from GCE, you can use a standard service account - from a JSON file rather than a GCE service account. - - See headers `reference`_ for more details on optional arguments. - - .. _Issue 922: https://github.com/GoogleCloudPlatform/\ - google-cloud-python/issues/922 - .. _reference: https://cloud.google.com/storage/docs/reference-headers + If you'd like to be able to generate a signed URL from GCE,you can use a + standard service account from a JSON file rather than a GCE service account. + See headers [reference](https://cloud.google.com/storage/docs/reference-headers) + for more details on optional arguments. :type credentials: :class:`google.auth.credentials.Signing` :param credentials: Credentials object with an associated private key to @@ -543,6 +536,8 @@ def generate_signed_url_v4( request_timestamp = _request_timestamp datestamp = _request_timestamp[:8] + # If you are on Google Compute Engine, you can't generate a signed URL. + # See https://github.com/googleapis/google-cloud-python/issues/922 client_email = service_account_email if not access_token or not service_account_email: ensure_signed_credentials(credentials) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index d465039ea..1a151b096 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -379,6 +379,13 @@ def public_url(self): def from_string(cls, uri, client=None): """Get a constructor for blob object by URI. + .. code-block:: python + + from google.cloud import storage + from google.cloud.storage.blob import Blob + client = storage.Client() + blob = Blob.from_string("gs://bucket/object", client=client) + :type uri: str :param uri: The blob uri pass to get blob object. @@ -389,14 +396,6 @@ def from_string(cls, uri, client=None): :rtype: :class:`google.cloud.storage.blob.Blob` :returns: The blob object created. - - Example: - Get a constructor for blob object by URI. - - >>> from google.cloud import storage - >>> from google.cloud.storage.blob import Blob - >>> client = storage.Client() - >>> blob = Blob.from_string("gs://bucket/object", client=client) """ from google.cloud.storage.bucket import Bucket @@ -433,37 +432,24 @@ def generate_signed_url( .. note:: If you are on Google Compute Engine, you can't generate a signed - URL using GCE service account. Follow `Issue 50`_ for updates on - this. If you'd like to be able to generate a signed URL from GCE, + URL using GCE service account. + If you'd like to be able to generate a signed URL from GCE, you can use a standard service account from a JSON file rather than a GCE service account. - .. _Issue 50: https://github.com/GoogleCloudPlatform/\ - google-auth-library-python/issues/50 - If you have a blob that you want to allow access to for a set amount of time, you can use this method to generate a URL that is only valid within a certain time period. - If ``bucket_bound_hostname`` is set as an argument of :attr:`api_access_endpoint`, - ``https`` works only if using a ``CDN``. - - Example: - Generates a signed URL for this blob using bucket_bound_hostname and scheme. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.get_bucket('my-bucket-name') - >>> blob = bucket.get_blob('my-blob-name') - >>> url = blob.generate_signed_url(expiration='url-expiration-time', bucket_bound_hostname='mydomain.tld', - >>> version='v4') - >>> url = blob.generate_signed_url(expiration='url-expiration-time', bucket_bound_hostname='mydomain.tld', - >>> version='v4',scheme='https') # If using ``CDN`` + See a [code sample](https://cloud.google.com/storage/docs/samples/storage-generate-signed-url-v4#storage_generate_signed_url_v4-python). This is particularly useful if you don't want publicly accessible blobs, but don't want to require users to explicitly log in. + If ``bucket_bound_hostname`` is set as an argument of :attr:`api_access_endpoint`, + ``https`` works only if using a ``CDN``. + :type expiration: Union[Integer, datetime.datetime, datetime.timedelta] :param expiration: Point in time when the signed URL should expire. If a ``datetime`` @@ -574,6 +560,9 @@ def generate_signed_url( quoted_name = _quote(self.name, safe=b"/~") + # If you are on Google Compute Engine, you can't generate a signed URL + # using GCE service account. + # See https://github.com/googleapis/google-auth-library-python/issues/50 if virtual_hosted_style: api_access_endpoint = f"https://{self.bucket.name}.storage.googleapis.com" elif bucket_bound_hostname: @@ -1036,18 +1025,6 @@ def download_to_file( If the server-set property, :attr:`media_link`, is not yet initialized, makes an additional API request to load it. - Downloading a file that has been encrypted with a - [`customer-supplied`](https://cloud.google.com/storage/docs/encryption#customer-supplied) - encryption key: - - .. literalinclude:: snippets.py - :start-after: START download_to_file - :end-before: END download_to_file - :dedent: 4 - - The ``encryption_key`` should be a str or bytes with a length of at - least 32. - If the :attr:`chunk_size` of a current blob is `None`, will download data in single download request otherwise it will download the :attr:`chunk_size` of data in each request. @@ -1182,6 +1159,9 @@ def download_to_filename( If :attr:`user_project` is set on the bucket, bills the API request to that project. + See a [code sample](https://cloud.google.com/storage/docs/samples/storage-download-encrypted-file#storage_download_encrypted_file-python) + to download a file with a [`customer-supplied encryption key`](https://cloud.google.com/storage/docs/encryption#customer-supplied). + :type filename: str :param filename: A filename to be passed to ``open``. @@ -2431,19 +2411,9 @@ def upload_from_file( bucket. In the absence of those policies, upload will overwrite any existing contents. - See the `object versioning`_ and `lifecycle`_ API documents - for details. - - Uploading a file with a - [`customer-supplied`](https://cloud.google.com/storage/docs/encryption#customer-supplied) encryption key: - - .. literalinclude:: snippets.py - :start-after: START upload_from_file - :end-before: END upload_from_file - :dedent: 4 - - The ``encryption_key`` should be a str or bytes with a length of at - least 32. + See the [`object versioning`](https://cloud.google.com/storage/docs/object-versioning) + and [`lifecycle`](https://cloud.google.com/storage/docs/lifecycle) + API documents for details. If the size of the data to be uploaded exceeds 8 MB a resumable media request will be used, otherwise the content and the metadata will be @@ -2547,10 +2517,6 @@ def upload_from_file( :raises: :class:`~google.cloud.exceptions.GoogleCloudError` if the upload response returns an error status. - - .. _object versioning: https://cloud.google.com/storage/\ - docs/object-versioning - .. _lifecycle: https://cloud.google.com/storage/docs/lifecycle """ if num_retries is not None: warnings.warn(_NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2) @@ -2614,14 +2580,17 @@ def upload_from_filename( bucket. In the absence of those policies, upload will overwrite any existing contents. - See the `object versioning - `_ and - `lifecycle `_ + See the [`object versioning`](https://cloud.google.com/storage/docs/object-versioning) + and [`lifecycle`](https://cloud.google.com/storage/docs/lifecycle) API documents for details. If :attr:`user_project` is set on the bucket, bills the API request to that project. + See a [code sample](https://cloud.google.com/storage/docs/samples/storage-upload-encrypted-file#storage_upload_encrypted_file-python) + to upload a file with a + [`customer-supplied encryption key`](https://cloud.google.com/storage/docs/encryption#customer-supplied). + :type filename: str :param filename: The path to the file. @@ -2744,9 +2713,8 @@ def upload_from_string( bucket. In the absence of those policies, upload will overwrite any existing contents. - See the `object versioning - `_ and - `lifecycle `_ + See the [`object versioning`](https://cloud.google.com/storage/docs/object-versioning) + and [`lifecycle`](https://cloud.google.com/storage/docs/lifecycle) API documents for details. If :attr:`user_project` is set on the bucket, bills the API request @@ -2876,12 +2844,10 @@ def create_resumable_upload_session( passes the session URL to the client that will upload the binary data. The client performs a PUT request on the session URL to complete the upload. This process allows untrusted clients to upload to an - access-controlled bucket. For more details, see the - `documentation on signed URLs`_. + access-controlled bucket. - .. _documentation on signed URLs: - https://cloud.google.com/storage/\ - docs/access-control/signed-urls#signing-resumable + For more details, see the + documentation on [`signed URLs`](https://cloud.google.com/storage/docs/access-control/signed-urls#signing-resumable). The content type of the upload will be determined in order of precedence: @@ -2896,9 +2862,8 @@ def create_resumable_upload_session( bucket. In the absence of those policies, upload will overwrite any existing contents. - See the `object versioning - `_ and - `lifecycle `_ + See the [`object versioning`](https://cloud.google.com/storage/docs/object-versioning) + and [`lifecycle`](https://cloud.google.com/storage/docs/lifecycle) API documents for details. If :attr:`encryption_key` is set, the blob will be encrypted with @@ -3339,6 +3304,9 @@ def compose( If :attr:`user_project` is set on the bucket, bills the API request to that project. + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/objects/compose) + and a [code sample](https://cloud.google.com/storage/docs/samples/storage-compose-file#storage_compose_file-python). + :type sources: list of :class:`Blob` :param sources: Blobs whose contents will be composed into this blob. @@ -3358,14 +3326,11 @@ def compose( destination object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object. - - .. note:: - - In a previous version, this argument worked identically to the - ``if_source_generation_match`` argument. For - backwards-compatibility reasons, if a list is passed in, - this argument will behave like ``if_source_generation_match`` - and also issue a DeprecationWarning. + Note: In a previous version, this argument worked identically to the + ``if_source_generation_match`` argument. For + backwards-compatibility reasons, if a list is passed in, + this argument will behave like ``if_source_generation_match`` + and also issue a DeprecationWarning. :type if_metageneration_match: long :param if_metageneration_match: @@ -3386,20 +3351,6 @@ def compose( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` - - Example: - Compose blobs using source generation match preconditions. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.bucket("bucket-name") - - >>> blobs = [bucket.blob("blob-name-1"), bucket.blob("blob-name-2")] - >>> if_source_generation_match = [None] * len(blobs) - >>> if_source_generation_match[0] = "123" # precondition for "blob-name-1" - - >>> composed_blob = bucket.blob("composed-name") - >>> composed_blob.compose(blobs, if_source_generation_match=if_source_generation_match) """ sources_len = len(sources) client = self._require_client(client) @@ -3780,6 +3731,36 @@ def open( which do not provide checksums to validate. See https://cloud.google.com/storage/docs/hashes-etags for details. + See a [code sample](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_fileio_write_read.py). + + Keyword arguments to pass to the underlying API calls. + For both uploads and downloads, the following arguments are + supported: + + - ``if_generation_match`` + - ``if_generation_not_match`` + - ``if_metageneration_match`` + - ``if_metageneration_not_match`` + - ``timeout`` + - ``retry`` + + For downloads only, the following additional arguments are supported: + + - ``raw_download`` + + For uploads only, the following additional arguments are supported: + + - ``content_type`` + - ``num_retries`` + - ``predefined_acl`` + - ``checksum`` + + .. note:: + + ``num_retries`` is supported for backwards-compatibility + reasons only; please use ``retry`` with a Retry object or + ConditionalRetryPolicy instead. + :type mode: str :param mode: (Optional) A mode string, as per standard Python `open()` semantics.The first @@ -3834,53 +3815,9 @@ def open( newline mode" and writes use the system default. See the Python 'io' module documentation for 'io.TextIOWrapper' for details. - :param kwargs: - Keyword arguments to pass to the underlying API calls. - For both uploads and downloads, the following arguments are - supported: - - - ``if_generation_match`` - - ``if_generation_not_match`` - - ``if_metageneration_match`` - - ``if_metageneration_not_match`` - - ``timeout`` - - ``retry`` - - For downloads only, the following additional arguments are supported: - - - ``raw_download`` - - For uploads only, the following additional arguments are supported: - - - ``content_type`` - - ``num_retries`` - - ``predefined_acl`` - - ``checksum`` - - .. note:: - - ``num_retries`` is supported for backwards-compatibility - reasons only; please use ``retry`` with a Retry object or - ConditionalRetryPolicy instead. - :returns: A 'BlobReader' or 'BlobWriter' from 'google.cloud.storage.fileio', or an 'io.TextIOWrapper' around one of those classes, depending on the 'mode' argument. - - Example: - Read from a text blob by using open() as context manager. - - Using bucket.get_blob() fetches metadata such as the generation, - which prevents race conditions in case the blob is modified. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.bucket("bucket-name") - - >>> blob = bucket.blob("blob-name.txt") - >>> with blob.open("rt") as f: - >>> print(f.read()) - """ if mode == "rb": if encoding or errors or newline: @@ -3986,23 +3923,6 @@ def open( If not set before upload, the server will compute the hash. :rtype: str or ``NoneType`` - - - Example: - Retrieve the crc32c hash of blob. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.get_bucket("my-bucket-name") - >>> blob = bucket.blob('my-blob') - - >>> blob.crc32c # return None - >>> blob.reload() - >>> blob.crc32c # return crc32c hash - - >>> # Another approach - >>> blob = bucket.get_blob('my-blob') - >>> blob.crc32c # return crc32c hash """ @property @@ -4084,22 +4004,6 @@ def id(self): If not set before upload, the server will compute the hash. :rtype: str or ``NoneType`` - - Example: - Retrieve the md5 hash of blob. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.get_bucket("my-bucket-name") - >>> blob = bucket.blob('my-blob') - - >>> blob.md5_hash # return None - >>> blob.reload() - >>> blob.md5_hash # return md5 hash - - >>> # Another approach - >>> blob = bucket.get_blob('my-blob') - >>> blob.md5_hash # return md5 hash """ @property diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 98cbf892b..0a7b09bbb 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -730,6 +730,13 @@ def user_project(self): def from_string(cls, uri, client=None): """Get a constructor for bucket object by URI. + .. code-block:: python + + from google.cloud import storage + from google.cloud.storage.bucket import Bucket + client = storage.Client() + bucket = Bucket.from_string("gs://bucket", client=client) + :type uri: str :param uri: The bucket uri pass to get bucket object. @@ -740,14 +747,6 @@ def from_string(cls, uri, client=None): :rtype: :class:`google.cloud.storage.bucket.Bucket` :returns: The bucket object created. - - Example: - Get a constructor for bucket object by URI.. - - >>> from google.cloud import storage - >>> from google.cloud.storage.bucket import Bucket - >>> client = storage.Client() - >>> bucket = Bucket.from_string("gs://bucket", client=client) """ scheme, netloc, path, query, frag = urlsplit(uri) @@ -1196,12 +1195,8 @@ def get_blob( ): """Get a blob object by name. - This will return None if the blob doesn't exist: - - .. literalinclude:: snippets.py - :start-after: START get_blob - :end-before: END get_blob - :dedent: 4 + See a [code sample](https://cloud.google.com/storage/docs/samples/storage-get-metadata#storage_get_metadata-python) + on how to retrieve metadata of an object. If :attr:`user_project` is set, bills the API request to that project. @@ -1385,15 +1380,6 @@ def list_blobs( :rtype: :class:`~google.api_core.page_iterator.Iterator` :returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. - - Example: - List blobs in the bucket with user_project. - - >>> from google.cloud import storage - >>> client = storage.Client() - - >>> bucket = storage.Bucket(client, "my-bucket-name", user_project="my-project") - >>> all_blobs = list(client.list_blobs(bucket)) """ client = self._require_client(client) return client.list_blobs( @@ -1458,8 +1444,8 @@ def get_notification( ): """Get Pub / Sub notification for this bucket. - See: - https://cloud.google.com/storage/docs/json_api/v1/notifications/get + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/notifications/get) + and a [code sample](https://cloud.google.com/storage/docs/samples/storage-print-pubsub-bucket-notification#storage_print_pubsub_bucket_notification-python). If :attr:`user_project` is set, bills the API request to that project. @@ -1481,15 +1467,6 @@ def get_notification( :rtype: :class:`.BucketNotification` :returns: notification instance. - - Example: - Get notification using notification id. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.get_bucket('my-bucket-name') # API request. - >>> notification = bucket.get_notification(notification_id='id') # API request. - """ notification = self.notification(notification_id=notification_id) notification.reload(client=client, timeout=timeout, retry=retry) @@ -1612,16 +1589,6 @@ def delete_blob( ): """Deletes a blob from the current bucket. - If the blob isn't found (backend 404), raises a - :class:`google.cloud.exceptions.NotFound`. - - For example: - - .. literalinclude:: snippets.py - :start-after: START delete_blob - :end-before: END delete_blob - :dedent: 4 - If :attr:`user_project` is set, bills the API request to that project. :type blob_name: str @@ -1661,15 +1628,10 @@ def delete_blob( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` - :raises: :class:`google.cloud.exceptions.NotFound` (to suppress - the exception, call ``delete_blobs``, passing a no-op - ``on_error`` callback, e.g.: - - .. literalinclude:: snippets.py - :start-after: START delete_blobs - :end-before: END delete_blobs - :dedent: 4 - + :raises: :class:`google.cloud.exceptions.NotFound` Raises a NotFound + if the blob isn't found. To suppress + the exception, use :meth:`delete_blobs` by passing a no-op + ``on_error`` callback. """ client = self._require_client(client) blob = Blob(blob_name, bucket=self, generation=generation) @@ -1721,8 +1683,8 @@ def delete_blobs( blob names to delete. :type on_error: callable - :param on_error: (Optional) Takes single argument: ``blob``. Called - called once for each blob raising + :param on_error: (Optional) Takes single argument: ``blob``. + Called once for each blob raising :class:`~google.cloud.exceptions.NotFound`; otherwise, the exception is propagated. @@ -1768,20 +1730,6 @@ def delete_blobs( :raises: :class:`~google.cloud.exceptions.NotFound` (if `on_error` is not passed). - - Example: - Delete blobs using generation match preconditions. - - >>> from google.cloud import storage - - >>> client = storage.Client() - >>> bucket = client.bucket("bucket-name") - - >>> blobs = [bucket.blob("blob-name-1"), bucket.blob("blob-name-2")] - >>> if_generation_match = [None] * len(blobs) - >>> if_generation_match[0] = "123" # precondition for "blob-name-1" - - >>> bucket.delete_blobs(blobs, if_generation_match=if_generation_match) """ _raise_if_len_differs( len(blobs), @@ -1843,6 +1791,9 @@ def copy_blob( If :attr:`user_project` is set, bills the API request to that project. + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/objects/copy) + and a [code sample](https://cloud.google.com/storage/docs/samples/storage-copy-file#storage_copy_file-python). + :type blob: :class:`google.cloud.storage.blob.Blob` :param blob: The blob to be copied. @@ -1922,20 +1873,6 @@ def copy_blob( :rtype: :class:`google.cloud.storage.blob.Blob` :returns: The new Blob. - - Example: - Copy a blob including ACL. - - >>> from google.cloud import storage - - >>> client = storage.Client(project="project") - - >>> bucket = client.bucket("bucket") - >>> dst_bucket = client.bucket("destination-bucket") - - >>> blob = bucket.blob("file.ext") - >>> new_blob = bucket.copy_blob(blob, dst_bucket) - >>> new_blob.acl.save(blob.acl) """ client = self._require_client(client) query_params = {} @@ -2300,8 +2237,8 @@ def lifecycle_rules(self): >>> bucket.lifecycle_rules = rules >>> bucket.update() - :setter: Set lifestyle rules for this bucket. - :getter: Gets the lifestyle rules for this bucket. + :setter: Set lifecycle rules for this bucket. + :getter: Gets the lifecycle rules for this bucket. :rtype: generator(dict) :returns: A sequence of mappings describing each lifecycle rule. @@ -2326,7 +2263,7 @@ def lifecycle_rules(self): @lifecycle_rules.setter def lifecycle_rules(self, rules): - """Set lifestyle rules configured for this bucket. + """Set lifecycle rules configured for this bucket. See https://cloud.google.com/storage/docs/lifecycle and https://cloud.google.com/storage/docs/json_api/v1/buckets @@ -2338,7 +2275,7 @@ def lifecycle_rules(self, rules): self._patch_property("lifecycle", {"rule": rules}) def clear_lifecyle_rules(self): - """Set lifestyle rules configured for this bucket. + """Clear lifecycle rules configured for this bucket. See https://cloud.google.com/storage/docs/lifecycle and https://cloud.google.com/storage/docs/json_api/v1/buckets @@ -2346,15 +2283,12 @@ def clear_lifecyle_rules(self): self.lifecycle_rules = [] def add_lifecycle_delete_rule(self, **kw): - """Add a "delete" rule to lifestyle rules configured for this bucket. + """Add a "delete" rule to lifecycle rules configured for this bucket. - See https://cloud.google.com/storage/docs/lifecycle and - https://cloud.google.com/storage/docs/json_api/v1/buckets - - .. literalinclude:: snippets.py - :start-after: START add_lifecycle_delete_rule - :end-before: END add_lifecycle_delete_rule - :dedent: 4 + This defines a [lifecycle configuration](https://cloud.google.com/storage/docs/lifecycle), + which is set on the bucket. For the general format of a lifecycle configuration, see the + [bucket resource representation for JSON](https://cloud.google.com/storage/docs/json_api/v1/buckets). + See also a [code sample](https://cloud.google.com/storage/docs/samples/storage-enable-bucket-lifecycle-management#storage_enable_bucket_lifecycle_management-python). :type kw: dict :params kw: arguments passed to :class:`LifecycleRuleConditions`. @@ -2364,15 +2298,11 @@ def add_lifecycle_delete_rule(self, **kw): self.lifecycle_rules = rules def add_lifecycle_set_storage_class_rule(self, storage_class, **kw): - """Add a "set storage class" rule to lifestyle rules. - - See https://cloud.google.com/storage/docs/lifecycle and - https://cloud.google.com/storage/docs/json_api/v1/buckets + """Add a "set storage class" rule to lifecycle rules. - .. literalinclude:: snippets.py - :start-after: START add_lifecycle_set_storage_class_rule - :end-before: END add_lifecycle_set_storage_class_rule - :dedent: 4 + This defines a [lifecycle configuration](https://cloud.google.com/storage/docs/lifecycle), + which is set on the bucket. For the general format of a lifecycle configuration, see the + [bucket resource representation for JSON](https://cloud.google.com/storage/docs/json_api/v1/buckets). :type storage_class: str, one of :attr:`STORAGE_CLASSES`. :param storage_class: new storage class to assign to matching items. @@ -2385,13 +2315,15 @@ def add_lifecycle_set_storage_class_rule(self, storage_class, **kw): self.lifecycle_rules = rules def add_lifecycle_abort_incomplete_multipart_upload_rule(self, **kw): - """Add a "abort incomplete multipart upload" rule to lifestyle rules. + """Add a "abort incomplete multipart upload" rule to lifecycle rules. - Note that the "age" lifecycle condition is the only supported condition - for this rule. + .. note:: + The "age" lifecycle condition is the only supported condition + for this rule. - See https://cloud.google.com/storage/docs/lifecycle and - https://cloud.google.com/storage/docs/json_api/v1/buckets + This defines a [lifecycle configuration](https://cloud.google.com/storage/docs/lifecycle), + which is set on the bucket. For the general format of a lifecycle configuration, see the + [bucket resource representation for JSON](https://cloud.google.com/storage/docs/json_api/v1/buckets). :type kw: dict :params kw: arguments passed to :class:`LifecycleRuleConditions`. @@ -2731,31 +2663,14 @@ def requester_pays(self, value): def configure_website(self, main_page_suffix=None, not_found_page=None): """Configure website-related properties. - See https://cloud.google.com/storage/docs/hosting-static-website + See https://cloud.google.com/storage/docs/static-website .. note:: - This (apparently) only works - if your bucket name is a domain name - (and to do that, you need to get approved somehow...). - - If you want this bucket to host a website, just provide the name - of an index page and a page to use when a blob isn't found: - - .. literalinclude:: snippets.py - :start-after: START configure_website - :end-before: END configure_website - :dedent: 4 - - You probably should also make the whole bucket public: - - .. literalinclude:: snippets.py - :start-after: START make_public - :end-before: END make_public - :dedent: 4 - - This says: "Make the bucket public, and all the stuff already in - the bucket, and anything else I add to the bucket. Just make it - all public." + This configures the bucket's website-related properties,controlling how + the service behaves when accessing bucket contents as a web site. + See [tutorials](https://cloud.google.com/storage/docs/hosting-static-website) and + [code samples](https://cloud.google.com/storage/docs/samples/storage-define-bucket-website-configuration#storage_define_bucket_website_configuration-python) + for more information. :type main_page_suffix: str :param main_page_suffix: The page to use as the main page @@ -2785,8 +2700,8 @@ def get_iam_policy( ): """Retrieve the IAM policy for the bucket. - See - https://cloud.google.com/storage/docs/json_api/v1/buckets/getIamPolicy + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/buckets/getIamPolicy) + and a [code sample](https://cloud.google.com/storage/docs/samples/storage-view-bucket-iam-members#storage_view_bucket_iam_members-python). If :attr:`user_project` is set, bills the API request to that project. @@ -2819,30 +2734,6 @@ def get_iam_policy( :rtype: :class:`google.api_core.iam.Policy` :returns: the policy instance, based on the resource returned from the ``getIamPolicy`` API request. - - Example: - - .. code-block:: python - - from google.cloud.storage.iam import STORAGE_OBJECT_VIEWER_ROLE - - policy = bucket.get_iam_policy(requested_policy_version=3) - - policy.version = 3 - - # Add a binding to the policy via it's bindings property - policy.bindings.append({ - "role": STORAGE_OBJECT_VIEWER_ROLE, - "members": {"serviceAccount:account@project.iam.gserviceaccount.com", ...}, - # Optional: - "condition": { - "title": "prefix" - "description": "Objects matching prefix" - "expression": "resource.name.startsWith(\"projects/project-name/buckets/bucket-name/objects/prefix\")" - } - }) - - bucket.set_iam_policy(policy) """ client = self._require_client(client) query_params = {} @@ -3159,19 +3050,10 @@ def generate_upload_policy(self, conditions, expiration=None, client=None): """Create a signed upload policy for uploading objects. This method generates and signs a policy document. You can use - `policy documents`_ to allow visitors to a website to upload files to + [`policy documents`](https://cloud.google.com/storage/docs/xml-api/post-object-forms) + to allow visitors to a website to upload files to Google Cloud Storage without giving them direct write access. - - For example: - - .. literalinclude:: snippets.py - :start-after: START policy_document - :end-before: END policy_document - :dedent: 4 - - .. _policy documents: - https://cloud.google.com/storage/docs/xml-api\ - /post-object#policydocument + See a [code sample](https://cloud.google.com/storage/docs/xml-api/post-object-forms#python). :type expiration: datetime :param expiration: (Optional) Expiration in UTC. If not specified, the @@ -3179,7 +3061,7 @@ def generate_upload_policy(self, conditions, expiration=None, client=None): :type conditions: list :param conditions: A list of conditions as described in the - `policy documents`_ documentation. + `policy documents` documentation. :type client: :class:`~google.cloud.storage.client.Client` :param client: (Optional) The client to use. If not passed, falls back @@ -3290,13 +3172,9 @@ def generate_signed_url( .. note:: If you are on Google Compute Engine, you can't generate a signed - URL using GCE service account. Follow `Issue 50`_ for updates on - this. If you'd like to be able to generate a signed URL from GCE, - you can use a standard service account from a JSON file rather - than a GCE service account. - - .. _Issue 50: https://github.com/GoogleCloudPlatform/\ - google-auth-library-python/issues/50 + URL using GCE service account. If you'd like to be able to generate + a signed URL from GCE, you can use a standard service account from a + JSON file rather than a GCE service account. If you have a bucket that you want to allow access to for a set amount of time, you can use this method to generate a URL that @@ -3305,21 +3183,6 @@ def generate_signed_url( If ``bucket_bound_hostname`` is set as an argument of :attr:`api_access_endpoint`, ``https`` works only if using a ``CDN``. - Example: - Generates a signed URL for this bucket using bucket_bound_hostname and scheme. - - >>> from google.cloud import storage - >>> client = storage.Client() - >>> bucket = client.get_bucket('my-bucket-name') - >>> url = bucket.generate_signed_url(expiration='url-expiration-time', bucket_bound_hostname='mydomain.tld', - >>> version='v4') - >>> url = bucket.generate_signed_url(expiration='url-expiration-time', bucket_bound_hostname='mydomain.tld', - >>> version='v4',scheme='https') # If using ``CDN`` - - This is particularly useful if you don't want publicly - accessible buckets, but don't want to require users to explicitly - log in. - :type expiration: Union[Integer, datetime.datetime, datetime.timedelta] :param expiration: Point in time when the signed URL should expire. If a ``datetime`` instance is passed without an explicit @@ -3393,6 +3256,9 @@ def generate_signed_url( elif version not in ("v2", "v4"): raise ValueError("'version' must be either 'v2' or 'v4'") + # If you are on Google Compute Engine, you can't generate a signed URL + # using GCE service account. + # See https://github.com/googleapis/google-auth-library-python/issues/50 if virtual_hosted_style: api_access_endpoint = f"https://{self.name}.storage.googleapis.com" elif bucket_bound_hostname: diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 9cccf413b..56bfa67cf 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -710,10 +710,9 @@ def get_bucket( if_metageneration_not_match=None, retry=DEFAULT_RETRY, ): - """API call: retrieve a bucket via a GET request. + """Retrieve a bucket via a GET request. - See - https://cloud.google.com/storage/docs/json_api/v1/buckets/get + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/buckets/get) and a [code sample](https://cloud.google.com/storage/docs/samples/storage-get-bucket-metadata#storage_get_bucket_metadata-python). Args: bucket_or_name (Union[ \ @@ -757,27 +756,6 @@ def get_bucket( Raises: google.cloud.exceptions.NotFound If the bucket is not found. - - Examples: - Retrieve a bucket using a string. - - .. literalinclude:: snippets.py - :start-after: START get_bucket - :end-before: END get_bucket - :dedent: 4 - - Get a bucket using a resource. - - >>> from google.cloud import storage - >>> client = storage.Client() - - >>> # Set properties on a plain resource object. - >>> bucket = client.get_bucket("my-bucket-name") - - >>> # Time passes. Another program may have modified the bucket - ... # in the meantime, so you want to get the latest state. - >>> bucket = client.get_bucket(bucket) # API request. - """ bucket = self._bucket_arg_to_bucket(bucket_or_name) bucket.reload( @@ -800,12 +778,7 @@ def lookup_bucket( """Get a bucket by name, returning None if not found. You can use this if you would rather check for a None value - than catching an exception: - - .. literalinclude:: snippets.py - :start-after: START lookup_bucket - :end-before: END lookup_bucket - :dedent: 4 + than catching a NotFound exception. :type bucket_name: str :param bucket_name: The name of the bucket to get. @@ -827,7 +800,7 @@ def lookup_bucket( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` - :rtype: :class:`google.cloud.storage.bucket.Bucket` + :rtype: :class:`google.cloud.storage.bucket.Bucket` or ``NoneType`` :returns: The bucket matching the name provided or None if not found. """ try: @@ -854,10 +827,9 @@ def create_bucket( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): - """API call: create a new bucket via a POST request. + """Create a new bucket via a POST request. - See - https://cloud.google.com/storage/docs/json_api/v1/buckets/insert + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/buckets/insert) and a [code sample](https://cloud.google.com/storage/docs/samples/storage-create-bucket#storage_create_bucket-python). Args: bucket_or_name (Union[ \ @@ -878,7 +850,7 @@ def create_bucket( location (str): (Optional) The location of the bucket. If not passed, the default location, US, will be used. If specifying a dual-region, - `data_locations` should be set in conjunction.. See: + `data_locations` should be set in conjunction. See: https://cloud.google.com/storage/docs/locations data_locations (list of str): (Optional) The list of regional locations of a custom dual-region bucket. @@ -917,28 +889,6 @@ def create_bucket( Raises: google.cloud.exceptions.Conflict If the bucket already exists. - - Examples: - Create a bucket using a string. - - .. literalinclude:: snippets.py - :start-after: START create_bucket - :end-before: END create_bucket - :dedent: 4 - - Create a bucket using a resource. - - >>> from google.cloud import storage - >>> client = storage.Client() - - >>> # Set properties on a plain resource object. - >>> bucket = storage.Bucket("my-bucket-name") - >>> bucket.location = "europe-west6" - >>> bucket.storage_class = "COLDLINE" - - >>> # Pass that resource object to the client. - >>> bucket = client.create_bucket(bucket) # API request. - """ bucket = self._bucket_arg_to_bucket(bucket_or_name) query_params = {} @@ -1019,6 +969,8 @@ def download_blob_to_file( ): """Download the contents of a blob object or blob URI into a file-like object. + See https://cloud.google.com/storage/docs/downloading-objects + Args: blob_or_uri (Union[ \ :class:`~google.cloud.storage.blob.Blob`, \ @@ -1090,30 +1042,6 @@ def download_blob_to_file( predicates in a Retry object. The default will always be used. Other configuration changes for Retry objects such as delays and deadlines are respected. - - Examples: - Download a blob using a blob resource. - - >>> from google.cloud import storage - >>> client = storage.Client() - - >>> bucket = client.get_bucket('my-bucket-name') - >>> blob = storage.Blob('path/to/blob', bucket) - - >>> with open('file-to-download-to', 'w') as file_obj: - >>> client.download_blob_to_file(blob, file_obj) # API request. - - - Download a blob using a URI. - - >>> from google.cloud import storage - >>> client = storage.Client() - - >>> with open('file-to-download-to', 'wb') as file_obj: - >>> client.download_blob_to_file( - >>> 'gs://bucket_name/path/to/blob', file_obj) - - """ # Handle ConditionalRetryPolicy. @@ -1184,6 +1112,11 @@ def list_blobs( If :attr:`user_project` is set, bills the API request to that project. + .. note:: + List prefixes (directories) in a bucket using a prefix and delimiter. + See a [code sample](https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix#storage_list_files_with_prefix-python) + listing objects using a prefix filter. + Args: bucket_or_name (Union[ \ :class:`~google.cloud.storage.bucket.Bucket`, \ @@ -1274,12 +1207,6 @@ def list_blobs( As part of the response, you'll also get back an iterator.prefixes entity that lists object names up to and including the requested delimiter. Duplicate entries are omitted from this list. - - .. note:: - List prefixes (directories) in a bucket using a prefix and delimiter. - See a [sample](https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix#storage_list_files_with_prefix-python) - listing objects using a prefix filter. - """ bucket = self._bucket_arg_to_bucket(bucket_or_name) @@ -1342,12 +1269,7 @@ def list_buckets( This will not populate the list of blobs available in each bucket. - .. literalinclude:: snippets.py - :start-after: START list_buckets - :end-before: END list_buckets - :dedent: 4 - - This implements "storage.buckets.list". + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/buckets/list) and a [code sample](https://cloud.google.com/storage/docs/samples/storage-list-buckets#storage_list_buckets-python). :type max_results: int :param max_results: (Optional) The maximum number of buckets to return. @@ -1606,7 +1528,7 @@ def generate_signed_post_policy_v4( service_account_email=None, access_token=None, ): - """Generate a V4 signed policy object. + """Generate a V4 signed policy object. Generated policy object allows user to upload objects with a POST request. .. note:: @@ -1615,7 +1537,7 @@ def generate_signed_post_policy_v4( ``credentials`` has a ``service_account_email`` property which identifies the credentials. - Generated policy object allows user to upload objects with a POST request. + See a [code sample](https://github.com/googleapis/python-storage/blob/main/samples/snippets/storage_generate_signed_post_policy_v4.py). :type bucket_name: str :param bucket_name: Bucket name. @@ -1663,28 +1585,6 @@ def generate_signed_post_policy_v4( :rtype: dict :returns: Signed POST policy. - - Example: - Generate signed POST policy and upload a file. - - >>> import datetime - >>> from google.cloud import storage - >>> client = storage.Client() - >>> tz = datetime.timezone(datetime.timedelta(hours=1), 'CET') - >>> policy = client.generate_signed_post_policy_v4( - "bucket-name", - "blob-name", - expiration=datetime.datetime(2020, 3, 17, tzinfo=tz), - conditions=[ - ["content-length-range", 0, 255] - ], - fields=[ - "x-goog-meta-hello" => "world" - ], - ) - >>> with open("bucket-name", "rb") as f: - files = {"file": ("bucket-name", f)} - requests.post(policy["url"], data=policy["fields"], files=files) """ credentials = self._credentials if credentials is None else credentials ensure_signed_credentials(credentials) diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index dfdb90c7c..d3ae135bb 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Support for file-like I/O.""" + import io import warnings diff --git a/google/cloud/storage/hmac_key.py b/google/cloud/storage/hmac_key.py index 7f6de7eee..41f513ec6 100644 --- a/google/cloud/storage/hmac_key.py +++ b/google/cloud/storage/hmac_key.py @@ -12,6 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Configure HMAC keys that can be used to authenticate requests to Google Cloud Storage. + +See [HMAC keys documentation](https://cloud.google.com/storage/docs/authentication/hmackeys) +""" + from google.cloud.exceptions import NotFound from google.cloud._helpers import _rfc3339_nanos_to_datetime diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index d9fa79ac6..4eb807fa9 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -12,7 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Support for bucket notification resources.""" +"""Configure bucket notification resources to interact with Google Cloud Pub/Sub. + +See [Cloud Pub/Sub Notifications for Google Cloud Storage](https://cloud.google.com/storage/docs/pubsub-notifications) +""" import re @@ -414,22 +417,17 @@ def delete(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): def _parse_topic_path(topic_path): """Verify that a topic path is in the correct format. - .. _resource manager docs: https://cloud.google.com/resource-manager/\ - reference/rest/v1beta1/projects#\ - Project.FIELDS.project_id - .. _topic spec: https://cloud.google.com/storage/docs/json_api/v1/\ - notifications/insert#topic - Expected to be of the form: //pubsub.googleapis.com/projects/{project}/topics/{topic} where the ``project`` value must be "6 to 30 lowercase letters, digits, or hyphens. It must start with a letter. Trailing hyphens are prohibited." - (see `resource manager docs`_) and ``topic`` must have length at least two, + (see [`resource manager docs`](https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects#Project.FIELDS.project_id)) + and ``topic`` must have length at least two, must start with a letter and may only contain alphanumeric characters or ``-``, ``_``, ``.``, ``~``, ``+`` or ``%`` (i.e characters used for URL - encoding, see `topic spec`_). + encoding, see [`topic spec`](https://cloud.google.com/storage/docs/json_api/v1/notifications/insert#topic)). Args: topic_path (str): The topic path to be verified. diff --git a/google/cloud/storage/retry.py b/google/cloud/storage/retry.py index a9fb3bb3f..3ea3ae4a0 100644 --- a/google/cloud/storage/retry.py +++ b/google/cloud/storage/retry.py @@ -12,6 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Helpers for configuring retries with exponential back-off. + +See [Retry Strategy for Google Cloud Storage](https://cloud.google.com/storage/docs/retry-strategy#client-libraries) +""" + import requests import requests.exceptions as requests_exceptions From 7dfeb622bb966e368786e3c9be67ad77b3150725 Mon Sep 17 00:00:00 2001 From: rsaksham Date: Fri, 21 Oct 2022 05:34:14 +0530 Subject: [PATCH 108/509] feat: make tests run against environments other than prod (#883) Made changes that override api endpoint information while triggering builds from kokoro . All tests against prod are still successful. Some system tests are currently incompatible with nonprod environments and hence are marked to be skipped if endpoint is being overriden. --- .kokoro/build.sh | 10 ++++++++++ google/cloud/storage/_helpers.py | 7 ++++++- google/cloud/storage/_http.py | 5 ++--- google/cloud/storage/blob.py | 18 ++++++++++++------ noxfile.py | 25 ++++++++++++++++++++++--- tests/system/_helpers.py | 2 ++ tests/system/test__signing.py | 12 ++++++++++-- tests/system/test_blob.py | 4 ++++ tests/system/test_bucket.py | 13 ++++++++++++- tests/system/test_client.py | 14 +++++++++++++- 10 files changed, 93 insertions(+), 17 deletions(-) diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 500351238..8e9f1042c 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -33,6 +33,16 @@ export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/service-account.json # Setup project id. export PROJECT_ID=$(cat "${KOKORO_GFILE_DIR}/project-id.json") +# Export variable to override api endpoint +export API_ENDPOINT_OVERRIDE + +# Export variable to override api endpoint version +export API_VERSION_OVERRIDE + +# Export dual region locations +export DUAL_REGION_LOC_1 +export DUAL_REGION_LOC_2 + # Remove old nox python3 -m pip uninstall --yes --quiet nox-automation diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index c02be2b45..82bb4230e 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -33,9 +33,14 @@ STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" """Environment variable defining host for Storage emulator.""" -_DEFAULT_STORAGE_HOST = "https://storage.googleapis.com" +_DEFAULT_STORAGE_HOST = os.getenv( + "API_ENDPOINT_OVERRIDE", "https://storage.googleapis.com" +) """Default storage host for JSON API.""" +_API_VERSION = os.getenv("API_VERSION_OVERRIDE", "v1") +"""API version of the default storage host""" + _BASE_STORAGE_URI = "storage.googleapis.com" """Base request endpoint URI for JSON API.""" diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index 3a739bba6..fdf1d56b4 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -15,7 +15,6 @@ """Create / interact with Google Cloud Storage connections.""" import functools - from google.cloud import _http from google.cloud.storage import __version__ from google.cloud.storage import _helpers @@ -35,7 +34,7 @@ class Connection(_http.JSONConnection): :param api_endpoint: (Optional) api endpoint to use. """ - DEFAULT_API_ENDPOINT = "https://storage.googleapis.com" + DEFAULT_API_ENDPOINT = _helpers._DEFAULT_STORAGE_HOST DEFAULT_API_MTLS_ENDPOINT = "https://storage.mtls.googleapis.com" def __init__(self, client, client_info=None, api_endpoint=None): @@ -52,7 +51,7 @@ def __init__(self, client, client_info=None, api_endpoint=None): if agent_version not in self._client_info.user_agent: self._client_info.user_agent += f" {agent_version} " - API_VERSION = "v1" + API_VERSION = _helpers._API_VERSION """The version of the API, used in building the API call's URL.""" API_URL_TEMPLATE = "{api_base_url}/storage/{api_version}{path}" diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 1a151b096..6f4952f44 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -60,6 +60,8 @@ from google.cloud.storage._signing import generate_signed_url_v2 from google.cloud.storage._signing import generate_signed_url_v4 from google.cloud.storage._helpers import _NUM_RETRIES_MESSAGE +from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST +from google.cloud.storage._helpers import _API_VERSION from google.cloud.storage.acl import ACL from google.cloud.storage.acl import ObjectACL from google.cloud.storage.constants import _DEFAULT_TIMEOUT @@ -78,10 +80,12 @@ from google.cloud.storage.fileio import BlobWriter -_API_ACCESS_ENDPOINT = "https://storage.googleapis.com" +_API_ACCESS_ENDPOINT = _DEFAULT_STORAGE_HOST _DEFAULT_CONTENT_TYPE = "application/octet-stream" -_DOWNLOAD_URL_TEMPLATE = "{hostname}/download/storage/v1{path}?alt=media" -_BASE_UPLOAD_TEMPLATE = "{hostname}/upload/storage/v1{bucket_path}/o?uploadType=" +_DOWNLOAD_URL_TEMPLATE = "{hostname}/download/storage/{api_version}{path}?alt=media" +_BASE_UPLOAD_TEMPLATE = ( + "{hostname}/upload/storage/{api_version}{bucket_path}/o?uploadType=" +) _MULTIPART_URL_TEMPLATE = _BASE_UPLOAD_TEMPLATE + "multipart" _RESUMABLE_URL_TEMPLATE = _BASE_UPLOAD_TEMPLATE + "resumable" # NOTE: "acl" is also writeable but we defer ACL management to @@ -823,7 +827,9 @@ def _get_download_url( name_value_pairs = [] if self.media_link is None: hostname = _get_host_name(client._connection) - base_url = _DOWNLOAD_URL_TEMPLATE.format(hostname=hostname, path=self.path) + base_url = _DOWNLOAD_URL_TEMPLATE.format( + hostname=hostname, path=self.path, api_version=_API_VERSION + ) if self.generation is not None: name_value_pairs.append(("generation", f"{self.generation:d}")) else: @@ -1838,7 +1844,7 @@ def _do_multipart_upload( hostname = _get_host_name(client._connection) base_url = _MULTIPART_URL_TEMPLATE.format( - hostname=hostname, bucket_path=self.bucket.path + hostname=hostname, bucket_path=self.bucket.path, api_version=_API_VERSION ) name_value_pairs = [] @@ -2025,7 +2031,7 @@ def _initiate_resumable_upload( hostname = _get_host_name(client._connection) base_url = _RESUMABLE_URL_TEMPLATE.format( - hostname=hostname, bucket_path=self.bucket.path + hostname=hostname, bucket_path=self.bucket.path, api_version=_API_VERSION ) name_value_pairs = [] diff --git a/noxfile.py b/noxfile.py index ca14b42cc..3b8eb127b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -111,6 +111,7 @@ def system(session): """Run the system test suite.""" system_test_path = os.path.join("tests", "system.py") system_test_folder_path = os.path.join("tests", "system") + rerun_count = 0 # Check the value of `RUN_SYSTEM_TESTS` env var. It defaults to true. if os.environ.get("RUN_SYSTEM_TESTS", "true") == "false": @@ -121,6 +122,12 @@ def system(session): # mTLS tests requires pyopenssl. if os.environ.get("GOOGLE_API_USE_CLIENT_CERTIFICATE", "") == "true": session.install("pyopenssl") + # Check if endpoint is being overriden for rerun_count + if ( + os.getenv("API_ENDPOINT_OVERRIDE", "https://storage.googleapis.com") + != "https://storage.googleapis.com" + ): + rerun_count = 3 system_test_exists = os.path.exists(system_test_path) system_test_folder_exists = os.path.exists(system_test_folder_path) @@ -138,7 +145,7 @@ def system(session): # 2021-05-06: defer installing 'google-cloud-*' to after this package, # in order to work around Python 2.7 googolapis-common-protos # issue. - session.install("mock", "pytest", "-c", constraints_path) + session.install("mock", "pytest", "pytest-rerunfailures", "-c", constraints_path) session.install("-e", ".", "-c", constraints_path) session.install( "google-cloud-testutils", @@ -151,9 +158,21 @@ def system(session): # Run py.test against the system tests. if system_test_exists: - session.run("py.test", "--quiet", system_test_path, *session.posargs) + session.run( + "py.test", + "--quiet", + "--reruns={}".format(rerun_count), + system_test_path, + *session.posargs, + ) if system_test_folder_exists: - session.run("py.test", "--quiet", system_test_folder_path, *session.posargs) + session.run( + "py.test", + "--quiet", + "--reruns={}".format(rerun_count), + system_test_folder_path, + *session.posargs, + ) @nox.session(python=CONFORMANCE_TEST_PYTHON_VERSIONS) diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index 12726db73..5a4c7d38d 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -20,6 +20,7 @@ from test_utils.retry import RetryErrors from test_utils.retry import RetryInstanceState from test_utils.system import unique_resource_id +from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST retry_429 = RetryErrors(exceptions.TooManyRequests) retry_429_harder = RetryErrors(exceptions.TooManyRequests, max_tries=10) @@ -31,6 +32,7 @@ user_project = os.environ.get("GOOGLE_CLOUD_TESTS_USER_PROJECT") testing_mtls = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true" signing_blob_content = b"This time for sure, Rocky!" +is_api_endpoint_override = _DEFAULT_STORAGE_HOST != "https://storage.googleapis.com" def _bad_copy(bad_request): diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index a33f2db4e..26d73e543 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -17,7 +17,7 @@ import hashlib import os import time - +import pytest import requests from google.api_core import path_template @@ -41,7 +41,11 @@ def _create_signed_list_blobs_url_helper( expiration = _morph_expiration(version, expiration) signed_url = bucket.generate_signed_url( - expiration=expiration, method=method, client=client, version=version + expiration=expiration, + method=method, + client=client, + version=version, + api_access_endpoint=_helpers._DEFAULT_STORAGE_HOST, ) response = requests.get(signed_url) @@ -371,6 +375,10 @@ def test_create_signed_resumable_upload_url_v4(storage_client, signing_bucket, n ) +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) def test_generate_signed_post_policy_v4( storage_client, buckets_to_delete, blobs_to_delete, service_account, no_mtls ): diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 5046159fd..37e454737 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -97,6 +97,10 @@ def test_large_file_write_from_stream_w_failed_checksum( assert not blob.exists() +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) def test_large_file_write_from_stream_w_encryption_key( storage_client, shared_bucket, diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 9fe7aa648..4795837f0 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -13,7 +13,6 @@ # limitations under the License. import datetime - import pytest from google.api_core import exceptions @@ -124,6 +123,10 @@ def test_bucket_lifecycle_rules(storage_client, buckets_to_delete): assert list(bucket.lifecycle_rules) == [] +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) def test_bucket_update_labels(storage_client, buckets_to_delete): bucket_name = _helpers.unique_name("update-labels") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) @@ -797,6 +800,10 @@ def test_bucket_lock_retention_policy( bucket.patch() +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) def test_new_bucket_w_ubla( storage_client, buckets_to_delete, @@ -966,6 +973,10 @@ def test_new_bucket_created_w_enforced_pap( assert not bucket.iam_configuration.uniform_bucket_level_access_enabled +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) def test_new_bucket_with_rpo( storage_client, buckets_to_delete, diff --git a/tests/system/test_client.py b/tests/system/test_client.py index db912561d..bb09e6075 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -14,6 +14,7 @@ import io import re +import os import tempfile import pytest @@ -23,9 +24,15 @@ from . import _helpers +dual_data_loc_1 = os.getenv("DUAL_REGION_LOC_1", "US-EAST1") +dual_data_loc_2 = os.getenv("DUAL_REGION_LOC_2", "US-WEST1") public_bucket = "gcp-public-data-landsat" +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) @vpcsc_config.skip_if_inside_vpcsc def test_anonymous_client_access_to_public_bucket(): from google.cloud.storage.client import Client @@ -40,6 +47,10 @@ def test_anonymous_client_access_to_public_bucket(): _helpers.retry_429_503(blob.download_to_file)(stream) +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) def test_get_service_account_email(storage_client, service_account): domain = "gs-project-accounts.iam.gserviceaccount.com" email = storage_client.get_service_account_email() @@ -69,7 +80,8 @@ def test_create_bucket_dual_region(storage_client, buckets_to_delete): new_bucket_name = _helpers.unique_name("dual-region-bucket") location = "US" - data_locations = ["US-EAST1", "US-WEST1"] + + data_locations = [dual_data_loc_1, dual_data_loc_2] with pytest.raises(exceptions.NotFound): storage_client.get_bucket(new_bucket_name) From f1dcc2bc0b49928cff2cf8056d1c08febbefdd00 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Mon, 24 Oct 2022 12:58:33 -0400 Subject: [PATCH 109/509] chore: add OwlBot as a required check (#891) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: add OwlBot as a required check * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * add replacement in owlbot.py to customize .kokoro/build.sh Co-authored-by: Owl Bot --- .github/sync-repo-settings.yaml | 1 + .kokoro/build.sh | 18 +++++++++--------- owlbot.py | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index d95c4ac9b..cc1eb10e1 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -10,6 +10,7 @@ branchProtectionRules: - 'Kokoro' - 'cla/google' - 'Kokoro system-3.8' + - 'OwlBot Post Processor' - pattern: python2 requiresCodeOwnerReviews: true requiresStrictStatusChecks: true diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 8e9f1042c..ec58d54c1 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -24,15 +24,6 @@ cd "${PROJECT_ROOT}" # Disable buffering, so that the logs stream through. export PYTHONUNBUFFERED=1 -# Debug: show build environment -env | grep KOKORO - -# Setup service account credentials. -export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/service-account.json - -# Setup project id. -export PROJECT_ID=$(cat "${KOKORO_GFILE_DIR}/project-id.json") - # Export variable to override api endpoint export API_ENDPOINT_OVERRIDE @@ -43,6 +34,15 @@ export API_VERSION_OVERRIDE export DUAL_REGION_LOC_1 export DUAL_REGION_LOC_2 +# Debug: show build environment +env | grep KOKORO + +# Setup service account credentials. +export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/service-account.json + +# Setup project id. +export PROJECT_ID=$(cat "${KOKORO_GFILE_DIR}/project-id.json") + # Remove old nox python3 -m pip uninstall --yes --quiet nox-automation diff --git a/owlbot.py b/owlbot.py index 6ad5e88ba..8d0b89d14 100644 --- a/owlbot.py +++ b/owlbot.py @@ -52,6 +52,21 @@ ], ) +s.replace( + ".kokoro/build.sh", + "export PYTHONUNBUFFERED=1", + """export PYTHONUNBUFFERED=1 + +# Export variable to override api endpoint +export API_ENDPOINT_OVERRIDE + +# Export variable to override api endpoint version +export API_VERSION_OVERRIDE + +# Export dual region locations +export DUAL_REGION_LOC_1 +export DUAL_REGION_LOC_2""") + python.py_samples(skip_readmes=True) s.shell.run(["nox", "-s", "blacken"], hide_output=False) From 1c5408d3c558b4ba18cef8f10eeefbb04460bce4 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 26 Oct 2022 13:15:17 +0200 Subject: [PATCH 110/509] chore(deps): update dependency pytest to v7.2.0 (#893) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index d999aa86c..4e8a7389f 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.1.3 +pytest==7.2.0 mock==4.0.3 backoff==2.2.1 \ No newline at end of file From 9dcc6846b52e460bee8d725099abd4dc734fa7ad Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 27 Oct 2022 09:19:11 -0700 Subject: [PATCH 111/509] feat: Add "transfer_manager" module for concurrent uploads and downloads as a preview feature (#844) * checkpoint before design doc impl * checkpoint * more tests * code and tests for transfer manager complete * proactively close temp files when finished reading * respond to comments; destroy tmp files as they are consumed * Add system tests, docstrings, address feedback * Respond to review comments * verify md5 hash of downloaded file in test * lint * default empty strings for root arguments * fix bug with blob constructor * add warning about files not being deleted if their downloads fail --- google/cloud/storage/constants.py | 1 + google/cloud/storage/fileio.py | 6 +- google/cloud/storage/transfer_manager.py | 557 +++++++++++++++++++++++ tests/system/test_transfer_manager.py | 104 +++++ tests/unit/test_transfer_manager.py | 341 ++++++++++++++ 5 files changed, 1007 insertions(+), 2 deletions(-) create mode 100644 google/cloud/storage/transfer_manager.py create mode 100644 tests/system/test_transfer_manager.py create mode 100644 tests/unit/test_transfer_manager.py diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index babbc5a42..5d6497295 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + """Constants used across google.cloud.storage modules.""" # Storage classes diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index d3ae135bb..d09a3c885 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Support for file-like I/O.""" +"""Module for file-like access of blobs, usually invoked via Blob.open().""" import io import warnings @@ -101,10 +101,12 @@ class BlobReader(io.BufferedIOBase): - ``if_metageneration_match`` - ``if_metageneration_not_match`` - ``timeout`` + + Note that download_kwargs are also applied to blob.reload(), if a reload + is needed during seek(). """ def __init__(self, blob, chunk_size=None, retry=DEFAULT_RETRY, **download_kwargs): - """docstring note that download_kwargs also used for reload()""" for kwarg in download_kwargs: if kwarg not in VALID_DOWNLOAD_KWARGS: raise ValueError( diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py new file mode 100644 index 000000000..162e6465d --- /dev/null +++ b/google/cloud/storage/transfer_manager.py @@ -0,0 +1,557 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Concurrent media operations. This is a PREVIEW FEATURE: API may change.""" + +import concurrent.futures + +import tempfile + +from google.api_core import exceptions + + +DEFAULT_CHUNK_SIZE = 200 * 1024 * 1024 + + +def upload_many( + file_blob_pairs, + skip_if_exists=False, + upload_kwargs=None, + max_workers=None, + deadline=None, + raise_exception=False, +): + """Upload many files concurrently via a worker pool. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + :type file_blob_pairs: List(Tuple(IOBase or str, 'google.cloud.storage.blob.Blob')) + :param file_blob_pairs: + A list of tuples of a file or filename and a blob. Each file will be + uploaded to the corresponding blob by using blob.upload_from_file() or + blob.upload_from_filename() as appropriate. + + :type skip_if_exists: bool + :param skip_if_exists: + If True, blobs that already have a live version will not be overwritten. + This is accomplished by setting "if_generation_match = 0" on uploads. + Uploads so skipped will result in a 412 Precondition Failed response + code, which will be included in the return value but not raised + as an exception regardless of the value of raise_exception. + + :type upload_kwargs: dict + :param upload_kwargs: + A dictionary of keyword arguments to pass to the upload method. Refer + to the documentation for blob.upload_from_file() or + blob.upload_from_filename() for more information. The dict is directly + passed into the upload methods and is not validated by this function. + + :type max_workers: int + :param max_workers: + The number of workers (effectively, the number of threads) to use in + the worker pool. Refer to concurrent.futures.ThreadPoolExecutor + documentation for details. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. + + If skip_if_exists is True, 412 Precondition Failed responses are + considered part of normal operation and are not raised as an exception. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + upload method is used (typically, None). + """ + if upload_kwargs is None: + upload_kwargs = {} + if skip_if_exists: + upload_kwargs["if_generation_match"] = 0 + + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + futures = [] + for path_or_file, blob in file_blob_pairs: + method = ( + blob.upload_from_filename + if isinstance(path_or_file, str) + else blob.upload_from_file + ) + futures.append(executor.submit(method, path_or_file, **upload_kwargs)) + results = [] + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + for future in futures: + exp = future.exception() + + # If raise_exception is False, don't call future.result() + if exp and not raise_exception: + results.append(exp) + # If skip_if_exists and the exception is PreconditionFailed, do same. + elif exp and skip_if_exists and isinstance(exp, exceptions.PreconditionFailed): + results.append(exp) + # Get the real result. If there was an exception not handled above, + # this will raise it. + else: + results.append(future.result()) + return results + + +def download_many( + blob_file_pairs, + download_kwargs=None, + max_workers=None, + deadline=None, + raise_exception=False, +): + """Download many blobs concurrently via a worker pool. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + :type blob_file_pairs: List(Tuple('google.cloud.storage.blob.Blob', IOBase or str)) + :param blob_file_pairs: + A list of tuples of blob and a file or filename. Each blob will be + downloaded to the corresponding blob by using blob.download_to_file() or + blob.download_to_filename() as appropriate. + + Note that blob.download_to_filename() does not delete the destination + file if the download fails. + + :type download_kwargs: dict + :param download_kwargs: + A dictionary of keyword arguments to pass to the download method. Refer + to the documentation for blob.download_to_file() or + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. + + :type max_workers: int + :param max_workers: + The number of workers (effectively, the number of threads) to use in + the worker pool. Refer to concurrent.futures.ThreadPoolExecutor + documentation for details. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + download method is used (typically, None). + """ + + if download_kwargs is None: + download_kwargs = {} + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + futures = [] + for blob, path_or_file in blob_file_pairs: + method = ( + blob.download_to_filename + if isinstance(path_or_file, str) + else blob.download_to_file + ) + futures.append(executor.submit(method, path_or_file, **download_kwargs)) + results = [] + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + for future in futures: + if not raise_exception: + exp = future.exception() + if exp: + results.append(exp) + continue + results.append(future.result()) + return results + + +def download_chunks_concurrently_to_file( + blob, + file_obj, + chunk_size=DEFAULT_CHUNK_SIZE, + download_kwargs=None, + max_workers=None, + deadline=None, +): + """Download a single blob in chunks, concurrently. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + Use of this function, in cases where single threads are unable to fully + saturate available network bandwidth, may improve download performance for + large objects. + + The size of the blob must be known in order to calculate the number of + chunks. If the size is not already set, blob.reload() will be called + automatically to set it. + + :type blob: 'google.cloud.storage.blob.Blob' + :param blob: + The blob to download. + + :type file_obj: IOBase + :param file_obj: The file object to which the downloaded chunks will be + written. Chunks are written in order. While the current implementation + of this function does not use seek(), a future version may use seek() to + write chunks out of order to improve write performance. + + :type chunk_size: int + :param chunk_size: The size of each chunk. An excessively small size may + have a negative performance impact, as each chunk will be uploaded in a + separate HTTP request. + + :type download_kwargs: dict + :param download_kwargs: + A dictionary of keyword arguments to pass to the download method. Refer + to the documentation for blob.download_to_file() or + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. + + :type max_workers: int + :param max_workers: + The number of workers (effectively, the number of threads) to use in + the worker pool. Refer to concurrent.futures.ThreadPoolExecutor + documentation for details. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + """ + + if download_kwargs is None: + download_kwargs = {} + # We must know the size of the object, and the generation. + if not blob.size or not blob.generation: + blob.reload() + + def download_range_via_tempfile(blob, start, end, download_kwargs): + tmp = tempfile.TemporaryFile() + blob.download_to_file(tmp, start=start, end=end, **download_kwargs) + return tmp + + futures = [] + + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + cursor = 0 + while cursor < blob.size: + start = cursor + cursor = min(cursor + chunk_size, blob.size) + futures.append( + executor.submit( + download_range_via_tempfile, + blob, + start=start, + end=cursor - 1, + download_kwargs=download_kwargs, + ) + ) + + # Wait until all futures are done and process them in order. + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + for future in futures: + tmp = future.result() + tmp.seek(0) + file_obj.write(tmp.read()) + tmp.close() + + +def upload_many_from_filenames( + bucket, + filenames, + root="", + blob_name_prefix="", + skip_if_exists=False, + blob_constructor_kwargs=None, + upload_kwargs=None, + max_workers=None, + deadline=None, + raise_exception=False, +): + """Upload many files concurrently by their filenames. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + The destination blobs are automatically created, with blob names based on + the source filenames and the blob_name_prefix. + + For example, if the `filenames` include "images/icon.jpg", `root` is + "/home/myuser/", and `blob_name_prefix` is "myfiles/", then the file at + "/home/myuser/images/icon.jpg" will be uploaded to a blob named + "myfiles/images/icon.jpg". + + :type bucket: 'google.cloud.storage.bucket.Bucket' + :param bucket: + The bucket which will contain the uploaded blobs. + + :type filenames: list(str) + :param filenames: + A list of filenames to be uploaded. This may include part of the path. + The full path to the file must be root + filename. The filename is + separate from the root because the filename will also determine the + name of the destination blob. + + :type root: str + :param root: + A string that will be prepended to each filename in the input list, in + order to find the source file for each blob. Unlike the filename itself, + the root string does not affect the name of the uploaded blob itself. + The root string will usually end in "/" (or "\\" depending on platform) + but is not required to do so. + + For instance, if the root string is "/tmp/img-" and a filename is + "0001.jpg", with an empty blob_name_prefix, then the file uploaded will + be "/tmp/img-0001.jpg" and the destination blob will be "0001.jpg". + + This parameter can be an empty string. + + :type blob_name_prefix: str + :param blob_name_prefix: + A string that will be prepended to each filename in the input list, in + order to determine the name of the destination blob. Unlike the filename + itself, the prefix string does not affect the location the library will + look for the source data on the local filesystem. + + For instance, if the root is "/tmp/img-", the blob_name_prefix is + "myuser/mystuff-" and a filename is "0001.jpg" then the file uploaded + will be "/tmp/img-0001.jpg" and the destination blob will be + "myuser/mystuff-0001.jpg". + + The blob_name_prefix can be blank (an empty string). + + :type skip_if_exists: bool + :param skip_if_exists: + If True, blobs that already have a live version will not be overwritten. + This is accomplished by setting "if_generation_match = 0" on uploads. + Uploads so skipped will result in a 412 Precondition Failed response + code, which will be included in the return value but not raised + as an exception regardless of the value of raise_exception. + + :type blob_constructor_kwargs: dict + :param blob_constructor_kwargs: + A dictionary of keyword arguments to pass to the blob constructor. Refer + to the documentation for blob.Blob() for more information. The dict is + directly passed into the constructor and is not validated by this + function. `name` and `bucket` keyword arguments are reserved by this + function and will result in an error if passed in here. + + :type upload_kwargs: dict + :param upload_kwargs: + A dictionary of keyword arguments to pass to the upload method. Refer + to the documentation for blob.upload_from_file() or + blob.upload_from_filename() for more information. The dict is directly + passed into the upload methods and is not validated by this function. + + :type max_workers: int + :param max_workers: + The number of workers (effectively, the number of threads) to use in + the worker pool. Refer to concurrent.futures.ThreadPoolExecutor + documentation for details. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. + + If skip_if_exists is True, 412 Precondition Failed responses are + considered part of normal operation and are not raised as an exception. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + upload method is used (typically, None). + """ + if blob_constructor_kwargs is None: + blob_constructor_kwargs = {} + + file_blob_pairs = [] + + for filename in filenames: + path = root + filename + blob_name = blob_name_prefix + filename + blob = bucket.blob(blob_name, **blob_constructor_kwargs) + file_blob_pairs.append((path, blob)) + + return upload_many( + file_blob_pairs, + skip_if_exists=skip_if_exists, + upload_kwargs=upload_kwargs, + max_workers=max_workers, + deadline=deadline, + raise_exception=raise_exception, + ) + + +def download_many_to_path( + bucket, + blob_names, + path_root="", + blob_name_prefix="", + download_kwargs=None, + max_workers=None, + deadline=None, + raise_exception=False, +): + """Download many files concurrently by their blob names. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + The destination files are automatically created, with filenames based on + the source blob_names and the path_root. + + The destination files are not automatically deleted if their downloads fail, + so please check the return value of this function for any exceptions, or + enable `raise_exception=True`, and process the files accordingly. + + For example, if the `blob_names` include "icon.jpg", `path_root` is + "/home/myuser/", and `blob_name_prefix` is "images/", then the blob named + "images/icon.jpg" will be downloaded to a file named + "/home/myuser/icon.jpg". + + :type bucket: 'google.cloud.storage.bucket.Bucket' + :param bucket: + The bucket which contains the blobs to be downloaded + + :type blob_names: list(str) + :param blob_names: + A list of blobs to be downloaded. The blob name in this string will be + used to determine the destination file path as well. + + The full name to the blob must be blob_name_prefix + blob_name. The + blob_name is separate from the blob_name_prefix because the blob_name + will also determine the name of the destination blob. Any shared part of + the blob names that need not be part of the destination path should be + included in the blob_name_prefix. + + :type path_root: str + :param path_root: + A string that will be prepended to each blob_name in the input list, + in order to determine the destination path for that blob. The path_root + string will usually end in "/" (or "\\" depending on platform) but is + not required to do so. For instance, if the path_root string is + "/tmp/img-" and a blob_name is "0001.jpg", with an empty + blob_name_prefix, then the source blob "0001.jpg" will be downloaded to + destination "/tmp/img-0001.jpg" . This parameter can be an empty string. + + :type blob_name_prefix: str + :param blob_name_prefix: + A string that will be prepended to each blob_name in the input list, in + order to determine the name of the source blob. Unlike the blob_name + itself, the prefix string does not affect the destination path on the + local filesystem. For instance, if the path_root is "/tmp/img-", the + blob_name_prefix is "myuser/mystuff-" and a blob_name is "0001.jpg" then + the source blob "myuser/mystuff-0001.jpg" will be downloaded to + "/tmp/img-0001.jpg". The blob_name_prefix can be blank (an empty + string). + + :type download_kwargs: dict + :param download_kwargs: + A dictionary of keyword arguments to pass to the download method. Refer + to the documentation for blob.download_to_file() or + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. + + :type max_workers: int + :param max_workers: + The number of workers (effectively, the number of threads) to use in + the worker pool. Refer to concurrent.futures.ThreadPoolExecutor + documentation for details. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. If skip_if_exists is True, 412 + Precondition Failed responses are considered part of normal operation + and are not raised as an exception. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + download method is used (typically, None). + """ + blob_file_pairs = [] + + for blob_name in blob_names: + full_blob_name = blob_name_prefix + blob_name + path = path_root + blob_name + blob_file_pairs.append((bucket.blob(full_blob_name), path)) + + return download_many( + blob_file_pairs, + download_kwargs=download_kwargs, + max_workers=max_workers, + deadline=deadline, + raise_exception=raise_exception, + ) diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py new file mode 100644 index 000000000..99887f0e1 --- /dev/null +++ b/tests/system/test_transfer_manager.py @@ -0,0 +1,104 @@ +# coding=utf-8 +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tempfile + +from google.cloud.storage import transfer_manager +from google.cloud.storage._helpers import _base64_md5hash + +from google.api_core import exceptions + + +def test_upload_many(shared_bucket, file_data, blobs_to_delete): + FILE_BLOB_PAIRS = [ + (file_data["simple"]["path"], shared_bucket.blob("simple1")), + (file_data["simple"]["path"], shared_bucket.blob("simple2")), + ] + + results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + assert results == [None, None] + + blobs = shared_bucket.list_blobs() + for blob in blobs: + if blob.name.startswith("simple"): + blobs_to_delete.append(blob) + assert len(blobs_to_delete) == 2 + + +def test_upload_many_with_file_objs(shared_bucket, file_data, blobs_to_delete): + FILE_BLOB_PAIRS = [ + (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple1")), + (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple2")), + ] + + results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + assert results == [None, None] + + blobs = shared_bucket.list_blobs() + for blob in blobs: + if blob.name.startswith("simple"): + blobs_to_delete.append(blob) + assert len(blobs_to_delete) == 2 + + +def test_upload_many_skip_if_exists( + listable_bucket, listable_filenames, file_data, blobs_to_delete +): + FILE_BLOB_PAIRS = [ + (file_data["logo"]["path"], listable_bucket.blob(listable_filenames[0])), + (file_data["simple"]["path"], listable_bucket.blob("simple")), + ] + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True + ) + assert isinstance(results[0], exceptions.PreconditionFailed) + assert results[1] is None + + blobs = listable_bucket.list_blobs() + for blob in blobs: + if blob.name.startswith("simple"): + blobs_to_delete.append(blob) + assert len(blobs_to_delete) == 1 + + +def test_download_many(listable_bucket): + blobs = list(listable_bucket.list_blobs()) + tempfiles = [tempfile.TemporaryFile(), tempfile.TemporaryFile()] + BLOB_FILE_PAIRS = zip(blobs[:2], tempfiles) + + results = transfer_manager.download_many(BLOB_FILE_PAIRS) + assert results == [None, None] + for fp in tempfiles: + assert fp.tell() != 0 + + +def test_download_chunks_concurrently_to_file( + shared_bucket, file_data, blobs_to_delete +): + blob = shared_bucket.blob("big") + blob.upload_from_filename(file_data["big"]["path"]) + blobs_to_delete.append(blob) + + blob.reload() + fp = tempfile.TemporaryFile() + result = transfer_manager.download_chunks_concurrently_to_file( + blob, fp, chunk_size=1024 * 1024 + ) + assert result is None + assert fp.tell() != 0 + + fp.seek(0) + assert blob.md5_hash.encode("utf8") == _base64_md5hash(fp) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py new file mode 100644 index 000000000..b48748018 --- /dev/null +++ b/tests/unit/test_transfer_manager.py @@ -0,0 +1,341 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.cloud.storage import transfer_manager + +from google.api_core import exceptions + +import io +import tempfile +import unittest +import mock + + +class Test_Transfer_Manager(unittest.TestCase): + def test_upload_many_with_filenames(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + FAKE_CONTENT_TYPE = "text/fake" + UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} + EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + FAKE_RESULT = "nothing to see here" + + for _, blob_mock in FILE_BLOB_PAIRS: + blob_mock.upload_from_filename.return_value = FAKE_RESULT + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS + ) + for (filename, mock_blob) in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.assert_any_call( + filename, **EXPECTED_UPLOAD_KWARGS + ) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_upload_many_with_file_objs(self): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock()), + (tempfile.TemporaryFile(), mock.Mock()), + ] + FAKE_CONTENT_TYPE = "text/fake" + UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} + EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + FAKE_RESULT = "nothing to see here" + + for _, blob_mock in FILE_BLOB_PAIRS: + blob_mock.upload_from_file.return_value = FAKE_RESULT + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS + ) + for (file, mock_blob) in FILE_BLOB_PAIRS: + mock_blob.upload_from_file.assert_any_call(file, **EXPECTED_UPLOAD_KWARGS) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_upload_many_passes_concurrency_options(self): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock()), + (tempfile.TemporaryFile(), mock.Mock()), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch( + "concurrent.futures.ThreadPoolExecutor" + ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + transfer_manager.upload_many( + FILE_BLOB_PAIRS, max_workers=MAX_WORKERS, deadline=DEADLINE + ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with( + mock.ANY, timeout=DEADLINE, return_when=mock.ANY + ) + + def test_upload_many_suppresses_exceptions(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = ConnectionError() + + results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + for result in results: + self.assertEqual(type(result), ConnectionError) + + def test_upload_many_raises_exceptions(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = ConnectionError() + + with self.assertRaises(ConnectionError): + transfer_manager.upload_many(FILE_BLOB_PAIRS, raise_exception=True) + + def test_upload_many_suppresses_412_with_skip_if_exists(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = exceptions.PreconditionFailed( + "412" + ) + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True + ) + for result in results: + self.assertEqual(type(result), exceptions.PreconditionFailed) + + def test_download_many_with_filenames(self): + BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] + FAKE_ENCODING = "fake_gzip" + DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} + FAKE_RESULT = "nothing to see here" + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock.download_to_filename.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS + ) + for (mock_blob, file) in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.assert_any_call(file, **DOWNLOAD_KWARGS) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_download_many_with_file_objs(self): + BLOB_FILE_PAIRS = [ + (mock.Mock(), tempfile.TemporaryFile()), + (mock.Mock(), tempfile.TemporaryFile()), + ] + FAKE_ENCODING = "fake_gzip" + DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} + FAKE_RESULT = "nothing to see here" + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock.download_to_file.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS + ) + for (mock_blob, file) in BLOB_FILE_PAIRS: + mock_blob.download_to_file.assert_any_call(file, **DOWNLOAD_KWARGS) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_download_many_passes_concurrency_options(self): + BLOB_FILE_PAIRS = [ + (mock.Mock(), tempfile.TemporaryFile()), + (mock.Mock(), tempfile.TemporaryFile()), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch( + "concurrent.futures.ThreadPoolExecutor" + ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + transfer_manager.download_many( + BLOB_FILE_PAIRS, max_workers=MAX_WORKERS, deadline=DEADLINE + ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with( + mock.ANY, timeout=DEADLINE, return_when=mock.ANY + ) + + def test_download_many_suppresses_exceptions(self): + BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] + for mock_blob, _ in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.side_effect = ConnectionError() + + results = transfer_manager.download_many(BLOB_FILE_PAIRS) + for result in results: + self.assertEqual(type(result), ConnectionError) + + def test_download_many_raises_exceptions(self): + BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] + for mock_blob, _ in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.side_effect = ConnectionError() + + transfer_manager.download_many(BLOB_FILE_PAIRS) + with self.assertRaises(ConnectionError): + transfer_manager.download_many(BLOB_FILE_PAIRS, raise_exception=True) + + def test_download_chunks_concurrently_to_file(self): + BLOB_CONTENTS = b"1234567812345678A" + blob = mock.Mock() + blob.size = len(BLOB_CONTENTS) + blob.generation = None + + FAKE_ENCODING = "fake-gzip" + DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} + + def fake_download_to_file(file_obj, start, end, **kwargs): + file_obj.write(BLOB_CONTENTS[start : end + 1]) + self.assertEqual(kwargs, DOWNLOAD_KWARGS) + + blob.download_to_file = fake_download_to_file + + file_obj = io.BytesIO() + + transfer_manager.download_chunks_concurrently_to_file( + blob, file_obj, chunk_size=4, download_kwargs=DOWNLOAD_KWARGS + ) + + # Generation wasn't set, so reload should have been called. + blob.reload.assert_called_with() + + file_obj.seek(0) + result = file_obj.read() + self.assertEqual(result, BLOB_CONTENTS) + + def test_download_chunks_passes_concurrency_arguments_and_kwargs(self): + blob = mock.Mock() + blob.size = 17 + blob.generation = 1 + + file_obj = mock.Mock() + + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch( + "concurrent.futures.ThreadPoolExecutor" + ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + transfer_manager.download_chunks_concurrently_to_file( + blob, file_obj, chunk_size=4, max_workers=MAX_WORKERS, deadline=DEADLINE + ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with( + mock.ANY, timeout=DEADLINE, return_when=mock.ANY + ) + + def test_upload_many_from_filenames(self): + bucket = mock.Mock() + + FILENAMES = ["file_a.txt", "file_b.txt"] + ROOT = "mypath/" + PREFIX = "myprefix/" + KEY_NAME = "keyname" + BLOB_CONSTRUCTOR_KWARGS = {"kms_key_name": KEY_NAME} + UPLOAD_KWARGS = {"content-type": "text/fake"} + MAX_WORKERS = 7 + DEADLINE = 10 + + EXPECTED_FILE_BLOB_PAIRS = [ + (ROOT + filename, mock.ANY) for filename in FILENAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, + FILENAMES, + ROOT, + blob_name_prefix=PREFIX, + skip_if_exists=True, + blob_constructor_kwargs=BLOB_CONSTRUCTOR_KWARGS, + upload_kwargs=UPLOAD_KWARGS, + max_workers=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=True, + upload_kwargs=UPLOAD_KWARGS, + max_workers=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + bucket.blob.assert_any_call(PREFIX + FILENAMES[0], **BLOB_CONSTRUCTOR_KWARGS) + bucket.blob.assert_any_call(PREFIX + FILENAMES[1], **BLOB_CONSTRUCTOR_KWARGS) + + def test_upload_many_from_filenames_minimal_args(self): + bucket = mock.Mock() + + FILENAMES = ["file_a.txt", "file_b.txt"] + + EXPECTED_FILE_BLOB_PAIRS = [(filename, mock.ANY) for filename in FILENAMES] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, + FILENAMES, + ) + + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=False, + upload_kwargs=None, + max_workers=None, + deadline=None, + raise_exception=False, + ) + bucket.blob.assert_any_call(FILENAMES[0]) + bucket.blob.assert_any_call(FILENAMES[1]) + + def test_download_many_to_path(self): + bucket = mock.Mock() + + BLOBNAMES = ["file_a.txt", "file_b.txt"] + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + + EXPECTED_BLOB_FILE_PAIRS = [ + (mock.ANY, PATH_ROOT + blobname) for blobname in BLOBNAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.download_many" + ) as mock_download_many: + transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + max_workers=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + + mock_download_many.assert_called_once_with( + EXPECTED_BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + max_workers=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + bucket.blob.assert_any_call(BLOB_NAME_PREFIX + BLOBNAMES[0]) + bucket.blob.assert_any_call(BLOB_NAME_PREFIX + BLOBNAMES[1]) From 9ccdc5f2e8a9e28b2df47260d639b6af2708fe9a Mon Sep 17 00:00:00 2001 From: cojenco Date: Sun, 6 Nov 2022 22:56:13 -0800 Subject: [PATCH 112/509] feat: add Autoclass support and sample (#791) This adds support and samples for Autoclass For more info, see Internal: [go/gcs-dpe-autoclass](http://go/gcs-dpe-autoclass) Fixes #797 --- google/cloud/storage/bucket.py | 44 +++++++++++++++++++++ samples/snippets/snippets_test.py | 38 ++++++++++++++++++ samples/snippets/storage_get_autoclass.py | 41 ++++++++++++++++++++ samples/snippets/storage_set_autoclass.py | 47 +++++++++++++++++++++++ tests/system/test_bucket.py | 22 +++++++++++ tests/unit/test_bucket.py | 31 +++++++++++++++ 6 files changed, 223 insertions(+) create mode 100644 samples/snippets/storage_get_autoclass.py create mode 100644 samples/snippets/storage_set_autoclass.py diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 0a7b09bbb..a2783fb74 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2660,6 +2660,50 @@ def requester_pays(self, value): """ self._patch_property("billing", {"requesterPays": bool(value)}) + @property + def autoclass_enabled(self): + """Whether Autoclass is enabled for this bucket. + + See https://cloud.google.com/storage/docs/using-autoclass for details. + + :setter: Update whether autoclass is enabled for this bucket. + :getter: Query whether autoclass is enabled for this bucket. + + :rtype: bool + :returns: True if enabled, else False. + """ + autoclass = self._properties.get("autoclass", {}) + return autoclass.get("enabled", False) + + @autoclass_enabled.setter + def autoclass_enabled(self, value): + """Enable or disable Autoclass at the bucket-level. + + See https://cloud.google.com/storage/docs/using-autoclass for details. + + :type value: convertible to boolean + :param value: If true, enable Autoclass for this bucket. + If false, disable Autoclass for this bucket. + + .. note:: + To enable autoclass, you must set it at bucket creation time. + Currently, only patch requests that disable autoclass are supported. + + """ + self._patch_property("autoclass", {"enabled": bool(value)}) + + @property + def autoclass_toggle_time(self): + """Retrieve the toggle time when Autoclaass was last enabled or disabled for the bucket. + :rtype: datetime.datetime or ``NoneType`` + :returns: point-in time at which the bucket's autoclass is toggled, or ``None`` if the property is not set locally. + """ + autoclass = self._properties.get("autoclass") + if autoclass is not None: + timestamp = autoclass.get("toggleTime") + if timestamp is not None: + return _rfc3339_nanos_to_datetime(timestamp) + def configure_website(self, main_page_suffix=None, not_found_page=None): """Configure website-related properties. diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index bc126010b..9370ecbdd 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -53,6 +53,7 @@ import storage_generate_signed_url_v2 import storage_generate_signed_url_v4 import storage_generate_upload_signed_url_v4 +import storage_get_autoclass import storage_get_bucket_labels import storage_get_bucket_metadata import storage_get_metadata @@ -67,6 +68,7 @@ import storage_remove_bucket_label import storage_remove_cors_configuration import storage_rename_file +import storage_set_autoclass import storage_set_bucket_default_kms_key import storage_set_client_endpoint import storage_set_metadata @@ -136,6 +138,17 @@ def test_public_bucket(): os.environ['GOOGLE_CLOUD_PROJECT'] = original_value +@pytest.fixture(scope="module") +def new_bucket_obj(): + """Yields a new bucket object that is deleted after the test completes.""" + bucket = None + while bucket is None or bucket.exists(): + bucket_name = f"storage-snippets-test-{uuid.uuid4()}" + bucket = storage.Client().bucket(bucket_name) + yield bucket + bucket.delete(force=True) + + @pytest.fixture def test_blob(test_bucket): """Yields a blob that is deleted after the test completes.""" @@ -408,6 +421,31 @@ def test_versioning(test_bucket, capsys): assert bucket.versioning_enabled is False +def test_get_set_autoclass(new_bucket_obj, test_bucket, capsys): + # Test default values when Autoclass is unset + bucket = storage_get_autoclass.get_autoclass(test_bucket.name) + out, _ = capsys.readouterr() + assert "Autoclass enabled is set to False" in out + assert bucket.autoclass_toggle_time is None + + # Test enabling Autoclass at bucket creation + new_bucket_obj.autoclass_enabled = True + bucket = storage.Client().create_bucket(new_bucket_obj) + assert bucket.autoclass_enabled is True + + # Test disabling Autoclass + bucket = storage_set_autoclass.set_autoclass(bucket.name, False) + out, _ = capsys.readouterr() + assert "Autoclass enabled is set to False" in out + assert bucket.autoclass_enabled is False + + # Test get Autoclass + bucket = storage_get_autoclass.get_autoclass(bucket.name) + out, _ = capsys.readouterr() + assert "Autoclass enabled is set to False" in out + assert bucket.autoclass_toggle_time is not None + + def test_bucket_lifecycle_management(test_bucket, capsys): bucket = storage_enable_bucket_lifecycle_management.enable_bucket_lifecycle_management( test_bucket diff --git a/samples/snippets/storage_get_autoclass.py b/samples/snippets/storage_get_autoclass.py new file mode 100644 index 000000000..d4bcbf3f4 --- /dev/null +++ b/samples/snippets/storage_get_autoclass.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_get_autoclass] +from google.cloud import storage + + +def get_autoclass(bucket_name): + """Get the Autoclass setting for a bucket.""" + # The ID of your GCS bucket + # bucket_name = "my-bucket" + + storage_client = storage.Client() + bucket = storage_client.get_bucket(bucket_name) + autoclass_enabled = bucket.autoclass_enabled + autoclass_toggle_time = bucket.autoclass_toggle_time + + print(f"Autoclass enabled is set to {autoclass_enabled} for {bucket.name} at {autoclass_toggle_time}.") + + return bucket + + +# [END storage_get_autoclass] + +if __name__ == "__main__": + get_autoclass(bucket_name=sys.argv[1]) diff --git a/samples/snippets/storage_set_autoclass.py b/samples/snippets/storage_set_autoclass.py new file mode 100644 index 000000000..a25151f3b --- /dev/null +++ b/samples/snippets/storage_set_autoclass.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_set_autoclass] +from google.cloud import storage + + +def set_autoclass(bucket_name, toggle): + """Disable Autoclass for a bucket. + + Note: Only patch requests that disable autoclass are currently supported. + To enable autoclass, you must set it at bucket creation time. + """ + # The ID of your GCS bucket + # bucket_name = "my-bucket" + # Boolean toggle - if true, enables Autoclass; if false, disables Autoclass + # toggle = False + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + + bucket.autoclass_enabled = toggle + bucket.patch() + print(f"Autoclass enabled is set to {bucket.autoclass_enabled} for {bucket.name} at {bucket.autoclass_toggle_time}.") + + return bucket + + +# [END storage_set_autoclass] + +if __name__ == "__main__": + set_autoclass(bucket_name=sys.argv[1], toggle=sys.argv[2]) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 4795837f0..e31b1ae49 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -996,3 +996,25 @@ def test_new_bucket_with_rpo( bucket_from_server = storage_client.get_bucket(bucket_name) assert bucket_from_server.rpo == constants.RPO_ASYNC_TURBO + + +def test_new_bucket_with_autoclass( + storage_client, + buckets_to_delete, +): + # Autoclass can be enabled/disabled via bucket create + bucket_name = _helpers.unique_name("new-w-autoclass") + bucket_obj = storage_client.bucket(bucket_name) + bucket_obj.autoclass_enabled = True + bucket = storage_client.create_bucket(bucket_obj) + previous_toggle_time = bucket.autoclass_toggle_time + buckets_to_delete.append(bucket) + + assert bucket.autoclass_enabled is True + + # Autoclass can be enabled/disabled via bucket patch + bucket.autoclass_enabled = False + bucket.patch() + + assert bucket.autoclass_enabled is False + assert bucket.autoclass_toggle_time != previous_toggle_time diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 163d31fd6..8f4daeb1d 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2644,6 +2644,37 @@ def test_rpo_getter_and_setter(self): self.assertIn("rpo", bucket._changes) self.assertEqual(bucket.rpo, RPO_DEFAULT) + def test_autoclass_enabled_getter_and_setter(self): + properties = {"autoclass": {"enabled": True}} + bucket = self._make_one(properties=properties) + self.assertTrue(bucket.autoclass_enabled) + bucket.autoclass_enabled = False + self.assertIn("autoclass", bucket._changes) + self.assertFalse(bucket.autoclass_enabled) + + def test_autoclass_toggle_time_missing(self): + bucket = self._make_one() + self.assertIsNone(bucket.autoclass_toggle_time) + + properties = {"autoclass": {}} + bucket = self._make_one(properties=properties) + self.assertIsNone(bucket.autoclass_toggle_time) + + def test_autoclass_toggle_time(self): + import datetime + from google.cloud._helpers import _datetime_to_rfc3339 + from google.cloud._helpers import UTC + + effective_time = datetime.datetime.utcnow().replace(tzinfo=UTC) + properties = { + "autoclass": { + "enabled": True, + "toggleTime": _datetime_to_rfc3339(effective_time), + } + } + bucket = self._make_one(properties=properties) + self.assertEqual(bucket.autoclass_toggle_time, effective_time) + def test_get_logging_w_prefix(self): NAME = "name" LOG_BUCKET = "logs" From 8b9abcf67932d0c9da536e235af7b9310d250309 Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 7 Nov 2022 11:33:13 -0800 Subject: [PATCH 113/509] Revert "feat: Add "transfer_manager" module for concurrent uploads and downloads as a preview feature (#844)" (#897) This reverts commit 9dcc6846b52e460bee8d725099abd4dc734fa7ad. --- google/cloud/storage/constants.py | 1 - google/cloud/storage/fileio.py | 6 +- google/cloud/storage/transfer_manager.py | 557 ----------------------- tests/system/test_transfer_manager.py | 104 ----- tests/unit/test_transfer_manager.py | 341 -------------- 5 files changed, 2 insertions(+), 1007 deletions(-) delete mode 100644 google/cloud/storage/transfer_manager.py delete mode 100644 tests/system/test_transfer_manager.py delete mode 100644 tests/unit/test_transfer_manager.py diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index 5d6497295..babbc5a42 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - """Constants used across google.cloud.storage modules.""" # Storage classes diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index d09a3c885..d3ae135bb 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Module for file-like access of blobs, usually invoked via Blob.open().""" +"""Support for file-like I/O.""" import io import warnings @@ -101,12 +101,10 @@ class BlobReader(io.BufferedIOBase): - ``if_metageneration_match`` - ``if_metageneration_not_match`` - ``timeout`` - - Note that download_kwargs are also applied to blob.reload(), if a reload - is needed during seek(). """ def __init__(self, blob, chunk_size=None, retry=DEFAULT_RETRY, **download_kwargs): + """docstring note that download_kwargs also used for reload()""" for kwarg in download_kwargs: if kwarg not in VALID_DOWNLOAD_KWARGS: raise ValueError( diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py deleted file mode 100644 index 162e6465d..000000000 --- a/google/cloud/storage/transfer_manager.py +++ /dev/null @@ -1,557 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Concurrent media operations. This is a PREVIEW FEATURE: API may change.""" - -import concurrent.futures - -import tempfile - -from google.api_core import exceptions - - -DEFAULT_CHUNK_SIZE = 200 * 1024 * 1024 - - -def upload_many( - file_blob_pairs, - skip_if_exists=False, - upload_kwargs=None, - max_workers=None, - deadline=None, - raise_exception=False, -): - """Upload many files concurrently via a worker pool. - - This function is a PREVIEW FEATURE: the API may change in a future version. - - :type file_blob_pairs: List(Tuple(IOBase or str, 'google.cloud.storage.blob.Blob')) - :param file_blob_pairs: - A list of tuples of a file or filename and a blob. Each file will be - uploaded to the corresponding blob by using blob.upload_from_file() or - blob.upload_from_filename() as appropriate. - - :type skip_if_exists: bool - :param skip_if_exists: - If True, blobs that already have a live version will not be overwritten. - This is accomplished by setting "if_generation_match = 0" on uploads. - Uploads so skipped will result in a 412 Precondition Failed response - code, which will be included in the return value but not raised - as an exception regardless of the value of raise_exception. - - :type upload_kwargs: dict - :param upload_kwargs: - A dictionary of keyword arguments to pass to the upload method. Refer - to the documentation for blob.upload_from_file() or - blob.upload_from_filename() for more information. The dict is directly - passed into the upload methods and is not validated by this function. - - :type max_workers: int - :param max_workers: - The number of workers (effectively, the number of threads) to use in - the worker pool. Refer to concurrent.futures.ThreadPoolExecutor - documentation for details. - - :type deadline: int - :param deadline: - The number of seconds to wait for all threads to resolve. If the - deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. - - :type raise_exception: bool - :param raise_exception: - If True, instead of adding exceptions to the list of return values, - instead they will be raised. Note that encountering an exception on one - operation will not prevent other operations from starting. Exceptions - are only processed and potentially raised after all operations are - complete in success or failure. - - If skip_if_exists is True, 412 Precondition Failed responses are - considered part of normal operation and are not raised as an exception. - - :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - - :rtype: list - :returns: A list of results corresponding to, in order, each item in the - input list. If an exception was received, it will be the result - for that operation. Otherwise, the return value from the successful - upload method is used (typically, None). - """ - if upload_kwargs is None: - upload_kwargs = {} - if skip_if_exists: - upload_kwargs["if_generation_match"] = 0 - - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = [] - for path_or_file, blob in file_blob_pairs: - method = ( - blob.upload_from_filename - if isinstance(path_or_file, str) - else blob.upload_from_file - ) - futures.append(executor.submit(method, path_or_file, **upload_kwargs)) - results = [] - concurrent.futures.wait( - futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED - ) - for future in futures: - exp = future.exception() - - # If raise_exception is False, don't call future.result() - if exp and not raise_exception: - results.append(exp) - # If skip_if_exists and the exception is PreconditionFailed, do same. - elif exp and skip_if_exists and isinstance(exp, exceptions.PreconditionFailed): - results.append(exp) - # Get the real result. If there was an exception not handled above, - # this will raise it. - else: - results.append(future.result()) - return results - - -def download_many( - blob_file_pairs, - download_kwargs=None, - max_workers=None, - deadline=None, - raise_exception=False, -): - """Download many blobs concurrently via a worker pool. - - This function is a PREVIEW FEATURE: the API may change in a future version. - - :type blob_file_pairs: List(Tuple('google.cloud.storage.blob.Blob', IOBase or str)) - :param blob_file_pairs: - A list of tuples of blob and a file or filename. Each blob will be - downloaded to the corresponding blob by using blob.download_to_file() or - blob.download_to_filename() as appropriate. - - Note that blob.download_to_filename() does not delete the destination - file if the download fails. - - :type download_kwargs: dict - :param download_kwargs: - A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly - passed into the download methods and is not validated by this function. - - :type max_workers: int - :param max_workers: - The number of workers (effectively, the number of threads) to use in - the worker pool. Refer to concurrent.futures.ThreadPoolExecutor - documentation for details. - - :type deadline: int - :param deadline: - The number of seconds to wait for all threads to resolve. If the - deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. - - :type raise_exception: bool - :param raise_exception: - If True, instead of adding exceptions to the list of return values, - instead they will be raised. Note that encountering an exception on one - operation will not prevent other operations from starting. Exceptions - are only processed and potentially raised after all operations are - complete in success or failure. - - :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - - :rtype: list - :returns: A list of results corresponding to, in order, each item in the - input list. If an exception was received, it will be the result - for that operation. Otherwise, the return value from the successful - download method is used (typically, None). - """ - - if download_kwargs is None: - download_kwargs = {} - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = [] - for blob, path_or_file in blob_file_pairs: - method = ( - blob.download_to_filename - if isinstance(path_or_file, str) - else blob.download_to_file - ) - futures.append(executor.submit(method, path_or_file, **download_kwargs)) - results = [] - concurrent.futures.wait( - futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED - ) - for future in futures: - if not raise_exception: - exp = future.exception() - if exp: - results.append(exp) - continue - results.append(future.result()) - return results - - -def download_chunks_concurrently_to_file( - blob, - file_obj, - chunk_size=DEFAULT_CHUNK_SIZE, - download_kwargs=None, - max_workers=None, - deadline=None, -): - """Download a single blob in chunks, concurrently. - - This function is a PREVIEW FEATURE: the API may change in a future version. - - Use of this function, in cases where single threads are unable to fully - saturate available network bandwidth, may improve download performance for - large objects. - - The size of the blob must be known in order to calculate the number of - chunks. If the size is not already set, blob.reload() will be called - automatically to set it. - - :type blob: 'google.cloud.storage.blob.Blob' - :param blob: - The blob to download. - - :type file_obj: IOBase - :param file_obj: The file object to which the downloaded chunks will be - written. Chunks are written in order. While the current implementation - of this function does not use seek(), a future version may use seek() to - write chunks out of order to improve write performance. - - :type chunk_size: int - :param chunk_size: The size of each chunk. An excessively small size may - have a negative performance impact, as each chunk will be uploaded in a - separate HTTP request. - - :type download_kwargs: dict - :param download_kwargs: - A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly - passed into the download methods and is not validated by this function. - - :type max_workers: int - :param max_workers: - The number of workers (effectively, the number of threads) to use in - the worker pool. Refer to concurrent.futures.ThreadPoolExecutor - documentation for details. - - :type deadline: int - :param deadline: - The number of seconds to wait for all threads to resolve. If the - deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. - - :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - """ - - if download_kwargs is None: - download_kwargs = {} - # We must know the size of the object, and the generation. - if not blob.size or not blob.generation: - blob.reload() - - def download_range_via_tempfile(blob, start, end, download_kwargs): - tmp = tempfile.TemporaryFile() - blob.download_to_file(tmp, start=start, end=end, **download_kwargs) - return tmp - - futures = [] - - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - cursor = 0 - while cursor < blob.size: - start = cursor - cursor = min(cursor + chunk_size, blob.size) - futures.append( - executor.submit( - download_range_via_tempfile, - blob, - start=start, - end=cursor - 1, - download_kwargs=download_kwargs, - ) - ) - - # Wait until all futures are done and process them in order. - concurrent.futures.wait( - futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED - ) - for future in futures: - tmp = future.result() - tmp.seek(0) - file_obj.write(tmp.read()) - tmp.close() - - -def upload_many_from_filenames( - bucket, - filenames, - root="", - blob_name_prefix="", - skip_if_exists=False, - blob_constructor_kwargs=None, - upload_kwargs=None, - max_workers=None, - deadline=None, - raise_exception=False, -): - """Upload many files concurrently by their filenames. - - This function is a PREVIEW FEATURE: the API may change in a future version. - - The destination blobs are automatically created, with blob names based on - the source filenames and the blob_name_prefix. - - For example, if the `filenames` include "images/icon.jpg", `root` is - "/home/myuser/", and `blob_name_prefix` is "myfiles/", then the file at - "/home/myuser/images/icon.jpg" will be uploaded to a blob named - "myfiles/images/icon.jpg". - - :type bucket: 'google.cloud.storage.bucket.Bucket' - :param bucket: - The bucket which will contain the uploaded blobs. - - :type filenames: list(str) - :param filenames: - A list of filenames to be uploaded. This may include part of the path. - The full path to the file must be root + filename. The filename is - separate from the root because the filename will also determine the - name of the destination blob. - - :type root: str - :param root: - A string that will be prepended to each filename in the input list, in - order to find the source file for each blob. Unlike the filename itself, - the root string does not affect the name of the uploaded blob itself. - The root string will usually end in "/" (or "\\" depending on platform) - but is not required to do so. - - For instance, if the root string is "/tmp/img-" and a filename is - "0001.jpg", with an empty blob_name_prefix, then the file uploaded will - be "/tmp/img-0001.jpg" and the destination blob will be "0001.jpg". - - This parameter can be an empty string. - - :type blob_name_prefix: str - :param blob_name_prefix: - A string that will be prepended to each filename in the input list, in - order to determine the name of the destination blob. Unlike the filename - itself, the prefix string does not affect the location the library will - look for the source data on the local filesystem. - - For instance, if the root is "/tmp/img-", the blob_name_prefix is - "myuser/mystuff-" and a filename is "0001.jpg" then the file uploaded - will be "/tmp/img-0001.jpg" and the destination blob will be - "myuser/mystuff-0001.jpg". - - The blob_name_prefix can be blank (an empty string). - - :type skip_if_exists: bool - :param skip_if_exists: - If True, blobs that already have a live version will not be overwritten. - This is accomplished by setting "if_generation_match = 0" on uploads. - Uploads so skipped will result in a 412 Precondition Failed response - code, which will be included in the return value but not raised - as an exception regardless of the value of raise_exception. - - :type blob_constructor_kwargs: dict - :param blob_constructor_kwargs: - A dictionary of keyword arguments to pass to the blob constructor. Refer - to the documentation for blob.Blob() for more information. The dict is - directly passed into the constructor and is not validated by this - function. `name` and `bucket` keyword arguments are reserved by this - function and will result in an error if passed in here. - - :type upload_kwargs: dict - :param upload_kwargs: - A dictionary of keyword arguments to pass to the upload method. Refer - to the documentation for blob.upload_from_file() or - blob.upload_from_filename() for more information. The dict is directly - passed into the upload methods and is not validated by this function. - - :type max_workers: int - :param max_workers: - The number of workers (effectively, the number of threads) to use in - the worker pool. Refer to concurrent.futures.ThreadPoolExecutor - documentation for details. - - :type deadline: int - :param deadline: - The number of seconds to wait for all threads to resolve. If the - deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. - - :type raise_exception: bool - :param raise_exception: - If True, instead of adding exceptions to the list of return values, - instead they will be raised. Note that encountering an exception on one - operation will not prevent other operations from starting. Exceptions - are only processed and potentially raised after all operations are - complete in success or failure. - - If skip_if_exists is True, 412 Precondition Failed responses are - considered part of normal operation and are not raised as an exception. - - :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - - :rtype: list - :returns: A list of results corresponding to, in order, each item in the - input list. If an exception was received, it will be the result - for that operation. Otherwise, the return value from the successful - upload method is used (typically, None). - """ - if blob_constructor_kwargs is None: - blob_constructor_kwargs = {} - - file_blob_pairs = [] - - for filename in filenames: - path = root + filename - blob_name = blob_name_prefix + filename - blob = bucket.blob(blob_name, **blob_constructor_kwargs) - file_blob_pairs.append((path, blob)) - - return upload_many( - file_blob_pairs, - skip_if_exists=skip_if_exists, - upload_kwargs=upload_kwargs, - max_workers=max_workers, - deadline=deadline, - raise_exception=raise_exception, - ) - - -def download_many_to_path( - bucket, - blob_names, - path_root="", - blob_name_prefix="", - download_kwargs=None, - max_workers=None, - deadline=None, - raise_exception=False, -): - """Download many files concurrently by their blob names. - - This function is a PREVIEW FEATURE: the API may change in a future version. - - The destination files are automatically created, with filenames based on - the source blob_names and the path_root. - - The destination files are not automatically deleted if their downloads fail, - so please check the return value of this function for any exceptions, or - enable `raise_exception=True`, and process the files accordingly. - - For example, if the `blob_names` include "icon.jpg", `path_root` is - "/home/myuser/", and `blob_name_prefix` is "images/", then the blob named - "images/icon.jpg" will be downloaded to a file named - "/home/myuser/icon.jpg". - - :type bucket: 'google.cloud.storage.bucket.Bucket' - :param bucket: - The bucket which contains the blobs to be downloaded - - :type blob_names: list(str) - :param blob_names: - A list of blobs to be downloaded. The blob name in this string will be - used to determine the destination file path as well. - - The full name to the blob must be blob_name_prefix + blob_name. The - blob_name is separate from the blob_name_prefix because the blob_name - will also determine the name of the destination blob. Any shared part of - the blob names that need not be part of the destination path should be - included in the blob_name_prefix. - - :type path_root: str - :param path_root: - A string that will be prepended to each blob_name in the input list, - in order to determine the destination path for that blob. The path_root - string will usually end in "/" (or "\\" depending on platform) but is - not required to do so. For instance, if the path_root string is - "/tmp/img-" and a blob_name is "0001.jpg", with an empty - blob_name_prefix, then the source blob "0001.jpg" will be downloaded to - destination "/tmp/img-0001.jpg" . This parameter can be an empty string. - - :type blob_name_prefix: str - :param blob_name_prefix: - A string that will be prepended to each blob_name in the input list, in - order to determine the name of the source blob. Unlike the blob_name - itself, the prefix string does not affect the destination path on the - local filesystem. For instance, if the path_root is "/tmp/img-", the - blob_name_prefix is "myuser/mystuff-" and a blob_name is "0001.jpg" then - the source blob "myuser/mystuff-0001.jpg" will be downloaded to - "/tmp/img-0001.jpg". The blob_name_prefix can be blank (an empty - string). - - :type download_kwargs: dict - :param download_kwargs: - A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly - passed into the download methods and is not validated by this function. - - :type max_workers: int - :param max_workers: - The number of workers (effectively, the number of threads) to use in - the worker pool. Refer to concurrent.futures.ThreadPoolExecutor - documentation for details. - - :type deadline: int - :param deadline: - The number of seconds to wait for all threads to resolve. If the - deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. - - :type raise_exception: bool - :param raise_exception: - If True, instead of adding exceptions to the list of return values, - instead they will be raised. Note that encountering an exception on one - operation will not prevent other operations from starting. Exceptions - are only processed and potentially raised after all operations are - complete in success or failure. If skip_if_exists is True, 412 - Precondition Failed responses are considered part of normal operation - and are not raised as an exception. - - :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - - :rtype: list - :returns: A list of results corresponding to, in order, each item in the - input list. If an exception was received, it will be the result - for that operation. Otherwise, the return value from the successful - download method is used (typically, None). - """ - blob_file_pairs = [] - - for blob_name in blob_names: - full_blob_name = blob_name_prefix + blob_name - path = path_root + blob_name - blob_file_pairs.append((bucket.blob(full_blob_name), path)) - - return download_many( - blob_file_pairs, - download_kwargs=download_kwargs, - max_workers=max_workers, - deadline=deadline, - raise_exception=raise_exception, - ) diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py deleted file mode 100644 index 99887f0e1..000000000 --- a/tests/system/test_transfer_manager.py +++ /dev/null @@ -1,104 +0,0 @@ -# coding=utf-8 -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import tempfile - -from google.cloud.storage import transfer_manager -from google.cloud.storage._helpers import _base64_md5hash - -from google.api_core import exceptions - - -def test_upload_many(shared_bucket, file_data, blobs_to_delete): - FILE_BLOB_PAIRS = [ - (file_data["simple"]["path"], shared_bucket.blob("simple1")), - (file_data["simple"]["path"], shared_bucket.blob("simple2")), - ] - - results = transfer_manager.upload_many(FILE_BLOB_PAIRS) - assert results == [None, None] - - blobs = shared_bucket.list_blobs() - for blob in blobs: - if blob.name.startswith("simple"): - blobs_to_delete.append(blob) - assert len(blobs_to_delete) == 2 - - -def test_upload_many_with_file_objs(shared_bucket, file_data, blobs_to_delete): - FILE_BLOB_PAIRS = [ - (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple1")), - (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple2")), - ] - - results = transfer_manager.upload_many(FILE_BLOB_PAIRS) - assert results == [None, None] - - blobs = shared_bucket.list_blobs() - for blob in blobs: - if blob.name.startswith("simple"): - blobs_to_delete.append(blob) - assert len(blobs_to_delete) == 2 - - -def test_upload_many_skip_if_exists( - listable_bucket, listable_filenames, file_data, blobs_to_delete -): - FILE_BLOB_PAIRS = [ - (file_data["logo"]["path"], listable_bucket.blob(listable_filenames[0])), - (file_data["simple"]["path"], listable_bucket.blob("simple")), - ] - - results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True - ) - assert isinstance(results[0], exceptions.PreconditionFailed) - assert results[1] is None - - blobs = listable_bucket.list_blobs() - for blob in blobs: - if blob.name.startswith("simple"): - blobs_to_delete.append(blob) - assert len(blobs_to_delete) == 1 - - -def test_download_many(listable_bucket): - blobs = list(listable_bucket.list_blobs()) - tempfiles = [tempfile.TemporaryFile(), tempfile.TemporaryFile()] - BLOB_FILE_PAIRS = zip(blobs[:2], tempfiles) - - results = transfer_manager.download_many(BLOB_FILE_PAIRS) - assert results == [None, None] - for fp in tempfiles: - assert fp.tell() != 0 - - -def test_download_chunks_concurrently_to_file( - shared_bucket, file_data, blobs_to_delete -): - blob = shared_bucket.blob("big") - blob.upload_from_filename(file_data["big"]["path"]) - blobs_to_delete.append(blob) - - blob.reload() - fp = tempfile.TemporaryFile() - result = transfer_manager.download_chunks_concurrently_to_file( - blob, fp, chunk_size=1024 * 1024 - ) - assert result is None - assert fp.tell() != 0 - - fp.seek(0) - assert blob.md5_hash.encode("utf8") == _base64_md5hash(fp) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py deleted file mode 100644 index b48748018..000000000 --- a/tests/unit/test_transfer_manager.py +++ /dev/null @@ -1,341 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.cloud.storage import transfer_manager - -from google.api_core import exceptions - -import io -import tempfile -import unittest -import mock - - -class Test_Transfer_Manager(unittest.TestCase): - def test_upload_many_with_filenames(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - FAKE_CONTENT_TYPE = "text/fake" - UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} - EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} - FAKE_RESULT = "nothing to see here" - - for _, blob_mock in FILE_BLOB_PAIRS: - blob_mock.upload_from_filename.return_value = FAKE_RESULT - - results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS - ) - for (filename, mock_blob) in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.assert_any_call( - filename, **EXPECTED_UPLOAD_KWARGS - ) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_upload_many_with_file_objs(self): - FILE_BLOB_PAIRS = [ - (tempfile.TemporaryFile(), mock.Mock()), - (tempfile.TemporaryFile(), mock.Mock()), - ] - FAKE_CONTENT_TYPE = "text/fake" - UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} - EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} - FAKE_RESULT = "nothing to see here" - - for _, blob_mock in FILE_BLOB_PAIRS: - blob_mock.upload_from_file.return_value = FAKE_RESULT - - results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS - ) - for (file, mock_blob) in FILE_BLOB_PAIRS: - mock_blob.upload_from_file.assert_any_call(file, **EXPECTED_UPLOAD_KWARGS) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_upload_many_passes_concurrency_options(self): - FILE_BLOB_PAIRS = [ - (tempfile.TemporaryFile(), mock.Mock()), - (tempfile.TemporaryFile(), mock.Mock()), - ] - MAX_WORKERS = 7 - DEADLINE = 10 - with mock.patch( - "concurrent.futures.ThreadPoolExecutor" - ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: - transfer_manager.upload_many( - FILE_BLOB_PAIRS, max_workers=MAX_WORKERS, deadline=DEADLINE - ) - pool_patch.assert_called_with(max_workers=MAX_WORKERS) - wait_patch.assert_called_with( - mock.ANY, timeout=DEADLINE, return_when=mock.ANY - ) - - def test_upload_many_suppresses_exceptions(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = ConnectionError() - - results = transfer_manager.upload_many(FILE_BLOB_PAIRS) - for result in results: - self.assertEqual(type(result), ConnectionError) - - def test_upload_many_raises_exceptions(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = ConnectionError() - - with self.assertRaises(ConnectionError): - transfer_manager.upload_many(FILE_BLOB_PAIRS, raise_exception=True) - - def test_upload_many_suppresses_412_with_skip_if_exists(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = exceptions.PreconditionFailed( - "412" - ) - - results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True - ) - for result in results: - self.assertEqual(type(result), exceptions.PreconditionFailed) - - def test_download_many_with_filenames(self): - BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] - FAKE_ENCODING = "fake_gzip" - DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} - FAKE_RESULT = "nothing to see here" - - for blob_mock, _ in BLOB_FILE_PAIRS: - blob_mock.download_to_filename.return_value = FAKE_RESULT - - results = transfer_manager.download_many( - BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS - ) - for (mock_blob, file) in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.assert_any_call(file, **DOWNLOAD_KWARGS) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_download_many_with_file_objs(self): - BLOB_FILE_PAIRS = [ - (mock.Mock(), tempfile.TemporaryFile()), - (mock.Mock(), tempfile.TemporaryFile()), - ] - FAKE_ENCODING = "fake_gzip" - DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} - FAKE_RESULT = "nothing to see here" - - for blob_mock, _ in BLOB_FILE_PAIRS: - blob_mock.download_to_file.return_value = FAKE_RESULT - - results = transfer_manager.download_many( - BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS - ) - for (mock_blob, file) in BLOB_FILE_PAIRS: - mock_blob.download_to_file.assert_any_call(file, **DOWNLOAD_KWARGS) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_download_many_passes_concurrency_options(self): - BLOB_FILE_PAIRS = [ - (mock.Mock(), tempfile.TemporaryFile()), - (mock.Mock(), tempfile.TemporaryFile()), - ] - MAX_WORKERS = 7 - DEADLINE = 10 - with mock.patch( - "concurrent.futures.ThreadPoolExecutor" - ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: - transfer_manager.download_many( - BLOB_FILE_PAIRS, max_workers=MAX_WORKERS, deadline=DEADLINE - ) - pool_patch.assert_called_with(max_workers=MAX_WORKERS) - wait_patch.assert_called_with( - mock.ANY, timeout=DEADLINE, return_when=mock.ANY - ) - - def test_download_many_suppresses_exceptions(self): - BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] - for mock_blob, _ in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.side_effect = ConnectionError() - - results = transfer_manager.download_many(BLOB_FILE_PAIRS) - for result in results: - self.assertEqual(type(result), ConnectionError) - - def test_download_many_raises_exceptions(self): - BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] - for mock_blob, _ in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.side_effect = ConnectionError() - - transfer_manager.download_many(BLOB_FILE_PAIRS) - with self.assertRaises(ConnectionError): - transfer_manager.download_many(BLOB_FILE_PAIRS, raise_exception=True) - - def test_download_chunks_concurrently_to_file(self): - BLOB_CONTENTS = b"1234567812345678A" - blob = mock.Mock() - blob.size = len(BLOB_CONTENTS) - blob.generation = None - - FAKE_ENCODING = "fake-gzip" - DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} - - def fake_download_to_file(file_obj, start, end, **kwargs): - file_obj.write(BLOB_CONTENTS[start : end + 1]) - self.assertEqual(kwargs, DOWNLOAD_KWARGS) - - blob.download_to_file = fake_download_to_file - - file_obj = io.BytesIO() - - transfer_manager.download_chunks_concurrently_to_file( - blob, file_obj, chunk_size=4, download_kwargs=DOWNLOAD_KWARGS - ) - - # Generation wasn't set, so reload should have been called. - blob.reload.assert_called_with() - - file_obj.seek(0) - result = file_obj.read() - self.assertEqual(result, BLOB_CONTENTS) - - def test_download_chunks_passes_concurrency_arguments_and_kwargs(self): - blob = mock.Mock() - blob.size = 17 - blob.generation = 1 - - file_obj = mock.Mock() - - MAX_WORKERS = 7 - DEADLINE = 10 - with mock.patch( - "concurrent.futures.ThreadPoolExecutor" - ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: - transfer_manager.download_chunks_concurrently_to_file( - blob, file_obj, chunk_size=4, max_workers=MAX_WORKERS, deadline=DEADLINE - ) - pool_patch.assert_called_with(max_workers=MAX_WORKERS) - wait_patch.assert_called_with( - mock.ANY, timeout=DEADLINE, return_when=mock.ANY - ) - - def test_upload_many_from_filenames(self): - bucket = mock.Mock() - - FILENAMES = ["file_a.txt", "file_b.txt"] - ROOT = "mypath/" - PREFIX = "myprefix/" - KEY_NAME = "keyname" - BLOB_CONSTRUCTOR_KWARGS = {"kms_key_name": KEY_NAME} - UPLOAD_KWARGS = {"content-type": "text/fake"} - MAX_WORKERS = 7 - DEADLINE = 10 - - EXPECTED_FILE_BLOB_PAIRS = [ - (ROOT + filename, mock.ANY) for filename in FILENAMES - ] - - with mock.patch( - "google.cloud.storage.transfer_manager.upload_many" - ) as mock_upload_many: - transfer_manager.upload_many_from_filenames( - bucket, - FILENAMES, - ROOT, - blob_name_prefix=PREFIX, - skip_if_exists=True, - blob_constructor_kwargs=BLOB_CONSTRUCTOR_KWARGS, - upload_kwargs=UPLOAD_KWARGS, - max_workers=MAX_WORKERS, - deadline=DEADLINE, - raise_exception=True, - ) - - mock_upload_many.assert_called_once_with( - EXPECTED_FILE_BLOB_PAIRS, - skip_if_exists=True, - upload_kwargs=UPLOAD_KWARGS, - max_workers=MAX_WORKERS, - deadline=DEADLINE, - raise_exception=True, - ) - bucket.blob.assert_any_call(PREFIX + FILENAMES[0], **BLOB_CONSTRUCTOR_KWARGS) - bucket.blob.assert_any_call(PREFIX + FILENAMES[1], **BLOB_CONSTRUCTOR_KWARGS) - - def test_upload_many_from_filenames_minimal_args(self): - bucket = mock.Mock() - - FILENAMES = ["file_a.txt", "file_b.txt"] - - EXPECTED_FILE_BLOB_PAIRS = [(filename, mock.ANY) for filename in FILENAMES] - - with mock.patch( - "google.cloud.storage.transfer_manager.upload_many" - ) as mock_upload_many: - transfer_manager.upload_many_from_filenames( - bucket, - FILENAMES, - ) - - mock_upload_many.assert_called_once_with( - EXPECTED_FILE_BLOB_PAIRS, - skip_if_exists=False, - upload_kwargs=None, - max_workers=None, - deadline=None, - raise_exception=False, - ) - bucket.blob.assert_any_call(FILENAMES[0]) - bucket.blob.assert_any_call(FILENAMES[1]) - - def test_download_many_to_path(self): - bucket = mock.Mock() - - BLOBNAMES = ["file_a.txt", "file_b.txt"] - PATH_ROOT = "mypath/" - BLOB_NAME_PREFIX = "myprefix/" - DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} - MAX_WORKERS = 7 - DEADLINE = 10 - - EXPECTED_BLOB_FILE_PAIRS = [ - (mock.ANY, PATH_ROOT + blobname) for blobname in BLOBNAMES - ] - - with mock.patch( - "google.cloud.storage.transfer_manager.download_many" - ) as mock_download_many: - transfer_manager.download_many_to_path( - bucket, - BLOBNAMES, - PATH_ROOT, - blob_name_prefix=BLOB_NAME_PREFIX, - download_kwargs=DOWNLOAD_KWARGS, - max_workers=MAX_WORKERS, - deadline=DEADLINE, - raise_exception=True, - ) - - mock_download_many.assert_called_once_with( - EXPECTED_BLOB_FILE_PAIRS, - download_kwargs=DOWNLOAD_KWARGS, - max_workers=MAX_WORKERS, - deadline=DEADLINE, - raise_exception=True, - ) - bucket.blob.assert_any_call(BLOB_NAME_PREFIX + BLOBNAMES[0]) - bucket.blob.assert_any_call(BLOB_NAME_PREFIX + BLOBNAMES[1]) From aee58b2b0eeafe3e26090df70951a5688148befb Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:47:48 -0800 Subject: [PATCH 114/509] chore(main): release 2.6.0 (#838) * chore(main): release 2.6.0 * Update CHANGELOG.md Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cojenco --- CHANGELOG.md | 25 +++++++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c312a242..5100dc3da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,31 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.6.0](https://github.com/googleapis/python-storage/compare/v2.5.0...v2.6.0) (2022-11-07) + + +### Features + +* Add Autoclass support and samples ([#791](https://github.com/googleapis/python-storage/issues/791)) ([9ccdc5f](https://github.com/googleapis/python-storage/commit/9ccdc5f2e8a9e28b2df47260d639b6af2708fe9a)), closes [#797](https://github.com/googleapis/python-storage/issues/797) +* Add predefined_acl to create_resumable_upload_session ([#878](https://github.com/googleapis/python-storage/issues/878)) ([2b3e8f9](https://github.com/googleapis/python-storage/commit/2b3e8f967df95d45c35e150b201e77b8962c7e9b)) +* Enable delete_blobs() to preserve generation ([#840](https://github.com/googleapis/python-storage/issues/840)) ([8fd4c37](https://github.com/googleapis/python-storage/commit/8fd4c376bd5f031836feb8101c9c0c0d1c2e969d)), closes [#814](https://github.com/googleapis/python-storage/issues/814) +* Make tests run against environments other than prod ([#883](https://github.com/googleapis/python-storage/issues/883)) ([7dfeb62](https://github.com/googleapis/python-storage/commit/7dfeb622bb966e368786e3c9be67ad77b3150725)) + + +### Bug Fixes + +* Align bucket bound hostname url builder consistency ([#875](https://github.com/googleapis/python-storage/issues/875)) ([8a24add](https://github.com/googleapis/python-storage/commit/8a24add52f0bc7dbcb3ec427bd3e4551b3afcbf5)) +* BlobWriter.close() will do nothing if already closed ([#887](https://github.com/googleapis/python-storage/issues/887)) ([7707220](https://github.com/googleapis/python-storage/commit/770722034072cfcaafc18340e91746957ef31397)) +* Remove client side validations ([#868](https://github.com/googleapis/python-storage/issues/868)) ([928ebbc](https://github.com/googleapis/python-storage/commit/928ebbccbe183666f3b35adb7226bd259d4e71c0)) + + +### Documentation + +* Update comments in list_blobs sample ([#866](https://github.com/googleapis/python-storage/issues/866)) ([9469f5d](https://github.com/googleapis/python-storage/commit/9469f5dd5ca6d546a47efbc3d673a401ead9d632)) +* Clarify prefixes entity in list_blobs usage ([#837](https://github.com/googleapis/python-storage/issues/837)) ([7101f47](https://github.com/googleapis/python-storage/commit/7101f47fde663eec4bbaaa246c7fe4e973ca2506)) +* Streamline docs for migration ([#876](https://github.com/googleapis/python-storage/issues/876)) ([7c8a178](https://github.com/googleapis/python-storage/commit/7c8a178978d2022482afd301242ae79b2f9c737a)) +* Update docstring for lifecycle_rules to match generator behavior ([#841](https://github.com/googleapis/python-storage/issues/841)) ([36fb81b](https://github.com/googleapis/python-storage/commit/36fb81b5b0e5b7e65b9db434c997617136bfc3fc)) + ## [2.5.0](https://github.com/googleapis/python-storage/compare/v2.4.0...v2.5.0) (2022-07-24) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 5836d8051..ae34a9fbe 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.5.0" +__version__ = "2.6.0" From 2c1edf74614a966ac7394825635e466928dfa8b7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 9 Nov 2022 01:02:25 +0100 Subject: [PATCH 115/509] chore(deps): update dependency google-cloud-storage to v2.6.0 (#899) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 8e71b2787..bcf31e6ba 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.10 -google-cloud-storage==2.5.0 +google-cloud-storage==2.6.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.1; python_version >= '3.8' From 9ff3a7c3e0153f6a289915574c42474d60b78fd1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 15 Nov 2022 21:37:49 +0100 Subject: [PATCH 116/509] chore(deps): update dependency google-cloud-pubsub to v2.13.11 (#902) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index bcf31e6ba..b676c0c6d 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.10 +google-cloud-pubsub==2.13.11 google-cloud-storage==2.6.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.1; python_version >= '3.8' From c774ad582d523ffa1446d48fd36440aa445ea94e Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 16 Nov 2022 11:28:17 -0800 Subject: [PATCH 117/509] chore: generate testing sponge logs and enable flakybot (#905) --- noxfile.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/noxfile.py b/noxfile.py index 3b8eb127b..13a05c3e9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -85,6 +85,7 @@ def default(session): session.run( "py.test", "--quiet", + f"--junitxml=unit_{session.python}_sponge_log.xml", "--cov=google.cloud.storage", "--cov=google.cloud", "--cov=tests.unit", @@ -161,6 +162,7 @@ def system(session): session.run( "py.test", "--quiet", + f"--junitxml=system_{session.python}_sponge_log.xml", "--reruns={}".format(rerun_count), system_test_path, *session.posargs, @@ -169,6 +171,7 @@ def system(session): session.run( "py.test", "--quiet", + f"--junitxml=system_{session.python}_sponge_log.xml", "--reruns={}".format(rerun_count), system_test_folder_path, *session.posargs, From 4cd4a047ca52b5c7d7813b1bf678a7a3fb71388b Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 18 Nov 2022 10:31:06 -0800 Subject: [PATCH 118/509] tests: ensure test runs after reaching retention period (#911) --- tests/system/test_bucket.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index e31b1ae49..5d7495316 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -626,7 +626,7 @@ def test_bucket_w_retention_period( buckets_to_delete, blobs_to_delete, ): - period_secs = 10 + period_secs = 3 bucket_name = _helpers.unique_name("w-retention-period") bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) buckets_to_delete.append(bucket) @@ -679,6 +679,8 @@ def test_bucket_w_retention_period( assert not other.temporary_hold assert other.retention_expiration_time is None + # Object can be deleted once it reaches the age defined in the retention policy. + _helpers.await_config_changes_propagate(sec=period_secs) other.delete() blobs_to_delete.pop() From 7cfedf41f7fde020aef42ce1fa9e780f11a5f1e4 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 27 Nov 2022 01:02:56 +0100 Subject: [PATCH 119/509] chore(deps): update dependency pandas to v1.5.2 (#915) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index b676c0c6d..d5554b4d9 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.11 google-cloud-storage==2.6.0 pandas===1.3.5; python_version == '3.7' -pandas==1.5.1; python_version >= '3.8' +pandas==1.5.2; python_version >= '3.8' From 47a04ef052d012aec55c4f93297b5453264a0c62 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Sun, 27 Nov 2022 07:54:02 -0500 Subject: [PATCH 120/509] chore(python): drop flake8-import-order in samples noxfile [autoapprove] (#916) * chore(python): drop flake8-import-order in samples noxfile Source-Link: https://github.com/googleapis/synthtool/commit/6ed3a831cb9ff69ef8a504c353e098ec0192ad93 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:3abfa0f1886adaf0b83f07cb117b24a639ea1cb9cffe56d43280b977033563eb * update python version for docs session Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/docker/docs/Dockerfile | 12 +- .kokoro/requirements.in | 4 +- .kokoro/requirements.txt | 354 ++++++++++++++++++--------------- noxfile.py | 4 +- samples/snippets/noxfile.py | 26 +-- 6 files changed, 208 insertions(+), 194 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 3815c983c..bb21147e4 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 + digest: sha256:3abfa0f1886adaf0b83f07cb117b24a639ea1cb9cffe56d43280b977033563eb diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index 238b87b9d..f8137d0ae 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -60,16 +60,16 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && rm -f /var/cache/apt/archives/*.deb -###################### Install python 3.8.11 +###################### Install python 3.9.13 -# Download python 3.8.11 -RUN wget https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tgz +# Download python 3.9.13 +RUN wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz # Extract files -RUN tar -xvf Python-3.8.11.tgz +RUN tar -xvf Python-3.9.13.tgz -# Install python 3.8.11 -RUN ./Python-3.8.11/configure --enable-optimizations +# Install python 3.9.13 +RUN ./Python-3.9.13/configure --enable-optimizations RUN make altinstall ###################### Install pip diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index 7718391a3..cbd7e77f4 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -5,4 +5,6 @@ typing-extensions twine wheel setuptools -nox \ No newline at end of file +nox +charset-normalizer<3 +click<8.1.0 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index d15994bac..9c1b9be34 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.2.0 \ --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db # via google-auth -certifi==2022.6.15 \ - --hash=sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d \ - --hash=sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412 +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ @@ -93,11 +93,14 @@ cffi==1.15.1 \ charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f - # via requests + # via + # -r requirements.in + # requests click==8.0.4 \ --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \ --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb # via + # -r requirements.in # gcp-docuploader # gcp-releasetool colorlog==6.7.0 \ @@ -110,29 +113,33 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==37.0.4 \ - --hash=sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59 \ - --hash=sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596 \ - --hash=sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3 \ - --hash=sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5 \ - --hash=sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab \ - --hash=sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884 \ - --hash=sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82 \ - --hash=sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b \ - --hash=sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441 \ - --hash=sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa \ - --hash=sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d \ - --hash=sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b \ - --hash=sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a \ - --hash=sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6 \ - --hash=sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157 \ - --hash=sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280 \ - --hash=sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282 \ - --hash=sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67 \ - --hash=sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8 \ - --hash=sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046 \ - --hash=sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327 \ - --hash=sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9 +cryptography==38.0.3 \ + --hash=sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d \ + --hash=sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd \ + --hash=sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146 \ + --hash=sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7 \ + --hash=sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436 \ + --hash=sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0 \ + --hash=sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828 \ + --hash=sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b \ + --hash=sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55 \ + --hash=sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36 \ + --hash=sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50 \ + --hash=sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2 \ + --hash=sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a \ + --hash=sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8 \ + --hash=sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0 \ + --hash=sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548 \ + --hash=sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320 \ + --hash=sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748 \ + --hash=sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249 \ + --hash=sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959 \ + --hash=sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f \ + --hash=sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0 \ + --hash=sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd \ + --hash=sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220 \ + --hash=sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c \ + --hash=sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722 # via # gcp-releasetool # secretstorage @@ -148,23 +155,23 @@ filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 # via virtualenv -gcp-docuploader==0.6.3 \ - --hash=sha256:ba8c9d76b3bbac54b0311c503a373b00edc2dc02d6d54ea9507045adb8e870f7 \ - --hash=sha256:c0f5aaa82ce1854a386197e4e359b120ad6d4e57ae2c812fce42219a3288026b +gcp-docuploader==0.6.4 \ + --hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \ + --hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf # via -r requirements.in -gcp-releasetool==1.8.7 \ - --hash=sha256:3d2a67c9db39322194afb3b427e9cb0476ce8f2a04033695f0aeb63979fc2b37 \ - --hash=sha256:5e4d28f66e90780d77f3ecf1e9155852b0c3b13cbccb08ab07e66b2357c8da8d +gcp-releasetool==1.10.0 \ + --hash=sha256:72a38ca91b59c24f7e699e9227c90cbe4dd71b789383cb0164b088abae294c83 \ + --hash=sha256:8c7c99320208383d4bb2b808c6880eb7a81424afe7cdba3c8d84b25f4f0e097d # via -r requirements.in -google-api-core==2.8.2 \ - --hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \ - --hash=sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50 +google-api-core==2.10.2 \ + --hash=sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320 \ + --hash=sha256:34f24bd1d5f72a8c4519773d99ca6bf080a6c4e041b4e9f024fe230191dda62e # via # google-cloud-core # google-cloud-storage -google-auth==2.11.0 \ - --hash=sha256:be62acaae38d0049c21ca90f27a23847245c9f161ff54ede13af2cb6afecbac9 \ - --hash=sha256:ed65ecf9f681832298e29328e1ef0a3676e3732b2e56f41532d45f70a22de0fb +google-auth==2.14.1 \ + --hash=sha256:ccaa901f31ad5cbb562615eb8b664b3dd0bf5404a67618e642307f00613eda4d \ + --hash=sha256:f5d8701633bebc12e0deea4df8abd8aff31c28b355360597f7f2ee60f2e4d016 # via # gcp-releasetool # google-api-core @@ -174,76 +181,102 @@ google-cloud-core==2.3.2 \ --hash=sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe \ --hash=sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a # via google-cloud-storage -google-cloud-storage==2.5.0 \ - --hash=sha256:19a26c66c317ce542cea0830b7e787e8dac2588b6bfa4d3fd3b871ba16305ab0 \ - --hash=sha256:382f34b91de2212e3c2e7b40ec079d27ee2e3dbbae99b75b1bcd8c63063ce235 +google-cloud-storage==2.6.0 \ + --hash=sha256:104ca28ae61243b637f2f01455cc8a05e8f15a2a18ced96cb587241cdd3820f5 \ + --hash=sha256:4ad0415ff61abdd8bb2ae81c1f8f7ec7d91a1011613f2db87c614c550f97bfe9 # via gcp-docuploader -google-crc32c==1.3.0 \ - --hash=sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3 \ - --hash=sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6 \ - --hash=sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206 \ - --hash=sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422 \ - --hash=sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a \ - --hash=sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e \ - --hash=sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0 \ - --hash=sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df \ - --hash=sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407 \ - --hash=sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea \ - --hash=sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48 \ - --hash=sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713 \ - --hash=sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3 \ - --hash=sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267 \ - --hash=sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829 \ - --hash=sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2 \ - --hash=sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a \ - --hash=sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183 \ - --hash=sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942 \ - --hash=sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59 \ - --hash=sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b \ - --hash=sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd \ - --hash=sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c \ - --hash=sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02 \ - --hash=sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328 \ - --hash=sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08 \ - --hash=sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f \ - --hash=sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168 \ - --hash=sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318 \ - --hash=sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d \ - --hash=sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73 \ - --hash=sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4 \ - --hash=sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812 \ - --hash=sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3 \ - --hash=sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d \ - --hash=sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e \ - --hash=sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217 \ - --hash=sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e \ - --hash=sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f \ - --hash=sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125 \ - --hash=sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4 \ - --hash=sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b \ - --hash=sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3 +google-crc32c==1.5.0 \ + --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ + --hash=sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876 \ + --hash=sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c \ + --hash=sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289 \ + --hash=sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 \ + --hash=sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02 \ + --hash=sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f \ + --hash=sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2 \ + --hash=sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a \ + --hash=sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb \ + --hash=sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210 \ + --hash=sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5 \ + --hash=sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee \ + --hash=sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c \ + --hash=sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a \ + --hash=sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314 \ + --hash=sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd \ + --hash=sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65 \ + --hash=sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37 \ + --hash=sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4 \ + --hash=sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13 \ + --hash=sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894 \ + --hash=sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31 \ + --hash=sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e \ + --hash=sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709 \ + --hash=sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740 \ + --hash=sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc \ + --hash=sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d \ + --hash=sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c \ + --hash=sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c \ + --hash=sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d \ + --hash=sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 \ + --hash=sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61 \ + --hash=sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 \ + --hash=sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c \ + --hash=sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a \ + --hash=sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438 \ + --hash=sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946 \ + --hash=sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7 \ + --hash=sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96 \ + --hash=sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091 \ + --hash=sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae \ + --hash=sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d \ + --hash=sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88 \ + --hash=sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2 \ + --hash=sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd \ + --hash=sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541 \ + --hash=sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728 \ + --hash=sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178 \ + --hash=sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 \ + --hash=sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346 \ + --hash=sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8 \ + --hash=sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93 \ + --hash=sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7 \ + --hash=sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 \ + --hash=sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462 \ + --hash=sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94 \ + --hash=sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd \ + --hash=sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e \ + --hash=sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57 \ + --hash=sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b \ + --hash=sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9 \ + --hash=sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a \ + --hash=sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100 \ + --hash=sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325 \ + --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ + --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ + --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 # via google-resumable-media -google-resumable-media==2.3.3 \ - --hash=sha256:27c52620bd364d1c8116eaac4ea2afcbfb81ae9139fb3199652fcac1724bfb6c \ - --hash=sha256:5b52774ea7a829a8cdaa8bd2d4c3d4bc660c91b30857ab2668d0eb830f4ea8c5 +google-resumable-media==2.4.0 \ + --hash=sha256:2aa004c16d295c8f6c33b2b4788ba59d366677c0a25ae7382436cb30f776deaa \ + --hash=sha256:8d5518502f92b9ecc84ac46779bd4f09694ecb3ba38a3e7ca737a86d15cbca1f # via google-cloud-storage -googleapis-common-protos==1.56.4 \ - --hash=sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394 \ - --hash=sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417 +googleapis-common-protos==1.57.0 \ + --hash=sha256:27a849d6205838fb6cc3c1c21cb9800707a661bb21c6ce7fb13e99eb1f8a0c46 \ + --hash=sha256:a9f4a1d7f6d9809657b7f1316a1aa527f6664891531bcfcc13b6696e685f443c # via google-api-core -idna==3.3 \ - --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ - --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via requests -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # -r requirements.in + # keyring # twine -jaraco-classes==3.2.2 \ - --hash=sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594 \ - --hash=sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647 +jaraco-classes==3.2.3 \ + --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ + --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a # via keyring jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ @@ -255,9 +288,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via gcp-releasetool -keyring==23.9.0 \ - --hash=sha256:4c32a31174faaee48f43a7e2c7e9c3216ec5e95acf22a2bebfb4a1d05056ee44 \ - --hash=sha256:98f060ec95ada2ab910c195a2d4317be6ef87936a766b239c46aa3c7aac4f0db +keyring==23.11.0 \ + --hash=sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e \ + --hash=sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361 # via # gcp-releasetool # twine @@ -303,9 +336,9 @@ markupsafe==2.1.1 \ --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 # via jinja2 -more-itertools==8.14.0 \ - --hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \ - --hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750 +more-itertools==9.0.0 \ + --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ + --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes nox==2022.8.7 \ --hash=sha256:1b894940551dc5c389f9271d197ca5d655d40bdc6ccf93ed6880e4042760a34b \ @@ -321,34 +354,33 @@ pkginfo==1.8.3 \ --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c # via twine -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via virtualenv -protobuf==3.20.2 \ - --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ - --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ - --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ - --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ - --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ - --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ - --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ - --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ - --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ - --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ - --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ - --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ - --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ - --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ - --hash=sha256:9f876a69ca55aed879b43c295a328970306e8e80a263ec91cf6e9189243c613b \ - --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ - --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ - --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ - --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ - --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ - --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ - --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ - --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 +protobuf==3.20.3 \ + --hash=sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7 \ + --hash=sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c \ + --hash=sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2 \ + --hash=sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b \ + --hash=sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050 \ + --hash=sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9 \ + --hash=sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7 \ + --hash=sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454 \ + --hash=sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480 \ + --hash=sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469 \ + --hash=sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c \ + --hash=sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e \ + --hash=sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db \ + --hash=sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905 \ + --hash=sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b \ + --hash=sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86 \ + --hash=sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4 \ + --hash=sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402 \ + --hash=sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7 \ + --hash=sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4 \ + --hash=sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99 \ + --hash=sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee # via # gcp-docuploader # gcp-releasetool @@ -377,9 +409,9 @@ pygments==2.13.0 \ # via # readme-renderer # rich -pyjwt==2.4.0 \ - --hash=sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf \ - --hash=sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba +pyjwt==2.6.0 \ + --hash=sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd \ + --hash=sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14 # via gcp-releasetool pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -392,9 +424,9 @@ python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 # via gcp-releasetool -readme-renderer==37.0 \ - --hash=sha256:07b7ea234e03e58f77cc222e206e6abb8f4c0435becce5104794ee591f9301c5 \ - --hash=sha256:9fa416704703e509eeb900696751c908ddeb2011319d93700d8f18baff887a69 +readme-renderer==37.3 \ + --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ + --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 # via twine requests==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ @@ -405,17 +437,17 @@ requests==2.28.1 \ # google-cloud-storage # requests-toolbelt # twine -requests-toolbelt==0.9.1 \ - --hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f \ - --hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0 +requests-toolbelt==0.10.1 \ + --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ + --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==12.5.1 \ - --hash=sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb \ - --hash=sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca +rich==12.6.0 \ + --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ + --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 # via twine rsa==4.9 \ --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ @@ -437,9 +469,9 @@ twine==4.0.1 \ --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ --hash=sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0 # via -r requirements.in -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via -r requirements.in urllib3==1.26.12 \ --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ @@ -447,25 +479,25 @@ urllib3==1.26.12 \ # via # requests # twine -virtualenv==20.16.4 \ - --hash=sha256:014f766e4134d0008dcaa1f95bafa0fb0f575795d07cae50b1bee514185d6782 \ - --hash=sha256:035ed57acce4ac35c82c9d8802202b0e71adac011a511ff650cbcf9635006a22 +virtualenv==20.16.7 \ + --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ + --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via nox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 # via bleach -wheel==0.37.1 \ - --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ - --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 +wheel==0.38.4 \ + --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ + --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via -r requirements.in -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==65.2.0 \ - --hash=sha256:7f4bc85450898a09f76ebf28b72fa25bc7111f6c7d665d514a60bba9c75ef2a9 \ - --hash=sha256:a3ca5857c89f82f5c9410e8508cb32f4872a3bafd4aa7ae122a24ca33bccc750 +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via -r requirements.in diff --git a/noxfile.py b/noxfile.py index 13a05c3e9..336520412 100644 --- a/noxfile.py +++ b/noxfile.py @@ -220,7 +220,7 @@ def cover(session): session.run("coverage", "erase") -@nox.session(python=DEFAULT_PYTHON_VERSION) +@nox.session(python="3.9") def docs(session): """Build the docs for this library.""" @@ -242,7 +242,7 @@ def docs(session): ) -@nox.session(python=DEFAULT_PYTHON_VERSION) +@nox.session(python="3.9") def docfx(session): """Build the docfx yaml files for this library.""" diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 0398d72ff..f5c32b227 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -18,7 +18,7 @@ import os from pathlib import Path import sys -from typing import Callable, Dict, List, Optional +from typing import Callable, Dict, Optional import nox @@ -109,22 +109,6 @@ def get_pytest_env_vars() -> Dict[str, str]: # -def _determine_local_import_names(start_dir: str) -> List[str]: - """Determines all import names that should be considered "local". - - This is used when running the linter to insure that import order is - properly checked. - """ - file_ext_pairs = [os.path.splitext(path) for path in os.listdir(start_dir)] - return [ - basename - for basename, extension in file_ext_pairs - if extension == ".py" - or os.path.isdir(os.path.join(start_dir, basename)) - and basename not in ("__pycache__") - ] - - # Linting with flake8. # # We ignore the following rules: @@ -139,7 +123,6 @@ def _determine_local_import_names(start_dir: str) -> List[str]: "--show-source", "--builtin=gettext", "--max-complexity=20", - "--import-order-style=google", "--exclude=.nox,.cache,env,lib,generated_pb2,*_pb2.py,*_pb2_grpc.py", "--ignore=E121,E123,E126,E203,E226,E24,E266,E501,E704,W503,W504,I202", "--max-line-length=88", @@ -149,14 +132,11 @@ def _determine_local_import_names(start_dir: str) -> List[str]: @nox.session def lint(session: nox.sessions.Session) -> None: if not TEST_CONFIG["enforce_type_hints"]: - session.install("flake8", "flake8-import-order") + session.install("flake8") else: - session.install("flake8", "flake8-import-order", "flake8-annotations") + session.install("flake8", "flake8-annotations") - local_names = _determine_local_import_names(".") args = FLAKE8_COMMON_ARGS + [ - "--application-import-names", - ",".join(local_names), ".", ] session.run("flake8", *args) From 4862a9c34fcd9524f31312227a2ccf5e376f39fa Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 29 Nov 2022 12:13:05 +0800 Subject: [PATCH 121/509] feat: add support for use_auth_w_custom_endpoint (#901) * feat: add support for use_auth_w_custom_endpoint * update docstring * handle emulator cases * set default storage host as constant --- google/cloud/storage/_helpers.py | 10 ++--- google/cloud/storage/client.py | 43 +++++++++++++-------- tests/unit/test_client.py | 65 ++++++++++++++++++++++---------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 82bb4230e..e0ddfb76b 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -33,17 +33,15 @@ STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" """Environment variable defining host for Storage emulator.""" -_DEFAULT_STORAGE_HOST = os.getenv( - "API_ENDPOINT_OVERRIDE", "https://storage.googleapis.com" -) +_BASE_STORAGE_URI = "https://storage.googleapis.com" +"""Base request endpoint URI for JSON API.""" + +_DEFAULT_STORAGE_HOST = os.getenv("API_ENDPOINT_OVERRIDE", _BASE_STORAGE_URI) """Default storage host for JSON API.""" _API_VERSION = os.getenv("API_VERSION_OVERRIDE", "v1") """API version of the default storage host""" -_BASE_STORAGE_URI = "storage.googleapis.com" -"""Base request endpoint URI for JSON API.""" - # etag match parameters in snake case and equivalent header _ETAG_MATCH_PARAMETERS = ( ("if_etag_match", "If-Match"), diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 56bfa67cf..e8297f050 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -96,6 +96,12 @@ class Client(ClientWithProject): :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` :param client_options: (Optional) Client options used to set user options on the client. API Endpoint should be set through client_options. + + :type use_auth_w_custom_endpoint: bool + :param use_auth_w_custom_endpoint: + (Optional) Whether authentication is required under custom endpoints. + If false, uses AnonymousCredentials and bypasses authentication. + Defaults to True. Note this is only used when a custom endpoint is set in conjunction. """ SCOPE = ( @@ -112,6 +118,7 @@ def __init__( _http=None, client_info=None, client_options=None, + use_auth_w_custom_endpoint=True, ): self._base_connection = None @@ -132,7 +139,7 @@ def __init__( # then mTLS logic will be applied to decide which endpoint will be used. storage_host = _get_storage_host() kw_args["api_endpoint"] = ( - storage_host if storage_host != _DEFAULT_STORAGE_HOST else None + storage_host if storage_host != _BASE_STORAGE_URI else None ) if client_options: @@ -144,19 +151,23 @@ def __init__( api_endpoint = client_options.api_endpoint kw_args["api_endpoint"] = api_endpoint - # Use anonymous credentials and no project when - # STORAGE_EMULATOR_HOST or a non-default api_endpoint is set. - if ( - kw_args["api_endpoint"] is not None - and _BASE_STORAGE_URI not in kw_args["api_endpoint"] - ): - if credentials is None: - credentials = AnonymousCredentials() - if project is None: - project = _get_environ_project() - if project is None: - no_project = True - project = "" + # If a custom endpoint is set, the client checks for credentials + # or finds the default credentials based on the current environment. + # Authentication may be bypassed under certain conditions: + # (1) STORAGE_EMULATOR_HOST is set (for backwards compatibility), OR + # (2) use_auth_w_custom_endpoint is set to False. + if kw_args["api_endpoint"] is not None: + if ( + kw_args["api_endpoint"] == storage_host + or not use_auth_w_custom_endpoint + ): + if credentials is None: + credentials = AnonymousCredentials() + if project is None: + project = _get_environ_project() + if project is None: + no_project = True + project = "" super(Client, self).__init__( project=project, @@ -897,7 +908,7 @@ def create_bucket( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - if _BASE_STORAGE_URI not in _get_storage_host(): + if _get_storage_host() != _DEFAULT_STORAGE_HOST: if project is None: project = _get_environ_project() if project is None: @@ -1327,7 +1338,7 @@ def list_buckets( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - if _BASE_STORAGE_URI not in _get_storage_host(): + if _get_storage_host() != _DEFAULT_STORAGE_HOST: if project is None: project = _get_environ_project() if project is None: diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index c100d35b0..58b38cdcc 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -28,9 +28,10 @@ from google.auth.credentials import AnonymousCredentials from google.oauth2.service_account import Credentials +from google.cloud.storage import _helpers from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR from google.cloud.storage._helpers import _get_default_headers -from google.cloud.storage import _helpers +from google.cloud.storage._http import Connection from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST @@ -119,7 +120,6 @@ def _make_one(self, *args, **kw): def test_ctor_connection_type(self): from google.cloud._http import ClientInfo - from google.cloud.storage._http import Connection PROJECT = "PROJECT" credentials = _make_credentials() @@ -179,8 +179,6 @@ def test_ctor_w_client_options_object(self): ) def test_ctor_wo_project(self): - from google.cloud.storage._http import Connection - PROJECT = "PROJECT" credentials = _make_credentials(project=PROJECT) @@ -193,8 +191,6 @@ def test_ctor_wo_project(self): self.assertEqual(list(client._batch_stack), []) def test_ctor_w_project_explicit_none(self): - from google.cloud.storage._http import Connection - credentials = _make_credentials() client = self._make_one(project=None, credentials=credentials) @@ -207,7 +203,6 @@ def test_ctor_w_project_explicit_none(self): def test_ctor_w_client_info(self): from google.cloud._http import ClientInfo - from google.cloud.storage._http import Connection credentials = _make_credentials() client_info = ClientInfo() @@ -239,8 +234,40 @@ def test_ctor_mtls(self): self.assertEqual(client._connection.ALLOW_AUTO_SWITCH_TO_MTLS_URL, False) self.assertEqual(client._connection.API_BASE_URL, "http://foo") + def test_ctor_w_custom_endpoint_use_auth(self): + custom_endpoint = "storage-example.p.googleapis.com" + client = self._make_one(client_options={"api_endpoint": custom_endpoint}) + self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) + self.assertIsNotNone(client.project) + self.assertIsInstance(client._connection, Connection) + self.assertIsNotNone(client._connection.credentials) + self.assertNotIsInstance(client._connection.credentials, AnonymousCredentials) + + def test_ctor_w_custom_endpoint_bypass_auth(self): + custom_endpoint = "storage-example.p.googleapis.com" + client = self._make_one( + client_options={"api_endpoint": custom_endpoint}, + use_auth_w_custom_endpoint=False, + ) + self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) + self.assertEqual(client.project, None) + self.assertIsInstance(client._connection, Connection) + self.assertIsInstance(client._connection.credentials, AnonymousCredentials) + + def test_ctor_w_custom_endpoint_w_credentials(self): + PROJECT = "PROJECT" + custom_endpoint = "storage-example.p.googleapis.com" + credentials = _make_credentials(project=PROJECT) + client = self._make_one( + credentials=credentials, client_options={"api_endpoint": custom_endpoint} + ) + self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) + self.assertEqual(client.project, PROJECT) + self.assertIsInstance(client._connection, Connection) + self.assertIs(client._connection.credentials, credentials) + def test_ctor_w_emulator_wo_project(self): - # avoids authentication if STORAGE_EMULATOR_ENV_VAR is set + # bypasses authentication if STORAGE_EMULATOR_ENV_VAR is set host = "http://localhost:8080" environ = {STORAGE_EMULATOR_ENV_VAR: host} with mock.patch("os.environ", environ): @@ -250,16 +277,8 @@ def test_ctor_w_emulator_wo_project(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - # avoids authentication if storage emulator is set through api_endpoint - client = self._make_one( - client_options={"api_endpoint": "http://localhost:8080"} - ) - self.assertIsNone(client.project) - self.assertEqual(client._connection.API_BASE_URL, host) - self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - def test_ctor_w_emulator_w_environ_project(self): - # avoids authentication and infers the project from the environment + # bypasses authentication and infers the project from the environment host = "http://localhost:8080" environ_project = "environ-project" environ = { @@ -289,9 +308,17 @@ def test_ctor_w_emulator_w_project_arg(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - def test_create_anonymous_client(self): - from google.cloud.storage._http import Connection + def test_ctor_w_emulator_w_credentials(self): + host = "http://localhost:8080" + environ = {STORAGE_EMULATOR_ENV_VAR: host} + credentials = _make_credentials() + with mock.patch("os.environ", environ): + client = self._make_one(credentials=credentials) + self.assertEqual(client._connection.API_BASE_URL, host) + self.assertIs(client._connection.credentials, credentials) + + def test_create_anonymous_client(self): klass = self._get_target_class() client = klass.create_anonymous_client() From 1ca02333643b21d55b51bf2df7cf10765ba96d59 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 30 Nov 2022 06:26:01 +0800 Subject: [PATCH 122/509] Revert "feat: add support for use_auth_w_custom_endpoint (#901)" (#940) This reverts commit 4862a9c34fcd9524f31312227a2ccf5e376f39fa. --- google/cloud/storage/_helpers.py | 10 +++-- google/cloud/storage/client.py | 43 ++++++++------------- tests/unit/test_client.py | 65 ++++++++++---------------------- 3 files changed, 41 insertions(+), 77 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index e0ddfb76b..82bb4230e 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -33,15 +33,17 @@ STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" """Environment variable defining host for Storage emulator.""" -_BASE_STORAGE_URI = "https://storage.googleapis.com" -"""Base request endpoint URI for JSON API.""" - -_DEFAULT_STORAGE_HOST = os.getenv("API_ENDPOINT_OVERRIDE", _BASE_STORAGE_URI) +_DEFAULT_STORAGE_HOST = os.getenv( + "API_ENDPOINT_OVERRIDE", "https://storage.googleapis.com" +) """Default storage host for JSON API.""" _API_VERSION = os.getenv("API_VERSION_OVERRIDE", "v1") """API version of the default storage host""" +_BASE_STORAGE_URI = "storage.googleapis.com" +"""Base request endpoint URI for JSON API.""" + # etag match parameters in snake case and equivalent header _ETAG_MATCH_PARAMETERS = ( ("if_etag_match", "If-Match"), diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index e8297f050..56bfa67cf 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -96,12 +96,6 @@ class Client(ClientWithProject): :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` :param client_options: (Optional) Client options used to set user options on the client. API Endpoint should be set through client_options. - - :type use_auth_w_custom_endpoint: bool - :param use_auth_w_custom_endpoint: - (Optional) Whether authentication is required under custom endpoints. - If false, uses AnonymousCredentials and bypasses authentication. - Defaults to True. Note this is only used when a custom endpoint is set in conjunction. """ SCOPE = ( @@ -118,7 +112,6 @@ def __init__( _http=None, client_info=None, client_options=None, - use_auth_w_custom_endpoint=True, ): self._base_connection = None @@ -139,7 +132,7 @@ def __init__( # then mTLS logic will be applied to decide which endpoint will be used. storage_host = _get_storage_host() kw_args["api_endpoint"] = ( - storage_host if storage_host != _BASE_STORAGE_URI else None + storage_host if storage_host != _DEFAULT_STORAGE_HOST else None ) if client_options: @@ -151,23 +144,19 @@ def __init__( api_endpoint = client_options.api_endpoint kw_args["api_endpoint"] = api_endpoint - # If a custom endpoint is set, the client checks for credentials - # or finds the default credentials based on the current environment. - # Authentication may be bypassed under certain conditions: - # (1) STORAGE_EMULATOR_HOST is set (for backwards compatibility), OR - # (2) use_auth_w_custom_endpoint is set to False. - if kw_args["api_endpoint"] is not None: - if ( - kw_args["api_endpoint"] == storage_host - or not use_auth_w_custom_endpoint - ): - if credentials is None: - credentials = AnonymousCredentials() - if project is None: - project = _get_environ_project() - if project is None: - no_project = True - project = "" + # Use anonymous credentials and no project when + # STORAGE_EMULATOR_HOST or a non-default api_endpoint is set. + if ( + kw_args["api_endpoint"] is not None + and _BASE_STORAGE_URI not in kw_args["api_endpoint"] + ): + if credentials is None: + credentials = AnonymousCredentials() + if project is None: + project = _get_environ_project() + if project is None: + no_project = True + project = "" super(Client, self).__init__( project=project, @@ -908,7 +897,7 @@ def create_bucket( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - if _get_storage_host() != _DEFAULT_STORAGE_HOST: + if _BASE_STORAGE_URI not in _get_storage_host(): if project is None: project = _get_environ_project() if project is None: @@ -1338,7 +1327,7 @@ def list_buckets( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - if _get_storage_host() != _DEFAULT_STORAGE_HOST: + if _BASE_STORAGE_URI not in _get_storage_host(): if project is None: project = _get_environ_project() if project is None: diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 58b38cdcc..c100d35b0 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -28,10 +28,9 @@ from google.auth.credentials import AnonymousCredentials from google.oauth2.service_account import Credentials -from google.cloud.storage import _helpers from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR from google.cloud.storage._helpers import _get_default_headers -from google.cloud.storage._http import Connection +from google.cloud.storage import _helpers from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST @@ -120,6 +119,7 @@ def _make_one(self, *args, **kw): def test_ctor_connection_type(self): from google.cloud._http import ClientInfo + from google.cloud.storage._http import Connection PROJECT = "PROJECT" credentials = _make_credentials() @@ -179,6 +179,8 @@ def test_ctor_w_client_options_object(self): ) def test_ctor_wo_project(self): + from google.cloud.storage._http import Connection + PROJECT = "PROJECT" credentials = _make_credentials(project=PROJECT) @@ -191,6 +193,8 @@ def test_ctor_wo_project(self): self.assertEqual(list(client._batch_stack), []) def test_ctor_w_project_explicit_none(self): + from google.cloud.storage._http import Connection + credentials = _make_credentials() client = self._make_one(project=None, credentials=credentials) @@ -203,6 +207,7 @@ def test_ctor_w_project_explicit_none(self): def test_ctor_w_client_info(self): from google.cloud._http import ClientInfo + from google.cloud.storage._http import Connection credentials = _make_credentials() client_info = ClientInfo() @@ -234,40 +239,8 @@ def test_ctor_mtls(self): self.assertEqual(client._connection.ALLOW_AUTO_SWITCH_TO_MTLS_URL, False) self.assertEqual(client._connection.API_BASE_URL, "http://foo") - def test_ctor_w_custom_endpoint_use_auth(self): - custom_endpoint = "storage-example.p.googleapis.com" - client = self._make_one(client_options={"api_endpoint": custom_endpoint}) - self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) - self.assertIsNotNone(client.project) - self.assertIsInstance(client._connection, Connection) - self.assertIsNotNone(client._connection.credentials) - self.assertNotIsInstance(client._connection.credentials, AnonymousCredentials) - - def test_ctor_w_custom_endpoint_bypass_auth(self): - custom_endpoint = "storage-example.p.googleapis.com" - client = self._make_one( - client_options={"api_endpoint": custom_endpoint}, - use_auth_w_custom_endpoint=False, - ) - self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) - self.assertEqual(client.project, None) - self.assertIsInstance(client._connection, Connection) - self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - - def test_ctor_w_custom_endpoint_w_credentials(self): - PROJECT = "PROJECT" - custom_endpoint = "storage-example.p.googleapis.com" - credentials = _make_credentials(project=PROJECT) - client = self._make_one( - credentials=credentials, client_options={"api_endpoint": custom_endpoint} - ) - self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) - self.assertEqual(client.project, PROJECT) - self.assertIsInstance(client._connection, Connection) - self.assertIs(client._connection.credentials, credentials) - def test_ctor_w_emulator_wo_project(self): - # bypasses authentication if STORAGE_EMULATOR_ENV_VAR is set + # avoids authentication if STORAGE_EMULATOR_ENV_VAR is set host = "http://localhost:8080" environ = {STORAGE_EMULATOR_ENV_VAR: host} with mock.patch("os.environ", environ): @@ -277,8 +250,16 @@ def test_ctor_w_emulator_wo_project(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIsInstance(client._connection.credentials, AnonymousCredentials) + # avoids authentication if storage emulator is set through api_endpoint + client = self._make_one( + client_options={"api_endpoint": "http://localhost:8080"} + ) + self.assertIsNone(client.project) + self.assertEqual(client._connection.API_BASE_URL, host) + self.assertIsInstance(client._connection.credentials, AnonymousCredentials) + def test_ctor_w_emulator_w_environ_project(self): - # bypasses authentication and infers the project from the environment + # avoids authentication and infers the project from the environment host = "http://localhost:8080" environ_project = "environ-project" environ = { @@ -308,17 +289,9 @@ def test_ctor_w_emulator_w_project_arg(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - def test_ctor_w_emulator_w_credentials(self): - host = "http://localhost:8080" - environ = {STORAGE_EMULATOR_ENV_VAR: host} - credentials = _make_credentials() - with mock.patch("os.environ", environ): - client = self._make_one(credentials=credentials) - - self.assertEqual(client._connection.API_BASE_URL, host) - self.assertIs(client._connection.credentials, credentials) - def test_create_anonymous_client(self): + from google.cloud.storage._http import Connection + klass = self._get_target_class() client = klass.create_anonymous_client() From 9998a5e1c9e9e8920c4d40e13e39095585de657a Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 6 Dec 2022 15:21:15 -0800 Subject: [PATCH 123/509] feat: Add "transfer_manager" module for concurrent uploads and downloads, as a preview feature (#943) * checkpoint before design doc impl * checkpoint * more tests * code and tests for transfer manager complete * proactively close temp files when finished reading * respond to comments; destroy tmp files as they are consumed * Add system tests, docstrings, address feedback * Respond to review comments * verify md5 hash of downloaded file in test * lint * default empty strings for root arguments * fix bug with blob constructor * add warning about files not being deleted if their downloads fail * docs: Add samples to multithread branch (#918) * add samples, tests pending * add snippet tests * snippet and snippets_test.py linting * snippets; recursive directory creation; rename some params * Add directory upload snippet * fix: remove chunked downloads; change max_workers to threads * update snippets to add thread info * fix snippets test issue due to change in dependency * snippet nomenclature * fix samples for real this time --- google/cloud/storage/constants.py | 1 + google/cloud/storage/fileio.py | 6 +- google/cloud/storage/transfer_manager.py | 501 +++++++++++++++++++ samples/snippets/snippets_test.py | 118 ++++- samples/snippets/storage_transfer_manager.py | 184 +++++++ tests/system/test_transfer_manager.py | 84 ++++ tests/unit/test_transfer_manager.py | 335 +++++++++++++ 7 files changed, 1210 insertions(+), 19 deletions(-) create mode 100644 google/cloud/storage/transfer_manager.py create mode 100644 samples/snippets/storage_transfer_manager.py create mode 100644 tests/system/test_transfer_manager.py create mode 100644 tests/unit/test_transfer_manager.py diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index babbc5a42..5d6497295 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + """Constants used across google.cloud.storage modules.""" # Storage classes diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index d3ae135bb..d09a3c885 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Support for file-like I/O.""" +"""Module for file-like access of blobs, usually invoked via Blob.open().""" import io import warnings @@ -101,10 +101,12 @@ class BlobReader(io.BufferedIOBase): - ``if_metageneration_match`` - ``if_metageneration_not_match`` - ``timeout`` + + Note that download_kwargs are also applied to blob.reload(), if a reload + is needed during seek(). """ def __init__(self, blob, chunk_size=None, retry=DEFAULT_RETRY, **download_kwargs): - """docstring note that download_kwargs also used for reload()""" for kwarg in download_kwargs: if kwarg not in VALID_DOWNLOAD_KWARGS: raise ValueError( diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py new file mode 100644 index 000000000..e87f0cc76 --- /dev/null +++ b/google/cloud/storage/transfer_manager.py @@ -0,0 +1,501 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Concurrent media operations. This is a PREVIEW FEATURE: API may change.""" + +import concurrent.futures + +import os +import warnings + +from google.api_core import exceptions + +warnings.warn( + "The module `transfer_manager` is a preview feature. Functionality and API " + "may change. This warning will be removed in a future release." +) + + +DEFAULT_CHUNK_SIZE = 200 * 1024 * 1024 + + +def upload_many( + file_blob_pairs, + skip_if_exists=False, + upload_kwargs=None, + threads=4, + deadline=None, + raise_exception=False, +): + """Upload many files concurrently via a worker pool. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + :type file_blob_pairs: List(Tuple(IOBase or str, 'google.cloud.storage.blob.Blob')) + :param file_blob_pairs: + A list of tuples of a file or filename and a blob. Each file will be + uploaded to the corresponding blob by using blob.upload_from_file() or + blob.upload_from_filename() as appropriate. + + :type skip_if_exists: bool + :param skip_if_exists: + If True, blobs that already have a live version will not be overwritten. + This is accomplished by setting "if_generation_match = 0" on uploads. + Uploads so skipped will result in a 412 Precondition Failed response + code, which will be included in the return value but not raised + as an exception regardless of the value of raise_exception. + + :type upload_kwargs: dict + :param upload_kwargs: + A dictionary of keyword arguments to pass to the upload method. Refer + to the documentation for blob.upload_from_file() or + blob.upload_from_filename() for more information. The dict is directly + passed into the upload methods and is not validated by this function. + + :type threads: int + :param threads: + The number of threads to use in the worker pool. This is passed to + `concurrent.futures.ThreadPoolExecutor` as the `max_worker`; refer + to standard library documentation for details. + + The performance impact of this value depends on the use case, but + generally, smaller files benefit from more threads and larger files + don't benefit from more threads. Too many threads can slow operations, + especially with large files, due to contention over the Python GIL. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. + + If skip_if_exists is True, 412 Precondition Failed responses are + considered part of normal operation and are not raised as an exception. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + upload method is used (typically, None). + """ + if upload_kwargs is None: + upload_kwargs = {} + if skip_if_exists: + upload_kwargs["if_generation_match"] = 0 + + with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor: + futures = [] + for path_or_file, blob in file_blob_pairs: + method = ( + blob.upload_from_filename + if isinstance(path_or_file, str) + else blob.upload_from_file + ) + futures.append(executor.submit(method, path_or_file, **upload_kwargs)) + results = [] + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + for future in futures: + exp = future.exception() + + # If raise_exception is False, don't call future.result() + if exp and not raise_exception: + results.append(exp) + # If skip_if_exists and the exception is PreconditionFailed, do same. + elif exp and skip_if_exists and isinstance(exp, exceptions.PreconditionFailed): + results.append(exp) + # Get the real result. If there was an exception not handled above, + # this will raise it. + else: + results.append(future.result()) + return results + + +def download_many( + blob_file_pairs, + download_kwargs=None, + threads=4, + deadline=None, + raise_exception=False, +): + """Download many blobs concurrently via a worker pool. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + :type blob_file_pairs: List(Tuple('google.cloud.storage.blob.Blob', IOBase or str)) + :param blob_file_pairs: + A list of tuples of blob and a file or filename. Each blob will be + downloaded to the corresponding blob by using blob.download_to_file() or + blob.download_to_filename() as appropriate. + + Note that blob.download_to_filename() does not delete the destination + file if the download fails. + + :type download_kwargs: dict + :param download_kwargs: + A dictionary of keyword arguments to pass to the download method. Refer + to the documentation for blob.download_to_file() or + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. + + :type threads: int + :param threads: + The number of threads to use in the worker pool. This is passed to + `concurrent.futures.ThreadPoolExecutor` as the `max_worker`; refer + to standard library documentation for details. + + The performance impact of this value depends on the use case, but + generally, smaller files benefit from more threads and larger files + don't benefit from more threads. Too many threads can slow operations, + especially with large files, due to contention over the Python GIL. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + download method is used (typically, None). + """ + + if download_kwargs is None: + download_kwargs = {} + with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor: + futures = [] + for blob, path_or_file in blob_file_pairs: + method = ( + blob.download_to_filename + if isinstance(path_or_file, str) + else blob.download_to_file + ) + futures.append(executor.submit(method, path_or_file, **download_kwargs)) + results = [] + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + for future in futures: + if not raise_exception: + exp = future.exception() + if exp: + results.append(exp) + continue + results.append(future.result()) + return results + + +def upload_many_from_filenames( + bucket, + filenames, + source_directory="", + blob_name_prefix="", + skip_if_exists=False, + blob_constructor_kwargs=None, + upload_kwargs=None, + threads=4, + deadline=None, + raise_exception=False, +): + """Upload many files concurrently by their filenames. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + The destination blobs are automatically created, with blob names based on + the source filenames and the blob_name_prefix. + + For example, if the `filenames` include "images/icon.jpg", + `source_directory` is "/home/myuser/", and `blob_name_prefix` is "myfiles/", + then the file at "/home/myuser/images/icon.jpg" will be uploaded to a blob + named "myfiles/images/icon.jpg". + + :type bucket: 'google.cloud.storage.bucket.Bucket' + :param bucket: + The bucket which will contain the uploaded blobs. + + :type filenames: list(str) + :param filenames: + A list of filenames to be uploaded. This may include part of the path. + The full path to the file must be source_directory + filename. + + :type source_directory: str + :param source_directory: + A string that will be prepended (with os.path.join()) to each filename + in the input list, in order to find the source file for each blob. + Unlike the filename itself, the source_directory does not affect the + name of the uploaded blob. + + For instance, if the source_directory is "/tmp/img/" and a filename is + "0001.jpg", with an empty blob_name_prefix, then the file uploaded will + be "/tmp/img/0001.jpg" and the destination blob will be "0001.jpg". + + This parameter can be an empty string. + + Note that this parameter allows directory traversal (e.g. "/", "../") + and is not intended for unsanitized end user input. + + :type blob_name_prefix: str + :param blob_name_prefix: + A string that will be prepended to each filename in the input list, in + order to determine the name of the destination blob. Unlike the filename + itself, the prefix string does not affect the location the library will + look for the source data on the local filesystem. + + For instance, if the source_directory is "/tmp/img/", the + blob_name_prefix is "myuser/mystuff-" and a filename is "0001.jpg" then + the file uploaded will be "/tmp/img/0001.jpg" and the destination blob + will be "myuser/mystuff-0001.jpg". + + The blob_name_prefix can be blank (an empty string). + + :type skip_if_exists: bool + :param skip_if_exists: + If True, blobs that already have a live version will not be overwritten. + This is accomplished by setting "if_generation_match = 0" on uploads. + Uploads so skipped will result in a 412 Precondition Failed response + code, which will be included in the return value, but not raised + as an exception regardless of the value of raise_exception. + + :type blob_constructor_kwargs: dict + :param blob_constructor_kwargs: + A dictionary of keyword arguments to pass to the blob constructor. Refer + to the documentation for blob.Blob() for more information. The dict is + directly passed into the constructor and is not validated by this + function. `name` and `bucket` keyword arguments are reserved by this + function and will result in an error if passed in here. + + :type upload_kwargs: dict + :param upload_kwargs: + A dictionary of keyword arguments to pass to the upload method. Refer + to the documentation for blob.upload_from_file() or + blob.upload_from_filename() for more information. The dict is directly + passed into the upload methods and is not validated by this function. + + :type threads: int + :param threads: + The number of threads to use in the worker pool. This is passed to + `concurrent.futures.ThreadPoolExecutor` as the `max_worker`; refer + to standard library documentation for details. + + The performance impact of this value depends on the use case, but + generally, smaller files benefit from more threads and larger files + don't benefit from more threads. Too many threads can slow operations, + especially with large files, due to contention over the Python GIL. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. + + If skip_if_exists is True, 412 Precondition Failed responses are + considered part of normal operation and are not raised as an exception. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + upload method is used (typically, None). + """ + if blob_constructor_kwargs is None: + blob_constructor_kwargs = {} + + file_blob_pairs = [] + + for filename in filenames: + path = os.path.join(source_directory, filename) + blob_name = blob_name_prefix + filename + blob = bucket.blob(blob_name, **blob_constructor_kwargs) + file_blob_pairs.append((path, blob)) + + return upload_many( + file_blob_pairs, + skip_if_exists=skip_if_exists, + upload_kwargs=upload_kwargs, + threads=threads, + deadline=deadline, + raise_exception=raise_exception, + ) + + +def download_many_to_path( + bucket, + blob_names, + destination_directory="", + blob_name_prefix="", + download_kwargs=None, + threads=4, + deadline=None, + create_directories=True, + raise_exception=False, +): + """Download many files concurrently by their blob names. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + The destination files are automatically created, with paths based on the + source blob_names and the destination_directory. + + The destination files are not automatically deleted if their downloads fail, + so please check the return value of this function for any exceptions, or + enable `raise_exception=True`, and process the files accordingly. + + For example, if the `blob_names` include "icon.jpg", `destination_directory` + is "/home/myuser/", and `blob_name_prefix` is "images/", then the blob named + "images/icon.jpg" will be downloaded to a file named + "/home/myuser/icon.jpg". + + :type bucket: 'google.cloud.storage.bucket.Bucket' + :param bucket: + The bucket which contains the blobs to be downloaded + + :type blob_names: list(str) + :param blob_names: + A list of blobs to be downloaded. The blob name in this string will be + used to determine the destination file path as well. + + The full name to the blob must be blob_name_prefix + blob_name. The + blob_name is separate from the blob_name_prefix because the blob_name + will also determine the name of the destination blob. Any shared part of + the blob names that need not be part of the destination path should be + included in the blob_name_prefix. + + :type destination_directory: str + :param destination_directory: + A string that will be prepended (with os.path.join()) to each blob_name + in the input list, in order to determine the destination path for that + blob. + + For instance, if the destination_directory string is "/tmp/img" and a + blob_name is "0001.jpg", with an empty blob_name_prefix, then the source + blob "0001.jpg" will be downloaded to destination "/tmp/img/0001.jpg" . + + This parameter can be an empty string. + + Note that this parameter allows directory traversal (e.g. "/", "../") + and is not intended for unsanitized end user input. + + :type blob_name_prefix: str + :param blob_name_prefix: + A string that will be prepended to each blob_name in the input list, in + order to determine the name of the source blob. Unlike the blob_name + itself, the prefix string does not affect the destination path on the + local filesystem. For instance, if the destination_directory is + "/tmp/img/", the blob_name_prefix is "myuser/mystuff-" and a blob_name + is "0001.jpg" then the source blob "myuser/mystuff-0001.jpg" will be + downloaded to "/tmp/img/0001.jpg". The blob_name_prefix can be blank + (an empty string). + + :type download_kwargs: dict + :param download_kwargs: + A dictionary of keyword arguments to pass to the download method. Refer + to the documentation for blob.download_to_file() or + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. + + :type threads: int + :param threads: + The number of threads to use in the worker pool. This is passed to + `concurrent.futures.ThreadPoolExecutor` as the `max_worker` param; refer + to standard library documentation for details. + + The performance impact of this value depends on the use case, but + generally, smaller files benefit from more threads and larger files + don't benefit from more threads. Too many threads can slow operations, + especially with large files, due to contention over the Python GIL. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type create_directories: bool + :param create_directories: + If True, recursively create any directories that do not exist. For + instance, if downloading object "images/img001.png", create the + directory "images" before downloading. + + :type raise_exception: bool + :param raise_exception: + If True, instead of adding exceptions to the list of return values, + instead they will be raised. Note that encountering an exception on one + operation will not prevent other operations from starting. Exceptions + are only processed and potentially raised after all operations are + complete in success or failure. If skip_if_exists is True, 412 + Precondition Failed responses are considered part of normal operation + and are not raised as an exception. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + + :rtype: list + :returns: A list of results corresponding to, in order, each item in the + input list. If an exception was received, it will be the result + for that operation. Otherwise, the return value from the successful + download method is used (typically, None). + """ + blob_file_pairs = [] + + for blob_name in blob_names: + full_blob_name = blob_name_prefix + blob_name + path = os.path.join(destination_directory, blob_name) + if create_directories: + directory, _ = os.path.split(path) + os.makedirs(directory, exist_ok=True) + blob_file_pairs.append((bucket.blob(full_blob_name), path)) + + return download_many( + blob_file_pairs, + download_kwargs=download_kwargs, + threads=threads, + deadline=deadline, + raise_exception=raise_exception, + ) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 9370ecbdd..4ad0dc1a0 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -72,6 +72,7 @@ import storage_set_bucket_default_kms_key import storage_set_client_endpoint import storage_set_metadata +import storage_transfer_manager import storage_upload_file import storage_upload_from_memory import storage_upload_from_stream @@ -124,8 +125,8 @@ def test_bucket(): def test_public_bucket(): # The new projects don't allow to make a bucket available to public, so # for some tests we need to use the old main project for now. - original_value = os.environ['GOOGLE_CLOUD_PROJECT'] - os.environ['GOOGLE_CLOUD_PROJECT'] = os.environ['MAIN_GOOGLE_CLOUD_PROJECT'] + original_value = os.environ["GOOGLE_CLOUD_PROJECT"] + os.environ["GOOGLE_CLOUD_PROJECT"] = os.environ["MAIN_GOOGLE_CLOUD_PROJECT"] bucket = None while bucket is None or bucket.exists(): storage_client = storage.Client() @@ -135,7 +136,7 @@ def test_public_bucket(): yield bucket bucket.delete(force=True) # Set the value back. - os.environ['GOOGLE_CLOUD_PROJECT'] = original_value + os.environ["GOOGLE_CLOUD_PROJECT"] = original_value @pytest.fixture(scope="module") @@ -255,7 +256,7 @@ def test_download_byte_range(test_blob): storage_download_byte_range.download_byte_range( test_blob.bucket.name, test_blob.name, 0, 4, dest_file.name ) - assert dest_file.read() == b'Hello' + assert dest_file.read() == b"Hello" def test_download_blob(test_blob): @@ -308,7 +309,8 @@ def test_delete_blob(test_blob): def test_make_blob_public(test_public_blob): storage_make_public.make_blob_public( - test_public_blob.bucket.name, test_public_blob.name) + test_public_blob.bucket.name, test_public_blob.name + ) r = requests.get(test_public_blob.public_url) assert r.text == "Hello, is it me you're looking for?" @@ -340,7 +342,9 @@ def test_generate_upload_signed_url_v4(test_bucket, capsys): ) requests.put( - url, data=content, headers={"content-type": "application/octet-stream"}, + url, + data=content, + headers={"content-type": "application/octet-stream"}, ) bucket = storage.Client().bucket(test_bucket.name) @@ -447,16 +451,20 @@ def test_get_set_autoclass(new_bucket_obj, test_bucket, capsys): def test_bucket_lifecycle_management(test_bucket, capsys): - bucket = storage_enable_bucket_lifecycle_management.enable_bucket_lifecycle_management( - test_bucket + bucket = ( + storage_enable_bucket_lifecycle_management.enable_bucket_lifecycle_management( + test_bucket + ) ) out, _ = capsys.readouterr() assert "[]" in out assert "Lifecycle management is enable" in out assert len(list(bucket.lifecycle_rules)) > 0 - bucket = storage_disable_bucket_lifecycle_management.disable_bucket_lifecycle_management( - test_bucket + bucket = ( + storage_disable_bucket_lifecycle_management.disable_bucket_lifecycle_management( + test_bucket + ) ) out, _ = capsys.readouterr() assert "[]" in out @@ -512,7 +520,8 @@ def test_get_service_account(capsys): def test_download_public_file(test_public_blob): storage_make_public.make_blob_public( - test_public_blob.bucket.name, test_public_blob.name) + test_public_blob.bucket.name, test_public_blob.name + ) with tempfile.NamedTemporaryFile() as dest_file: storage_download_public_file.download_public_file( test_public_blob.bucket.name, test_public_blob.name, dest_file.name @@ -522,8 +531,10 @@ def test_download_public_file(test_public_blob): def test_define_bucket_website_configuration(test_bucket): - bucket = storage_define_bucket_website_configuration.define_bucket_website_configuration( - test_bucket.name, "index.html", "404.html" + bucket = ( + storage_define_bucket_website_configuration.define_bucket_website_configuration( + test_bucket.name, "index.html", "404.html" + ) ) website_val = {"mainPageSuffix": "index.html", "notFoundPage": "404.html"} @@ -586,7 +597,7 @@ def test_change_default_storage_class(test_bucket, capsys): ) out, _ = capsys.readouterr() assert "Default storage class for bucket" in out - assert bucket.storage_class == 'COLDLINE' + assert bucket.storage_class == "COLDLINE" def test_change_file_storage_class(test_blob, capsys): @@ -595,7 +606,7 @@ def test_change_file_storage_class(test_blob, capsys): ) out, _ = capsys.readouterr() assert f"Blob {blob.name} in bucket {blob.bucket.name}" in out - assert blob.storage_class == 'NEARLINE' + assert blob.storage_class == "NEARLINE" def test_copy_file_archived_generation(test_blob): @@ -629,7 +640,8 @@ def test_storage_configure_retries(test_blob, capsys): out, _ = capsys.readouterr() assert "The following library method is customized to be retried" in out assert "_should_retry" in out - assert "initial=1.5, maximum=45.0, multiplier=1.2, deadline=500.0" in out + assert "initial=1.5, maximum=45.0, multiplier=1.2" in out + assert "500" in out # "deadline" or "timeout" depending on dependency ver. def test_batch_request(test_bucket): @@ -647,7 +659,79 @@ def test_batch_request(test_bucket): def test_storage_set_client_endpoint(capsys): - storage_set_client_endpoint.set_client_endpoint('https://storage.googleapis.com') + storage_set_client_endpoint.set_client_endpoint("https://storage.googleapis.com") out, _ = capsys.readouterr() assert "client initiated with endpoint: https://storage.googleapis.com" in out + + +def test_transfer_manager_snippets(test_bucket, capsys): + BLOB_NAMES = [ + "test.txt", + "test2.txt", + "blobs/test.txt", + "blobs/nesteddir/test.txt", + ] + + with tempfile.TemporaryDirectory() as uploads: + # Create dirs and nested dirs + for name in BLOB_NAMES: + relpath = os.path.dirname(name) + os.makedirs(os.path.join(uploads, relpath), exist_ok=True) + + # Create files with nested dirs to exercise directory handling. + for name in BLOB_NAMES: + with open(os.path.join(uploads, name), "w") as f: + f.write(name) + + storage_transfer_manager.upload_many_blobs_with_transfer_manager( + test_bucket.name, + BLOB_NAMES, + source_directory="{}/".format(uploads), + threads=2, + ) + out, _ = capsys.readouterr() + + for name in BLOB_NAMES: + assert "Uploaded {}".format(name) in out + + with tempfile.TemporaryDirectory() as downloads: + # Download the files. + storage_transfer_manager.download_all_blobs_with_transfer_manager( + test_bucket.name, + destination_directory=os.path.join(downloads, ""), + threads=2, + ) + out, _ = capsys.readouterr() + + for name in BLOB_NAMES: + assert "Downloaded {}".format(name) in out + + +def test_transfer_manager_directory_upload(test_bucket, capsys): + BLOB_NAMES = [ + "dirtest/test.txt", + "dirtest/test2.txt", + "dirtest/blobs/test.txt", + "dirtest/blobs/nesteddir/test.txt", + ] + + with tempfile.TemporaryDirectory() as uploads: + # Create dirs and nested dirs + for name in BLOB_NAMES: + relpath = os.path.dirname(name) + os.makedirs(os.path.join(uploads, relpath), exist_ok=True) + + # Create files with nested dirs to exercise directory handling. + for name in BLOB_NAMES: + with open(os.path.join(uploads, name), "w") as f: + f.write(name) + + storage_transfer_manager.upload_directory_with_transfer_manager( + test_bucket.name, source_directory="{}/".format(uploads) + ) + out, _ = capsys.readouterr() + + assert "Found {}".format(len(BLOB_NAMES)) in out + for name in BLOB_NAMES: + assert "Uploaded {}".format(name) in out diff --git a/samples/snippets/storage_transfer_manager.py b/samples/snippets/storage_transfer_manager.py new file mode 100644 index 000000000..0a02b96e3 --- /dev/null +++ b/samples/snippets/storage_transfer_manager.py @@ -0,0 +1,184 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def upload_many_blobs_with_transfer_manager( + bucket_name, filenames, source_directory="", threads=4 +): + """Upload every file in a list to a bucket, concurrently in a thread pool. + + Each blob name is derived from the filename, not including the + `source_directory` parameter. For complete control of the blob name for each + file (and other aspects of individual blob metadata), use + transfer_manager.upload_many() instead. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # A list (or other iterable) of filenames to upload. + # filenames = ["file_1.txt", "file_2.txt"] + + # The directory on your computer that is the root of all of the files in the + # list of filenames. This string is prepended (with os.path.join()) to each + # filename to get the full path to the file. Relative paths and absolute + # paths are both accepted. This string is not included in the name of the + # uploaded blob; it is only used to find the source files. An empty string + # means "the current working directory". Note that this parameter allows + # directory traversal (e.g. "/", "../") and is not intended for unsanitized + # end user input. + # source_directory="" + + # The number of threads to use for the operation. The performance impact of + # this value depends on the use case, but generally, smaller files benefit + # from more threads and larger files don't benefit from more threads. Too + # many threads can slow operations, especially with large files, due to + # contention over the Python GIL. + # threads=4 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + results = transfer_manager.upload_many_from_filenames( + bucket, filenames, source_directory=source_directory, threads=threads + ) + + for name, result in zip(filenames, results): + # The results list is either `None` or an exception for each filename in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to upload {} due to exception: {}".format(name, result)) + else: + print("Uploaded {} to {}.".format(name, bucket.name)) + + +def upload_directory_with_transfer_manager(bucket_name, source_directory, threads=4): + """Upload every file in a directory, including all files in subdirectories. + + Each blob name is derived from the filename, not including the `directory` + parameter itself. For complete control of the blob name for each file (and + other aspects of individual blob metadata), use + transfer_manager.upload_many() instead. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The directory on your computer to upload. Files in the directory and its + # subdirectories will be uploaded. An empty string means "the current + # working directory". + # source_directory="" + + # The number of threads to use for the operation. The performance impact of + # this value depends on the use case, but generally, smaller files benefit + # from more threads and larger files don't benefit from more threads. Too + # many threads can slow operations, especially with large files, due to + # contention over the Python GIL. + # threads=4 + + from pathlib import Path + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + # Generate a list of paths (in string form) relative to the `directory`. + # This can be done in a single list comprehension, but is expanded into + # multiple lines here for clarity. + + # First, recursively get all files in `directory` as Path objects. + directory_as_path_obj = Path(source_directory) + paths = directory_as_path_obj.rglob("*") + + # Filter so the list only includes files, not directories themselves. + file_paths = [path for path in paths if path.is_file()] + + # These paths are relative to the current working directory. Next, make them + # relative to `directory` + relative_paths = [path.relative_to(source_directory) for path in file_paths] + + # Finally, convert them all to strings. + string_paths = [str(path) for path in relative_paths] + + print("Found {} files.".format(len(string_paths))) + + # Start the upload. + results = transfer_manager.upload_many_from_filenames( + bucket, string_paths, source_directory=source_directory, threads=threads + ) + + for name, result in zip(string_paths, results): + # The results list is either `None` or an exception for each filename in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to upload {} due to exception: {}".format(name, result)) + else: + print("Uploaded {} to {}.".format(name, bucket.name)) + + +def download_all_blobs_with_transfer_manager( + bucket_name, destination_directory="", threads=4 +): + """Download all of the blobs in a bucket, concurrently in a thread pool. + + The filename of each blob once downloaded is derived from the blob name and + the `destination_directory `parameter. For complete control of the filename + of each blob, use transfer_manager.download_many() instead. + + Directories will be created automatically as needed, for instance to + accommodate blob names that include slashes. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The directory on your computer to which to download all of the files. This + # string is prepended (with os.path.join()) to the name of each blob to form + # the full path. Relative paths and absolute paths are both accepted. An + # empty string means "the current working directory". Note that this + # parameter allows accepts directory traversal ("../" etc.) and is not + # intended for unsanitized end user input. + # destination_directory = "" + + # The number of threads to use for the operation. The performance impact of + # this value depends on the use case, but generally, smaller files benefit + # from more threads and larger files don't benefit from more threads. Too + # many threads can slow operations, especially with large files, due to + # contention over the Python GIL. + # threads=4 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + blob_names = [blob.name for blob in bucket.list_blobs()] + + results = transfer_manager.download_many_to_path( + bucket, blob_names, destination_directory=destination_directory, threads=threads + ) + + for name, result in zip(blob_names, results): + # The results list is either `None` or an exception for each blob in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to download {} due to exception: {}".format(name, result)) + else: + print("Downloaded {} to {}.".format(name, destination_directory + name)) diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py new file mode 100644 index 000000000..0b639170d --- /dev/null +++ b/tests/system/test_transfer_manager.py @@ -0,0 +1,84 @@ +# coding=utf-8 +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tempfile + +from google.cloud.storage import transfer_manager + +from google.api_core import exceptions + + +def test_upload_many(shared_bucket, file_data, blobs_to_delete): + FILE_BLOB_PAIRS = [ + (file_data["simple"]["path"], shared_bucket.blob("simple1")), + (file_data["simple"]["path"], shared_bucket.blob("simple2")), + ] + + results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + assert results == [None, None] + + blobs = shared_bucket.list_blobs() + for blob in blobs: + if blob.name.startswith("simple"): + blobs_to_delete.append(blob) + assert len(blobs_to_delete) == 2 + + +def test_upload_many_with_file_objs(shared_bucket, file_data, blobs_to_delete): + FILE_BLOB_PAIRS = [ + (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple1")), + (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple2")), + ] + + results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + assert results == [None, None] + + blobs = shared_bucket.list_blobs() + for blob in blobs: + if blob.name.startswith("simple"): + blobs_to_delete.append(blob) + assert len(blobs_to_delete) == 2 + + +def test_upload_many_skip_if_exists( + listable_bucket, listable_filenames, file_data, blobs_to_delete +): + FILE_BLOB_PAIRS = [ + (file_data["logo"]["path"], listable_bucket.blob(listable_filenames[0])), + (file_data["simple"]["path"], listable_bucket.blob("simple")), + ] + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True + ) + assert isinstance(results[0], exceptions.PreconditionFailed) + assert results[1] is None + + blobs = listable_bucket.list_blobs() + for blob in blobs: + if blob.name.startswith("simple"): + blobs_to_delete.append(blob) + assert len(blobs_to_delete) == 1 + + +def test_download_many(listable_bucket): + blobs = list(listable_bucket.list_blobs()) + tempfiles = [tempfile.TemporaryFile(), tempfile.TemporaryFile()] + BLOB_FILE_PAIRS = zip(blobs[:2], tempfiles) + + results = transfer_manager.download_many(BLOB_FILE_PAIRS) + assert results == [None, None] + for fp in tempfiles: + assert fp.tell() != 0 diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py new file mode 100644 index 000000000..f52d5471b --- /dev/null +++ b/tests/unit/test_transfer_manager.py @@ -0,0 +1,335 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest + +with pytest.warns(UserWarning): + from google.cloud.storage import transfer_manager + +from google.api_core import exceptions + +import os +import tempfile +import unittest +import mock + + +class Test_Transfer_Manager(unittest.TestCase): + def test_upload_many_with_filenames(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + FAKE_CONTENT_TYPE = "text/fake" + UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} + EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + FAKE_RESULT = "nothing to see here" + + for _, blob_mock in FILE_BLOB_PAIRS: + blob_mock.upload_from_filename.return_value = FAKE_RESULT + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS + ) + for (filename, mock_blob) in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.assert_any_call( + filename, **EXPECTED_UPLOAD_KWARGS + ) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_upload_many_with_file_objs(self): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock()), + (tempfile.TemporaryFile(), mock.Mock()), + ] + FAKE_CONTENT_TYPE = "text/fake" + UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} + EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + FAKE_RESULT = "nothing to see here" + + for _, blob_mock in FILE_BLOB_PAIRS: + blob_mock.upload_from_file.return_value = FAKE_RESULT + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS + ) + for (file, mock_blob) in FILE_BLOB_PAIRS: + mock_blob.upload_from_file.assert_any_call(file, **EXPECTED_UPLOAD_KWARGS) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_upload_many_passes_concurrency_options(self): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock()), + (tempfile.TemporaryFile(), mock.Mock()), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch( + "concurrent.futures.ThreadPoolExecutor" + ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + transfer_manager.upload_many( + FILE_BLOB_PAIRS, threads=MAX_WORKERS, deadline=DEADLINE + ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with( + mock.ANY, timeout=DEADLINE, return_when=mock.ANY + ) + + def test_upload_many_suppresses_exceptions(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = ConnectionError() + + results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + for result in results: + self.assertEqual(type(result), ConnectionError) + + def test_upload_many_raises_exceptions(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = ConnectionError() + + with self.assertRaises(ConnectionError): + transfer_manager.upload_many(FILE_BLOB_PAIRS, raise_exception=True) + + def test_upload_many_suppresses_412_with_skip_if_exists(self): + FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = exceptions.PreconditionFailed( + "412" + ) + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True + ) + for result in results: + self.assertEqual(type(result), exceptions.PreconditionFailed) + + def test_download_many_with_filenames(self): + BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] + FAKE_ENCODING = "fake_gzip" + DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} + FAKE_RESULT = "nothing to see here" + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock.download_to_filename.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS + ) + for (mock_blob, file) in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.assert_any_call(file, **DOWNLOAD_KWARGS) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_download_many_with_file_objs(self): + BLOB_FILE_PAIRS = [ + (mock.Mock(), tempfile.TemporaryFile()), + (mock.Mock(), tempfile.TemporaryFile()), + ] + FAKE_ENCODING = "fake_gzip" + DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} + FAKE_RESULT = "nothing to see here" + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock.download_to_file.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS + ) + for (mock_blob, file) in BLOB_FILE_PAIRS: + mock_blob.download_to_file.assert_any_call(file, **DOWNLOAD_KWARGS) + for result in results: + self.assertEqual(result, FAKE_RESULT) + + def test_download_many_passes_concurrency_options(self): + BLOB_FILE_PAIRS = [ + (mock.Mock(), tempfile.TemporaryFile()), + (mock.Mock(), tempfile.TemporaryFile()), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch( + "concurrent.futures.ThreadPoolExecutor" + ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + transfer_manager.download_many( + BLOB_FILE_PAIRS, threads=MAX_WORKERS, deadline=DEADLINE + ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with( + mock.ANY, timeout=DEADLINE, return_when=mock.ANY + ) + + def test_download_many_suppresses_exceptions(self): + BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] + for mock_blob, _ in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.side_effect = ConnectionError() + + results = transfer_manager.download_many(BLOB_FILE_PAIRS) + for result in results: + self.assertEqual(type(result), ConnectionError) + + def test_download_many_raises_exceptions(self): + BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] + for mock_blob, _ in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.side_effect = ConnectionError() + + transfer_manager.download_many(BLOB_FILE_PAIRS) + with self.assertRaises(ConnectionError): + transfer_manager.download_many(BLOB_FILE_PAIRS, raise_exception=True) + + def test_upload_many_from_filenames(self): + bucket = mock.Mock() + + FILENAMES = ["file_a.txt", "file_b.txt"] + ROOT = "mypath/" + PREFIX = "myprefix/" + KEY_NAME = "keyname" + BLOB_CONSTRUCTOR_KWARGS = {"kms_key_name": KEY_NAME} + UPLOAD_KWARGS = {"content-type": "text/fake"} + MAX_WORKERS = 7 + DEADLINE = 10 + + EXPECTED_FILE_BLOB_PAIRS = [ + (os.path.join(ROOT, filename), mock.ANY) for filename in FILENAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, + FILENAMES, + source_directory=ROOT, + blob_name_prefix=PREFIX, + skip_if_exists=True, + blob_constructor_kwargs=BLOB_CONSTRUCTOR_KWARGS, + upload_kwargs=UPLOAD_KWARGS, + threads=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=True, + upload_kwargs=UPLOAD_KWARGS, + threads=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + bucket.blob.assert_any_call(PREFIX + FILENAMES[0], **BLOB_CONSTRUCTOR_KWARGS) + bucket.blob.assert_any_call(PREFIX + FILENAMES[1], **BLOB_CONSTRUCTOR_KWARGS) + + def test_upload_many_from_filenames_minimal_args(self): + bucket = mock.Mock() + + FILENAMES = ["file_a.txt", "file_b.txt"] + + EXPECTED_FILE_BLOB_PAIRS = [(filename, mock.ANY) for filename in FILENAMES] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, + FILENAMES, + ) + + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=False, + upload_kwargs=None, + threads=4, + deadline=None, + raise_exception=False, + ) + bucket.blob.assert_any_call(FILENAMES[0]) + bucket.blob.assert_any_call(FILENAMES[1]) + + def test_download_many_to_path(self): + bucket = mock.Mock() + + BLOBNAMES = ["file_a.txt", "file_b.txt", "dir_a/file_c.txt"] + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + + EXPECTED_BLOB_FILE_PAIRS = [ + (mock.ANY, os.path.join(PATH_ROOT, blobname)) for blobname in BLOBNAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.download_many" + ) as mock_download_many: + transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + threads=MAX_WORKERS, + deadline=DEADLINE, + create_directories=False, + raise_exception=True, + ) + + mock_download_many.assert_called_once_with( + EXPECTED_BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + threads=MAX_WORKERS, + deadline=DEADLINE, + raise_exception=True, + ) + for blobname in BLOBNAMES: + bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) + + def test_download_many_to_path_creates_directories(self): + bucket = mock.Mock() + + with tempfile.TemporaryDirectory() as tempdir: + DIR_NAME = "dir_a/dir_b" + BLOBNAMES = [ + "file_a.txt", + "file_b.txt", + os.path.join(DIR_NAME, "file_c.txt"), + ] + + EXPECTED_BLOB_FILE_PAIRS = [ + (mock.ANY, os.path.join(tempdir, blobname)) for blobname in BLOBNAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.download_many" + ) as mock_download_many: + transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=tempdir, + create_directories=True, + raise_exception=True, + ) + + mock_download_many.assert_called_once_with( + EXPECTED_BLOB_FILE_PAIRS, + download_kwargs=None, + threads=4, + deadline=None, + raise_exception=True, + ) + for blobname in BLOBNAMES: + bucket.blob.assert_any_call(blobname) + + assert os.path.isdir(os.path.join(tempdir, DIR_NAME)) From 64406ca70cef98a81f6bb9da6e602196f4235178 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 6 Dec 2022 15:34:50 -0800 Subject: [PATCH 124/509] fix: implement closed property on fileio.py classes (#907) * fix: implement closed property on fileio.py classes * update tests * fix numerous mistakes --- google/cloud/storage/fileio.py | 12 ++++++------ tests/unit/test_fileio.py | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index d09a3c885..639e731ba 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -211,9 +211,9 @@ def seek(self, pos, whence=0): def close(self): self._buffer.close() - def _checkClosed(self): - if self._buffer.closed: - raise ValueError("I/O operation on closed file.") + @property + def closed(self): + return self._buffer.closed def readable(self): return True @@ -431,9 +431,9 @@ def close(self): self._upload_chunks_from_buffer(1) self._buffer.close() - def _checkClosed(self): - if self._buffer.closed: - raise ValueError("I/O operation on closed file.") + @property + def closed(self): + return self._buffer.closed def readable(self): return False diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index 54e113e55..dab272a90 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -287,6 +287,7 @@ def test_close(self): reader = self._make_blob_reader(blob) reader.close() + self.assertTrue(reader.closed) with self.assertRaises(ValueError): reader.read() @@ -415,6 +416,8 @@ def test_close_errors(self): writer.close() # Close a second time to verify it successfully does nothing. writer.close() + + self.assertTrue(writer.closed) # Try to write to closed file. with self.assertRaises(ValueError): writer.write(TEST_BINARY_DATA) @@ -767,6 +770,7 @@ def test_seek(self): def test_close(self): buff = self._make_sliding_buffer() buff.close() + self.assertTrue(buff.closed) with self.assertRaises(ValueError): buff.read() @@ -913,6 +917,7 @@ def test_close(self): reader = self._make_blob_reader(blob) reader.close() + self.assertTrue(reader.closed) with self.assertRaises(ValueError): reader.read() From 5291c08cc76a7dbd853e51c19c944f6336c14d26 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 7 Dec 2022 08:54:30 +0800 Subject: [PATCH 125/509] feat: add use_auth_w_custom_endpoint support (#941) * feat: add support for use_auth_w_custom_endpoint * improve readability w bool _is_emulator_set * update tests Co-authored-by: Andrew Gorcester --- google/cloud/storage/_helpers.py | 13 ++-- google/cloud/storage/client.py | 48 +++++++------ tests/unit/test_client.py | 118 ++++++++++++++++++++++++++----- 3 files changed, 135 insertions(+), 44 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 82bb4230e..29968a9aa 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -33,17 +33,20 @@ STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" """Environment variable defining host for Storage emulator.""" +_API_ENDPOINT_OVERRIDE_ENV_VAR = "API_ENDPOINT_OVERRIDE" +"""This is an experimental configuration variable. Use api_endpoint instead.""" + +_API_VERSION_OVERRIDE_ENV_VAR = "API_VERSION_OVERRIDE" +"""This is an experimental configuration variable used for internal testing.""" + _DEFAULT_STORAGE_HOST = os.getenv( - "API_ENDPOINT_OVERRIDE", "https://storage.googleapis.com" + _API_ENDPOINT_OVERRIDE_ENV_VAR, "https://storage.googleapis.com" ) """Default storage host for JSON API.""" -_API_VERSION = os.getenv("API_VERSION_OVERRIDE", "v1") +_API_VERSION = os.getenv(_API_VERSION_OVERRIDE_ENV_VAR, "v1") """API version of the default storage host""" -_BASE_STORAGE_URI = "storage.googleapis.com" -"""Base request endpoint URI for JSON API.""" - # etag match parameters in snake case and equivalent header _ETAG_MATCH_PARAMETERS = ( ("if_etag_match", "If-Match"), diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 56bfa67cf..f54bf6043 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -34,7 +34,6 @@ from google.cloud.storage._helpers import _get_default_headers from google.cloud.storage._helpers import _get_environ_project from google.cloud.storage._helpers import _get_storage_host -from google.cloud.storage._helpers import _BASE_STORAGE_URI from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _add_etag_match_headers @@ -96,6 +95,12 @@ class Client(ClientWithProject): :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` :param client_options: (Optional) Client options used to set user options on the client. API Endpoint should be set through client_options. + + :type use_auth_w_custom_endpoint: bool + :param use_auth_w_custom_endpoint: + (Optional) Whether authentication is required under custom endpoints. + If false, uses AnonymousCredentials and bypasses authentication. + Defaults to True. Note this is only used when a custom endpoint is set in conjunction. """ SCOPE = ( @@ -112,6 +117,7 @@ def __init__( _http=None, client_info=None, client_options=None, + use_auth_w_custom_endpoint=True, ): self._base_connection = None @@ -127,13 +133,12 @@ def __init__( kw_args = {"client_info": client_info} # `api_endpoint` should be only set by the user via `client_options`, - # or if the _get_storage_host() returns a non-default value. + # or if the _get_storage_host() returns a non-default value (_is_emulator_set). # `api_endpoint` plays an important role for mTLS, if it is not set, # then mTLS logic will be applied to decide which endpoint will be used. storage_host = _get_storage_host() - kw_args["api_endpoint"] = ( - storage_host if storage_host != _DEFAULT_STORAGE_HOST else None - ) + _is_emulator_set = storage_host != _DEFAULT_STORAGE_HOST + kw_args["api_endpoint"] = storage_host if _is_emulator_set else None if client_options: if type(client_options) == dict: @@ -144,19 +149,20 @@ def __init__( api_endpoint = client_options.api_endpoint kw_args["api_endpoint"] = api_endpoint - # Use anonymous credentials and no project when - # STORAGE_EMULATOR_HOST or a non-default api_endpoint is set. - if ( - kw_args["api_endpoint"] is not None - and _BASE_STORAGE_URI not in kw_args["api_endpoint"] - ): - if credentials is None: - credentials = AnonymousCredentials() - if project is None: - project = _get_environ_project() - if project is None: - no_project = True - project = "" + # If a custom endpoint is set, the client checks for credentials + # or finds the default credentials based on the current environment. + # Authentication may be bypassed under certain conditions: + # (1) STORAGE_EMULATOR_HOST is set (for backwards compatibility), OR + # (2) use_auth_w_custom_endpoint is set to False. + if kw_args["api_endpoint"] is not None: + if _is_emulator_set or not use_auth_w_custom_endpoint: + if credentials is None: + credentials = AnonymousCredentials() + if project is None: + project = _get_environ_project() + if project is None: + no_project = True + project = "" super(Client, self).__init__( project=project, @@ -897,7 +903,8 @@ def create_bucket( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - if _BASE_STORAGE_URI not in _get_storage_host(): + _is_emulator_set = _get_storage_host() != _DEFAULT_STORAGE_HOST + if _is_emulator_set: if project is None: project = _get_environ_project() if project is None: @@ -1327,7 +1334,8 @@ def list_buckets( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - if _BASE_STORAGE_URI not in _get_storage_host(): + _is_emulator_set = _get_storage_host() != _DEFAULT_STORAGE_HOST + if _is_emulator_set: if project is None: project = _get_environ_project() if project is None: diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index c100d35b0..0b5af95d6 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -28,9 +28,10 @@ from google.auth.credentials import AnonymousCredentials from google.oauth2.service_account import Credentials +from google.cloud.storage import _helpers from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR from google.cloud.storage._helpers import _get_default_headers -from google.cloud.storage import _helpers +from google.cloud.storage._http import Connection from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST @@ -119,7 +120,6 @@ def _make_one(self, *args, **kw): def test_ctor_connection_type(self): from google.cloud._http import ClientInfo - from google.cloud.storage._http import Connection PROJECT = "PROJECT" credentials = _make_credentials() @@ -179,8 +179,6 @@ def test_ctor_w_client_options_object(self): ) def test_ctor_wo_project(self): - from google.cloud.storage._http import Connection - PROJECT = "PROJECT" credentials = _make_credentials(project=PROJECT) @@ -193,8 +191,6 @@ def test_ctor_wo_project(self): self.assertEqual(list(client._batch_stack), []) def test_ctor_w_project_explicit_none(self): - from google.cloud.storage._http import Connection - credentials = _make_credentials() client = self._make_one(project=None, credentials=credentials) @@ -207,7 +203,6 @@ def test_ctor_w_project_explicit_none(self): def test_ctor_w_client_info(self): from google.cloud._http import ClientInfo - from google.cloud.storage._http import Connection credentials = _make_credentials() client_info = ClientInfo() @@ -239,8 +234,40 @@ def test_ctor_mtls(self): self.assertEqual(client._connection.ALLOW_AUTO_SWITCH_TO_MTLS_URL, False) self.assertEqual(client._connection.API_BASE_URL, "http://foo") + def test_ctor_w_custom_endpoint_use_auth(self): + custom_endpoint = "storage-example.p.googleapis.com" + client = self._make_one(client_options={"api_endpoint": custom_endpoint}) + self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) + self.assertIsNotNone(client.project) + self.assertIsInstance(client._connection, Connection) + self.assertIsNotNone(client._connection.credentials) + self.assertNotIsInstance(client._connection.credentials, AnonymousCredentials) + + def test_ctor_w_custom_endpoint_bypass_auth(self): + custom_endpoint = "storage-example.p.googleapis.com" + client = self._make_one( + client_options={"api_endpoint": custom_endpoint}, + use_auth_w_custom_endpoint=False, + ) + self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) + self.assertEqual(client.project, None) + self.assertIsInstance(client._connection, Connection) + self.assertIsInstance(client._connection.credentials, AnonymousCredentials) + + def test_ctor_w_custom_endpoint_w_credentials(self): + PROJECT = "PROJECT" + custom_endpoint = "storage-example.p.googleapis.com" + credentials = _make_credentials(project=PROJECT) + client = self._make_one( + credentials=credentials, client_options={"api_endpoint": custom_endpoint} + ) + self.assertEqual(client._connection.API_BASE_URL, custom_endpoint) + self.assertEqual(client.project, PROJECT) + self.assertIsInstance(client._connection, Connection) + self.assertIs(client._connection.credentials, credentials) + def test_ctor_w_emulator_wo_project(self): - # avoids authentication if STORAGE_EMULATOR_ENV_VAR is set + # bypasses authentication if STORAGE_EMULATOR_ENV_VAR is set host = "http://localhost:8080" environ = {STORAGE_EMULATOR_ENV_VAR: host} with mock.patch("os.environ", environ): @@ -250,16 +277,8 @@ def test_ctor_w_emulator_wo_project(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - # avoids authentication if storage emulator is set through api_endpoint - client = self._make_one( - client_options={"api_endpoint": "http://localhost:8080"} - ) - self.assertIsNone(client.project) - self.assertEqual(client._connection.API_BASE_URL, host) - self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - def test_ctor_w_emulator_w_environ_project(self): - # avoids authentication and infers the project from the environment + # bypasses authentication and infers the project from the environment host = "http://localhost:8080" environ_project = "environ-project" environ = { @@ -289,9 +308,17 @@ def test_ctor_w_emulator_w_project_arg(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIsInstance(client._connection.credentials, AnonymousCredentials) - def test_create_anonymous_client(self): - from google.cloud.storage._http import Connection + def test_ctor_w_emulator_w_credentials(self): + host = "http://localhost:8080" + environ = {STORAGE_EMULATOR_ENV_VAR: host} + credentials = _make_credentials() + with mock.patch("os.environ", environ): + client = self._make_one(credentials=credentials) + self.assertEqual(client._connection.API_BASE_URL, host) + self.assertIs(client._connection.credentials, credentials) + + def test_create_anonymous_client(self): klass = self._get_target_class() client = klass.create_anonymous_client() @@ -1269,6 +1296,28 @@ def test_create_bucket_w_environ_project_w_emulator(self): _target_object=bucket, ) + def test_create_bucket_w_custom_endpoint(self): + custom_endpoint = "storage-example.p.googleapis.com" + client = self._make_one(client_options={"api_endpoint": custom_endpoint}) + bucket_name = "bucket-name" + api_response = {"name": bucket_name} + client._post_resource = mock.Mock() + client._post_resource.return_value = api_response + + bucket = client.create_bucket(bucket_name) + + expected_path = "/b" + expected_data = api_response + expected_query_params = {"project": client.project} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=bucket, + ) + def test_create_bucket_w_conflict_w_user_project(self): from google.cloud.exceptions import Conflict @@ -2055,6 +2104,37 @@ def test_list_buckets_w_environ_project_w_emulator(self): retry=DEFAULT_RETRY, ) + def test_list_buckets_w_custom_endpoint(self): + from google.cloud.storage.client import _item_to_bucket + + custom_endpoint = "storage-example.p.googleapis.com" + client = self._make_one(client_options={"api_endpoint": custom_endpoint}) + client._list_resource = mock.Mock(spec=[]) + + iterator = client.list_buckets() + + self.assertIs(iterator, client._list_resource.return_value) + + expected_path = "/b" + expected_item_to_value = _item_to_bucket + expected_page_token = None + expected_max_results = None + expected_page_size = None + expected_extra_params = { + "project": client.project, + "projection": "noAcl", + } + client._list_resource.assert_called_once_with( + expected_path, + expected_item_to_value, + page_token=expected_page_token, + max_results=expected_max_results, + extra_params=expected_extra_params, + page_size=expected_page_size, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + ) + def test_list_buckets_w_defaults(self): from google.cloud.storage.client import _item_to_bucket From a436e3ae481187faa6796cdcd6eca1a6f17e150f Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 17:14:53 -0800 Subject: [PATCH 126/509] chore(main): release 2.7.0 (#919) * chore(main): release 2.7.0 * remove reverted pr from changelog Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Andrew Gorcester --- CHANGELOG.md | 13 +++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5100dc3da..383ddfed2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.7.0](https://github.com/googleapis/python-storage/compare/v2.6.0...v2.7.0) (2022-12-07) + + +### Features + +* Add "transfer_manager" module for concurrent uploads and downloads, as a preview feature ([#943](https://github.com/googleapis/python-storage/issues/943)) ([9998a5e](https://github.com/googleapis/python-storage/commit/9998a5e1c9e9e8920c4d40e13e39095585de657a)) +* Add use_auth_w_custom_endpoint support ([#941](https://github.com/googleapis/python-storage/issues/941)) ([5291c08](https://github.com/googleapis/python-storage/commit/5291c08cc76a7dbd853e51c19c944f6336c14d26)) + + +### Bug Fixes + +* Implement closed property on fileio.py classes ([#907](https://github.com/googleapis/python-storage/issues/907)) ([64406ca](https://github.com/googleapis/python-storage/commit/64406ca70cef98a81f6bb9da6e602196f4235178)) + ## [2.6.0](https://github.com/googleapis/python-storage/compare/v2.5.0...v2.6.0) (2022-11-07) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index ae34a9fbe..d962613e0 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.6.0" +__version__ = "2.7.0" From 21cba63136d2d7cf4ffa83752689f7a22aff29d1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 7 Dec 2022 06:25:12 +0100 Subject: [PATCH 127/509] chore(deps): update dependency google-cloud-storage to v2.7.0 (#944) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index d5554b4d9..1dee3070e 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.13.11 -google-cloud-storage==2.6.0 +google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.2; python_version >= '3.8' From 3e4ea84163a6160703d219bea99e46b1e3965722 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:22:21 -0500 Subject: [PATCH 128/509] build(deps): bump certifi from 2022.9.24 to 2022.12.7 in /synthtool/gcp/templates/python_library/.kokoro (#945) Source-Link: https://github.com/googleapis/synthtool/commit/b4fe62efb5114b6738ad4b13d6f654f2bf4b7cc0 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:3bf87e47c2173d7eed42714589dc4da2c07c3268610f1e47f8e1a30decbfc7f1 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 6 +++--- .pre-commit-config.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index bb21147e4..fccaa8e84 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:3abfa0f1886adaf0b83f07cb117b24a639ea1cb9cffe56d43280b977033563eb + digest: sha256:3bf87e47c2173d7eed42714589dc4da2c07c3268610f1e47f8e1a30decbfc7f1 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 9c1b9be34..05dc4672e 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.2.0 \ --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db # via google-auth -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 46d237160..5405cc8ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,7 @@ repos: rev: 22.3.0 hooks: - id: black -- repo: https://gitlab.com/pycqa/flake8 +- repo: https://github.com/pycqa/flake8 rev: 3.9.2 hooks: - id: flake8 From 125578ecd6f9c010e63b7cbe74a5d961fc9e1d0b Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 15 Dec 2022 11:46:37 -0800 Subject: [PATCH 129/509] test: Validate download without encryption key fails (#890) Co-authored-by: Anthonios Partheniou --- tests/system/test_blob.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 37e454737..2d6a76b80 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -117,6 +117,11 @@ def test_large_file_write_from_stream_w_encryption_key( _check_blob_hash(blob, info) + blob_without_key = shared_bucket.blob("LargeFile") + with tempfile.TemporaryFile() as tmp: + with pytest.raises(exceptions.BadRequest): + storage_client.download_blob_to_file(blob_without_key, tmp) + with tempfile.NamedTemporaryFile() as temp_f: with open(temp_f.name, "wb") as file_obj: storage_client.download_blob_to_file(blob, file_obj) From d1df44022e3e4aac8dde9b58a38cfe1c8b37b401 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 4 Jan 2023 21:03:03 +0100 Subject: [PATCH 130/509] chore(deps): update dependency mock to v5 (#946) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 4e8a7389f..f3849b859 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.2.0 -mock==4.0.3 +mock==5.0.0 backoff==2.2.1 \ No newline at end of file From 8fb26f439cf28ac4ec7a841db1cd0fd60ea77362 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 4 Jan 2023 14:00:21 -0800 Subject: [PATCH 131/509] docs: add clarifications to read timeout (#873) Clarify timeout definition and usage, especially on read timeout - read timeout is the number of seconds the client will wait for the server to send a response. In most cases, this is the maximum wait time before the server sends the first byte. - connect timeout is the number of seconds to establish a connection to the server Fixes internal b/238779055 --- docs/storage/retry_timeout.rst | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/storage/retry_timeout.rst b/docs/storage/retry_timeout.rst index bc1912658..c9911a3f2 100644 --- a/docs/storage/retry_timeout.rst +++ b/docs/storage/retry_timeout.rst @@ -12,22 +12,27 @@ Configuring Timeouts -------------------- For a number of reasons, methods which invoke API methods may take -longer than expected or desired. By default, such methods all time out -after a default interval, 60.0 seconds. Rather than blocking your application -code for that interval, you may choose to configure explicit timeouts -in your code, using one of three forms: +longer than expected or desired. By default, such methods are applied a +default timeout of 60.0 seconds. -- You can pass a single integer or float which functions as the timeout for the - entire request. E.g.: +The python-storage client uses the timeout mechanics of the underlying +``requests`` HTTP library. The connect timeout is the number of seconds +to establish a connection to the server. The read timeout is the number +of seconds the client will wait for the server to send a response. +In most cases, this is the maximum wait time before the server sends +the first byte. Please refer to the `requests documentation `_ for details. + +You may also choose to configure explicit timeouts in your code, using one of three forms: + +- You can specify a single value for the timeout. The timeout value will be + applied to both the connect and the read timeouts. E.g.: .. code-block:: python bucket = client.get_bucket(BUCKET_NAME, timeout=300.0) # five minutes -- You can also be passed as a two-tuple, ``(connect_timeout, read_timeout)``, - where the ``connect_timeout`` sets the maximum time required to establish - the connection to the server, and the ``read_timeout`` sets the maximum - time to wait for a completed response. E.g.: +- You can also pass a two-tuple, ``(connect_timeout, read_timeout)``, + if you would like to set the values separately. E.g.: .. code-block:: python From 1d384bf931070a1e0ad971eda60effcbe31b90be Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 6 Jan 2023 14:17:45 -0500 Subject: [PATCH 132/509] chore(python): add support for python 3.11 [autoapprove] (#952) * chore(python): add support for python 3.11 Source-Link: https://github.com/googleapis/synthtool/commit/7197a001ffb6d8ce7b0b9b11c280f0c536c1033a Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:c43f1d918bcf817d337aa29ff833439494a158a0831508fda4ec75dc4c0d0320 * add python 3.11 to noxfile * Add python 3.11 to noxfile and contributing doc Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/samples/python3.11/common.cfg | 40 ++++++++++++++++++++ .kokoro/samples/python3.11/continuous.cfg | 6 +++ .kokoro/samples/python3.11/periodic-head.cfg | 11 ++++++ .kokoro/samples/python3.11/periodic.cfg | 6 +++ .kokoro/samples/python3.11/presubmit.cfg | 6 +++ CONTRIBUTING.rst | 4 +- noxfile.py | 2 +- owlbot.py | 1 - samples/snippets/noxfile.py | 2 +- 10 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 .kokoro/samples/python3.11/common.cfg create mode 100644 .kokoro/samples/python3.11/continuous.cfg create mode 100644 .kokoro/samples/python3.11/periodic-head.cfg create mode 100644 .kokoro/samples/python3.11/periodic.cfg create mode 100644 .kokoro/samples/python3.11/presubmit.cfg diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index fccaa8e84..889f77dfa 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:3bf87e47c2173d7eed42714589dc4da2c07c3268610f1e47f8e1a30decbfc7f1 + digest: sha256:c43f1d918bcf817d337aa29ff833439494a158a0831508fda4ec75dc4c0d0320 diff --git a/.kokoro/samples/python3.11/common.cfg b/.kokoro/samples/python3.11/common.cfg new file mode 100644 index 000000000..f9443bb73 --- /dev/null +++ b/.kokoro/samples/python3.11/common.cfg @@ -0,0 +1,40 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Specify which tests to run +env_vars: { + key: "RUN_TESTS_SESSION" + value: "py-3.11" +} + +# Declare build specific Cloud project. +env_vars: { + key: "BUILD_SPECIFIC_GCLOUD_PROJECT" + value: "python-docs-samples-tests-311" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-storage/.kokoro/test-samples.sh" +} + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" +} + +# Download secrets for samples +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-storage/.kokoro/trampoline_v2.sh" \ No newline at end of file diff --git a/.kokoro/samples/python3.11/continuous.cfg b/.kokoro/samples/python3.11/continuous.cfg new file mode 100644 index 000000000..a1c8d9759 --- /dev/null +++ b/.kokoro/samples/python3.11/continuous.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/.kokoro/samples/python3.11/periodic-head.cfg b/.kokoro/samples/python3.11/periodic-head.cfg new file mode 100644 index 000000000..5d0faf58f --- /dev/null +++ b/.kokoro/samples/python3.11/periodic-head.cfg @@ -0,0 +1,11 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-storage/.kokoro/test-samples-against-head.sh" +} diff --git a/.kokoro/samples/python3.11/periodic.cfg b/.kokoro/samples/python3.11/periodic.cfg new file mode 100644 index 000000000..71cd1e597 --- /dev/null +++ b/.kokoro/samples/python3.11/periodic.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "False" +} diff --git a/.kokoro/samples/python3.11/presubmit.cfg b/.kokoro/samples/python3.11/presubmit.cfg new file mode 100644 index 000000000..a1c8d9759 --- /dev/null +++ b/.kokoro/samples/python3.11/presubmit.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index f0118678a..80c4bfb58 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -21,8 +21,8 @@ In order to add a feature: - The feature must be documented in both the API and narrative documentation. -- The feature must work fully on the following CPython versions: 2.7, - 3.5, 3.6, 3.7, 3.8, 3.9 and 3.10 on both UNIX and Windows. +- The feature must work fully on the following CPython versions: + 3.7, 3.8, 3.9, 3.10 and 3.11 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should diff --git a/noxfile.py b/noxfile.py index 336520412..522f826e9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -29,7 +29,7 @@ DEFAULT_PYTHON_VERSION = "3.8" SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"] -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10"] +UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.8"] _DEFAULT_STORAGE_HOST = "https://storage.googleapis.com" diff --git a/owlbot.py b/owlbot.py index 8d0b89d14..a627b8da8 100644 --- a/owlbot.py +++ b/owlbot.py @@ -26,7 +26,6 @@ templated_files = common.py_library( cov_level=100, split_system_tests=True, - unit_test_python_versions=["3.7", "3.8", "3.9", "3.10"], system_test_external_dependencies=[ "google-cloud-iam", "google-cloud-pubsub < 2.0.0", diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index f5c32b227..7c8a63994 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -89,7 +89,7 @@ def get_pytest_env_vars() -> Dict[str, str]: # DO NOT EDIT - automatically generated. # All versions used to test samples. -ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10"] +ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"] # Any default versions that should be ignored. IGNORED_VERSIONS = TEST_CONFIG["ignored_versions"] From ba323d80caef0a00868da4c20bdf38b53f8bbdf1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 9 Jan 2023 18:19:14 +0000 Subject: [PATCH 133/509] chore(deps): update dependency mock to v5.0.1 (#953) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index f3849b859..3ab184d0c 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.2.0 -mock==5.0.0 +mock==5.0.1 backoff==2.2.1 \ No newline at end of file From 4a267ecea94b4d1e98d221f3e4ae4c94d463e6f1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 10 Jan 2023 18:42:59 +0000 Subject: [PATCH 134/509] chore(deps): update dependency google-cloud-pubsub to v2.13.12 (#972) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 1dee3070e..87fac49cf 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.11 +google-cloud-pubsub==2.13.12 google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.2; python_version >= '3.8' From 2478f72ca08534360aa461355ffaf46dd2e1da3d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 14 Jan 2023 18:08:39 +0000 Subject: [PATCH 135/509] chore(deps): update dependency pytest to v7.2.1 (#974) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 3ab184d0c..51c1be2e6 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.2.0 +pytest==7.2.1 mock==5.0.1 backoff==2.2.1 \ No newline at end of file From 9f81bc81b41e7134c458303fbf4c9bd22962d76d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 25 Jan 2023 18:43:47 +0000 Subject: [PATCH 136/509] chore(deps): update all dependencies (#976) --- samples/snippets/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 87fac49cf..b13cef2bf 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.13.12 +google-cloud-pubsub==2.14.0 google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' -pandas==1.5.2; python_version >= '3.8' +pandas==1.5.3; python_version >= '3.8' From d5a29318b5c68678ea63eb40a4dfede562f8963e Mon Sep 17 00:00:00 2001 From: Dan Lee <71398022+dandhlee@users.noreply.github.com> Date: Wed, 1 Feb 2023 14:44:11 -0600 Subject: [PATCH 137/509] docs: fix c.g.c structure (#982) * docs: fix c.g.c structure * docs: make docs job happy --- docs/acl_guide.rst | 82 ++++++++++++++++++ .../generation_metageneration.rst | 0 docs/index.rst | 21 ++++- docs/{storage => }/retry_timeout.rst | 0 docs/{storage => }/snippets.py | 0 docs/storage/acl.rst | 85 +------------------ docs/storage/{blobs.rst => blob.rst} | 0 docs/storage/{buckets.rst => bucket.rst} | 2 +- docs/storage/modules.rst | 17 ---- 9 files changed, 104 insertions(+), 103 deletions(-) create mode 100644 docs/acl_guide.rst rename docs/{storage => }/generation_metageneration.rst (100%) rename docs/{storage => }/retry_timeout.rst (100%) rename docs/{storage => }/snippets.py (100%) rename docs/storage/{blobs.rst => blob.rst} (100%) rename docs/storage/{buckets.rst => bucket.rst} (93%) delete mode 100644 docs/storage/modules.rst diff --git a/docs/acl_guide.rst b/docs/acl_guide.rst new file mode 100644 index 000000000..3f0790965 --- /dev/null +++ b/docs/acl_guide.rst @@ -0,0 +1,82 @@ +ACL +=== + +Cloud Storage uses access control lists (ACLs) to manage object and bucket access. +ACLs are the mechanism you use to share files with other users and allow +other users to access your buckets and files. + +ACLs are suitable for fine-grained control, but you may prefer using IAM to +control access at the project level. See also: +`Cloud Storage Control Access to Data `_ + + +:class:`google.cloud.storage.bucket.Bucket` has a getting method that creates +an ACL object under the hood, and you can interact with that using +:func:`google.cloud.storage.bucket.Bucket.acl`: + +.. code-block:: python + + client = storage.Client() + bucket = client.get_bucket(bucket_name) + acl = bucket.acl + +Adding and removing permissions can be done with the following methods +(in increasing order of granularity): + +- :func:`ACL.all` + corresponds to access for all users. +- :func:`ACL.all_authenticated` corresponds + to access for all users that are signed into a Google account. +- :func:`ACL.domain` corresponds to access on a + per Google Apps domain (ie, ``example.com``). +- :func:`ACL.group` corresponds to access on a + per group basis (either by ID or e-mail address). +- :func:`ACL.user` corresponds to access on a + per user basis (either by ID or e-mail address). + +And you are able to ``grant`` and ``revoke`` the following roles: + +- **Reading**: + :func:`_ACLEntity.grant_read` and :func:`_ACLEntity.revoke_read` +- **Writing**: + :func:`_ACLEntity.grant_write` and :func:`_ACLEntity.revoke_write` +- **Owning**: + :func:`_ACLEntity.grant_owner` and :func:`_ACLEntity.revoke_owner` + +You can use any of these like any other factory method (these happen to +be :class:`_ACLEntity` factories): + +.. code-block:: python + + acl.user("me@example.org").grant_read() + acl.all_authenticated().grant_write() + +After that, you can save any changes you make with the +:func:`google.cloud.storage.acl.ACL.save` method: + +.. code-block:: python + + acl.save() + + +You can alternatively save any existing :class:`google.cloud.storage.acl.ACL` +object (whether it was created by a factory method or not) from a +:class:`google.cloud.storage.bucket.Bucket`: + +.. code-block:: python + + bucket.acl.save(acl=acl) + + +To get the list of ``entity`` and ``role`` for each unique pair, the +:class:`ACL` class is iterable: + +.. code-block:: python + + print(list(acl)) + # [{'role': 'OWNER', 'entity': 'allUsers'}, ...] + + +This list of tuples can be used as the ``entity`` and ``role`` fields +when sending metadata for ACLs to the API. + diff --git a/docs/storage/generation_metageneration.rst b/docs/generation_metageneration.rst similarity index 100% rename from docs/storage/generation_metageneration.rst rename to docs/generation_metageneration.rst diff --git a/docs/index.rst b/docs/index.rst index 5a9109944..07d236e25 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,12 +8,31 @@ :class:`multiprocessing.Pool` or :class:`multiprocessing.Process` invokes :func:`os.fork`. +Guides +------ +.. toctree:: + :maxdepth: 2 + + acl_guide + generation_metageneration + retry_timeout + API Reference ------------- .. toctree:: :maxdepth: 2 - storage/modules + storage/acl + storage/batch + storage/blob + storage/bucket + storage/client + storage/constants + storage/fileio + storage/hmac_key + storage/notification + storage/retry + More Examples ------------- diff --git a/docs/storage/retry_timeout.rst b/docs/retry_timeout.rst similarity index 100% rename from docs/storage/retry_timeout.rst rename to docs/retry_timeout.rst diff --git a/docs/storage/snippets.py b/docs/snippets.py similarity index 100% rename from docs/storage/snippets.py rename to docs/snippets.py diff --git a/docs/storage/acl.rst b/docs/storage/acl.rst index f96cd6597..4c8562626 100644 --- a/docs/storage/acl.rst +++ b/docs/storage/acl.rst @@ -1,88 +1,5 @@ -ACL -=== - -Cloud Storage uses access control lists (ACLs) to manage object and bucket access. -ACLs are the mechanism you use to share files with other users and allow -other users to access your buckets and files. - -ACLs are suitable for fine-grained control, but you may prefer using IAM to -control access at the project level. See also: -`Cloud Storage Control Access to Data `_ - - -:class:`google.cloud.storage.bucket.Bucket` has a getting method that creates -an ACL object under the hood, and you can interact with that using -:func:`google.cloud.storage.bucket.Bucket.acl`: - -.. code-block:: python - - client = storage.Client() - bucket = client.get_bucket(bucket_name) - acl = bucket.acl - -Adding and removing permissions can be done with the following methods -(in increasing order of granularity): - -- :func:`ACL.all` - corresponds to access for all users. -- :func:`ACL.all_authenticated` corresponds - to access for all users that are signed into a Google account. -- :func:`ACL.domain` corresponds to access on a - per Google Apps domain (ie, ``example.com``). -- :func:`ACL.group` corresponds to access on a - per group basis (either by ID or e-mail address). -- :func:`ACL.user` corresponds to access on a - per user basis (either by ID or e-mail address). - -And you are able to ``grant`` and ``revoke`` the following roles: - -- **Reading**: - :func:`_ACLEntity.grant_read` and :func:`_ACLEntity.revoke_read` -- **Writing**: - :func:`_ACLEntity.grant_write` and :func:`_ACLEntity.revoke_write` -- **Owning**: - :func:`_ACLEntity.grant_owner` and :func:`_ACLEntity.revoke_owner` - -You can use any of these like any other factory method (these happen to -be :class:`_ACLEntity` factories): - -.. code-block:: python - - acl.user("me@example.org").grant_read() - acl.all_authenticated().grant_write() - -After that, you can save any changes you make with the -:func:`google.cloud.storage.acl.ACL.save` method: - -.. code-block:: python - - acl.save() - - -You can alternatively save any existing :class:`google.cloud.storage.acl.ACL` -object (whether it was created by a factory method or not) from a -:class:`google.cloud.storage.bucket.Bucket`: - -.. code-block:: python - - bucket.acl.save(acl=acl) - - -To get the list of ``entity`` and ``role`` for each unique pair, the -:class:`ACL` class is iterable: - -.. code-block:: python - - print(list(acl)) - # [{'role': 'OWNER', 'entity': 'allUsers'}, ...] - - -This list of tuples can be used as the ``entity`` and ``role`` fields -when sending metadata for ACLs to the API. - - ACL Module ----------- +----------- .. automodule:: google.cloud.storage.acl :members: diff --git a/docs/storage/blobs.rst b/docs/storage/blob.rst similarity index 100% rename from docs/storage/blobs.rst rename to docs/storage/blob.rst diff --git a/docs/storage/buckets.rst b/docs/storage/bucket.rst similarity index 93% rename from docs/storage/buckets.rst rename to docs/storage/bucket.rst index c42d7e303..e63fe2115 100644 --- a/docs/storage/buckets.rst +++ b/docs/storage/bucket.rst @@ -1,4 +1,4 @@ -Buckets +Bucket ~~~~~~~ .. automodule:: google.cloud.storage.bucket diff --git a/docs/storage/modules.rst b/docs/storage/modules.rst deleted file mode 100644 index 9148a4385..000000000 --- a/docs/storage/modules.rst +++ /dev/null @@ -1,17 +0,0 @@ -Modules for Python Storage --------------------------- -.. toctree:: - :maxdepth: 2 - - client - blobs - buckets - acl - batch - fileio - constants - hmac_key - notification - retry - retry_timeout - generation_metageneration \ No newline at end of file From 3f9e3d7a5b6507784dc8bbcf8f9ec74e02f2870a Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 7 Feb 2023 12:00:08 -0800 Subject: [PATCH 138/509] samples: add generation-match preconditions to selected samples (#949) * samples: add preconditions to objects.delete * add preconditons to rewrite category samples * add compose and update previous changes * preconditions to rewrites and encrypted uploads * add preconditions to objects insert * refine optional block wording and flow * update test --- samples/snippets/encryption_test.py | 5 ++++- samples/snippets/snippets_test.py | 16 +++++++++------- .../storage_change_file_storage_class.py | 14 +++++++++++--- samples/snippets/storage_compose_file.py | 16 +++++++++++++--- samples/snippets/storage_copy_file.py | 13 +++++++++++-- .../storage_copy_file_archived_generation.py | 13 +++++++++++-- samples/snippets/storage_delete_file.py | 10 +++++++++- samples/snippets/storage_move_file.py | 13 +++++++++++-- .../snippets/storage_object_csek_to_cmek.py | 18 ++++++++++++++---- .../snippets/storage_rotate_encryption_key.py | 10 ++++++++-- .../snippets/storage_upload_encrypted_file.py | 14 +++++++++++++- samples/snippets/storage_upload_file.py | 10 +++++++++- .../snippets/storage_upload_with_kms_key.py | 13 +++++++++++-- 13 files changed, 134 insertions(+), 31 deletions(-) diff --git a/samples/snippets/encryption_test.py b/samples/snippets/encryption_test.py index 536c5d334..5a5eb7b2d 100644 --- a/samples/snippets/encryption_test.py +++ b/samples/snippets/encryption_test.py @@ -47,15 +47,18 @@ def test_generate_encryption_key(capsys): def test_upload_encrypted_blob(): + blob_name = f"test_upload_encrypted_{uuid.uuid4().hex}" with tempfile.NamedTemporaryFile() as source_file: source_file.write(b"test") storage_upload_encrypted_file.upload_encrypted_blob( BUCKET, source_file.name, - "test_encrypted_upload_blob", + blob_name, TEST_ENCRYPTION_KEY, ) + bucket = storage.Client().bucket(BUCKET) + bucket.delete_blob(blob_name) @pytest.fixture(scope="module") diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 4ad0dc1a0..57751be60 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -235,14 +235,16 @@ def test_upload_blob_from_stream(test_bucket, capsys): def test_upload_blob_with_kms(test_bucket): + blob_name = f"test_upload_with_kms_{uuid.uuid4().hex}" with tempfile.NamedTemporaryFile() as source_file: source_file.write(b"test") storage_upload_with_kms_key.upload_blob_with_kms( - test_bucket.name, source_file.name, "test_upload_blob_encrypted", KMS_KEY + test_bucket.name, source_file.name, blob_name, KMS_KEY, ) bucket = storage.Client().bucket(test_bucket.name) - kms_blob = bucket.get_blob("test_upload_blob_encrypted") + kms_blob = bucket.get_blob(blob_name) assert kms_blob.kms_key_name.startswith(KMS_KEY) + test_bucket.delete_blob(blob_name) def test_async_upload(bucket, capsys): @@ -390,7 +392,7 @@ def test_move_blob(test_bucket_create, test_blob): print(f"test_move_blob not found in bucket {test_bucket_create.name}") storage_move_file.move_blob( - bucket.name, test_blob.name, test_bucket_create.name, "test_move_blob" + bucket.name, test_blob.name, test_bucket_create.name, "test_move_blob", ) assert test_bucket_create.get_blob("test_move_blob") is not None @@ -406,7 +408,7 @@ def test_copy_blob(test_blob): pass storage_copy_file.copy_blob( - bucket.name, test_blob.name, bucket.name, "test_copy_blob" + bucket.name, test_blob.name, bucket.name, "test_copy_blob", ) assert bucket.get_blob("test_copy_blob") is not None @@ -545,7 +547,7 @@ def test_define_bucket_website_configuration(test_bucket): def test_object_get_kms_key(test_bucket): with tempfile.NamedTemporaryFile() as source_file: storage_upload_with_kms_key.upload_blob_with_kms( - test_bucket.name, source_file.name, "test_upload_blob_encrypted", KMS_KEY + test_bucket.name, source_file.name, "test_upload_blob_encrypted", KMS_KEY, ) kms_key = storage_object_get_kms_key.object_get_kms_key( test_bucket.name, "test_upload_blob_encrypted" @@ -562,7 +564,7 @@ def test_storage_compose_file(test_bucket): with tempfile.NamedTemporaryFile() as dest_file: destination = storage_compose_file.compose_file( - test_bucket.name, source_files[0], source_files[1], dest_file.name + test_bucket.name, source_files[0], source_files[1], dest_file.name, ) composed = destination.download_as_string() @@ -602,7 +604,7 @@ def test_change_default_storage_class(test_bucket, capsys): def test_change_file_storage_class(test_blob, capsys): blob = storage_change_file_storage_class.change_file_storage_class( - test_blob.bucket.name, test_blob.name + test_blob.bucket.name, test_blob.name, ) out, _ = capsys.readouterr() assert f"Blob {blob.name} in bucket {blob.bucket.name}" in out diff --git a/samples/snippets/storage_change_file_storage_class.py b/samples/snippets/storage_change_file_storage_class.py index d5dda56a7..a976ac8a4 100644 --- a/samples/snippets/storage_change_file_storage_class.py +++ b/samples/snippets/storage_change_file_storage_class.py @@ -27,9 +27,17 @@ def change_file_storage_class(bucket_name, blob_name): storage_client = storage.Client() - bucket = storage_client.get_bucket(bucket_name) - blob = bucket.get_blob(blob_name) - blob.update_storage_class("NEARLINE") + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(blob_name) + generation_match_precondition = None + + # Optional: set a generation-match precondition to avoid potential race + # conditions and data corruptions. The request is aborted if the + # object's generation number does not match your precondition. + blob.reload() # Fetch blob metadata to use in generation_match_precondition. + generation_match_precondition = blob.generation + + blob.update_storage_class("NEARLINE", if_generation_match=generation_match_precondition) print( "Blob {} in bucket {} had its storage class set to {}".format( diff --git a/samples/snippets/storage_compose_file.py b/samples/snippets/storage_compose_file.py index 2c1443f22..e67391272 100644 --- a/samples/snippets/storage_compose_file.py +++ b/samples/snippets/storage_compose_file.py @@ -32,9 +32,19 @@ def compose_file(bucket_name, first_blob_name, second_blob_name, destination_blo destination = bucket.blob(destination_blob_name) destination.content_type = "text/plain" - # sources is a list of Blob instances, up to the max of 32 instances per request - sources = [bucket.get_blob(first_blob_name), bucket.get_blob(second_blob_name)] - destination.compose(sources) + # Note sources is a list of Blob instances, up to the max of 32 instances per request + sources = [bucket.blob(first_blob_name), bucket.blob(second_blob_name)] + + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to compose is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + # There is also an `if_source_generation_match` parameter, which is not used in this example. + destination_generation_match_precondition = 0 + + destination.compose(sources, if_generation_match=destination_generation_match_precondition) print( "New composite object {} in the bucket {} was created by combining {} and {}".format( diff --git a/samples/snippets/storage_copy_file.py b/samples/snippets/storage_copy_file.py index 5d36aa94b..b802de28b 100644 --- a/samples/snippets/storage_copy_file.py +++ b/samples/snippets/storage_copy_file.py @@ -21,7 +21,7 @@ def copy_blob( - bucket_name, blob_name, destination_bucket_name, destination_blob_name + bucket_name, blob_name, destination_bucket_name, destination_blob_name, ): """Copies a blob from one bucket to another with a new name.""" # bucket_name = "your-bucket-name" @@ -35,8 +35,17 @@ def copy_blob( source_blob = source_bucket.blob(blob_name) destination_bucket = storage_client.bucket(destination_bucket_name) + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to copy is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + # There is also an `if_source_generation_match` parameter, which is not used in this example. + destination_generation_match_precondition = 0 + blob_copy = source_bucket.copy_blob( - source_blob, destination_bucket, destination_blob_name + source_blob, destination_bucket, destination_blob_name, if_generation_match=destination_generation_match_precondition, ) print( diff --git a/samples/snippets/storage_copy_file_archived_generation.py b/samples/snippets/storage_copy_file_archived_generation.py index 988ebcbeb..419d8e5a3 100644 --- a/samples/snippets/storage_copy_file_archived_generation.py +++ b/samples/snippets/storage_copy_file_archived_generation.py @@ -36,13 +36,22 @@ def copy_file_archived_generation( source_blob = source_bucket.blob(blob_name) destination_bucket = storage_client.bucket(destination_bucket_name) + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to copy is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + destination_generation_match_precondition = 0 + + # source_generation selects a specific revision of the source object, as opposed to the latest version. blob_copy = source_bucket.copy_blob( - source_blob, destination_bucket, destination_blob_name, source_generation=generation + source_blob, destination_bucket, destination_blob_name, source_generation=generation, if_generation_match=destination_generation_match_precondition ) print( "Generation {} of the blob {} in bucket {} copied to blob {} in bucket {}.".format( - source_blob.generation, + generation, source_blob.name, source_bucket.name, blob_copy.name, diff --git a/samples/snippets/storage_delete_file.py b/samples/snippets/storage_delete_file.py index b2997c86b..427604145 100644 --- a/samples/snippets/storage_delete_file.py +++ b/samples/snippets/storage_delete_file.py @@ -29,7 +29,15 @@ def delete_blob(bucket_name, blob_name): bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) - blob.delete() + generation_match_precondition = None + + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to delete is aborted if the object's + # generation number does not match your precondition. + blob.reload() # Fetch blob metadata to use in generation_match_precondition. + generation_match_precondition = blob.generation + + blob.delete(if_generation_match=generation_match_precondition) print(f"Blob {blob_name} deleted.") diff --git a/samples/snippets/storage_move_file.py b/samples/snippets/storage_move_file.py index a881a38ba..b2e5144d0 100644 --- a/samples/snippets/storage_move_file.py +++ b/samples/snippets/storage_move_file.py @@ -20,7 +20,7 @@ from google.cloud import storage -def move_blob(bucket_name, blob_name, destination_bucket_name, destination_blob_name): +def move_blob(bucket_name, blob_name, destination_bucket_name, destination_blob_name,): """Moves a blob from one bucket to another with a new name.""" # The ID of your GCS bucket # bucket_name = "your-bucket-name" @@ -37,8 +37,17 @@ def move_blob(bucket_name, blob_name, destination_bucket_name, destination_blob_ source_blob = source_bucket.blob(blob_name) destination_bucket = storage_client.bucket(destination_bucket_name) + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + # There is also an `if_source_generation_match` parameter, which is not used in this example. + destination_generation_match_precondition = 0 + blob_copy = source_bucket.copy_blob( - source_blob, destination_bucket, destination_blob_name + source_blob, destination_bucket, destination_blob_name, if_generation_match=destination_generation_match_precondition, ) source_bucket.delete_blob(blob_name) diff --git a/samples/snippets/storage_object_csek_to_cmek.py b/samples/snippets/storage_object_csek_to_cmek.py index 9d4d710bf..9a915f08d 100644 --- a/samples/snippets/storage_object_csek_to_cmek.py +++ b/samples/snippets/storage_object_csek_to_cmek.py @@ -33,12 +33,22 @@ def object_csek_to_cmek(bucket_name, blob_name, encryption_key, kms_key_name): current_encryption_key = base64.b64decode(encryption_key) source_blob = bucket.blob(blob_name, encryption_key=current_encryption_key) - destination_blob = bucket.blob(blob_name, kms_key_name=kms_key_name) - token, rewritten, total = destination_blob.rewrite(source_blob) + generation_match_precondition = None + token = None + + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to rewrite is aborted if the object's + # generation number does not match your precondition. + source_blob.reload() # Fetch blob metadata to use in generation_match_precondition. + generation_match_precondition = source_blob.generation - while token is not None: - token, rewritten, total = destination_blob.rewrite(source_blob, token=token) + while True: + token, bytes_rewritten, total_bytes = destination_blob.rewrite( + source_blob, token=token, if_generation_match=generation_match_precondition + ) + if token is None: + break print( "Blob {} in bucket {} is now managed by the KMS key {} instead of a customer-supplied encryption key".format( diff --git a/samples/snippets/storage_rotate_encryption_key.py b/samples/snippets/storage_rotate_encryption_key.py index 828b7d5ef..174947b84 100644 --- a/samples/snippets/storage_rotate_encryption_key.py +++ b/samples/snippets/storage_rotate_encryption_key.py @@ -42,12 +42,18 @@ def rotate_encryption_key( destination_blob = bucket.blob( blob_name, encryption_key=new_encryption_key ) - + generation_match_precondition = None token = None + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to rewrite is aborted if the object's + # generation number does not match your precondition. + source_blob.reload() # Fetch blob metadata to use in generation_match_precondition. + generation_match_precondition = source_blob.generation + while True: token, bytes_rewritten, total_bytes = destination_blob.rewrite( - source_blob, token=token + source_blob, token=token, if_generation_match=generation_match_precondition ) if token is None: break diff --git a/samples/snippets/storage_upload_encrypted_file.py b/samples/snippets/storage_upload_encrypted_file.py index 5f4987238..08f58154e 100644 --- a/samples/snippets/storage_upload_encrypted_file.py +++ b/samples/snippets/storage_upload_encrypted_file.py @@ -36,6 +36,10 @@ def upload_encrypted_blob( The file will be encrypted by Google Cloud Storage and only retrievable using the provided encryption key. """ + # bucket_name = "your-bucket-name" + # source_file_name = "local/path/to/file" + # destination_blob_name = "storage-object-name" + # base64_encryption_key = "TIbv/fjexq+VmtXzAlc63J4z5kFmWJ6NdAPQulQBT7g=" storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) @@ -48,7 +52,15 @@ def upload_encrypted_blob( destination_blob_name, encryption_key=encryption_key ) - blob.upload_from_filename(source_file_name) + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to upload is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + generation_match_precondition = 0 + + blob.upload_from_filename(source_file_name, if_generation_match=generation_match_precondition) print( f"File {source_file_name} uploaded to {destination_blob_name}." diff --git a/samples/snippets/storage_upload_file.py b/samples/snippets/storage_upload_file.py index 8e7d98630..1e7ceda5e 100644 --- a/samples/snippets/storage_upload_file.py +++ b/samples/snippets/storage_upload_file.py @@ -33,7 +33,15 @@ def upload_blob(bucket_name, source_file_name, destination_blob_name): bucket = storage_client.bucket(bucket_name) blob = bucket.blob(destination_blob_name) - blob.upload_from_filename(source_file_name) + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to upload is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + generation_match_precondition = 0 + + blob.upload_from_filename(source_file_name, if_generation_match=generation_match_precondition) print( f"File {source_file_name} uploaded to {destination_blob_name}." diff --git a/samples/snippets/storage_upload_with_kms_key.py b/samples/snippets/storage_upload_with_kms_key.py index e83c10aea..6e8fe0394 100644 --- a/samples/snippets/storage_upload_with_kms_key.py +++ b/samples/snippets/storage_upload_with_kms_key.py @@ -21,7 +21,7 @@ def upload_blob_with_kms( - bucket_name, source_file_name, destination_blob_name, kms_key_name + bucket_name, source_file_name, destination_blob_name, kms_key_name, ): """Uploads a file to the bucket, encrypting it with the given KMS key.""" # bucket_name = "your-bucket-name" @@ -32,7 +32,16 @@ def upload_blob_with_kms( storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(destination_blob_name, kms_key_name=kms_key_name) - blob.upload_from_filename(source_file_name) + + # Optional: set a generation-match precondition to avoid potential race conditions + # and data corruptions. The request to upload is aborted if the object's + # generation number does not match your precondition. For a destination + # object that does not yet exist, set the if_generation_match precondition to 0. + # If the destination object already exists in your bucket, set instead a + # generation-match precondition using its generation number. + generation_match_precondition = 0 + + blob.upload_from_filename(source_file_name, if_generation_match=generation_match_precondition) print( "File {} uploaded to {} with encryption key {}.".format( From 16a57fc907fa951a5ea1d741c08e2fc0ac22afc4 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 7 Feb 2023 14:52:27 -0800 Subject: [PATCH 139/509] samples: add metageneration-match preconditions to samples (#975) * samples: add metageneration-match preconditions to samples * update optional block wording and flow --- samples/snippets/storage_release_event_based_hold.py | 9 ++++++++- samples/snippets/storage_release_temporary_hold.py | 9 ++++++++- samples/snippets/storage_set_event_based_hold.py | 9 ++++++++- samples/snippets/storage_set_metadata.py | 9 ++++++++- samples/snippets/storage_set_temporary_hold.py | 9 ++++++++- 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/samples/snippets/storage_release_event_based_hold.py b/samples/snippets/storage_release_event_based_hold.py index 1db637cd9..6b4a2ccb5 100644 --- a/samples/snippets/storage_release_event_based_hold.py +++ b/samples/snippets/storage_release_event_based_hold.py @@ -29,9 +29,16 @@ def release_event_based_hold(bucket_name, blob_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) + metageneration_match_precondition = None + + # Optional: set a metageneration-match precondition to avoid potential race + # conditions and data corruptions. The request to patch is aborted if the + # object's metageneration does not match your precondition. + blob.reload() # Fetch blob metadata to use in metageneration_match_precondition. + metageneration_match_precondition = blob.metageneration blob.event_based_hold = False - blob.patch() + blob.patch(if_metageneration_match=metageneration_match_precondition) print(f"Event based hold was released for {blob_name}") diff --git a/samples/snippets/storage_release_temporary_hold.py b/samples/snippets/storage_release_temporary_hold.py index 02a6ca96c..64c7607c1 100644 --- a/samples/snippets/storage_release_temporary_hold.py +++ b/samples/snippets/storage_release_temporary_hold.py @@ -29,9 +29,16 @@ def release_temporary_hold(bucket_name, blob_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) + metageneration_match_precondition = None + + # Optional: set a metageneration-match precondition to avoid potential race + # conditions and data corruptions. The request to patch is aborted if the + # object's metageneration does not match your precondition. + blob.reload() # Fetch blob metadata to use in metageneration_match_precondition. + metageneration_match_precondition = blob.metageneration blob.temporary_hold = False - blob.patch() + blob.patch(if_metageneration_match=metageneration_match_precondition) print("Temporary hold was release for #{blob_name}") diff --git a/samples/snippets/storage_set_event_based_hold.py b/samples/snippets/storage_set_event_based_hold.py index e04ed7552..76f7fd7ee 100644 --- a/samples/snippets/storage_set_event_based_hold.py +++ b/samples/snippets/storage_set_event_based_hold.py @@ -28,9 +28,16 @@ def set_event_based_hold(bucket_name, blob_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) + metageneration_match_precondition = None + + # Optional: set a metageneration-match precondition to avoid potential race + # conditions and data corruptions. The request to patch is aborted if the + # object's metageneration does not match your precondition. + blob.reload() # Fetch blob metadata to use in metageneration_match_precondition. + metageneration_match_precondition = blob.metageneration blob.event_based_hold = True - blob.patch() + blob.patch(if_metageneration_match=metageneration_match_precondition) print(f"Event based hold was set for {blob_name}") diff --git a/samples/snippets/storage_set_metadata.py b/samples/snippets/storage_set_metadata.py index 90b6838c0..6a4a9fb9e 100644 --- a/samples/snippets/storage_set_metadata.py +++ b/samples/snippets/storage_set_metadata.py @@ -28,9 +28,16 @@ def set_blob_metadata(bucket_name, blob_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.get_blob(blob_name) + metageneration_match_precondition = None + + # Optional: set a metageneration-match precondition to avoid potential race + # conditions and data corruptions. The request to patch is aborted if the + # object's metageneration does not match your precondition. + metageneration_match_precondition = blob.metageneration + metadata = {'color': 'Red', 'name': 'Test'} blob.metadata = metadata - blob.patch() + blob.patch(if_metageneration_match=metageneration_match_precondition) print(f"The metadata for the blob {blob.name} is {blob.metadata}") diff --git a/samples/snippets/storage_set_temporary_hold.py b/samples/snippets/storage_set_temporary_hold.py index edeb3c578..a91521bcc 100644 --- a/samples/snippets/storage_set_temporary_hold.py +++ b/samples/snippets/storage_set_temporary_hold.py @@ -28,9 +28,16 @@ def set_temporary_hold(bucket_name, blob_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) + metageneration_match_precondition = None + + # Optional: set a metageneration-match precondition to avoid potential race + # conditions and data corruptions. The request to patch is aborted if the + # object's metageneration does not match your precondition. + blob.reload() # Fetch blob metadata to use in metageneration_match_precondition. + metageneration_match_precondition = blob.metageneration blob.temporary_hold = True - blob.patch() + blob.patch(if_metageneration_match=metageneration_match_precondition) print("Temporary hold was set for #{blob_name}") From 5594db565ff71a25d5a353cce8e438d9710bc025 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 16:32:18 +0000 Subject: [PATCH 140/509] build(deps): bump cryptography from 38.0.3 to 39.0.1 in /synthtool/gcp/templates/python_library/.kokoro (#986) Source-Link: https://togithub.com/googleapis/synthtool/commit/bb171351c3946d3c3c32e60f5f18cee8c464ec51 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:f62c53736eccb0c4934a3ea9316e0d57696bb49c1a7c86c726e9bb8a2f87dadf --- .github/.OwlBot.lock.yaml | 3 ++- .kokoro/requirements.txt | 49 ++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 889f77dfa..b5ffc570f 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:c43f1d918bcf817d337aa29ff833439494a158a0831508fda4ec75dc4c0d0320 + digest: sha256:f62c53736eccb0c4934a3ea9316e0d57696bb49c1a7c86c726e9bb8a2f87dadf + diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 05dc4672e..096e4800a 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -113,33 +113,28 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==38.0.3 \ - --hash=sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d \ - --hash=sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd \ - --hash=sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146 \ - --hash=sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7 \ - --hash=sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436 \ - --hash=sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0 \ - --hash=sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828 \ - --hash=sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b \ - --hash=sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55 \ - --hash=sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36 \ - --hash=sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50 \ - --hash=sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2 \ - --hash=sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a \ - --hash=sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8 \ - --hash=sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0 \ - --hash=sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548 \ - --hash=sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320 \ - --hash=sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748 \ - --hash=sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249 \ - --hash=sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959 \ - --hash=sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f \ - --hash=sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0 \ - --hash=sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd \ - --hash=sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220 \ - --hash=sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c \ - --hash=sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722 +cryptography==39.0.1 \ + --hash=sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4 \ + --hash=sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f \ + --hash=sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502 \ + --hash=sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41 \ + --hash=sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965 \ + --hash=sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e \ + --hash=sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc \ + --hash=sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad \ + --hash=sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505 \ + --hash=sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388 \ + --hash=sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6 \ + --hash=sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2 \ + --hash=sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac \ + --hash=sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695 \ + --hash=sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6 \ + --hash=sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336 \ + --hash=sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0 \ + --hash=sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c \ + --hash=sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106 \ + --hash=sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a \ + --hash=sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8 # via # gcp-releasetool # secretstorage From a9d61e43ef9101f2910e410278fba66058d318a8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 15 Feb 2023 22:42:56 +0000 Subject: [PATCH 141/509] chore(deps): update dependency google-cloud-pubsub to v2.14.1 (#987) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index b13cef2bf..1ab012699 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.14.0 +google-cloud-pubsub==2.14.1 google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.3; python_version >= '3.8' From c6af0979e7a9cb2089eece37fc22fa120ce039c4 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 23 Feb 2023 21:49:53 +0000 Subject: [PATCH 142/509] chore(deps): update dependency google-cloud-pubsub to v2.15.0 (#995) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 1ab012699..19b0fdc99 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.14.1 +google-cloud-pubsub==2.15.0 google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.3; python_version >= '3.8' From 1eb1f4c5bef44087441d09efec1abd56e5efb698 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 11:54:15 -0500 Subject: [PATCH 143/509] chore(python): upgrade gcp-releasetool in .kokoro [autoapprove] (#997) Source-Link: https://github.com/googleapis/synthtool/commit/5f2a6089f73abf06238fe4310f6a14d6f6d1eed3 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:8555f0e37e6261408f792bfd6635102d2da5ad73f8f09bcb24f25e6afb5fac97 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 3 +-- .kokoro/requirements.in | 2 +- .kokoro/requirements.txt | 6 +++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index b5ffc570f..5fc5daa31 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:f62c53736eccb0c4934a3ea9316e0d57696bb49c1a7c86c726e9bb8a2f87dadf - + digest: sha256:8555f0e37e6261408f792bfd6635102d2da5ad73f8f09bcb24f25e6afb5fac97 diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index cbd7e77f4..882178ce6 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -1,5 +1,5 @@ gcp-docuploader -gcp-releasetool +gcp-releasetool>=1.10.5 # required for compatibility with cryptography>=39.x importlib-metadata typing-extensions twine diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 096e4800a..fa99c1290 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -154,9 +154,9 @@ gcp-docuploader==0.6.4 \ --hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \ --hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf # via -r requirements.in -gcp-releasetool==1.10.0 \ - --hash=sha256:72a38ca91b59c24f7e699e9227c90cbe4dd71b789383cb0164b088abae294c83 \ - --hash=sha256:8c7c99320208383d4bb2b808c6880eb7a81424afe7cdba3c8d84b25f4f0e097d +gcp-releasetool==1.10.5 \ + --hash=sha256:174b7b102d704b254f2a26a3eda2c684fd3543320ec239baf771542a2e58e109 \ + --hash=sha256:e29d29927fe2ca493105a82958c6873bb2b90d503acac56be2c229e74de0eec9 # via -r requirements.in google-api-core==2.10.2 \ --hash=sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320 \ From 62b4a500e40860c54c53d12323434d28739f9812 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 1 Mar 2023 15:34:33 -0800 Subject: [PATCH 144/509] docs: update c.g.c docs and guides (#994) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: streamline acl/iam docs * update docs and guides * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * exclude README from owlbot * revert owlbot readme reverts --------- Co-authored-by: Dan Lee <71398022+dandhlee@users.noreply.github.com> Co-authored-by: Owl Bot --- README.rst | 63 +++++++++++++--------- docs/acl_guide.rst | 89 +++++++++++++++++++++++++++++-- google/cloud/storage/constants.py | 7 ++- owlbot.py | 1 + 4 files changed, 132 insertions(+), 28 deletions(-) diff --git a/README.rst b/README.rst index 3b2f84736..61b5a62eb 100644 --- a/README.rst +++ b/README.rst @@ -1,12 +1,21 @@ -Python Client for Google Cloud Storage API -========================================== +Python Client for Google Cloud Storage +====================================== |stable| |pypi| |versions| -`Google Cloud Storage API`_: is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally. +`Google Cloud Storage`_ is a managed service for storing unstructured data. Cloud Storage +allows world-wide storage and retrieval of any amount of data at any time. You can use +Cloud Storage for a range of scenarios including serving website content, storing data +for archival and disaster recovery, or distributing large data objects to users via direct download. + +A comprehensive list of changes in each version may be found in the `CHANGELOG`_. -- `Client Library Documentation`_ - `Product Documentation`_ +- `Client Library Documentation`_ +- `github.com/googleapis/python-storage`_ + +Read more about the client libraries for Cloud APIs, including the older +Google APIs Client Libraries, in `Client Libraries Explained`_. .. |stable| image:: https://img.shields.io/badge/support-stable-gold.svg :target: https://github.com/googleapis/google-cloud-python/blob/main/README.rst#stability-levels @@ -14,43 +23,51 @@ Python Client for Google Cloud Storage API :target: https://pypi.org/project/google-cloud-storage/ .. |versions| image:: https://img.shields.io/pypi/pyversions/google-cloud-storage.svg :target: https://pypi.org/project/google-cloud-storage/ -.. _Google Cloud Storage API: https://cloud.google.com/storage +.. _Google Cloud Storage: https://cloud.google.com/storage .. _Client Library Documentation: https://cloud.google.com/python/docs/reference/storage/latest .. _Product Documentation: https://cloud.google.com/storage +.. _CHANGELOG: https://github.com/googleapis/python-storage/blob/main/CHANGELOG.md +.. _github.com/googleapis/python-storage: https://github.com/googleapis/python-storage +.. _Client Libraries Explained: https://cloud.google.com/apis/docs/client-libraries-explained Quick Start ----------- -In order to use this library, you first need to go through the following steps: +In order to use this library, you first need to go through the following steps. +A step-by-step guide may also be found in `Get Started with Client Libraries`_. 1. `Select or create a Cloud Platform project.`_ 2. `Enable billing for your project.`_ 3. `Enable the Google Cloud Storage API.`_ 4. `Setup Authentication.`_ +.. _Get Started with Client Libraries: https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-python .. _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 Storage API.: https://cloud.google.com/storage -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html +.. _Enable the Google Cloud Storage API.: https://console.cloud.google.com/flows/enableapi?apiid=storage-api.googleapis.com +.. _Setup Authentication.: https://cloud.google.com/docs/authentication/client-libraries Installation ~~~~~~~~~~~~ -Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to -create isolated Python environments. The basic problem it addresses is one of -dependencies and versions, and indirectly permissions. +Install this library in a virtual environment using `venv`_. `venv`_ is a tool that +creates isolated Python environments. These isolated environments can have separate +versions of Python packages, which allows you to isolate one project's dependencies +from the dependencies of other projects. -With `virtualenv`_, it's possible to install this library without needing system +With `venv`_, it's possible to install this library without needing system install permissions, and without clashing with the installed system dependencies. -.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/ +.. _`venv`: https://docs.python.org/3/library/venv.html Code samples and snippets ~~~~~~~~~~~~~~~~~~~~~~~~~ -Code samples and snippets live in the `samples/` folder. +Code samples and snippets live in the `samples/`_ folder. + +.. _`samples/`: https://github.com/googleapis/python-storage/tree/main/samples Supported Python Versions @@ -77,10 +94,9 @@ Mac/Linux .. code-block:: console - pip install virtualenv - virtualenv + python3 -m venv source /bin/activate - /bin/pip install google-cloud-storage + pip install google-cloud-storage Windows @@ -88,20 +104,19 @@ Windows .. code-block:: console - pip install virtualenv - virtualenv - \Scripts\activate - \Scripts\pip.exe install google-cloud-storage + py -m venv + .\\Scripts\activate + pip install google-cloud-storage Next Steps ~~~~~~~~~~ +- Read the `Google Cloud Storage Product documentation`_ to learn + more about the product and see How-to Guides. - Read the `Client Library Documentation`_ for Google Cloud Storage API to see other available methods on the client. -- Read the `Google Cloud Storage API Product documentation`_ to learn - more about the product and see How-to Guides. - View this `README`_ to see the full list of Cloud APIs that we cover. -.. _Google Cloud Storage API Product documentation: https://cloud.google.com/storage +.. _Google Cloud Storage Product documentation: https://cloud.google.com/storage .. _README: https://github.com/googleapis/google-cloud-python/blob/main/README.rst diff --git a/docs/acl_guide.rst b/docs/acl_guide.rst index 3f0790965..13ba4e660 100644 --- a/docs/acl_guide.rst +++ b/docs/acl_guide.rst @@ -1,13 +1,22 @@ +Managing Access to Data +======================= + +Cloud Storage offers two systems for granting users access your buckets and objects: +IAM and Access Control Lists (ACLs). These systems act in parallel - in order for a user to +access a Cloud Storage resource, only one of the systems needs to grant that user permission. +For additional access control options, see also: +`Cloud Storage Control Access to Data `_ + + ACL -=== +--- Cloud Storage uses access control lists (ACLs) to manage object and bucket access. ACLs are the mechanism you use to share files with other users and allow other users to access your buckets and files. ACLs are suitable for fine-grained control, but you may prefer using IAM to -control access at the project level. See also: -`Cloud Storage Control Access to Data `_ +control access at the project level. :class:`google.cloud.storage.bucket.Bucket` has a getting method that creates @@ -80,3 +89,77 @@ To get the list of ``entity`` and ``role`` for each unique pair, the This list of tuples can be used as the ``entity`` and ``role`` fields when sending metadata for ACLs to the API. + +IAM +--- + +Identity and Access Management (IAM) controls permissioning throughout Google Cloud and allows you +to grant permissions at the bucket and project levels. You should use IAM for any permissions that +apply to multiple objects in a bucket to reduce the risks of unintended exposure. To use IAM +exclusively, enable uniform bucket-level access to disallow ACLs for all Cloud Storage resources. +See also: +`Additional access control options `_ + +Constants used across IAM roles: +:::::::::::::::::::::::::::::::: + +- ``STORAGE_OBJECT_CREATOR_ROLE = "roles/storage.objectCreator"`` + corresponds to role implying rights to create objects, but not delete or overwrite them. +- ``STORAGE_OBJECT_VIEWER_ROLE = "roles/storage.objectViewer"`` + corresponds to role implying rights to view object properties, excluding ACLs. +- ``STORAGE_OBJECT_ADMIN_ROLE = "roles/storage.objectAdmin"`` + corresponds to role implying full control of objects. +- ``STORAGE_ADMIN_ROLE = "roles/storage.admin"`` + corresponds to role implying full control of objects and buckets. +- ``STORAGE_VIEWER_ROLE = "Viewer"`` + corresponds to role that can list buckets. +- ``STORAGE_EDITOR_ROLE = "Editor"`` + corresponds to role that can create, list, and delete buckets. +- ``STORAGE_OWNER_ROLE = "Owners"`` + corresponds to role that can Can create, list, and delete buckets; + and list tag bindings; and control HMAC keys in the project. + +Constants used across IAM permissions: +:::::::::::::::::::::::::::::::::::::: + +- ``STORAGE_BUCKETS_CREATE = "storage.buckets.create"`` + corresponds to permission that can create buckets. + +- ``STORAGE_BUCKETS_DELETE = "storage.buckets.delete"`` + corresponds to permission that can delete buckets. + +- ``STORAGE_BUCKETS_GET = "storage.buckets.get"`` + corresponds to permission that can read bucket metadata, excluding ACLs. + +- ``STORAGE_BUCKETS_LIST = "storage.buckets.list"`` + corresponds to permission that can list buckets. + +- ``STORAGE_BUCKETS_GET_IAM_POLICY = "storage.buckets.getIamPolicy"`` + corresponds to permission that can read bucket ACLs. + +- ``STORAGE_BUCKETS_SET_IAM_POLICY = "storage.buckets.setIamPolicy"`` + corresponds to permission that can update bucket ACLs. + +- ``STORAGE_BUCKETS_UPDATE = "storage.buckets.update"`` + corresponds to permission that can update buckets, excluding ACLS. + +- ``STORAGE_OBJECTS_CREATE = "storage.objects.create"`` + corresponds to permission that can add new objects to a bucket. + +- ``STORAGE_OBJECTS_DELETE = "storage.objects.delete"`` + corresponds to permission that can delete objects. + +- ``STORAGE_OBJECTS_GET = "storage.objects.get"`` + corresponds to permission that can read object data / metadata, excluding ACLs. + +- ``STORAGE_OBJECTS_LIST = "storage.objects.list"`` + corresponds to permission that can list objects in a bucket. + +- ``STORAGE_OBJECTS_GET_IAM_POLICY = "storage.objects.getIamPolicy"`` + corresponds to permission that can read object ACLs. + +- ``STORAGE_OBJECTS_SET_IAM_POLICY = "storage.objects.setIamPolicy"`` + corresponds to permission that can update object ACLs. + +- ``STORAGE_OBJECTS_UPDATE = "storage.objects.update"`` + corresponds to permission that can update object metadata, excluding ACLs. diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index 5d6497295..eba0a19df 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -12,7 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Constants used across google.cloud.storage modules.""" +"""Constants used across google.cloud.storage modules. + +See [Python Storage Client Constants Page](https://github.com/googleapis/python-storage/blob/main/google/cloud/storage/constants.py) +for constants used across storage classes, location types, public access prevention, etc. + +""" # Storage classes diff --git a/owlbot.py b/owlbot.py index a627b8da8..50a787f34 100644 --- a/owlbot.py +++ b/owlbot.py @@ -45,6 +45,7 @@ "docs/multiprocessing.rst", "noxfile.py", "CONTRIBUTING.rst", + "README.rst", ".kokoro/samples/python3.6", # remove python 3.6 support ".github/workflows", # exclude gh actions as credentials are needed for tests ".github/release-please.yml", # special support for a python2 branch in this repo From ee223902545fbc33c401d88c50d85dd0d46f139b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 4 Mar 2023 11:32:41 +0000 Subject: [PATCH 145/509] chore(deps): update dependency pytest to v7.2.2 (#999) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 51c1be2e6..2e805e1f8 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.2.1 +pytest==7.2.2 mock==5.0.1 backoff==2.2.1 \ No newline at end of file From 7886376e5105f705a5fe9d061463cf1e033aecd0 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Wed, 15 Mar 2023 13:08:22 -0400 Subject: [PATCH 146/509] fix: add trove classifier for python 3.11 (#971) --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 8686745f7..e2b5cc7a4 100644 --- a/setup.py +++ b/setup.py @@ -81,6 +81,7 @@ "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Operating System :: OS Independent", "Topic :: Internet", ], From 085b3f8eeec61c85ba4571a562faaf6575ec1278 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 08:31:24 -0400 Subject: [PATCH 147/509] chore(deps): Update nox in .kokoro/requirements.in [autoapprove] (#1008) Source-Link: https://github.com/googleapis/synthtool/commit/92006bb3cdc84677aa93c7f5235424ec2b157146 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:2e247c7bf5154df7f98cce087a20ca7605e236340c7d6d1a14447e5c06791bd6 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.in | 2 +- .kokoro/requirements.txt | 14 +++++--------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 5fc5daa31..b8edda51c 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:8555f0e37e6261408f792bfd6635102d2da5ad73f8f09bcb24f25e6afb5fac97 + digest: sha256:2e247c7bf5154df7f98cce087a20ca7605e236340c7d6d1a14447e5c06791bd6 diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index 882178ce6..ec867d9fd 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -5,6 +5,6 @@ typing-extensions twine wheel setuptools -nox +nox>=2022.11.21 # required to remove dependency on py charset-normalizer<3 click<8.1.0 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index fa99c1290..66a2172a7 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.10 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: # # pip-compile --allow-unsafe --generate-hashes requirements.in # @@ -335,9 +335,9 @@ more-itertools==9.0.0 \ --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes -nox==2022.8.7 \ - --hash=sha256:1b894940551dc5c389f9271d197ca5d655d40bdc6ccf93ed6880e4042760a34b \ - --hash=sha256:96cca88779e08282a699d672258ec01eb7c792d35bbbf538c723172bce23212c +nox==2022.11.21 \ + --hash=sha256:0e41a990e290e274cb205a976c4c97ee3c5234441a8132c8c3fd9ea3c22149eb \ + --hash=sha256:e21c31de0711d1274ca585a2c5fde36b1aa962005ba8e9322bf5eeed16dcd684 # via -r requirements.in packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ @@ -380,10 +380,6 @@ protobuf==3.20.3 \ # gcp-docuploader # gcp-releasetool # google-api-core -py==1.11.0 \ - --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ - --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 - # via nox pyasn1==0.4.8 \ --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba From e65316b5352a4e15c4dba806e899ad58f8665464 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 21 Mar 2023 12:59:14 -0700 Subject: [PATCH 148/509] feat: Add multiprocessing and chunked downloading to transfer manager (#1002) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * multiprocessing intitial commit * added multiprocessing, fixed tests; tests for multiprocessing chunks pending * unit tests for multiprocessing * add system tests, fix off-by-one error detected by system tests * lint * exclude subprocess mocks from coverage * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * add deadline to system tests * ban broken grpcio version * Clarify docstring for threads param * fix coverage issues and catch warning * respond to feedback * more feedback --------- Co-authored-by: Owl Bot --- google/cloud/storage/client.py | 5 + google/cloud/storage/transfer_manager.py | 552 ++++++++++++-- noxfile.py | 5 +- tests/system/test_transfer_manager.py | 111 ++- tests/unit/test_transfer_manager.py | 894 ++++++++++++++++------- 5 files changed, 1239 insertions(+), 328 deletions(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index f54bf6043..796f1c654 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -130,6 +130,11 @@ def __init__( if project is _marker: project = None + # Save the initial value of client_info and client_options before they + # are passed along, for use in __reduce__ defined elsewhere. + self._initial_client_info = client_info + self._initial_client_options = client_options + kw_args = {"client_info": client_info} # `api_endpoint` should be only set by the user via `client_options`, diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index e87f0cc76..8de9c6c7b 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -16,10 +16,16 @@ import concurrent.futures +import io +import inspect import os import warnings +import pickle +import copyreg from google.api_core import exceptions +from google.cloud.storage import Client +from google.cloud.storage import Blob warnings.warn( "The module `transfer_manager` is a preview feature. Functionality and API " @@ -27,16 +33,54 @@ ) -DEFAULT_CHUNK_SIZE = 200 * 1024 * 1024 +TM_DEFAULT_CHUNK_SIZE = 32 * 1024 * 1024 +DEFAULT_MAX_WORKERS = 8 +# Constants to be passed in as `worker_type`. +PROCESS = "process" +THREAD = "thread" + + +_cached_clients = {} + + +def _deprecate_threads_param(func): + def convert_threads_or_raise(*args, **kwargs): + binding = inspect.signature(func).bind(*args, **kwargs) + threads = binding.arguments.get("threads") + if threads: + worker_type = binding.arguments.get("worker_type") + max_workers = binding.arguments.get("max_workers") + if worker_type or max_workers: # Parameter conflict + raise ValueError( + "The `threads` parameter is deprecated and conflicts with its replacement parameters, `worker_type` and `max_workers`." + ) + # No conflict, so issue a warning and set worker_type and max_workers. + warnings.warn( + "The `threads` parameter is deprecated. Please use `worker_type` and `max_workers` parameters instead." + ) + args = binding.args + kwargs = binding.kwargs + kwargs["worker_type"] = THREAD + kwargs["max_workers"] = threads + return func(*args, **kwargs) + else: + return func(*args, **kwargs) + + return convert_threads_or_raise + + +@_deprecate_threads_param def upload_many( file_blob_pairs, skip_if_exists=False, upload_kwargs=None, - threads=4, + threads=None, deadline=None, raise_exception=False, + worker_type=PROCESS, + max_workers=DEFAULT_MAX_WORKERS, ): """Upload many files concurrently via a worker pool. @@ -48,6 +92,9 @@ def upload_many( uploaded to the corresponding blob by using blob.upload_from_file() or blob.upload_from_filename() as appropriate. + File handlers are only supported if worker_type is set to THREAD. + If worker_type is set to PROCESS, please use filenames only. + :type skip_if_exists: bool :param skip_if_exists: If True, blobs that already have a live version will not be overwritten. @@ -65,14 +112,10 @@ def upload_many( :type threads: int :param threads: - The number of threads to use in the worker pool. This is passed to - `concurrent.futures.ThreadPoolExecutor` as the `max_worker`; refer - to standard library documentation for details. - - The performance impact of this value depends on the use case, but - generally, smaller files benefit from more threads and larger files - don't benefit from more threads. Too many threads can slow operations, - especially with large files, due to contention over the Python GIL. + ***DEPRECATED*** Sets `worker_type` to THREAD and `max_workers` to the + number specified. If `worker_type` or `max_workers` are set explicitly, + this parameter should be set to None. Please use `worker_type` and + `max_workers` instead of this parameter. :type deadline: int :param deadline: @@ -92,6 +135,40 @@ def upload_many( If skip_if_exists is True, 412 Precondition Failed responses are considered part of normal operation and are not raised as an exception. + :type worker_type: str + :param worker_type: + The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS + or google.cloud.storage.transfer_manager.THREAD. + + Although the exact performance impact depends on the use case, in most + situations the PROCESS worker type will use more system resources (both + memory and CPU) and result in faster operations than THREAD workers. + + Because the subprocesses of the PROCESS worker type can't access memory + from the main process, Client objects have to be serialized and then + recreated in each subprocess. The serialization of the Client object + for use in subprocesses is an approximation and may not capture every + detail of the Client object, especially if the Client was modified after + its initial creation or if `Client._http` was modified in any way. + + THREAD worker types are observed to be relatively efficient for + operations with many small files, but not for operations with large + files. PROCESS workers are recommended for large file operations. + + PROCESS workers do not support writing to file handlers. Please refer + to files by filename only when using PROCESS workers. + + :type max_workers: int + :param max_workers: + The maximum number of workers to create to handle the workload. + + With PROCESS workers, a larger number of workers will consume more + system resources (memory and CPU) at once. + + How many workers is optimal depends heavily on the specific use case, + and the default is a conservative number that should work okay in most + cases without consuming excessive resources. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -103,21 +180,37 @@ def upload_many( if upload_kwargs is None: upload_kwargs = {} if skip_if_exists: + upload_kwargs = upload_kwargs.copy() upload_kwargs["if_generation_match"] = 0 - with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor: + pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) + + with pool_class(max_workers=max_workers) as executor: futures = [] for path_or_file, blob in file_blob_pairs: - method = ( - blob.upload_from_filename - if isinstance(path_or_file, str) - else blob.upload_from_file + # File objects are only supported by the THREAD worker because they can't + # be pickled. + if needs_pickling and not isinstance(path_or_file, str): + raise ValueError( + "Passing in a file object is only supported by the THREAD worker type. Please either select THREAD workers, or pass in filenames only." + ) + + futures.append( + executor.submit( + _call_method_on_maybe_pickled_blob, + _pickle_blob(blob) if needs_pickling else blob, + "upload_from_filename" + if isinstance(path_or_file, str) + else "upload_from_file", + path_or_file, + **upload_kwargs, + ) ) - futures.append(executor.submit(method, path_or_file, **upload_kwargs)) + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + results = [] - concurrent.futures.wait( - futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED - ) for future in futures: exp = future.exception() @@ -134,12 +227,15 @@ def upload_many( return results +@_deprecate_threads_param def download_many( blob_file_pairs, download_kwargs=None, - threads=4, + threads=None, deadline=None, raise_exception=False, + worker_type=PROCESS, + max_workers=DEFAULT_MAX_WORKERS, ): """Download many blobs concurrently via a worker pool. @@ -154,6 +250,9 @@ def download_many( Note that blob.download_to_filename() does not delete the destination file if the download fails. + File handlers are only supported if worker_type is set to THREAD. + If worker_type is set to PROCESS, please use filenames only. + :type download_kwargs: dict :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer @@ -163,14 +262,10 @@ def download_many( :type threads: int :param threads: - The number of threads to use in the worker pool. This is passed to - `concurrent.futures.ThreadPoolExecutor` as the `max_worker`; refer - to standard library documentation for details. - - The performance impact of this value depends on the use case, but - generally, smaller files benefit from more threads and larger files - don't benefit from more threads. Too many threads can slow operations, - especially with large files, due to contention over the Python GIL. + ***DEPRECATED*** Sets `worker_type` to THREAD and `max_workers` to the + number specified. If `worker_type` or `max_workers` are set explicitly, + this parameter should be set to None. Please use `worker_type` and + `max_workers` instead of this parameter. :type deadline: int :param deadline: @@ -187,6 +282,40 @@ def download_many( are only processed and potentially raised after all operations are complete in success or failure. + :type worker_type: str + :param worker_type: + The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS + or google.cloud.storage.transfer_manager.THREAD. + + Although the exact performance impact depends on the use case, in most + situations the PROCESS worker type will use more system resources (both + memory and CPU) and result in faster operations than THREAD workers. + + Because the subprocesses of the PROCESS worker type can't access memory + from the main process, Client objects have to be serialized and then + recreated in each subprocess. The serialization of the Client object + for use in subprocesses is an approximation and may not capture every + detail of the Client object, especially if the Client was modified after + its initial creation or if `Client._http` was modified in any way. + + THREAD worker types are observed to be relatively efficient for + operations with many small files, but not for operations with large + files. PROCESS workers are recommended for large file operations. + + PROCESS workers do not support writing to file handlers. Please refer + to files by filename only when using PROCESS workers. + + :type max_workers: int + :param max_workers: + The maximum number of workers to create to handle the workload. + + With PROCESS workers, a larger number of workers will consume more + system resources (memory and CPU) at once. + + How many workers is optimal depends heavily on the specific use case, + and the default is a conservative number that should work okay in most + cases without consuming excessive resources. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -198,29 +327,48 @@ def download_many( if download_kwargs is None: download_kwargs = {} - with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor: + + pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) + + with pool_class(max_workers=max_workers) as executor: futures = [] for blob, path_or_file in blob_file_pairs: - method = ( - blob.download_to_filename - if isinstance(path_or_file, str) - else blob.download_to_file + # File objects are only supported by the THREAD worker because they can't + # be pickled. + if needs_pickling and not isinstance(path_or_file, str): + raise ValueError( + "Passing in a file object is only supported by the THREAD worker type. Please either select THREAD workers, or pass in filenames only." + ) + + futures.append( + executor.submit( + _call_method_on_maybe_pickled_blob, + _pickle_blob(blob) if needs_pickling else blob, + "download_to_filename" + if isinstance(path_or_file, str) + else "download_to_file", + path_or_file, + **download_kwargs, + ) ) - futures.append(executor.submit(method, path_or_file, **download_kwargs)) + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + results = [] - concurrent.futures.wait( - futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED - ) for future in futures: + # If raise_exception is False, don't call future.result() if not raise_exception: exp = future.exception() if exp: results.append(exp) continue + # Get the real result. If there was an exception, this will raise it. results.append(future.result()) return results +@_deprecate_threads_param def upload_many_from_filenames( bucket, filenames, @@ -229,9 +377,11 @@ def upload_many_from_filenames( skip_if_exists=False, blob_constructor_kwargs=None, upload_kwargs=None, - threads=4, + threads=None, deadline=None, raise_exception=False, + worker_type=PROCESS, + max_workers=DEFAULT_MAX_WORKERS, ): """Upload many files concurrently by their filenames. @@ -309,14 +459,10 @@ def upload_many_from_filenames( :type threads: int :param threads: - The number of threads to use in the worker pool. This is passed to - `concurrent.futures.ThreadPoolExecutor` as the `max_worker`; refer - to standard library documentation for details. - - The performance impact of this value depends on the use case, but - generally, smaller files benefit from more threads and larger files - don't benefit from more threads. Too many threads can slow operations, - especially with large files, due to contention over the Python GIL. + ***DEPRECATED*** Sets `worker_type` to THREAD and `max_workers` to the + number specified. If `worker_type` or `max_workers` are set explicitly, + this parameter should be set to None. Please use `worker_type` and + `max_workers` instead of this parameter. :type deadline: int :param deadline: @@ -336,6 +482,37 @@ def upload_many_from_filenames( If skip_if_exists is True, 412 Precondition Failed responses are considered part of normal operation and are not raised as an exception. + :type worker_type: str + :param worker_type: + The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS + or google.cloud.storage.transfer_manager.THREAD. + + Although the exact performance impact depends on the use case, in most + situations the PROCESS worker type will use more system resources (both + memory and CPU) and result in faster operations than THREAD workers. + + Because the subprocesses of the PROCESS worker type can't access memory + from the main process, Client objects have to be serialized and then + recreated in each subprocess. The serialization of the Client object + for use in subprocesses is an approximation and may not capture every + detail of the Client object, especially if the Client was modified after + its initial creation or if `Client._http` was modified in any way. + + THREAD worker types are observed to be relatively efficient for + operations with many small files, but not for operations with large + files. PROCESS workers are recommended for large file operations. + + :type max_workers: int + :param max_workers: + The maximum number of workers to create to handle the workload. + + With PROCESS workers, a larger number of workers will consume more + system resources (memory and CPU) at once. + + How many workers is optimal depends heavily on the specific use case, + and the default is a conservative number that should work okay in most + cases without consuming excessive resources. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -359,22 +536,26 @@ def upload_many_from_filenames( file_blob_pairs, skip_if_exists=skip_if_exists, upload_kwargs=upload_kwargs, - threads=threads, deadline=deadline, raise_exception=raise_exception, + worker_type=worker_type, + max_workers=max_workers, ) +@_deprecate_threads_param def download_many_to_path( bucket, blob_names, destination_directory="", blob_name_prefix="", download_kwargs=None, - threads=4, + threads=None, deadline=None, create_directories=True, raise_exception=False, + worker_type=PROCESS, + max_workers=DEFAULT_MAX_WORKERS, ): """Download many files concurrently by their blob names. @@ -442,14 +623,10 @@ def download_many_to_path( :type threads: int :param threads: - The number of threads to use in the worker pool. This is passed to - `concurrent.futures.ThreadPoolExecutor` as the `max_worker` param; refer - to standard library documentation for details. - - The performance impact of this value depends on the use case, but - generally, smaller files benefit from more threads and larger files - don't benefit from more threads. Too many threads can slow operations, - especially with large files, due to contention over the Python GIL. + ***DEPRECATED*** Sets `worker_type` to THREAD and `max_workers` to the + number specified. If `worker_type` or `max_workers` are set explicitly, + this parameter should be set to None. Please use `worker_type` and + `max_workers` instead of this parameter. :type deadline: int :param deadline: @@ -474,6 +651,37 @@ def download_many_to_path( Precondition Failed responses are considered part of normal operation and are not raised as an exception. + :type worker_type: str + :param worker_type: + The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS + or google.cloud.storage.transfer_manager.THREAD. + + Although the exact performance impact depends on the use case, in most + situations the PROCESS worker type will use more system resources (both + memory and CPU) and result in faster operations than THREAD workers. + + Because the subprocesses of the PROCESS worker type can't access memory + from the main process, Client objects have to be serialized and then + recreated in each subprocess. The serialization of the Client object + for use in subprocesses is an approximation and may not capture every + detail of the Client object, especially if the Client was modified after + its initial creation or if `Client._http` was modified in any way. + + THREAD worker types are observed to be relatively efficient for + operations with many small files, but not for operations with large + files. PROCESS workers are recommended for large file operations. + + :type max_workers: int + :param max_workers: + The maximum number of workers to create to handle the workload. + + With PROCESS workers, a larger number of workers will consume more + system resources (memory and CPU) at once. + + How many workers is optimal depends heavily on the specific use case, + and the default is a conservative number that should work okay in most + cases without consuming excessive resources. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -495,7 +703,237 @@ def download_many_to_path( return download_many( blob_file_pairs, download_kwargs=download_kwargs, - threads=threads, deadline=deadline, raise_exception=raise_exception, + worker_type=worker_type, + max_workers=max_workers, ) + + +def download_chunks_concurrently( + blob, + filename, + chunk_size=TM_DEFAULT_CHUNK_SIZE, + download_kwargs=None, + deadline=None, + worker_type=PROCESS, + max_workers=DEFAULT_MAX_WORKERS, +): + """Download a single file in chunks, concurrently. + + This function is a PREVIEW FEATURE: the API may change in a future version. + + In some environments, using this feature with mutiple processes will result + in faster downloads of large files. + + Using this feature with multiple threads is unlikely to improve download + performance under normal circumstances due to Python interpreter threading + behavior. The default is therefore to use processes instead of threads. + + Checksumming (md5 or crc32c) is not supported for chunked operations. Any + `checksum` parameter passed in to download_kwargs will be ignored. + + :type bucket: 'google.cloud.storage.bucket.Bucket' + :param bucket: + The bucket which contains the blobs to be downloaded + + :type blob: `google.cloud.storage.Blob` + :param blob: + The blob to be downloaded. + + :type filename: str + :param filename: + The destination filename or path. + + :type download_kwargs: dict + :param download_kwargs: + A dictionary of keyword arguments to pass to the download method. Refer + to the documentation for blob.download_to_file() or + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. + + Keyword arguments "start" and "end" which are not supported and will + cause a ValueError if present. + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type worker_type: str + :param worker_type: + The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS + or google.cloud.storage.transfer_manager.THREAD. + + Although the exact performance impact depends on the use case, in most + situations the PROCESS worker type will use more system resources (both + memory and CPU) and result in faster operations than THREAD workers. + + Because the subprocesses of the PROCESS worker type can't access memory + from the main process, Client objects have to be serialized and then + recreated in each subprocess. The serialization of the Client object + for use in subprocesses is an approximation and may not capture every + detail of the Client object, especially if the Client was modified after + its initial creation or if `Client._http` was modified in any way. + + THREAD worker types are observed to be relatively efficient for + operations with many small files, but not for operations with large + files. PROCESS workers are recommended for large file operations. + + :type max_workers: int + :param max_workers: + The maximum number of workers to create to handle the workload. + + With PROCESS workers, a larger number of workers will consume more + system resources (memory and CPU) at once. + + How many workers is optimal depends heavily on the specific use case, + and the default is a conservative number that should work okay in most + cases without consuming excessive resources. + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + """ + + if download_kwargs is None: + download_kwargs = {} + if "start" in download_kwargs or "end" in download_kwargs: + raise ValueError( + "Download arguments 'start' and 'end' are not supported by download_chunks_concurrently." + ) + + # We must know the size and the generation of the blob. + if not blob.size or not blob.generation: + blob.reload() + + pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) + # Pickle the blob ahead of time (just once, not once per chunk) if needed. + maybe_pickled_blob = _pickle_blob(blob) if needs_pickling else blob + + futures = [] + + # Create and/or truncate the destination file to prepare for sparse writing. + with open(filename, "wb") as _: + pass + + with pool_class(max_workers=max_workers) as executor: + cursor = 0 + end = blob.size + while cursor < end: + start = cursor + cursor = min(cursor + chunk_size, end) + futures.append( + executor.submit( + _download_and_write_chunk_in_place, + maybe_pickled_blob, + filename, + start=start, + end=cursor - 1, + download_kwargs=download_kwargs, + ) + ) + + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + + # Raise any exceptions. Successful results can be ignored. + for future in futures: + future.result() + return None + + +def _download_and_write_chunk_in_place( + maybe_pickled_blob, filename, start, end, download_kwargs +): + if isinstance(maybe_pickled_blob, Blob): + blob = maybe_pickled_blob + else: + blob = pickle.loads(maybe_pickled_blob) + with open( + filename, "rb+" + ) as f: # Open in mixed read/write mode to avoid truncating or appending + f.seek(start) + return blob.download_to_file(f, start=start, end=end, **download_kwargs) + + +def _call_method_on_maybe_pickled_blob( + maybe_pickled_blob, method_name, *args, **kwargs +): + """Helper function that runs inside a thread or subprocess. + + `maybe_pickled_blob` is either a blob (for threads) or a specially pickled + blob (for processes) because the default pickling mangles clients which are + attached to blobs.""" + + if isinstance(maybe_pickled_blob, Blob): + blob = maybe_pickled_blob + else: + blob = pickle.loads(maybe_pickled_blob) + return getattr(blob, method_name)(*args, **kwargs) + + +def _reduce_client(cl): + """Replicate a Client by constructing a new one with the same params.""" + + client_object_id = id(cl) + project = cl.project + credentials = cl._credentials + _http = None # Can't carry this over + client_info = cl._initial_client_info + client_options = cl._initial_client_options + + return _LazyClient, ( + client_object_id, + project, + credentials, + _http, + client_info, + client_options, + ) + + +def _pickle_blob(blob): + """Pickle a Blob (and its Bucket and Client) and return a bytestring.""" + + # We need a custom pickler to process Client objects, which are attached to + # Buckets (and therefore to Blobs in turn). Unfortunately, the Python + # multiprocessing library doesn't seem to have a good way to use a custom + # pickler, and using copyreg will mutate global state and affect code + # outside of the client library. Instead, we'll pre-pickle the object and + # pass the bytestring in. + f = io.BytesIO() + p = pickle.Pickler(f) + p.dispatch_table = copyreg.dispatch_table.copy() + p.dispatch_table[Client] = _reduce_client + p.dump(blob) + return f.getvalue() + + +def _get_pool_class_and_requirements(worker_type): + """Returns the pool class, and whether the pool requires pickled Blobs.""" + + if worker_type == PROCESS: + # Use processes. Pickle blobs with custom logic to handle the client. + return (concurrent.futures.ProcessPoolExecutor, True) + elif worker_type == THREAD: + # Use threads. Pass blobs through unpickled. + return (concurrent.futures.ThreadPoolExecutor, False) + else: + raise ValueError( + "The worker_type must be google.cloud.storage.transfer_manager.PROCESS or google.cloud.storage.transfer_manager.THREAD" + ) + + +class _LazyClient: + """An object that will transform into either a cached or a new Client""" + + def __new__(cls, id, *args, **kwargs): + cached_client = _cached_clients.get(id) + if cached_client: + return cached_client + else: + cached_client = Client(*args, **kwargs) + _cached_clients[id] = cached_client + return cached_client diff --git a/noxfile.py b/noxfile.py index 522f826e9..3b67a5712 100644 --- a/noxfile.py +++ b/noxfile.py @@ -137,9 +137,8 @@ def system(session): session.skip("System tests were not found") # Use pre-release gRPC for system tests. - # TODO: Revert #845 once grpc issue fix is released. - # Pending grpc/grpc#30642 and grpc/grpc#30651. - session.install("--pre", "grpcio!=1.49.0rc1") + # TODO: Remove ban of 1.52.0rc1 once grpc/grpc#31885 is resolved. + session.install("--pre", "grpcio!=1.52.0rc1") # Install all test dependencies, then install this package into the # virtualenv's dist-packages. diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index 0b639170d..bc7e0d31e 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -14,11 +14,15 @@ # limitations under the License. import tempfile +import os from google.cloud.storage import transfer_manager +from google.cloud.storage._helpers import _base64_md5hash from google.api_core import exceptions +DEADLINE = 30 + def test_upload_many(shared_bucket, file_data, blobs_to_delete): FILE_BLOB_PAIRS = [ @@ -26,7 +30,11 @@ def test_upload_many(shared_bucket, file_data, blobs_to_delete): (file_data["simple"]["path"], shared_bucket.blob("simple2")), ] - results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + worker_type=transfer_manager.PROCESS, + deadline=DEADLINE, + ) assert results == [None, None] blobs = shared_bucket.list_blobs() @@ -36,13 +44,19 @@ def test_upload_many(shared_bucket, file_data, blobs_to_delete): assert len(blobs_to_delete) == 2 -def test_upload_many_with_file_objs(shared_bucket, file_data, blobs_to_delete): +def test_upload_many_with_threads_and_file_objs( + shared_bucket, file_data, blobs_to_delete +): FILE_BLOB_PAIRS = [ (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple1")), (open(file_data["simple"]["path"], "rb"), shared_bucket.blob("simple2")), ] - results = transfer_manager.upload_many(FILE_BLOB_PAIRS) + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + worker_type=transfer_manager.THREAD, + deadline=DEADLINE, + ) assert results == [None, None] blobs = shared_bucket.list_blobs() @@ -61,7 +75,10 @@ def test_upload_many_skip_if_exists( ] results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True + FILE_BLOB_PAIRS, + skip_if_exists=True, + raise_exception=True, + deadline=DEADLINE, ) assert isinstance(results[0], exceptions.PreconditionFailed) assert results[1] is None @@ -75,10 +92,82 @@ def test_upload_many_skip_if_exists( def test_download_many(listable_bucket): blobs = list(listable_bucket.list_blobs()) - tempfiles = [tempfile.TemporaryFile(), tempfile.TemporaryFile()] - BLOB_FILE_PAIRS = zip(blobs[:2], tempfiles) - - results = transfer_manager.download_many(BLOB_FILE_PAIRS) - assert results == [None, None] - for fp in tempfiles: - assert fp.tell() != 0 + with tempfile.TemporaryDirectory() as tempdir: + filenames = [ + os.path.join(tempdir, "file_a.txt"), + os.path.join(tempdir, "file_b.txt"), + ] + BLOB_FILE_PAIRS = zip(blobs[:2], filenames) + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, + worker_type=transfer_manager.PROCESS, + deadline=DEADLINE, + ) + assert results == [None, None] + for count, filename in enumerate(filenames): + with open(filename, "rb") as fp: + assert len(fp.read()) == blobs[count].size + + +def test_download_many_with_threads_and_file_objs(listable_bucket): + blobs = list(listable_bucket.list_blobs()) + with tempfile.TemporaryFile() as file_a, tempfile.TemporaryFile() as file_b: + tempfiles = [file_a, file_b] + BLOB_FILE_PAIRS = zip(blobs[:2], tempfiles) + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, + worker_type=transfer_manager.THREAD, + deadline=DEADLINE, + ) + assert results == [None, None] + for fp in tempfiles: + assert fp.tell() != 0 + + +def test_download_chunks_concurrently(shared_bucket, file_data): + # Upload a big file + source_file = file_data["big"] + upload_blob = shared_bucket.blob("chunky_file") + upload_blob.upload_from_filename(source_file["path"]) + upload_blob.reload() + size = upload_blob.size + chunk_size = size // 32 + + # Get a fresh blob obj w/o metadata for testing purposes + download_blob = shared_bucket.blob("chunky_file") + + with tempfile.TemporaryDirectory() as tempdir: + full_filename = os.path.join(tempdir, "chunky_file_1") + transfer_manager.download_chunks_concurrently( + download_blob, + full_filename, + chunk_size=chunk_size, + deadline=DEADLINE, + ) + with open(full_filename, "rb") as file_obj: + assert _base64_md5hash(file_obj) == source_file["hash"] + + # Now test for case where last chunk is exactly 1 byte. + trailing_chunk_filename = os.path.join(tempdir, "chunky_file_2") + transfer_manager.download_chunks_concurrently( + download_blob, + trailing_chunk_filename, + chunk_size=size - 1, + deadline=DEADLINE, + ) + with open(trailing_chunk_filename, "rb") as file_obj: + assert _base64_md5hash(file_obj) == source_file["hash"] + + # Also test threaded mode. + threaded_filename = os.path.join(tempdir, "chunky_file_3") + transfer_manager.download_chunks_concurrently( + download_blob, + threaded_filename, + chunk_size=chunk_size, + deadline=DEADLINE, + worker_type=transfer_manager.THREAD, + ) + with open(threaded_filename, "rb") as file_obj: + assert _base64_md5hash(file_obj) == source_file["hash"] diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index f52d5471b..bdfd236b5 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -17,258 +17,483 @@ with pytest.warns(UserWarning): from google.cloud.storage import transfer_manager +from google.cloud.storage import Blob + from google.api_core import exceptions import os import tempfile -import unittest import mock - - -class Test_Transfer_Manager(unittest.TestCase): - def test_upload_many_with_filenames(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - FAKE_CONTENT_TYPE = "text/fake" - UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} - EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} - FAKE_RESULT = "nothing to see here" - - for _, blob_mock in FILE_BLOB_PAIRS: - blob_mock.upload_from_filename.return_value = FAKE_RESULT - - results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS +import pickle + +BLOB_TOKEN_STRING = "blob token" +FAKE_CONTENT_TYPE = "text/fake" +UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} +FAKE_RESULT = "nothing to see here" +FAKE_ENCODING = "fake_gzip" +DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} +CHUNK_SIZE = 8 + + +# Used in subprocesses only, so excluded from coverage +def _validate_blob_token_in_subprocess( + maybe_pickled_blob, method_name, path_or_file, **kwargs +): # pragma: NO COVER + assert pickle.loads(maybe_pickled_blob) == BLOB_TOKEN_STRING + assert method_name.endswith("filename") + assert path_or_file.startswith("file") + assert kwargs == UPLOAD_KWARGS or kwargs == DOWNLOAD_KWARGS + return FAKE_RESULT + + +def test_upload_many_with_filenames(): + FILE_BLOB_PAIRS = [ + ("file_a.txt", mock.Mock(spec=Blob)), + ("file_b.txt", mock.Mock(spec=Blob)), + ] + EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + + for _, blob_mock in FILE_BLOB_PAIRS: + blob_mock.upload_from_filename.return_value = FAKE_RESULT + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + skip_if_exists=True, + upload_kwargs=UPLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + ) + for (filename, mock_blob) in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.assert_any_call( + filename, **EXPECTED_UPLOAD_KWARGS ) - for (filename, mock_blob) in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.assert_any_call( - filename, **EXPECTED_UPLOAD_KWARGS - ) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_upload_many_with_file_objs(self): - FILE_BLOB_PAIRS = [ - (tempfile.TemporaryFile(), mock.Mock()), - (tempfile.TemporaryFile(), mock.Mock()), - ] - FAKE_CONTENT_TYPE = "text/fake" - UPLOAD_KWARGS = {"content-type": FAKE_CONTENT_TYPE} - EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} - FAKE_RESULT = "nothing to see here" - - for _, blob_mock in FILE_BLOB_PAIRS: - blob_mock.upload_from_file.return_value = FAKE_RESULT - - results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, upload_kwargs=UPLOAD_KWARGS + for result in results: + assert result == FAKE_RESULT + + +def test_upload_many_with_file_objs(): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + ] + EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + + for _, blob_mock in FILE_BLOB_PAIRS: + blob_mock.upload_from_file.return_value = FAKE_RESULT + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + skip_if_exists=True, + upload_kwargs=UPLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + ) + for (file, mock_blob) in FILE_BLOB_PAIRS: + mock_blob.upload_from_file.assert_any_call(file, **EXPECTED_UPLOAD_KWARGS) + for result in results: + assert result == FAKE_RESULT + + +def test_upload_many_passes_concurrency_options(): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch("concurrent.futures.ThreadPoolExecutor") as pool_patch, mock.patch( + "concurrent.futures.wait" + ) as wait_patch: + transfer_manager.upload_many( + FILE_BLOB_PAIRS, + deadline=DEADLINE, + worker_type=transfer_manager.THREAD, + max_workers=MAX_WORKERS, ) - for (file, mock_blob) in FILE_BLOB_PAIRS: - mock_blob.upload_from_file.assert_any_call(file, **EXPECTED_UPLOAD_KWARGS) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_upload_many_passes_concurrency_options(self): - FILE_BLOB_PAIRS = [ - (tempfile.TemporaryFile(), mock.Mock()), - (tempfile.TemporaryFile(), mock.Mock()), - ] - MAX_WORKERS = 7 - DEADLINE = 10 - with mock.patch( - "concurrent.futures.ThreadPoolExecutor" - ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) + + +def test_threads_deprecation_with_upload(): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch("concurrent.futures.ThreadPoolExecutor") as pool_patch, mock.patch( + "concurrent.futures.wait" + ) as wait_patch: + with pytest.warns(): transfer_manager.upload_many( - FILE_BLOB_PAIRS, threads=MAX_WORKERS, deadline=DEADLINE - ) - pool_patch.assert_called_with(max_workers=MAX_WORKERS) - wait_patch.assert_called_with( - mock.ANY, timeout=DEADLINE, return_when=mock.ANY + FILE_BLOB_PAIRS, deadline=DEADLINE, threads=MAX_WORKERS ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) + + +def test_threads_deprecation_conflict_with_upload(): + FILE_BLOB_PAIRS = [ + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with pytest.raises(ValueError): + transfer_manager.upload_many( + FILE_BLOB_PAIRS, + deadline=DEADLINE, + threads=5, + worker_type=transfer_manager.THREAD, + max_workers=MAX_WORKERS, + ) - def test_upload_many_suppresses_exceptions(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = ConnectionError() - - results = transfer_manager.upload_many(FILE_BLOB_PAIRS) - for result in results: - self.assertEqual(type(result), ConnectionError) - - def test_upload_many_raises_exceptions(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = ConnectionError() - with self.assertRaises(ConnectionError): - transfer_manager.upload_many(FILE_BLOB_PAIRS, raise_exception=True) +def test_upload_many_suppresses_exceptions(): + FILE_BLOB_PAIRS = [ + ("file_a.txt", mock.Mock(spec=Blob)), + ("file_b.txt", mock.Mock(spec=Blob)), + ] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = ConnectionError() + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, worker_type=transfer_manager.THREAD + ) + for result in results: + assert isinstance(result, ConnectionError) + + +def test_upload_many_raises_exceptions(): + FILE_BLOB_PAIRS = [ + ("file_a.txt", mock.Mock(spec=Blob)), + ("file_b.txt", mock.Mock(spec=Blob)), + ] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = ConnectionError() + + with pytest.raises(ConnectionError): + transfer_manager.upload_many( + FILE_BLOB_PAIRS, raise_exception=True, worker_type=transfer_manager.THREAD + ) - def test_upload_many_suppresses_412_with_skip_if_exists(self): - FILE_BLOB_PAIRS = [("file_a.txt", mock.Mock()), ("file_b.txt", mock.Mock())] - for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = exceptions.PreconditionFailed( - "412" - ) +def test_upload_many_suppresses_412_with_skip_if_exists(): + FILE_BLOB_PAIRS = [ + ("file_a.txt", mock.Mock(spec=Blob)), + ("file_b.txt", mock.Mock(spec=Blob)), + ] + for _, mock_blob in FILE_BLOB_PAIRS: + mock_blob.upload_from_filename.side_effect = exceptions.PreconditionFailed( + "412" + ) + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + skip_if_exists=True, + raise_exception=True, + worker_type=transfer_manager.THREAD, + ) + for result in results: + assert type(result) == exceptions.PreconditionFailed + + +def test_upload_many_with_processes(): + # Mocks are not pickleable, so we send token strings over the wire. + FILE_BLOB_PAIRS = [ + ("file_a.txt", BLOB_TOKEN_STRING), + ("file_b.txt", BLOB_TOKEN_STRING), + ] + + with mock.patch( + "google.cloud.storage.transfer_manager._call_method_on_maybe_pickled_blob", + new=_validate_blob_token_in_subprocess, + ): results = transfer_manager.upload_many( - FILE_BLOB_PAIRS, skip_if_exists=True, raise_exception=True + FILE_BLOB_PAIRS, + upload_kwargs=UPLOAD_KWARGS, + worker_type=transfer_manager.PROCESS, + raise_exception=True, ) - for result in results: - self.assertEqual(type(result), exceptions.PreconditionFailed) - - def test_download_many_with_filenames(self): - BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] - FAKE_ENCODING = "fake_gzip" - DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} - FAKE_RESULT = "nothing to see here" + for result in results: + assert result == FAKE_RESULT + + +def test_upload_many_with_processes_rejects_file_obj(): + # Mocks are not pickleable, so we send token strings over the wire. + FILE_BLOB_PAIRS = [ + ("file_a.txt", BLOB_TOKEN_STRING), + (tempfile.TemporaryFile(), BLOB_TOKEN_STRING), + ] + + with mock.patch( + "google.cloud.storage.transfer_manager._call_method_on_maybe_pickled_blob", + new=_validate_blob_token_in_subprocess, + ): + with pytest.raises(ValueError): + transfer_manager.upload_many( + FILE_BLOB_PAIRS, + upload_kwargs=UPLOAD_KWARGS, + worker_type=transfer_manager.PROCESS, + ) - for blob_mock, _ in BLOB_FILE_PAIRS: - blob_mock.download_to_filename.return_value = FAKE_RESULT - results = transfer_manager.download_many( - BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS +def test_download_many_with_filenames(): + BLOB_FILE_PAIRS = [ + (mock.Mock(spec=Blob), "file_a.txt"), + (mock.Mock(spec=Blob), "file_b.txt"), + ] + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock.download_to_filename.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + ) + for (mock_blob, file) in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.assert_any_call(file, **DOWNLOAD_KWARGS) + for result in results: + assert result == FAKE_RESULT + + +def test_download_many_with_file_objs(): + BLOB_FILE_PAIRS = [ + (mock.Mock(spec=Blob), tempfile.TemporaryFile()), + (mock.Mock(spec=Blob), tempfile.TemporaryFile()), + ] + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock.download_to_file.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + ) + for (mock_blob, file) in BLOB_FILE_PAIRS: + mock_blob.download_to_file.assert_any_call(file, **DOWNLOAD_KWARGS) + for result in results: + assert result == FAKE_RESULT + + +def test_download_many_passes_concurrency_options(): + BLOB_FILE_PAIRS = [ + (mock.Mock(spec=Blob), tempfile.TemporaryFile()), + (mock.Mock(spec=Blob), tempfile.TemporaryFile()), + ] + MAX_WORKERS = 7 + DEADLINE = 10 + with mock.patch("concurrent.futures.ThreadPoolExecutor") as pool_patch, mock.patch( + "concurrent.futures.wait" + ) as wait_patch: + transfer_manager.download_many( + BLOB_FILE_PAIRS, + deadline=DEADLINE, + worker_type=transfer_manager.THREAD, + max_workers=MAX_WORKERS, ) - for (mock_blob, file) in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.assert_any_call(file, **DOWNLOAD_KWARGS) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_download_many_with_file_objs(self): - BLOB_FILE_PAIRS = [ - (mock.Mock(), tempfile.TemporaryFile()), - (mock.Mock(), tempfile.TemporaryFile()), - ] - FAKE_ENCODING = "fake_gzip" - DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} - FAKE_RESULT = "nothing to see here" + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) + + +def test_download_many_suppresses_exceptions(): + BLOB_FILE_PAIRS = [ + (mock.Mock(spec=Blob), "file_a.txt"), + (mock.Mock(spec=Blob), "file_b.txt"), + ] + for mock_blob, _ in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.side_effect = ConnectionError() + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, worker_type=transfer_manager.THREAD + ) + for result in results: + assert isinstance(result, ConnectionError) + + +def test_download_many_raises_exceptions(): + BLOB_FILE_PAIRS = [ + (mock.Mock(spec=Blob), "file_a.txt"), + (mock.Mock(spec=Blob), "file_b.txt"), + ] + for mock_blob, _ in BLOB_FILE_PAIRS: + mock_blob.download_to_filename.side_effect = ConnectionError() + + with pytest.raises(ConnectionError): + transfer_manager.download_many( + BLOB_FILE_PAIRS, raise_exception=True, worker_type=transfer_manager.THREAD + ) + - for blob_mock, _ in BLOB_FILE_PAIRS: - blob_mock.download_to_file.return_value = FAKE_RESULT +def test_download_many_with_processes(): + # Mocks are not pickleable, so we send token strings over the wire. + BLOB_FILE_PAIRS = [ + (BLOB_TOKEN_STRING, "file_a.txt"), + (BLOB_TOKEN_STRING, "file_b.txt"), + ] + with mock.patch( + "google.cloud.storage.transfer_manager._call_method_on_maybe_pickled_blob", + new=_validate_blob_token_in_subprocess, + ): results = transfer_manager.download_many( - BLOB_FILE_PAIRS, download_kwargs=DOWNLOAD_KWARGS + BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.PROCESS, ) - for (mock_blob, file) in BLOB_FILE_PAIRS: - mock_blob.download_to_file.assert_any_call(file, **DOWNLOAD_KWARGS) - for result in results: - self.assertEqual(result, FAKE_RESULT) - - def test_download_many_passes_concurrency_options(self): - BLOB_FILE_PAIRS = [ - (mock.Mock(), tempfile.TemporaryFile()), - (mock.Mock(), tempfile.TemporaryFile()), - ] - MAX_WORKERS = 7 - DEADLINE = 10 - with mock.patch( - "concurrent.futures.ThreadPoolExecutor" - ) as pool_patch, mock.patch("concurrent.futures.wait") as wait_patch: + for result in results: + assert result == FAKE_RESULT + + +def test_download_many_with_processes_rejects_file_obj(): + # Mocks are not pickleable, so we send token strings over the wire. + BLOB_FILE_PAIRS = [ + (BLOB_TOKEN_STRING, "file_a.txt"), + (BLOB_TOKEN_STRING, tempfile.TemporaryFile()), + ] + + with mock.patch( + "google.cloud.storage.transfer_manager._call_method_on_maybe_pickled_blob", + new=_validate_blob_token_in_subprocess, + ): + with pytest.raises(ValueError): transfer_manager.download_many( - BLOB_FILE_PAIRS, threads=MAX_WORKERS, deadline=DEADLINE - ) - pool_patch.assert_called_with(max_workers=MAX_WORKERS) - wait_patch.assert_called_with( - mock.ANY, timeout=DEADLINE, return_when=mock.ANY + BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.PROCESS, ) - def test_download_many_suppresses_exceptions(self): - BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] - for mock_blob, _ in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.side_effect = ConnectionError() - - results = transfer_manager.download_many(BLOB_FILE_PAIRS) - for result in results: - self.assertEqual(type(result), ConnectionError) - - def test_download_many_raises_exceptions(self): - BLOB_FILE_PAIRS = [(mock.Mock(), "file_a.txt"), (mock.Mock(), "file_b.txt")] - for mock_blob, _ in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.side_effect = ConnectionError() - - transfer_manager.download_many(BLOB_FILE_PAIRS) - with self.assertRaises(ConnectionError): - transfer_manager.download_many(BLOB_FILE_PAIRS, raise_exception=True) - - def test_upload_many_from_filenames(self): - bucket = mock.Mock() - - FILENAMES = ["file_a.txt", "file_b.txt"] - ROOT = "mypath/" - PREFIX = "myprefix/" - KEY_NAME = "keyname" - BLOB_CONSTRUCTOR_KWARGS = {"kms_key_name": KEY_NAME} - UPLOAD_KWARGS = {"content-type": "text/fake"} - MAX_WORKERS = 7 - DEADLINE = 10 - - EXPECTED_FILE_BLOB_PAIRS = [ - (os.path.join(ROOT, filename), mock.ANY) for filename in FILENAMES - ] - - with mock.patch( - "google.cloud.storage.transfer_manager.upload_many" - ) as mock_upload_many: - transfer_manager.upload_many_from_filenames( - bucket, - FILENAMES, - source_directory=ROOT, - blob_name_prefix=PREFIX, - skip_if_exists=True, - blob_constructor_kwargs=BLOB_CONSTRUCTOR_KWARGS, - upload_kwargs=UPLOAD_KWARGS, - threads=MAX_WORKERS, - deadline=DEADLINE, - raise_exception=True, - ) - mock_upload_many.assert_called_once_with( - EXPECTED_FILE_BLOB_PAIRS, +def test_upload_many_from_filenames(): + bucket = mock.Mock() + + FILENAMES = ["file_a.txt", "file_b.txt"] + ROOT = "mypath/" + PREFIX = "myprefix/" + KEY_NAME = "keyname" + BLOB_CONSTRUCTOR_KWARGS = {"kms_key_name": KEY_NAME} + UPLOAD_KWARGS = {"content-type": "text/fake"} + MAX_WORKERS = 7 + DEADLINE = 10 + WORKER_TYPE = transfer_manager.THREAD + + EXPECTED_FILE_BLOB_PAIRS = [ + (os.path.join(ROOT, filename), mock.ANY) for filename in FILENAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, + FILENAMES, + source_directory=ROOT, + blob_name_prefix=PREFIX, skip_if_exists=True, + blob_constructor_kwargs=BLOB_CONSTRUCTOR_KWARGS, upload_kwargs=UPLOAD_KWARGS, - threads=MAX_WORKERS, deadline=DEADLINE, raise_exception=True, + worker_type=WORKER_TYPE, + max_workers=MAX_WORKERS, ) - bucket.blob.assert_any_call(PREFIX + FILENAMES[0], **BLOB_CONSTRUCTOR_KWARGS) - bucket.blob.assert_any_call(PREFIX + FILENAMES[1], **BLOB_CONSTRUCTOR_KWARGS) - def test_upload_many_from_filenames_minimal_args(self): - bucket = mock.Mock() + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=True, + upload_kwargs=UPLOAD_KWARGS, + deadline=DEADLINE, + raise_exception=True, + worker_type=WORKER_TYPE, + max_workers=MAX_WORKERS, + ) + bucket.blob.assert_any_call(PREFIX + FILENAMES[0], **BLOB_CONSTRUCTOR_KWARGS) + bucket.blob.assert_any_call(PREFIX + FILENAMES[1], **BLOB_CONSTRUCTOR_KWARGS) - FILENAMES = ["file_a.txt", "file_b.txt"] - EXPECTED_FILE_BLOB_PAIRS = [(filename, mock.ANY) for filename in FILENAMES] +def test_upload_many_from_filenames_minimal_args(): + bucket = mock.Mock() - with mock.patch( - "google.cloud.storage.transfer_manager.upload_many" - ) as mock_upload_many: - transfer_manager.upload_many_from_filenames( - bucket, - FILENAMES, - ) + FILENAMES = ["file_a.txt", "file_b.txt"] - mock_upload_many.assert_called_once_with( - EXPECTED_FILE_BLOB_PAIRS, - skip_if_exists=False, - upload_kwargs=None, - threads=4, - deadline=None, - raise_exception=False, + EXPECTED_FILE_BLOB_PAIRS = [(filename, mock.ANY) for filename in FILENAMES] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, + FILENAMES, ) - bucket.blob.assert_any_call(FILENAMES[0]) - bucket.blob.assert_any_call(FILENAMES[1]) - def test_download_many_to_path(self): - bucket = mock.Mock() + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=False, + upload_kwargs=None, + deadline=None, + raise_exception=False, + worker_type=transfer_manager.PROCESS, + max_workers=8, + ) + bucket.blob.assert_any_call(FILENAMES[0]) + bucket.blob.assert_any_call(FILENAMES[1]) + + +def test_download_many_to_path(): + bucket = mock.Mock() + + BLOBNAMES = ["file_a.txt", "file_b.txt", "dir_a/file_c.txt"] + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + WORKER_TYPE = transfer_manager.THREAD + + EXPECTED_BLOB_FILE_PAIRS = [ + (mock.ANY, os.path.join(PATH_ROOT, blobname)) for blobname in BLOBNAMES + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.download_many" + ) as mock_download_many: + transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + create_directories=False, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + ) - BLOBNAMES = ["file_a.txt", "file_b.txt", "dir_a/file_c.txt"] - PATH_ROOT = "mypath/" - BLOB_NAME_PREFIX = "myprefix/" - DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} - MAX_WORKERS = 7 - DEADLINE = 10 + mock_download_many.assert_called_once_with( + EXPECTED_BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + ) + for blobname in BLOBNAMES: + bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) + + +def test_download_many_to_path_creates_directories(): + bucket = mock.Mock() + + with tempfile.TemporaryDirectory() as tempdir: + DIR_NAME = "dir_a/dir_b" + BLOBNAMES = [ + "file_a.txt", + "file_b.txt", + os.path.join(DIR_NAME, "file_c.txt"), + ] EXPECTED_BLOB_FILE_PAIRS = [ - (mock.ANY, os.path.join(PATH_ROOT, blobname)) for blobname in BLOBNAMES + (mock.ANY, os.path.join(tempdir, blobname)) for blobname in BLOBNAMES ] with mock.patch( @@ -277,59 +502,214 @@ def test_download_many_to_path(self): transfer_manager.download_many_to_path( bucket, BLOBNAMES, - destination_directory=PATH_ROOT, - blob_name_prefix=BLOB_NAME_PREFIX, - download_kwargs=DOWNLOAD_KWARGS, - threads=MAX_WORKERS, - deadline=DEADLINE, - create_directories=False, + destination_directory=tempdir, + create_directories=True, raise_exception=True, ) mock_download_many.assert_called_once_with( EXPECTED_BLOB_FILE_PAIRS, - download_kwargs=DOWNLOAD_KWARGS, - threads=MAX_WORKERS, - deadline=DEADLINE, + download_kwargs=None, + deadline=None, raise_exception=True, + worker_type=transfer_manager.PROCESS, + max_workers=8, ) for blobname in BLOBNAMES: - bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) - - def test_download_many_to_path_creates_directories(self): - bucket = mock.Mock() - - with tempfile.TemporaryDirectory() as tempdir: - DIR_NAME = "dir_a/dir_b" - BLOBNAMES = [ - "file_a.txt", - "file_b.txt", - os.path.join(DIR_NAME, "file_c.txt"), - ] - - EXPECTED_BLOB_FILE_PAIRS = [ - (mock.ANY, os.path.join(tempdir, blobname)) for blobname in BLOBNAMES - ] - - with mock.patch( - "google.cloud.storage.transfer_manager.download_many" - ) as mock_download_many: - transfer_manager.download_many_to_path( - bucket, - BLOBNAMES, - destination_directory=tempdir, - create_directories=True, - raise_exception=True, - ) - - mock_download_many.assert_called_once_with( - EXPECTED_BLOB_FILE_PAIRS, - download_kwargs=None, - threads=4, - deadline=None, - raise_exception=True, + bucket.blob.assert_any_call(blobname) + + assert os.path.isdir(os.path.join(tempdir, DIR_NAME)) + + +def test_download_chunks_concurrently(): + blob_mock = mock.Mock(spec=Blob) + FILENAME = "file_a.txt" + MULTIPLE = 4 + blob_mock.size = CHUNK_SIZE * MULTIPLE + + blob_mock.download_to_filename.return_value = FAKE_RESULT + + with mock.patch("__main__.open", mock.mock_open()): + result = transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + ) + for x in range(MULTIPLE): + blob_mock.download_to_file.assert_any_call( + mock.ANY, + **DOWNLOAD_KWARGS, + start=x * CHUNK_SIZE, + end=((x + 1) * CHUNK_SIZE) - 1 + ) + assert blob_mock.download_to_file.call_count == 4 + assert result is None + + +def test_download_chunks_concurrently_raises_on_start_and_end(): + blob_mock = mock.Mock(spec=Blob) + FILENAME = "file_a.txt" + MULTIPLE = 4 + blob_mock.size = CHUNK_SIZE * MULTIPLE + + with mock.patch("__main__.open", mock.mock_open()): + with pytest.raises(ValueError): + transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + worker_type=transfer_manager.THREAD, + download_kwargs={ + "start": CHUNK_SIZE, + }, ) - for blobname in BLOBNAMES: - bucket.blob.assert_any_call(blobname) + with pytest.raises(ValueError): + transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + worker_type=transfer_manager.THREAD, + download_kwargs={ + "end": (CHUNK_SIZE * (MULTIPLE - 1)) - 1, + }, + ) + + +def test_download_chunks_concurrently_passes_concurrency_options(): + blob_mock = mock.Mock(spec=Blob) + FILENAME = "file_a.txt" + MAX_WORKERS = 7 + DEADLINE = 10 + MULTIPLE = 4 + blob_mock.size = CHUNK_SIZE * MULTIPLE + + with mock.patch("concurrent.futures.ThreadPoolExecutor") as pool_patch, mock.patch( + "concurrent.futures.wait" + ) as wait_patch, mock.patch("__main__.open", mock.mock_open()): + transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + deadline=DEADLINE, + worker_type=transfer_manager.THREAD, + max_workers=MAX_WORKERS, + ) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) + + +class _PickleableMockBlob: + def __init__( + self, + name="", + size=None, + generation=None, + size_after_reload=None, + generation_after_reload=None, + ): + self.name = name + self.size = size + self.generation = generation + self._size_after_reload = size_after_reload + self._generation_after_reload = generation_after_reload + + def reload(self): + self.size = self._size_after_reload + self.generation = self._generation_after_reload + + def download_to_file(self, *args, **kwargs): + return "SUCCESS" + + +# Used in subprocesses only, so excluded from coverage +def _validate_blob_token_in_subprocess_for_chunk( + maybe_pickled_blob, filename, **kwargs +): # pragma: NO COVER + blob = pickle.loads(maybe_pickled_blob) + assert isinstance(blob, _PickleableMockBlob) + assert filename.startswith("file") + return FAKE_RESULT + + +def test_download_chunks_concurrently_with_processes(): + blob = _PickleableMockBlob( + "file_a_blob", size_after_reload=24, generation_after_reload=100 + ) + FILENAME = "file_a.txt" + + with mock.patch( + "google.cloud.storage.transfer_manager._download_and_write_chunk_in_place", + new=_validate_blob_token_in_subprocess_for_chunk, + ), mock.patch("__main__.open", mock.mock_open()): + result = transfer_manager.download_chunks_concurrently( + blob, + FILENAME, + chunk_size=CHUNK_SIZE, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.PROCESS, + ) + assert result is None + + +def test__LazyClient(): + fake_cache = {} + MOCK_ID = 9999 + with mock.patch( + "google.cloud.storage.transfer_manager._cached_clients", new=fake_cache + ), mock.patch("google.cloud.storage.transfer_manager.Client"): + lazyclient = transfer_manager._LazyClient(MOCK_ID) + lazyclient_cached = transfer_manager._LazyClient(MOCK_ID) + assert lazyclient is lazyclient_cached + assert len(fake_cache) == 1 + + +def test__pickle_blob(): + # This test nominally has coverage, but doesn't assert that the essential + # copyreg behavior in _pickle_blob works. Unfortunately there doesn't seem + # to be a good way to check that without actually creating a Client, which + # will spin up HTTP connections undesirably. This is more fully checked in + # the system tests, though. + pkl = transfer_manager._pickle_blob(FAKE_RESULT) + assert pickle.loads(pkl) == FAKE_RESULT + + +def test__download_and_write_chunk_in_place(): + pickled_mock = pickle.dumps(_PickleableMockBlob()) + FILENAME = "file_a.txt" + with mock.patch("__main__.open", mock.mock_open()): + result = transfer_manager._download_and_write_chunk_in_place( + pickled_mock, FILENAME, 0, 8, {} + ) + assert result == "SUCCESS" + + +def test__get_pool_class_and_requirements_error(): + with pytest.raises(ValueError): + transfer_manager._get_pool_class_and_requirements("garbage") + + +def test__reduce_client(): + fake_cache = {} + client = mock.Mock() + + with mock.patch( + "google.cloud.storage.transfer_manager._cached_clients", new=fake_cache + ), mock.patch("google.cloud.storage.transfer_manager.Client"): + transfer_manager._reduce_client(client) + + +def test__call_method_on_maybe_pickled_blob(): + blob = mock.Mock(spec=Blob) + blob.download_to_file.return_value = "SUCCESS" + result = transfer_manager._call_method_on_maybe_pickled_blob( + blob, "download_to_file" + ) + assert result == "SUCCESS" - assert os.path.isdir(os.path.join(tempdir, DIR_NAME)) + pickled_blob = pickle.dumps(_PickleableMockBlob()) + result = transfer_manager._call_method_on_maybe_pickled_blob( + pickled_blob, "download_to_file" + ) + assert result == "SUCCESS" From 67ba4d5e45b595655cfb6c6440f9662d92adb5cb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 23 Mar 2023 20:50:00 +0000 Subject: [PATCH 149/509] chore(deps): update dependency google-cloud-pubsub to v2.15.1 (#1007) Co-authored-by: cojenco --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 19b0fdc99..15ab153a2 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.15.0 +google-cloud-pubsub==2.15.1 google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.3; python_version >= '3.8' From 0ffb3e23bdba335768196b41914be7af176ea278 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 28 Mar 2023 19:24:33 +0100 Subject: [PATCH 150/509] chore(deps): update dependency google-cloud-pubsub to v2.15.2 (#1009) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 15ab153a2..1e06ff2d2 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.15.1 +google-cloud-pubsub==2.15.2 google-cloud-storage==2.7.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.3; python_version >= '3.8' From 30718322f6c7b1d7a3e4cfd44b6e1796f721b655 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 29 Mar 2023 18:02:43 +0100 Subject: [PATCH 151/509] fix: remove use of deprecated cgi module (#1006) Co-authored-by: Andrew Gorcester --- google/cloud/storage/blob.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 6f4952f44..a6f5222ea 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -18,7 +18,6 @@ """ import base64 -import cgi import copy import hashlib from io import BytesIO @@ -27,6 +26,7 @@ import mimetypes import os import re +from email.parser import HeaderParser from urllib.parse import parse_qsl from urllib.parse import quote from urllib.parse import urlencode @@ -1628,7 +1628,8 @@ def download_as_text( return data.decode(encoding) if self.content_type is not None: - _, params = cgi.parse_header(self.content_type) + msg = HeaderParser().parsestr("Content-Type: " + self.content_type) + params = dict(msg.get_params()[1:]) if "charset" in params: return data.decode(params["charset"]) From 0308a83404f459c2aafee47f69aee2096a8123c0 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 29 Mar 2023 13:08:07 -0700 Subject: [PATCH 152/509] chore: update benchmarking for SSB onboarding (#1001) * tests: add boilerplate for transfer manager profiling * del files * modularize benchmarking scripts * cleanup files * add initial support for cloud monitoring * add cloud monitoring and rearrange tests * update parameter inputs * lint * add range read to w1r3 * update outputs and range reads * refactor results recording and handle failure messages * remove transfer manager profiling, update logging and outputs * update param object_size and parse range * address comments --- tests/perf/README.md | 20 ++- tests/perf/_perf_utils.py | 216 ++++++++++++++++++++++++ tests/perf/benchmarking.py | 327 +++++++++++++------------------------ tests/perf/profile_w1r3.py | 221 +++++++++++++++++++++++++ 4 files changed, 561 insertions(+), 223 deletions(-) create mode 100644 tests/perf/_perf_utils.py create mode 100644 tests/perf/profile_w1r3.py diff --git a/tests/perf/README.md b/tests/perf/README.md index d530b12d9..08e778f51 100644 --- a/tests/perf/README.md +++ b/tests/perf/README.md @@ -18,12 +18,20 @@ $ python3 benchmarking.py --num_samples 10000 --max_size 16384 | Parameter | Description | Possible values | Default | | --------- | ----------- | --------------- |:-------:| -| --min_size | minimum object size in bytes | any positive integer | `5120` (5 KiB) | -| --max_size | maximum object size in bytes | any positive integer | `2147483648` (2 GiB) | -| --num_samples | number of W1R3 iterations | any positive integer | `1000` | -| --r | bucket region for benchmarks | any GCS region | `US` | -| --p | number of processes (multiprocessing enabled) | any positive integer | 16 (recommend not to exceed 16) | -| --o | file to output results to | any file path | `benchmarking.csv` | +| --project | GCP project identifier | a project id| * | +| --api | API to use | only JSON is currently supported in python benchmarking | `JSON` | +| --output_type | output results as csv records or cloud monitoring | `csv`, `cloud-monitoring` | `cloud-monitoring` | +| --object_size | object size in bytes; can be a range min..max | string | `1048576` (1 MiB) | +| --range_read_size | size of the range to read in bytes | any positive integer
<=0 reads the full object | `0` | +| --minimum_read_offset | minimum offset for the start of the range to be read in bytes | any integer >0 | `0` | +| --maximum_read_offset | maximum offset for the start of the range to be read in bytes | any integer >0 | `0` | +| --samples | number of W1R3 iterations | any positive integer | `8000` | +| --bucket | storage bucket name | a bucket name | `pybench` | +| --bucket_region | bucket region for benchmarks | any GCS region | `US-WEST1` | +| --workers | number of processes (multiprocessing enabled) | any positive integer | 16 (recommend not to exceed 16) | +| --test_type | test type to run benchmarking | `w1r3`, `range` | `w1r3` | +| --output_file | file to output results to | any file path | `output_bench.csv` | +| --tmp_dir | temp directory path on file system | any file path | `tm-perf-metrics` | ## Workload definition and CSV headers diff --git a/tests/perf/_perf_utils.py b/tests/perf/_perf_utils.py new file mode 100644 index 000000000..d1e625f8e --- /dev/null +++ b/tests/perf/_perf_utils.py @@ -0,0 +1,216 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Performance benchmarking helper methods. This is not an officially supported Google product.""" + +import csv +import logging +import os +import random +import shutil +import time +import uuid + +from google.cloud import storage + + +##### DEFAULTS & CONSTANTS ##### +HEADER = [ + "Op", + "ObjectSize", + "AppBufferSize", + "LibBufferSize", + "Crc32cEnabled", + "MD5Enabled", + "ApiName", + "ElapsedTimeUs", + "CpuTimeUs", + "Status", +] +CHECKSUM = ["md5", "crc32c", None] +TIMESTAMP = time.strftime("%Y%m%d-%H%M%S") +DEFAULT_API = "JSON" +DEFAULT_BUCKET_NAME = f"pybench{TIMESTAMP}" +DEFAULT_BUCKET_REGION = "US-WEST1" +DEFAULT_OBJECT_RANGE_SIZE_BYTES = "1048576" # 1 MiB +DEFAULT_NUM_SAMPLES = 8000 +DEFAULT_NUM_PROCESSES = 16 +DEFAULT_LIB_BUFFER_SIZE = 104857600 # 100MB +DEFAULT_CHUNKSIZE = 104857600 # 100 MB https://github.com/googleapis/python-storage/blob/main/google/cloud/storage/blob.py#L139 +NOT_SUPPORTED = -1 +DEFAULT_BASE_DIR = "tm-perf-metrics" +DEFAULT_OUTPUT_FILE = f"output_bench{TIMESTAMP}.csv" +DEFAULT_CREATE_SUBDIR_PROBABILITY = 0.1 +SSB_SIZE_THRESHOLD_BYTES = 1048576 + + +##### UTILITY METHODS ##### + + +# Returns a boolean value with the provided probability. +def weighted_random_boolean(create_subdir_probability): + return random.uniform(0.0, 1.0) <= create_subdir_probability + + +# Creates a random file with the given file name, path and size. +def generate_random_file(file_name, file_path, size): + with open(os.path.join(file_path, file_name), "wb") as file_obj: + file_obj.write(os.urandom(size)) + + +# Creates a random directory structure consisting of subdirectories and random files. +# Returns an array of all the generated paths and total size in bytes of all generated files. +def generate_random_directory( + max_objects, + min_file_size, + max_file_size, + base_dir, + create_subdir_probability=DEFAULT_CREATE_SUBDIR_PROBABILITY, +): + directory_info = { + "paths": [], + "total_size_in_bytes": 0, + } + + file_path = base_dir + os.makedirs(file_path, exist_ok=True) + for i in range(max_objects): + if weighted_random_boolean(create_subdir_probability): + file_path = f"{file_path}/{uuid.uuid4().hex}" + os.makedirs(file_path, exist_ok=True) + directory_info["paths"].append(file_path) + else: + file_name = uuid.uuid4().hex + rand_size = random.randint(min_file_size, max_file_size) + generate_random_file(file_name, file_path, rand_size) + directory_info["total_size_in_bytes"] += rand_size + directory_info["paths"].append(os.path.join(file_path, file_name)) + + return directory_info + + +def results_to_csv(res): + results = [] + for metric in HEADER: + results.append(res.get(metric, -1)) + return results + + +def convert_to_csv(filename, results, workers): + with open(filename, "w") as file: + writer = csv.writer(file) + writer.writerow(HEADER) + # Benchmarking main script uses Multiprocessing Pool.map(), + # thus results is structured as List[List[Dict[str, any]]]. + for result in results: + for row in result: + writer.writerow(results_to_csv(row)) + + +def convert_to_cloud_monitoring(bucket_name, results, workers): + # Benchmarking main script uses Multiprocessing Pool.map(), + # thus results is structured as List[List[Dict[str, any]]]. + for result in results: + for res in result: + range_read_size = res.get("RangeReadSize", 0) + object_size = res.get("ObjectSize") + elapsed_time_us = res.get("ElapsedTimeUs") + status = res.get("Status").pop() # convert ["OK"] --> "OK" + + # Handle range reads and calculate throughput using range_read_size. + if range_read_size > 0: + size = range_read_size + else: + size = object_size + + # If size is greater than the defined threshold, report in MiB/s, otherwise report in KiB/s. + if size >= SSB_SIZE_THRESHOLD_BYTES: + throughput = (size / 1024 / 1024) / (elapsed_time_us / 1_000_000) + else: + throughput = (size / 1024) / (elapsed_time_us / 1_000_000) + + cloud_monitoring_output = ( + "throughput{" + + "library=python-storage," + + "api={},".format(res.get("ApiName")) + + "op={},".format(res.get("Op")) + + "workers={},".format(workers) + + "object_size={},".format(object_size) + + "transfer_offset={},".format(res.get("TransferOffset", 0)) + + "transfer_size={},".format(res.get("TransferSize", object_size)) + + "app_buffer_size={},".format(res.get("AppBufferSize")) + + "chunksize={},".format(res.get("TransferSize", object_size)) + + "crc32c_enabled={},".format(res.get("Crc32cEnabled")) + + "md5_enabled={},".format(res.get("MD5Enabled")) + + "cpu_time_us={},".format(res.get("CpuTimeUs")) + + "peer=''," + + f"bucket_name={bucket_name}," + + "retry_count=''," + + f"status={status}" + + "}" + f"{throughput}" + ) + + print(cloud_monitoring_output) + + +def cleanup_directory_tree(directory): + """Clean up directory tree on disk.""" + try: + shutil.rmtree(directory) + except Exception as e: + logging.exception(f"Caught an exception while deleting local directory\n {e}") + + +def cleanup_file(file_path): + """Clean up local file on disk.""" + try: + os.remove(file_path) + except Exception as e: + logging.exception(f"Caught an exception while deleting local file\n {e}") + + +def get_bucket_instance(bucket_name): + client = storage.Client() + bucket = client.bucket(bucket_name) + if not bucket.exists(): + client.create_bucket(bucket) + return bucket + + +def cleanup_bucket(bucket): + # Delete blobs first as the bucket may contain more than 256 blobs. + try: + blobs = bucket.list_blobs() + for blob in blobs: + blob.delete() + except Exception as e: + logging.exception(f"Caught an exception while deleting blobs\n {e}") + # Delete bucket. + try: + bucket.delete(force=True) + except Exception as e: + logging.exception(f"Caught an exception while deleting bucket\n {e}") + + +def get_min_max_size(object_size): + # Object size accepts a single value in bytes or a range in bytes min..max + if object_size.find("..") < 0: + min_size = int(object_size) + max_size = int(object_size) + else: + split_sizes = object_size.split("..") + min_size = int(split_sizes[0]) + max_size = int(split_sizes[1]) + return min_size, max_size diff --git a/tests/perf/benchmarking.py b/tests/perf/benchmarking.py index 2389b00e6..537bacd12 100644 --- a/tests/perf/benchmarking.py +++ b/tests/perf/benchmarking.py @@ -12,262 +12,155 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Performance benchmarking script. This is not an officially supported Google product.""" +"""Performance benchmarking main script. This is not an officially supported Google product.""" import argparse -import csv import logging import multiprocessing -import os -import random -import time -import uuid - -from functools import partial, update_wrapper from google.cloud import storage +import _perf_utils as _pu +import profile_w1r3 as w1r3 -##### DEFAULTS & CONSTANTS ##### -HEADER = [ - "Op", - "ObjectSize", - "AppBufferSize", - "LibBufferSize", - "Crc32cEnabled", - "MD5Enabled", - "ApiName", - "ElapsedTimeUs", - "CpuTimeUs", - "Status", - "RunID", -] -CHECKSUM = ["md5", "crc32c", None] -TIMESTAMP = time.strftime("%Y%m%d-%H%M%S") -DEFAULT_API = "JSON" -DEFAULT_BUCKET_LOCATION = "US" -DEFAULT_MIN_SIZE = 5120 # 5 KiB -DEFAULT_MAX_SIZE = 2147483648 # 2 GiB -DEFAULT_NUM_SAMPLES = 1000 -DEFAULT_NUM_PROCESSES = 16 -DEFAULT_LIB_BUFFER_SIZE = 104857600 # https://github.com/googleapis/python-storage/blob/main/google/cloud/storage/blob.py#L135 -NOT_SUPPORTED = -1 - - -def log_performance(func): - """Log latency and throughput output per operation call.""" - # Holds benchmarking results for each operation - res = { - "ApiName": DEFAULT_API, - "RunID": TIMESTAMP, - "CpuTimeUs": NOT_SUPPORTED, - "AppBufferSize": NOT_SUPPORTED, - "LibBufferSize": DEFAULT_LIB_BUFFER_SIZE, - } - - try: - elapsed_time = func() - except Exception as e: - logging.exception( - f"Caught an exception while running operation {func.__name__}\n {e}" - ) - res["Status"] = ["FAIL"] - elapsed_time = NOT_SUPPORTED - else: - res["Status"] = ["OK"] - - checksum = func.keywords.get("checksum") - num = func.keywords.get("num", None) - res["ElapsedTimeUs"] = elapsed_time - res["ObjectSize"] = func.keywords.get("size") - res["Crc32cEnabled"] = checksum == "crc32c" - res["MD5Enabled"] = checksum == "md5" - res["Op"] = func.__name__ - if res["Op"] == "READ": - res["Op"] += f"[{num}]" - - return [ - res["Op"], - res["ObjectSize"], - res["AppBufferSize"], - res["LibBufferSize"], - res["Crc32cEnabled"], - res["MD5Enabled"], - res["ApiName"], - res["ElapsedTimeUs"], - res["CpuTimeUs"], - res["Status"], - res["RunID"], - ] - - -def WRITE(bucket, blob_name, checksum, size, **kwargs): - """Perform an upload and return latency.""" - blob = bucket.blob(blob_name) - file_path = f"{os.getcwd()}/{uuid.uuid4().hex}" - # Create random file locally on disk - with open(file_path, "wb") as file_obj: - file_obj.write(os.urandom(size)) - - start_time = time.monotonic_ns() - blob.upload_from_filename(file_path, checksum=checksum, if_generation_match=0) - end_time = time.monotonic_ns() - - elapsed_time = round( - (end_time - start_time) / 1000 - ) # convert nanoseconds to microseconds - - # Clean up local file - cleanup_file(file_path) - - return elapsed_time - - -def READ(bucket, blob_name, checksum, **kwargs): - """Perform a download and return latency.""" - blob = bucket.blob(blob_name) - if not blob.exists(): - raise Exception("Blob does not exist. Previous WRITE failed.") - - file_path = f"{os.getcwd()}/{blob_name}" - with open(file_path, "wb") as file_obj: - start_time = time.monotonic_ns() - blob.download_to_file(file_obj, checksum=checksum) - end_time = time.monotonic_ns() - - elapsed_time = round( - (end_time - start_time) / 1000 - ) # convert nanoseconds to microseconds - - # Clean up local file - cleanup_file(file_path) - - return elapsed_time - - -def cleanup_file(file_path): - """Clean up local file on disk.""" - try: - os.remove(file_path) - except Exception as e: - logging.exception(f"Caught an exception while deleting local file\n {e}") - - -def _wrapped_partial(func, *args, **kwargs): - """Helper method to create partial and propagate function name and doc from original function.""" - partial_func = partial(func, *args, **kwargs) - update_wrapper(partial_func, func) - return partial_func - - -def _generate_func_list(bucket_name, min_size, max_size): - """Generate Write-1-Read-3 workload.""" - # generate randmon size in bytes using a uniform distribution - size = random.randrange(min_size, max_size) - blob_name = f"{TIMESTAMP}-{uuid.uuid4().hex}" - - # generate random checksumming type: md5, crc32c or None - idx_checksum = random.choice([0, 1, 2]) - checksum = CHECKSUM[idx_checksum] - - func_list = [ - _wrapped_partial( - WRITE, - storage.Client().bucket(bucket_name), - blob_name, - size=size, - checksum=checksum, - ), - *[ - _wrapped_partial( - READ, - storage.Client().bucket(bucket_name), - blob_name, - size=size, - checksum=checksum, - num=i, - ) - for i in range(3) - ], - ] - return func_list - - -def benchmark_runner(args): - """Run benchmarking iterations.""" - results = [] - for func in _generate_func_list(args.b, args.min_size, args.max_size): - results.append(log_performance(func)) - return results +##### PROFILE BENCHMARKING TEST TYPES ##### +PROFILE_WRITE_ONE_READ_THREE = "w1r3" +PROFILE_RANGE_READ = "range" def main(args): - # Create a storage bucket to run benchmarking - client = storage.Client() - if not client.bucket(args.b).exists(): - bucket = client.create_bucket(args.b, location=args.r) - - # Launch benchmark_runner using multiprocessing - p = multiprocessing.Pool(args.p) - pool_output = p.map(benchmark_runner, [args for _ in range(args.num_samples)]) + logging.info("Start benchmarking main script") + # Create a storage bucket to run benchmarking. + if args.project is not None: + client = storage.Client(project=args.project) + else: + client = storage.Client() + + bucket = client.bucket(args.bucket) + if not bucket.exists(): + bucket = client.create_bucket(bucket, location=args.bucket_region) + + # Define test type and number of processes to run benchmarking. + # Note that transfer manager tests defaults to using 1 process. + num_processes = 1 + test_type = args.test_type + if test_type == PROFILE_WRITE_ONE_READ_THREE: + num_processes = args.workers + benchmark_runner = w1r3.run_profile_w1r3 + logging.info( + f"A total of {num_processes} processes are created to run benchmarking {test_type}" + ) + elif test_type == PROFILE_RANGE_READ: + num_processes = args.workers + benchmark_runner = w1r3.run_profile_range_read + logging.info( + f"A total of {num_processes} processes are created to run benchmarking {test_type}" + ) - # Output to CSV file - with open(args.o, "w") as file: - writer = csv.writer(file) - writer.writerow(HEADER) - for result in pool_output: - for row in result: - writer.writerow(row) - print(f"Succesfully ran benchmarking. Please find your output log at {args.o}") + # Allow multiprocessing to speed up benchmarking tests; Defaults to 1 for no concurrency. + p = multiprocessing.Pool(num_processes) + pool_output = p.map(benchmark_runner, [args for _ in range(args.samples)]) + + # Output to Cloud Monitoring or CSV file. + output_type = args.output_type + if output_type == "cloud-monitoring": + _pu.convert_to_cloud_monitoring(args.bucket, pool_output, num_processes) + elif output_type == "csv": + _pu.convert_to_csv(args.output_file, pool_output, num_processes) + logging.info( + f"Succesfully ran benchmarking. Please find your output log at {args.output_file}" + ) - # Cleanup and delete bucket - try: - bucket.delete(force=True) - except Exception as e: - logging.exception(f"Caught an exception while deleting bucket\n {e}") + # Cleanup and delete blobs. + _pu.cleanup_bucket(bucket) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( - "--min_size", + "--project", + type=str, + default=None, + help="GCP project identifier", + ) + parser.add_argument( + "--api", + type=str, + default="JSON", + help="API to use", + ) + parser.add_argument( + "--test_type", + type=str, + default=PROFILE_WRITE_ONE_READ_THREE, + help="Benchmarking test type", + ) + parser.add_argument( + "--object_size", + type=str, + default=_pu.DEFAULT_OBJECT_RANGE_SIZE_BYTES, + help="Object size in bytes; can be a range min..max", + ) + parser.add_argument( + "--range_read_size", type=int, - default=DEFAULT_MIN_SIZE, - help="Minimum object size in bytes", + default=0, + help="Size of the range to read in bytes", ) parser.add_argument( - "--max_size", + "--minimum_read_offset", type=int, - default=DEFAULT_MAX_SIZE, - help="Maximum object size in bytes", + default=0, + help="Minimum offset for the start of the range to be read in bytes", ) parser.add_argument( - "--num_samples", + "--maximum_read_offset", type=int, - default=DEFAULT_NUM_SAMPLES, - help="Number of iterations", + default=0, + help="Maximum offset for the start of the range to be read in bytes", ) parser.add_argument( - "--p", + "--samples", type=int, - default=DEFAULT_NUM_PROCESSES, + default=_pu.DEFAULT_NUM_SAMPLES, + help="Number of samples to report", + ) + parser.add_argument( + "--workers", + type=int, + default=_pu.DEFAULT_NUM_PROCESSES, help="Number of processes- multiprocessing enabled", ) parser.add_argument( - "--r", type=str, default=DEFAULT_BUCKET_LOCATION, help="Bucket location" + "--bucket", + type=str, + default=_pu.DEFAULT_BUCKET_NAME, + help="Storage bucket name", + ) + parser.add_argument( + "--bucket_region", + type=str, + default=_pu.DEFAULT_BUCKET_REGION, + help="Bucket region", ) parser.add_argument( - "--o", + "--output_type", type=str, - default=f"benchmarking{TIMESTAMP}.csv", + default="cloud-monitoring", + help="Ouput format, csv or cloud-monitoring", + ) + parser.add_argument( + "--output_file", + type=str, + default=_pu.DEFAULT_OUTPUT_FILE, help="File to output results to", ) parser.add_argument( - "--b", + "--tmp_dir", type=str, - default=f"benchmarking{TIMESTAMP}", - help="Storage bucket name", + default=_pu.DEFAULT_BASE_DIR, + help="Temp directory path on file system", ) args = parser.parse_args() diff --git a/tests/perf/profile_w1r3.py b/tests/perf/profile_w1r3.py new file mode 100644 index 000000000..50c8b5c24 --- /dev/null +++ b/tests/perf/profile_w1r3.py @@ -0,0 +1,221 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Workload W1R3 profiling script. This is not an officially supported Google product.""" + +import logging +import os +import random +import time +import uuid + +from functools import partial, update_wrapper + +from google.cloud import storage + +import _perf_utils as _pu + + +def WRITE(bucket, blob_name, checksum, size, args, **kwargs): + """Perform an upload and return latency.""" + blob = bucket.blob(blob_name) + file_path = f"{os.getcwd()}/{uuid.uuid4().hex}" + # Create random file locally on disk + with open(file_path, "wb") as file_obj: + file_obj.write(os.urandom(size)) + + start_time = time.monotonic_ns() + blob.upload_from_filename(file_path, checksum=checksum, if_generation_match=0) + end_time = time.monotonic_ns() + + elapsed_time = round( + (end_time - start_time) / 1000 + ) # convert nanoseconds to microseconds + + # Clean up local file + _pu.cleanup_file(file_path) + + return elapsed_time + + +def READ(bucket, blob_name, checksum, args, **kwargs): + """Perform a download and return latency.""" + blob = bucket.blob(blob_name) + if not blob.exists(): + raise Exception("Blob does not exist. Previous WRITE failed.") + + range_read_size = args.range_read_size + range_read_offset = kwargs.get("range_read_offset") + # Perfor range read if range_read_size is specified, else get full object. + if range_read_size != 0: + start = range_read_offset + end = start + range_read_size - 1 + else: + start = 0 + end = -1 + + file_path = f"{os.getcwd()}/{blob_name}" + with open(file_path, "wb") as file_obj: + start_time = time.monotonic_ns() + blob.download_to_file(file_obj, checksum=checksum, start=start, end=end) + end_time = time.monotonic_ns() + + elapsed_time = round( + (end_time - start_time) / 1000 + ) # convert nanoseconds to microseconds + + # Clean up local file + _pu.cleanup_file(file_path) + + return elapsed_time + + +def _wrapped_partial(func, *args, **kwargs): + """Helper method to create partial and propagate function name and doc from original function.""" + partial_func = partial(func, *args, **kwargs) + update_wrapper(partial_func, func) + return partial_func + + +def _generate_func_list(args): + """Generate Write-1-Read-3 workload.""" + bucket_name = args.bucket + blob_name = f"{_pu.TIMESTAMP}-{uuid.uuid4().hex}" + + # parse min_size and max_size from object_size + min_size, max_size = _pu.get_min_max_size(args.object_size) + # generate randmon size in bytes using a uniform distribution + size = random.randint(min_size, max_size) + + # generate random checksumming type: md5, crc32c or None + idx_checksum = random.choice([0, 1, 2]) + checksum = _pu.CHECKSUM[idx_checksum] + + # generated random read_offset + range_read_offset = random.randint( + args.minimum_read_offset, args.maximum_read_offset + ) + + func_list = [ + _wrapped_partial( + WRITE, + storage.Client().bucket(bucket_name), + blob_name, + size=size, + checksum=checksum, + args=args, + ), + *[ + _wrapped_partial( + READ, + storage.Client().bucket(bucket_name), + blob_name, + size=size, + checksum=checksum, + args=args, + num=i, + range_read_offset=range_read_offset, + ) + for i in range(3) + ], + ] + return func_list + + +def log_performance(func, args, elapsed_time, status, failure_msg): + """Hold benchmarking results per operation call.""" + size = func.keywords.get("size") + checksum = func.keywords.get("checksum", None) + num = func.keywords.get("num", None) + range_read_size = args.range_read_size + + res = { + "Op": func.__name__, + "ElapsedTimeUs": elapsed_time, + "ApiName": args.api, + "RunID": _pu.TIMESTAMP, + "CpuTimeUs": _pu.NOT_SUPPORTED, + "AppBufferSize": _pu.NOT_SUPPORTED, + "LibBufferSize": _pu.DEFAULT_LIB_BUFFER_SIZE, + "ChunkSize": 0, + "ObjectSize": size, + "TransferSize": size, + "TransferOffset": 0, + "RangeReadSize": range_read_size, + "BucketName": args.bucket, + "Library": "python-storage", + "Crc32cEnabled": checksum == "crc32c", + "MD5Enabled": checksum == "md5", + "FailureMsg": failure_msg, + "Status": status, + } + + if res["Op"] == "READ": + res["Op"] += f"[{num}]" + + # For range reads (workload 2), record additional outputs + if range_read_size > 0: + res["TransferSize"] = range_read_size + res["TransferOffset"] = func.keywords.get("range_read_offset", 0) + + return res + + +def run_profile_w1r3(args): + """Run w1r3 benchmarking. This is a wrapper used with the main benchmarking framework.""" + results = [] + + for func in _generate_func_list(args): + failure_msg = "" + try: + elapsed_time = func() + except Exception as e: + failure_msg = ( + f"Caught an exception while running operation {func.__name__}\n {e}" + ) + logging.exception(failure_msg) + status = ["FAIL"] + elapsed_time = _pu.NOT_SUPPORTED + else: + status = ["OK"] + + res = log_performance(func, args, elapsed_time, status, failure_msg) + results.append(res) + + return results + + +def run_profile_range_read(args): + """Run range read W2 benchmarking. This is a wrapper used with the main benchmarking framework.""" + results = [] + + for func in _generate_func_list(args): + failure_msg = "" + try: + elapsed_time = func() + except Exception as e: + failure_msg = ( + f"Caught an exception while running operation {func.__name__}\n {e}" + ) + logging.exception(failure_msg) + status = ["FAIL"] + elapsed_time = _pu.NOT_SUPPORTED + else: + status = ["OK"] + + # Only measure the last read + res = log_performance(func, args, elapsed_time, status, failure_msg) + results.append(res) + + return results From ced29dde12c812a529cca55816a83dddf4c3177d Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 14:16:57 -0700 Subject: [PATCH 153/509] chore(main): release 2.8.0 (#950) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Andrew Gorcester --- CHANGELOG.md | 20 ++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 383ddfed2..4669fb62f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.8.0](https://github.com/googleapis/python-storage/compare/v2.7.0...v2.8.0) (2023-03-29) + + +### Features + +* Add multiprocessing and chunked downloading to transfer manager ([#1002](https://github.com/googleapis/python-storage/issues/1002)) ([e65316b](https://github.com/googleapis/python-storage/commit/e65316b5352a4e15c4dba806e899ad58f8665464)) + + +### Bug Fixes + +* Add trove classifier for python 3.11 ([#971](https://github.com/googleapis/python-storage/issues/971)) ([7886376](https://github.com/googleapis/python-storage/commit/7886376e5105f705a5fe9d061463cf1e033aecd0)) +* Remove use of deprecated cgi module ([#1006](https://github.com/googleapis/python-storage/issues/1006)) ([3071832](https://github.com/googleapis/python-storage/commit/30718322f6c7b1d7a3e4cfd44b6e1796f721b655)) + + +### Documentation + +* Add clarifications to read timeout ([#873](https://github.com/googleapis/python-storage/issues/873)) ([8fb26f4](https://github.com/googleapis/python-storage/commit/8fb26f439cf28ac4ec7a841db1cd0fd60ea77362)) +* Fix c.g.c structure ([#982](https://github.com/googleapis/python-storage/issues/982)) ([d5a2931](https://github.com/googleapis/python-storage/commit/d5a29318b5c68678ea63eb40a4dfede562f8963e)) +* Update c.g.c docs and guides ([#994](https://github.com/googleapis/python-storage/issues/994)) ([62b4a50](https://github.com/googleapis/python-storage/commit/62b4a500e40860c54c53d12323434d28739f9812)) + ## [2.7.0](https://github.com/googleapis/python-storage/compare/v2.6.0...v2.7.0) (2022-12-07) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index d962613e0..0a9aecb37 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.7.0" +__version__ = "2.8.0" From 6b3e712f29211974449df216a0fc02380631821b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 30 Mar 2023 18:41:51 +0100 Subject: [PATCH 154/509] chore(deps): update dependency google-cloud-storage to v2.8.0 (#1011) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 1e06ff2d2..ae3bfecf5 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.15.2 -google-cloud-storage==2.7.0 +google-cloud-storage==2.8.0 pandas===1.3.5; python_version == '3.7' pandas==1.5.3; python_version >= '3.8' From ff88213733f3fb05b40a4ebadc42a3b9c51c66b2 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 12 Apr 2023 22:21:03 +0100 Subject: [PATCH 155/509] chore(deps): update all dependencies (#1015) --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 2e805e1f8..be69289c1 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.2.2 +pytest==7.3.0 mock==5.0.1 backoff==2.2.1 \ No newline at end of file diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index ae3bfecf5..3c3f29db9 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.15.2 +google-cloud-pubsub==2.16.0 google-cloud-storage==2.8.0 pandas===1.3.5; python_version == '3.7' -pandas==1.5.3; python_version >= '3.8' +pandas==2.0.0; python_version >= '3.8' From d29df0479eb1e2eb1cf9c087296cf9864c171086 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 14 Apr 2023 12:40:21 -0700 Subject: [PATCH 156/509] chore: surface errors in SSB with non zero exit code (#1017) --- tests/perf/README.md | 4 ++-- tests/perf/_perf_utils.py | 20 +++++++++++++++++++- tests/perf/benchmarking.py | 13 ++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/tests/perf/README.md b/tests/perf/README.md index 08e778f51..995f1b04a 100644 --- a/tests/perf/README.md +++ b/tests/perf/README.md @@ -6,12 +6,12 @@ This benchmarking script is used by Storage client library maintainers to benchm Currently the benchmarking runs a Write-1-Read-3 workload and measures the usual two QoS performance attributes, latency and throughput. ## Run example: -This runs 10K iterations of Write-1-Read-3 on 5KiB to 16KiB files, and generates output to a default csv file `benchmarking.csv`: +This runs 10K iterations of Write-1-Read-3 on 5KiB to 16KiB files, and generates output to a default csv file `output_bench.csv`: ```bash $ cd python-storage $ pip install -e . # install google.cloud.storage locally $ cd tests/perf -$ python3 benchmarking.py --num_samples 10000 --max_size 16384 +$ python3 benchmarking.py --num_samples 10000 --object_size 5120..16384 --output_type csv ``` ## CLI parameters diff --git a/tests/perf/_perf_utils.py b/tests/perf/_perf_utils.py index d1e625f8e..6ec9bc457 100644 --- a/tests/perf/_perf_utils.py +++ b/tests/perf/_perf_utils.py @@ -123,10 +123,14 @@ def convert_to_cloud_monitoring(bucket_name, results, workers): # thus results is structured as List[List[Dict[str, any]]]. for result in results: for res in result: + # Only output successful benchmarking runs to cloud monitoring. + status = res.get("Status").pop() # convert ["OK"] --> "OK" + if status != "OK": + continue + range_read_size = res.get("RangeReadSize", 0) object_size = res.get("ObjectSize") elapsed_time_us = res.get("ElapsedTimeUs") - status = res.get("Status").pop() # convert ["OK"] --> "OK" # Handle range reads and calculate throughput using range_read_size. if range_read_size > 0: @@ -214,3 +218,17 @@ def get_min_max_size(object_size): min_size = int(split_sizes[0]) max_size = int(split_sizes[1]) return min_size, max_size + + +class logCount(logging.Handler): + class LogType: + def __init__(self): + self.errors = 0 + + def __init__(self): + super().__init__() + self.count = self.LogType() + + def emit(self, record): + if record.levelname == "ERROR": + self.count.errors += 1 diff --git a/tests/perf/benchmarking.py b/tests/perf/benchmarking.py index 537bacd12..cedb984f0 100644 --- a/tests/perf/benchmarking.py +++ b/tests/perf/benchmarking.py @@ -17,6 +17,7 @@ import argparse import logging import multiprocessing +import sys from google.cloud import storage @@ -30,7 +31,13 @@ def main(args): - logging.info("Start benchmarking main script") + # Track error logging for BBMC reporting. + counter = _pu.logCount() + logging.basicConfig( + level=logging.ERROR, + handlers=[counter, logging.StreamHandler(sys.stderr)], + ) + # Create a storage bucket to run benchmarking. if args.project is not None: client = storage.Client(project=args.project) @@ -75,6 +82,10 @@ def main(args): # Cleanup and delete blobs. _pu.cleanup_bucket(bucket) + # BBMC will not surface errors unless the process is terminated with a non zero code. + if counter.count.errors != 0: + sys.exit(1) + if __name__ == "__main__": parser = argparse.ArgumentParser() From a13b8336d3752aad4eaf5e82a154be82fca5475f Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 18 Apr 2023 19:00:14 +0200 Subject: [PATCH 157/509] chore(deps): update dependency pytest to v7.3.1 (#1018) Co-authored-by: cojenco --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index be69289c1..4358edb87 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.3.0 +pytest==7.3.1 mock==5.0.1 backoff==2.2.1 \ No newline at end of file From 1a33a6cf37031c5612719b383f4cc6997ab275c3 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 19 Apr 2023 15:44:28 +0200 Subject: [PATCH 158/509] chore(deps): update dependency mock to v5.0.2 (#1019) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 4358edb87..0068826c5 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.3.1 -mock==5.0.1 +mock==5.0.2 backoff==2.2.1 \ No newline at end of file From 47228ece780b31ae47b05297109d38674950312a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 26 Apr 2023 19:40:39 +0200 Subject: [PATCH 159/509] chore(deps): update dependency pandas to v2.0.1 (#1021) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 3c3f29db9..c55ebd518 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.16.0 google-cloud-storage==2.8.0 pandas===1.3.5; python_version == '3.7' -pandas==2.0.0; python_version >= '3.8' +pandas==2.0.1; python_version >= '3.8' From aa4f282514ebdaf58ced0743859a4ab1458f967c Mon Sep 17 00:00:00 2001 From: MiaCY <97990237+MiaCY@users.noreply.github.com> Date: Thu, 27 Apr 2023 13:23:10 -0700 Subject: [PATCH 160/509] feat: un-deprecate blob.download_to_file(), bucket.create(), and bucket.list_blobs() (#1013) Long-term plans to deprecate and remove these methods have changed. Co-authored-by: Andrew Gorcester --- google/cloud/storage/blob.py | 2 +- google/cloud/storage/bucket.py | 16 ++-------------- tests/unit/test_bucket.py | 20 ++------------------ 3 files changed, 5 insertions(+), 33 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index a6f5222ea..8a3f61c72 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -1024,7 +1024,7 @@ def download_to_file( checksum="md5", retry=DEFAULT_RETRY, ): - """DEPRECATED. Download the contents of this blob into a file-like object. + """Download the contents of this blob into a file-like object. .. note:: diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index a2783fb74..ea52f3b5e 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -922,10 +922,7 @@ def create( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): - """DEPRECATED. Creates current bucket. - - .. note:: - Direct use of this method is deprecated. Use ``Client.create_bucket()`` instead. + """Creates current bucket. If the bucket already exists, will raise :class:`google.cloud.exceptions.Conflict`. @@ -970,12 +967,6 @@ def create( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` """ - warnings.warn( - "Bucket.create() is deprecated and will be removed in future." - "Use Client.create_bucket() instead.", - PendingDeprecationWarning, - stacklevel=1, - ) client = self._require_client(client) client.create_bucket( @@ -1300,10 +1291,7 @@ def list_blobs( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): - """DEPRECATED. Return an iterator used to find blobs in the bucket. - - .. note:: - Direct use of this method is deprecated. Use ``Client.list_blobs`` instead. + """Return an iterator used to find blobs in the bucket. If :attr:`user_project` is set, bills the API request to that project. diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 8f4daeb1d..15f6356f7 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2946,8 +2946,7 @@ def test_versioning_enabled_getter(self): bucket = self._make_one(name=NAME, properties=before) self.assertEqual(bucket.versioning_enabled, True) - @mock.patch("warnings.warn") - def test_create_w_defaults_deprecated(self, mock_warn): + def test_create_w_defaults(self): bucket_name = "bucket-name" api_response = {"name": bucket_name} client = mock.Mock(spec=["create_bucket"]) @@ -2967,15 +2966,7 @@ def test_create_w_defaults_deprecated(self, mock_warn): retry=DEFAULT_RETRY, ) - mock_warn.assert_called_with( - "Bucket.create() is deprecated and will be removed in future." - "Use Client.create_bucket() instead.", - PendingDeprecationWarning, - stacklevel=1, - ) - - @mock.patch("warnings.warn") - def test_create_w_explicit_deprecated(self, mock_warn): + def test_create_w_explicit(self): project = "PROJECT" location = "eu" user_project = "USER_PROJECT" @@ -3011,13 +3002,6 @@ def test_create_w_explicit_deprecated(self, mock_warn): retry=retry, ) - mock_warn.assert_called_with( - "Bucket.create() is deprecated and will be removed in future." - "Use Client.create_bucket() instead.", - PendingDeprecationWarning, - stacklevel=1, - ) - def test_versioning_enabled_setter(self): NAME = "name" bucket = self._make_one(name=NAME) From 892481a2c76fe5747ada3392345c087fb7f8bd8a Mon Sep 17 00:00:00 2001 From: Sam Stoelinga Date: Fri, 28 Apr 2023 15:12:53 -0700 Subject: [PATCH 161/509] fix: Improve test error message for missing credentials (#1024) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve test error message for missing credentials See relevant issue #1023 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Andrew Gorcester Co-authored-by: Owl Bot --- noxfile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 3b67a5712..7ee4a2796 100644 --- a/noxfile.py +++ b/noxfile.py @@ -119,7 +119,9 @@ def system(session): session.skip("RUN_SYSTEM_TESTS is set to false, skipping") # Environment check: Only run tests if the environment variable is set. if not os.environ.get("GOOGLE_APPLICATION_CREDENTIALS", ""): - session.skip("Credentials must be set via environment variable") + session.skip( + "Credentials must be set via environment variable GOOGLE_APPLICATION_CREDENTIALS" + ) # mTLS tests requires pyopenssl. if os.environ.get("GOOGLE_API_USE_CLIENT_CERTIFICATE", "") == "true": session.install("pyopenssl") From 7935824049e2e6e430d2e601156730d6366c78f7 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 1 May 2023 10:29:01 -0700 Subject: [PATCH 162/509] fix: Avoid pickling processed credentials (#1016) --- google/cloud/storage/client.py | 3 ++- google/cloud/storage/transfer_manager.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 796f1c654..bcb0b59ef 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -130,10 +130,11 @@ def __init__( if project is _marker: project = None - # Save the initial value of client_info and client_options before they + # Save the initial value of constructor arguments before they # are passed along, for use in __reduce__ defined elsewhere. self._initial_client_info = client_info self._initial_client_options = client_options + self._initial_credentials = credentials kw_args = {"client_info": client_info} diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 8de9c6c7b..0b65702d4 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -879,7 +879,7 @@ def _reduce_client(cl): client_object_id = id(cl) project = cl.project - credentials = cl._credentials + credentials = cl._initial_credentials _http = None # Can't carry this over client_info = cl._initial_client_info client_options = cl._initial_client_options From 6532e7cdc7cd18456453a37a7593974f334b943c Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 2 May 2023 13:13:41 -0700 Subject: [PATCH 163/509] chore: update samples testing and readme (#1022) * chore: update samples testing and readme * update version --------- Co-authored-by: Andrew Gorcester --- samples/README.md | 114 +++++++++++++----------- samples/snippets/requester_pays_test.py | 6 ++ samples/snippets/snippets_test.py | 2 +- 3 files changed, 70 insertions(+), 52 deletions(-) diff --git a/samples/README.md b/samples/README.md index 173b60eae..490af710a 100644 --- a/samples/README.md +++ b/samples/README.md @@ -41,6 +41,69 @@ for more detailed instructions. pip install -r requirements.txt ``` + +## Running tests locally + +Before running the tests, make sure you've followed the steps outlined in +[Setup](#setup). + +### Install nox + +We use [nox](https://nox.readthedocs.io/en/latest/) to instrument our tests. + +``` +pip install nox +``` + +### Set environment variables + +You can run tests locally using your own gcs project or with a valid service account in project `python-docs-samples-tests`. This outlines the workflow of running tests locally using your own gcs project. + +Refer to [`noxfile_config.py`](https://github.com/googleapis/python-storage/blob/main/samples/snippets/noxfile_config.py) and [a list of environment variables](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/testing/test-env.tmpl.sh) that can be set manually. Not every test needs all of these variables. +Below outlines some common environment variables used in the storage samples. +See [Other Resources](#other-resources) on how to create credentials, keys, and secrets. + + export GOOGLE_CLOUD_PROJECT=[your-project-name] + export MAIN_GOOGLE_CLOUD_PROJECT=[your-project-name] + export BUILD_SPECIFIC_GCLOUD_PROJECT=[your-project-name] + export HMAC_KEY_TEST_SERVICE_ACCOUNT=[your-service-account] + export CLOUD_KMS_KEY=[your-kms-key] + export GOOGLE_APPLICATION_CREDENTIALS=[your-credentials] + +If you are running a single test locally that does not use the environment variables, you can delete the `noxfile_config.py` file and simply set your `GOOGLE_CLOUD_PROJECT` + +``` +export GOOGLE_CLOUD_PROJECT=[your-project-name] +``` + + +### Run tests with nox +``` +nox -s lint +nox -s py-3.9 -- snippets_test.py +nox -s py-3.9 -- snippets_test.py::test_list_blobs +``` + +### Special test configurations +There are restrictions on the testing projects used in Kokoro. For instance, +we change the service account based on different test sessions to avoid +hitting the maximum limit of HMAC keys on a single service account. +Another example is `requester_pays_test.py` needs to use a different Storage bucket, and looks for an environment variable `REQUESTER_PAYS_TEST_BUCKET`. +Please refer to [`noxfile_config.py`](https://github.com/googleapis/python-storage/blob/main/samples/snippets/noxfile_config.py) , [kokoro configs](https://github.com/googleapis/python-storage/tree/main/.kokoro/samples), and test files to see if there are special test configurations required. + + +## Other Resources +* [Create Cloud KMS Keys](https://cloud.google.com/kms/docs/creating-keys) +* [Create HMAC Keys](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) +* [Create Service Accounts](https://cloud.google.com/docs/authentication/getting-started#creating_a_service_account) + +[shell_img]: https://gstatic.com/cloudssh/images/open-btn.png +[shell_link]: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/README.md +[product-docs]: https://cloud.google.com/storage + + +----- + ## Samples
List of Samples @@ -1110,54 +1173,3 @@ View the [source code](https://github.com/googleapis/python-storage/blob/main/sa `python storage_view_bucket_iam_members.py ` ------ - -## Running tests locally - -Before running the tests, make sure you've followed the steps outlined in -[Setup](#setup). - -### Install nox -``` -pip install nox -``` - -### Set environment variables - -You can run tests locally using your own gcs project or with a valid service account in project `python-docs-samples-tests`. This outlines the workflow of running tests locally using your own gcs project. - -Refer to [`noxfile_config.py`](https://github.com/googleapis/python-storage/blob/main/samples/snippets/noxfile_config.py) and [a list of environment variables](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/testing/test-env.tmpl.sh) that can be set manually. Not every test needs all of these variables. -The common environment variables used in the storage samples include: - - export GOOGLE_CLOUD_PROJECT=[your-project-name] - export MAIN_GOOGLE_CLOUD_PROJECT=[your-project-name] - export BUILD_SPECIFIC_GCLOUD_PROJECT=[your-project-name] - export HMAC_KEY_TEST_SERVICE_ACCOUNT=[your-service-account] - export CLOUD_KMS_KEY=[your-kms-key] - export GOOGLE_APPLICATION_CREDENTIALS=[your-credentials] - -See [Other Resources](#other-resources) on how to create credentials, keys, and secrets - -### Run tests with nox -``` -nox -s lint -nox -s py-3.7 -- snippets_test.py -nox -s py-3.7 -- snippets_test.py::test_list_blobs -``` - -### Special test configurations -There are restrictions on the testing projects used in Kokoro. For instance, -we change the service account based on different test sessions to avoid -hitting the maximum limit of HMAC keys on a single service account. -Another example is `requester_pays_test.py` needs to use a different Storage bucket, and looks for an environment variable `REQUESTER_PAYS_TEST_BUCKET`. -Please refer to [`noxfile_config.py`](https://github.com/googleapis/python-storage/blob/main/samples/snippets/noxfile_config.py) , [kokoro configs](https://github.com/googleapis/python-storage/tree/main/.kokoro/samples), and test files to see if there are special test configurations required. - - -### Other Resources -* [Create Cloud KMS Keys](https://cloud.google.com/kms/docs/creating-keys) -* [Create HMAC Keys](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) -* [Create Service Accounts](https://cloud.google.com/docs/authentication/getting-started#creating_a_service_account) - -[shell_img]: https://gstatic.com/cloudssh/images/open-btn.png -[shell_link]: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/python-storage&page=editor&open_in_editor=samples/README.md -[product-docs]: https://cloud.google.com/storage \ No newline at end of file diff --git a/samples/snippets/requester_pays_test.py b/samples/snippets/requester_pays_test.py index cf8c2d097..4bef0cb89 100644 --- a/samples/snippets/requester_pays_test.py +++ b/samples/snippets/requester_pays_test.py @@ -12,9 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +import backoff import os import tempfile +from google.api_core.exceptions import GoogleAPIError from google.cloud import storage import pytest @@ -31,18 +33,21 @@ PROJECT = os.environ["GOOGLE_CLOUD_PROJECT"] +@backoff.on_exception(backoff.expo, GoogleAPIError, max_time=60) def test_enable_requester_pays(capsys): storage_enable_requester_pays.enable_requester_pays(BUCKET) out, _ = capsys.readouterr() assert f"Requester Pays has been enabled for {BUCKET}" in out +@backoff.on_exception(backoff.expo, GoogleAPIError, max_time=60) def test_disable_requester_pays(capsys): storage_disable_requester_pays.disable_requester_pays(BUCKET) out, _ = capsys.readouterr() assert f"Requester Pays has been disabled for {BUCKET}" in out +@backoff.on_exception(backoff.expo, GoogleAPIError, max_time=60) def test_get_requester_pays_status(capsys): storage_get_requester_pays_status.get_requester_pays_status(BUCKET) out, _ = capsys.readouterr() @@ -58,6 +63,7 @@ def test_blob(): return blob +@backoff.on_exception(backoff.expo, GoogleAPIError, max_time=60) def test_download_file_requester_pays(test_blob, capsys): with tempfile.NamedTemporaryFile() as dest_file: storage_download_file_requester_pays.download_file_requester_pays( diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 57751be60..ee6f790f2 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -78,7 +78,7 @@ import storage_upload_from_stream import storage_upload_with_kms_key -KMS_KEY = os.environ["CLOUD_KMS_KEY"] +KMS_KEY = os.environ.get("CLOUD_KMS_KEY") def test_enable_default_kms_key(test_bucket): From 4698799101b5847d55edc8267db85257a74c3119 Mon Sep 17 00:00:00 2001 From: MiaCY <97990237+MiaCY@users.noreply.github.com> Date: Tue, 2 May 2023 14:41:01 -0700 Subject: [PATCH 164/509] docs: add sample and sample test for transfer manager (#1027) * add sample and sample test for transfer manager download blob as chunks concurrently method * chore: modify format for int * chore: refactor transfer manager sample names and tests --------- Co-authored-by: Andrew Gorcester --- samples/snippets/snippets_test.py | 34 +++- samples/snippets/storage_transfer_manager.py | 184 ------------------ ...age_transfer_manager_download_all_blobs.py | 65 +++++++ ...er_manager_download_chunks_concurrently.py | 44 +++++ ...orage_transfer_manager_upload_directory.py | 79 ++++++++ ...rage_transfer_manager_upload_many_blobs.py | 66 +++++++ 6 files changed, 284 insertions(+), 188 deletions(-) delete mode 100644 samples/snippets/storage_transfer_manager.py create mode 100644 samples/snippets/storage_transfer_manager_download_all_blobs.py create mode 100644 samples/snippets/storage_transfer_manager_download_chunks_concurrently.py create mode 100644 samples/snippets/storage_transfer_manager_upload_directory.py create mode 100644 samples/snippets/storage_transfer_manager_upload_many_blobs.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index ee6f790f2..6be8e1767 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -72,7 +72,10 @@ import storage_set_bucket_default_kms_key import storage_set_client_endpoint import storage_set_metadata -import storage_transfer_manager +import storage_transfer_manager_download_all_blobs +import storage_transfer_manager_download_chunks_concurrently +import storage_transfer_manager_upload_directory +import storage_transfer_manager_upload_many_blobs import storage_upload_file import storage_upload_from_memory import storage_upload_from_stream @@ -686,7 +689,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): with open(os.path.join(uploads, name), "w") as f: f.write(name) - storage_transfer_manager.upload_many_blobs_with_transfer_manager( + storage_transfer_manager_upload_many_blobs.upload_many_blobs_with_transfer_manager( test_bucket.name, BLOB_NAMES, source_directory="{}/".format(uploads), @@ -699,7 +702,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): with tempfile.TemporaryDirectory() as downloads: # Download the files. - storage_transfer_manager.download_all_blobs_with_transfer_manager( + storage_transfer_manager_download_all_blobs.download_all_blobs_with_transfer_manager( test_bucket.name, destination_directory=os.path.join(downloads, ""), threads=2, @@ -729,7 +732,7 @@ def test_transfer_manager_directory_upload(test_bucket, capsys): with open(os.path.join(uploads, name), "w") as f: f.write(name) - storage_transfer_manager.upload_directory_with_transfer_manager( + storage_transfer_manager_upload_directory.upload_directory_with_transfer_manager( test_bucket.name, source_directory="{}/".format(uploads) ) out, _ = capsys.readouterr() @@ -737,3 +740,26 @@ def test_transfer_manager_directory_upload(test_bucket, capsys): assert "Found {}".format(len(BLOB_NAMES)) in out for name in BLOB_NAMES: assert "Uploaded {}".format(name) in out + + +def test_transfer_manager_download_chunks_concurrently(test_bucket, capsys): + BLOB_NAME = "test_file.txt" + + with tempfile.NamedTemporaryFile() as file: + file.write(b"test") + + storage_upload_file.upload_blob( + test_bucket.name, file.name, BLOB_NAME + ) + + with tempfile.TemporaryDirectory() as downloads: + # Download the file. + storage_transfer_manager_download_chunks_concurrently.download_chunks_concurrently( + test_bucket.name, + BLOB_NAME, + os.path.join(downloads, BLOB_NAME), + processes=8, + ) + out, _ = capsys.readouterr() + + assert "Downloaded {} to {}".format(BLOB_NAME, os.path.join(downloads, BLOB_NAME)) in out diff --git a/samples/snippets/storage_transfer_manager.py b/samples/snippets/storage_transfer_manager.py deleted file mode 100644 index 0a02b96e3..000000000 --- a/samples/snippets/storage_transfer_manager.py +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the 'License'); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -def upload_many_blobs_with_transfer_manager( - bucket_name, filenames, source_directory="", threads=4 -): - """Upload every file in a list to a bucket, concurrently in a thread pool. - - Each blob name is derived from the filename, not including the - `source_directory` parameter. For complete control of the blob name for each - file (and other aspects of individual blob metadata), use - transfer_manager.upload_many() instead. - """ - - # The ID of your GCS bucket - # bucket_name = "your-bucket-name" - - # A list (or other iterable) of filenames to upload. - # filenames = ["file_1.txt", "file_2.txt"] - - # The directory on your computer that is the root of all of the files in the - # list of filenames. This string is prepended (with os.path.join()) to each - # filename to get the full path to the file. Relative paths and absolute - # paths are both accepted. This string is not included in the name of the - # uploaded blob; it is only used to find the source files. An empty string - # means "the current working directory". Note that this parameter allows - # directory traversal (e.g. "/", "../") and is not intended for unsanitized - # end user input. - # source_directory="" - - # The number of threads to use for the operation. The performance impact of - # this value depends on the use case, but generally, smaller files benefit - # from more threads and larger files don't benefit from more threads. Too - # many threads can slow operations, especially with large files, due to - # contention over the Python GIL. - # threads=4 - - from google.cloud.storage import Client, transfer_manager - - storage_client = Client() - bucket = storage_client.bucket(bucket_name) - - results = transfer_manager.upload_many_from_filenames( - bucket, filenames, source_directory=source_directory, threads=threads - ) - - for name, result in zip(filenames, results): - # The results list is either `None` or an exception for each filename in - # the input list, in order. - - if isinstance(result, Exception): - print("Failed to upload {} due to exception: {}".format(name, result)) - else: - print("Uploaded {} to {}.".format(name, bucket.name)) - - -def upload_directory_with_transfer_manager(bucket_name, source_directory, threads=4): - """Upload every file in a directory, including all files in subdirectories. - - Each blob name is derived from the filename, not including the `directory` - parameter itself. For complete control of the blob name for each file (and - other aspects of individual blob metadata), use - transfer_manager.upload_many() instead. - """ - - # The ID of your GCS bucket - # bucket_name = "your-bucket-name" - - # The directory on your computer to upload. Files in the directory and its - # subdirectories will be uploaded. An empty string means "the current - # working directory". - # source_directory="" - - # The number of threads to use for the operation. The performance impact of - # this value depends on the use case, but generally, smaller files benefit - # from more threads and larger files don't benefit from more threads. Too - # many threads can slow operations, especially with large files, due to - # contention over the Python GIL. - # threads=4 - - from pathlib import Path - - from google.cloud.storage import Client, transfer_manager - - storage_client = Client() - bucket = storage_client.bucket(bucket_name) - - # Generate a list of paths (in string form) relative to the `directory`. - # This can be done in a single list comprehension, but is expanded into - # multiple lines here for clarity. - - # First, recursively get all files in `directory` as Path objects. - directory_as_path_obj = Path(source_directory) - paths = directory_as_path_obj.rglob("*") - - # Filter so the list only includes files, not directories themselves. - file_paths = [path for path in paths if path.is_file()] - - # These paths are relative to the current working directory. Next, make them - # relative to `directory` - relative_paths = [path.relative_to(source_directory) for path in file_paths] - - # Finally, convert them all to strings. - string_paths = [str(path) for path in relative_paths] - - print("Found {} files.".format(len(string_paths))) - - # Start the upload. - results = transfer_manager.upload_many_from_filenames( - bucket, string_paths, source_directory=source_directory, threads=threads - ) - - for name, result in zip(string_paths, results): - # The results list is either `None` or an exception for each filename in - # the input list, in order. - - if isinstance(result, Exception): - print("Failed to upload {} due to exception: {}".format(name, result)) - else: - print("Uploaded {} to {}.".format(name, bucket.name)) - - -def download_all_blobs_with_transfer_manager( - bucket_name, destination_directory="", threads=4 -): - """Download all of the blobs in a bucket, concurrently in a thread pool. - - The filename of each blob once downloaded is derived from the blob name and - the `destination_directory `parameter. For complete control of the filename - of each blob, use transfer_manager.download_many() instead. - - Directories will be created automatically as needed, for instance to - accommodate blob names that include slashes. - """ - - # The ID of your GCS bucket - # bucket_name = "your-bucket-name" - - # The directory on your computer to which to download all of the files. This - # string is prepended (with os.path.join()) to the name of each blob to form - # the full path. Relative paths and absolute paths are both accepted. An - # empty string means "the current working directory". Note that this - # parameter allows accepts directory traversal ("../" etc.) and is not - # intended for unsanitized end user input. - # destination_directory = "" - - # The number of threads to use for the operation. The performance impact of - # this value depends on the use case, but generally, smaller files benefit - # from more threads and larger files don't benefit from more threads. Too - # many threads can slow operations, especially with large files, due to - # contention over the Python GIL. - # threads=4 - - from google.cloud.storage import Client, transfer_manager - - storage_client = Client() - bucket = storage_client.bucket(bucket_name) - - blob_names = [blob.name for blob in bucket.list_blobs()] - - results = transfer_manager.download_many_to_path( - bucket, blob_names, destination_directory=destination_directory, threads=threads - ) - - for name, result in zip(blob_names, results): - # The results list is either `None` or an exception for each blob in - # the input list, in order. - - if isinstance(result, Exception): - print("Failed to download {} due to exception: {}".format(name, result)) - else: - print("Downloaded {} to {}.".format(name, destination_directory + name)) diff --git a/samples/snippets/storage_transfer_manager_download_all_blobs.py b/samples/snippets/storage_transfer_manager_download_all_blobs.py new file mode 100644 index 000000000..b07739d20 --- /dev/null +++ b/samples/snippets/storage_transfer_manager_download_all_blobs.py @@ -0,0 +1,65 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def download_all_blobs_with_transfer_manager( + bucket_name, destination_directory="", threads=4 +): + """Download all of the blobs in a bucket, concurrently in a thread pool. + + The filename of each blob once downloaded is derived from the blob name and + the `destination_directory `parameter. For complete control of the filename + of each blob, use transfer_manager.download_many() instead. + + Directories will be created automatically as needed, for instance to + accommodate blob names that include slashes. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The directory on your computer to which to download all of the files. This + # string is prepended (with os.path.join()) to the name of each blob to form + # the full path. Relative paths and absolute paths are both accepted. An + # empty string means "the current working directory". Note that this + # parameter allows accepts directory traversal ("../" etc.) and is not + # intended for unsanitized end user input. + # destination_directory = "" + + # The number of threads to use for the operation. The performance impact of + # this value depends on the use case, but generally, smaller files benefit + # from more threads and larger files don't benefit from more threads. Too + # many threads can slow operations, especially with large files, due to + # contention over the Python GIL. + # threads=4 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + blob_names = [blob.name for blob in bucket.list_blobs()] + + results = transfer_manager.download_many_to_path( + bucket, blob_names, destination_directory=destination_directory, threads=threads + ) + + for name, result in zip(blob_names, results): + # The results list is either `None` or an exception for each blob in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to download {} due to exception: {}".format(name, result)) + else: + print("Downloaded {} to {}.".format(name, destination_directory + name)) diff --git a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py new file mode 100644 index 000000000..633c5ae65 --- /dev/null +++ b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py @@ -0,0 +1,44 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): + """Download a single file in chunks, concurrently.""" + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The file to be downloaded + # blob_name = "target-file" + + # The destination filename or path + # filename = "" + + # The maximum number of worker processes that should be used to handle the + # workload of downloading the blob concurrently. PROCESS worker type uses more + # system resources (both memory and CPU) and can result in faster operations + # when working with large files. The optimal number of workers depends heavily + # on the specific use case. Refer to the docstring of the underlining method + # for more details. + # processes=8 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(blob_name) + + transfer_manager.download_chunks_concurrently(blob, filename, max_workers=processes) + + print("Downloaded {} to {}.".format(blob_name, filename)) diff --git a/samples/snippets/storage_transfer_manager_upload_directory.py b/samples/snippets/storage_transfer_manager_upload_directory.py new file mode 100644 index 000000000..6f5171c54 --- /dev/null +++ b/samples/snippets/storage_transfer_manager_upload_directory.py @@ -0,0 +1,79 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def upload_directory_with_transfer_manager(bucket_name, source_directory, threads=4): + """Upload every file in a directory, including all files in subdirectories. + + Each blob name is derived from the filename, not including the `directory` + parameter itself. For complete control of the blob name for each file (and + other aspects of individual blob metadata), use + transfer_manager.upload_many() instead. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The directory on your computer to upload. Files in the directory and its + # subdirectories will be uploaded. An empty string means "the current + # working directory". + # source_directory="" + + # The number of threads to use for the operation. The performance impact of + # this value depends on the use case, but generally, smaller files benefit + # from more threads and larger files don't benefit from more threads. Too + # many threads can slow operations, especially with large files, due to + # contention over the Python GIL. + # threads=4 + + from pathlib import Path + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + # Generate a list of paths (in string form) relative to the `directory`. + # This can be done in a single list comprehension, but is expanded into + # multiple lines here for clarity. + + # First, recursively get all files in `directory` as Path objects. + directory_as_path_obj = Path(source_directory) + paths = directory_as_path_obj.rglob("*") + + # Filter so the list only includes files, not directories themselves. + file_paths = [path for path in paths if path.is_file()] + + # These paths are relative to the current working directory. Next, make them + # relative to `directory` + relative_paths = [path.relative_to(source_directory) for path in file_paths] + + # Finally, convert them all to strings. + string_paths = [str(path) for path in relative_paths] + + print("Found {} files.".format(len(string_paths))) + + # Start the upload. + results = transfer_manager.upload_many_from_filenames( + bucket, string_paths, source_directory=source_directory, threads=threads + ) + + for name, result in zip(string_paths, results): + # The results list is either `None` or an exception for each filename in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to upload {} due to exception: {}".format(name, result)) + else: + print("Uploaded {} to {}.".format(name, bucket.name)) diff --git a/samples/snippets/storage_transfer_manager_upload_many_blobs.py b/samples/snippets/storage_transfer_manager_upload_many_blobs.py new file mode 100644 index 000000000..995571b22 --- /dev/null +++ b/samples/snippets/storage_transfer_manager_upload_many_blobs.py @@ -0,0 +1,66 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def upload_many_blobs_with_transfer_manager( + bucket_name, filenames, source_directory="", threads=4 +): + """Upload every file in a list to a bucket, concurrently in a thread pool. + + Each blob name is derived from the filename, not including the + `source_directory` parameter. For complete control of the blob name for each + file (and other aspects of individual blob metadata), use + transfer_manager.upload_many() instead. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # A list (or other iterable) of filenames to upload. + # filenames = ["file_1.txt", "file_2.txt"] + + # The directory on your computer that is the root of all of the files in the + # list of filenames. This string is prepended (with os.path.join()) to each + # filename to get the full path to the file. Relative paths and absolute + # paths are both accepted. This string is not included in the name of the + # uploaded blob; it is only used to find the source files. An empty string + # means "the current working directory". Note that this parameter allows + # directory traversal (e.g. "/", "../") and is not intended for unsanitized + # end user input. + # source_directory="" + + # The number of threads to use for the operation. The performance impact of + # this value depends on the use case, but generally, smaller files benefit + # from more threads and larger files don't benefit from more threads. Too + # many threads can slow operations, especially with large files, due to + # contention over the Python GIL. + # threads=4 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + results = transfer_manager.upload_many_from_filenames( + bucket, filenames, source_directory=source_directory, threads=threads + ) + + for name, result in zip(filenames, results): + # The results list is either `None` or an exception for each filename in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to upload {} due to exception: {}".format(name, result)) + else: + print("Uploaded {} to {}.".format(name, bucket.name)) From a579212eabefb5182d9713caee086cad5b56564b Mon Sep 17 00:00:00 2001 From: Chris Cotter Date: Wed, 3 May 2023 17:35:16 -0400 Subject: [PATCH 165/509] test(storage): update retry conf test data (#1030) Copies the retry_test json from the latest in the conformance test repo. Adds test cases for 408 errors plus some formatting changes. --- .../conformance/retry_strategy_test_data.json | 565 +++++++++--------- 1 file changed, 284 insertions(+), 281 deletions(-) diff --git a/tests/conformance/retry_strategy_test_data.json b/tests/conformance/retry_strategy_test_data.json index eec1b8b6c..d718f09b1 100644 --- a/tests/conformance/retry_strategy_test_data.json +++ b/tests/conformance/retry_strategy_test_data.json @@ -1,281 +1,284 @@ -{ - "retryTests": [ - { - "id": 1, - "description": "always_idempotent", - "cases": [ - { - "instructions": ["return-503", "return-503"] - }, - { - "instructions": ["return-reset-connection", "return-reset-connection"] - }, - { - "instructions": ["return-reset-connection", "return-503"] - } - ], - "methods": [ - {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]}, - {"name": "storage.buckets.delete", "resources": ["BUCKET"]}, - {"name": "storage.buckets.get", "resources": ["BUCKET"]}, - {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.insert", "resources": []}, - {"name": "storage.buckets.list", "resources": ["BUCKET"]}, - {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]}, - {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]}, - {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.serviceaccount.get", "resources": []} - ], - "preconditionProvided": false, - "expectSuccess": true - }, - { - "id": 2, - "description": "conditionally_idempotent_retries_when_precondition_is_present", - "cases": [ - { - "instructions": ["return-503", "return-503"] - }, - { - "instructions": ["return-reset-connection", "return-reset-connection"] - }, - { - "instructions": ["return-reset-connection", "return-503"] - } - ], - "methods": [ - {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, - {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.update", "resources": ["BUCKET"]}, - {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, - {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.insert", "resources": ["BUCKET"]}, - {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]} - ], - "preconditionProvided": true, - "expectSuccess": true - }, - { - "id": 3, - "description": "conditionally_idempotent_no_retries_when_precondition_is_absent", - "cases": [ - { - "instructions": ["return-503"] - }, - { - "instructions": ["return-reset-connection"] - } - ], - "methods": [ - {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, - {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.update", "resources": ["BUCKET"]}, - {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, - {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.insert", "resources": ["BUCKET"]}, - {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]} - ], - "preconditionProvided": false, - "expectSuccess": false - }, - { - "id": 4, - "description": "non_idempotent", - "cases": [ - { - "instructions": ["return-503"] - }, - { - "instructions": ["return-reset-connection"] - } - ], - "methods": [ - {"name": "storage.bucket_acl.delete", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.insert", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.patch", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.update", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.delete", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.insert", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.patch", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.update", "resources": ["BUCKET"]}, - {"name": "storage.hmacKey.create", "resources": []}, - {"name": "storage.notifications.insert", "resources": ["BUCKET"]}, - {"name": "storage.object_acl.delete", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.insert", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.patch", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.update", "resources": ["BUCKET", "OBJECT"]} - ], - "preconditionProvided": false, - "expectSuccess": false - }, - { - "id": 5, - "description": "non_retryable_errors", - "cases": [ - { - "instructions": ["return-400"] - }, - { - "instructions": ["return-401"] - } - ], - "methods": [ - {"name": "storage.bucket_acl.delete", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.insert", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.patch", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.update", "resources": ["BUCKET"]}, - {"name": "storage.buckets.delete", "resources": ["BUCKET"]}, - {"name": "storage.buckets.get", "resources": ["BUCKET"]}, - {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.insert", "resources": ["BUCKET"]}, - {"name": "storage.buckets.list", "resources": ["BUCKET"]}, - {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, - {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]}, - {"name": "storage.buckets.update", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.delete", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.insert", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.patch", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.update", "resources": ["BUCKET"]}, - {"name": "storage.hmacKey.create", "resources": []}, - {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, - {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.insert", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.object_acl.delete", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.insert", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.patch", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.update", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.insert", "resources": ["BUCKET"]}, - {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.serviceaccount.get", "resources": []} - ], - "preconditionProvided": false, - "expectSuccess": false - }, - { - "id": 6, - "description": "mix_retryable_non_retryable_errors", - "cases": [ - { - "instructions": ["return-503", "return-400"] - }, - { - "instructions": ["return-reset-connection", "return-401"] - } - ], - "methods": [ - {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]}, - {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]}, - {"name": "storage.buckets.delete", "resources": ["BUCKET"]}, - {"name": "storage.buckets.get", "resources": ["BUCKET"]}, - {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.insert", "resources": []}, - {"name": "storage.buckets.list", "resources": ["BUCKET"]}, - {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, - {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, - {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]}, - {"name": "storage.buckets.update", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]}, - {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]}, - {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]}, - {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, - {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]}, - {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.insert", "resources": ["BUCKET"]}, - {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]}, - {"name": "storage.serviceaccount.get", "resources": []} - ], - "preconditionProvided": true, - "expectSuccess": false - }, - { - "id": 7, - "description": "resumable_uploads_handle_complex_retries", - "cases": [ - { - "instructions": ["return-reset-connection", "return-503"] - }, - { - "instructions": ["return-503-after-256K"] - }, - { - "instructions": ["return-503-after-8192K"] - } - ], - "methods": [ - {"name": "storage.objects.insert", "group": "storage.resumable.upload", "resources": ["BUCKET"]} - ], - "preconditionProvided": true, - "expectSuccess": true - }, - { - "id": 8, - "description": "downloads_handle_complex_retries", - "cases": [ - { - "instructions": ["return-broken-stream", "return-broken-stream"] - }, - { - "instructions": ["return-broken-stream-after-256K"] - } - ], - "methods": [ - {"name": "storage.objects.get", "group": "storage.objects.download", "resources": ["BUCKET", "OBJECT"]} - ], - "preconditionProvided": false, - "expectSuccess": true - } - ] - } \ No newline at end of file +{ + "retryTests": [ + { + "id": 1, + "description": "always_idempotent", + "cases": [ + { + "instructions": ["return-503", "return-503"] + }, + { + "instructions": ["return-reset-connection", "return-reset-connection"] + }, + { + "instructions": ["return-reset-connection", "return-503"] + } + ], + "methods": [ + {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]}, + {"name": "storage.buckets.delete", "resources": ["BUCKET"]}, + {"name": "storage.buckets.get", "resources": ["BUCKET"]}, + {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.insert", "resources": []}, + {"name": "storage.buckets.list", "resources": ["BUCKET"]}, + {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]}, + {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]}, + {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.serviceaccount.get", "resources": []} + ], + "preconditionProvided": false, + "expectSuccess": true + }, + { + "id": 2, + "description": "conditionally_idempotent_retries_when_precondition_is_present", + "cases": [ + { + "instructions": ["return-503", "return-503"] + }, + { + "instructions": ["return-reset-connection", "return-reset-connection"] + }, + { + "instructions": ["return-reset-connection", "return-503"] + } + ], + "methods": [ + {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, + {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.update", "resources": ["BUCKET"]}, + {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, + {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.insert", "resources": ["BUCKET"]}, + {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]} + ], + "preconditionProvided": true, + "expectSuccess": true + }, + { + "id": 3, + "description": "conditionally_idempotent_no_retries_when_precondition_is_absent", + "cases": [ + { + "instructions": ["return-503"] + }, + { + "instructions": ["return-reset-connection"] + } + ], + "methods": [ + {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, + {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.update", "resources": ["BUCKET"]}, + {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, + {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.insert", "resources": ["BUCKET"]}, + {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]} + ], + "preconditionProvided": false, + "expectSuccess": false + }, + { + "id": 4, + "description": "non_idempotent", + "cases": [ + { + "instructions": ["return-503"] + }, + { + "instructions": ["return-reset-connection"] + } + ], + "methods": [ + {"name": "storage.bucket_acl.delete", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.insert", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.patch", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.update", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.delete", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.insert", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.patch", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.update", "resources": ["BUCKET"]}, + {"name": "storage.hmacKey.create", "resources": []}, + {"name": "storage.notifications.insert", "resources": ["BUCKET"]}, + {"name": "storage.object_acl.delete", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.insert", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.patch", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.update", "resources": ["BUCKET", "OBJECT"]} + ], + "preconditionProvided": false, + "expectSuccess": false + }, + { + "id": 5, + "description": "non-retryable errors", + "cases": [ + { + "instructions": ["return-400"] + }, + { + "instructions": ["return-401"] + } + ], + "methods": [ + {"name": "storage.bucket_acl.delete", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.insert", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.patch", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.update", "resources": ["BUCKET"]}, + {"name": "storage.buckets.delete", "resources": ["BUCKET"]}, + {"name": "storage.buckets.get", "resources": ["BUCKET"]}, + {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.insert", "resources": ["BUCKET"]}, + {"name": "storage.buckets.list", "resources": ["BUCKET"]}, + {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, + {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]}, + {"name": "storage.buckets.update", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.delete", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.insert", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.patch", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.update", "resources": ["BUCKET"]}, + {"name": "storage.hmacKey.create", "resources": []}, + {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, + {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.insert", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.object_acl.delete", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.insert", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.patch", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.update", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.insert", "resources": ["BUCKET"]}, + {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.serviceaccount.get", "resources": []} + ], + "preconditionProvided": false, + "expectSuccess": false + }, + { + "id": 6, + "description": "mix_retryable_non_retryable_errors", + "cases": [ + { + "instructions": ["return-503", "return-400"] + }, + { + "instructions": ["return-reset-connection", "return-401"] + } + ], + "methods": [ + {"name": "storage.bucket_acl.get", "resources": ["BUCKET"]}, + {"name": "storage.bucket_acl.list", "resources": ["BUCKET"]}, + {"name": "storage.buckets.delete", "resources": ["BUCKET"]}, + {"name": "storage.buckets.get", "resources": ["BUCKET"]}, + {"name": "storage.buckets.getIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.insert", "resources": []}, + {"name": "storage.buckets.list", "resources": ["BUCKET"]}, + {"name": "storage.buckets.lockRetentionPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.patch", "resources": ["BUCKET"]}, + {"name": "storage.buckets.setIamPolicy", "resources": ["BUCKET"]}, + {"name": "storage.buckets.testIamPermissions", "resources": ["BUCKET"]}, + {"name": "storage.buckets.update", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.get", "resources": ["BUCKET"]}, + {"name": "storage.default_object_acl.list", "resources": ["BUCKET"]}, + {"name": "storage.hmacKey.delete", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.get", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.list", "resources": ["HMAC_KEY"]}, + {"name": "storage.hmacKey.update", "resources": ["HMAC_KEY"]}, + {"name": "storage.notifications.delete", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.get", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.notifications.list", "resources": ["BUCKET", "NOTIFICATION"]}, + {"name": "storage.object_acl.get", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.object_acl.list", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.compose", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.copy", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.delete", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.get", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.list", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.insert", "resources": ["BUCKET"]}, + {"name": "storage.objects.patch", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.rewrite", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.objects.update", "resources": ["BUCKET", "OBJECT"]}, + {"name": "storage.serviceaccount.get", "resources": []} + ], + "preconditionProvided": true, + "expectSuccess": false + }, + { + "id": 7, + "description": "resumable_uploads_handle_complex_retries", + "cases": [ + { + "instructions": ["return-reset-connection", "return-503"] + }, + { + "instructions": ["return-408"] + }, + { + "instructions": ["return-503-after-256K"] + }, + { + "instructions": ["return-503-after-8192K", "return-408"] + } + ], + "methods": [ + {"name": "storage.objects.insert", "group": "storage.resumable.upload", "resources": ["BUCKET"]} + ], + "preconditionProvided": true, + "expectSuccess": true + }, + { + "id": 8, + "description": "downloads_handle_complex_retries", + "cases": [ + { + "instructions": ["return-broken-stream", "return-broken-stream"] + }, + { + "instructions": ["return-broken-stream-after-256K"] + } + ], + "methods": [ + {"name": "storage.objects.get", "group": "storage.objects.download", "resources": ["BUCKET", "OBJECT"]} + ], + "preconditionProvided": false, + "expectSuccess": true + } + ] +} From 30c51469af2efd4f5becaab7e7b02b207a074267 Mon Sep 17 00:00:00 2001 From: MiaCY <97990237+MiaCY@users.noreply.github.com> Date: Thu, 4 May 2023 10:14:15 -0700 Subject: [PATCH 166/509] docs: remove threads in transfer manager samples (#1029) * docs: remove threads in transfer manager samples * omit worker type in transfer manager sample processes comments --------- Co-authored-by: Andrew Gorcester --- samples/snippets/snippets_test.py | 4 ++-- ...storage_transfer_manager_download_all_blobs.py | 15 +++++++-------- ...ansfer_manager_download_chunks_concurrently.py | 10 ++++------ .../storage_transfer_manager_upload_directory.py | 15 +++++++-------- .../storage_transfer_manager_upload_many_blobs.py | 15 +++++++-------- 5 files changed, 27 insertions(+), 32 deletions(-) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 6be8e1767..6e5879eeb 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -693,7 +693,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): test_bucket.name, BLOB_NAMES, source_directory="{}/".format(uploads), - threads=2, + processes=8, ) out, _ = capsys.readouterr() @@ -705,7 +705,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): storage_transfer_manager_download_all_blobs.download_all_blobs_with_transfer_manager( test_bucket.name, destination_directory=os.path.join(downloads, ""), - threads=2, + processes=8, ) out, _ = capsys.readouterr() diff --git a/samples/snippets/storage_transfer_manager_download_all_blobs.py b/samples/snippets/storage_transfer_manager_download_all_blobs.py index b07739d20..2285f673f 100644 --- a/samples/snippets/storage_transfer_manager_download_all_blobs.py +++ b/samples/snippets/storage_transfer_manager_download_all_blobs.py @@ -14,7 +14,7 @@ def download_all_blobs_with_transfer_manager( - bucket_name, destination_directory="", threads=4 + bucket_name, destination_directory="", processes=8 ): """Download all of the blobs in a bucket, concurrently in a thread pool. @@ -37,12 +37,11 @@ def download_all_blobs_with_transfer_manager( # intended for unsanitized end user input. # destination_directory = "" - # The number of threads to use for the operation. The performance impact of - # this value depends on the use case, but generally, smaller files benefit - # from more threads and larger files don't benefit from more threads. Too - # many threads can slow operations, especially with large files, due to - # contention over the Python GIL. - # threads=4 + # The maximum number of processes to use for the operation. The performance + # impact of this value depends on the use case, but smaller files usually + # benefit from a higher number of processes. Each additional process occupies + # some CPU and memory resources until finished. + # processes=8 from google.cloud.storage import Client, transfer_manager @@ -52,7 +51,7 @@ def download_all_blobs_with_transfer_manager( blob_names = [blob.name for blob in bucket.list_blobs()] results = transfer_manager.download_many_to_path( - bucket, blob_names, destination_directory=destination_directory, threads=threads + bucket, blob_names, destination_directory=destination_directory, max_workers=processes ) for name, result in zip(blob_names, results): diff --git a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py index 633c5ae65..50541fb93 100644 --- a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py +++ b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py @@ -25,12 +25,10 @@ def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): # The destination filename or path # filename = "" - # The maximum number of worker processes that should be used to handle the - # workload of downloading the blob concurrently. PROCESS worker type uses more - # system resources (both memory and CPU) and can result in faster operations - # when working with large files. The optimal number of workers depends heavily - # on the specific use case. Refer to the docstring of the underlining method - # for more details. + # The maximum number of processes to use for the operation. The performance + # impact of this value depends on the use case, but smaller files usually + # benefit from a higher number of processes. Each additional process occupies + # some CPU and memory resources until finished. # processes=8 from google.cloud.storage import Client, transfer_manager diff --git a/samples/snippets/storage_transfer_manager_upload_directory.py b/samples/snippets/storage_transfer_manager_upload_directory.py index 6f5171c54..e4a369969 100644 --- a/samples/snippets/storage_transfer_manager_upload_directory.py +++ b/samples/snippets/storage_transfer_manager_upload_directory.py @@ -13,7 +13,7 @@ # limitations under the License. -def upload_directory_with_transfer_manager(bucket_name, source_directory, threads=4): +def upload_directory_with_transfer_manager(bucket_name, source_directory, processes=8): """Upload every file in a directory, including all files in subdirectories. Each blob name is derived from the filename, not including the `directory` @@ -30,12 +30,11 @@ def upload_directory_with_transfer_manager(bucket_name, source_directory, thread # working directory". # source_directory="" - # The number of threads to use for the operation. The performance impact of - # this value depends on the use case, but generally, smaller files benefit - # from more threads and larger files don't benefit from more threads. Too - # many threads can slow operations, especially with large files, due to - # contention over the Python GIL. - # threads=4 + # The maximum number of processes to use for the operation. The performance + # impact of this value depends on the use case, but smaller files usually + # benefit from a higher number of processes. Each additional process occupies + # some CPU and memory resources until finished. + # processes=8 from pathlib import Path @@ -66,7 +65,7 @@ def upload_directory_with_transfer_manager(bucket_name, source_directory, thread # Start the upload. results = transfer_manager.upload_many_from_filenames( - bucket, string_paths, source_directory=source_directory, threads=threads + bucket, string_paths, source_directory=source_directory, max_workers=processes ) for name, result in zip(string_paths, results): diff --git a/samples/snippets/storage_transfer_manager_upload_many_blobs.py b/samples/snippets/storage_transfer_manager_upload_many_blobs.py index 995571b22..600134bd6 100644 --- a/samples/snippets/storage_transfer_manager_upload_many_blobs.py +++ b/samples/snippets/storage_transfer_manager_upload_many_blobs.py @@ -14,7 +14,7 @@ def upload_many_blobs_with_transfer_manager( - bucket_name, filenames, source_directory="", threads=4 + bucket_name, filenames, source_directory="", processes=8 ): """Upload every file in a list to a bucket, concurrently in a thread pool. @@ -40,12 +40,11 @@ def upload_many_blobs_with_transfer_manager( # end user input. # source_directory="" - # The number of threads to use for the operation. The performance impact of - # this value depends on the use case, but generally, smaller files benefit - # from more threads and larger files don't benefit from more threads. Too - # many threads can slow operations, especially with large files, due to - # contention over the Python GIL. - # threads=4 + # The maximum number of processes to use for the operation. The performance + # impact of this value depends on the use case, but smaller files usually + # benefit from a higher number of processes. Each additional process occupies + # some CPU and memory resources until finished. + # processes=8 from google.cloud.storage import Client, transfer_manager @@ -53,7 +52,7 @@ def upload_many_blobs_with_transfer_manager( bucket = storage_client.bucket(bucket_name) results = transfer_manager.upload_many_from_filenames( - bucket, filenames, source_directory=source_directory, threads=threads + bucket, filenames, source_directory=source_directory, max_workers=processes ) for name, result in zip(filenames, results): From aac1e7a955a662b2dd6ff4d1504c7fa1c55f9cb8 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 4 May 2023 13:52:31 -0400 Subject: [PATCH 167/509] chore(main): release 2.9.0 (#1025) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 19 +++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4669fb62f..6a404f155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.9.0](https://github.com/googleapis/python-storage/compare/v2.8.0...v2.9.0) (2023-05-04) + + +### Features + +* Un-deprecate blob.download_to_file(), bucket.create(), and bucket.list_blobs() ([#1013](https://github.com/googleapis/python-storage/issues/1013)) ([aa4f282](https://github.com/googleapis/python-storage/commit/aa4f282514ebdaf58ced0743859a4ab1458f967c)) + + +### Bug Fixes + +* Avoid pickling processed credentials ([#1016](https://github.com/googleapis/python-storage/issues/1016)) ([7935824](https://github.com/googleapis/python-storage/commit/7935824049e2e6e430d2e601156730d6366c78f7)) +* Improve test error message for missing credentials ([#1024](https://github.com/googleapis/python-storage/issues/1024)) ([892481a](https://github.com/googleapis/python-storage/commit/892481a2c76fe5747ada3392345c087fb7f8bd8a)) + + +### Documentation + +* Add sample and sample test for transfer manager ([#1027](https://github.com/googleapis/python-storage/issues/1027)) ([4698799](https://github.com/googleapis/python-storage/commit/4698799101b5847d55edc8267db85257a74c3119)) +* Remove threads in transfer manager samples ([#1029](https://github.com/googleapis/python-storage/issues/1029)) ([30c5146](https://github.com/googleapis/python-storage/commit/30c51469af2efd4f5becaab7e7b02b207a074267)) + ## [2.8.0](https://github.com/googleapis/python-storage/compare/v2.7.0...v2.8.0) (2023-03-29) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 0a9aecb37..b2a8c5535 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.8.0" +__version__ = "2.9.0" From e6bf1a4da00b47f6a80b349d5614118600dd354e Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 5 May 2023 01:05:24 +0200 Subject: [PATCH 168/509] chore(deps): update dependency google-cloud-storage to v2.9.0 (#1032) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index c55ebd518..c0e681450 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.16.0 -google-cloud-storage==2.8.0 +google-cloud-storage==2.9.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.1; python_version >= '3.8' From 504995f193239a0d69a62020b6af3ce88201f677 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 9 May 2023 00:53:36 +0200 Subject: [PATCH 169/509] chore(deps): update dependency google-cloud-pubsub to v2.16.1 (#1034) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index c0e681450..4e5bce1a9 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.16.0 +google-cloud-pubsub==2.16.1 google-cloud-storage==2.9.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.1; python_version >= '3.8' From 2ad709a27e40704c316874ba98b531c1f757a1a3 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 17 May 2023 11:56:14 -0700 Subject: [PATCH 170/509] tests: update signing conformance test cases (#1033) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update signing conformance test json file to match with https://togithub.com/googleapis/conformance-tests/blob/main/storage/v1/v4_signatures.json; Signature update required in relation to https://togithub.com/googleapis/python-storage/pull/378 Fixes #1010 🦕 --- tests/unit/url_signer_v4_test_data.json | 982 ++++++++++++++---------- 1 file changed, 564 insertions(+), 418 deletions(-) diff --git a/tests/unit/url_signer_v4_test_data.json b/tests/unit/url_signer_v4_test_data.json index f556c1fb0..4edcabc34 100644 --- a/tests/unit/url_signer_v4_test_data.json +++ b/tests/unit/url_signer_v4_test_data.json @@ -1,457 +1,603 @@ { "signingV4Tests": [ - { - "description": "Simple GET", - "bucket": "test-bucket", - "object": "test-object", - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=70aa331de284c2ca9afeee6a2c20db752edfd80e0adb29aa049f3c8a1eed68f5726a494e843d119f5bf17fa78affe1d55c6a248a5c1f6ca7b9a4dbe86e394338179a91a6aaef51f43f4bbed7802b9256425b37aae1dd8fb90ebb1f3f9112e99a62bc510a1ad7d183fe9a6fe1ffaee963699e21e163f0854c7baf0674ce0a611857fdb3fe80904e4c46db795e51c6b3725bd6a447e98f54fcefc97ea1926438602f26009905ee1657a48e1e2fb2b04201f1edff520f3d062a8571b8e476873fdf8ead8e15fb9a3237f635921681f483206e36456fc8a865c522f187f0e464b65a81833a1418b55733fd6e45eb1ddd856092e227cb1042fbb6fdf3b4d6d47978a1" - }, - - { - "description": "Simple PUT", - "bucket": "test-bucket", - "object": "test-object", - "method": "PUT", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=5b1a52b42f7bdefc8948e91eaaa64955e98ea25ed3a1b48566497fda23d36019f184f98cbc54354cd1d6303ca198efcfaa0c270b6f0a2f7291de21a6ff9f27ed1bb316d986dc07fae0996349eb2024385d3e55312dd13cee67a610914749a45ff297235749ed53dead39ce8b71942294fecfa2c5c89234f51e2ff00d16c5ec7abb45f34f1b0fb6856e4bd6ea4fe43b0550e7a1e4eea919d9c065cc15b20f53632d9fcb9e2d21ae351912b3bb0b0fa9661740a7d69ce77083ede2f66cb160f1bd6285af7c8f8a616ae487d37373f176f32b2191defc699eb4df2db13b17a13e7a2a63b97b7d98dd801c871fc73ffec163c1a8784e31a250cd517e4529696e8693" - }, - - { - "description": "POST for resumable uploads", - "bucket": "test-bucket", - "object": "test-object", - "method": "POST", - "expiration": 10, - "headers": { - "x-goog-resumable": "start" - }, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-resumable&X-Goog-Signature=1d037090964e260c02e8a5e4c38c207c4bdf15828fc6261c2560f242f3f4bf1465feb06fc4ea4bc0d85aa550ee1d3d157486027df494563e3b2c08f89ea666b1ebafdb977b0a976d2c0f66c19502b5969f099b3c3bf8e8bae62f3c3f040a4ea736f339a412ab2aeb2351469144dcfe3a2ad20a5bacab1ff36b3de6d04a078679814a7061a652b8f77334ad6d6f4a020a9f5c35b85ba13a99e43e06622e42432a1e83fa940c85c34730568c611e23846f456764821afed00c54550e57c01f6aceecb4daf6e6b3e96f257cd7d88c04680b54174b453f2d2ee17eec93a22f731c16593b56fdf3144dd5deec6f0b3ae632f68c0f2da13debe36dc463ce5af6c58a97" - }, - - { - "description": "Vary expiration and timestamp", - "bucket": "test-bucket", - "object": "test-object", - "method": "GET", - "expiration": 20, - "timestamp": "20190301T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190301%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190301T090000Z&X-Goog-Expires=20&X-Goog-SignedHeaders=host&X-Goog-Signature=55a76a221957bc711a64c27bbf8ff716aaa35d2bbaa0aa652ba2a8e42aed4b727c53a5b54a96a58e872a2ef592aa97c0e050f14d3caeac118afbfcb58ec6694db48e331176f368b0948ee5086257832df5ead4ec17cd9d7317c5af71c3ebd539989424f2ae1f8450727587253f2d0f03c7c6cb2a85649ece988ffc591a17d157c3e39b355baab9ed1c8dacd8923cd0e31423d7c6cdcc11f5e32ced3fa2fc5fd28e64b18b99e848b7982ba3163d85be919f10b7a248df1533353ff2db6deb02e5282fa22ecbf71362e2324a242b17d185266940d1c3bb8815db0d0c8d8fac4f37b69da8ea5ebad4db4a5323be94d6e78a4b98d74a586baab476bba976aed8c72e" + { + "description": "Simple GET", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=8b83604b82216c1d048d156674589e1f85ac69749ddc7ce2cb0703bb34b8c49e65961b4b653bc03dbbdba6d1278b88350f905798fa4bca70e06a5020683d270d71e7ba14e03baaaea4bfa4ea1713123b1f3e62b355545a8b9e068a85a7f8eb370842e6b21982683bcaf2e1528e5189229337ef0fc1308714ede6c0ab507d0d5d14ca15ea7bf560451c970ed7223976bf811ef62cd15400fff35e24ca8ed7ce4804fc563ed87a31f0d4a976cb378be1da256ae262b0caed8628e61b4ab5cd2be4857cb27898edd3bc504bbf389cedfab962e331540c5a43220efdd694c11daac42864950b0885f18ff41ec3ec6c92754a04fd000de568f0741cda9ede48afe853", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n00e2fb794ea93d7adb703edaebdd509821fcc7d4f1a79ac5c8d2b394df109320" + }, + { + "description": "Simple PUT", + "bucket": "test-bucket", + "object": "test-object", + "method": "PUT", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=1dac9a1eede0368413937b6a75cd18dbd98fe6a7f9c79392b513916cc312e22d0d79591b724ccee43b89b727a41a46e9375674b390b7c02bda94aca90aee4b744580aee58a692657c1364a8aff8786ab9167c87af26c0a154640bb948ae991fdc639a2a058264b49828c899c9a260dd66f74d02067955f16de6eb65dac0543297cb201707b50da2dcfe42f4c5be75c5588ac775910540057b1b5aca20988b176fba96ebafed66e76c09ccec45a144e742c5f2bba460b8df2ccefd9f2c39f0b398696b073bed554b3534c78dc52dc5c41ad24adbd7b0447e1b5b10315e7be19db323d38f0c7f523f5d8f4fbcd468117fdbd806c556a7a01cc2d5fe5f0e2a2c282", + "scheme": "https", + "expectedCanonicalRequest": "PUT\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n78742860705da91404222d5d66ff89850292471199c3c2808d116ad12e6177b4" + }, + { + "description": "POST for resumable uploads", + "bucket": "test-bucket", + "object": "test-object", + "method": "POST", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-resumable&X-Goog-Signature=883e07a9dc782db4ba322e5981c75f35d07b6864c9580222d1ca00623cf91d75614511835adf8a9737ff6e3b52f4de0600a55d366b77c6e6487676344a15a444ba145fcba318e9094038268ece8c46200363957bd9ccf5424e28b444d7e7982b02c5278c05d1140c654d49bb7fdb57d3d709741e1a2bc6af80d9a79b4ca59eafbbc943ec37f437e9c1b1ad41bdd17e890de0bfd3090674381e23c75f3878e4895867da7abe84c6e56d2e0baaa5ca5cb2a7098c0b662deef9bb2731f61be276c814fd41813dade52c348922a00487c0e9ae6b92c8c60d30f2c89cd5e549d4fea961abe82e905cd3e8677acad7c31a9cc22f4c24e79f33b8b3310c0dfc0f37a160", + "headers": { + "X-Goog-Resumable": "start" }, - - { - "description": "Vary bucket and object", - "bucket": "test-bucket2", - "object": "test-object2", - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket2/test-object2?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=804095c3d06173dad8c138d6556737a6dfc20b2cc4f6d7b857928ade96fccab30be4eb6e467d3441670a6b5eb373d097f00d37a5fe423d2a370ac2ee0e52568b18231d6b98a25a647e5440fc75b10f1d3ad401b4b0d076a057c80a9b597ff6bad273672d4278a3966440767459c9d5d5ab1d5a39563bb559f45665658e7ba2f982adde68a7ff88d8de25f9568d56e24fad76ffde80852b22a3a07ac57a3af3aaffce39de64e0c4f3b82382d48b56abc8445e6480b4c130030481b3003abc831cebcb0f3b8086639891a99a2e7c8345331d59ed635b227987a5dddfd3fd71c3b5ae4391e472df8de0592ff830d385216264448a82ad4aef1ba2374d3226fd06bf" + "scheme": "https", + "expectedCanonicalRequest": "POST\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-resumable\nhost:storage.googleapis.com\nx-goog-resumable:start\n\nhost;x-goog-resumable\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n877f8b40179d2753296f2fd6de815ab40503c7a3c446a7b44aa4e74422ff4daf" + }, + { + "description": "Vary expiration and timestamp", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 20, + "timestamp": "2019-03-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-03-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-03-01T09%3A00%3A00Z&X-Goog-Expires=20&X-Goog-SignedHeaders=host&X-Goog-Signature=a8f699d7f9ce9d6960aa5715606dbfbdca31e5c514b69b27e11875b134c518396c5aba4318e303b38e6537509ef12d94332b39f80ead0274574016cb58d7d1d5e8508b28e9edbc8fe6392e16076e904aa8c64abb84a3e3554b9503b4395f1dbc4b9367e359f62f6a5c6d53659caab44c2e49595cf5a6800c251c16af163e0399174142880358576a28f392f9bdcf69a10a3ecf70331fefdb7e82dea03251d051ce48560d7606a2fce22a6548bb950da67b81737701448308d44346cabd829f2e9b1737516d15d9d905844e924fa9b3dac1a222b31fdbcf6a11006676915cf5282994a0d4dfe30ad7fe23686638dbbc79a983a698ad5c8d3eab51e5e2cb01e22c", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190301%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190301T090000Z&X-Goog-Expires=20&X-Goog-SignedHeaders=host\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190301T090000Z\n20190301/auto/storage/goog4_request\n779f19fdb6fd381390e2d5af04947cf21750277ee3c20e0c97b7e46a1dff8907" + }, + { + "description": "Vary bucket and object", + "bucket": "test-bucket2", + "object": "test-object2", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket2/test-object2?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=82d96c99f8a1aac4d6d3002331ee4b2349f09346af2f468a559402338d3813cc8bd2d3057404bb5c2e840594a44612bf78302b7f1ebd9286475469fcdd4abddb64d2d1ac0606aeb2f120bf576a6b0ba470abf1548fda902a20fa955746b78a4756817821f1064e9746d0fffde714227323aefa8e0acd9b0ec29af28abf41c3c072e13cf1c739554c4c7b17f2b1da20a7290f8b386a83db39c2e4076a4507f08e562c065dea193ae54b3ffe6840e7de0403f97943189dc9fd312e74de0d87799ba415b1b98354fa0e51983989024eb6efef4f0b6f7c4ef2eb3c65874feb770db1aea33b86bcfd2d9db66ebfa69a568d359113c2c76d260ff56c9cac5b36ff5bbe", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket2/test-object2\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\na139afbf35ac30e9864f63197f79609731ab1b0ca166e2a456dba156fcd3f9ce" + }, + { + "description": "Slashes in object name should not be URL encoded", + "bucket": "test-bucket", + "object": "path/with/slashes/under_score/amper&sand/file.ext", + "headers": { + "header/name/with/slash": "should-be-encoded" }, - - { - "description": "Simple headers", - "bucket": "test-bucket", - "object": "test-object", - "headers": { - "foo": "foo-value", - "BAR": "BAR-value" - }, - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=bar%3Bfoo%3Bhost&X-Goog-Signature=1e53ba6ef0f0ea2adb437f0a32b3d7d7dc521d9a53c79ef224849c67d16e771bc04096de5b0d87c113069545ab8638256d055ca216fa062be74b7a7d03bac14a3bd1e30264e261ea6891ab58d567bbce6bd80951d00644d5dc222e3e55a6d015bf18184bed0ab71208bdd6b0c1433898dfe6cf2b9052a4bb9ed7610bc3acda3a592e8dcf5e4241ed9a0cd777d9abaa85e4770c0681c447a163fac430de64549ec45a8d8fac37af8aecc5ba0375da87c2e1040ed51879b2b6874e2381b259fe4b297b4ea0b3ea8a86332ff452a562a184afeb57fdf41ba075ddb3823650b47efa0238c73866a06cffe4d47c30783b5d4d78a9d499bd381dffb5386decdd02ef76" + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/path/with/slashes/under_score/amper&sand/file.ext?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=header%2Fname%2Fwith%2Fslash%3Bhost&X-Goog-Signature=3e4ba8232a55ea1f414b8495f0cf54fece1bcb926ae3af6ba9c533f0bae55fcf8d3dfa53ac2e648c8eee8e7487530798c13fee7f3e93cdf4d56cf48c562b0bc3767ea642fd23b406704ea879cf74d4e7ee38866e88dcfa7a1ac13fcaed6af0941bfb6f607699968fec9eddd94cb73b6d82867d990e19deee7b26679a150f3caf62bb651fd9a0bde1d9f795e39cb25bffd1635e8f419b7e4a6883f4ca6090f283666954dbe24bba8e2d082cc0704a9d8f6ac49312a16c7717b2f96f14fee0b8c1da371ff4b4b7cb297c00063361b6ab3efb0ce4feaa7e84402c7686dea67c882851a850837af6e03171577515121236507122cf5fce2bd52da083b27f965d8e8b", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/path/with/slashes/under_score/amper%26sand/file.ext\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=header%2Fname%2Fwith%2Fslash%3Bhost\nheader/name/with/slash:should-be-encoded\nhost:storage.googleapis.com\n\nheader/name/with/slash;host\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\nf1d206dd8cbe1b892d4081ccddae0927d9f5fee5653fb2a2f43e7c20ed455cad" + }, + { + "description": "Forward Slashes should not be stripped", + "bucket": "test-bucket", + "object": "/path/with/slashes/under_score/amper&sand/file.ext", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket//path/with/slashes/under_score/amper&sand/file.ext?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=a6e6955547ab5906e0ed8df7b84ca5912a1bdc3efca055855d328f365c8cd69441d06d10c7281ea17c4311c5bd255a41f3842730420bc01a87034647470da613709b1d8f777b8e977f3e66768fa544e3e1f0fa6a188c445583ec1f2a97cb91748afb5bec7c2207a1e6ba150f05cb2af93226b44c34554cab08d10bbbfe84daa1235a33c13fb42b89bfc4c2dac13e60aff4b9b60242a67809b9b4afd77fb909447defc86f70e2e63ebd65efeac3bf35d0ec5aaa066a9203f99b2fc834eb1fee54e8b7c68f9ed3d78dd8f512aaef55ed5b9ff2495a0274d45e1dfa0dfd848dd5be38a27784ce2276e44d40c063f9ad3804194609802883449f4b61d67ab3921b20", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket//path/with/slashes/under_score/amper%26sand/file.ext\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n63c601ecd6ccfec84f1113fc906609cbdf7651395f4300cecd96ddd2c35164f8" + }, + { + "description": "Simple headers", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=bar%3Bfoo%3Bhost&X-Goog-Signature=3abfa4717ebc857380a6db5a9ef78082bc5410c2853d27d7b7df4cdcdf438119d1b00de07345f5fb8a968e47b948d4cd6ba8328f8a7b01991f0f4ae5b34a319a539e3dd451384d07da9bbf51ea120ceac189bb98700e95337aa410cb014facf19222d3e7eec08123049cde2878337427f7c72de6364cd306d6ba601034c0c54b4553f13d4c6a6cfb0b08f86935e914fb456549cbb2a57945bf331d75ec64166178fd080fedb90887e2228dde8bc1f63eb057525e1d844ee934bdb78e32880294c702f6d4841c335e79cd8fc796407bb00292906d58f5dabefcc47a470ef45cb40dde7d3b31ba78e753ad292b1a21001bc231994e7cf4c12e9202fb271a4e4b54", + "headers": { + "BAR": "BAR-value", + "foo": "foo-value" }, - - { - "description": "Headers should be trimmed", - "bucket": "test-bucket", - "object": "test-object", - "headers": { - "leading": " xyz", - "trailing": "abc ", - "collapsed": "abc def" - }, - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=collapsed%3Bhost%3Bleading%3Btrailing&X-Goog-Signature=254b939a0becaf1a03b601286bd30cb9c8b796b20c6b950f50f246c21fe7577dc3771cd08fb1afd566df6fee12d64be3c7c66c79fe93aefb632e313a31acc48d873f324a49dc768408d4372c3cc597aa037c1ca03c7709408e9e3bea97def67257bce8cc09e5200235c1300353eb22f9ca5676f896972d38cfe3a39bf61575e9e42be9eba08b42524d4459c578e36a6b0e22ea5cf43a13c5156c7e948e07e211fa358f4d3ad7a3f03fb412ab62951a48efd1b53a356268b7242063bbe0f90f2fd9d3fcfbc8ae8691b15b2e02409ba5fa5d465a70a407d9c54b90dd11c99b81978fae28e49dfbda7d61a5d624f3a24483aaa8e7df6dbd75bfe09d854cd2cb98b9" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=bar%3Bfoo%3Bhost\nbar:BAR-value\nfoo:foo-value\nhost:storage.googleapis.com\n\nbar;foo;host\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n59c1ac1a6ee7d773d5c4487ecc861d60b71c4871dd18fc7d8485fac09df1d296" + }, + { + "description": "Headers with colons", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=bar%3Bfoo%3Bhost&X-Goog-Signature=677a1ccd0c77c4f359436ab9133d78a0010e846018a9a2b42442be1a348b41fb6c4d74c3b94cd3fb2da70d302e3240bf12aceb14fdac10af556ec7164e4f5f49bcfaa7a3030d62b1ef3ee1cb1b702f632636afe68aa1902f2d48db79e4a7cf94490de59182c8487965c3d143b58bfa6e0628f0662c7da2d31d68cce9062f47cce6139b018946601ff649cfd7511c3d7fbcb4b500650ff7b02a6a09513c67b044e1cf7158046a17598fe84e21349d253d19d18da70796597e01821d6910a00ae587ae2563afd0f742a640d9f2868eb016c622abeff6449f3b39e1200f6007794a509ebe9fdb44ff1a894bac85712e5bab2c2b231c5a7ac24d01e86b278caac52d", + "headers": { + "BAR": "2023-02-10T03:", + "foo": "2023-02-10T02:00:00Z" }, - - { - "description": "Header value with multiple inline values", - "bucket": "test-bucket", - "object": "test-object", - "headers": { - "multiple": " xyz , abc, def , xyz " - }, - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bmultiple&X-Goog-Signature=97d1edf312b9635950ffc53df4735611b73ea643719ec2818d94cfd3746c5c18441b44dc198a7baa6d315e31cd215832ca81ece555e28fa16f67aa1ea5a030e8b403fe680db6a6435d401b874612d84416ea6891b6bda09051651d4152220bfee341f398e75db5f80ce6fab0087beb12c800c7754e9ef489cae0dc26cdf91a7f2bce903e1caeab9c34fb632591e404ba1a55e20d4404686603694774211db85d2bc2d6007877a130a68cb52cd3b0a067700c1f627a0514a8c0dea2ece785bdffc0f5fdeb48b3a5209c3bc23d75a9e893a1b545506e505a2364fbb2374f602b0ad16aa6e7358243c5161bd4f88a14cab54b85229b8351199fd075c8ce41277ef5" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=bar%3Bfoo%3Bhost\nbar:2023-02-10T03:\nfoo:2023-02-10T02:00:00Z\nhost:storage.googleapis.com\n\nbar;foo;host\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\na2a6df7e6bd818894e1f60ac3c393901b512ca1cf1061ba602dace3fb38c19a6" + }, + { + "description": "Headers should be trimmed", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=collapsed%3Bhost%3Bleading%3Btabs%3Btrailing&X-Goog-Signature=2a98fdeedd8447c056d6d84b44a65ae8c9dccdbf1ad4075caf281708be3bbab1d44cfc43e2612dba593008ecb09838edd0e478a8033335bcecd7d576b7d5199333e137036513c59f7f16d89941c3e4e179b2d387c8c0ffbf056763c904a08d2f3695c298bde0be5917647d287bc50d902ee5c3c65bff2a499ce20dd917621ec703232a9c2c4594b45385da152053dc0fc4c8d57f924823085c1636f0c42ca0146760a4c805792a213a065e241fd13382df28f2945d515fcb4fb70fbde2702c8547bdd43e38b344fe18aa6f44f60bbd69554834e8347efefe9e7a1687b1ecdc86fb285df59b50303f1f1954991fba593dc8d5737d804edd4dda083aa5d3b9b9f9", + "headers": { + "collapsed": "abc def", + "leading": " xyz", + "trailing": "abc ", + "tabs": "\tabc\t\t\t\tdef\t" }, - - { - "description": "Customer-supplied encryption key", - "bucket": "test-bucket", - "object": "test-object", - "headers": - { - "X-Goog-Encryption-Key": "key", - "X-Goog-Encryption-Key-Sha256": "key-hash", - "X-Goog-Encryption-Algorithm": "AES256" - }, - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-encryption-algorithm%3Bx-goog-encryption-key%3Bx-goog-encryption-key-sha256&X-Goog-Signature=326568a3a4b033441f89dff2835ed7b7fd22be6a8959b7d318cc3c9be97c14361cea2135ba566127aa8350afe6c5a2ebcc8ddb5448a41ae6d942d1afdc15445ef001a68117e43493277cec1966b91f00c78c2a430f8e0c7ffbdbc685d13ee271b4ea0fe5dd36ab729b6e4bae119e4bc0ea0c17f080de58b222e9dfb7658fbcece56244bdcaf0e24d4c71e41ca792c1b232814ce4b6b2af7227c0e7a688d0b9e294522a68a5f7c85e789c15bde2313edff5e349347d2c4f2b866ae13a40b530c8d263067f7f6ffe8f1535d1633667905ee6eadb78d46fdd1398ee8fced29499fc4e163212b67d1c0bedd7881b12c7feceb359b8878f7c229826dbfff4fc986e33" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=collapsed%3Bhost%3Bleading%3Btabs%3Btrailing\ncollapsed:abc def\nhost:storage.googleapis.com\nleading:xyz\ntabs:abc def\ntrailing:abc\n\ncollapsed;host;leading;tabs;trailing\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n19153e83555808dbfeb8969043cc8ce8d5db0cce91dc11fb9df58b8130f09d42" + }, + { + "description": "Header value with multiple inline values", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bmultiple&X-Goog-Signature=86b73c7b27f69d772d3d5a34f83fe2b73a484063103351c3080b3d345f5c6587f770bb09ee6d40283c2dcfb2607e362c2f9441be594ba87c8a84538b944d615366ab38d64e8bda9daf1495122109da9f94a903c64f1b158dd1168eeecf637ceeaffdc061f7109a396c0536c059e61690a6f0d5cb350b360e8e6de41731c912bb2b78b33760e343feaaaea842047b562a092185c66e006f2ce62b90b8e7b38466382e554ddc7dcaa4735c15545d101c7c247ae203e8d7200aa95a22626c7ea88b8ce874391dc7747bba3e24131eed78d7ef9f13d3fb21c65a8c721cf6ba90cf9cdbeecef7d84aabf59e62196607a336306d68a274d959a11eb034d35c1f260d4d", + "headers": { + "multiple": " xyz , abc, def , xyz " }, - - { - "description": "List Objects", - "bucket": "test-bucket", - "object": "", - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://storage.googleapis.com/test-bucket?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=73489345b256501979f5166c698ac45e53415fffe06fda3719c6a4a81b7bb99b391bb116e6728b4f555f65e954eb7b3a61c00bc05d13d8dbdb8f82e56f8a226e6b171e195dd9467851943c095ff18928c2351b24baac09757d9a81cf6a5847c11e706a24d0662662bb26438b332433994ddc19b5151d7e1716135a1400363cb3d5e10b854233ad34e351c53ff61914c14401d95d0d83fa379870024f243f7c70f85f491cafa3f9569f37c59c53379f1a9848d9a74264db6a50f36ea94d2bbaa2d26a2e3fe3930b5c65755bd69d1d024c8ece31da7ae7445ecd31b651814728402d3f771c0813e13133a59fb07f15d36cb623b6032e6776afb7a725c7e164d7ce" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bmultiple\nhost:storage.googleapis.com\nmultiple:xyz , abc, def , xyz\n\nhost;multiple\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n4df8e486146c31f1c8cd4e4c730554cde4326791ba48ec11fa969a3de064cd7f" + }, + { + "description": "Customer-supplied encryption key", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-encryption-algorithm%3Bx-goog-encryption-key%3Bx-goog-encryption-key-sha256&X-Goog-Signature=62e0aa8bee2140650fb578c91a5b65f776cae4ea69af35f790b23627fd468837ef44d6c7446aea1dc68b02d98abee1bc0f834fcac19076e3fe41aee7414c3d49faa58eea4c20ea8e9e0dd1ddef85aeacc1b009b40e59c65900bbf50719807236703d9751e83b72f46913e6fec83ccbcf7371e0af6e753a281df7a96db66e59715160b02affe7df8425a7e4b460e4f823a98cf7e6faa808b50b89374009fcfa36b541e6ad0dfbaf959f55673335c182a7f75325976eca7a214fb71d1963fba8c167c86b3782460ff6810526ce0deab4cba9546e4a5bca5acdbe807dc2b7c8cda9bad94c3ef81e1f04f22499e0f633f2b2946f6ffa8d63c71dc79585c74102ac54", + "headers": { + "X-Goog-Encryption-Algorithm": "AES256", + "X-Goog-Encryption-Key": "key", + "X-Goog-Encryption-Key-Sha256": "key-hash" }, - - { - "description": "HTTP Bucket Bound Hostname Support", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-encryption-algorithm%3Bx-goog-encryption-key%3Bx-goog-encryption-key-sha256\nhost:storage.googleapis.com\nx-goog-encryption-algorithm:AES256\nx-goog-encryption-key:key\nx-goog-encryption-key-sha256:key-hash\n\nhost;x-goog-encryption-algorithm;x-goog-encryption-key;x-goog-encryption-key-sha256\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n66a45104eba8bdd9748723b45cbd54c3f0f6dba337a5deb9fb6a66334223dc06" + }, + { + "description": "List Objects", + "bucket": "test-bucket", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=9450a0b8e6acfbbd40b750ea482d9bcfd0219491ff943a6040e3f8597aa229742613d453d85ad67e5d0610b3104c4329c93256e58c69f60b87c1f0e490f44b6558ddf0dcbca689e8cd76bf2c0000e783bd8a07d60aedc45077faad86c2ba961c9f48c0667b7b561d457b3750de60fe4bb55c910382205c8998aa543d36cb4e74ad3df3ef8d9d4d8a383651cd0eb7f6c0974868591c1b02d891286562a4a9036bbbfc9b9a912d0e12141c292e06dbf2a1727831de4b75f6c48c61266b593d6be1cf4063c005ff506ee8125fafd67c179b842deb407f650a111f1f54133de2bf1dca18b8baf2db599b053d0b5edd4c8edbb00a9687741d02431317446fd5643951", + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n51a7426c2a6c6ab80f336855fc629461ff182fb1d2cb552ac68e5ce8e25db487" + }, + { + "description": "Query Parameter Encoding", "bucket": "test-bucket", "object": "test-object", "method": "GET", "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "http://mydomain.tld/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=2394955666b2ca0f6a4953d730eea564762b7cb4fcbdc5a24305c4eedcfc45442cf863e2b5c6c8386371839adf34caad8d2fb4d291df12537bb310931ea76acbde3fc65a40b9729d7400c9d73ce7827043e31e218bf8280b4828aeccb0b7b10c025d7494c500db5b0f19af827ed64b9c70521fe4fa8248698ff6a55570120aee2cdbd35b2c9a6e7f6038b7c7d40f8497460c2435814ed9e8de5217db66ae0c374f17078d3d8c828dd6cc5eb278c9328e7c74dcc090f48a50a72c25b2dc4e90e8be5f630dc7df463f14d0c3f7c3313e5315d5d74286435f5b846d39f7444e75fa09f911cc9a9c96d843226c5c88f3e03b0a8a53f3800feee1c2c6123262148ba9", - "scheme": "http", - "urlStyle": "BUCKET_BOUND_HOSTNAME", - "bucketBoundHostname": "mydomain.tld" + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&aA0%C3%A9%2F%3D%25-_.~=~%20._-%25%3D%2F%C3%A90Aa&X-Goog-Signature=51959e717a8613a587fe507932d0501caa1f01bf879df6c019255c15ec652b7e64c61dc995814cd73886587ada3dfb3ac9ce2e88eb30e3165cdf8a74f1b57b050e0d9ce3d2549329d3895611d6788ed8d1cf622cd6c1e095695e1c84ef556b036253e504163a375d3a9768dad37aa0e784fc3238ddb6613c6b262cc361d20ef6c1832b8965f11231e510324766d5360c71fb7c3ad597544f1bf7b390fe86a32a12b765bbaa6edbf48ed706e31a2e32cc0b083d19f24332696f7049087b993339ac4f91cff8287dbf76ced628ae455af1b8803c1d04b0b2547a48a54395f3756aa6878bc906eeb35e04bb8595a100eb8cc6c189462d888a0700f3ce1548450877", + "queryParameters": { + "aA0é/=%-_.~": "~ ._-%=/é0Aa" }, - - { - "description": "HTTPS Bucket Bound Hostname Support", - "bucket": "test-bucket", - "object": "test-object", - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://mydomain.tld/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=2394955666b2ca0f6a4953d730eea564762b7cb4fcbdc5a24305c4eedcfc45442cf863e2b5c6c8386371839adf34caad8d2fb4d291df12537bb310931ea76acbde3fc65a40b9729d7400c9d73ce7827043e31e218bf8280b4828aeccb0b7b10c025d7494c500db5b0f19af827ed64b9c70521fe4fa8248698ff6a55570120aee2cdbd35b2c9a6e7f6038b7c7d40f8497460c2435814ed9e8de5217db66ae0c374f17078d3d8c828dd6cc5eb278c9328e7c74dcc090f48a50a72c25b2dc4e90e8be5f630dc7df463f14d0c3f7c3313e5315d5d74286435f5b846d39f7444e75fa09f911cc9a9c96d843226c5c88f3e03b0a8a53f3800feee1c2c6123262148ba9", - "scheme": "https", - "urlStyle": "BUCKET_BOUND_HOSTNAME", - "bucketBoundHostname": "mydomain.tld" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&aA0%C3%A9%2F%3D%25-_.~=~%20._-%25%3D%2F%C3%A90Aa\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n448f96c23dafa8210900554e138b2b5fd55bc53ef53b8637cecc3edec45a8fcf" + }, + { + "description": "Query Parameter Ordering", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-Meta-Foo=bar&X-Goog-SignedHeaders=host&prefix=%2Ffoo&X-Goog-Signature=99a55adc713a3daa0d066d29963c5b5bc3863a1555a7ae104999122242a441caf41f4aec83258d4d4fe8d44c650d9d5cae2ac36a89d9438401f3ff43ae424554be4e97bcb6ad76f1d3ce5c4af2c4b76f1a1197d0dd5ce4c27e4eb7b7bb94c8711ae5fe06d5064e38dc98d57b245ca963efbff3e6f59674e71072fdacf60b042229038636488b7f70b6a731b5e50915778498a59e43d744d7155fbb8dea72a716fd1b0b2b550e0e6fe62011642edf3bbe999fad59084e72ee94177153f0964c2745ff412c91ac5fafab101f591c4ccc99bc2a5aef42722893099469a7fc0250d114b90737f0bb0464b1be9d5780372d895edac979e7eb8f5df1bfb7105c754fd9", + "queryParameters": { + "prefix": "/foo", + "X-Goog-Meta-Foo": "bar" }, - - { - "description": "HTTP Bucket Bound Hostname Support", - "bucket": "test-bucket", - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "http://mydomain.tld/?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=13a256f7afda0a733cc21e9c804b1d2c37f64f9a18956fe11ccce57765115dda24c1d342d364b533e1ab95fcf5ca6b7646f2d5bb008ca9c731d01cdad932f56c21fe5528acfd9cc290c823316992fe791424c5c4b1a2d0b6857d90702be7ec05f3d585ffe1a58a7ab1782643512dad430581dafbeff8669e1b7ec3122c51dbf8c0509f9f746a6208c8d8847493476949959cacdbdc4e024c65055c9af2b51767d2bf8b4e95f10e9ecda3977e9a9cf47d4a4626da1711b79ee344dea82c459826f0e9c31350d8129dc0dc49b203ea301681ba5092e13e362bc657059fd07fd62f0751f6ced8ea50caeb5316c8ed8bca05c793d302853f2fe016305d258e1e212b", - "scheme": "http", - "urlStyle": "BUCKET_BOUND_HOSTNAME", - "bucketBoundHostname": "mydomain.tld" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-Meta-Foo=bar&X-Goog-SignedHeaders=host&prefix=%2Ffoo\nhost:storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n4dafe74ad142f32b7c25fc4e6b38fd3b8a6339d7f112247573fb0066f637db6c" + }, + { + "description": "Header Ordering", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-date&X-Goog-Signature=1676df8f9b69ad3b0b644d86c3dba8dc50dc30a79c7656053496784a86bd254ad95f985808a91262e6717c269e0863d8d6c2de4a70b8127cca888bd0c7bbd628776ffc732ee56c351ec013c1c9542eb5a9cd8b9b1b7a9fad5e1a0dd00bee5535b0d7ba1445ee5d055c8c0cfa14186464f8bb4d31e7eda7530d76387f8d298561b64450893547f33f049215617b1cad3439009a7b2405894125d45dcc0694a544c28f3cfeb191a11954aa15067a3f2993bf7e10057b267f0899500ff24948310211d9ee68f3f5ec96341336ebd5d1b29ce36e1e32a3eb869ab9e2a63fda521fd9091834ddf60cfeebe8bd2300a8073a87811436f5ce09a517a54435450b641219", + "headers": { + "X-Goog-Date": "20190201T090000Z" }, - - { - "description": "HTTPS Bucket Bound Hostname Support", - "bucket": "test-bucket", - "method": "GET", - "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://mydomain.tld/?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=13a256f7afda0a733cc21e9c804b1d2c37f64f9a18956fe11ccce57765115dda24c1d342d364b533e1ab95fcf5ca6b7646f2d5bb008ca9c731d01cdad932f56c21fe5528acfd9cc290c823316992fe791424c5c4b1a2d0b6857d90702be7ec05f3d585ffe1a58a7ab1782643512dad430581dafbeff8669e1b7ec3122c51dbf8c0509f9f746a6208c8d8847493476949959cacdbdc4e024c65055c9af2b51767d2bf8b4e95f10e9ecda3977e9a9cf47d4a4626da1711b79ee344dea82c459826f0e9c31350d8129dc0dc49b203ea301681ba5092e13e362bc657059fd07fd62f0751f6ced8ea50caeb5316c8ed8bca05c793d302853f2fe016305d258e1e212b", - "scheme": "https", - "urlStyle": "BUCKET_BOUND_HOSTNAME", - "bucketBoundHostname": "mydomain.tld" + "scheme": "https", + "expectedCanonicalRequest": "GET\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-date\nhost:storage.googleapis.com\nx-goog-date:20190201T090000Z\n\nhost;x-goog-date\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n4052143280d90d5f4a8c878ff7418be6fee5d34e50b1da28d8081a094b88fa61" + }, + { + "description": "Signed Payload Instead of UNSIGNED-PAYLOAD", + "bucket": "test-bucket", + "object": "test-object", + "method": "PUT", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://storage.googleapis.com/test-bucket/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-content-sha256%3Bx-testcasemetadata-payload-value&X-Goog-Signature=0609637b2365bef36a9c65e4da454674d7b08b7b49e4bf92710065039bff9fd75059f001d222f07c184210bd248c4b0a5045cfa600f296d5194aa7ff15234186fd9f4dd4985993b48d3c31c10c4a8561f839652cffbb8f53717753cd4dfca4d8e1bfa1e6a9e4d6cc74f131a81a1fe92da675f2c6ab8b4db0e68b11b0baedf1ae72ef35998fac27c826d95a3e0a60a0127d23809e91e5883622464a8e8fbb3d82ad329e5f94b93ca7f720927eddf9147edb80f5558688cff32ad23fab38d553341d2adf0e46661f24c86cc5e68087b2a5dd6568b9ac8fd088a753ae159a4a903491b89dbda731eb158b8eb5c180eef7907ce35269cb6243c3da0ed0b4ba0cc882", + "headers": { + "X-Goog-Content-SHA256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b982", + "X-TestCaseMetadata-Payload-Value": "hello" }, - - { + "scheme": "https", + "expectedCanonicalRequest": "PUT\n/test-bucket/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host%3Bx-goog-content-sha256%3Bx-testcasemetadata-payload-value\nhost:storage.googleapis.com\nx-goog-content-sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b982\nx-testcasemetadata-payload-value:hello\n\nhost;x-goog-content-sha256;x-testcasemetadata-payload-value\n2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b982", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\nbe21a0841a897930ff5cf72e6e74ec5274efd76c3fe4cde6678f24a0a3d6dbec" + }, + { "description": "Virtual Hosted Style", "bucket": "test-bucket", "object": "test-object", "method": "GET", "expiration": 10, - "timestamp": "20190201T090000Z", - "expectedUrl": "https://test-bucket.storage.googleapis.com/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=64884b89935fba49d88277eac77257cab8b5097b2ab1831e20e55ea3b25d1ee8e4cd7aeb0ab06322b38a2722187f1c88765856324f3d72591ccc4cc23bae5e596104490886894c1037f5b2fc8d6349fd19b92d5eaddeee7ffc464b9262298764d175fd6e9e0a3680458b164609af2a626bf2e1cace525d7446d305a5dfe815dd04e33b91ae3ba3d31394cb13824d3a9cb61f5d28b149079c17b8b82738267fcb76e621d4161132cde184d5193480a185308f026859c8913f660832a68a5e17e30f6894bf0c403cec1e4dea056bdfe4b85da59e555ff3ecbc872640636154b0dbf0d6ce74929ad49920cce2beb51513865c2875bce33baef08af806de79e860ca", + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://test-bucket.storage.googleapis.com/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=1b067f789addd86030589002285670ebde4c824bdc3e3684b67e0d9c3a13774c2403adbe72df199b72671c5da2edbe2c25aa6bfe73635676e64c67aff05acb7a04c7fb4e5fae33a4a05071425344c7632c6ee778fe3b2c1d71d7cdee4bc73d71252cc0da26c8662f824b16924328f927c7d74f719fd7ccf1ceea7a6700b68e2122737b4add68e9d8a2e52df012cab7afd5e903c8cc648d6ea18c0ce41dbd52eb1a5927a13c861ff4a967b04c7c9c396d35406009e1ed5cc5a46530d0dc028f611de5a8237d30ef8f1be697cea727a384c6a71dcbe81eeaebc95f9ec08374bf3d9c23009bff982284ad5fff6d6c9160cfa97c623e84f48ec2f32249f1b5e2c7f8", "scheme": "https", "urlStyle": "VIRTUAL_HOSTED_STYLE", "expectedCanonicalRequest": "GET\n/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:test-bucket.storage.googleapis.com\n\nhost\nUNSIGNED-PAYLOAD", "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\n89eeae48258eccdcb1f592fb908008e3f5d36a949c002c1e614c94356dc18fc6" - } + }, + { + "description": "Get Bucket with HTTP Bucket Bound Hostname Support", + "bucket": "test-bucket", + "method": "GET", + "expiration": 10, + "timestamp": "20190201T090000Z", + "expectedUrl": "http://mydomain.tld/?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=13a256f7afda0a733cc21e9c804b1d2c37f64f9a18956fe11ccce57765115dda24c1d342d364b533e1ab95fcf5ca6b7646f2d5bb008ca9c731d01cdad932f56c21fe5528acfd9cc290c823316992fe791424c5c4b1a2d0b6857d90702be7ec05f3d585ffe1a58a7ab1782643512dad430581dafbeff8669e1b7ec3122c51dbf8c0509f9f746a6208c8d8847493476949959cacdbdc4e024c65055c9af2b51767d2bf8b4e95f10e9ecda3977e9a9cf47d4a4626da1711b79ee344dea82c459826f0e9c31350d8129dc0dc49b203ea301681ba5092e13e362bc657059fd07fd62f0751f6ced8ea50caeb5316c8ed8bca05c793d302853f2fe016305d258e1e212b", + "scheme": "http", + "urlStyle": "BUCKET_BOUND_HOSTNAME", + "bucketBoundHostname": "mydomain.tld" + }, + { + "description": "Get Bucket with HTTPS Bucket Bound Hostname Support", + "bucket": "test-bucket", + "method": "GET", + "expiration": 10, + "timestamp": "20190201T090000Z", + "expectedUrl": "https://mydomain.tld/?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=13a256f7afda0a733cc21e9c804b1d2c37f64f9a18956fe11ccce57765115dda24c1d342d364b533e1ab95fcf5ca6b7646f2d5bb008ca9c731d01cdad932f56c21fe5528acfd9cc290c823316992fe791424c5c4b1a2d0b6857d90702be7ec05f3d585ffe1a58a7ab1782643512dad430581dafbeff8669e1b7ec3122c51dbf8c0509f9f746a6208c8d8847493476949959cacdbdc4e024c65055c9af2b51767d2bf8b4e95f10e9ecda3977e9a9cf47d4a4626da1711b79ee344dea82c459826f0e9c31350d8129dc0dc49b203ea301681ba5092e13e362bc657059fd07fd62f0751f6ced8ea50caeb5316c8ed8bca05c793d302853f2fe016305d258e1e212b", + "scheme": "https", + "urlStyle": "BUCKET_BOUND_HOSTNAME", + "bucketBoundHostname": "mydomain.tld" + }, + { + "description": "HTTP Bucket Bound Hostname Support", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "http://mydomain.tld/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=352cf27e2dae4545fd6c3eb62bb4852f9a2a41013a9279c2bdbb9a37a1de4cadd1cedb887eedd190131fb1fbae44eb4b340cde735176885aca75b46f251ba5017b97f0816d2750b80484ca64707d630172793e953da918e9fd8afcbe03f0cf380f53cc8117eff41584b5da5c19cdc4aee0736bdd446126da96c6373ad67e6dce79d4c72a502148d0814e7ff3a94fb3a7a891e35a180a32b468f28837f443bfa56aab9424451d5f8b010c2c08442204b1c1d99cb10b45a2418ffd965cf9bbc07f1a45f060d6a05d62edf4229d382af849e7b757e00526957e96358737a2855c4683fa3e3b405e7d423cae46a402b191c7c76e6a903d8a49fab7f63083fc0d5f0c", + "scheme": "http", + "urlStyle": "BUCKET_BOUND_HOSTNAME", + "bucketBoundHostname": "mydomain.tld", + "expectedCanonicalRequest": "GET\n/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:mydomain.tld\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\nd6c309924b51a5abbe4d6356f7bf29c2120c6b14649b1e97b3bc9309adca7d4b" + }, + { + "description": "HTTPS Bucket Bound Hostname Support", + "bucket": "test-bucket", + "object": "test-object", + "method": "GET", + "expiration": 10, + "timestamp": "2019-02-01T09:00:00Z", + "expectedUrl": "https://mydomain.tld/test-object?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F2019-02-%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=2019-02-01T09%3A00%3A00Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host&X-Goog-Signature=352cf27e2dae4545fd6c3eb62bb4852f9a2a41013a9279c2bdbb9a37a1de4cadd1cedb887eedd190131fb1fbae44eb4b340cde735176885aca75b46f251ba5017b97f0816d2750b80484ca64707d630172793e953da918e9fd8afcbe03f0cf380f53cc8117eff41584b5da5c19cdc4aee0736bdd446126da96c6373ad67e6dce79d4c72a502148d0814e7ff3a94fb3a7a891e35a180a32b468f28837f443bfa56aab9424451d5f8b010c2c08442204b1c1d99cb10b45a2418ffd965cf9bbc07f1a45f060d6a05d62edf4229d382af849e7b757e00526957e96358737a2855c4683fa3e3b405e7d423cae46a402b191c7c76e6a903d8a49fab7f63083fc0d5f0c", + "scheme": "https", + "urlStyle": "BUCKET_BOUND_HOSTNAME", + "bucketBoundHostname": "mydomain.tld", + "expectedCanonicalRequest": "GET\n/test-object\nX-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=test-iam-credentials%40test-project-id.iam.gserviceaccount.com%2F20190201%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20190201T090000Z&X-Goog-Expires=10&X-Goog-SignedHeaders=host\nhost:mydomain.tld\n\nhost\nUNSIGNED-PAYLOAD", + "expectedStringToSign": "GOOG4-RSA-SHA256\n20190201T090000Z\n20190201/auto/storage/goog4_request\nd6c309924b51a5abbe4d6356f7bf29c2120c6b14649b1e97b3bc9309adca7d4b" + } ], - "postPolicyV4Tests": [ - { - "description": "POST Policy Simple", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z" - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902670-h3q7wvodjor6bc7y/", - "fields": { - "key": "test-object", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", - "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + { + "description": "POST Policy Simple", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z" }, - - { - "description": "POST Policy Simple Virtual Hosted Style", - "policyInput": { - "scheme": "https", - "urlStyle": "VIRTUAL_HOSTED_STYLE", - "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z" - }, - "policyOutput": { - "url": "https://rsaposttest-1579902670-h3q7wvodjor6bc7y.storage.googleapis.com/", - "fields": { - "key": "test-object", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", - "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902670-h3q7wvodjor6bc7y/", + "fields": { + "key": "test-object", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", + "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Simple Virtual Hosted Style", + "policyInput": { + "scheme": "https", + "urlStyle": "VIRTUAL_HOSTED_STYLE", + "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z" }, - - { - "description": "POST Policy Simple Bucket Bound Hostname", - "policyInput": { - "scheme": "https", - "urlStyle": "BUCKET_BOUND_HOSTNAME", - "bucketBoundHostname": "mydomain.tld", - "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z" - }, - "policyOutput": { - "url": "https://mydomain.tld/", - "fields": { - "key": "test-object", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", - "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://rsaposttest-1579902670-h3q7wvodjor6bc7y.storage.googleapis.com/", + "fields": { + "key": "test-object", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", + "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Simple Bucket Bound Hostname", + "policyInput": { + "scheme": "https", + "urlStyle": "BUCKET_BOUND_HOSTNAME", + "bucketBoundHostname": "mydomain.tld", + "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z" }, - - { - "description": "POST Policy Simple Bucket Bound Hostname HTTP", - "policyInput": { - "scheme": "http", - "urlStyle": "BUCKET_BOUND_HOSTNAME", - "bucketBoundHostname": "mydomain.tld", - "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z" - }, - "policyOutput": { - "url": "http://mydomain.tld/", - "fields": { - "key": "test-object", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", - "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://mydomain.tld/", + "fields": { + "key": "test-object", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", + "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Simple Bucket Bound Hostname HTTP", + "policyInput": { + "scheme": "http", + "urlStyle": "BUCKET_BOUND_HOSTNAME", + "bucketBoundHostname": "mydomain.tld", + "bucket": "rsaposttest-1579902670-h3q7wvodjor6bc7y", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z" }, - - { - "description": "POST Policy ACL matching", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902662-x2kd7kjwh2w5izcw", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z", - "conditions": { - "startsWith": [ - "$acl", - "public" - ] - } - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902662-x2kd7kjwh2w5izcw/", - "fields": { - "key": "test-object", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "8633cb542c81d25b2ee26fd017101649771023349a9812ca59f4162df275192c7193213ccff0dddd58c1007698d46e2cb3ab14b64fe52558252feda8d4f9b27d5d4fa8264d8b005e4cc7edcd6fd60ca5df5d6022cbff3b351de46d9e7f501b737f4d04233b7bd4df8f1a1740dcc6807a619801b71cc3c22d4c3aa5c1a4dafde9d5d87400fa04d54c569ba1cf6af66fcc6d257430d88502447c1ce65a99fe5f1370c3f40a843fe4bb9ce115605a96947e4660977765ffdf31ef0fbc3c2c89db48fbf1204be8bb47d46d38adb18bf36f3861ef4be393f4b0ad8ca72b13eda2d7e359bd379789c3e4801cc12f5374d6eb604fa36b3de9a640222f13e3ef8fdadbaf", - "policy": "eyJjb25kaXRpb25zIjpbWyJzdGFydHMtd2l0aCIsIiRhY2wiLCJwdWJsaWMiXSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NjIteDJrZDdrandoMnc1aXpjdyJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" - }, - "expectedDecodedPolicy": "{\"conditions\":[[\"starts-with\",\"$acl\",\"public\"],{\"bucket\":\"rsaposttest-1579902662-x2kd7kjwh2w5izcw\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "http://mydomain.tld/", + "fields": { + "key": "test-object", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "14c84353d4b5ae3d210290ab4ab185a974db36f697ebbdc011e7deda08cd5ecb7bd2682f0ac87b06540ddbfd9a74c4dbcc355795bb6d9383f2a3b5acc45615e058647b94896c2a18abb1fab04fa099b6770a2836b2232a810471b1e48461f37906dad134756d075bbfb6cba28b1d0da70579a3365b2ba336b43d44da476a13eb21a45241b0c483aaaa7aa40d17812c24e125d16670d1accf6eae42007b7000a4ee51247c5f76f070c9b360611f8dc713fef027ffd38ac19f6d68140701a036b143a522bf3e4d2a3db44decb5f32ed1bf062ae87e576d50fee0adce4ee9aeb61fa6b2605cf1f63ea9d886ac5d75135fdbc102fcf8e320f38570eabe1697fefef9", + "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcwLWgzcTd3dm9kam9yNmJjN3kifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"bucket\":\"rsaposttest-1579902670-h3q7wvodjor6bc7y\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy ACL matching", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902662-x2kd7kjwh2w5izcw", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "conditions": { + "startsWith": [ + "$acl", + "public" + ] + } }, - - { - "description": "POST Policy Within Content-Range", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902672-lpd47iogn6hx4sle", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z", - "conditions": { - "contentLengthRange": [ - 246, - 266 - ] - } - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902672-lpd47iogn6hx4sle/", - "fields": { - "key": "test-object", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "1d045155adcf3d0fe063d7b78ea1a4f86cdc8361f58ea90b4fd724c563a84d9b0e02a8b01e7a5c7587b32eb40839e28cf279bc8b4eb1e9a6f1c9bae372e799cea10ef34baaf310f99acd9849785a89fb69533c2ba8db6b6b4f87a1dcbbdeea8316f822092e6cad18b80f9610c219f239a606d182a092ae439ccbaa3543709faae8cc3410e9eafb2885f6f74b9ec4eb5982dfe43492cc8c863330314616f5cd34d4b2a3ec6ad857a9a47d68381d714b010fc243e17fe68b3ccdfe205222ca63bc4d7d7177dd7ec4e9376e3d3ae05a5d629b9ceceab127628c2669f35fa735dc01a225e6a7c98db930694f6e6a77e20ec0c8e509d230cf73cc530cdc237c6f079d", - "policy": "eyJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMjQ2LDI2Nl0seyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcyLWxwZDQ3aW9nbjZoeDRzbGUifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[[\"content-length-range\",246,266],{\"bucket\":\"rsaposttest-1579902672-lpd47iogn6hx4sle\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902662-x2kd7kjwh2w5izcw/", + "fields": { + "key": "test-object", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "8633cb542c81d25b2ee26fd017101649771023349a9812ca59f4162df275192c7193213ccff0dddd58c1007698d46e2cb3ab14b64fe52558252feda8d4f9b27d5d4fa8264d8b005e4cc7edcd6fd60ca5df5d6022cbff3b351de46d9e7f501b737f4d04233b7bd4df8f1a1740dcc6807a619801b71cc3c22d4c3aa5c1a4dafde9d5d87400fa04d54c569ba1cf6af66fcc6d257430d88502447c1ce65a99fe5f1370c3f40a843fe4bb9ce115605a96947e4660977765ffdf31ef0fbc3c2c89db48fbf1204be8bb47d46d38adb18bf36f3861ef4be393f4b0ad8ca72b13eda2d7e359bd379789c3e4801cc12f5374d6eb604fa36b3de9a640222f13e3ef8fdadbaf", + "policy": "eyJjb25kaXRpb25zIjpbWyJzdGFydHMtd2l0aCIsIiRhY2wiLCJwdWJsaWMiXSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NjIteDJrZDdrandoMnc1aXpjdyJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" + }, + "expectedDecodedPolicy": "{\"conditions\":[[\"starts-with\",\"$acl\",\"public\"],{\"bucket\":\"rsaposttest-1579902662-x2kd7kjwh2w5izcw\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Within Content-Range", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902672-lpd47iogn6hx4sle", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "conditions": { + "contentLengthRange": [ + 246, + 266 + ] + } }, - - { - "description": "POST Policy Cache-Control File Header", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902669-nwk5s7vvfjgdjs62", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z", - "fields": { - "acl": "public-read", - "cache-control": "public,max-age=86400" - } - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902669-nwk5s7vvfjgdjs62/", - "fields": { - "key": "test-object", - "acl": "public-read", - "cache-control": "public,max-age=86400", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "7a6747dc40f0a8ba1bb0e9140d4299e6f9fd083017bbd98ed8ac21e05e577c70cfefcf26d0a0d378052aaf9b5511ee85f04bff03ffb1044c847c2cf624a4536495079d12d0391cecfa28010a8ee7dc99f57e93203e11b1257dc2a2a17542f0defff102f2bd2dba0439678d35e3ee2a7fb146ab282f77dec6d01a4bb002f96ba33fd70dbbe89919012a3b9a9f4c8058bf1249a8b34d1988e9bba5c73b650653262d05d5fabecaef5aaa8d3a2e70512db297f1aca65fb574bebfda728ed4b5715916679f94873f9fa2c3702f1a9dc4aa7a7c440138a9a419503d0029559d62869e70851247075c561b219c62719582b0a8257e4ce5123d19f87482cdbfe5c185f2", - "policy": "eyJjb25kaXRpb25zIjpbeyJhY2wiOiJwdWJsaWMtcmVhZCJ9LHsiY2FjaGUtY29udHJvbCI6InB1YmxpYyxtYXgtYWdlPTg2NDAwIn0seyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjY5LW53azVzN3Z2ZmpnZGpzNjIifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"acl\":\"public-read\"},{\"cache-control\":\"public,max-age=86400\"},{\"bucket\":\"rsaposttest-1579902669-nwk5s7vvfjgdjs62\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902672-lpd47iogn6hx4sle/", + "fields": { + "key": "test-object", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "1d045155adcf3d0fe063d7b78ea1a4f86cdc8361f58ea90b4fd724c563a84d9b0e02a8b01e7a5c7587b32eb40839e28cf279bc8b4eb1e9a6f1c9bae372e799cea10ef34baaf310f99acd9849785a89fb69533c2ba8db6b6b4f87a1dcbbdeea8316f822092e6cad18b80f9610c219f239a606d182a092ae439ccbaa3543709faae8cc3410e9eafb2885f6f74b9ec4eb5982dfe43492cc8c863330314616f5cd34d4b2a3ec6ad857a9a47d68381d714b010fc243e17fe68b3ccdfe205222ca63bc4d7d7177dd7ec4e9376e3d3ae05a5d629b9ceceab127628c2669f35fa735dc01a225e6a7c98db930694f6e6a77e20ec0c8e509d230cf73cc530cdc237c6f079d", + "policy": "eyJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMjQ2LDI2Nl0seyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjcyLWxwZDQ3aW9nbjZoeDRzbGUifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[[\"content-length-range\",246,266],{\"bucket\":\"rsaposttest-1579902672-lpd47iogn6hx4sle\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Cache-Control File Header", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902669-nwk5s7vvfjgdjs62", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "fields": { + "acl": "public-read", + "cache-control": "public,max-age=86400" + } + }, + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902669-nwk5s7vvfjgdjs62/", + "fields": { + "key": "test-object", + "acl": "public-read", + "cache-control": "public,max-age=86400", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "7a6747dc40f0a8ba1bb0e9140d4299e6f9fd083017bbd98ed8ac21e05e577c70cfefcf26d0a0d378052aaf9b5511ee85f04bff03ffb1044c847c2cf624a4536495079d12d0391cecfa28010a8ee7dc99f57e93203e11b1257dc2a2a17542f0defff102f2bd2dba0439678d35e3ee2a7fb146ab282f77dec6d01a4bb002f96ba33fd70dbbe89919012a3b9a9f4c8058bf1249a8b34d1988e9bba5c73b650653262d05d5fabecaef5aaa8d3a2e70512db297f1aca65fb574bebfda728ed4b5715916679f94873f9fa2c3702f1a9dc4aa7a7c440138a9a419503d0029559d62869e70851247075c561b219c62719582b0a8257e4ce5123d19f87482cdbfe5c185f2", + "policy": "eyJjb25kaXRpb25zIjpbeyJhY2wiOiJwdWJsaWMtcmVhZCJ9LHsiY2FjaGUtY29udHJvbCI6InB1YmxpYyxtYXgtYWdlPTg2NDAwIn0seyJidWNrZXQiOiJyc2Fwb3N0dGVzdC0xNTc5OTAyNjY5LW53azVzN3Z2ZmpnZGpzNjIifSx7ImtleSI6InRlc3Qtb2JqZWN0In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"acl\":\"public-read\"},{\"cache-control\":\"public,max-age=86400\"},{\"bucket\":\"rsaposttest-1579902669-nwk5s7vvfjgdjs62\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Success With Status", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902678-pt5yms55j47r6qy4", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "fields": { + "success_action_status": "200" + } }, - - { - "description": "POST Policy Success With Status", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902678-pt5yms55j47r6qy4", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z", - "fields": { - "success_action_status": "200" - } - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902678-pt5yms55j47r6qy4/", - "fields": { - "key": "test-object", - "success_action_status": "200", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "715d3148bb583601983680441caef60a5b6c14b62e62672e8cd5b7ca970837259c573121fa127635432f10fc6321775d6c4fc0601004dc6708887356256f95f0b7ea02ec347f75ad9884f5b02d7cdfa99d777edb936d0334a07bcfd9742c67a2b025b2de9f2beec43461dc5d18ad84cd6d0f069e5ecacda4367e5035116560751978cfc5a2ebc459d92d3d48ee8b98a3f24f84a12bf3c64c52b731c4220b3ed787c7314eb604525c807abf259e0d9c50848c08e57d2eb12ce5fa45337f6466e78e0c2e0d19a6fa5b70d6347d49c654bd95ba544006625530bbf5e6d1f1e204f2b39396a3091edc30229ed64680768f37bfdac29c92b1274e94e929639159c664", - "policy": "eyJjb25kaXRpb25zIjpbeyJzdWNjZXNzX2FjdGlvbl9zdGF0dXMiOiIyMDAifSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NzgtcHQ1eW1zNTVqNDdyNnF5NCJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"success_action_status\":\"200\"},{\"bucket\":\"rsaposttest-1579902678-pt5yms55j47r6qy4\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902678-pt5yms55j47r6qy4/", + "fields": { + "key": "test-object", + "success_action_status": "200", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "715d3148bb583601983680441caef60a5b6c14b62e62672e8cd5b7ca970837259c573121fa127635432f10fc6321775d6c4fc0601004dc6708887356256f95f0b7ea02ec347f75ad9884f5b02d7cdfa99d777edb936d0334a07bcfd9742c67a2b025b2de9f2beec43461dc5d18ad84cd6d0f069e5ecacda4367e5035116560751978cfc5a2ebc459d92d3d48ee8b98a3f24f84a12bf3c64c52b731c4220b3ed787c7314eb604525c807abf259e0d9c50848c08e57d2eb12ce5fa45337f6466e78e0c2e0d19a6fa5b70d6347d49c654bd95ba544006625530bbf5e6d1f1e204f2b39396a3091edc30229ed64680768f37bfdac29c92b1274e94e929639159c664", + "policy": "eyJjb25kaXRpb25zIjpbeyJzdWNjZXNzX2FjdGlvbl9zdGF0dXMiOiIyMDAifSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NzgtcHQ1eW1zNTVqNDdyNnF5NCJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"success_action_status\":\"200\"},{\"bucket\":\"rsaposttest-1579902678-pt5yms55j47r6qy4\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Success With Redirect", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902671-6ldm6caw4se52vrx", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "fields": { + "success_action_redirect": "http://www.google.com/" + } }, - - { - "description": "POST Policy Success With Redirect", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902671-6ldm6caw4se52vrx", - "object": "test-object", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z", - "fields": { - "success_action_redirect": "http://www.google.com/" - } - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902671-6ldm6caw4se52vrx/", - "fields": { - "key": "test-object", - "success_action_redirect": "http://www.google.com/", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "81fafe1673360887b2cb2650c80e59681ad6792da7ebe1eb1d281df7e7beff257e82a1007096811ab36c93091f2ae623f0e90a27cf925a8002f8234ddb49315cc5968fa4f209aca80f1e9f214ff4d24522bb4a1904ea365e852bcd3a0bdb0ab5bacc3f82b70d04e30afc8f82e277c6837006ad6b5eaf08423d88400e88cba979f3474ed4dc8cf10181dfcb6dc9850096ee07b7180891cb806394d1b0c1f0708640474ace629b5fb75366ab370d909ebdcd30fe5d0f1c33947ca2c0f26c05543bc381fabe514772d9b6f1f2b6cf9ac40a0bd266fb52ebe9043e721e338f40cbd3f0d84838d29bece5c76e4fad115400017b5187dd5be3094a3f90865032776fc7", - "policy": "eyJjb25kaXRpb25zIjpbeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8ifSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NzEtNmxkbTZjYXc0c2U1MnZyeCJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"success_action_redirect\":\"http://www.google.com/\"},{\"bucket\":\"rsaposttest-1579902671-6ldm6caw4se52vrx\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902671-6ldm6caw4se52vrx/", + "fields": { + "key": "test-object", + "success_action_redirect": "http://www.google.com/", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "81fafe1673360887b2cb2650c80e59681ad6792da7ebe1eb1d281df7e7beff257e82a1007096811ab36c93091f2ae623f0e90a27cf925a8002f8234ddb49315cc5968fa4f209aca80f1e9f214ff4d24522bb4a1904ea365e852bcd3a0bdb0ab5bacc3f82b70d04e30afc8f82e277c6837006ad6b5eaf08423d88400e88cba979f3474ed4dc8cf10181dfcb6dc9850096ee07b7180891cb806394d1b0c1f0708640474ace629b5fb75366ab370d909ebdcd30fe5d0f1c33947ca2c0f26c05543bc381fabe514772d9b6f1f2b6cf9ac40a0bd266fb52ebe9043e721e338f40cbd3f0d84838d29bece5c76e4fad115400017b5187dd5be3094a3f90865032776fc7", + "policy": "eyJjb25kaXRpb25zIjpbeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8ifSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NzEtNmxkbTZjYXc0c2U1MnZyeCJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"success_action_redirect\":\"http://www.google.com/\"},{\"bucket\":\"rsaposttest-1579902671-6ldm6caw4se52vrx\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy Character Escaping", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902671-6ldm6caw4se52vrx", + "object": "$test-object-é", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "fields": { + "success_action_redirect": "http://www.google.com/", + "x-goog-meta-custom-1": "$test-object-é-metadata" + } + }, + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902671-6ldm6caw4se52vrx/", + "fields": { + "key": "$test-object-é", + "success_action_redirect": "http://www.google.com/", + "x-goog-meta-custom-1": "$test-object-é-metadata", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "5eaf9f931bc4ab76dbf2c95d1bc08843a5cfadc4d5de87b2503e8fb791c7b9b6948f77b0d85f9b336a9683abffc648879d0d92cf94c5781407b057a9049fb7bd17625171328acc9e7c0b094739ec992e7a834b1698a370dc2d7ad19abaf5a02c158a6d71a872ad60ae07ae0c3952c298d25106fc062902db33e91a49199ffc2eff0eab191dcb4339c4afb2d82cbb3871447c4fd9ef524d0571083bdbd041f99f4a8a35395b9e2ed04c8994cdd9c5bb7396115adfd2c433d0647f756e5cc4e5b9fd7a587d50c83dc8407b4d372450219b77bcf278d0cba6a8afdf4b38a4ed6caef422acd299e0477f292d7fa688a55080d5e0aa7fddb09d81e700ad986ae77908", + "policy": "eyJjb25kaXRpb25zIjpbeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8ifSx7IngtZ29vZy1tZXRhLWN1c3RvbS0xIjoiJHRlc3Qtb2JqZWN0LVx1MDBlOS1tZXRhZGF0YSJ9LHsiYnVja2V0IjoicnNhcG9zdHRlc3QtMTU3OTkwMjY3MS02bGRtNmNhdzRzZTUydnJ4In0seyJrZXkiOiIkdGVzdC1vYmplY3QtXHUwMGU5In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"success_action_redirect\":\"http://www.google.com/\"},{\"x-goog-meta-custom-1\":\"$test-object-\u00e9-metadata\"},{\"bucket\":\"rsaposttest-1579902671-6ldm6caw4se52vrx\"},{\"key\":\"$test-object-\u00e9\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" + } + }, + { + "description": "POST Policy With Additional Metadata", + "policyInput": { + "scheme": "https", + "bucket": "rsaposttest-1579902671-6ldm6caw4se52vrx", + "object": "test-object", + "expiration": 10, + "timestamp": "2020-01-23T04:35:30Z", + "fields": { + "content-disposition": "attachment; filename=\"~._-%=/é0Aa\"", + "content-encoding": "gzip", + "content-type": "text/plain", + "success_action_redirect": "http://www.google.com/" + } }, - - { - "description": "POST Policy Character Escaping", - "policyInput": { - "scheme": "https", - "bucket": "rsaposttest-1579902671-6ldm6caw4se52vrx", - "object": "$test-object-é", - "expiration": 10, - "timestamp": "2020-01-23T04:35:30Z", - "fields": { - "success_action_redirect": "http://www.google.com/", - "x-goog-meta-custom-1": "$test-object-é-metadata" - } - }, - "policyOutput": { - "url": "https://storage.googleapis.com/rsaposttest-1579902671-6ldm6caw4se52vrx/", - "fields": { - "key": "$test-object-é", - "success_action_redirect": "http://www.google.com/", - "x-goog-meta-custom-1": "$test-object-é-metadata", - "x-goog-algorithm": "GOOG4-RSA-SHA256", - "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", - "x-goog-date": "20200123T043530Z", - "x-goog-signature": "5eaf9f931bc4ab76dbf2c95d1bc08843a5cfadc4d5de87b2503e8fb791c7b9b6948f77b0d85f9b336a9683abffc648879d0d92cf94c5781407b057a9049fb7bd17625171328acc9e7c0b094739ec992e7a834b1698a370dc2d7ad19abaf5a02c158a6d71a872ad60ae07ae0c3952c298d25106fc062902db33e91a49199ffc2eff0eab191dcb4339c4afb2d82cbb3871447c4fd9ef524d0571083bdbd041f99f4a8a35395b9e2ed04c8994cdd9c5bb7396115adfd2c433d0647f756e5cc4e5b9fd7a587d50c83dc8407b4d372450219b77bcf278d0cba6a8afdf4b38a4ed6caef422acd299e0477f292d7fa688a55080d5e0aa7fddb09d81e700ad986ae77908", - "policy": "eyJjb25kaXRpb25zIjpbeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8ifSx7IngtZ29vZy1tZXRhLWN1c3RvbS0xIjoiJHRlc3Qtb2JqZWN0LVx1MDBlOS1tZXRhZGF0YSJ9LHsiYnVja2V0IjoicnNhcG9zdHRlc3QtMTU3OTkwMjY3MS02bGRtNmNhdzRzZTUydnJ4In0seyJrZXkiOiIkdGVzdC1vYmplY3QtXHUwMGU5In0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMTIzVDA0MzUzMFoifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdC1pYW0tY3JlZGVudGlhbHNAZHVtbXktcHJvamVjdC1pZC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbS8yMDIwMDEyMy9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAxLTIzVDA0OjM1OjQwWiJ9" - }, - "expectedDecodedPolicy": "{\"conditions\":[{\"success_action_redirect\":\"http://www.google.com/\"},{\"x-goog-meta-custom-1\":\"$test-object-\u00e9-metadata\"},{\"bucket\":\"rsaposttest-1579902671-6ldm6caw4se52vrx\"},{\"key\":\"$test-object-\u00e9\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" - } + "policyOutput": { + "url": "https://storage.googleapis.com/rsaposttest-1579902671-6ldm6caw4se52vrx/", + "fields": { + "content-disposition": "attachment; filename=\"~._-%=/é0Aa\"", + "content-encoding": "gzip", + "content-type": "text/plain", + "key": "test-object", + "success_action_redirect": "http://www.google.com/", + "x-goog-algorithm": "GOOG4-RSA-SHA256", + "x-goog-credential": "test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request", + "x-goog-date": "20200123T043530Z", + "x-goog-signature": "26d9a4e0d9eb5f48267b121b588b1ce8b27e2db7fc5b2a8c42ba6d72010a0876fe234c5acc939a9152b57bbce67f07424afb21030f214cab3ae3208f00026bb8b7eb92b961011afe2a109babc25d11db5b4059e982552ef100dc17adf787a26eaa5a7c80fd947f1565dbc1b513c436bfe3b9dd1a5a9a06c6436b12a7c78214190814ca263e2d90aa20bc2ff01167381dd0be22de1e70e7582e6dd404b666273746f4f535a2ed711d40a760ba699ddf6b5e1faff13cd691729824f65a2162cd3ffb95d171c2f6f5b403b28361cd2e91543c6e2acd2f18fe42baf42e2b415475c297ae82ea19924b380a1b389a6d4e44567a022efde15f2f8ba06ab4cc8dd77006", + "policy": "eyJjb25kaXRpb25zIjpbeyJjb250ZW50LWRpc3Bvc2l0aW9uIjoiYXR0YWNobWVudDsgZmlsZW5hbWU9XCJ+Ll8tJT0vXHUwMGU5MEFhXCIifSx7ImNvbnRlbnQtZW5jb2RpbmciOiJnemlwIn0seyJjb250ZW50LXR5cGUiOiJ0ZXh0L3BsYWluIn0seyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8ifSx7ImJ1Y2tldCI6InJzYXBvc3R0ZXN0LTE1Nzk5MDI2NzEtNmxkbTZjYXc0c2U1MnZyeCJ9LHsia2V5IjoidGVzdC1vYmplY3QifSx7IngtZ29vZy1kYXRlIjoiMjAyMDAxMjNUMDQzNTMwWiJ9LHsieC1nb29nLWNyZWRlbnRpYWwiOiJ0ZXN0LWlhbS1jcmVkZW50aWFsc0BkdW1teS1wcm9qZWN0LWlkLmlhbS5nc2VydmljZWFjY291bnQuY29tLzIwMjAwMTIzL2F1dG8vc3RvcmFnZS9nb29nNF9yZXF1ZXN0In0seyJ4LWdvb2ctYWxnb3JpdGhtIjoiR09PRzQtUlNBLVNIQTI1NiJ9XSwiZXhwaXJhdGlvbiI6IjIwMjAtMDEtMjNUMDQ6MzU6NDBaIn0=" + }, + "expectedDecodedPolicy": "{\"conditions\":[{\"content-disposition\":\"attachment; filename=\"~._-%=/é0Aa\"\"},{\"content-encoding\":\"gzip\"},{\"content-type\":\"text/plain\"},{\"success_action_redirect\":\"http://www.google.com/\"},{\"bucket\":\"rsaposttest-1579902671-6ldm6caw4se52vrx\"},{\"key\":\"test-object\"},{\"x-goog-date\":\"20200123T043530Z\"},{\"x-goog-credential\":\"test-iam-credentials@test-project-id.iam.gserviceaccount.com/20200123/auto/storage/goog4_request\"},{\"x-goog-algorithm\":\"GOOG4-RSA-SHA256\"}],\"expiration\":\"2020-01-23T04:35:40Z\"}" } + } ] -} \ No newline at end of file + } \ No newline at end of file From 2b449cd289cb573ca1653bba37ecb84d35a025ad Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 18 May 2023 16:02:56 -0700 Subject: [PATCH 171/509] chore: add option to delete benchmarking bucket (#1038) --- tests/perf/README.md | 1 + tests/perf/_perf_utils.py | 13 +++++++------ tests/perf/benchmarking.py | 8 +++++++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/tests/perf/README.md b/tests/perf/README.md index 995f1b04a..14b8f7be7 100644 --- a/tests/perf/README.md +++ b/tests/perf/README.md @@ -32,6 +32,7 @@ $ python3 benchmarking.py --num_samples 10000 --object_size 5120..16384 --output | --test_type | test type to run benchmarking | `w1r3`, `range` | `w1r3` | | --output_file | file to output results to | any file path | `output_bench.csv` | | --tmp_dir | temp directory path on file system | any file path | `tm-perf-metrics` | +| --delete_bucket | whether or not to delete GCS bucket used for benchmarking| bool | `False` | ## Workload definition and CSV headers diff --git a/tests/perf/_perf_utils.py b/tests/perf/_perf_utils.py index 6ec9bc457..d86568d7e 100644 --- a/tests/perf/_perf_utils.py +++ b/tests/perf/_perf_utils.py @@ -193,7 +193,7 @@ def get_bucket_instance(bucket_name): return bucket -def cleanup_bucket(bucket): +def cleanup_bucket(bucket, delete_bucket=False): # Delete blobs first as the bucket may contain more than 256 blobs. try: blobs = bucket.list_blobs() @@ -201,11 +201,12 @@ def cleanup_bucket(bucket): blob.delete() except Exception as e: logging.exception(f"Caught an exception while deleting blobs\n {e}") - # Delete bucket. - try: - bucket.delete(force=True) - except Exception as e: - logging.exception(f"Caught an exception while deleting bucket\n {e}") + # Delete bucket if delete_bucket is set to True + if delete_bucket: + try: + bucket.delete(force=True) + except Exception as e: + logging.exception(f"Caught an exception while deleting bucket\n {e}") def get_min_max_size(object_size): diff --git a/tests/perf/benchmarking.py b/tests/perf/benchmarking.py index cedb984f0..26bd85a69 100644 --- a/tests/perf/benchmarking.py +++ b/tests/perf/benchmarking.py @@ -80,7 +80,7 @@ def main(args): ) # Cleanup and delete blobs. - _pu.cleanup_bucket(bucket) + _pu.cleanup_bucket(bucket, delete_bucket=args.delete_bucket) # BBMC will not surface errors unless the process is terminated with a non zero code. if counter.count.errors != 0: @@ -173,6 +173,12 @@ def main(args): default=_pu.DEFAULT_BASE_DIR, help="Temp directory path on file system", ) + parser.add_argument( + "--delete_bucket", + type=bool, + default=False, + help="Whether or not to delete GCS bucket used for benchmarking", + ) args = parser.parse_args() main(args) From f4d863749e0624cfcc6ae8657afd40cb57a70d64 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 25 May 2023 13:21:29 -0400 Subject: [PATCH 172/509] build(deps): bump requests from 2.28.1 to 2.31.0 in /synthtool/gcp/templates/python_library/.kokoro (#1051) Source-Link: https://github.com/googleapis/synthtool/commit/30bd01b4ab78bf1b2a425816e15b3e7e090993dd Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:9bc5fa3b62b091f60614c08a7fb4fd1d3e1678e326f34dd66ce1eefb5dc3267b Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 3 ++- .kokoro/requirements.txt | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index b8edda51c..32b3c4865 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:2e247c7bf5154df7f98cce087a20ca7605e236340c7d6d1a14447e5c06791bd6 + digest: sha256:9bc5fa3b62b091f60614c08a7fb4fd1d3e1678e326f34dd66ce1eefb5dc3267b +# created: 2023-05-25T14:56:16.294623272Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 66a2172a7..3b8d7ee81 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -419,9 +419,9 @@ readme-renderer==37.3 \ --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 # via twine -requests==2.28.1 \ - --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ - --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 +requests==2.31.0 \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 # via # gcp-releasetool # google-api-core From 94a35ba7416804881973f6a5296b430bdcf2832d Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 31 May 2023 09:22:30 -0700 Subject: [PATCH 173/509] feat: allow exceptions to be included in batch responses (#1043) * feat: allow exceptions to be included in batch responses * fix docstring * address comments and update tests * more tests --- google/cloud/storage/batch.py | 39 ++++++++++++--- google/cloud/storage/client.py | 11 ++++- tests/unit/test_batch.py | 88 ++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 8 deletions(-) diff --git a/google/cloud/storage/batch.py b/google/cloud/storage/batch.py index 599aa3a7f..54ef55cd3 100644 --- a/google/cloud/storage/batch.py +++ b/google/cloud/storage/batch.py @@ -133,11 +133,18 @@ class Batch(Connection): :type client: :class:`google.cloud.storage.client.Client` :param client: The client to use for making connections. + + :type raise_exception: bool + :param raise_exception: + (Optional) Defaults to True. If True, instead of adding exceptions + to the list of return responses, the final exception will be raised. + Note that exceptions are unwrapped after all operations are complete + in success or failure, and only the last exception is raised. """ _MAX_BATCH_SIZE = 1000 - def __init__(self, client): + def __init__(self, client, raise_exception=True): api_endpoint = client._connection.API_BASE_URL client_info = client._connection._client_info super(Batch, self).__init__( @@ -145,6 +152,8 @@ def __init__(self, client): ) self._requests = [] self._target_objects = [] + self._responses = [] + self._raise_exception = raise_exception def _do_request( self, method, url, headers, data, target_object, timeout=_DEFAULT_TIMEOUT @@ -219,24 +228,34 @@ def _prepare_batch_request(self): _, body = payload.split("\n\n", 1) return dict(multi._headers), body, timeout - def _finish_futures(self, responses): + def _finish_futures(self, responses, raise_exception=True): """Apply all the batch responses to the futures created. :type responses: list of (headers, payload) tuples. :param responses: List of headers and payloads from each response in the batch. + :type raise_exception: bool + :param raise_exception: + (Optional) Defaults to True. If True, instead of adding exceptions + to the list of return responses, the final exception will be raised. + Note that exceptions are unwrapped after all operations are complete + in success or failure, and only the last exception is raised. + :raises: :class:`ValueError` if no requests have been deferred. """ # If a bad status occurs, we track it, but don't raise an exception # until all futures have been populated. + # If raise_exception=False, we add exceptions to the list of responses. exception_args = None if len(self._target_objects) != len(responses): # pragma: NO COVER raise ValueError("Expected a response for every request.") for target_object, subresponse in zip(self._target_objects, responses): - if not 200 <= subresponse.status_code < 300: + # For backwards compatibility, only the final exception will be raised. + # Set raise_exception=False to include all exceptions to the list of return responses. + if not 200 <= subresponse.status_code < 300 and raise_exception: exception_args = exception_args or subresponse elif target_object is not None: try: @@ -247,9 +266,16 @@ def _finish_futures(self, responses): if exception_args is not None: raise exceptions.from_http_response(exception_args) - def finish(self): + def finish(self, raise_exception=True): """Submit a single `multipart/mixed` request with deferred requests. + :type raise_exception: bool + :param raise_exception: + (Optional) Defaults to True. If True, instead of adding exceptions + to the list of return responses, the final exception will be raised. + Note that exceptions are unwrapped after all operations are complete + in success or failure, and only the last exception is raised. + :rtype: list of tuples :returns: one ``(headers, payload)`` tuple per deferred request. """ @@ -269,7 +295,8 @@ def finish(self): raise exceptions.from_http_response(response) responses = list(_unpack_batch_response(response)) - self._finish_futures(responses) + self._finish_futures(responses, raise_exception=raise_exception) + self._responses = responses return responses def current(self): @@ -283,7 +310,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_val, exc_tb): try: if exc_type is None: - self.finish() + self.finish(raise_exception=self._raise_exception) finally: self._client._pop_batch() diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index bcb0b59ef..042e8b2ef 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -307,17 +307,24 @@ def bucket(self, bucket_name, user_project=None): """ return Bucket(client=self, name=bucket_name, user_project=user_project) - def batch(self): + def batch(self, raise_exception=True): """Factory constructor for batch object. .. note:: This will not make an HTTP request; it simply instantiates a batch object owned by this client. + :type raise_exception: bool + :param raise_exception: + (Optional) Defaults to True. If True, instead of adding exceptions + to the list of return responses, the final exception will be raised. + Note that exceptions are unwrapped after all operations are complete + in success or failure, and only the last exception is raised. + :rtype: :class:`google.cloud.storage.batch.Batch` :returns: The batch object created. """ - return Batch(client=self) + return Batch(client=self, raise_exception=raise_exception) def _get_resource( self, diff --git a/tests/unit/test_batch.py b/tests/unit/test_batch.py index 72b54769f..37f8b8190 100644 --- a/tests/unit/test_batch.py +++ b/tests/unit/test_batch.py @@ -334,6 +334,7 @@ def test_finish_nonempty(self): result = batch.finish() self.assertEqual(len(result), len(batch._requests)) + self.assertEqual(len(result), len(batch._responses)) response1, response2, response3 = result @@ -438,6 +439,55 @@ def test_finish_nonempty_with_status_failure(self): self._check_subrequest_payload(chunks[0], "GET", url, {}) self._check_subrequest_payload(chunks[1], "GET", url, {}) + def test_finish_no_raise_exception(self): + url = "http://api.example.com/other_api" + expected_response = _make_response( + content=_TWO_PART_MIME_RESPONSE_WITH_FAIL, + headers={"content-type": 'multipart/mixed; boundary="DEADBEEF="'}, + ) + http = _make_requests_session([expected_response]) + connection = _Connection(http=http) + client = _Client(connection) + batch = self._make_one(client) + batch.API_BASE_URL = "http://api.example.com" + target1 = _MockObject() + target2 = _MockObject() + + batch._do_request("GET", url, {}, None, target1, timeout=42) + batch._do_request("GET", url, {}, None, target2, timeout=420) + + # Make sure futures are not populated. + self.assertEqual( + [future for future in batch._target_objects], [target1, target2] + ) + + batch.finish(raise_exception=False) + + self.assertEqual(len(batch._requests), 2) + self.assertEqual(len(batch._responses), 2) + + # Make sure NotFound exception is added to responses and target2 + self.assertEqual(target1._properties, {"foo": 1, "bar": 2}) + self.assertEqual(target2._properties, {"error": {"message": "Not Found"}}) + + expected_url = f"{batch.API_BASE_URL}/batch/storage/v1" + http.request.assert_called_once_with( + method="POST", + url=expected_url, + headers=mock.ANY, + data=mock.ANY, + timeout=420, # the last request timeout prevails + ) + + _, request_body, _, boundary = self._get_mutlipart_request(http) + + chunks = self._get_payload_chunks(boundary, request_body) + self.assertEqual(len(chunks), 2) + self._check_subrequest_payload(chunks[0], "GET", url, {}) + self._check_subrequest_payload(chunks[1], "GET", url, {}) + self.assertEqual(batch._responses[0].status_code, 200) + self.assertEqual(batch._responses[1].status_code, 404) + def test_finish_nonempty_non_multipart_response(self): url = "http://api.example.com/other_api" http = _make_requests_session([_make_response()]) @@ -497,6 +547,7 @@ def test_as_context_mgr_wo_error(self): self.assertEqual(list(client._batch_stack), []) self.assertEqual(len(batch._requests), 3) + self.assertEqual(len(batch._responses), 3) self.assertEqual(batch._requests[0][0], "POST") self.assertEqual(batch._requests[1][0], "PATCH") self.assertEqual(batch._requests[2][0], "DELETE") @@ -505,6 +556,43 @@ def test_as_context_mgr_wo_error(self): self.assertEqual(target2._properties, {"foo": 1, "bar": 3}) self.assertEqual(target3._properties, b"") + def test_as_context_mgr_no_raise_exception(self): + from google.cloud.storage.client import Client + + url = "http://api.example.com/other_api" + expected_response = _make_response( + content=_TWO_PART_MIME_RESPONSE_WITH_FAIL, + headers={"content-type": 'multipart/mixed; boundary="DEADBEEF="'}, + ) + http = _make_requests_session([expected_response]) + project = "PROJECT" + credentials = _make_credentials() + client = Client(project=project, credentials=credentials) + client._http_internal = http + + self.assertEqual(list(client._batch_stack), []) + + target1 = _MockObject() + target2 = _MockObject() + + with self._make_one(client, raise_exception=False) as batch: + self.assertEqual(list(client._batch_stack), [batch]) + batch._make_request("GET", url, {}, target_object=target1) + batch._make_request("GET", url, {}, target_object=target2) + + self.assertEqual(list(client._batch_stack), []) + self.assertEqual(len(batch._requests), 2) + self.assertEqual(len(batch._responses), 2) + self.assertEqual(batch._requests[0][0], "GET") + self.assertEqual(batch._requests[1][0], "GET") + self.assertEqual(batch._target_objects, [target1, target2]) + + # Make sure NotFound exception is added to responses and target2 + self.assertEqual(batch._responses[0].status_code, 200) + self.assertEqual(batch._responses[1].status_code, 404) + self.assertEqual(target1._properties, {"foo": 1, "bar": 2}) + self.assertEqual(target2._properties, {"error": {"message": "Not Found"}}) + def test_as_context_mgr_w_error(self): from google.cloud.storage.batch import _FutureDict from google.cloud.storage.client import Client From c42f4a43129f376e3d1daea19df2058719ffe296 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 1 Jun 2023 13:31:37 +0200 Subject: [PATCH 174/509] chore(deps): update all dependencies (#1042) Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 4e5bce1a9..16b451910 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.16.1 +google-cloud-pubsub==2.17.1 google-cloud-storage==2.9.0 pandas===1.3.5; python_version == '3.7' -pandas==2.0.1; python_version >= '3.8' +pandas==2.0.2; python_version >= '3.8' From d78586c388a683b8678f280df0c9456c6e109af7 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 1 Jun 2023 20:09:04 -0700 Subject: [PATCH 175/509] fix: extend wait for bucket metadata consistency in system tests (#1053) * fix: extend wait for bucket metadata consistency in system tests * delay in bucket access prevention test --------- Co-authored-by: meredithslota --- tests/system/_helpers.py | 6 +++++- tests/system/conftest.py | 16 +++++++++++++--- tests/system/test_bucket.py | 3 +++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index 5a4c7d38d..385ceaf5c 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -111,8 +111,12 @@ def delete_bucket(bucket): retry(bucket.delete)(force=True) -def await_config_changes_propagate(sec=3): +def await_config_changes_propagate(sec=12): # Changes to the bucket will be readable immediately after writing, # but configuration changes may take time to propagate. # See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch + # + # The default was changed from 3 to 12 in May 2023 due to changes in bucket + # metadata handling. Note that the documentation recommends waiting "30 + # seconds". time.sleep(sec) diff --git a/tests/system/conftest.py b/tests/system/conftest.py index c4c137007..26d5c785e 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -44,6 +44,8 @@ "parent/child/other/file32.txt", ] +ebh_bucket_iteration = 0 + @pytest.fixture(scope="session") def storage_client(): @@ -165,12 +167,20 @@ def signing_bucket(storage_client, signing_bucket_name): _helpers.delete_bucket(bucket) -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def default_ebh_bucket_name(): - return _helpers.unique_name("gcp-systest-default-ebh") + # Keep track of how many ebh buckets have been created so we can get a + # clean one each rerun. "unique_name" is unique per test iteration, not + # per test rerun. + global ebh_bucket_iteration + ebh_bucket_iteration += 1 + return _helpers.unique_name("gcp-systest-default-ebh") + "-{}".format( + ebh_bucket_iteration + ) -@pytest.fixture(scope="session") +# ebh_bucket/name are not scope=session because the bucket is modified in test. +@pytest.fixture(scope="function") def default_ebh_bucket(storage_client, default_ebh_bucket_name): bucket = storage_client.bucket(default_ebh_bucket_name) bucket.default_event_based_hold = True diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 5d7495316..0fb3a2f8d 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -920,6 +920,9 @@ def test_new_bucket_created_w_inherited_pap( bucket.iam_configuration.uniform_bucket_level_access_enabled = False bucket.patch() + + _helpers.await_config_changes_propagate() + assert ( bucket.iam_configuration.public_access_prevention == constants.PUBLIC_ACCESS_PREVENTION_ENFORCED From ab7467303f71fa71c42cdb07b43597b3889030d3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 19:26:01 -0400 Subject: [PATCH 176/509] build(deps): bump cryptography from 39.0.1 to 41.0.0 in /synthtool/gcp/templates/python_library/.kokoro (#1058) Source-Link: https://github.com/googleapis/synthtool/commit/d0f51a0c2a9a6bcca86911eabea9e484baadf64b Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:240b5bcc2bafd450912d2da2be15e62bc6de2cf839823ae4bf94d4f392b451dc Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 42 +++++++++++++++++++-------------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 32b3c4865..02a4dedce 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:9bc5fa3b62b091f60614c08a7fb4fd1d3e1678e326f34dd66ce1eefb5dc3267b -# created: 2023-05-25T14:56:16.294623272Z + digest: sha256:240b5bcc2bafd450912d2da2be15e62bc6de2cf839823ae4bf94d4f392b451dc +# created: 2023-06-03T21:25:37.968717478Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 3b8d7ee81..c7929db6d 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -113,28 +113,26 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==39.0.1 \ - --hash=sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4 \ - --hash=sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f \ - --hash=sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502 \ - --hash=sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41 \ - --hash=sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965 \ - --hash=sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e \ - --hash=sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc \ - --hash=sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad \ - --hash=sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505 \ - --hash=sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388 \ - --hash=sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6 \ - --hash=sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2 \ - --hash=sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac \ - --hash=sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695 \ - --hash=sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6 \ - --hash=sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336 \ - --hash=sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0 \ - --hash=sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c \ - --hash=sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106 \ - --hash=sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a \ - --hash=sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8 +cryptography==41.0.0 \ + --hash=sha256:0ddaee209d1cf1f180f1efa338a68c4621154de0afaef92b89486f5f96047c55 \ + --hash=sha256:14754bcdae909d66ff24b7b5f166d69340ccc6cb15731670435efd5719294895 \ + --hash=sha256:344c6de9f8bda3c425b3a41b319522ba3208551b70c2ae00099c205f0d9fd3be \ + --hash=sha256:34d405ea69a8b34566ba3dfb0521379b210ea5d560fafedf9f800a9a94a41928 \ + --hash=sha256:3680248309d340fda9611498a5319b0193a8dbdb73586a1acf8109d06f25b92d \ + --hash=sha256:3c5ef25d060c80d6d9f7f9892e1d41bb1c79b78ce74805b8cb4aa373cb7d5ec8 \ + --hash=sha256:4ab14d567f7bbe7f1cdff1c53d5324ed4d3fc8bd17c481b395db224fb405c237 \ + --hash=sha256:5c1f7293c31ebc72163a9a0df246f890d65f66b4a40d9ec80081969ba8c78cc9 \ + --hash=sha256:6b71f64beeea341c9b4f963b48ee3b62d62d57ba93eb120e1196b31dc1025e78 \ + --hash=sha256:7d92f0248d38faa411d17f4107fc0bce0c42cae0b0ba5415505df72d751bf62d \ + --hash=sha256:8362565b3835ceacf4dc8f3b56471a2289cf51ac80946f9087e66dc283a810e0 \ + --hash=sha256:84a165379cb9d411d58ed739e4af3396e544eac190805a54ba2e0322feb55c46 \ + --hash=sha256:88ff107f211ea696455ea8d911389f6d2b276aabf3231bf72c8853d22db755c5 \ + --hash=sha256:9f65e842cb02550fac96536edb1d17f24c0a338fd84eaf582be25926e993dde4 \ + --hash=sha256:a4fc68d1c5b951cfb72dfd54702afdbbf0fb7acdc9b7dc4301bbf2225a27714d \ + --hash=sha256:b7f2f5c525a642cecad24ee8670443ba27ac1fab81bba4cc24c7b6b41f2d0c75 \ + --hash=sha256:b846d59a8d5a9ba87e2c3d757ca019fa576793e8758174d3868aecb88d6fc8eb \ + --hash=sha256:bf8fc66012ca857d62f6a347007e166ed59c0bc150cefa49f28376ebe7d992a2 \ + --hash=sha256:f5d0bf9b252f30a31664b6f64432b4730bb7038339bd18b1fafe129cfc2be9be # via # gcp-releasetool # secretstorage From 11f6024a4fd0a66e8cdcc6c89c3d33534892386d Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 6 Jun 2023 15:57:00 -0700 Subject: [PATCH 177/509] docs: add clarification to batch module (#1045) * docs: add clarification to batch module * clarify constraints with batch * update docs --- google/cloud/storage/batch.py | 22 +++++++++++++++++++++- google/cloud/storage/blob.py | 4 ++++ google/cloud/storage/bucket.py | 13 ++++++++++--- samples/snippets/storage_batch_request.py | 9 ++++++++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/batch.py b/google/cloud/storage/batch.py index 54ef55cd3..03a27fc23 100644 --- a/google/cloud/storage/batch.py +++ b/google/cloud/storage/batch.py @@ -13,7 +13,21 @@ # limitations under the License. """Batch updates / deletes of storage buckets / blobs. -See https://cloud.google.com/storage/docs/json_api/v1/how-tos/batch +A batch request is a single standard HTTP request containing multiple Cloud Storage JSON API calls. +Within this main HTTP request, there are multiple parts which each contain a nested HTTP request. +The body of each part is itself a complete HTTP request, with its own verb, URL, headers, and body. + +Note that Cloud Storage does not support batch operations for uploading or downloading. +Additionally, the current batch design does not support library methods whose return values +depend on the response payload. See more details in the [Sending Batch Requests official guide](https://cloud.google.com/storage/docs/batch). + +Examples of situations when you might want to use the Batch module: +``blob.patch()`` +``blob.update()`` +``blob.delete()`` +``bucket.delete_blob()`` +``bucket.patch()`` +``bucket.update()`` """ from email.encoders import encode_noop from email.generator import Generator @@ -131,6 +145,12 @@ def content(self): class Batch(Connection): """Proxy an underlying connection, batching up change operations. + .. warning:: + + Cloud Storage does not support batch operations for uploading or downloading. + Additionally, the current batch design does not support library methods whose + return values depend on the response payload. + :type client: :class:`google.cloud.storage.client.Client` :param client: The client to use for making connections. diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 8a3f61c72..0d663e775 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -3450,6 +3450,10 @@ def rewrite( If :attr:`user_project` is set on the bucket, bills the API request to that project. + .. note:: + + ``rewrite`` is not supported in a ``Batch`` context. + :type source: :class:`Blob` :param source: blob whose contents will be rewritten into this blob. diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index ea52f3b5e..0f615f843 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1482,7 +1482,8 @@ def delete( If ``force=True`` and the bucket contains more than 256 objects / blobs this will cowardly refuse to delete the objects (or the bucket). This is to prevent accidental bucket deletion and to prevent extremely long - runtime of this method. + runtime of this method. Also note that ``force=True`` is not supported + in a ``Batch`` context. If :attr:`user_project` is set, bills the API request to that project. @@ -1675,6 +1676,7 @@ def delete_blobs( Called once for each blob raising :class:`~google.cloud.exceptions.NotFound`; otherwise, the exception is propagated. + Note that ``on_error`` is not supported in a ``Batch`` context. :type client: :class:`~google.cloud.storage.client.Client` :param client: (Optional) The client to use. If not passed, falls back @@ -1801,6 +1803,8 @@ def copy_blob( :param preserve_acl: DEPRECATED. This argument is not functional! (Optional) Copies ACL from old blob to new blob. Default: True. + Note that ``preserve_acl`` is not supported in a + ``Batch`` context. :type source_generation: long :param source_generation: (Optional) The generation of the blob to be @@ -1932,8 +1936,11 @@ def rename_blob( old blob. This means that with very large objects renaming could be a very (temporarily) costly or a very slow operation. If you need more control over the copy and deletion, instead - use `google.cloud.storage.blob.Blob.copy_to` and - `google.cloud.storage.blob.Blob.delete` directly. + use ``google.cloud.storage.blob.Blob.copy_to`` and + ``google.cloud.storage.blob.Blob.delete`` directly. + + Also note that this method is not fully supported in a + ``Batch`` context. :type blob: :class:`google.cloud.storage.blob.Blob` :param blob: The blob to be renamed. diff --git a/samples/snippets/storage_batch_request.py b/samples/snippets/storage_batch_request.py index 863fc09cd..7fe11fb1c 100644 --- a/samples/snippets/storage_batch_request.py +++ b/samples/snippets/storage_batch_request.py @@ -28,7 +28,14 @@ def batch_request(bucket_name, prefix=None): - """Use a batch request to patch a list of objects with the given prefix in a bucket.""" + """ + Use a batch request to patch a list of objects with the given prefix in a bucket. + + Note that Cloud Storage does not support batch operations for uploading or downloading. + Additionally, the current batch design does not support library methods whose return values + depend on the response payload. + See https://cloud.google.com/python/docs/reference/storage/latest/google.cloud.storage.batch + """ # The ID of your GCS bucket # bucket_name = "my-bucket" # The prefix of the object paths From 7d65c268dc95faa2cee35f8b100f02f03a2d16a4 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 13 Jun 2023 16:48:30 +0200 Subject: [PATCH 178/509] chore(deps): update dependency pytest to v7.3.2 (#1061) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 0068826c5..e389934ac 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.3.1 +pytest==7.3.2 mock==5.0.2 backoff==2.2.1 \ No newline at end of file From d02098e6d5f656f9802cf0a494b507d77b065be7 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 14 Jun 2023 14:16:06 -0700 Subject: [PATCH 179/509] feat: add matchGlob parameter to list_blobs (#1055) * feat: add matchGlob parameter to list_blobs * update docstrings and tests * move parameter order * align param order --- google/cloud/storage/bucket.py | 8 ++++++++ google/cloud/storage/client.py | 9 +++++++++ tests/system/test_bucket.py | 32 ++++++++++++++++++++++++++++++++ tests/unit/test_bucket.py | 6 ++++++ tests/unit/test_client.py | 3 +++ 5 files changed, 58 insertions(+) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 0f615f843..c3a1a0523 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1290,6 +1290,7 @@ def list_blobs( client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + match_glob=None, ): """Return an iterator used to find blobs in the bucket. @@ -1365,6 +1366,12 @@ def list_blobs( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + :type match_glob: str + :param match_glob: + (Optional) A glob pattern used to filter results (for example, foo*bar). + The string value must be UTF-8 encoded. See: + https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob + :rtype: :class:`~google.api_core.page_iterator.Iterator` :returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. @@ -1384,6 +1391,7 @@ def list_blobs( fields=fields, timeout=timeout, retry=retry, + match_glob=match_glob, ) def list_notifications( diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 042e8b2ef..7df60c306 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1127,6 +1127,7 @@ def list_blobs( page_size=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + match_glob=None, ): """Return an iterator used to find blobs in the bucket. @@ -1220,6 +1221,11 @@ def list_blobs( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + match_glob (str): + (Optional) A glob pattern used to filter results (for example, foo*bar). + The string value must be UTF-8 encoded. See: + https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob + Returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. The RPC call @@ -1238,6 +1244,9 @@ def list_blobs( if delimiter is not None: extra_params["delimiter"] = delimiter + if match_glob is not None: + extra_params["matchGlob"] = match_glob + if start_offset is not None: extra_params["startOffset"] = start_offset diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 0fb3a2f8d..6a2698e29 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -621,6 +621,38 @@ def test_bucket_list_blobs_hierarchy_w_include_trailing_delimiter( assert iterator.prefixes == expected_prefixes +@_helpers.retry_failures +def test_bucket_list_blobs_w_match_glob( + storage_client, + buckets_to_delete, + blobs_to_delete, +): + bucket_name = _helpers.unique_name("w-matchglob") + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) + buckets_to_delete.append(bucket) + + payload = b"helloworld" + blob_names = ["foo/bar", "foo/baz", "foo/foobar", "foobar"] + for name in blob_names: + blob = bucket.blob(name) + blob.upload_from_string(payload) + blobs_to_delete.append(blob) + + match_glob_results = { + "foo*bar": ["foobar"], + "foo**bar": ["foo/bar", "foo/foobar", "foobar"], + "**/foobar": ["foo/foobar", "foobar"], + "*/ba[rz]": ["foo/bar", "foo/baz"], + "*/ba[!a-y]": ["foo/baz"], + "**/{foobar,baz}": ["foo/baz", "foo/foobar", "foobar"], + "foo/{foo*,*baz}": ["foo/baz", "foo/foobar"], + } + for match_glob, expected_names in match_glob_results.items(): + blob_iter = bucket.list_blobs(match_glob=match_glob) + blobs = list(blob_iter) + assert [blob.name for blob in blobs] == expected_names + + def test_bucket_w_retention_period( storage_client, buckets_to_delete, diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 15f6356f7..0c0873ee4 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1143,6 +1143,7 @@ def test_list_blobs_w_defaults(self): expected_max_results = None expected_prefix = None expected_delimiter = None + expected_match_glob = None expected_start_offset = None expected_end_offset = None expected_include_trailing_delimiter = None @@ -1163,6 +1164,7 @@ def test_list_blobs_w_defaults(self): fields=expected_fields, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + match_glob=expected_match_glob, ) def test_list_blobs_w_explicit(self): @@ -1171,6 +1173,7 @@ def test_list_blobs_w_explicit(self): page_token = "ABCD" prefix = "subfolder" delimiter = "/" + match_glob = "**txt" start_offset = "c" end_offset = "g" include_trailing_delimiter = True @@ -1197,6 +1200,7 @@ def test_list_blobs_w_explicit(self): client=other_client, timeout=timeout, retry=retry, + match_glob=match_glob, ) self.assertIs(iterator, other_client.list_blobs.return_value) @@ -1205,6 +1209,7 @@ def test_list_blobs_w_explicit(self): expected_max_results = max_results expected_prefix = prefix expected_delimiter = delimiter + expected_match_glob = match_glob expected_start_offset = start_offset expected_end_offset = end_offset expected_include_trailing_delimiter = include_trailing_delimiter @@ -1225,6 +1230,7 @@ def test_list_blobs_w_explicit(self): fields=expected_fields, timeout=timeout, retry=retry, + match_glob=expected_match_glob, ) def test_list_notifications_w_defaults(self): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 0b5af95d6..31f7e3988 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1928,6 +1928,7 @@ def test_list_blobs_w_explicit_w_user_project(self): page_token = "ABCD" prefix = "subfolder" delimiter = "/" + match_glob = "**txt" start_offset = "c" end_offset = "g" include_trailing_delimiter = True @@ -1962,6 +1963,7 @@ def test_list_blobs_w_explicit_w_user_project(self): page_size=page_size, timeout=timeout, retry=retry, + match_glob=match_glob, ) self.assertIs(iterator, client._list_resource.return_value) @@ -1976,6 +1978,7 @@ def test_list_blobs_w_explicit_w_user_project(self): "projection": projection, "prefix": prefix, "delimiter": delimiter, + "matchGlob": match_glob, "startOffset": start_offset, "endOffset": end_offset, "includeTrailingDelimiter": include_trailing_delimiter, From 459504e190efedff713b07ec72d3fbeff0fc92c9 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 13:30:19 -0700 Subject: [PATCH 180/509] chore(main): release 2.10.0 (#1056) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 18 ++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a404f155..b04a3a05e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.10.0](https://github.com/googleapis/python-storage/compare/v2.9.0...v2.10.0) (2023-06-14) + + +### Features + +* Add matchGlob parameter to list_blobs ([#1055](https://github.com/googleapis/python-storage/issues/1055)) ([d02098e](https://github.com/googleapis/python-storage/commit/d02098e6d5f656f9802cf0a494b507d77b065be7)) +* Allow exceptions to be included in batch responses ([#1043](https://github.com/googleapis/python-storage/issues/1043)) ([94a35ba](https://github.com/googleapis/python-storage/commit/94a35ba7416804881973f6a5296b430bdcf2832d)) + + +### Bug Fixes + +* Extend wait for bucket metadata consistency in system tests ([#1053](https://github.com/googleapis/python-storage/issues/1053)) ([d78586c](https://github.com/googleapis/python-storage/commit/d78586c388a683b8678f280df0c9456c6e109af7)) + + +### Documentation + +* Add clarification to batch module ([#1045](https://github.com/googleapis/python-storage/issues/1045)) ([11f6024](https://github.com/googleapis/python-storage/commit/11f6024a4fd0a66e8cdcc6c89c3d33534892386d)) + ## [2.9.0](https://github.com/googleapis/python-storage/compare/v2.8.0...v2.9.0) (2023-05-04) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index b2a8c5535..13e710fcc 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.9.0" +__version__ = "2.10.0" From 5b492d144216177714e95645467e01c7dbc82d19 Mon Sep 17 00:00:00 2001 From: Dan Lee <71398022+dandhlee@users.noreply.github.com> Date: Wed, 28 Jun 2023 12:42:23 -0400 Subject: [PATCH 181/509] chore: unpin Sphinx version (#1066) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: unpin Sphinx version * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- noxfile.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index 7ee4a2796..7c4e6aa34 100644 --- a/noxfile.py +++ b/noxfile.py @@ -249,9 +249,7 @@ def docfx(session): session.install("-e", ".") session.install("grpcio") - session.install( - "sphinx==4.0.1", "alabaster", "recommonmark", "gcp-sphinx-docfx-yaml" - ) + session.install("gcp-sphinx-docfx-yaml", "alabaster", "recommonmark") shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) session.run( From 7a9d1886b541b0e5bb33ee06fd4a3b79c2b069fd Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 29 Jun 2023 00:08:28 +0200 Subject: [PATCH 182/509] chore(deps): update all dependencies (#1064) Co-authored-by: cojenco --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index e389934ac..c426be493 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.3.2 +pytest==7.4.0 mock==5.0.2 backoff==2.2.1 \ No newline at end of file diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 16b451910..f748902ea 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.17.1 -google-cloud-storage==2.9.0 +google-cloud-storage==2.10.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.2; python_version >= '3.8' From 051513f960ab1d31476227e364f743bc7779cca8 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 29 Jun 2023 12:27:31 -0400 Subject: [PATCH 183/509] chore: store artifacts in placer (#1067) Source-Link: https://github.com/googleapis/synthtool/commit/cb960373d12d20f8dc38beee2bf884d49627165e Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:2d816f26f728ac8b24248741e7d4c461c09764ef9f7be3684d557c9632e46dbd Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/release/common.cfg | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 02a4dedce..98994f474 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:240b5bcc2bafd450912d2da2be15e62bc6de2cf839823ae4bf94d4f392b451dc -# created: 2023-06-03T21:25:37.968717478Z + digest: sha256:2d816f26f728ac8b24248741e7d4c461c09764ef9f7be3684d557c9632e46dbd +# created: 2023-06-28T17:03:33.371210701Z diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg index b83a57783..a11679f43 100644 --- a/.kokoro/release/common.cfg +++ b/.kokoro/release/common.cfg @@ -38,3 +38,12 @@ env_vars: { key: "SECRET_MANAGER_KEYS" value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem" } + +# Store the packages we uploaded to PyPI. That way, we have a record of exactly +# what we published, which we can use to generate SBOMs and attestations. +action { + define_artifacts { + regex: "github/python-storage/**/*.tar.gz" + strip_prefix: "github/python-storage" + } +} From cc191b070c520e85030cd4cef6d7d9a7b1dd0bf4 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 29 Jun 2023 15:32:17 -0700 Subject: [PATCH 184/509] fix: split retention period tests due to caching change (#1068) --- tests/system/test_bucket.py | 56 +++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 6a2698e29..3fe909c7e 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -653,10 +653,9 @@ def test_bucket_list_blobs_w_match_glob( assert [blob.name for blob in blobs] == expected_names -def test_bucket_w_retention_period( +def test_bucket_update_retention_period( storage_client, buckets_to_delete, - blobs_to_delete, ): period_secs = 3 bucket_name = _helpers.unique_name("w-retention-period") @@ -676,23 +675,6 @@ def test_bucket_w_retention_period( assert not bucket.default_event_based_hold assert not bucket.retention_policy_locked - blob_name = "test-blob" - payload = b"DEADBEEF" - blob = bucket.blob(blob_name) - blob.upload_from_string(payload) - - blobs_to_delete.append(blob) - - other = bucket.get_blob(blob_name) - _helpers.retry_has_retention_expiration(other.reload)() - - assert not other.event_based_hold - assert not other.temporary_hold - assert isinstance(other.retention_expiration_time, datetime.datetime) - - with pytest.raises(exceptions.Forbidden): - other.delete() - bucket.retention_period = None bucket.patch() @@ -705,15 +687,41 @@ def test_bucket_w_retention_period( assert not bucket.default_event_based_hold assert not bucket.retention_policy_locked - _helpers.retry_no_retention_expiration(other.reload)() - assert not other.event_based_hold - assert not other.temporary_hold - assert other.retention_expiration_time is None +def test_delete_object_bucket_w_retention_period( + storage_client, + buckets_to_delete, + blobs_to_delete, +): + # Create a bucket with retention period. + period_secs = 12 + bucket = storage_client.bucket(_helpers.unique_name("w-retention-period")) + bucket.retention_period = period_secs + bucket.default_event_based_hold = False + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket) + buckets_to_delete.append(bucket) + + _helpers.retry_has_retention_period(bucket.reload)() + assert bucket.retention_period == period_secs + assert isinstance(bucket.retention_policy_effective_time, datetime.datetime) + + payload = b"DEADBEEF" + blob = bucket.blob(_helpers.unique_name("w-retention")) + blob.upload_from_string(payload) + blobs_to_delete.append(blob) + + _helpers.retry_has_retention_expiration(blob.reload)() + assert isinstance(blob.retention_expiration_time, datetime.datetime) + assert not blob.event_based_hold + assert not blob.temporary_hold + + # Attempts to delete objects whose age is less than the retention period should fail. + with pytest.raises(exceptions.Forbidden): + blob.delete() # Object can be deleted once it reaches the age defined in the retention policy. _helpers.await_config_changes_propagate(sec=period_secs) - other.delete() + blob.delete() blobs_to_delete.pop() From 13f6d2115f600a65fa534fa9b175e23486e51ba5 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 5 Jul 2023 17:40:32 +0200 Subject: [PATCH 185/509] chore(deps): update dependency pandas to v2.0.3 (#1069) Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index f748902ea..d8bd1cf6a 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.17.1 google-cloud-storage==2.10.0 pandas===1.3.5; python_version == '3.7' -pandas==2.0.2; python_version >= '3.8' +pandas==2.0.3; python_version >= '3.8' From c4aae3ff538cf70295f044d63cafcedf16912dae Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 12 Jul 2023 17:34:01 +0200 Subject: [PATCH 186/509] chore(deps): update dependency mock to v5.1.0 (#1075) --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index c426be493..2883c5abc 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.4.0 -mock==5.0.2 +mock==5.1.0 backoff==2.2.1 \ No newline at end of file From d04aa30d1ebf172834c5661dfccc4080551aa9b3 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 13 Jul 2023 03:47:22 +0200 Subject: [PATCH 187/509] chore(deps): update dependency google-cloud-pubsub to v2.18.0 (#1078) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index d8bd1cf6a..cdd2d9239 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.17.1 +google-cloud-pubsub==2.18.0 google-cloud-storage==2.10.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.3; python_version >= '3.8' From f9462179f4a4b08eea7471a5ffb4aa5071fc5a5e Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 11:56:45 -0400 Subject: [PATCH 188/509] build(deps): [autoapprove] bump cryptography from 41.0.0 to 41.0.2 (#1081) Source-Link: https://github.com/googleapis/synthtool/commit/d6103f4a3540ba60f633a9e25c37ec5fe7e6286d Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:39f0f3f2be02ef036e297e376fe3b6256775576da8a6ccb1d5eeb80f4c8bf8fb Co-authored-by: Owl Bot --- .coveragerc | 2 +- .flake8 | 2 +- .github/.OwlBot.lock.yaml | 4 +-- .github/auto-label.yaml | 2 +- .kokoro/build.sh | 2 +- .kokoro/docker/docs/Dockerfile | 2 +- .kokoro/populate-secrets.sh | 2 +- .kokoro/publish-docs.sh | 2 +- .kokoro/release.sh | 2 +- .kokoro/requirements.txt | 44 +++++++++++++++------------- .kokoro/test-samples-against-head.sh | 2 +- .kokoro/test-samples-impl.sh | 2 +- .kokoro/test-samples.sh | 2 +- .kokoro/trampoline.sh | 2 +- .kokoro/trampoline_v2.sh | 2 +- .pre-commit-config.yaml | 2 +- .trampolinerc | 4 +-- MANIFEST.in | 2 +- docs/conf.py | 2 +- scripts/decrypt-secrets.sh | 2 +- scripts/readme-gen/readme_gen.py | 18 ++++++------ setup.cfg | 2 +- 22 files changed, 54 insertions(+), 52 deletions(-) diff --git a/.coveragerc b/.coveragerc index 742e899d4..c540edf34 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.flake8 b/.flake8 index 2e4387498..87f6e408c 100644 --- a/.flake8 +++ b/.flake8 @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 98994f474..ae4a522b9 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:2d816f26f728ac8b24248741e7d4c461c09764ef9f7be3684d557c9632e46dbd -# created: 2023-06-28T17:03:33.371210701Z + digest: sha256:39f0f3f2be02ef036e297e376fe3b6256775576da8a6ccb1d5eeb80f4c8bf8fb +# created: 2023-07-17T15:20:13.819193964Z diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml index 41bff0b53..b2016d119 100644 --- a/.github/auto-label.yaml +++ b/.github/auto-label.yaml @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/build.sh b/.kokoro/build.sh index ec58d54c1..4e816ecf6 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2018 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index f8137d0ae..8e39a2cc4 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/populate-secrets.sh b/.kokoro/populate-secrets.sh index f52514257..6f3972140 100755 --- a/.kokoro/populate-secrets.sh +++ b/.kokoro/populate-secrets.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC. +# Copyright 2023 Google LLC. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh index 1c4d62370..9eafe0be3 100755 --- a/.kokoro/publish-docs.sh +++ b/.kokoro/publish-docs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/release.sh b/.kokoro/release.sh index 2b1f28ec0..e8e52653e 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index c7929db6d..67d70a110 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -113,26 +113,30 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==41.0.0 \ - --hash=sha256:0ddaee209d1cf1f180f1efa338a68c4621154de0afaef92b89486f5f96047c55 \ - --hash=sha256:14754bcdae909d66ff24b7b5f166d69340ccc6cb15731670435efd5719294895 \ - --hash=sha256:344c6de9f8bda3c425b3a41b319522ba3208551b70c2ae00099c205f0d9fd3be \ - --hash=sha256:34d405ea69a8b34566ba3dfb0521379b210ea5d560fafedf9f800a9a94a41928 \ - --hash=sha256:3680248309d340fda9611498a5319b0193a8dbdb73586a1acf8109d06f25b92d \ - --hash=sha256:3c5ef25d060c80d6d9f7f9892e1d41bb1c79b78ce74805b8cb4aa373cb7d5ec8 \ - --hash=sha256:4ab14d567f7bbe7f1cdff1c53d5324ed4d3fc8bd17c481b395db224fb405c237 \ - --hash=sha256:5c1f7293c31ebc72163a9a0df246f890d65f66b4a40d9ec80081969ba8c78cc9 \ - --hash=sha256:6b71f64beeea341c9b4f963b48ee3b62d62d57ba93eb120e1196b31dc1025e78 \ - --hash=sha256:7d92f0248d38faa411d17f4107fc0bce0c42cae0b0ba5415505df72d751bf62d \ - --hash=sha256:8362565b3835ceacf4dc8f3b56471a2289cf51ac80946f9087e66dc283a810e0 \ - --hash=sha256:84a165379cb9d411d58ed739e4af3396e544eac190805a54ba2e0322feb55c46 \ - --hash=sha256:88ff107f211ea696455ea8d911389f6d2b276aabf3231bf72c8853d22db755c5 \ - --hash=sha256:9f65e842cb02550fac96536edb1d17f24c0a338fd84eaf582be25926e993dde4 \ - --hash=sha256:a4fc68d1c5b951cfb72dfd54702afdbbf0fb7acdc9b7dc4301bbf2225a27714d \ - --hash=sha256:b7f2f5c525a642cecad24ee8670443ba27ac1fab81bba4cc24c7b6b41f2d0c75 \ - --hash=sha256:b846d59a8d5a9ba87e2c3d757ca019fa576793e8758174d3868aecb88d6fc8eb \ - --hash=sha256:bf8fc66012ca857d62f6a347007e166ed59c0bc150cefa49f28376ebe7d992a2 \ - --hash=sha256:f5d0bf9b252f30a31664b6f64432b4730bb7038339bd18b1fafe129cfc2be9be +cryptography==41.0.2 \ + --hash=sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711 \ + --hash=sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7 \ + --hash=sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd \ + --hash=sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e \ + --hash=sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58 \ + --hash=sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0 \ + --hash=sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d \ + --hash=sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83 \ + --hash=sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831 \ + --hash=sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766 \ + --hash=sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b \ + --hash=sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c \ + --hash=sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182 \ + --hash=sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f \ + --hash=sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa \ + --hash=sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4 \ + --hash=sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a \ + --hash=sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2 \ + --hash=sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76 \ + --hash=sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5 \ + --hash=sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee \ + --hash=sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f \ + --hash=sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14 # via # gcp-releasetool # secretstorage diff --git a/.kokoro/test-samples-against-head.sh b/.kokoro/test-samples-against-head.sh index ba3a707b0..63ac41dfa 100755 --- a/.kokoro/test-samples-against-head.sh +++ b/.kokoro/test-samples-against-head.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/test-samples-impl.sh b/.kokoro/test-samples-impl.sh index 2c6500cae..5a0f5fab6 100755 --- a/.kokoro/test-samples-impl.sh +++ b/.kokoro/test-samples-impl.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2021 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/test-samples.sh b/.kokoro/test-samples.sh index 11c042d34..50b35a48c 100755 --- a/.kokoro/test-samples.sh +++ b/.kokoro/test-samples.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh index f39236e94..d85b1f267 100755 --- a/.kokoro/trampoline.sh +++ b/.kokoro/trampoline.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 Google Inc. +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/trampoline_v2.sh b/.kokoro/trampoline_v2.sh index 4af6cdc26..59a7cf3a9 100755 --- a/.kokoro/trampoline_v2.sh +++ b/.kokoro/trampoline_v2.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5405cc8ff..9e3898fd1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# Copyright 2021 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.trampolinerc b/.trampolinerc index 0eee72ab6..a7dfeb42c 100644 --- a/.trampolinerc +++ b/.trampolinerc @@ -1,4 +1,4 @@ -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Template for .trampolinerc - # Add required env vars here. required_envvars+=( ) diff --git a/MANIFEST.in b/MANIFEST.in index e783f4c62..e0a667053 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/docs/conf.py b/docs/conf.py index 0e6ccdff0..bee939ca1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2021 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/decrypt-secrets.sh b/scripts/decrypt-secrets.sh index 21f6d2a26..0018b421d 100755 --- a/scripts/decrypt-secrets.sh +++ b/scripts/decrypt-secrets.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2015 Google Inc. All rights reserved. +# Copyright 2023 Google LLC All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/readme-gen/readme_gen.py b/scripts/readme-gen/readme_gen.py index 91b59676b..1acc11983 100644 --- a/scripts/readme-gen/readme_gen.py +++ b/scripts/readme-gen/readme_gen.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright 2016 Google Inc +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -33,17 +33,17 @@ autoescape=True, ) -README_TMPL = jinja_env.get_template('README.tmpl.rst') +README_TMPL = jinja_env.get_template("README.tmpl.rst") def get_help(file): - return subprocess.check_output(['python', file, '--help']).decode() + return subprocess.check_output(["python", file, "--help"]).decode() def main(): parser = argparse.ArgumentParser() - parser.add_argument('source') - parser.add_argument('--destination', default='README.rst') + parser.add_argument("source") + parser.add_argument("--destination", default="README.rst") args = parser.parse_args() @@ -51,9 +51,9 @@ def main(): root = os.path.dirname(source) destination = os.path.join(root, args.destination) - jinja_env.globals['get_help'] = get_help + jinja_env.globals["get_help"] = get_help - with io.open(source, 'r') as f: + with io.open(source, "r") as f: config = yaml.load(f) # This allows get_help to execute in the right directory. @@ -61,9 +61,9 @@ def main(): output = README_TMPL.render(config) - with io.open(destination, 'w') as f: + with io.open(destination, "w") as f: f.write(output) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/setup.cfg b/setup.cfg index c3a2b39f6..052350089 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 5965400e0fb655246a1456fbb413623891930b22 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 09:33:17 -0400 Subject: [PATCH 189/509] build(deps): [autoapprove] bump pygments from 2.13.0 to 2.15.0 (#1085) Source-Link: https://github.com/googleapis/synthtool/commit/eaef28efd179e6eeb9f4e9bf697530d074a6f3b9 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:f8ca7655fa8a449cadcabcbce4054f593dcbae7aeeab34aa3fcc8b5cf7a93c9e Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index ae4a522b9..17c21d96d 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:39f0f3f2be02ef036e297e376fe3b6256775576da8a6ccb1d5eeb80f4c8bf8fb -# created: 2023-07-17T15:20:13.819193964Z + digest: sha256:f8ca7655fa8a449cadcabcbce4054f593dcbae7aeeab34aa3fcc8b5cf7a93c9e +# created: 2023-07-21T02:12:46.49799314Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 67d70a110..b563eb284 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -396,9 +396,9 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pygments==2.13.0 \ - --hash=sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1 \ - --hash=sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42 +pygments==2.15.0 \ + --hash=sha256:77a3299119af881904cd5ecd1ac6a66214b6e9bed1f2db16993b54adede64094 \ + --hash=sha256:f7e36cffc4c517fbc252861b9a6e4644ca0e5abadf9a113c72d1358ad09b9500 # via # readme-renderer # rich From ad33f12771c9e2065d6ccce47922e0294f33435e Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 26 Jul 2023 07:03:45 -0400 Subject: [PATCH 190/509] build(deps): [autoapprove] bump certifi from 2022.12.7 to 2023.7.22 (#1095) Source-Link: https://github.com/googleapis/synthtool/commit/395d53adeeacfca00b73abf197f65f3c17c8f1e9 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:6c1cbc75c74b8bdd71dada2fa1677e9d6d78a889e9a70ee75b93d1d0543f96e1 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 17c21d96d..0ddd0e4d1 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:f8ca7655fa8a449cadcabcbce4054f593dcbae7aeeab34aa3fcc8b5cf7a93c9e -# created: 2023-07-21T02:12:46.49799314Z + digest: sha256:6c1cbc75c74b8bdd71dada2fa1677e9d6d78a889e9a70ee75b93d1d0543f96e1 +# created: 2023-07-25T21:01:10.396410762Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index b563eb284..76d9bba0f 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.2.0 \ --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db # via google-auth -certifi==2022.12.7 \ - --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ - --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 +certifi==2023.7.22 \ + --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ + --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ From 40354665a47fcf1553307677abb807e34718ed20 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 31 Jul 2023 15:59:31 +0200 Subject: [PATCH 191/509] chore(deps): update dependency google-cloud-pubsub to v2.18.1 (#1097) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index cdd2d9239..2388d18ed 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.18.0 +google-cloud-pubsub==2.18.1 google-cloud-storage==2.10.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.3; python_version >= '3.8' From dd3d5c850f9f50550d546e77014037caa1f05cfb Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 3 Aug 2023 12:03:27 -0400 Subject: [PATCH 192/509] build: [autoapprove] bump cryptography from 41.0.2 to 41.0.3 (#1101) * build: [autoapprove] bump cryptography from 41.0.2 to 41.0.3 Source-Link: https://github.com/googleapis/synthtool/commit/352b9d4c068ce7c05908172af128b294073bf53c Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:3e3800bb100af5d7f9e810d48212b37812c1856d20ffeafb99ebe66461b61fc7 * pin flake8 --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 48 +++++++++++++++++++-------------------- .pre-commit-config.yaml | 2 +- noxfile.py | 4 +++- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 0ddd0e4d1..a3da1b0d4 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:6c1cbc75c74b8bdd71dada2fa1677e9d6d78a889e9a70ee75b93d1d0543f96e1 -# created: 2023-07-25T21:01:10.396410762Z + digest: sha256:3e3800bb100af5d7f9e810d48212b37812c1856d20ffeafb99ebe66461b61fc7 +# created: 2023-08-02T10:53:29.114535628Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 76d9bba0f..029bd342d 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -113,30 +113,30 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==41.0.2 \ - --hash=sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711 \ - --hash=sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7 \ - --hash=sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd \ - --hash=sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e \ - --hash=sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58 \ - --hash=sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0 \ - --hash=sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d \ - --hash=sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83 \ - --hash=sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831 \ - --hash=sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766 \ - --hash=sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b \ - --hash=sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c \ - --hash=sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182 \ - --hash=sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f \ - --hash=sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa \ - --hash=sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4 \ - --hash=sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a \ - --hash=sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2 \ - --hash=sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76 \ - --hash=sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5 \ - --hash=sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee \ - --hash=sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f \ - --hash=sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14 +cryptography==41.0.3 \ + --hash=sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306 \ + --hash=sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84 \ + --hash=sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47 \ + --hash=sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d \ + --hash=sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116 \ + --hash=sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207 \ + --hash=sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81 \ + --hash=sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087 \ + --hash=sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd \ + --hash=sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507 \ + --hash=sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858 \ + --hash=sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae \ + --hash=sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34 \ + --hash=sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906 \ + --hash=sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd \ + --hash=sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922 \ + --hash=sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7 \ + --hash=sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4 \ + --hash=sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574 \ + --hash=sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1 \ + --hash=sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c \ + --hash=sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e \ + --hash=sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de # via # gcp-releasetool # secretstorage diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e3898fd1..19409cbd3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,6 +26,6 @@ repos: hooks: - id: black - repo: https://github.com/pycqa/flake8 - rev: 3.9.2 + rev: 6.1.0 hooks: - id: flake8 diff --git a/noxfile.py b/noxfile.py index 7c4e6aa34..1a72c9144 100644 --- a/noxfile.py +++ b/noxfile.py @@ -44,7 +44,9 @@ def lint(session): Returns a failure if the linters find linting errors or sufficiently serious code quality issues. """ - session.install("flake8", BLACK_VERSION) + # Pin flake8 to 6.0.0 + # See https://github.com/googleapis/python-storage/issues/1102 + session.install("flake8==6.0.0", BLACK_VERSION) session.run( "black", "--check", From 663edc5e803f327f9c4eba86a75206d2e46c8536 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 8 Aug 2023 17:08:29 +0200 Subject: [PATCH 193/509] chore(deps): update dependency google-cloud-pubsub to v2.18.2 (#1104) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 2388d18ed..d8ee4094c 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.18.1 +google-cloud-pubsub==2.18.2 google-cloud-storage==2.10.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.3; python_version >= '3.8' From d9b2065f5368e19fb181d04f0ba03c204f68f610 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 9 Aug 2023 10:06:45 -0700 Subject: [PATCH 194/509] chore: fix lint and flake8 sessions (#1103) --- google/cloud/storage/acl.py | 1 - google/cloud/storage/client.py | 2 +- tests/unit/test_transfer_manager.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index 4458966ce..1ca78f258 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -137,7 +137,6 @@ class ACL(object): # Subclasses must override to provide these attributes (typically, # as properties). - client = None reload_path = None save_path = None user_project = None diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 7df60c306..bec5da9a3 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -147,7 +147,7 @@ def __init__( kw_args["api_endpoint"] = storage_host if _is_emulator_set else None if client_options: - if type(client_options) == dict: + if isinstance(client_options, dict): client_options = google.api_core.client_options.from_dict( client_options ) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index bdfd236b5..685f48579 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -192,7 +192,7 @@ def test_upload_many_suppresses_412_with_skip_if_exists(): worker_type=transfer_manager.THREAD, ) for result in results: - assert type(result) == exceptions.PreconditionFailed + assert isinstance(result, exceptions.PreconditionFailed) def test_upload_many_with_processes(): From 7f741b0d3730f9e7e23e3a0efe729e454dffd81b Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 9 Aug 2023 13:23:10 -0700 Subject: [PATCH 195/509] test: add retry in pytest fixtures (#1108) --- tests/system/_helpers.py | 12 ++++++++++-- tests/system/test_bucket.py | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index 385ceaf5c..e298d7932 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -91,7 +91,11 @@ def empty_bucket(bucket): def delete_blob(blob): - errors = (exceptions.Conflict, exceptions.TooManyRequests) + errors = ( + exceptions.Conflict, + exceptions.TooManyRequests, + exceptions.ServiceUnavailable, + ) retry = RetryErrors(errors) try: retry(blob.delete)(timeout=120) # seconds @@ -105,7 +109,11 @@ def delete_blob(blob): def delete_bucket(bucket): - errors = (exceptions.Conflict, exceptions.TooManyRequests) + errors = ( + exceptions.Conflict, + exceptions.TooManyRequests, + exceptions.ServiceUnavailable, + ) retry = RetryErrors(errors, max_tries=15) retry(empty_bucket)(bucket) retry(bucket.delete)(force=True) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 3fe909c7e..ac949cf96 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1059,7 +1059,7 @@ def test_new_bucket_with_autoclass( # Autoclass can be enabled/disabled via bucket patch bucket.autoclass_enabled = False - bucket.patch() + bucket.patch(if_metageneration_match=bucket.metageneration) assert bucket.autoclass_enabled is False assert bucket.autoclass_toggle_time != previous_toggle_time From c1f8724dc1c5dc180f36424324def74a5daec620 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 16 Aug 2023 09:47:56 -0700 Subject: [PATCH 196/509] docs: add Transfer Manager documentation in c.g.c (#1109) --- docs/index.rst | 1 + docs/storage/transfer_manager.rst | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 docs/storage/transfer_manager.rst diff --git a/docs/index.rst b/docs/index.rst index 07d236e25..1dd08278a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -32,6 +32,7 @@ API Reference storage/hmac_key storage/notification storage/retry + storage/transfer_manager More Examples diff --git a/docs/storage/transfer_manager.rst b/docs/storage/transfer_manager.rst new file mode 100644 index 000000000..24f3e4e31 --- /dev/null +++ b/docs/storage/transfer_manager.rst @@ -0,0 +1,6 @@ +Transfer Manager +~~~~~~~~~~~~~~~~ + +.. automodule:: google.cloud.storage.transfer_manager + :members: + :show-inheritance: \ No newline at end of file From 6febcb13730b3e904cee46603dba74d6860c14c1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 19 Aug 2023 00:01:53 +0200 Subject: [PATCH 197/509] chore(deps): update dependency google-cloud-pubsub to v2.18.3 (#1111) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index d8ee4094c..f9b37be52 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.18.2 +google-cloud-pubsub==2.18.3 google-cloud-storage==2.10.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.3; python_version >= '3.8' From 9a189da8fe69019e101a9316400991f2843661c6 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 22 Aug 2023 17:52:13 -0700 Subject: [PATCH 198/509] chore: Add region tags for Transfer Manager samples (#1110) --- .../snippets/storage_transfer_manager_download_all_blobs.py | 3 ++- .../storage_transfer_manager_download_chunks_concurrently.py | 3 ++- samples/snippets/storage_transfer_manager_upload_directory.py | 3 ++- samples/snippets/storage_transfer_manager_upload_many_blobs.py | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/samples/snippets/storage_transfer_manager_download_all_blobs.py b/samples/snippets/storage_transfer_manager_download_all_blobs.py index 2285f673f..a99ba6b7a 100644 --- a/samples/snippets/storage_transfer_manager_download_all_blobs.py +++ b/samples/snippets/storage_transfer_manager_download_all_blobs.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - +# [START storage_transfer_manager_download_all_blobs] def download_all_blobs_with_transfer_manager( bucket_name, destination_directory="", processes=8 ): @@ -62,3 +62,4 @@ def download_all_blobs_with_transfer_manager( print("Failed to download {} due to exception: {}".format(name, result)) else: print("Downloaded {} to {}.".format(name, destination_directory + name)) +# [END storage_transfer_manager_download_all_blobs] diff --git a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py index 50541fb93..33080b52d 100644 --- a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py +++ b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - +# [START storage_transfer_manager_download_chunks_concurrently] def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): """Download a single file in chunks, concurrently.""" @@ -40,3 +40,4 @@ def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): transfer_manager.download_chunks_concurrently(blob, filename, max_workers=processes) print("Downloaded {} to {}.".format(blob_name, filename)) +# [END storage_transfer_manager_download_chunks_concurrently] diff --git a/samples/snippets/storage_transfer_manager_upload_directory.py b/samples/snippets/storage_transfer_manager_upload_directory.py index e4a369969..c0dbb9c9c 100644 --- a/samples/snippets/storage_transfer_manager_upload_directory.py +++ b/samples/snippets/storage_transfer_manager_upload_directory.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - +# [START storage_transfer_manager_upload_directory] def upload_directory_with_transfer_manager(bucket_name, source_directory, processes=8): """Upload every file in a directory, including all files in subdirectories. @@ -76,3 +76,4 @@ def upload_directory_with_transfer_manager(bucket_name, source_directory, proces print("Failed to upload {} due to exception: {}".format(name, result)) else: print("Uploaded {} to {}.".format(name, bucket.name)) +# [END storage_transfer_manager_upload_directory] diff --git a/samples/snippets/storage_transfer_manager_upload_many_blobs.py b/samples/snippets/storage_transfer_manager_upload_many_blobs.py index 600134bd6..a085cfc2b 100644 --- a/samples/snippets/storage_transfer_manager_upload_many_blobs.py +++ b/samples/snippets/storage_transfer_manager_upload_many_blobs.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - +# [START storage_transfer_manager_upload_many_blobs] def upload_many_blobs_with_transfer_manager( bucket_name, filenames, source_directory="", processes=8 ): @@ -63,3 +63,4 @@ def upload_many_blobs_with_transfer_manager( print("Failed to upload {} due to exception: {}".format(name, result)) else: print("Uploaded {} to {}.".format(name, bucket.name)) +# [END storage_transfer_manager_upload_many_blobs] From bdd7c6c19c96a4dbd2249ba39399f8f6ff799fe1 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 31 Aug 2023 13:09:41 -0700 Subject: [PATCH 199/509] chore: Amend Transfer Manager samples (#1113) * chore: Amend Transfer Manager samples * tests * tests again * respond to feedback --- samples/snippets/snippets_test.py | 23 +++++- ...torage_transfer_manager_download_bucket.py | 74 +++++++++++++++++++ ...er_manager_download_chunks_concurrently.py | 2 +- ...storage_transfer_manager_download_many.py} | 24 +++--- ...> storage_transfer_manager_upload_many.py} | 6 +- 5 files changed, 111 insertions(+), 18 deletions(-) create mode 100644 samples/snippets/storage_transfer_manager_download_bucket.py rename samples/snippets/{storage_transfer_manager_download_all_blobs.py => storage_transfer_manager_download_many.py} (75%) rename samples/snippets/{storage_transfer_manager_upload_many_blobs.py => storage_transfer_manager_upload_many.py} (95%) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 6e5879eeb..2da7bb94c 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -72,10 +72,11 @@ import storage_set_bucket_default_kms_key import storage_set_client_endpoint import storage_set_metadata -import storage_transfer_manager_download_all_blobs +import storage_transfer_manager_download_bucket import storage_transfer_manager_download_chunks_concurrently +import storage_transfer_manager_download_many import storage_transfer_manager_upload_directory -import storage_transfer_manager_upload_many_blobs +import storage_transfer_manager_upload_many import storage_upload_file import storage_upload_from_memory import storage_upload_from_stream @@ -689,7 +690,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): with open(os.path.join(uploads, name), "w") as f: f.write(name) - storage_transfer_manager_upload_many_blobs.upload_many_blobs_with_transfer_manager( + storage_transfer_manager_upload_many.upload_many_blobs_with_transfer_manager( test_bucket.name, BLOB_NAMES, source_directory="{}/".format(uploads), @@ -702,10 +703,24 @@ def test_transfer_manager_snippets(test_bucket, capsys): with tempfile.TemporaryDirectory() as downloads: # Download the files. - storage_transfer_manager_download_all_blobs.download_all_blobs_with_transfer_manager( + storage_transfer_manager_download_bucket.download_bucket_with_transfer_manager( test_bucket.name, destination_directory=os.path.join(downloads, ""), processes=8, + max_results=10000, + ) + out, _ = capsys.readouterr() + + for name in BLOB_NAMES: + assert "Downloaded {}".format(name) in out + + with tempfile.TemporaryDirectory() as downloads: + # Download the files. + storage_transfer_manager_download_many.download_many_blobs_with_transfer_manager( + test_bucket.name, + blob_names=BLOB_NAMES, + destination_directory=os.path.join(downloads, ""), + processes=8, ) out, _ = capsys.readouterr() diff --git a/samples/snippets/storage_transfer_manager_download_bucket.py b/samples/snippets/storage_transfer_manager_download_bucket.py new file mode 100644 index 000000000..4f21ee6e9 --- /dev/null +++ b/samples/snippets/storage_transfer_manager_download_bucket.py @@ -0,0 +1,74 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_transfer_manager_download_bucket] +def download_bucket_with_transfer_manager( + bucket_name, destination_directory="", processes=8, max_results=1000 +): + """Download all of the blobs in a bucket, concurrently in a process pool. + + The filename of each blob once downloaded is derived from the blob name and + the `destination_directory `parameter. For complete control of the filename + of each blob, use transfer_manager.download_many() instead. + + Directories will be created automatically as needed, for instance to + accommodate blob names that include slashes. + """ + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The directory on your computer to which to download all of the files. This + # string is prepended (with os.path.join()) to the name of each blob to form + # the full path. Relative paths and absolute paths are both accepted. An + # empty string means "the current working directory". Note that this + # parameter allows accepts directory traversal ("../" etc.) and is not + # intended for unsanitized end user input. + # destination_directory = "" + + # The maximum number of processes to use for the operation. The performance + # impact of this value depends on the use case, but smaller files usually + # benefit from a higher number of processes. Each additional process occupies + # some CPU and memory resources until finished. + # processes=8 + + # The maximum number of results to fetch from bucket.list_blobs(). This + # sample code fetches all of the blobs up to max_results and queues them all + # for download at once. Though they will still be executed in batches up to + # the processes limit, queueing them all at once can be taxing on system + # memory if buckets are very large. Adjust max_results as needed for your + # system environment, or set it to None if you are sure the bucket is not + # too large to hold in memory easily. + # max_results=1000 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + + blob_names = [blob.name for blob in bucket.list_blobs(max_results=max_results)] + + results = transfer_manager.download_many_to_path( + bucket, blob_names, destination_directory=destination_directory, max_workers=processes + ) + + for name, result in zip(blob_names, results): + # The results list is either `None` or an exception for each blob in + # the input list, in order. + + if isinstance(result, Exception): + print("Failed to download {} due to exception: {}".format(name, result)) + else: + print("Downloaded {} to {}.".format(name, destination_directory + name)) +# [END storage_transfer_manager_download_bucket] diff --git a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py index 33080b52d..9ddec094e 100644 --- a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py +++ b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py @@ -14,7 +14,7 @@ # [START storage_transfer_manager_download_chunks_concurrently] def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): - """Download a single file in chunks, concurrently.""" + """Download a single file in chunks, concurrently in a process pool.""" # The ID of your GCS bucket # bucket_name = "your-bucket-name" diff --git a/samples/snippets/storage_transfer_manager_download_all_blobs.py b/samples/snippets/storage_transfer_manager_download_many.py similarity index 75% rename from samples/snippets/storage_transfer_manager_download_all_blobs.py rename to samples/snippets/storage_transfer_manager_download_many.py index a99ba6b7a..500eea1ce 100644 --- a/samples/snippets/storage_transfer_manager_download_all_blobs.py +++ b/samples/snippets/storage_transfer_manager_download_many.py @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. @@ -12,23 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. -# [START storage_transfer_manager_download_all_blobs] -def download_all_blobs_with_transfer_manager( - bucket_name, destination_directory="", processes=8 +# [START storage_transfer_manager_download_many] +def download_many_blobs_with_transfer_manager( + bucket_name, blob_names, destination_directory="", processes=8 ): - """Download all of the blobs in a bucket, concurrently in a thread pool. + """Download blobs in a list by name, concurrently in a process pool. The filename of each blob once downloaded is derived from the blob name and the `destination_directory `parameter. For complete control of the filename of each blob, use transfer_manager.download_many() instead. - Directories will be created automatically as needed, for instance to - accommodate blob names that include slashes. + Directories will be created automatically as needed to accommodate blob + names that include slashes. """ # The ID of your GCS bucket # bucket_name = "your-bucket-name" + # The list of blob names to download. The names of each blobs will also + # be the name of each destination file (use transfer_manager.download_many() + # instead to control each destination file name). If there is a "/" in the + # blob name, then corresponding directories will be created on download. + # blob_names = ["myblob", "myblob2"] + # The directory on your computer to which to download all of the files. This # string is prepended (with os.path.join()) to the name of each blob to form # the full path. Relative paths and absolute paths are both accepted. An @@ -48,8 +54,6 @@ def download_all_blobs_with_transfer_manager( storage_client = Client() bucket = storage_client.bucket(bucket_name) - blob_names = [blob.name for blob in bucket.list_blobs()] - results = transfer_manager.download_many_to_path( bucket, blob_names, destination_directory=destination_directory, max_workers=processes ) @@ -62,4 +66,4 @@ def download_all_blobs_with_transfer_manager( print("Failed to download {} due to exception: {}".format(name, result)) else: print("Downloaded {} to {}.".format(name, destination_directory + name)) -# [END storage_transfer_manager_download_all_blobs] +# [END storage_transfer_manager_download_many] diff --git a/samples/snippets/storage_transfer_manager_upload_many_blobs.py b/samples/snippets/storage_transfer_manager_upload_many.py similarity index 95% rename from samples/snippets/storage_transfer_manager_upload_many_blobs.py rename to samples/snippets/storage_transfer_manager_upload_many.py index a085cfc2b..2ed647650 100644 --- a/samples/snippets/storage_transfer_manager_upload_many_blobs.py +++ b/samples/snippets/storage_transfer_manager_upload_many.py @@ -12,11 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -# [START storage_transfer_manager_upload_many_blobs] +# [START storage_transfer_manager_upload_many] def upload_many_blobs_with_transfer_manager( bucket_name, filenames, source_directory="", processes=8 ): - """Upload every file in a list to a bucket, concurrently in a thread pool. + """Upload every file in a list to a bucket, concurrently in a process pool. Each blob name is derived from the filename, not including the `source_directory` parameter. For complete control of the blob name for each @@ -63,4 +63,4 @@ def upload_many_blobs_with_transfer_manager( print("Failed to upload {} due to exception: {}".format(name, result)) else: print("Uploaded {} to {}.".format(name, bucket.name)) -# [END storage_transfer_manager_upload_many_blobs] +# [END storage_transfer_manager_upload_many] From 56aeb8778d25fe245ac2e1e96ef71f0dad1fec0f Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 18 Sep 2023 11:39:59 -0700 Subject: [PATCH 200/509] feat: add transfer_manager.upload_chunks_concurrently using the XML MPU API (#1115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * intermediate commit * temporary commit * xml mpu support, unit tests and docstrings * integration tests * add support for metadata * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * encryption support * unit tests for mpu * docs update * fix unit test issue * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- google/cloud/storage/blob.py | 4 +- google/cloud/storage/transfer_manager.py | 280 ++++++++++++++++++++++- setup.py | 2 +- tests/system/conftest.py | 39 ++++ tests/system/test_transfer_manager.py | 217 ++++++++++++++++++ tests/unit/test_transfer_manager.py | 240 ++++++++++++++++++- 6 files changed, 759 insertions(+), 23 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 0d663e775..4c493485f 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -1697,7 +1697,7 @@ def _get_writable_metadata(self): return object_metadata - def _get_upload_arguments(self, client, content_type): + def _get_upload_arguments(self, client, content_type, filename=None): """Get required arguments for performing an upload. The content type returned will be determined in order of precedence: @@ -1716,7 +1716,7 @@ def _get_upload_arguments(self, client, content_type): * An object metadata dictionary * The ``content_type`` as a string (according to precedence) """ - content_type = self._get_content_type(content_type) + content_type = self._get_content_type(content_type, filename=filename) headers = { **_get_default_headers(client._connection.user_agent, content_type), **_get_encryption_headers(self._encryption_key), diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 0b65702d4..5cb9b6c46 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -26,6 +26,12 @@ from google.api_core import exceptions from google.cloud.storage import Client from google.cloud.storage import Blob +from google.cloud.storage.blob import _get_host_name +from google.cloud.storage.constants import _DEFAULT_TIMEOUT + +from google.resumable_media.requests.upload import XMLMPUContainer +from google.resumable_media.requests.upload import XMLMPUPart + warnings.warn( "The module `transfer_manager` is a preview feature. Functionality and API " @@ -35,7 +41,14 @@ TM_DEFAULT_CHUNK_SIZE = 32 * 1024 * 1024 DEFAULT_MAX_WORKERS = 8 - +METADATA_HEADER_TRANSLATION = { + "cacheControl": "Cache-Control", + "contentDisposition": "Content-Disposition", + "contentEncoding": "Content-Encoding", + "contentLanguage": "Content-Language", + "customTime": "x-goog-custom-time", + "storageClass": "x-goog-storage-class", +} # Constants to be passed in as `worker_type`. PROCESS = "process" @@ -198,7 +211,7 @@ def upload_many( futures.append( executor.submit( _call_method_on_maybe_pickled_blob, - _pickle_blob(blob) if needs_pickling else blob, + _pickle_client(blob) if needs_pickling else blob, "upload_from_filename" if isinstance(path_or_file, str) else "upload_from_file", @@ -343,7 +356,7 @@ def download_many( futures.append( executor.submit( _call_method_on_maybe_pickled_blob, - _pickle_blob(blob) if needs_pickling else blob, + _pickle_client(blob) if needs_pickling else blob, "download_to_filename" if isinstance(path_or_file, str) else "download_to_file", @@ -733,7 +746,6 @@ def download_chunks_concurrently( Checksumming (md5 or crc32c) is not supported for chunked operations. Any `checksum` parameter passed in to download_kwargs will be ignored. - :type bucket: 'google.cloud.storage.bucket.Bucket' :param bucket: The bucket which contains the blobs to be downloaded @@ -745,6 +757,12 @@ def download_chunks_concurrently( :param filename: The destination filename or path. + :type chunk_size: int + :param chunk_size: + The size in bytes of each chunk to send. The optimal chunk size for + maximum throughput may vary depending on the exact network environment + and size of the blob. + :type download_kwargs: dict :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer @@ -809,7 +827,7 @@ def download_chunks_concurrently( pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) # Pickle the blob ahead of time (just once, not once per chunk) if needed. - maybe_pickled_blob = _pickle_blob(blob) if needs_pickling else blob + maybe_pickled_blob = _pickle_client(blob) if needs_pickling else blob futures = [] @@ -844,9 +862,249 @@ def download_chunks_concurrently( return None +def upload_chunks_concurrently( + filename, + blob, + content_type=None, + chunk_size=TM_DEFAULT_CHUNK_SIZE, + deadline=None, + worker_type=PROCESS, + max_workers=DEFAULT_MAX_WORKERS, + *, + checksum="md5", + timeout=_DEFAULT_TIMEOUT, +): + """Upload a single file in chunks, concurrently. + + This function uses the XML MPU API to initialize an upload and upload a + file in chunks, concurrently with a worker pool. + + The XML MPU API is significantly different from other uploads; please review + the documentation at https://cloud.google.com/storage/docs/multipart-uploads + before using this feature. + + The library will attempt to cancel uploads that fail due to an exception. + If the upload fails in a way that precludes cancellation, such as a + hardware failure, process termination, or power outage, then the incomplete + upload may persist indefinitely. To mitigate this, set the + `AbortIncompleteMultipartUpload` with a nonzero `Age` in bucket lifecycle + rules, or refer to the XML API documentation linked above to learn more + about how to list and delete individual downloads. + + Using this feature with multiple threads is unlikely to improve upload + performance under normal circumstances due to Python interpreter threading + behavior. The default is therefore to use processes instead of threads. + + ACL information cannot be sent with this function and should be set + separately with :class:`ObjectACL` methods. + + :type filename: str + :param filename: + The path to the file to upload. File-like objects are not supported. + + :type blob: `google.cloud.storage.Blob` + :param blob: + The blob to which to upload. + + :type content_type: str + :param content_type: (Optional) Type of content being uploaded. + + :type chunk_size: int + :param chunk_size: + The size in bytes of each chunk to send. The optimal chunk size for + maximum throughput may vary depending on the exact network environment + and size of the blob. The remote API has restrictions on the minimum + and maximum size allowable, see: https://cloud.google.com/storage/quotas#requests + + :type deadline: int + :param deadline: + The number of seconds to wait for all threads to resolve. If the + deadline is reached, all threads will be terminated regardless of their + progress and concurrent.futures.TimeoutError will be raised. This can be + left as the default of None (no deadline) for most use cases. + + :type worker_type: str + :param worker_type: + The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS + or google.cloud.storage.transfer_manager.THREAD. + + Although the exact performance impact depends on the use case, in most + situations the PROCESS worker type will use more system resources (both + memory and CPU) and result in faster operations than THREAD workers. + + Because the subprocesses of the PROCESS worker type can't access memory + from the main process, Client objects have to be serialized and then + recreated in each subprocess. The serialization of the Client object + for use in subprocesses is an approximation and may not capture every + detail of the Client object, especially if the Client was modified after + its initial creation or if `Client._http` was modified in any way. + + THREAD worker types are observed to be relatively efficient for + operations with many small files, but not for operations with large + files. PROCESS workers are recommended for large file operations. + + :type max_workers: int + :param max_workers: + The maximum number of workers to create to handle the workload. + + With PROCESS workers, a larger number of workers will consume more + system resources (memory and CPU) at once. + + How many workers is optimal depends heavily on the specific use case, + and the default is a conservative number that should work okay in most + cases without consuming excessive resources. + + :type checksum: str + :param checksum: + (Optional) The checksum scheme to use: either 'md5', 'crc32c' or None. + Each individual part is checksummed. At present, the selected checksum + rule is only applied to parts and a separate checksum of the entire + resulting blob is not computed. Please compute and compare the checksum + of the file to the resulting blob separately if needed, using the + 'crc32c' algorithm as per the XML MPU documentation. + + :type timeout: float or tuple + :param timeout: + (Optional) The amount of time, in seconds, to wait + for the server response. See: :ref:`configuring_timeouts` + + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + """ + + bucket = blob.bucket + client = blob.client + transport = blob._get_transport(client) + + hostname = _get_host_name(client._connection) + url = "{hostname}/{bucket}/{blob}".format( + hostname=hostname, bucket=bucket.name, blob=blob.name + ) + + base_headers, object_metadata, content_type = blob._get_upload_arguments( + client, content_type, filename=filename + ) + headers = {**base_headers, **_headers_from_metadata(object_metadata)} + + if blob.user_project is not None: + headers["x-goog-user-project"] = blob.user_project + + # When a Customer Managed Encryption Key is used to encrypt Cloud Storage object + # at rest, object resource metadata will store the version of the Key Management + # Service cryptographic material. If a Blob instance with KMS Key metadata set is + # used to upload a new version of the object then the existing kmsKeyName version + # value can't be used in the upload request and the client instead ignores it. + if blob.kms_key_name is not None and "cryptoKeyVersions" not in blob.kms_key_name: + headers["x-goog-encryption-kms-key-name"] = blob.kms_key_name + + container = XMLMPUContainer(url, filename, headers=headers) + container.initiate(transport=transport, content_type=content_type) + upload_id = container.upload_id + + size = os.path.getsize(filename) + num_of_parts = -(size // -chunk_size) # Ceiling division + + pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) + # Pickle the blob ahead of time (just once, not once per chunk) if needed. + maybe_pickled_client = _pickle_client(client) if needs_pickling else client + + futures = [] + + with pool_class(max_workers=max_workers) as executor: + + for part_number in range(1, num_of_parts + 1): + start = (part_number - 1) * chunk_size + end = min(part_number * chunk_size, size) + + futures.append( + executor.submit( + _upload_part, + maybe_pickled_client, + url, + upload_id, + filename, + start=start, + end=end, + part_number=part_number, + checksum=checksum, + headers=headers, + ) + ) + + concurrent.futures.wait( + futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED + ) + + try: + # Harvest results and raise exceptions. + for future in futures: + part_number, etag = future.result() + container.register_part(part_number, etag) + + container.finalize(blob._get_transport(client)) + except Exception: + container.cancel(blob._get_transport(client)) + raise + + +def _upload_part( + maybe_pickled_client, + url, + upload_id, + filename, + start, + end, + part_number, + checksum, + headers, +): + """Helper function that runs inside a thread or subprocess to upload a part. + + `maybe_pickled_client` is either a Client (for threads) or a specially + pickled Client (for processes) because the default pickling mangles Client + objects.""" + + if isinstance(maybe_pickled_client, Client): + client = maybe_pickled_client + else: + client = pickle.loads(maybe_pickled_client) + part = XMLMPUPart( + url, + upload_id, + filename, + start=start, + end=end, + part_number=part_number, + checksum=checksum, + headers=headers, + ) + part.upload(client._http) + return (part_number, part.etag) + + +def _headers_from_metadata(metadata): + """Helper function to translate object metadata into a header dictionary.""" + + headers = {} + # Handle standard writable metadata + for key, value in metadata.items(): + if key in METADATA_HEADER_TRANSLATION: + headers[METADATA_HEADER_TRANSLATION[key]] = value + # Handle custom metadata + if "metadata" in metadata: + for key, value in metadata["metadata"].items(): + headers["x-goog-meta-" + key] = value + return headers + + def _download_and_write_chunk_in_place( maybe_pickled_blob, filename, start, end, download_kwargs ): + """Helper function that runs inside a thread or subprocess. + + `maybe_pickled_blob` is either a Blob (for threads) or a specially pickled + Blob (for processes) because the default pickling mangles Client objects + which are attached to Blobs.""" + if isinstance(maybe_pickled_blob, Blob): blob = maybe_pickled_blob else: @@ -863,9 +1121,9 @@ def _call_method_on_maybe_pickled_blob( ): """Helper function that runs inside a thread or subprocess. - `maybe_pickled_blob` is either a blob (for threads) or a specially pickled - blob (for processes) because the default pickling mangles clients which are - attached to blobs.""" + `maybe_pickled_blob` is either a Blob (for threads) or a specially pickled + Blob (for processes) because the default pickling mangles Client objects + which are attached to Blobs.""" if isinstance(maybe_pickled_blob, Blob): blob = maybe_pickled_blob @@ -894,8 +1152,8 @@ def _reduce_client(cl): ) -def _pickle_blob(blob): - """Pickle a Blob (and its Bucket and Client) and return a bytestring.""" +def _pickle_client(obj): + """Pickle a Client or an object that owns a Client (like a Blob)""" # We need a custom pickler to process Client objects, which are attached to # Buckets (and therefore to Blobs in turn). Unfortunately, the Python @@ -907,7 +1165,7 @@ def _pickle_blob(blob): p = pickle.Pickler(f) p.dispatch_table = copyreg.dispatch_table.copy() p.dispatch_table[Client] = _reduce_client - p.dump(blob) + p.dump(obj) return f.getvalue() diff --git a/setup.py b/setup.py index e2b5cc7a4..a57f972ff 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ "google-auth >= 1.25.0, < 3.0dev", "google-api-core >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", "google-cloud-core >= 2.3.0, < 3.0dev", - "google-resumable-media >= 2.3.2", + "google-resumable-media >= 2.6.0", "requests >= 2.18.0, < 3.0.0dev", ] extras = {"protobuf": ["protobuf<5.0.0dev"]} diff --git a/tests/system/conftest.py b/tests/system/conftest.py index 26d5c785e..fe90ceb80 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -46,6 +46,21 @@ ebh_bucket_iteration = 0 +_key_name_format = "projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}" + +keyring_name = "gcs-test" +default_key_name = "gcs-test" +alt_key_name = "gcs-test-alternate" + + +def _kms_key_name(client, bucket, key_name): + return _key_name_format.format( + client.project, + bucket.location.lower(), + keyring_name, + key_name, + ) + @pytest.fixture(scope="session") def storage_client(): @@ -218,3 +233,27 @@ def file_data(): file_data["hash"] = _base64_md5hash(file_obj) return _file_data + + +@pytest.fixture(scope="session") +def kms_bucket_name(): + return _helpers.unique_name("gcp-systest-kms") + + +@pytest.fixture(scope="session") +def kms_bucket(storage_client, kms_bucket_name, no_mtls): + bucket = _helpers.retry_429_503(storage_client.create_bucket)(kms_bucket_name) + + yield bucket + + _helpers.delete_bucket(bucket) + + +@pytest.fixture(scope="session") +def kms_key_name(storage_client, kms_bucket): + return _kms_key_name(storage_client, kms_bucket, default_key_name) + + +@pytest.fixture(scope="session") +def alt_kms_key_name(storage_client, kms_bucket): + return _kms_key_name(storage_client, kms_bucket, alt_key_name) diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index bc7e0d31e..fc7bc2d51 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -16,6 +16,8 @@ import tempfile import os +import pytest + from google.cloud.storage import transfer_manager from google.cloud.storage._helpers import _base64_md5hash @@ -23,6 +25,16 @@ DEADLINE = 30 +encryption_key = "b23ff11bba187db8c37077e6af3b25b8" + + +def _check_blob_hash(blob, info): + md5_hash = blob.md5_hash + if not isinstance(md5_hash, bytes): + md5_hash = md5_hash.encode("utf-8") + + assert md5_hash == info["hash"] + def test_upload_many(shared_bucket, file_data, blobs_to_delete): FILE_BLOB_PAIRS = [ @@ -171,3 +183,208 @@ def test_download_chunks_concurrently(shared_bucket, file_data): ) with open(threaded_filename, "rb") as file_obj: assert _base64_md5hash(file_obj) == source_file["hash"] + + +def test_upload_chunks_concurrently(shared_bucket, file_data, blobs_to_delete): + source_file = file_data["big"] + filename = source_file["path"] + blob_name = "mpu_file" + upload_blob = shared_bucket.blob(blob_name) + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + blobs_to_delete.append(upload_blob) + + transfer_manager.upload_chunks_concurrently( + filename, upload_blob, chunk_size=chunk_size, deadline=DEADLINE + ) + + with tempfile.NamedTemporaryFile() as tmp: + download_blob = shared_bucket.blob(blob_name) + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents + + # Also test threaded mode + blob_name = "mpu_threaded" + upload_blob = shared_bucket.blob(blob_name) + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + transfer_manager.upload_chunks_concurrently( + filename, + upload_blob, + chunk_size=chunk_size, + deadline=DEADLINE, + worker_type=transfer_manager.THREAD, + ) + + with tempfile.NamedTemporaryFile() as tmp: + download_blob = shared_bucket.blob(blob_name) + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents + + +def test_upload_chunks_concurrently_with_metadata( + shared_bucket, file_data, blobs_to_delete +): + import datetime + from google.cloud._helpers import UTC + + now = datetime.datetime.utcnow().replace(tzinfo=UTC) + custom_metadata = {"key_a": "value_a", "key_b": "value_b"} + + METADATA = { + "cache_control": "private", + "content_disposition": "inline", + "content_language": "en-US", + "custom_time": now, + "metadata": custom_metadata, + "storage_class": "NEARLINE", + } + + source_file = file_data["big"] + filename = source_file["path"] + blob_name = "mpu_file_with_metadata" + upload_blob = shared_bucket.blob(blob_name) + + for key, value in METADATA.items(): + setattr(upload_blob, key, value) + + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + transfer_manager.upload_chunks_concurrently( + filename, upload_blob, chunk_size=chunk_size, deadline=DEADLINE + ) + blobs_to_delete.append(upload_blob) + + with tempfile.NamedTemporaryFile() as tmp: + download_blob = shared_bucket.get_blob(blob_name) + + for key, value in METADATA.items(): + assert getattr(download_blob, key) == value + + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents + + +def test_upload_chunks_concurrently_with_content_encoding( + shared_bucket, file_data, blobs_to_delete +): + import gzip + + METADATA = { + "content_encoding": "gzip", + } + + source_file = file_data["big"] + filename = source_file["path"] + blob_name = "mpu_file_encoded" + upload_blob = shared_bucket.blob(blob_name) + + for key, value in METADATA.items(): + setattr(upload_blob, key, value) + + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + + with tempfile.NamedTemporaryFile() as tmp_gzip: + with open(filename, "rb") as f: + compressed_bytes = gzip.compress(f.read()) + + tmp_gzip.write(compressed_bytes) + tmp_gzip.seek(0) + transfer_manager.upload_chunks_concurrently( + tmp_gzip.name, upload_blob, chunk_size=chunk_size, deadline=DEADLINE + ) + blobs_to_delete.append(upload_blob) + + with tempfile.NamedTemporaryFile() as tmp: + download_blob = shared_bucket.get_blob(blob_name) + + for key, value in METADATA.items(): + assert getattr(download_blob, key) == value + + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents + + +def test_upload_chunks_concurrently_with_encryption_key( + shared_bucket, file_data, blobs_to_delete +): + source_file = file_data["big"] + filename = source_file["path"] + blob_name = "mpu_file_encrypted" + upload_blob = shared_bucket.blob(blob_name, encryption_key=encryption_key) + + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + transfer_manager.upload_chunks_concurrently( + filename, upload_blob, chunk_size=chunk_size, deadline=DEADLINE + ) + blobs_to_delete.append(upload_blob) + + with tempfile.NamedTemporaryFile() as tmp: + download_blob = shared_bucket.get_blob(blob_name, encryption_key=encryption_key) + + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents + + with tempfile.NamedTemporaryFile() as tmp: + keyless_blob = shared_bucket.get_blob(blob_name) + + with pytest.raises(exceptions.BadRequest): + keyless_blob.download_to_file(tmp) + + +def test_upload_chunks_concurrently_with_kms( + kms_bucket, file_data, blobs_to_delete, kms_key_name +): + source_file = file_data["big"] + filename = source_file["path"] + blob_name = "mpu_file_kms" + blob = kms_bucket.blob(blob_name, kms_key_name=kms_key_name) + + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + transfer_manager.upload_chunks_concurrently( + filename, blob, chunk_size=chunk_size, deadline=DEADLINE + ) + blobs_to_delete.append(blob) + blob.reload() + assert blob.kms_key_name.startswith(kms_key_name) + + with tempfile.NamedTemporaryFile() as tmp: + blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 685f48579..f1d760043 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -18,6 +18,7 @@ from google.cloud.storage import transfer_manager from google.cloud.storage import Blob +from google.cloud.storage import Client from google.api_core import exceptions @@ -33,6 +34,9 @@ FAKE_ENCODING = "fake_gzip" DOWNLOAD_KWARGS = {"accept-encoding": FAKE_ENCODING} CHUNK_SIZE = 8 +HOSTNAME = "https://example.com" +URL = "https://example.com/bucket/blob" +USER_AGENT = "agent" # Used in subprocesses only, so excluded from coverage @@ -529,7 +533,7 @@ def test_download_chunks_concurrently(): blob_mock.download_to_filename.return_value = FAKE_RESULT - with mock.patch("__main__.open", mock.mock_open()): + with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager.download_chunks_concurrently( blob_mock, FILENAME, @@ -554,7 +558,7 @@ def test_download_chunks_concurrently_raises_on_start_and_end(): MULTIPLE = 4 blob_mock.size = CHUNK_SIZE * MULTIPLE - with mock.patch("__main__.open", mock.mock_open()): + with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): with pytest.raises(ValueError): transfer_manager.download_chunks_concurrently( blob_mock, @@ -587,7 +591,9 @@ def test_download_chunks_concurrently_passes_concurrency_options(): with mock.patch("concurrent.futures.ThreadPoolExecutor") as pool_patch, mock.patch( "concurrent.futures.wait" - ) as wait_patch, mock.patch("__main__.open", mock.mock_open()): + ) as wait_patch, mock.patch( + "google.cloud.storage.transfer_manager.open", mock.mock_open() + ): transfer_manager.download_chunks_concurrently( blob_mock, FILENAME, @@ -600,6 +606,182 @@ def test_download_chunks_concurrently_passes_concurrency_options(): wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) +def test_upload_chunks_concurrently(): + bucket = mock.Mock() + bucket.name = "bucket" + bucket.client = _PickleableMockClient(identify_as_client=True) + transport = bucket.client._http + bucket.user_project = None + + blob = Blob("blob", bucket) + blob.content_type = FAKE_CONTENT_TYPE + + FILENAME = "file_a.txt" + SIZE = 2048 + + container_mock = mock.Mock() + container_mock.upload_id = "abcd" + part_mock = mock.Mock() + ETAG = "efgh" + part_mock.etag = ETAG + + with mock.patch("os.path.getsize", return_value=SIZE), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUContainer", + return_value=container_mock, + ), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUPart", return_value=part_mock + ): + transfer_manager.upload_chunks_concurrently( + FILENAME, + blob, + chunk_size=SIZE // 2, + worker_type=transfer_manager.THREAD, + ) + container_mock.initiate.assert_called_once_with( + transport=transport, content_type=blob.content_type + ) + container_mock.register_part.assert_any_call(1, ETAG) + container_mock.register_part.assert_any_call(2, ETAG) + container_mock.finalize.assert_called_once_with(bucket.client._http) + part_mock.upload.assert_called_with(transport) + + +def test_upload_chunks_concurrently_passes_concurrency_options(): + bucket = mock.Mock() + bucket.name = "bucket" + bucket.client = _PickleableMockClient(identify_as_client=True) + transport = bucket.client._http + bucket.user_project = None + + blob = Blob("blob", bucket) + + FILENAME = "file_a.txt" + SIZE = 2048 + + container_mock = mock.Mock() + container_mock.upload_id = "abcd" + + MAX_WORKERS = 7 + DEADLINE = 10 + + with mock.patch("os.path.getsize", return_value=SIZE), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUContainer", + return_value=container_mock, + ), mock.patch("concurrent.futures.ThreadPoolExecutor") as pool_patch, mock.patch( + "concurrent.futures.wait" + ) as wait_patch: + try: + transfer_manager.upload_chunks_concurrently( + FILENAME, + blob, + chunk_size=SIZE // 2, + worker_type=transfer_manager.THREAD, + max_workers=MAX_WORKERS, + deadline=DEADLINE, + ) + except ValueError: + pass # The futures don't actually work, so we expect this to abort. + # Conveniently, that gives us a chance to test the auto-delete + # exception handling feature. + container_mock.cancel.assert_called_once_with(transport) + pool_patch.assert_called_with(max_workers=MAX_WORKERS) + wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) + + +def test_upload_chunks_concurrently_with_metadata_and_encryption(): + import datetime + from google.cloud._helpers import UTC + from google.cloud._helpers import _RFC3339_MICROS + + now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now_str = now.strftime(_RFC3339_MICROS) + + custom_metadata = {"key_a": "value_a", "key_b": "value_b"} + encryption_key = "b23ff11bba187db8c37077e6af3b25b8" + kms_key_name = "sample_key_name" + + METADATA = { + "cache_control": "private", + "content_disposition": "inline", + "content_language": "en-US", + "custom_time": now, + "metadata": custom_metadata, + "storage_class": "NEARLINE", + } + + bucket = mock.Mock() + bucket.name = "bucket" + bucket.client = _PickleableMockClient(identify_as_client=True) + transport = bucket.client._http + user_project = "my_project" + bucket.user_project = user_project + + blob = Blob("blob", bucket, kms_key_name=kms_key_name) + blob.content_type = FAKE_CONTENT_TYPE + + for key, value in METADATA.items(): + setattr(blob, key, value) + blob.metadata = {**custom_metadata} + blob.encryption_key = encryption_key + + FILENAME = "file_a.txt" + SIZE = 2048 + + container_mock = mock.Mock() + container_mock.upload_id = "abcd" + part_mock = mock.Mock() + ETAG = "efgh" + part_mock.etag = ETAG + container_cls_mock = mock.Mock(return_value=container_mock) + + invocation_id = "b9f8cbb0-6456-420c-819d-3f4ee3c0c455" + + with mock.patch("os.path.getsize", return_value=SIZE), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUContainer", new=container_cls_mock + ), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUPart", return_value=part_mock + ), mock.patch( + "google.cloud.storage._helpers._get_invocation_id", + return_value="gccl-invocation-id/" + invocation_id, + ): + transfer_manager.upload_chunks_concurrently( + FILENAME, + blob, + chunk_size=SIZE // 2, + worker_type=transfer_manager.THREAD, + ) + expected_headers = { + "Accept": "application/json", + "Accept-Encoding": "gzip, deflate", + "User-Agent": "agent", + "X-Goog-API-Client": "agent gccl-invocation-id/{}".format(invocation_id), + "content-type": FAKE_CONTENT_TYPE, + "x-upload-content-type": FAKE_CONTENT_TYPE, + "X-Goog-Encryption-Algorithm": "AES256", + "X-Goog-Encryption-Key": "YjIzZmYxMWJiYTE4N2RiOGMzNzA3N2U2YWYzYjI1Yjg=", + "X-Goog-Encryption-Key-Sha256": "B25Y4hgVlNXDliAklsNz9ykLk7qvgqDrSbdds5iu8r4=", + "Cache-Control": "private", + "Content-Disposition": "inline", + "Content-Language": "en-US", + "x-goog-storage-class": "NEARLINE", + "x-goog-custom-time": now_str, + "x-goog-meta-key_a": "value_a", + "x-goog-meta-key_b": "value_b", + "x-goog-user-project": "my_project", + "x-goog-encryption-kms-key-name": "sample_key_name", + } + container_cls_mock.assert_called_once_with( + URL, FILENAME, headers=expected_headers + ) + container_mock.initiate.assert_called_once_with( + transport=transport, content_type=blob.content_type + ) + container_mock.register_part.assert_any_call(1, ETAG) + container_mock.register_part.assert_any_call(2, ETAG) + container_mock.finalize.assert_called_once_with(transport) + part_mock.upload.assert_called_with(blob.client._http) + + class _PickleableMockBlob: def __init__( self, @@ -623,6 +805,28 @@ def download_to_file(self, *args, **kwargs): return "SUCCESS" +class _PickleableMockConnection: + @staticmethod + def get_api_base_url_for_mtls(): + return HOSTNAME + + user_agent = USER_AGENT + + +class _PickleableMockClient: + def __init__(self, identify_as_client=False): + self._http = "my_transport" # used as an identifier for "called_with" + self._connection = _PickleableMockConnection() + self.identify_as_client = identify_as_client + + @property + def __class__(self): + if self.identify_as_client: + return Client + else: + return _PickleableMockClient + + # Used in subprocesses only, so excluded from coverage def _validate_blob_token_in_subprocess_for_chunk( maybe_pickled_blob, filename, **kwargs @@ -642,7 +846,7 @@ def test_download_chunks_concurrently_with_processes(): with mock.patch( "google.cloud.storage.transfer_manager._download_and_write_chunk_in_place", new=_validate_blob_token_in_subprocess_for_chunk, - ), mock.patch("__main__.open", mock.mock_open()): + ), mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager.download_chunks_concurrently( blob, FILENAME, @@ -665,26 +869,44 @@ def test__LazyClient(): assert len(fake_cache) == 1 -def test__pickle_blob(): +def test__pickle_client(): # This test nominally has coverage, but doesn't assert that the essential - # copyreg behavior in _pickle_blob works. Unfortunately there doesn't seem + # copyreg behavior in _pickle_client works. Unfortunately there doesn't seem # to be a good way to check that without actually creating a Client, which # will spin up HTTP connections undesirably. This is more fully checked in - # the system tests, though. - pkl = transfer_manager._pickle_blob(FAKE_RESULT) + # the system tests. + pkl = transfer_manager._pickle_client(FAKE_RESULT) assert pickle.loads(pkl) == FAKE_RESULT def test__download_and_write_chunk_in_place(): pickled_mock = pickle.dumps(_PickleableMockBlob()) FILENAME = "file_a.txt" - with mock.patch("__main__.open", mock.mock_open()): + with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager._download_and_write_chunk_in_place( pickled_mock, FILENAME, 0, 8, {} ) assert result == "SUCCESS" +def test__upload_part(): + pickled_mock = pickle.dumps(_PickleableMockClient()) + FILENAME = "file_a.txt" + UPLOAD_ID = "abcd" + ETAG = "efgh" + + part = mock.Mock() + part.etag = ETAG + with mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUPart", return_value=part + ): + result = transfer_manager._upload_part( + pickled_mock, URL, UPLOAD_ID, FILENAME, 0, 256, 1, None, {"key", "value"} + ) + part.upload.assert_called_once() + assert result == (1, ETAG) + + def test__get_pool_class_and_requirements_error(): with pytest.raises(ValueError): transfer_manager._get_pool_class_and_requirements("garbage") From 14a1909963cfa41208f4e25b82b7c84c5e02452f Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 18 Sep 2023 18:38:13 -0700 Subject: [PATCH 201/509] feat: add gccl-gcs-cmd field to X-Goog-API-Client header for Transfer Manager calls (#1119) --- google/cloud/storage/_helpers.py | 23 +- google/cloud/storage/blob.py | 519 +++++++++++++++++++--- google/cloud/storage/client.py | 64 +-- google/cloud/storage/transfer_manager.py | 42 +- tests/unit/test__http.py | 3 +- tests/unit/test_blob.py | 541 ++++++++++++----------- tests/unit/test_client.py | 21 +- tests/unit/test_transfer_manager.py | 73 +-- 8 files changed, 860 insertions(+), 426 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 29968a9aa..77a9dffd0 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -599,19 +599,32 @@ def _get_default_headers( user_agent, content_type="application/json; charset=UTF-8", x_upload_content_type=None, + command=None, ): """Get the headers for a request. - Args: - user_agent (str): The user-agent for requests. - Returns: - Dict: The headers to be used for the request. + :type user_agent: str + :param user_agent: The user-agent for requests. + + :type command: str + :param command: + (Optional) Information about which interface for the operation was + used, to be included in the X-Goog-API-Client header. Please leave + as None unless otherwise directed. + + :rtype: dict + :returns: The headers to be used for the request. """ + x_goog_api_client = f"{user_agent} {_get_invocation_id()}" + + if command: + x_goog_api_client += f" gccl-gcs-cmd/{command}" + return { "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "User-Agent": user_agent, - "X-Goog-API-Client": f"{user_agent} {_get_invocation_id()}", + "X-Goog-API-Client": x_goog_api_client, "content-type": content_type, "x-upload-content-type": x_upload_content_type or content_type, } diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 4c493485f..ece758dbc 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -904,7 +904,7 @@ def _do_download( ): """Perform a download without any error handling. - This is intended to be called by :meth:`download_to_file` so it can + This is intended to be called by :meth:`_prep_and_do_download` so it can be wrapped with error handling / remapping. :type transport: @@ -957,7 +957,7 @@ def _do_download( This private method does not accept ConditionalRetryPolicy values because the information necessary to evaluate the policy is instead - evaluated in client.download_blob_to_file(). + evaluated in blob._prep_and_do_download(). See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how @@ -1124,11 +1124,10 @@ def download_to_file( :raises: :class:`google.cloud.exceptions.NotFound` """ - client = self._require_client(client) - client.download_blob_to_file( - self, - file_obj=file_obj, + self._prep_and_do_download( + file_obj, + client=client, start=start, end=end, raw_download=raw_download, @@ -1143,6 +1142,33 @@ def download_to_file( retry=retry, ) + def _handle_filename_and_download(self, filename, *args, **kwargs): + """Download the contents of this blob into a named file. + + :type filename: str + :param filename: A filename to be passed to ``open``. + + For *args and **kwargs, refer to the documentation for download_to_filename() for more information. + """ + + try: + with open(filename, "wb") as file_obj: + self._prep_and_do_download( + file_obj, + *args, + **kwargs, + ) + + except resumable_media.DataCorruption: + # Delete the corrupt downloaded file. + os.remove(filename) + raise + + updated = self.updated + if updated is not None: + mtime = updated.timestamp() + os.utime(file_obj.name, (mtime, mtime)) + def download_to_filename( self, filename, @@ -1250,34 +1276,23 @@ def download_to_filename( :raises: :class:`google.cloud.exceptions.NotFound` """ - client = self._require_client(client) - try: - with open(filename, "wb") as file_obj: - client.download_blob_to_file( - self, - file_obj, - start=start, - end=end, - raw_download=raw_download, - if_etag_match=if_etag_match, - if_etag_not_match=if_etag_not_match, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - timeout=timeout, - checksum=checksum, - retry=retry, - ) - except resumable_media.DataCorruption: - # Delete the corrupt downloaded file. - os.remove(filename) - raise - updated = self.updated - if updated is not None: - mtime = updated.timestamp() - os.utime(file_obj.name, (mtime, mtime)) + self._handle_filename_and_download( + filename, + client=client, + start=start, + end=end, + raw_download=raw_download, + if_etag_match=if_etag_match, + if_etag_not_match=if_etag_not_match, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + timeout=timeout, + checksum=checksum, + retry=retry, + ) def download_as_bytes( self, @@ -1382,11 +1397,12 @@ def download_as_bytes( :raises: :class:`google.cloud.exceptions.NotFound` """ - client = self._require_client(client) + string_buffer = BytesIO() - client.download_blob_to_file( - self, + + self._prep_and_do_download( string_buffer, + client=client, start=start, end=end, raw_download=raw_download, @@ -1697,7 +1713,7 @@ def _get_writable_metadata(self): return object_metadata - def _get_upload_arguments(self, client, content_type, filename=None): + def _get_upload_arguments(self, client, content_type, filename=None, command=None): """Get required arguments for performing an upload. The content type returned will be determined in order of precedence: @@ -1709,6 +1725,12 @@ def _get_upload_arguments(self, client, content_type, filename=None): :type content_type: str :param content_type: Type of content being uploaded (or :data:`None`). + :type command: str + :param command: + (Optional) Information about which interface for upload was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + :rtype: tuple :returns: A triple of @@ -1718,7 +1740,9 @@ def _get_upload_arguments(self, client, content_type, filename=None): """ content_type = self._get_content_type(content_type, filename=filename) headers = { - **_get_default_headers(client._connection.user_agent, content_type), + **_get_default_headers( + client._connection.user_agent, content_type, command=command + ), **_get_encryption_headers(self._encryption_key), } object_metadata = self._get_writable_metadata() @@ -1739,6 +1763,7 @@ def _do_multipart_upload( timeout=_DEFAULT_TIMEOUT, checksum=None, retry=None, + command=None, ): """Perform a multipart upload. @@ -1822,6 +1847,12 @@ def _do_multipart_upload( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type command: str + :param command: + (Optional) Information about which interface for upload was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + :rtype: :class:`~requests.Response` :returns: The "200 OK" response object returned after the multipart upload request. @@ -1840,7 +1871,7 @@ def _do_multipart_upload( transport = self._get_transport(client) if "metadata" in self._properties and "metadata" not in self._changes: self._changes.add("metadata") - info = self._get_upload_arguments(client, content_type) + info = self._get_upload_arguments(client, content_type, command=command) headers, object_metadata, content_type = info hostname = _get_host_name(client._connection) @@ -1910,6 +1941,7 @@ def _initiate_resumable_upload( timeout=_DEFAULT_TIMEOUT, checksum=None, retry=None, + command=None, ): """Initiate a resumable upload. @@ -2008,6 +2040,12 @@ def _initiate_resumable_upload( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type command: str + :param command: + (Optional) Information about which interface for upload was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + :rtype: tuple :returns: Pair of @@ -2025,7 +2063,7 @@ def _initiate_resumable_upload( transport = self._get_transport(client) if "metadata" in self._properties and "metadata" not in self._changes: self._changes.add("metadata") - info = self._get_upload_arguments(client, content_type) + info = self._get_upload_arguments(client, content_type, command=command) headers, object_metadata, content_type = info if extra_headers is not None: headers.update(extra_headers) @@ -2103,6 +2141,7 @@ def _do_resumable_upload( timeout=_DEFAULT_TIMEOUT, checksum=None, retry=None, + command=None, ): """Perform a resumable upload. @@ -2191,6 +2230,12 @@ def _do_resumable_upload( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type command: str + :param command: + (Optional) Information about which interface for upload was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + :rtype: :class:`~requests.Response` :returns: The "200 OK" response object returned after the final chunk is uploaded. @@ -2209,6 +2254,7 @@ def _do_resumable_upload( timeout=timeout, checksum=checksum, retry=retry, + command=command, ) while not upload.finished: try: @@ -2234,6 +2280,7 @@ def _do_upload( timeout=_DEFAULT_TIMEOUT, checksum=None, retry=None, + command=None, ): """Determine an upload strategy and then perform the upload. @@ -2333,6 +2380,12 @@ def _do_upload( configuration changes for Retry objects such as delays and deadlines are respected. + :type command: str + :param command: + (Optional) Information about which interface for upload was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + :rtype: dict :returns: The parsed JSON from the "200 OK" response. This will be the **only** response in the multipart case and it will be the @@ -2366,6 +2419,7 @@ def _do_upload( timeout=timeout, checksum=checksum, retry=retry, + command=command, ) else: response = self._do_resumable_upload( @@ -2382,11 +2436,12 @@ def _do_upload( timeout=timeout, checksum=checksum, retry=retry, + command=command, ) return response.json() - def upload_from_file( + def _prep_and_do_upload( self, file_obj, rewind=False, @@ -2402,6 +2457,7 @@ def upload_from_file( timeout=_DEFAULT_TIMEOUT, checksum=None, retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + command=None, ): """Upload the contents of this blob from a file-like object. @@ -2522,6 +2578,12 @@ def upload_from_file( configuration changes for Retry objects such as delays and deadlines are respected. + :type command: str + :param command: + (Optional) Information about which interface for upload was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + :raises: :class:`~google.cloud.exceptions.GoogleCloudError` if the upload response returns an error status. """ @@ -2551,11 +2613,192 @@ def upload_from_file( timeout=timeout, checksum=checksum, retry=retry, + command=command, ) self._set_properties(created_json) except resumable_media.InvalidResponse as exc: _raise_from_invalid_response(exc) + def upload_from_file( + self, + file_obj, + rewind=False, + size=None, + content_type=None, + num_retries=None, + client=None, + predefined_acl=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=_DEFAULT_TIMEOUT, + checksum=None, + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + ): + """Upload the contents of this blob from a file-like object. + + The content type of the upload will be determined in order + of precedence: + + - The value passed in to this method (if not :data:`None`) + - The value stored on the current blob + - The default value ('application/octet-stream') + + .. note:: + The effect of uploading to an existing blob depends on the + "versioning" and "lifecycle" policies defined on the blob's + bucket. In the absence of those policies, upload will + overwrite any existing contents. + + See the [`object versioning`](https://cloud.google.com/storage/docs/object-versioning) + and [`lifecycle`](https://cloud.google.com/storage/docs/lifecycle) + API documents for details. + + If the size of the data to be uploaded exceeds 8 MB a resumable media + request will be used, otherwise the content and the metadata will be + uploaded in a single multipart upload request. + + For more fine-grained over the upload process, check out + [`google-resumable-media`](https://googleapis.dev/python/google-resumable-media/latest/index.html). + + If :attr:`user_project` is set on the bucket, bills the API request + to that project. + + :type file_obj: file + :param file_obj: A file handle opened in binary mode for reading. + + :type rewind: bool + :param rewind: + If True, seek to the beginning of the file handle before writing + the file to Cloud Storage. + + :type size: int + :param size: + The number of bytes to be uploaded (which will be read from + ``file_obj``). If not provided, the upload will be concluded once + ``file_obj`` is exhausted. + + :type content_type: str + :param content_type: (Optional) Type of content being uploaded. + + :type num_retries: int + :param num_retries: + Number of upload retries. By default, only uploads with + if_generation_match set will be retried, as uploads without the + argument are not guaranteed to be idempotent. Setting num_retries + will override this default behavior and guarantee retries even when + if_generation_match is not set. (Deprecated: This argument + will be removed in a future release.) + + :type client: :class:`~google.cloud.storage.client.Client` + :param client: + (Optional) The client to use. If not passed, falls back to the + ``client`` stored on the blob's bucket. + + :type predefined_acl: str + :param predefined_acl: (Optional) Predefined access control list + + :type if_generation_match: long + :param if_generation_match: + (Optional) See :ref:`using-if-generation-match` + + :type if_generation_not_match: long + :param if_generation_not_match: + (Optional) See :ref:`using-if-generation-not-match` + + :type if_metageneration_match: long + :param if_metageneration_match: + (Optional) See :ref:`using-if-metageneration-match` + + :type if_metageneration_not_match: long + :param if_metageneration_not_match: + (Optional) See :ref:`using-if-metageneration-not-match` + + :type timeout: float or tuple + :param timeout: + (Optional) The amount of time, in seconds, to wait + for the server response. See: :ref:`configuring_timeouts` + + :type checksum: str + :param checksum: + (Optional) The type of checksum to compute to verify + the integrity of the object. If the upload is completed in a single + request, the checksum will be entirely precomputed and the remote + server will handle verification and error handling. If the upload + is too large and must be transmitted in multiple requests, the + checksum will be incrementally computed and the client will handle + verification and error handling, raising + google.resumable_media.common.DataCorruption on a mismatch and + attempting to delete the corrupted file. Supported values are + "md5", "crc32c" and None. The default is None. + + :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy + :param retry: (Optional) How to retry the RPC. A None value will disable + retries. A google.api_core.retry.Retry value will enable retries, + and the object will define retriable response codes and errors and + configure backoff and timeout options. + + A google.cloud.storage.retry.ConditionalRetryPolicy value wraps a + Retry object and activates it only if certain conditions are met. + This class exists to provide safe defaults for RPC calls that are + not technically safe to retry normally (due to potential data + duplication or other side-effects) but become safe to retry if a + condition such as if_generation_match is set. + + See the retry.py source code and docstrings in this package + (google.cloud.storage.retry) for information on retry types and how + to configure them. + + Media operations (downloads and uploads) do not support non-default + predicates in a Retry object. The default will always be used. Other + configuration changes for Retry objects such as delays and deadlines + are respected. + + :raises: :class:`~google.cloud.exceptions.GoogleCloudError` + if the upload response returns an error status. + """ + self._prep_and_do_upload( + file_obj, + rewind=rewind, + size=size, + content_type=content_type, + num_retries=num_retries, + client=client, + predefined_acl=predefined_acl, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + timeout=timeout, + checksum=checksum, + retry=retry, + ) + + def _handle_filename_and_upload(self, filename, content_type=None, *args, **kwargs): + """Upload this blob's contents from the content of a named file. + + :type filename: str + :param filename: The path to the file. + + :type content_type: str + :param content_type: (Optional) Type of content being uploaded. + + For *args and **kwargs, refer to the documentation for upload_from_filename() for more information. + """ + + content_type = self._get_content_type(content_type, filename=filename) + + with open(filename, "rb") as file_obj: + total_bytes = os.fstat(file_obj.fileno()).st_size + self._prep_and_do_upload( + file_obj, + content_type=content_type, + size=total_bytes, + *args, + **kwargs, + ) + def upload_from_filename( self, filename, @@ -2677,25 +2920,21 @@ def upload_from_filename( configuration changes for Retry objects such as delays and deadlines are respected. """ - content_type = self._get_content_type(content_type, filename=filename) - with open(filename, "rb") as file_obj: - total_bytes = os.fstat(file_obj.fileno()).st_size - self.upload_from_file( - file_obj, - content_type=content_type, - num_retries=num_retries, - client=client, - size=total_bytes, - predefined_acl=predefined_acl, - if_generation_match=if_generation_match, - if_generation_not_match=if_generation_not_match, - if_metageneration_match=if_metageneration_match, - if_metageneration_not_match=if_metageneration_not_match, - timeout=timeout, - checksum=checksum, - retry=retry, - ) + self._handle_filename_and_upload( + filename, + content_type=content_type, + num_retries=num_retries, + client=client, + predefined_acl=predefined_acl, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + timeout=timeout, + checksum=checksum, + retry=retry, + ) def upload_from_string( self, @@ -3936,6 +4175,168 @@ def open( :rtype: str or ``NoneType`` """ + def _prep_and_do_download( + self, + file_obj, + client=None, + start=None, + end=None, + raw_download=False, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=_DEFAULT_TIMEOUT, + checksum="md5", + retry=DEFAULT_RETRY, + command=None, + ): + """Download the contents of a blob object into a file-like object. + + See https://cloud.google.com/storage/docs/downloading-objects + + If :attr:`user_project` is set on the bucket, bills the API request + to that project. + + :type file_obj: file + :param file_obj: A file handle to which to write the blob's data. + + :type client: :class:`~google.cloud.storage.client.Client` + :param client: + (Optional) The client to use. If not passed, falls back to the + ``client`` stored on the blob's bucket. + + :type start: int + :param start: (Optional) The first byte in a range to be downloaded. + + :type end: int + :param end: (Optional) The last byte in a range to be downloaded. + + :type raw_download: bool + :param raw_download: + (Optional) If true, download the object without any expansion. + + :type if_etag_match: Union[str, Set[str]] + :param if_etag_match: + (Optional) See :ref:`using-if-etag-match` + + :type if_etag_not_match: Union[str, Set[str]] + :param if_etag_not_match: + (Optional) See :ref:`using-if-etag-not-match` + + :type if_generation_match: long + :param if_generation_match: + (Optional) See :ref:`using-if-generation-match` + + :type if_generation_not_match: long + :param if_generation_not_match: + (Optional) See :ref:`using-if-generation-not-match` + + :type if_metageneration_match: long + :param if_metageneration_match: + (Optional) See :ref:`using-if-metageneration-match` + + :type if_metageneration_not_match: long + :param if_metageneration_not_match: + (Optional) See :ref:`using-if-metageneration-not-match` + + :type timeout: float or tuple + :param timeout: + (Optional) The amount of time, in seconds, to wait + for the server response. See: :ref:`configuring_timeouts` + + :type checksum: str + :param checksum: + (Optional) The type of checksum to compute to verify the integrity + of the object. The response headers must contain a checksum of the + requested type. If the headers lack an appropriate checksum (for + instance in the case of transcoded or ranged downloads where the + remote service does not know the correct checksum, including + downloads where chunk_size is set) an INFO-level log will be + emitted. Supported values are "md5", "crc32c" and None. The default + is "md5". + + :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy + :param retry: (Optional) How to retry the RPC. A None value will disable + retries. A google.api_core.retry.Retry value will enable retries, + and the object will define retriable response codes and errors and + configure backoff and timeout options. + + A google.cloud.storage.retry.ConditionalRetryPolicy value wraps a + Retry object and activates it only if certain conditions are met. + This class exists to provide safe defaults for RPC calls that are + not technically safe to retry normally (due to potential data + duplication or other side-effects) but become safe to retry if a + condition such as if_metageneration_match is set. + + See the retry.py source code and docstrings in this package + (google.cloud.storage.retry) for information on retry types and how + to configure them. + + Media operations (downloads and uploads) do not support non-default + predicates in a Retry object. The default will always be used. Other + configuration changes for Retry objects such as delays and deadlines + are respected. + + :type command: str + :param command: + (Optional) Information about which interface for download was used, + to be included in the X-Goog-API-Client header. Please leave as None + unless otherwise directed. + """ + # Handle ConditionalRetryPolicy. + if isinstance(retry, ConditionalRetryPolicy): + # Conditional retries are designed for non-media calls, which change + # arguments into query_params dictionaries. Media operations work + # differently, so here we make a "fake" query_params to feed to the + # ConditionalRetryPolicy. + query_params = { + "ifGenerationMatch": if_generation_match, + "ifMetagenerationMatch": if_metageneration_match, + } + retry = retry.get_retry_policy_if_conditions_met(query_params=query_params) + + client = self._require_client(client) + + download_url = self._get_download_url( + client, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + ) + headers = _get_encryption_headers(self._encryption_key) + headers["accept-encoding"] = "gzip" + _add_etag_match_headers( + headers, + if_etag_match=if_etag_match, + if_etag_not_match=if_etag_not_match, + ) + headers = { + **_get_default_headers(client._connection.user_agent, command=command), + **headers, + } + + transport = client._http + + try: + self._do_download( + transport, + file_obj, + download_url, + headers, + start, + end, + raw_download, + timeout=timeout, + checksum=checksum, + retry=retry, + ) + except resumable_media.InvalidResponse as exc: + _raise_from_invalid_response(exc) + @property def component_count(self): """Number of underlying components that make up this object. diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index bec5da9a3..e6391f5fb 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -25,18 +25,16 @@ from google.auth.credentials import AnonymousCredentials -from google import resumable_media - from google.api_core import page_iterator from google.cloud._helpers import _LocalStack, _NOW from google.cloud.client import ClientWithProject from google.cloud.exceptions import NotFound -from google.cloud.storage._helpers import _get_default_headers + from google.cloud.storage._helpers import _get_environ_project from google.cloud.storage._helpers import _get_storage_host from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST from google.cloud.storage._helpers import _bucket_bound_hostname_url -from google.cloud.storage._helpers import _add_etag_match_headers + from google.cloud.storage._http import Connection from google.cloud.storage._signing import ( get_expiration_seconds_v4, @@ -46,17 +44,12 @@ ) from google.cloud.storage.batch import Batch from google.cloud.storage.bucket import Bucket, _item_to_blob, _blobs_page_start -from google.cloud.storage.blob import ( - Blob, - _get_encryption_headers, - _raise_from_invalid_response, -) +from google.cloud.storage.blob import Blob from google.cloud.storage.hmac_key import HMACKeyMetadata from google.cloud.storage.acl import BucketACL from google.cloud.storage.acl import DefaultObjectACL from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.retry import DEFAULT_RETRY -from google.cloud.storage.retry import ConditionalRetryPolicy _marker = object() @@ -1064,52 +1057,25 @@ def download_blob_to_file( are respected. """ - # Handle ConditionalRetryPolicy. - if isinstance(retry, ConditionalRetryPolicy): - # Conditional retries are designed for non-media calls, which change - # arguments into query_params dictionaries. Media operations work - # differently, so here we make a "fake" query_params to feed to the - # ConditionalRetryPolicy. - query_params = { - "ifGenerationMatch": if_generation_match, - "ifMetagenerationMatch": if_metageneration_match, - } - retry = retry.get_retry_policy_if_conditions_met(query_params=query_params) - if not isinstance(blob_or_uri, Blob): blob_or_uri = Blob.from_string(blob_or_uri) - download_url = blob_or_uri._get_download_url( - self, + + blob_or_uri._prep_and_do_download( + file_obj, + client=self, + start=start, + end=end, + raw_download=raw_download, + if_etag_match=if_etag_match, + if_etag_not_match=if_etag_not_match, if_generation_match=if_generation_match, if_generation_not_match=if_generation_not_match, if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, + timeout=timeout, + checksum=checksum, + retry=retry, ) - headers = _get_encryption_headers(blob_or_uri._encryption_key) - headers["accept-encoding"] = "gzip" - _add_etag_match_headers( - headers, - if_etag_match=if_etag_match, - if_etag_not_match=if_etag_not_match, - ) - headers = {**_get_default_headers(self._connection.user_agent), **headers} - - transport = self._http - try: - blob_or_uri._do_download( - transport, - file_obj, - download_url, - headers, - start, - end, - raw_download, - timeout=timeout, - checksum=checksum, - retry=retry, - ) - except resumable_media.InvalidResponse as exc: - _raise_from_invalid_response(exc) def list_blobs( self, diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 5cb9b6c46..b213d9e79 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -102,8 +102,7 @@ def upload_many( :type file_blob_pairs: List(Tuple(IOBase or str, 'google.cloud.storage.blob.Blob')) :param file_blob_pairs: A list of tuples of a file or filename and a blob. Each file will be - uploaded to the corresponding blob by using blob.upload_from_file() or - blob.upload_from_filename() as appropriate. + uploaded to the corresponding blob by using APIs identical to blob.upload_from_file() or blob.upload_from_filename() as appropriate. File handlers are only supported if worker_type is set to THREAD. If worker_type is set to PROCESS, please use filenames only. @@ -120,8 +119,7 @@ def upload_many( :param upload_kwargs: A dictionary of keyword arguments to pass to the upload method. Refer to the documentation for blob.upload_from_file() or - blob.upload_from_filename() for more information. The dict is directly - passed into the upload methods and is not validated by this function. + blob.upload_from_filename() for more information. The dict is directly passed into the upload methods and is not validated by this function. :type threads: int :param threads: @@ -192,10 +190,13 @@ def upload_many( """ if upload_kwargs is None: upload_kwargs = {} + if skip_if_exists: upload_kwargs = upload_kwargs.copy() upload_kwargs["if_generation_match"] = 0 + upload_kwargs["command"] = "tm.upload_many" + pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) with pool_class(max_workers=max_workers) as executor: @@ -212,9 +213,9 @@ def upload_many( executor.submit( _call_method_on_maybe_pickled_blob, _pickle_client(blob) if needs_pickling else blob, - "upload_from_filename" + "_handle_filename_and_upload" if isinstance(path_or_file, str) - else "upload_from_file", + else "_prep_and_do_upload", path_or_file, **upload_kwargs, ) @@ -256,12 +257,9 @@ def download_many( :type blob_file_pairs: List(Tuple('google.cloud.storage.blob.Blob', IOBase or str)) :param blob_file_pairs: - A list of tuples of blob and a file or filename. Each blob will be - downloaded to the corresponding blob by using blob.download_to_file() or - blob.download_to_filename() as appropriate. + A list of tuples of blob and a file or filename. Each blob will be downloaded to the corresponding blob by using APIs identical to blob.download_to_file() or blob.download_to_filename() as appropriate. - Note that blob.download_to_filename() does not delete the destination - file if the download fails. + Note that blob.download_to_filename() does not delete the destination file if the download fails. File handlers are only supported if worker_type is set to THREAD. If worker_type is set to PROCESS, please use filenames only. @@ -269,9 +267,7 @@ def download_many( :type download_kwargs: dict :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly - passed into the download methods and is not validated by this function. + to the documentation for blob.download_to_file() or blob.download_to_filename() for more information. The dict is directly passed into the download methods and is not validated by this function. :type threads: int :param threads: @@ -341,6 +337,8 @@ def download_many( if download_kwargs is None: download_kwargs = {} + download_kwargs["command"] = "tm.download_many" + pool_class, needs_pickling = _get_pool_class_and_requirements(worker_type) with pool_class(max_workers=max_workers) as executor: @@ -357,9 +355,9 @@ def download_many( executor.submit( _call_method_on_maybe_pickled_blob, _pickle_client(blob) if needs_pickling else blob, - "download_to_filename" + "_handle_filename_and_download" if isinstance(path_or_file, str) - else "download_to_file", + else "_prep_and_do_download", path_or_file, **download_kwargs, ) @@ -467,8 +465,7 @@ def upload_many_from_filenames( :param upload_kwargs: A dictionary of keyword arguments to pass to the upload method. Refer to the documentation for blob.upload_from_file() or - blob.upload_from_filename() for more information. The dict is directly - passed into the upload methods and is not validated by this function. + blob.upload_from_filename() for more information. The dict is directly passed into the upload methods and is not validated by this function. :type threads: int :param threads: @@ -767,8 +764,7 @@ def download_chunks_concurrently( :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly - passed into the download methods and is not validated by this function. + blob.download_to_filename() for more information. The dict is directly passed into the download methods and is not validated by this function. Keyword arguments "start" and "end" which are not supported and will cause a ValueError if present. @@ -821,6 +817,8 @@ def download_chunks_concurrently( "Download arguments 'start' and 'end' are not supported by download_chunks_concurrently." ) + download_kwargs["command"] = "tm.download_sharded" + # We must know the size and the generation of the blob. if not blob.size or not blob.generation: blob.reload() @@ -981,7 +979,7 @@ def upload_chunks_concurrently( ) base_headers, object_metadata, content_type = blob._get_upload_arguments( - client, content_type, filename=filename + client, content_type, filename=filename, command="tm.upload_sharded" ) headers = {**base_headers, **_headers_from_metadata(object_metadata)} @@ -1113,7 +1111,7 @@ def _download_and_write_chunk_in_place( filename, "rb+" ) as f: # Open in mixed read/write mode to avoid truncating or appending f.seek(start) - return blob.download_to_file(f, start=start, end=end, **download_kwargs) + return blob._prep_and_do_download(f, start=start, end=end, **download_kwargs) def _call_method_on_maybe_pickled_blob( diff --git a/tests/unit/test__http.py b/tests/unit/test__http.py index 9e7bf216b..e64ae0bab 100644 --- a/tests/unit/test__http.py +++ b/tests/unit/test__http.py @@ -18,7 +18,8 @@ import mock from google.cloud.storage import _helpers -from tests.unit.test__helpers import GCCL_INVOCATION_TEST_CONST + +GCCL_INVOCATION_TEST_CONST = "gccl-invocation-id/test-invocation-123" class TestConnection(unittest.TestCase): diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 638db9f4e..a8d024176 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -1411,33 +1411,35 @@ def test_download_to_file_with_failure(self): blob_name = "blob-name" client = self._make_client() - client.download_blob_to_file.side_effect = NotFound("testing") bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket) file_obj = io.BytesIO() - with self.assertRaises(NotFound): - blob.download_to_file(file_obj) + with mock.patch.object(blob, "_prep_and_do_download"): + blob._prep_and_do_download.side_effect = NotFound("testing") - self.assertEqual(file_obj.tell(), 0) + with self.assertRaises(NotFound): + blob.download_to_file(file_obj) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - file_obj, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) + self.assertEqual(file_obj.tell(), 0) + + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + file_obj, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) def test_download_to_file_wo_media_link(self): blob_name = "blob-name" @@ -1446,28 +1448,29 @@ def test_download_to_file_wo_media_link(self): blob = self._make_one(blob_name, bucket=bucket) file_obj = io.BytesIO() - blob.download_to_file(file_obj) + with mock.patch.object(blob, "_prep_and_do_download"): + blob.download_to_file(file_obj) - # Make sure the media link is still unknown. - self.assertIsNone(blob.media_link) + # Make sure the media link is still unknown. + self.assertIsNone(blob.media_link) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - file_obj, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + file_obj, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) def test_download_to_file_w_etag_match(self): etag = "kittens" @@ -1475,25 +1478,26 @@ def test_download_to_file_w_etag_match(self): blob = self._make_one("blob-name", bucket=_Bucket(client)) file_obj = io.BytesIO() - blob.download_to_file(file_obj, if_etag_not_match=etag) + with mock.patch.object(blob, "_prep_and_do_download"): + blob.download_to_file(file_obj, if_etag_not_match=etag) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - file_obj, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=etag, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + file_obj, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=etag, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) def test_download_to_file_w_generation_match(self): generation_number = 6 @@ -1501,25 +1505,26 @@ def test_download_to_file_w_generation_match(self): blob = self._make_one("blob-name", bucket=_Bucket(client)) file_obj = io.BytesIO() - blob.download_to_file(file_obj, if_generation_not_match=generation_number) + with mock.patch.object(blob, "_prep_and_do_download"): + blob.download_to_file(file_obj, if_generation_not_match=generation_number) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - file_obj, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=generation_number, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + file_obj, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=generation_number, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) def _download_to_file_helper( self, use_chunks, raw_download, timeout=None, **extra_kwargs @@ -1544,28 +1549,30 @@ def _download_to_file_helper( extra_kwargs.update(timeout_kwarg) file_obj = io.BytesIO() - if raw_download: - blob.download_to_file(file_obj, raw_download=True, **extra_kwargs) - else: - blob.download_to_file(file_obj, **extra_kwargs) - expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) - client.download_blob_to_file.assert_called_once_with( - blob, - file_obj, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=raw_download, - timeout=expected_timeout, - checksum="md5", - retry=expected_retry, - ) + with mock.patch.object(blob, "_prep_and_do_download"): + if raw_download: + blob.download_to_file(file_obj, raw_download=True, **extra_kwargs) + else: + blob.download_to_file(file_obj, **extra_kwargs) + + expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) + blob._prep_and_do_download.assert_called_once_with( + file_obj, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=raw_download, + timeout=expected_timeout, + checksum="md5", + retry=expected_retry, + ) def test_download_to_file_wo_chunks_wo_raw(self): self._download_to_file_helper(use_chunks=False, raw_download=False) @@ -1602,48 +1609,51 @@ def _download_to_filename_helper( blob = self._make_one(blob_name, bucket=bucket, properties=properties) - with _NamedTemporaryFile() as temp: - if timeout is None: - blob.download_to_filename( - temp.name, raw_download=raw_download, **extra_kwargs - ) - else: - blob.download_to_filename( - temp.name, - raw_download=raw_download, - timeout=timeout, - **extra_kwargs, - ) - - if updated is None: - self.assertIsNone(blob.updated) - else: - mtime = os.path.getmtime(temp.name) - updated_time = blob.updated.timestamp() - self.assertEqual(mtime, updated_time) - - expected_timeout = self._get_default_timeout() if timeout is None else timeout + with mock.patch.object(blob, "_prep_and_do_download"): + with _NamedTemporaryFile() as temp: + if timeout is None: + blob.download_to_filename( + temp.name, raw_download=raw_download, **extra_kwargs + ) + else: + blob.download_to_filename( + temp.name, + raw_download=raw_download, + timeout=timeout, + **extra_kwargs, + ) + + if updated is None: + self.assertIsNone(blob.updated) + else: + mtime = os.path.getmtime(temp.name) + updated_time = blob.updated.timestamp() + self.assertEqual(mtime, updated_time) + + expected_timeout = ( + self._get_default_timeout() if timeout is None else timeout + ) - expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) + expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) - client.download_blob_to_file.assert_called_once_with( - blob, - mock.ANY, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=raw_download, - timeout=expected_timeout, - checksum="md5", - retry=expected_retry, - ) - stream = client.download_blob_to_file.mock_calls[0].args[1] - self.assertEqual(stream.name, temp.name) + blob._prep_and_do_download.assert_called_once_with( + mock.ANY, + client=None, + start=None, + end=None, + raw_download=raw_download, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=expected_timeout, + checksum="md5", + retry=expected_retry, + ) + stream = blob._prep_and_do_download.mock_calls[0].args[0] + self.assertEqual(stream.name, temp.name) def test_download_to_filename_w_updated_wo_raw(self): updated = "2014-12-06T13:13:50.690Z" @@ -1677,28 +1687,29 @@ def test_download_to_filename_w_etag_match(self): client = self._make_client() blob = self._make_one("blob-name", bucket=_Bucket(client)) - with _NamedTemporaryFile() as temp: - blob.download_to_filename(temp.name, if_etag_match=etag) + with mock.patch.object(blob, "_prep_and_do_download"): + with _NamedTemporaryFile() as temp: + blob.download_to_filename(temp.name, if_etag_match=etag) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - mock.ANY, - start=None, - end=None, - if_etag_match=etag, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) - stream = client.download_blob_to_file.mock_calls[0].args[1] - self.assertEqual(stream.name, temp.name) + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + mock.ANY, + client=None, + start=None, + end=None, + if_etag_match=etag, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) + stream = blob._prep_and_do_download.mock_calls[0].args[0] + self.assertEqual(stream.name, temp.name) def test_download_to_filename_w_generation_match(self): from google.cloud._testing import _NamedTemporaryFile @@ -1707,28 +1718,31 @@ def test_download_to_filename_w_generation_match(self): client = self._make_client() blob = self._make_one("blob-name", bucket=_Bucket(client)) - with _NamedTemporaryFile() as temp: - blob.download_to_filename(temp.name, if_generation_match=generation_number) + with mock.patch.object(blob, "_prep_and_do_download"): + with _NamedTemporaryFile() as temp: + blob.download_to_filename( + temp.name, if_generation_match=generation_number + ) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - mock.ANY, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=generation_number, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) - stream = client.download_blob_to_file.mock_calls[0].args[1] - self.assertEqual(stream.name, temp.name) + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + mock.ANY, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=generation_number, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) + stream = blob._prep_and_do_download.mock_calls[0].args[0] + self.assertEqual(stream.name, temp.name) def test_download_to_filename_corrupted(self): from google.resumable_media import DataCorruption @@ -1737,40 +1751,42 @@ def test_download_to_filename_corrupted(self): client = self._make_client() bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket) - client.download_blob_to_file.side_effect = DataCorruption("testing") - # Try to download into a temporary file (don't use - # `_NamedTemporaryFile` it will try to remove after the file is - # already removed) - filehandle, filename = tempfile.mkstemp() - os.close(filehandle) - self.assertTrue(os.path.exists(filename)) + with mock.patch.object(blob, "_prep_and_do_download"): + blob._prep_and_do_download.side_effect = DataCorruption("testing") - with self.assertRaises(DataCorruption): - blob.download_to_filename(filename) + # Try to download into a temporary file (don't use + # `_NamedTemporaryFile` it will try to remove after the file is + # already removed) + filehandle, filename = tempfile.mkstemp() + os.close(filehandle) + self.assertTrue(os.path.exists(filename)) - # Make sure the file was cleaned up. - self.assertFalse(os.path.exists(filename)) + with self.assertRaises(DataCorruption): + blob.download_to_filename(filename) - expected_timeout = self._get_default_timeout() - client.download_blob_to_file.assert_called_once_with( - blob, - mock.ANY, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=False, - timeout=expected_timeout, - checksum="md5", - retry=DEFAULT_RETRY, - ) - stream = client.download_blob_to_file.mock_calls[0].args[1] - self.assertEqual(stream.name, filename) + # Make sure the file was cleaned up. + self.assertFalse(os.path.exists(filename)) + + expected_timeout = self._get_default_timeout() + blob._prep_and_do_download.assert_called_once_with( + mock.ANY, + client=None, + start=None, + end=None, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + raw_download=False, + timeout=expected_timeout, + checksum="md5", + retry=DEFAULT_RETRY, + ) + stream = blob._prep_and_do_download.mock_calls[0].args[0] + self.assertEqual(stream.name, filename) def _download_as_bytes_helper(self, raw_download, timeout=None, **extra_kwargs): blob_name = "blob-name" @@ -1778,36 +1794,39 @@ def _download_as_bytes_helper(self, raw_download, timeout=None, **extra_kwargs): bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket) - if timeout is None: - expected_timeout = self._get_default_timeout() - fetched = blob.download_as_bytes(raw_download=raw_download, **extra_kwargs) - else: - expected_timeout = timeout - fetched = blob.download_as_bytes( - raw_download=raw_download, timeout=timeout, **extra_kwargs - ) - self.assertEqual(fetched, b"") + with mock.patch.object(blob, "_prep_and_do_download"): + if timeout is None: + expected_timeout = self._get_default_timeout() + fetched = blob.download_as_bytes( + raw_download=raw_download, **extra_kwargs + ) + else: + expected_timeout = timeout + fetched = blob.download_as_bytes( + raw_download=raw_download, timeout=timeout, **extra_kwargs + ) + self.assertEqual(fetched, b"") - expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) + expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) - client.download_blob_to_file.assert_called_once_with( - blob, - mock.ANY, - start=None, - end=None, - if_etag_match=None, - if_etag_not_match=None, - if_generation_match=None, - if_generation_not_match=None, - if_metageneration_match=None, - if_metageneration_not_match=None, - raw_download=raw_download, - timeout=expected_timeout, - checksum="md5", - retry=expected_retry, - ) - stream = client.download_blob_to_file.mock_calls[0].args[1] - self.assertIsInstance(stream, io.BytesIO) + blob._prep_and_do_download.assert_called_once_with( + mock.ANY, + client=None, + start=None, + end=None, + raw_download=raw_download, + if_etag_match=None, + if_etag_not_match=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=expected_timeout, + checksum="md5", + retry=expected_retry, + ) + stream = blob._prep_and_do_download.mock_calls[0].args[0] + self.assertIsInstance(stream, io.BytesIO) def test_download_as_bytes_w_custom_timeout(self): self._download_as_bytes_helper(raw_download=False, timeout=9.58) @@ -1820,14 +1839,14 @@ def test_download_as_bytes_w_etag_match(self): blob = self._make_one( "blob-name", bucket=_Bucket(client), properties={"mediaLink": MEDIA_LINK} ) - client.download_blob_to_file = mock.Mock() + blob._prep_and_do_download = mock.Mock() fetched = blob.download_as_bytes(if_etag_match=ETAG) self.assertEqual(fetched, b"") - client.download_blob_to_file.assert_called_once_with( - blob, + blob._prep_and_do_download.assert_called_once_with( mock.ANY, + client=None, start=None, end=None, raw_download=False, @@ -1850,14 +1869,14 @@ def test_download_as_bytes_w_generation_match(self): blob = self._make_one( "blob-name", bucket=_Bucket(client), properties={"mediaLink": MEDIA_LINK} ) - client.download_blob_to_file = mock.Mock() + blob._prep_and_do_download = mock.Mock() fetched = blob.download_as_bytes(if_generation_match=GENERATION_NUMBER) self.assertEqual(fetched, b"") - client.download_blob_to_file.assert_called_once_with( - blob, + blob._prep_and_do_download.assert_called_once_with( mock.ANY, + client=None, start=None, end=None, raw_download=False, @@ -2087,14 +2106,14 @@ def test_download_as_string(self, mock_warn): blob = self._make_one( "blob-name", bucket=_Bucket(client), properties={"mediaLink": MEDIA_LINK} ) - client.download_blob_to_file = mock.Mock() + blob._prep_and_do_download = mock.Mock() fetched = blob.download_as_string() self.assertEqual(fetched, b"") - client.download_blob_to_file.assert_called_once_with( - blob, + blob._prep_and_do_download.assert_called_once_with( mock.ANY, + client=None, start=None, end=None, raw_download=False, @@ -2125,14 +2144,14 @@ def test_download_as_string_no_retry(self, mock_warn): blob = self._make_one( "blob-name", bucket=_Bucket(client), properties={"mediaLink": MEDIA_LINK} ) - client.download_blob_to_file = mock.Mock() + blob._prep_and_do_download = mock.Mock() fetched = blob.download_as_string(retry=None) self.assertEqual(fetched, b"") - client.download_blob_to_file.assert_called_once_with( - blob, + blob._prep_and_do_download.assert_called_once_with( mock.ANY, + client=None, start=None, end=None, raw_download=False, @@ -2232,11 +2251,12 @@ def test__get_upload_arguments(self): blob = self._make_one(name, bucket=None, encryption_key=key) blob.content_disposition = "inline" + COMMAND = "tm.upload_many" content_type = "image/jpeg" with patch.object( _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): - info = blob._get_upload_arguments(client, content_type) + info = blob._get_upload_arguments(client, content_type, command=COMMAND) headers, object_metadata, new_content_type = info header_key_value = "W3BYd0AscEBAQWZCZnJSM3gtMmIyU0NIUiwuP1l3Uk8=" @@ -2245,11 +2265,17 @@ def test__get_upload_arguments(self): _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): expected_headers = { - **_get_default_headers(client._connection.user_agent, content_type), + **_get_default_headers( + client._connection.user_agent, content_type, command=COMMAND + ), "X-Goog-Encryption-Algorithm": "AES256", "X-Goog-Encryption-Key": header_key_value, "X-Goog-Encryption-Key-Sha256": header_key_hash_value, } + self.assertEqual( + headers["X-Goog-API-Client"], + f"{client._connection.user_agent} {GCCL_INVOCATION_TEST_CONST} gccl-gcs-cmd/{COMMAND}", + ) self.assertEqual(headers, expected_headers) expected_metadata = { "contentDisposition": blob.content_disposition, @@ -3165,6 +3191,7 @@ def _do_upload_helper( timeout=expected_timeout, checksum=None, retry=retry, + command=None, ) blob._do_resumable_upload.assert_not_called() else: @@ -3183,6 +3210,7 @@ def _do_upload_helper( timeout=expected_timeout, checksum=None, retry=retry, + command=None, ) def test__do_upload_uses_multipart(self): @@ -3275,6 +3303,7 @@ def _upload_from_file_helper(self, side_effect=None, **kwargs): timeout=expected_timeout, checksum=None, retry=retry, + command=None, ) return stream @@ -3366,7 +3395,13 @@ def _do_upload_mock_call_helper( if not retry: retry = DEFAULT_RETRY_IF_GENERATION_SPECIFIED if not num_retries else None self.assertEqual( - kwargs, {"timeout": expected_timeout, "checksum": None, "retry": retry} + kwargs, + { + "timeout": expected_timeout, + "checksum": None, + "retry": retry, + "command": None, + }, ) return pos_args[1] diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 31f7e3988..277610696 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1639,9 +1639,16 @@ def test_create_bucket_w_name_only(self): _target_object=bucket, ) + @staticmethod + def _make_blob(*args, **kw): + from google.cloud.storage.blob import Blob + + blob = Blob(*args, **kw) + + return blob + def test_download_blob_to_file_with_failure(self): from google.resumable_media import InvalidResponse - from google.cloud.storage.blob import Blob from google.cloud.storage.constants import _DEFAULT_TIMEOUT project = "PROJECT" @@ -1652,7 +1659,7 @@ def test_download_blob_to_file_with_failure(self): grmp_response = InvalidResponse(raw_response) credentials = _make_credentials(project=project) client = self._make_one(credentials=credentials) - blob = mock.create_autospec(Blob) + blob = self._make_blob(name="blob_name", bucket=None) blob._encryption_key = None blob._get_download_url = mock.Mock() blob._do_download = mock.Mock() @@ -1689,7 +1696,7 @@ def test_download_blob_to_file_with_uri(self): project = "PROJECT" credentials = _make_credentials(project=project) client = self._make_one(project=project, credentials=credentials) - blob = mock.Mock() + blob = self._make_blob(name="blob_name", bucket=None) file_obj = io.BytesIO() blob._encryption_key = None blob._get_download_url = mock.Mock() @@ -1787,13 +1794,12 @@ def test_download_blob_to_file_w_conditional_retry_fail(self): def _download_blob_to_file_helper( self, use_chunks, raw_download, expect_condition_fail=False, **extra_kwargs ): - from google.cloud.storage.blob import Blob from google.cloud.storage.constants import _DEFAULT_TIMEOUT project = "PROJECT" credentials = _make_credentials(project=project) client = self._make_one(credentials=credentials) - blob = mock.create_autospec(Blob) + blob = self._make_blob(name="blob_name", bucket=None) blob._encryption_key = None blob._get_download_url = mock.Mock() if use_chunks: @@ -1863,14 +1869,13 @@ def test_download_blob_to_file_w_chunks_w_raw(self): self._download_blob_to_file_helper(use_chunks=True, raw_download=True) def test_download_blob_have_different_uuid(self): - from google.cloud.storage.blob import Blob - project = "PROJECT" credentials = _make_credentials(project=project) client = self._make_one(credentials=credentials) - blob = mock.create_autospec(Blob) + blob = self._make_blob(name="blob_name", bucket=None) blob._encryption_key = None blob._do_download = mock.Mock() + blob._get_download_url = mock.Mock() file_obj = io.BytesIO() client.download_blob_to_file(blob, file_obj) client.download_blob_to_file(blob, file_obj) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index f1d760043..eb2a5711e 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -37,6 +37,14 @@ HOSTNAME = "https://example.com" URL = "https://example.com/bucket/blob" USER_AGENT = "agent" +EXPECTED_UPLOAD_KWARGS = { + "command": "tm.upload_many", + **UPLOAD_KWARGS, +} +EXPECTED_DOWNLOAD_KWARGS = { + "command": "tm.download_many", + **DOWNLOAD_KWARGS, +} # Used in subprocesses only, so excluded from coverage @@ -44,9 +52,9 @@ def _validate_blob_token_in_subprocess( maybe_pickled_blob, method_name, path_or_file, **kwargs ): # pragma: NO COVER assert pickle.loads(maybe_pickled_blob) == BLOB_TOKEN_STRING - assert method_name.endswith("filename") + assert "filename" in method_name assert path_or_file.startswith("file") - assert kwargs == UPLOAD_KWARGS or kwargs == DOWNLOAD_KWARGS + assert kwargs == EXPECTED_UPLOAD_KWARGS or kwargs == EXPECTED_DOWNLOAD_KWARGS return FAKE_RESULT @@ -55,10 +63,11 @@ def test_upload_many_with_filenames(): ("file_a.txt", mock.Mock(spec=Blob)), ("file_b.txt", mock.Mock(spec=Blob)), ] - EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + expected_upload_kwargs = EXPECTED_UPLOAD_KWARGS.copy() + expected_upload_kwargs["if_generation_match"] = 0 for _, blob_mock in FILE_BLOB_PAIRS: - blob_mock.upload_from_filename.return_value = FAKE_RESULT + blob_mock._handle_filename_and_upload.return_value = FAKE_RESULT results = transfer_manager.upload_many( FILE_BLOB_PAIRS, @@ -67,8 +76,8 @@ def test_upload_many_with_filenames(): worker_type=transfer_manager.THREAD, ) for (filename, mock_blob) in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.assert_any_call( - filename, **EXPECTED_UPLOAD_KWARGS + mock_blob._handle_filename_and_upload.assert_any_call( + filename, **expected_upload_kwargs ) for result in results: assert result == FAKE_RESULT @@ -79,10 +88,11 @@ def test_upload_many_with_file_objs(): (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), (tempfile.TemporaryFile(), mock.Mock(spec=Blob)), ] - EXPECTED_UPLOAD_KWARGS = {"if_generation_match": 0, **UPLOAD_KWARGS} + expected_upload_kwargs = EXPECTED_UPLOAD_KWARGS.copy() + expected_upload_kwargs["if_generation_match"] = 0 for _, blob_mock in FILE_BLOB_PAIRS: - blob_mock.upload_from_file.return_value = FAKE_RESULT + blob_mock._prep_and_do_upload.return_value = FAKE_RESULT results = transfer_manager.upload_many( FILE_BLOB_PAIRS, @@ -91,7 +101,7 @@ def test_upload_many_with_file_objs(): worker_type=transfer_manager.THREAD, ) for (file, mock_blob) in FILE_BLOB_PAIRS: - mock_blob.upload_from_file.assert_any_call(file, **EXPECTED_UPLOAD_KWARGS) + mock_blob._prep_and_do_upload.assert_any_call(file, **expected_upload_kwargs) for result in results: assert result == FAKE_RESULT @@ -157,7 +167,7 @@ def test_upload_many_suppresses_exceptions(): ("file_b.txt", mock.Mock(spec=Blob)), ] for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = ConnectionError() + mock_blob._handle_filename_and_upload.side_effect = ConnectionError() results = transfer_manager.upload_many( FILE_BLOB_PAIRS, worker_type=transfer_manager.THREAD @@ -172,7 +182,7 @@ def test_upload_many_raises_exceptions(): ("file_b.txt", mock.Mock(spec=Blob)), ] for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = ConnectionError() + mock_blob._handle_filename_and_upload.side_effect = ConnectionError() with pytest.raises(ConnectionError): transfer_manager.upload_many( @@ -186,8 +196,8 @@ def test_upload_many_suppresses_412_with_skip_if_exists(): ("file_b.txt", mock.Mock(spec=Blob)), ] for _, mock_blob in FILE_BLOB_PAIRS: - mock_blob.upload_from_filename.side_effect = exceptions.PreconditionFailed( - "412" + mock_blob._handle_filename_and_upload.side_effect = ( + exceptions.PreconditionFailed("412") ) results = transfer_manager.upload_many( FILE_BLOB_PAIRS, @@ -246,7 +256,7 @@ def test_download_many_with_filenames(): ] for blob_mock, _ in BLOB_FILE_PAIRS: - blob_mock.download_to_filename.return_value = FAKE_RESULT + blob_mock._handle_filename_and_download.return_value = FAKE_RESULT results = transfer_manager.download_many( BLOB_FILE_PAIRS, @@ -254,7 +264,9 @@ def test_download_many_with_filenames(): worker_type=transfer_manager.THREAD, ) for (mock_blob, file) in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.assert_any_call(file, **DOWNLOAD_KWARGS) + mock_blob._handle_filename_and_download.assert_any_call( + file, **EXPECTED_DOWNLOAD_KWARGS + ) for result in results: assert result == FAKE_RESULT @@ -266,7 +278,7 @@ def test_download_many_with_file_objs(): ] for blob_mock, _ in BLOB_FILE_PAIRS: - blob_mock.download_to_file.return_value = FAKE_RESULT + blob_mock._prep_and_do_download.return_value = FAKE_RESULT results = transfer_manager.download_many( BLOB_FILE_PAIRS, @@ -274,7 +286,7 @@ def test_download_many_with_file_objs(): worker_type=transfer_manager.THREAD, ) for (mock_blob, file) in BLOB_FILE_PAIRS: - mock_blob.download_to_file.assert_any_call(file, **DOWNLOAD_KWARGS) + mock_blob._prep_and_do_download.assert_any_call(file, **DOWNLOAD_KWARGS) for result in results: assert result == FAKE_RESULT @@ -305,7 +317,7 @@ def test_download_many_suppresses_exceptions(): (mock.Mock(spec=Blob), "file_b.txt"), ] for mock_blob, _ in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.side_effect = ConnectionError() + mock_blob._handle_filename_and_download.side_effect = ConnectionError() results = transfer_manager.download_many( BLOB_FILE_PAIRS, worker_type=transfer_manager.THREAD @@ -320,7 +332,7 @@ def test_download_many_raises_exceptions(): (mock.Mock(spec=Blob), "file_b.txt"), ] for mock_blob, _ in BLOB_FILE_PAIRS: - mock_blob.download_to_filename.side_effect = ConnectionError() + mock_blob._handle_filename_and_download.side_effect = ConnectionError() with pytest.raises(ConnectionError): transfer_manager.download_many( @@ -531,7 +543,10 @@ def test_download_chunks_concurrently(): MULTIPLE = 4 blob_mock.size = CHUNK_SIZE * MULTIPLE - blob_mock.download_to_filename.return_value = FAKE_RESULT + expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() + expected_download_kwargs["command"] = "tm.download_sharded" + + blob_mock._handle_filename_and_download.return_value = FAKE_RESULT with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager.download_chunks_concurrently( @@ -542,13 +557,13 @@ def test_download_chunks_concurrently(): worker_type=transfer_manager.THREAD, ) for x in range(MULTIPLE): - blob_mock.download_to_file.assert_any_call( + blob_mock._prep_and_do_download.assert_any_call( mock.ANY, - **DOWNLOAD_KWARGS, + **expected_download_kwargs, start=x * CHUNK_SIZE, - end=((x + 1) * CHUNK_SIZE) - 1 + end=((x + 1) * CHUNK_SIZE) - 1, ) - assert blob_mock.download_to_file.call_count == 4 + assert blob_mock._prep_and_do_download.call_count == 4 assert result is None @@ -754,7 +769,7 @@ def test_upload_chunks_concurrently_with_metadata_and_encryption(): "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "User-Agent": "agent", - "X-Goog-API-Client": "agent gccl-invocation-id/{}".format(invocation_id), + "X-Goog-API-Client": f"agent gccl-invocation-id/{invocation_id} gccl-gcs-cmd/tm.upload_sharded", "content-type": FAKE_CONTENT_TYPE, "x-upload-content-type": FAKE_CONTENT_TYPE, "X-Goog-Encryption-Algorithm": "AES256", @@ -801,7 +816,7 @@ def reload(self): self.size = self._size_after_reload self.generation = self._generation_after_reload - def download_to_file(self, *args, **kwargs): + def _prep_and_do_download(self, *args, **kwargs): return "SUCCESS" @@ -924,14 +939,14 @@ def test__reduce_client(): def test__call_method_on_maybe_pickled_blob(): blob = mock.Mock(spec=Blob) - blob.download_to_file.return_value = "SUCCESS" + blob._prep_and_do_download.return_value = "SUCCESS" result = transfer_manager._call_method_on_maybe_pickled_blob( - blob, "download_to_file" + blob, "_prep_and_do_download" ) assert result == "SUCCESS" pickled_blob = pickle.dumps(_PickleableMockBlob()) result = transfer_manager._call_method_on_maybe_pickled_blob( - pickled_blob, "download_to_file" + pickled_blob, "_prep_and_do_download" ) assert result == "SUCCESS" From 1271686428c0faffd3dd1b4fd57bfe467d2817d4 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 19 Sep 2023 10:51:40 -0700 Subject: [PATCH 202/509] feat: support configurable retries in upload_chunks_concurrently (#1120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: support configurable retries in upload_chunks_concurrently * lint * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- google/cloud/storage/transfer_manager.py | 22 +++++++++++++++++++++ tests/unit/test_transfer_manager.py | 25 +++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index b213d9e79..3060528c9 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -28,6 +28,8 @@ from google.cloud.storage import Blob from google.cloud.storage.blob import _get_host_name from google.cloud.storage.constants import _DEFAULT_TIMEOUT +from google.cloud.storage._helpers import _api_core_retry_to_resumable_media_retry +from google.cloud.storage.retry import DEFAULT_RETRY from google.resumable_media.requests.upload import XMLMPUContainer from google.resumable_media.requests.upload import XMLMPUPart @@ -871,6 +873,7 @@ def upload_chunks_concurrently( *, checksum="md5", timeout=_DEFAULT_TIMEOUT, + retry=DEFAULT_RETRY, ): """Upload a single file in chunks, concurrently. @@ -966,6 +969,20 @@ def upload_chunks_concurrently( (Optional) The amount of time, in seconds, to wait for the server response. See: :ref:`configuring_timeouts` + :type retry: google.api_core.retry.Retry + :param retry: (Optional) How to retry the RPC. A None value will disable + retries. A google.api_core.retry.Retry value will enable retries, + and the object will configure backoff and timeout options. Custom + predicates (customizable error codes) are not supported for media + operations such as this one. + + This function does not accept ConditionalRetryPolicy values because + preconditions are not supported by the underlying API call. + + See the retry.py source code and docstrings in this package + (google.cloud.storage.retry) for information on retry types and how + to configure them. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. """ @@ -995,6 +1012,8 @@ def upload_chunks_concurrently( headers["x-goog-encryption-kms-key-name"] = blob.kms_key_name container = XMLMPUContainer(url, filename, headers=headers) + container._retry_strategy = _api_core_retry_to_resumable_media_retry(retry) + container.initiate(transport=transport, content_type=content_type) upload_id = container.upload_id @@ -1025,6 +1044,7 @@ def upload_chunks_concurrently( part_number=part_number, checksum=checksum, headers=headers, + retry=retry, ) ) @@ -1054,6 +1074,7 @@ def _upload_part( part_number, checksum, headers, + retry, ): """Helper function that runs inside a thread or subprocess to upload a part. @@ -1075,6 +1096,7 @@ def _upload_part( checksum=checksum, headers=headers, ) + part._retry_strategy = _api_core_retry_to_resumable_media_retry(retry) part.upload(client._http) return (part_number, part.etag) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index eb2a5711e..1f6d5b0dc 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -658,6 +658,11 @@ def test_upload_chunks_concurrently(): container_mock.register_part.assert_any_call(1, ETAG) container_mock.register_part.assert_any_call(2, ETAG) container_mock.finalize.assert_called_once_with(bucket.client._http) + + assert container_mock._retry_strategy.max_sleep == 60.0 + assert container_mock._retry_strategy.max_cumulative_retry == 120.0 + assert container_mock._retry_strategy.max_retries is None + part_mock.upload.assert_called_with(transport) @@ -693,12 +698,15 @@ def test_upload_chunks_concurrently_passes_concurrency_options(): worker_type=transfer_manager.THREAD, max_workers=MAX_WORKERS, deadline=DEADLINE, + retry=None, ) except ValueError: pass # The futures don't actually work, so we expect this to abort. # Conveniently, that gives us a chance to test the auto-delete # exception handling feature. container_mock.cancel.assert_called_once_with(transport) + assert container_mock._retry_strategy.max_retries == 0 + pool_patch.assert_called_with(max_workers=MAX_WORKERS) wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) @@ -905,6 +913,8 @@ def test__download_and_write_chunk_in_place(): def test__upload_part(): + from google.cloud.storage.retry import DEFAULT_RETRY + pickled_mock = pickle.dumps(_PickleableMockClient()) FILENAME = "file_a.txt" UPLOAD_ID = "abcd" @@ -916,9 +926,22 @@ def test__upload_part(): "google.cloud.storage.transfer_manager.XMLMPUPart", return_value=part ): result = transfer_manager._upload_part( - pickled_mock, URL, UPLOAD_ID, FILENAME, 0, 256, 1, None, {"key", "value"} + pickled_mock, + URL, + UPLOAD_ID, + FILENAME, + 0, + 256, + 1, + None, + {"key", "value"}, + retry=DEFAULT_RETRY, ) part.upload.assert_called_once() + assert part._retry_strategy.max_sleep == 60.0 + assert part._retry_strategy.max_cumulative_retry == 120.0 + assert part._retry_strategy.max_retries is None + assert result == (1, ETAG) From 9f256fc8e5829bb559b6eb26cd6b92b05e7f33db Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 11:29:29 -0700 Subject: [PATCH 203/509] chore(main): release 2.11.0 (#1070) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 19 +++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b04a3a05e..15c4c1f38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.11.0](https://github.com/googleapis/python-storage/compare/v2.10.0...v2.11.0) (2023-09-19) + + +### Features + +* Add gccl-gcs-cmd field to X-Goog-API-Client header for Transfer Manager calls ([#1119](https://github.com/googleapis/python-storage/issues/1119)) ([14a1909](https://github.com/googleapis/python-storage/commit/14a1909963cfa41208f4e25b82b7c84c5e02452f)) +* Add transfer_manager.upload_chunks_concurrently using the XML MPU API ([#1115](https://github.com/googleapis/python-storage/issues/1115)) ([56aeb87](https://github.com/googleapis/python-storage/commit/56aeb8778d25fe245ac2e1e96ef71f0dad1fec0f)) +* Support configurable retries in upload_chunks_concurrently ([#1120](https://github.com/googleapis/python-storage/issues/1120)) ([1271686](https://github.com/googleapis/python-storage/commit/1271686428c0faffd3dd1b4fd57bfe467d2817d4)) + + +### Bug Fixes + +* Split retention period tests due to caching change ([#1068](https://github.com/googleapis/python-storage/issues/1068)) ([cc191b0](https://github.com/googleapis/python-storage/commit/cc191b070c520e85030cd4cef6d7d9a7b1dd0bf4)) + + +### Documentation + +* Add Transfer Manager documentation in c.g.c ([#1109](https://github.com/googleapis/python-storage/issues/1109)) ([c1f8724](https://github.com/googleapis/python-storage/commit/c1f8724dc1c5dc180f36424324def74a5daec620)) + ## [2.10.0](https://github.com/googleapis/python-storage/compare/v2.9.0...v2.10.0) (2023-06-14) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 13e710fcc..e6e357434 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.10.0" +__version__ = "2.11.0" From afa7ff7dc369b6343ace86ddb553911e85c4916b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:47:15 -0700 Subject: [PATCH 204/509] chore(deps): bump cryptography from 41.0.3 to 41.0.4 in /.kokoro (#1123) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): bump cryptography from 41.0.3 to 41.0.4 in /.kokoro Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.3 to 41.0.4. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/41.0.3...41.0.4) --- updated-dependencies: - dependency-name: cryptography dependency-type: indirect ... Signed-off-by: dependabot[bot] * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Owl Bot From 69bd4a935a995f8f261a589ee2978f58b90224ab Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 27 Sep 2023 09:15:35 -0700 Subject: [PATCH 205/509] fix: mark _deprecate_threads_param as a wrapper to unblock introspection and docs (#1122) --- google/cloud/storage/transfer_manager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 3060528c9..da6973c71 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -22,6 +22,7 @@ import warnings import pickle import copyreg +import functools from google.api_core import exceptions from google.cloud.storage import Client @@ -61,6 +62,7 @@ def _deprecate_threads_param(func): + @functools.wraps(func) def convert_threads_or_raise(*args, **kwargs): binding = inspect.signature(func).bind(*args, **kwargs) threads = binding.arguments.get("threads") From a3a1159c924ce15aa8cdaf5f42fc44891f4506ef Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 21:35:35 -0400 Subject: [PATCH 206/509] chore: [autoapprove] bump cryptography from 41.0.3 to 41.0.4 (#1136) Source-Link: https://github.com/googleapis/synthtool/commit/dede53ff326079b457cfb1aae5bbdc82cbb51dc3 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:fac304457974bb530cc5396abd4ab25d26a469cd3bc97cbfb18c8d4324c584eb Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 ++-- .gitignore | 1 + .kokoro/requirements.txt | 49 ++++++++++++++++++++------------------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index a3da1b0d4..a9bdb1b7a 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:3e3800bb100af5d7f9e810d48212b37812c1856d20ffeafb99ebe66461b61fc7 -# created: 2023-08-02T10:53:29.114535628Z + digest: sha256:fac304457974bb530cc5396abd4ab25d26a469cd3bc97cbfb18c8d4324c584eb +# created: 2023-10-02T21:31:03.517640371Z diff --git a/.gitignore b/.gitignore index b4243ced7..d083ea1dd 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ docs.metadata # Virtual environment env/ +venv/ # Test logs coverage.xml diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 029bd342d..96d593c8c 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -113,30 +113,30 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==41.0.3 \ - --hash=sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306 \ - --hash=sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84 \ - --hash=sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47 \ - --hash=sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d \ - --hash=sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116 \ - --hash=sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207 \ - --hash=sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81 \ - --hash=sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087 \ - --hash=sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd \ - --hash=sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507 \ - --hash=sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858 \ - --hash=sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae \ - --hash=sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34 \ - --hash=sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906 \ - --hash=sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd \ - --hash=sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922 \ - --hash=sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7 \ - --hash=sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4 \ - --hash=sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574 \ - --hash=sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1 \ - --hash=sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c \ - --hash=sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e \ - --hash=sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de +cryptography==41.0.4 \ + --hash=sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67 \ + --hash=sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311 \ + --hash=sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8 \ + --hash=sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13 \ + --hash=sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143 \ + --hash=sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f \ + --hash=sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829 \ + --hash=sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd \ + --hash=sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397 \ + --hash=sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac \ + --hash=sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d \ + --hash=sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a \ + --hash=sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839 \ + --hash=sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e \ + --hash=sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6 \ + --hash=sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9 \ + --hash=sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860 \ + --hash=sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca \ + --hash=sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91 \ + --hash=sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d \ + --hash=sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714 \ + --hash=sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb \ + --hash=sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f # via # gcp-releasetool # secretstorage @@ -382,6 +382,7 @@ protobuf==3.20.3 \ # gcp-docuploader # gcp-releasetool # google-api-core + # googleapis-common-protos pyasn1==0.4.8 \ --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba From 3a0f551436b659afb2208fd558ddb846f4d62d98 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 9 Oct 2023 15:18:48 -0700 Subject: [PATCH 207/509] docs: Add snippets for upload_chunks_concurrently and add chunk_size (#1135) * docs: Add snippets for upload_chunks_concurrently and add chunk_size * switch from 'processes' to 'workers' in sample nomenclature * copyright * tests --- samples/snippets/snippets_test.py | 61 ++++++++++++++----- ...torage_transfer_manager_download_bucket.py | 9 +-- ...er_manager_download_chunks_concurrently.py | 20 ++++-- .../storage_transfer_manager_download_many.py | 9 +-- ...sfer_manager_upload_chunks_concurrently.py | 57 +++++++++++++++++ ...orage_transfer_manager_upload_directory.py | 9 +-- .../storage_transfer_manager_upload_many.py | 9 +-- 7 files changed, 140 insertions(+), 34 deletions(-) create mode 100644 samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 2da7bb94c..8014411e8 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -75,6 +75,7 @@ import storage_transfer_manager_download_bucket import storage_transfer_manager_download_chunks_concurrently import storage_transfer_manager_download_many +import storage_transfer_manager_upload_chunks_concurrently import storage_transfer_manager_upload_directory import storage_transfer_manager_upload_many import storage_upload_file @@ -243,7 +244,10 @@ def test_upload_blob_with_kms(test_bucket): with tempfile.NamedTemporaryFile() as source_file: source_file.write(b"test") storage_upload_with_kms_key.upload_blob_with_kms( - test_bucket.name, source_file.name, blob_name, KMS_KEY, + test_bucket.name, + source_file.name, + blob_name, + KMS_KEY, ) bucket = storage.Client().bucket(test_bucket.name) kms_blob = bucket.get_blob(blob_name) @@ -396,7 +400,10 @@ def test_move_blob(test_bucket_create, test_blob): print(f"test_move_blob not found in bucket {test_bucket_create.name}") storage_move_file.move_blob( - bucket.name, test_blob.name, test_bucket_create.name, "test_move_blob", + bucket.name, + test_blob.name, + test_bucket_create.name, + "test_move_blob", ) assert test_bucket_create.get_blob("test_move_blob") is not None @@ -412,7 +419,10 @@ def test_copy_blob(test_blob): pass storage_copy_file.copy_blob( - bucket.name, test_blob.name, bucket.name, "test_copy_blob", + bucket.name, + test_blob.name, + bucket.name, + "test_copy_blob", ) assert bucket.get_blob("test_copy_blob") is not None @@ -551,7 +561,10 @@ def test_define_bucket_website_configuration(test_bucket): def test_object_get_kms_key(test_bucket): with tempfile.NamedTemporaryFile() as source_file: storage_upload_with_kms_key.upload_blob_with_kms( - test_bucket.name, source_file.name, "test_upload_blob_encrypted", KMS_KEY, + test_bucket.name, + source_file.name, + "test_upload_blob_encrypted", + KMS_KEY, ) kms_key = storage_object_get_kms_key.object_get_kms_key( test_bucket.name, "test_upload_blob_encrypted" @@ -568,7 +581,10 @@ def test_storage_compose_file(test_bucket): with tempfile.NamedTemporaryFile() as dest_file: destination = storage_compose_file.compose_file( - test_bucket.name, source_files[0], source_files[1], dest_file.name, + test_bucket.name, + source_files[0], + source_files[1], + dest_file.name, ) composed = destination.download_as_string() @@ -608,7 +624,8 @@ def test_change_default_storage_class(test_bucket, capsys): def test_change_file_storage_class(test_blob, capsys): blob = storage_change_file_storage_class.change_file_storage_class( - test_blob.bucket.name, test_blob.name, + test_blob.bucket.name, + test_blob.name, ) out, _ = capsys.readouterr() assert f"Blob {blob.name} in bucket {blob.bucket.name}" in out @@ -694,7 +711,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): test_bucket.name, BLOB_NAMES, source_directory="{}/".format(uploads), - processes=8, + workers=8, ) out, _ = capsys.readouterr() @@ -706,7 +723,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): storage_transfer_manager_download_bucket.download_bucket_with_transfer_manager( test_bucket.name, destination_directory=os.path.join(downloads, ""), - processes=8, + workers=8, max_results=10000, ) out, _ = capsys.readouterr() @@ -720,7 +737,7 @@ def test_transfer_manager_snippets(test_bucket, capsys): test_bucket.name, blob_names=BLOB_NAMES, destination_directory=os.path.join(downloads, ""), - processes=8, + workers=8, ) out, _ = capsys.readouterr() @@ -763,9 +780,7 @@ def test_transfer_manager_download_chunks_concurrently(test_bucket, capsys): with tempfile.NamedTemporaryFile() as file: file.write(b"test") - storage_upload_file.upload_blob( - test_bucket.name, file.name, BLOB_NAME - ) + storage_upload_file.upload_blob(test_bucket.name, file.name, BLOB_NAME) with tempfile.TemporaryDirectory() as downloads: # Download the file. @@ -773,8 +788,26 @@ def test_transfer_manager_download_chunks_concurrently(test_bucket, capsys): test_bucket.name, BLOB_NAME, os.path.join(downloads, BLOB_NAME), - processes=8, + workers=8, ) out, _ = capsys.readouterr() - assert "Downloaded {} to {}".format(BLOB_NAME, os.path.join(downloads, BLOB_NAME)) in out + assert ( + "Downloaded {} to {}".format(BLOB_NAME, os.path.join(downloads, BLOB_NAME)) + in out + ) + + +def test_transfer_manager_upload_chunks_concurrently(test_bucket, capsys): + BLOB_NAME = "test_file.txt" + + with tempfile.NamedTemporaryFile() as file: + file.write(b"test") + file.flush() + + storage_transfer_manager_upload_chunks_concurrently.upload_chunks_concurrently( + test_bucket.name, file.name, BLOB_NAME + ) + + out, _ = capsys.readouterr() + assert "File {} uploaded to {}".format(file.name, BLOB_NAME) in out diff --git a/samples/snippets/storage_transfer_manager_download_bucket.py b/samples/snippets/storage_transfer_manager_download_bucket.py index 4f21ee6e9..5d94a67ae 100644 --- a/samples/snippets/storage_transfer_manager_download_bucket.py +++ b/samples/snippets/storage_transfer_manager_download_bucket.py @@ -14,7 +14,7 @@ # [START storage_transfer_manager_download_bucket] def download_bucket_with_transfer_manager( - bucket_name, destination_directory="", processes=8, max_results=1000 + bucket_name, destination_directory="", workers=8, max_results=1000 ): """Download all of the blobs in a bucket, concurrently in a process pool. @@ -40,8 +40,9 @@ def download_bucket_with_transfer_manager( # The maximum number of processes to use for the operation. The performance # impact of this value depends on the use case, but smaller files usually # benefit from a higher number of processes. Each additional process occupies - # some CPU and memory resources until finished. - # processes=8 + # some CPU and memory resources until finished. Threads can be used instead + # of processes by passing `worker_type=transfer_manager.THREAD`. + # workers=8 # The maximum number of results to fetch from bucket.list_blobs(). This # sample code fetches all of the blobs up to max_results and queues them all @@ -60,7 +61,7 @@ def download_bucket_with_transfer_manager( blob_names = [blob.name for blob in bucket.list_blobs(max_results=max_results)] results = transfer_manager.download_many_to_path( - bucket, blob_names, destination_directory=destination_directory, max_workers=processes + bucket, blob_names, destination_directory=destination_directory, max_workers=workers ) for name, result in zip(blob_names, results): diff --git a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py index 9ddec094e..b6ac9982d 100644 --- a/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py +++ b/samples/snippets/storage_transfer_manager_download_chunks_concurrently.py @@ -13,7 +13,9 @@ # limitations under the License. # [START storage_transfer_manager_download_chunks_concurrently] -def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): +def download_chunks_concurrently( + bucket_name, blob_name, filename, chunk_size=32 * 1024 * 1024, workers=8 +): """Download a single file in chunks, concurrently in a process pool.""" # The ID of your GCS bucket @@ -25,11 +27,17 @@ def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): # The destination filename or path # filename = "" + # The size of each chunk. The performance impact of this value depends on + # the use case. The remote service has a minimum of 5 MiB and a maximum of + # 5 GiB. + # chunk_size = 32 * 1024 * 1024 (32 MiB) + # The maximum number of processes to use for the operation. The performance # impact of this value depends on the use case, but smaller files usually # benefit from a higher number of processes. Each additional process occupies - # some CPU and memory resources until finished. - # processes=8 + # some CPU and memory resources until finished. Threads can be used instead + # of processes by passing `worker_type=transfer_manager.THREAD`. + # workers=8 from google.cloud.storage import Client, transfer_manager @@ -37,7 +45,11 @@ def download_chunks_concurrently(bucket_name, blob_name, filename, processes=8): bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) - transfer_manager.download_chunks_concurrently(blob, filename, max_workers=processes) + transfer_manager.download_chunks_concurrently( + blob, filename, chunk_size=chunk_size, max_workers=workers + ) print("Downloaded {} to {}.".format(blob_name, filename)) + + # [END storage_transfer_manager_download_chunks_concurrently] diff --git a/samples/snippets/storage_transfer_manager_download_many.py b/samples/snippets/storage_transfer_manager_download_many.py index 500eea1ce..02cb9b887 100644 --- a/samples/snippets/storage_transfer_manager_download_many.py +++ b/samples/snippets/storage_transfer_manager_download_many.py @@ -14,7 +14,7 @@ # [START storage_transfer_manager_download_many] def download_many_blobs_with_transfer_manager( - bucket_name, blob_names, destination_directory="", processes=8 + bucket_name, blob_names, destination_directory="", workers=8 ): """Download blobs in a list by name, concurrently in a process pool. @@ -46,8 +46,9 @@ def download_many_blobs_with_transfer_manager( # The maximum number of processes to use for the operation. The performance # impact of this value depends on the use case, but smaller files usually # benefit from a higher number of processes. Each additional process occupies - # some CPU and memory resources until finished. - # processes=8 + # some CPU and memory resources until finished. Threads can be used instead + # of processes by passing `worker_type=transfer_manager.THREAD`. + # workers=8 from google.cloud.storage import Client, transfer_manager @@ -55,7 +56,7 @@ def download_many_blobs_with_transfer_manager( bucket = storage_client.bucket(bucket_name) results = transfer_manager.download_many_to_path( - bucket, blob_names, destination_directory=destination_directory, max_workers=processes + bucket, blob_names, destination_directory=destination_directory, max_workers=workers ) for name, result in zip(blob_names, results): diff --git a/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py new file mode 100644 index 000000000..009f09648 --- /dev/null +++ b/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py @@ -0,0 +1,57 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_transfer_manager_upload_chunks_concurrently] +def upload_chunks_concurrently( + bucket_name, + source_filename, + destination_blob_name, + chunk_size=32 * 1024 * 1024, + workers=8, +): + """Upload a single file, in chunks, concurrently in a process pool.""" + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The path to your file to upload + # source_filename = "local/path/to/file" + + # The ID of your GCS object + # destination_blob_name = "storage-object-name" + + # The size of each chunk. The performance impact of this value depends on + # the use case. The remote service has a minimum of 5 MiB and a maximum of + # 5 GiB. + # chunk_size = 32 * 1024 * 1024 (32 MiB) + + # The maximum number of processes to use for the operation. The performance + # impact of this value depends on the use case. Each additional process + # occupies some CPU and memory resources until finished. Threads can be used + # instead of processes by passing `worker_type=transfer_manager.THREAD`. + # workers=8 + + from google.cloud.storage import Client, transfer_manager + + storage_client = Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(destination_blob_name) + + transfer_manager.upload_chunks_concurrently( + source_filename, blob, chunk_size=chunk_size, max_workers=workers + ) + + print(f"File {source_filename} uploaded to {destination_blob_name}.") + + +# [END storage_transfer_manager_upload_chunks_concurrently] diff --git a/samples/snippets/storage_transfer_manager_upload_directory.py b/samples/snippets/storage_transfer_manager_upload_directory.py index c0dbb9c9c..329ca1081 100644 --- a/samples/snippets/storage_transfer_manager_upload_directory.py +++ b/samples/snippets/storage_transfer_manager_upload_directory.py @@ -13,7 +13,7 @@ # limitations under the License. # [START storage_transfer_manager_upload_directory] -def upload_directory_with_transfer_manager(bucket_name, source_directory, processes=8): +def upload_directory_with_transfer_manager(bucket_name, source_directory, workers=8): """Upload every file in a directory, including all files in subdirectories. Each blob name is derived from the filename, not including the `directory` @@ -33,8 +33,9 @@ def upload_directory_with_transfer_manager(bucket_name, source_directory, proces # The maximum number of processes to use for the operation. The performance # impact of this value depends on the use case, but smaller files usually # benefit from a higher number of processes. Each additional process occupies - # some CPU and memory resources until finished. - # processes=8 + # some CPU and memory resources until finished. Threads can be used instead + # of processes by passing `worker_type=transfer_manager.THREAD`. + # workers=8 from pathlib import Path @@ -65,7 +66,7 @@ def upload_directory_with_transfer_manager(bucket_name, source_directory, proces # Start the upload. results = transfer_manager.upload_many_from_filenames( - bucket, string_paths, source_directory=source_directory, max_workers=processes + bucket, string_paths, source_directory=source_directory, max_workers=workers ) for name, result in zip(string_paths, results): diff --git a/samples/snippets/storage_transfer_manager_upload_many.py b/samples/snippets/storage_transfer_manager_upload_many.py index 2ed647650..1b9b9fc89 100644 --- a/samples/snippets/storage_transfer_manager_upload_many.py +++ b/samples/snippets/storage_transfer_manager_upload_many.py @@ -14,7 +14,7 @@ # [START storage_transfer_manager_upload_many] def upload_many_blobs_with_transfer_manager( - bucket_name, filenames, source_directory="", processes=8 + bucket_name, filenames, source_directory="", workers=8 ): """Upload every file in a list to a bucket, concurrently in a process pool. @@ -43,8 +43,9 @@ def upload_many_blobs_with_transfer_manager( # The maximum number of processes to use for the operation. The performance # impact of this value depends on the use case, but smaller files usually # benefit from a higher number of processes. Each additional process occupies - # some CPU and memory resources until finished. - # processes=8 + # some CPU and memory resources until finished. Threads can be used instead + # of processes by passing `worker_type=transfer_manager.THREAD`. + # workers=8 from google.cloud.storage import Client, transfer_manager @@ -52,7 +53,7 @@ def upload_many_blobs_with_transfer_manager( bucket = storage_client.bucket(bucket_name) results = transfer_manager.upload_many_from_filenames( - bucket, filenames, source_directory=source_directory, max_workers=processes + bucket, filenames, source_directory=source_directory, max_workers=workers ) for name, result in zip(filenames, results): From aefcdd4623bacf26987843364b16ec865cf16175 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:34:32 -0400 Subject: [PATCH 208/509] chore(deps): bump urllib3 from 1.26.12 to 1.26.17 in /.kokoro (#1140) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: [autoapprove] Update `black` and `isort` to latest versions Source-Link: https://github.com/googleapis/synthtool/commit/0c7b0333f44b2b7075447f43a121a12d15a7b76a Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:08e34975760f002746b1d8c86fdc90660be45945ee6d9db914d1508acdf9a547 * update black in noxfile.py * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 6 +++--- .pre-commit-config.yaml | 2 +- google/cloud/storage/_signing.py | 2 -- google/cloud/storage/blob.py | 1 - google/cloud/storage/bucket.py | 2 -- google/cloud/storage/transfer_manager.py | 1 - noxfile.py | 2 +- tests/system/test_blob.py | 3 --- tests/system/test_client.py | 1 - tests/unit/test__helpers.py | 1 - tests/unit/test_acl.py | 2 -- tests/unit/test_batch.py | 1 - tests/unit/test_blob.py | 2 -- tests/unit/test_client.py | 1 - tests/unit/test_notification.py | 1 - tests/unit/test_transfer_manager.py | 8 ++++---- 17 files changed, 11 insertions(+), 29 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index a9bdb1b7a..dd98abbde 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:fac304457974bb530cc5396abd4ab25d26a469cd3bc97cbfb18c8d4324c584eb -# created: 2023-10-02T21:31:03.517640371Z + digest: sha256:08e34975760f002746b1d8c86fdc90660be45945ee6d9db914d1508acdf9a547 +# created: 2023-10-09T14:06:13.397766266Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 96d593c8c..0332d3267 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -467,9 +467,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via -r requirements.in -urllib3==1.26.12 \ - --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ - --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 +urllib3==1.26.17 \ + --hash=sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21 \ + --hash=sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b # via # requests # twine diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 19409cbd3..6a8e16950 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,7 +22,7 @@ repos: - id: end-of-file-fixer - id: check-yaml - repo: https://github.com/psf/black - rev: 22.3.0 + rev: 23.7.0 hooks: - id: black - repo: https://github.com/pycqa/flake8 diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index fb50a2acc..1ec61142d 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -147,7 +147,6 @@ def get_expiration_seconds_v4(expiration): seconds = expiration if isinstance(expiration, datetime.datetime): - if expiration.tzinfo is None: expiration = expiration.replace(tzinfo=_helpers.UTC) @@ -646,7 +645,6 @@ def get_v4_now_dtstamps(): def _sign_message(message, access_token, service_account_email): - """Signs a message. :type message: str diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index ece758dbc..a95e08911 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -984,7 +984,6 @@ def _do_download( response = download.consume(transport, timeout=timeout) self._extract_headers_from_download(response) else: - if checksum: msg = _CHUNKED_DOWNLOAD_CHECKSUM_MESSAGE.format(checksum) _logger.info(msg) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index c3a1a0523..f6d5e5aa2 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -474,7 +474,6 @@ def __init__( bucket_policy_only_locked_time=_default, ): if bucket_policy_only_enabled is not _default: - if uniform_bucket_level_access_enabled is not _default: raise ValueError(_UBLA_BPO_ENABLED_MESSAGE) @@ -482,7 +481,6 @@ def __init__( uniform_bucket_level_access_enabled = bucket_policy_only_enabled if bucket_policy_only_locked_time is not _default: - if uniform_bucket_level_access_locked_time is not _default: raise ValueError(_UBLA_BPO_LOCK_TIME_MESSAGE) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index da6973c71..5cd2bc0d8 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -1029,7 +1029,6 @@ def upload_chunks_concurrently( futures = [] with pool_class(max_workers=max_workers) as executor: - for part_number in range(1, num_of_parts + 1): start = (part_number - 1) * chunk_size end = min(part_number * chunk_size, size) diff --git a/noxfile.py b/noxfile.py index 1a72c9144..895f5ee32 100644 --- a/noxfile.py +++ b/noxfile.py @@ -24,7 +24,7 @@ import nox -BLACK_VERSION = "black==22.3.0" +BLACK_VERSION = "black==23.7.0" BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] DEFAULT_PYTHON_VERSION = "3.8" diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 2d6a76b80..4c2078f6a 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -86,7 +86,6 @@ def test_large_file_write_from_stream_w_failed_checksum( # The # remote API is still exercised. info = file_data["big"] with open(info["path"], "rb") as file_obj: - with mock.patch( "google.resumable_media._helpers.prepare_checksum_digest", return_value="FFFFFF==", @@ -527,7 +526,6 @@ def test_blob_direct_write_and_read_into_file( same_blob.reload() # Initialize properties. with tempfile.NamedTemporaryFile() as temp_f: - with open(temp_f.name, "wb") as file_obj: same_blob.download_to_file(file_obj) @@ -553,7 +551,6 @@ def test_blob_download_w_generation_match( same_blob.reload() # Initialize properties. with tempfile.NamedTemporaryFile() as temp_f: - with open(temp_f.name, "wb") as file_obj: with pytest.raises(exceptions.PreconditionFailed): same_blob.download_to_file( diff --git a/tests/system/test_client.py b/tests/system/test_client.py index bb09e6075..70f341851 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -130,7 +130,6 @@ def test_download_blob_to_file_w_uri( blobs_to_delete.append(blob) with tempfile.NamedTemporaryFile() as temp_f: - with open(temp_f.name, "wb") as file_obj: storage_client.download_blob_to_file( "gs://" + shared_bucket.name + "/MyBuffer", file_obj diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index 174b96152..324705e79 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -94,7 +94,6 @@ def _make_one(self, *args, **kw): def _derivedClass(self, path=None, user_project=None): class Derived(self._get_target_class()): - client = None _actual_encryption_headers = None diff --git a/tests/unit/test_acl.py b/tests/unit/test_acl.py index 3c5e6515a..8d2fa39f5 100644 --- a/tests/unit/test_acl.py +++ b/tests/unit/test_acl.py @@ -1072,7 +1072,6 @@ def test_user_project(self): class _Blob(object): - user_project = None def __init__(self, bucket, blob): @@ -1085,7 +1084,6 @@ def path(self): class _Bucket(object): - user_project = None def __init__(self, name): diff --git a/tests/unit/test_batch.py b/tests/unit/test_batch.py index 37f8b8190..c1f6bad9a 100644 --- a/tests/unit/test_batch.py +++ b/tests/unit/test_batch.py @@ -761,7 +761,6 @@ def test___setitem__(self): class _Connection(object): - project = "TESTING" def __init__(self, **kw): diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index a8d024176..1e84704b1 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -3017,7 +3017,6 @@ def _do_resumable_helper( with patch.object( _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): - response = blob._do_resumable_upload( client, stream, @@ -5952,7 +5951,6 @@ def test_w_existing_qs(self): class _Connection(object): - API_BASE_URL = "http://example.com" USER_AGENT = "testing 1.2.3" user_agent = "testing 1.2.3" diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 277610696..0c1c5efee 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -2818,7 +2818,6 @@ def test_conformance_post_policy(test_data): return_value=in_data["expiration"], ): with mock.patch("google.cloud.storage.client._NOW", return_value=timestamp): - policy = client.generate_signed_post_policy_v4( bucket_name=in_data["bucket"], blob_name=in_data["object"], diff --git a/tests/unit/test_notification.py b/tests/unit/test_notification.py index e5f07d5c7..d59444915 100644 --- a/tests/unit/test_notification.py +++ b/tests/unit/test_notification.py @@ -20,7 +20,6 @@ class TestBucketNotification(unittest.TestCase): - BUCKET_NAME = "test-bucket" BUCKET_PROJECT = "bucket-project-123" TOPIC_NAME = "test-topic" diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 1f6d5b0dc..9c371d2ca 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -75,7 +75,7 @@ def test_upload_many_with_filenames(): upload_kwargs=UPLOAD_KWARGS, worker_type=transfer_manager.THREAD, ) - for (filename, mock_blob) in FILE_BLOB_PAIRS: + for filename, mock_blob in FILE_BLOB_PAIRS: mock_blob._handle_filename_and_upload.assert_any_call( filename, **expected_upload_kwargs ) @@ -100,7 +100,7 @@ def test_upload_many_with_file_objs(): upload_kwargs=UPLOAD_KWARGS, worker_type=transfer_manager.THREAD, ) - for (file, mock_blob) in FILE_BLOB_PAIRS: + for file, mock_blob in FILE_BLOB_PAIRS: mock_blob._prep_and_do_upload.assert_any_call(file, **expected_upload_kwargs) for result in results: assert result == FAKE_RESULT @@ -263,7 +263,7 @@ def test_download_many_with_filenames(): download_kwargs=DOWNLOAD_KWARGS, worker_type=transfer_manager.THREAD, ) - for (mock_blob, file) in BLOB_FILE_PAIRS: + for mock_blob, file in BLOB_FILE_PAIRS: mock_blob._handle_filename_and_download.assert_any_call( file, **EXPECTED_DOWNLOAD_KWARGS ) @@ -285,7 +285,7 @@ def test_download_many_with_file_objs(): download_kwargs=DOWNLOAD_KWARGS, worker_type=transfer_manager.THREAD, ) - for (mock_blob, file) in BLOB_FILE_PAIRS: + for mock_blob, file in BLOB_FILE_PAIRS: mock_blob._prep_and_do_download.assert_any_call(file, **DOWNLOAD_KWARGS) for result in results: assert result == FAKE_RESULT From 28c02dd41010e6d818a77f51c539457b2dbfa233 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 11 Oct 2023 11:00:43 -0700 Subject: [PATCH 209/509] fix: bump python-auth version to fix issue and remove workaround (#1158) --- google/cloud/storage/client.py | 1 - google/cloud/storage/transfer_manager.py | 7 +++++-- setup.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index e6391f5fb..10f2e5904 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -127,7 +127,6 @@ def __init__( # are passed along, for use in __reduce__ defined elsewhere. self._initial_client_info = client_info self._initial_client_options = client_options - self._initial_credentials = credentials kw_args = {"client_info": client_info} diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 5cd2bc0d8..38f327895 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -1154,11 +1154,14 @@ def _call_method_on_maybe_pickled_blob( def _reduce_client(cl): - """Replicate a Client by constructing a new one with the same params.""" + """Replicate a Client by constructing a new one with the same params. + + LazyClient performs transparent caching for when the same client is needed + on the same process multiple times.""" client_object_id = id(cl) project = cl.project - credentials = cl._initial_credentials + credentials = cl._credentials _http = None # Can't carry this over client_info = cl._initial_client_info client_options = cl._initial_client_options diff --git a/setup.py b/setup.py index a57f972ff..11ee0a190 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ # 'Development Status :: 5 - Production/Stable' release_status = "Development Status :: 5 - Production/Stable" dependencies = [ - "google-auth >= 1.25.0, < 3.0dev", + "google-auth >= 2.23.3, < 3.0dev", "google-api-core >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", "google-cloud-core >= 2.3.0, < 3.0dev", "google-resumable-media >= 2.6.0", From a455195fb12c37950d7d3a0d4a5b2e4d7a43df90 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 11 Oct 2023 12:54:16 -0700 Subject: [PATCH 210/509] test: dedup kms_bucket fixture (#1129) After adding back KMS permissions to the kokoro project, KMS integration tests now pass. However, upon investigation, I noticed that we have a duplicate set of kms pytest fixtures. This removes the duplicates and changes fixture scope to per-function. Fixes #1128 --- tests/system/conftest.py | 60 +++++++++++++++++-- tests/system/test_kms_integration.py | 88 ---------------------------- 2 files changed, 56 insertions(+), 92 deletions(-) diff --git a/tests/system/conftest.py b/tests/system/conftest.py index fe90ceb80..329be584f 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -17,6 +17,8 @@ import pytest +from google.api_core import exceptions +from google.cloud import kms from google.cloud.storage._helpers import _base64_md5hash from . import _helpers @@ -235,12 +237,12 @@ def file_data(): return _file_data -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def kms_bucket_name(): return _helpers.unique_name("gcp-systest-kms") -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def kms_bucket(storage_client, kms_bucket_name, no_mtls): bucket = _helpers.retry_429_503(storage_client.create_bucket)(kms_bucket_name) @@ -249,11 +251,61 @@ def kms_bucket(storage_client, kms_bucket_name, no_mtls): _helpers.delete_bucket(bucket) -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def kms_key_name(storage_client, kms_bucket): return _kms_key_name(storage_client, kms_bucket, default_key_name) -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def alt_kms_key_name(storage_client, kms_bucket): return _kms_key_name(storage_client, kms_bucket, alt_key_name) + + +@pytest.fixture(scope="session") +def kms_client(): + return kms.KeyManagementServiceClient() + + +@pytest.fixture(scope="function") +def keyring(storage_client, kms_bucket, kms_client): + project = storage_client.project + location = kms_bucket.location.lower() + purpose = kms.enums.CryptoKey.CryptoKeyPurpose.ENCRYPT_DECRYPT + + # If the keyring doesn't exist create it. + keyring_path = kms_client.key_ring_path(project, location, keyring_name) + + try: + kms_client.get_key_ring(keyring_path) + except exceptions.NotFound: + parent = kms_client.location_path(project, location) + kms_client.create_key_ring(parent, keyring_name, {}) + + # Mark this service account as an owner of the new keyring + service_account_email = storage_client.get_service_account_email() + policy = { + "bindings": [ + { + "role": "roles/cloudkms.cryptoKeyEncrypterDecrypter", + "members": ["serviceAccount:" + service_account_email], + } + ] + } + kms_client.set_iam_policy(keyring_path, policy) + + # Populate the keyring with the keys we use in the tests + key_names = [ + "gcs-test", + "gcs-test-alternate", + "explicit-kms-key-name", + "default-kms-key-name", + "override-default-kms-key-name", + "alt-default-kms-key-name", + ] + for key_name in key_names: + key_path = kms_client.crypto_key_path(project, location, keyring_name, key_name) + try: + kms_client.get_crypto_key(key_path) + except exceptions.NotFound: + key = {"purpose": purpose} + kms_client.create_crypto_key(keyring_path, key_name, key) diff --git a/tests/system/test_kms_integration.py b/tests/system/test_kms_integration.py index f047baced..619ffe110 100644 --- a/tests/system/test_kms_integration.py +++ b/tests/system/test_kms_integration.py @@ -14,99 +14,11 @@ import os -import pytest - -from google.api_core import exceptions -from google.cloud import kms from . import _helpers keyring_name = "gcs-test" default_key_name = "gcs-test" alt_key_name = "gcs-test-alternate" -_key_name_format = "projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}" - - -def _kms_key_name(client, bucket, key_name): - return _key_name_format.format( - client.project, - bucket.location.lower(), - keyring_name, - key_name, - ) - - -@pytest.fixture(scope="session") -def kms_bucket_name(): - return _helpers.unique_name("gcp-systest-kms") - - -@pytest.fixture(scope="session") -def kms_bucket(storage_client, kms_bucket_name, no_mtls): - bucket = _helpers.retry_429_503(storage_client.create_bucket)(kms_bucket_name) - - yield bucket - - _helpers.delete_bucket(bucket) - - -@pytest.fixture(scope="session") -def kms_client(): - return kms.KeyManagementServiceClient() - - -@pytest.fixture(scope="function") -def keyring(storage_client, kms_bucket, kms_client): - project = storage_client.project - location = kms_bucket.location.lower() - purpose = kms.enums.CryptoKey.CryptoKeyPurpose.ENCRYPT_DECRYPT - - # If the keyring doesn't exist create it. - keyring_path = kms_client.key_ring_path(project, location, keyring_name) - - try: - kms_client.get_key_ring(keyring_path) - except exceptions.NotFound: - parent = kms_client.location_path(project, location) - kms_client.create_key_ring(parent, keyring_name, {}) - - # Mark this service account as an owner of the new keyring - service_account_email = storage_client.get_service_account_email() - policy = { - "bindings": [ - { - "role": "roles/cloudkms.cryptoKeyEncrypterDecrypter", - "members": ["serviceAccount:" + service_account_email], - } - ] - } - kms_client.set_iam_policy(keyring_path, policy) - - # Populate the keyring with the keys we use in the tests - key_names = [ - "gcs-test", - "gcs-test-alternate", - "explicit-kms-key-name", - "default-kms-key-name", - "override-default-kms-key-name", - "alt-default-kms-key-name", - ] - for key_name in key_names: - key_path = kms_client.crypto_key_path(project, location, keyring_name, key_name) - try: - kms_client.get_crypto_key(key_path) - except exceptions.NotFound: - key = {"purpose": purpose} - kms_client.create_crypto_key(keyring_path, key_name, key) - - -@pytest.fixture(scope="session") -def kms_key_name(storage_client, kms_bucket): - return _kms_key_name(storage_client, kms_bucket, default_key_name) - - -@pytest.fixture(scope="session") -def alt_kms_key_name(storage_client, kms_bucket): - return _kms_key_name(storage_client, kms_bucket, alt_key_name) def test_blob_w_explicit_kms_key_name( From fc92ad19ff0f9704456452e8c7c47a5f90c29eab Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 11 Oct 2023 13:46:14 -0700 Subject: [PATCH 211/509] feat: add crc32c_checksum argument to download_chunks_concurrently (#1138) --- google/cloud/storage/transfer_manager.py | 158 ++++++++++++++++++++--- samples/snippets/snippets_test.py | 3 + setup.py | 1 + tests/system/test_transfer_manager.py | 13 +- tests/unit/test_transfer_manager.py | 109 +++++++++++++++- 5 files changed, 262 insertions(+), 22 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 38f327895..fec5965cf 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -22,6 +22,8 @@ import warnings import pickle import copyreg +import struct +import base64 import functools from google.api_core import exceptions @@ -32,9 +34,11 @@ from google.cloud.storage._helpers import _api_core_retry_to_resumable_media_retry from google.cloud.storage.retry import DEFAULT_RETRY +import google_crc32c + from google.resumable_media.requests.upload import XMLMPUContainer from google.resumable_media.requests.upload import XMLMPUPart - +from google.resumable_media.common import DataCorruption warnings.warn( "The module `transfer_manager` is a preview feature. Functionality and API " @@ -44,6 +48,7 @@ TM_DEFAULT_CHUNK_SIZE = 32 * 1024 * 1024 DEFAULT_MAX_WORKERS = 8 +MAX_CRC32C_ZERO_ARRAY_SIZE = 4 * 1024 * 1024 METADATA_HEADER_TRANSLATION = { "cacheControl": "Cache-Control", "contentDisposition": "Content-Disposition", @@ -57,6 +62,20 @@ PROCESS = "process" THREAD = "thread" +DOWNLOAD_CRC32C_MISMATCH_TEMPLATE = """\ +Checksum mismatch while downloading: + + {} + +The object metadata indicated a crc32c checksum of: + + {} + +but the actual crc32c checksum of the downloaded contents was: + + {} +""" + _cached_clients = {} @@ -732,6 +751,8 @@ def download_chunks_concurrently( deadline=None, worker_type=PROCESS, max_workers=DEFAULT_MAX_WORKERS, + *, + crc32c_checksum=True, ): """Download a single file in chunks, concurrently. @@ -744,9 +765,6 @@ def download_chunks_concurrently( performance under normal circumstances due to Python interpreter threading behavior. The default is therefore to use processes instead of threads. - Checksumming (md5 or crc32c) is not supported for chunked operations. Any - `checksum` parameter passed in to download_kwargs will be ignored. - :param bucket: The bucket which contains the blobs to be downloaded @@ -768,10 +786,13 @@ def download_chunks_concurrently( :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly passed into the download methods and is not validated by this function. + blob.download_to_filename() for more information. The dict is directly + passed into the download methods and is not validated by this function. Keyword arguments "start" and "end" which are not supported and will - cause a ValueError if present. + cause a ValueError if present. The key "checksum" is also not supported + in download_kwargs, but see the argument "crc32c_checksum" (which does + not go in download_kwargs) below. :type deadline: int :param deadline: @@ -811,8 +832,22 @@ def download_chunks_concurrently( and the default is a conservative number that should work okay in most cases without consuming excessive resources. - :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. + :type crc32c_checksum: bool + :param crc32c_checksum: + Whether to compute a checksum for the resulting object, using the crc32c + algorithm. As the checksums for each chunk must be combined using a + feature of crc32c that is not available for md5, md5 is not supported. + + :raises: + :exc:`concurrent.futures.TimeoutError` + if deadline is exceeded. + :exc:`google.resumable_media.common.DataCorruption` if the download's + checksum doesn't agree with server-computed checksum. The + `google.resumable_media` exception is used here for consistency + with other download methods despite the exception originating + elsewhere. """ + client = blob.client if download_kwargs is None: download_kwargs = {} @@ -820,6 +855,10 @@ def download_chunks_concurrently( raise ValueError( "Download arguments 'start' and 'end' are not supported by download_chunks_concurrently." ) + if "checksum" in download_kwargs: + raise ValueError( + "'checksum' is in download_kwargs, but is not supported because sliced downloads have a different checksum mechanism from regular downloads. Use the 'crc32c_checksum' argument on download_chunks_concurrently instead." + ) download_kwargs["command"] = "tm.download_sharded" @@ -851,6 +890,7 @@ def download_chunks_concurrently( start=start, end=cursor - 1, download_kwargs=download_kwargs, + crc32c_checksum=crc32c_checksum, ) ) @@ -858,9 +898,34 @@ def download_chunks_concurrently( futures, timeout=deadline, return_when=concurrent.futures.ALL_COMPLETED ) - # Raise any exceptions. Successful results can be ignored. + # Raise any exceptions; combine checksums. + results = [] for future in futures: - future.result() + results.append(future.result()) + + if crc32c_checksum and results: + crc_digest = _digest_ordered_checksum_and_size_pairs(results) + actual_checksum = base64.b64encode(crc_digest).decode("utf-8") + expected_checksum = blob.crc32c + if actual_checksum != expected_checksum: + # For consistency with other download methods we will use + # "google.resumable_media.common.DataCorruption" despite the error + # not originating inside google.resumable_media. + download_url = blob._get_download_url( + client, + if_generation_match=download_kwargs.get("if_generation_match"), + if_generation_not_match=download_kwargs.get("if_generation_not_match"), + if_metageneration_match=download_kwargs.get("if_metageneration_match"), + if_metageneration_not_match=download_kwargs.get( + "if_metageneration_not_match" + ), + ) + raise DataCorruption( + None, + DOWNLOAD_CRC32C_MISMATCH_TEMPLATE.format( + download_url, expected_checksum, actual_checksum + ), + ) return None @@ -1118,23 +1183,58 @@ def _headers_from_metadata(metadata): def _download_and_write_chunk_in_place( - maybe_pickled_blob, filename, start, end, download_kwargs + maybe_pickled_blob, filename, start, end, download_kwargs, crc32c_checksum ): """Helper function that runs inside a thread or subprocess. `maybe_pickled_blob` is either a Blob (for threads) or a specially pickled Blob (for processes) because the default pickling mangles Client objects - which are attached to Blobs.""" + which are attached to Blobs. + + Returns a crc if configured (or None) and the size written. + """ if isinstance(maybe_pickled_blob, Blob): blob = maybe_pickled_blob else: blob = pickle.loads(maybe_pickled_blob) - with open( - filename, "rb+" - ) as f: # Open in mixed read/write mode to avoid truncating or appending - f.seek(start) - return blob._prep_and_do_download(f, start=start, end=end, **download_kwargs) + + with _ChecksummingSparseFileWrapper(filename, start, crc32c_checksum) as f: + blob._prep_and_do_download(f, start=start, end=end, **download_kwargs) + return (f.crc, (end - start) + 1) + + +class _ChecksummingSparseFileWrapper: + """A file wrapper that writes to a sparse file and optionally checksums. + + This wrapper only implements write() and does not inherit from `io` module + base classes. + """ + + def __init__(self, filename, start_position, crc32c_enabled): + # Open in mixed read/write mode to avoid truncating or appending + self.f = open(filename, "rb+") + self.f.seek(start_position) + self._crc = None + self._crc32c_enabled = crc32c_enabled + + def write(self, chunk): + if self._crc32c_enabled: + if self._crc is None: + self._crc = google_crc32c.value(chunk) + else: + self._crc = google_crc32c.extend(self._crc, chunk) + self.f.write(chunk) + + @property + def crc(self): + return self._crc + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.f.close() def _call_method_on_maybe_pickled_blob( @@ -1208,6 +1308,32 @@ def _get_pool_class_and_requirements(worker_type): ) +def _digest_ordered_checksum_and_size_pairs(checksum_and_size_pairs): + base_crc = None + zeroes = bytes(MAX_CRC32C_ZERO_ARRAY_SIZE) + for part_crc, size in checksum_and_size_pairs: + if not base_crc: + base_crc = part_crc + else: + base_crc ^= 0xFFFFFFFF # precondition + + # Zero pad base_crc32c. To conserve memory, do so with only + # MAX_CRC32C_ZERO_ARRAY_SIZE at a time. Reuse the zeroes array where + # possible. + padded = 0 + while padded < size: + desired_zeroes_size = min((size - padded), MAX_CRC32C_ZERO_ARRAY_SIZE) + base_crc = google_crc32c.extend(base_crc, zeroes[:desired_zeroes_size]) + padded += desired_zeroes_size + + base_crc ^= 0xFFFFFFFF # postcondition + base_crc ^= part_crc + crc_digest = struct.pack( + ">L", base_crc + ) # https://cloud.google.com/storage/docs/json_api/v1/objects#crc32c + return crc_digest + + class _LazyClient: """An object that will transform into either a cached or a new Client""" diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 8014411e8..7a5f8c960 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -213,6 +213,7 @@ def test_list_blobs_with_prefix(test_blob, capsys): def test_upload_blob(test_bucket): with tempfile.NamedTemporaryFile() as source_file: source_file.write(b"test") + source_file.flush() storage_upload_file.upload_blob( test_bucket.name, source_file.name, "test_upload_blob" @@ -243,6 +244,7 @@ def test_upload_blob_with_kms(test_bucket): blob_name = f"test_upload_with_kms_{uuid.uuid4().hex}" with tempfile.NamedTemporaryFile() as source_file: source_file.write(b"test") + source_file.flush() storage_upload_with_kms_key.upload_blob_with_kms( test_bucket.name, source_file.name, @@ -779,6 +781,7 @@ def test_transfer_manager_download_chunks_concurrently(test_bucket, capsys): with tempfile.NamedTemporaryFile() as file: file.write(b"test") + file.flush() storage_upload_file.upload_blob(test_bucket.name, file.name, BLOB_NAME) diff --git a/setup.py b/setup.py index 11ee0a190..88d2f581b 100644 --- a/setup.py +++ b/setup.py @@ -33,6 +33,7 @@ "google-cloud-core >= 2.3.0, < 3.0dev", "google-resumable-media >= 2.6.0", "requests >= 2.18.0, < 3.0.0dev", + "google-crc32c >= 1.0, < 2.0dev", ] extras = {"protobuf": ["protobuf<5.0.0dev"]} diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index fc7bc2d51..b8f209b63 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -172,8 +172,19 @@ def test_download_chunks_concurrently(shared_bucket, file_data): with open(trailing_chunk_filename, "rb") as file_obj: assert _base64_md5hash(file_obj) == source_file["hash"] + # And for a case where there is only one chunk. + trailing_chunk_filename = os.path.join(tempdir, "chunky_file_3") + transfer_manager.download_chunks_concurrently( + download_blob, + trailing_chunk_filename, + chunk_size=size, + deadline=DEADLINE, + ) + with open(trailing_chunk_filename, "rb") as file_obj: + assert _base64_md5hash(file_obj) == source_file["hash"] + # Also test threaded mode. - threaded_filename = os.path.join(tempdir, "chunky_file_3") + threaded_filename = os.path.join(tempdir, "chunky_file_4") transfer_manager.download_chunks_concurrently( download_blob, threaded_filename, diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 9c371d2ca..503b8fd2e 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -22,6 +22,8 @@ from google.api_core import exceptions +from google.resumable_media.common import DataCorruption + import os import tempfile import mock @@ -546,8 +548,6 @@ def test_download_chunks_concurrently(): expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() expected_download_kwargs["command"] = "tm.download_sharded" - blob_mock._handle_filename_and_download.return_value = FAKE_RESULT - with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager.download_chunks_concurrently( blob_mock, @@ -555,6 +555,7 @@ def test_download_chunks_concurrently(): chunk_size=CHUNK_SIZE, download_kwargs=DOWNLOAD_KWARGS, worker_type=transfer_manager.THREAD, + crc32c_checksum=False, ) for x in range(MULTIPLE): blob_mock._prep_and_do_download.assert_any_call( @@ -567,7 +568,64 @@ def test_download_chunks_concurrently(): assert result is None -def test_download_chunks_concurrently_raises_on_start_and_end(): +def test_download_chunks_concurrently_with_crc32c(): + blob_mock = mock.Mock(spec=Blob) + FILENAME = "file_a.txt" + MULTIPLE = 4 + BLOB_CHUNK = b"abcdefgh" + BLOB_CONTENTS = BLOB_CHUNK * MULTIPLE + blob_mock.size = len(BLOB_CONTENTS) + blob_mock.crc32c = "eOVVVw==" + + expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() + expected_download_kwargs["command"] = "tm.download_sharded" + + def write_to_file(f, *args, **kwargs): + f.write(BLOB_CHUNK) + + blob_mock._prep_and_do_download.side_effect = write_to_file + + with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): + transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + crc32c_checksum=True, + ) + + +def test_download_chunks_concurrently_with_crc32c_failure(): + blob_mock = mock.Mock(spec=Blob) + FILENAME = "file_a.txt" + MULTIPLE = 4 + BLOB_CHUNK = b"abcdefgh" + BLOB_CONTENTS = BLOB_CHUNK * MULTIPLE + blob_mock.size = len(BLOB_CONTENTS) + blob_mock.crc32c = "invalid" + + expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() + expected_download_kwargs["command"] = "tm.download_sharded" + + def write_to_file(f, *args, **kwargs): + f.write(BLOB_CHUNK) + + blob_mock._prep_and_do_download.side_effect = write_to_file + + with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): + with pytest.raises(DataCorruption): + transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + crc32c_checksum=True, + ) + + +def test_download_chunks_concurrently_raises_on_invalid_kwargs(): blob_mock = mock.Mock(spec=Blob) FILENAME = "file_a.txt" MULTIPLE = 4 @@ -594,6 +652,16 @@ def test_download_chunks_concurrently_raises_on_start_and_end(): "end": (CHUNK_SIZE * (MULTIPLE - 1)) - 1, }, ) + with pytest.raises(ValueError): + transfer_manager.download_chunks_concurrently( + blob_mock, + FILENAME, + chunk_size=CHUNK_SIZE, + worker_type=transfer_manager.THREAD, + download_kwargs={ + "checksum": "crc32c", + }, + ) def test_download_chunks_concurrently_passes_concurrency_options(): @@ -616,6 +684,7 @@ def test_download_chunks_concurrently_passes_concurrency_options(): deadline=DEADLINE, worker_type=transfer_manager.THREAD, max_workers=MAX_WORKERS, + crc32c_checksum=False, ) pool_patch.assert_called_with(max_workers=MAX_WORKERS) wait_patch.assert_called_with(mock.ANY, timeout=DEADLINE, return_when=mock.ANY) @@ -819,6 +888,7 @@ def __init__( self.generation = generation self._size_after_reload = size_after_reload self._generation_after_reload = generation_after_reload + self.client = _PickleableMockClient() def reload(self): self.size = self._size_after_reload @@ -876,6 +946,7 @@ def test_download_chunks_concurrently_with_processes(): chunk_size=CHUNK_SIZE, download_kwargs=DOWNLOAD_KWARGS, worker_type=transfer_manager.PROCESS, + crc32c_checksum=False, ) assert result is None @@ -907,9 +978,9 @@ def test__download_and_write_chunk_in_place(): FILENAME = "file_a.txt" with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager._download_and_write_chunk_in_place( - pickled_mock, FILENAME, 0, 8, {} + pickled_mock, FILENAME, 0, 8, {}, False ) - assert result == "SUCCESS" + assert result is not None def test__upload_part(): @@ -973,3 +1044,31 @@ def test__call_method_on_maybe_pickled_blob(): pickled_blob, "_prep_and_do_download" ) assert result == "SUCCESS" + + +def test__ChecksummingSparseFileWrapper(): + FILENAME = "file_a.txt" + import google_crc32c + + with mock.patch( + "google.cloud.storage.transfer_manager.open", mock.mock_open() + ) as open_mock: + # test no checksumming + wrapper = transfer_manager._ChecksummingSparseFileWrapper(FILENAME, 0, False) + wrapper.write(b"abcdefgh") + handle = open_mock() + handle.write.assert_called_with(b"abcdefgh") + wrapper.write(b"ijklmnop") + assert wrapper.crc is None + handle.write.assert_called_with(b"ijklmnop") + + with mock.patch( + "google.cloud.storage.transfer_manager.open", mock.mock_open() + ) as open_mock: + wrapper = transfer_manager._ChecksummingSparseFileWrapper(FILENAME, 0, True) + wrapper.write(b"abcdefgh") + handle = open_mock() + handle.write.assert_called_with(b"abcdefgh") + wrapper.write(b"ijklmnop") + assert wrapper.crc == google_crc32c.value(b"abcdefghijklmnop") + handle.write.assert_called_with(b"ijklmnop") From c5a983d5a0b0632811af86fb64664b4382b05512 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 11 Oct 2023 15:38:14 -0700 Subject: [PATCH 212/509] feat: add skip_if_exists to download_many (#1161) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add skip_if_exists to download_many * docstring * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- google/cloud/storage/transfer_manager.py | 19 ++++++++++++++++ tests/unit/test_transfer_manager.py | 29 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index fec5965cf..25abfacae 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -273,6 +273,8 @@ def download_many( raise_exception=False, worker_type=PROCESS, max_workers=DEFAULT_MAX_WORKERS, + *, + skip_if_exists=False, ): """Download many blobs concurrently via a worker pool. @@ -348,6 +350,11 @@ def download_many( and the default is a conservative number that should work okay in most cases without consuming excessive resources. + :type skip_if_exists: bool + :param skip_if_exists: + Before downloading each blob, check if the file for the filename exists; + if it does, skip that blob. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -374,6 +381,10 @@ def download_many( "Passing in a file object is only supported by the THREAD worker type. Please either select THREAD workers, or pass in filenames only." ) + if skip_if_exists and isinstance(path_or_file, str): + if os.path.isfile(path_or_file): + continue + futures.append( executor.submit( _call_method_on_maybe_pickled_blob, @@ -589,6 +600,8 @@ def download_many_to_path( raise_exception=False, worker_type=PROCESS, max_workers=DEFAULT_MAX_WORKERS, + *, + skip_if_exists=False, ): """Download many files concurrently by their blob names. @@ -715,6 +728,11 @@ def download_many_to_path( and the default is a conservative number that should work okay in most cases without consuming excessive resources. + :type skip_if_exists: bool + :param skip_if_exists: + Before downloading each blob, check if the file for the filename exists; + if it does, skip that blob. This only works for filenames. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -740,6 +758,7 @@ def download_many_to_path( raise_exception=raise_exception, worker_type=worker_type, max_workers=max_workers, + skip_if_exists=skip_if_exists, ) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 503b8fd2e..732f09a75 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -273,6 +273,32 @@ def test_download_many_with_filenames(): assert result == FAKE_RESULT +def test_download_many_with_skip_if_exists(): + with tempfile.NamedTemporaryFile() as tf: + BLOB_FILE_PAIRS = [ + (mock.Mock(spec=Blob), "file_a.txt"), + (mock.Mock(spec=Blob), tf.name), + ] + + for blob_mock, _ in BLOB_FILE_PAIRS: + blob_mock._handle_filename_and_download.return_value = FAKE_RESULT + + results = transfer_manager.download_many( + BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + worker_type=transfer_manager.THREAD, + skip_if_exists=True, + ) + mock_blob, file = BLOB_FILE_PAIRS[0] + mock_blob._handle_filename_and_download.assert_any_call( + file, **EXPECTED_DOWNLOAD_KWARGS + ) + mock_blob, _ = BLOB_FILE_PAIRS[1] + mock_blob._handle_filename_and_download.assert_not_called() + for result in results: + assert result == FAKE_RESULT + + def test_download_many_with_file_objs(): BLOB_FILE_PAIRS = [ (mock.Mock(spec=Blob), tempfile.TemporaryFile()), @@ -485,6 +511,7 @@ def test_download_many_to_path(): raise_exception=True, max_workers=MAX_WORKERS, worker_type=WORKER_TYPE, + skip_if_exists=True, ) mock_download_many.assert_called_once_with( @@ -494,6 +521,7 @@ def test_download_many_to_path(): raise_exception=True, max_workers=MAX_WORKERS, worker_type=WORKER_TYPE, + skip_if_exists=True, ) for blobname in BLOBNAMES: bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) @@ -532,6 +560,7 @@ def test_download_many_to_path_creates_directories(): raise_exception=True, worker_type=transfer_manager.PROCESS, max_workers=8, + skip_if_exists=False, ) for blobname in BLOBNAMES: bucket.blob.assert_any_call(blobname) From c7229f2e53151fc2f2eb1268afc67dad87ebbb0a Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 12 Oct 2023 11:46:16 -0700 Subject: [PATCH 213/509] feat: add additional_blob_attributes to upload_many_from_filenames (#1162) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #996 🦕 --- google/cloud/storage/transfer_manager.py | 17 +++++++++++++ tests/system/test_transfer_manager.py | 19 ++++++++++++++ tests/unit/test_transfer_manager.py | 32 ++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 25abfacae..1a9497505 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -427,6 +427,8 @@ def upload_many_from_filenames( raise_exception=False, worker_type=PROCESS, max_workers=DEFAULT_MAX_WORKERS, + *, + additional_blob_attributes=None, ): """Upload many files concurrently by their filenames. @@ -557,6 +559,17 @@ def upload_many_from_filenames( and the default is a conservative number that should work okay in most cases without consuming excessive resources. + :type additional_blob_attributes: dict + :param additional_blob_attributes: + A dictionary of blob attribute names and values. This allows the + configuration of blobs beyond what is possible with + blob_constructor_kwargs. For instance, {"cache_control": "no-cache"} + would set the cache_control attribute of each blob to "no-cache". + + As with blob_constructor_kwargs, this affects the creation of every + blob identically. To fine-tune each blob individually, use `upload_many` + and create the blobs as desired before passing them in. + :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. :rtype: list @@ -567,6 +580,8 @@ def upload_many_from_filenames( """ if blob_constructor_kwargs is None: blob_constructor_kwargs = {} + if additional_blob_attributes is None: + additional_blob_attributes = {} file_blob_pairs = [] @@ -574,6 +589,8 @@ def upload_many_from_filenames( path = os.path.join(source_directory, filename) blob_name = blob_name_prefix + filename blob = bucket.blob(blob_name, **blob_constructor_kwargs) + for prop, value in additional_blob_attributes.items(): + setattr(blob, prop, value) file_blob_pairs.append((path, blob)) return upload_many( diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index b8f209b63..c29bbe718 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -102,6 +102,25 @@ def test_upload_many_skip_if_exists( assert len(blobs_to_delete) == 1 +def test_upload_many_from_filenames_with_attributes( + listable_bucket, listable_filenames, file_data, blobs_to_delete +): + SOURCE_DIRECTORY, FILENAME = os.path.split(file_data["logo"]["path"]) + + transfer_manager.upload_many_from_filenames( + listable_bucket, + [FILENAME], + source_directory=SOURCE_DIRECTORY, + additional_blob_attributes={"cache_control": "no-cache"}, + raise_exception=True, + ) + + blob = listable_bucket.blob(FILENAME) + blob.reload() + blobs_to_delete.append(blob) + assert blob.cache_control == "no-cache" + + def test_download_many(listable_bucket): blobs = list(listable_bucket.list_blobs()) with tempfile.TemporaryDirectory() as tempdir: diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 732f09a75..c8f6e560e 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -482,6 +482,38 @@ def test_upload_many_from_filenames_minimal_args(): bucket.blob.assert_any_call(FILENAMES[1]) +def test_upload_many_from_filenames_additional_properties(): + bucket = mock.Mock() + blob = mock.Mock() + bucket_blob = mock.Mock(return_value=blob) + blob.cache_control = None + bucket.blob = bucket_blob + + FILENAME = "file_a.txt" + ADDITIONAL_BLOB_ATTRIBUTES = {"cache_control": "no-cache"} + EXPECTED_FILE_BLOB_PAIRS = [(FILENAME, mock.ANY)] + + with mock.patch( + "google.cloud.storage.transfer_manager.upload_many" + ) as mock_upload_many: + transfer_manager.upload_many_from_filenames( + bucket, [FILENAME], additional_blob_attributes=ADDITIONAL_BLOB_ATTRIBUTES + ) + + mock_upload_many.assert_called_once_with( + EXPECTED_FILE_BLOB_PAIRS, + skip_if_exists=False, + upload_kwargs=None, + deadline=None, + raise_exception=False, + worker_type=transfer_manager.PROCESS, + max_workers=8, + ) + + for attrib, value in ADDITIONAL_BLOB_ATTRIBUTES.items(): + assert getattr(blob, attrib) == value + + def test_download_many_to_path(): bucket = mock.Mock() From 5c905637947c45e39ed8ee84911a12e254bde571 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 12 Oct 2023 12:10:11 -0700 Subject: [PATCH 214/509] feat: launch transfer manager to GA (#1159) * feat: launch transfer manager to GA * re-add import... --- google/cloud/storage/transfer_manager.py | 18 +----------------- tests/unit/test_transfer_manager.py | 4 +--- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 1a9497505..8001e40b0 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Concurrent media operations. This is a PREVIEW FEATURE: API may change.""" +"""Concurrent media operations.""" import concurrent.futures @@ -40,12 +40,6 @@ from google.resumable_media.requests.upload import XMLMPUPart from google.resumable_media.common import DataCorruption -warnings.warn( - "The module `transfer_manager` is a preview feature. Functionality and API " - "may change. This warning will be removed in a future release." -) - - TM_DEFAULT_CHUNK_SIZE = 32 * 1024 * 1024 DEFAULT_MAX_WORKERS = 8 MAX_CRC32C_ZERO_ARRAY_SIZE = 4 * 1024 * 1024 @@ -120,8 +114,6 @@ def upload_many( ): """Upload many files concurrently via a worker pool. - This function is a PREVIEW FEATURE: the API may change in a future version. - :type file_blob_pairs: List(Tuple(IOBase or str, 'google.cloud.storage.blob.Blob')) :param file_blob_pairs: A list of tuples of a file or filename and a blob. Each file will be @@ -278,8 +270,6 @@ def download_many( ): """Download many blobs concurrently via a worker pool. - This function is a PREVIEW FEATURE: the API may change in a future version. - :type blob_file_pairs: List(Tuple('google.cloud.storage.blob.Blob', IOBase or str)) :param blob_file_pairs: A list of tuples of blob and a file or filename. Each blob will be downloaded to the corresponding blob by using APIs identical to blob.download_to_file() or blob.download_to_filename() as appropriate. @@ -432,8 +422,6 @@ def upload_many_from_filenames( ): """Upload many files concurrently by their filenames. - This function is a PREVIEW FEATURE: the API may change in a future version. - The destination blobs are automatically created, with blob names based on the source filenames and the blob_name_prefix. @@ -622,8 +610,6 @@ def download_many_to_path( ): """Download many files concurrently by their blob names. - This function is a PREVIEW FEATURE: the API may change in a future version. - The destination files are automatically created, with paths based on the source blob_names and the destination_directory. @@ -792,8 +778,6 @@ def download_chunks_concurrently( ): """Download a single file in chunks, concurrently. - This function is a PREVIEW FEATURE: the API may change in a future version. - In some environments, using this feature with mutiple processes will result in faster downloads of large files. diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index c8f6e560e..54284becd 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -14,11 +14,9 @@ import pytest -with pytest.warns(UserWarning): - from google.cloud.storage import transfer_manager - from google.cloud.storage import Blob from google.cloud.storage import Client +from google.cloud.storage import transfer_manager from google.api_core import exceptions From 9e460d8106cbfb76caf35df4f6beed159fa2c22d Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 12 Oct 2023 12:46:36 -0700 Subject: [PATCH 215/509] docs: update formatting and wording in transfer_manager docstrings (#1163) * docs: update formatting and wording in transfer_manager docstrings * remove extraneous bucket param doc mention --- google/cloud/storage/transfer_manager.py | 122 ++++++++++++----------- 1 file changed, 63 insertions(+), 59 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 8001e40b0..41a67b5a4 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -117,7 +117,9 @@ def upload_many( :type file_blob_pairs: List(Tuple(IOBase or str, 'google.cloud.storage.blob.Blob')) :param file_blob_pairs: A list of tuples of a file or filename and a blob. Each file will be - uploaded to the corresponding blob by using APIs identical to blob.upload_from_file() or blob.upload_from_filename() as appropriate. + uploaded to the corresponding blob by using APIs identical to + `blob.upload_from_file()` or `blob.upload_from_filename()` as + appropriate. File handlers are only supported if worker_type is set to THREAD. If worker_type is set to PROCESS, please use filenames only. @@ -125,7 +127,7 @@ def upload_many( :type skip_if_exists: bool :param skip_if_exists: If True, blobs that already have a live version will not be overwritten. - This is accomplished by setting "if_generation_match = 0" on uploads. + This is accomplished by setting `if_generation_match = 0` on uploads. Uploads so skipped will result in a 412 Precondition Failed response code, which will be included in the return value but not raised as an exception regardless of the value of raise_exception. @@ -133,8 +135,9 @@ def upload_many( :type upload_kwargs: dict :param upload_kwargs: A dictionary of keyword arguments to pass to the upload method. Refer - to the documentation for blob.upload_from_file() or - blob.upload_from_filename() for more information. The dict is directly passed into the upload methods and is not validated by this function. + to the documentation for `blob.upload_from_file()` or + `blob.upload_from_filename()` for more information. The dict is directly + passed into the upload methods and is not validated by this function. :type threads: int :param threads: @@ -147,8 +150,8 @@ def upload_many( :param deadline: The number of seconds to wait for all threads to resolve. If the deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. + progress and `concurrent.futures.TimeoutError` will be raised. This can + be left as the default of `None` (no deadline) for most use cases. :type raise_exception: bool :param raise_exception: @@ -163,8 +166,8 @@ def upload_many( :type worker_type: str :param worker_type: - The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS - or google.cloud.storage.transfer_manager.THREAD. + The worker type to use; one of `google.cloud.storage.transfer_manager.PROCESS` + or `google.cloud.storage.transfer_manager.THREAD`. Although the exact performance impact depends on the use case, in most situations the PROCESS worker type will use more system resources (both @@ -201,7 +204,7 @@ def upload_many( :returns: A list of results corresponding to, in order, each item in the input list. If an exception was received, it will be the result for that operation. Otherwise, the return value from the successful - upload method is used (typically, None). + upload method is used (which will be None). """ if upload_kwargs is None: upload_kwargs = {} @@ -282,7 +285,9 @@ def download_many( :type download_kwargs: dict :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or blob.download_to_filename() for more information. The dict is directly passed into the download methods and is not validated by this function. + to the documentation for `blob.download_to_file()` or + `blob.download_to_filename()` for more information. The dict is directly + passed into the download methods and is not validated by this function. :type threads: int :param threads: @@ -295,8 +300,8 @@ def download_many( :param deadline: The number of seconds to wait for all threads to resolve. If the deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. + progress and `concurrent.futures.TimeoutError` will be raised. This can + be left as the default of `None` (no deadline) for most use cases. :type raise_exception: bool :param raise_exception: @@ -308,8 +313,8 @@ def download_many( :type worker_type: str :param worker_type: - The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS - or google.cloud.storage.transfer_manager.THREAD. + The worker type to use; one of `google.cloud.storage.transfer_manager.PROCESS` + or `google.cloud.storage.transfer_manager.THREAD`. Although the exact performance impact depends on the use case, in most situations the PROCESS worker type will use more system resources (both @@ -351,7 +356,7 @@ def download_many( :returns: A list of results corresponding to, in order, each item in the input list. If an exception was received, it will be the result for that operation. Otherwise, the return value from the successful - download method is used (typically, None). + download method is used (which will be None). """ if download_kwargs is None: @@ -430,18 +435,19 @@ def upload_many_from_filenames( then the file at "/home/myuser/images/icon.jpg" will be uploaded to a blob named "myfiles/images/icon.jpg". - :type bucket: 'google.cloud.storage.bucket.Bucket' + :type bucket: :class:`google.cloud.storage.bucket.Bucket` :param bucket: The bucket which will contain the uploaded blobs. :type filenames: list(str) :param filenames: A list of filenames to be uploaded. This may include part of the path. - The full path to the file must be source_directory + filename. + The file will be accessed at the full path of `source_directory` + + `filename`. :type source_directory: str :param source_directory: - A string that will be prepended (with os.path.join()) to each filename + A string that will be prepended (with `os.path.join()`) to each filename in the input list, in order to find the source file for each blob. Unlike the filename itself, the source_directory does not affect the name of the uploaded blob. @@ -472,7 +478,7 @@ def upload_many_from_filenames( :type skip_if_exists: bool :param skip_if_exists: If True, blobs that already have a live version will not be overwritten. - This is accomplished by setting "if_generation_match = 0" on uploads. + This is accomplished by setting `if_generation_match = 0` on uploads. Uploads so skipped will result in a 412 Precondition Failed response code, which will be included in the return value, but not raised as an exception regardless of the value of raise_exception. @@ -480,7 +486,7 @@ def upload_many_from_filenames( :type blob_constructor_kwargs: dict :param blob_constructor_kwargs: A dictionary of keyword arguments to pass to the blob constructor. Refer - to the documentation for blob.Blob() for more information. The dict is + to the documentation for `blob.Blob()` for more information. The dict is directly passed into the constructor and is not validated by this function. `name` and `bucket` keyword arguments are reserved by this function and will result in an error if passed in here. @@ -488,8 +494,9 @@ def upload_many_from_filenames( :type upload_kwargs: dict :param upload_kwargs: A dictionary of keyword arguments to pass to the upload method. Refer - to the documentation for blob.upload_from_file() or - blob.upload_from_filename() for more information. The dict is directly passed into the upload methods and is not validated by this function. + to the documentation for `blob.upload_from_file()` or + `blob.upload_from_filename()` for more information. The dict is directly + passed into the upload methods and is not validated by this function. :type threads: int :param threads: @@ -502,8 +509,8 @@ def upload_many_from_filenames( :param deadline: The number of seconds to wait for all threads to resolve. If the deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. + progress and `concurrent.futures.TimeoutError` will be raised. This can + be left as the default of `None` (no deadline) for most use cases. :type raise_exception: bool :param raise_exception: @@ -518,8 +525,8 @@ def upload_many_from_filenames( :type worker_type: str :param worker_type: - The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS - or google.cloud.storage.transfer_manager.THREAD. + The worker type to use; one of `google.cloud.storage.transfer_manager.PROCESS` + or `google.cloud.storage.transfer_manager.THREAD`. Although the exact performance impact depends on the use case, in most situations the PROCESS worker type will use more system resources (both @@ -564,7 +571,7 @@ def upload_many_from_filenames( :returns: A list of results corresponding to, in order, each item in the input list. If an exception was received, it will be the result for that operation. Otherwise, the return value from the successful - upload method is used (typically, None). + upload method is used (which will be None). """ if blob_constructor_kwargs is None: blob_constructor_kwargs = {} @@ -622,7 +629,7 @@ def download_many_to_path( "images/icon.jpg" will be downloaded to a file named "/home/myuser/icon.jpg". - :type bucket: 'google.cloud.storage.bucket.Bucket' + :type bucket: :class:`google.cloud.storage.bucket.Bucket` :param bucket: The bucket which contains the blobs to be downloaded @@ -666,8 +673,8 @@ def download_many_to_path( :type download_kwargs: dict :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly + to the documentation for `blob.download_to_file()` or + `blob.download_to_filename()` for more information. The dict is directly passed into the download methods and is not validated by this function. :type threads: int @@ -681,8 +688,8 @@ def download_many_to_path( :param deadline: The number of seconds to wait for all threads to resolve. If the deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. + progress and `concurrent.futures.TimeoutError` will be raised. This can + be left as the default of `None` (no deadline) for most use cases. :type create_directories: bool :param create_directories: @@ -702,8 +709,8 @@ def download_many_to_path( :type worker_type: str :param worker_type: - The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS - or google.cloud.storage.transfer_manager.THREAD. + The worker type to use; one of `google.cloud.storage.transfer_manager.PROCESS` + or `google.cloud.storage.transfer_manager.THREAD`. Although the exact performance impact depends on the use case, in most situations the PROCESS worker type will use more system resources (both @@ -742,7 +749,7 @@ def download_many_to_path( :returns: A list of results corresponding to, in order, each item in the input list. If an exception was received, it will be the result for that operation. Otherwise, the return value from the successful - download method is used (typically, None). + download method is used (which will be None). """ blob_file_pairs = [] @@ -785,10 +792,7 @@ def download_chunks_concurrently( performance under normal circumstances due to Python interpreter threading behavior. The default is therefore to use processes instead of threads. - :param bucket: - The bucket which contains the blobs to be downloaded - - :type blob: `google.cloud.storage.Blob` + :type blob: :class:`google.cloud.storage.blob.Blob` :param blob: The blob to be downloaded. @@ -805,26 +809,26 @@ def download_chunks_concurrently( :type download_kwargs: dict :param download_kwargs: A dictionary of keyword arguments to pass to the download method. Refer - to the documentation for blob.download_to_file() or - blob.download_to_filename() for more information. The dict is directly + to the documentation for `blob.download_to_file()` or + `blob.download_to_filename()` for more information. The dict is directly passed into the download methods and is not validated by this function. Keyword arguments "start" and "end" which are not supported and will cause a ValueError if present. The key "checksum" is also not supported - in download_kwargs, but see the argument "crc32c_checksum" (which does - not go in download_kwargs) below. + in `download_kwargs`, but see the argument `crc32c_checksum` (which does + not go in `download_kwargs`) below. :type deadline: int :param deadline: The number of seconds to wait for all threads to resolve. If the deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. + progress and `concurrent.futures.TimeoutError` will be raised. This can + be left as the default of `None` (no deadline) for most use cases. :type worker_type: str :param worker_type: - The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS - or google.cloud.storage.transfer_manager.THREAD. + The worker type to use; one of `google.cloud.storage.transfer_manager.PROCESS` + or `google.cloud.storage.transfer_manager.THREAD`. Although the exact performance impact depends on the use case, in most situations the PROCESS worker type will use more system resources (both @@ -968,7 +972,7 @@ def upload_chunks_concurrently( file in chunks, concurrently with a worker pool. The XML MPU API is significantly different from other uploads; please review - the documentation at https://cloud.google.com/storage/docs/multipart-uploads + the documentation at `https://cloud.google.com/storage/docs/multipart-uploads` before using this feature. The library will attempt to cancel uploads that fail due to an exception. @@ -990,7 +994,7 @@ def upload_chunks_concurrently( :param filename: The path to the file to upload. File-like objects are not supported. - :type blob: `google.cloud.storage.Blob` + :type blob: :class:`google.cloud.storage.blob.Blob` :param blob: The blob to which to upload. @@ -1002,19 +1006,19 @@ def upload_chunks_concurrently( The size in bytes of each chunk to send. The optimal chunk size for maximum throughput may vary depending on the exact network environment and size of the blob. The remote API has restrictions on the minimum - and maximum size allowable, see: https://cloud.google.com/storage/quotas#requests + and maximum size allowable, see: `https://cloud.google.com/storage/quotas#requests` :type deadline: int :param deadline: The number of seconds to wait for all threads to resolve. If the deadline is reached, all threads will be terminated regardless of their - progress and concurrent.futures.TimeoutError will be raised. This can be - left as the default of None (no deadline) for most use cases. + progress and `concurrent.futures.TimeoutError` will be raised. This can + be left as the default of `None` (no deadline) for most use cases. :type worker_type: str :param worker_type: - The worker type to use; one of google.cloud.storage.transfer_manager.PROCESS - or google.cloud.storage.transfer_manager.THREAD. + The worker type to use; one of `google.cloud.storage.transfer_manager.PROCESS` + or `google.cloud.storage.transfer_manager.THREAD`. Although the exact performance impact depends on the use case, in most situations the PROCESS worker type will use more system resources (both @@ -1044,12 +1048,12 @@ def upload_chunks_concurrently( :type checksum: str :param checksum: - (Optional) The checksum scheme to use: either 'md5', 'crc32c' or None. + (Optional) The checksum scheme to use: either "md5", "crc32c" or None. Each individual part is checksummed. At present, the selected checksum rule is only applied to parts and a separate checksum of the entire resulting blob is not computed. Please compute and compare the checksum of the file to the resulting blob separately if needed, using the - 'crc32c' algorithm as per the XML MPU documentation. + "crc32c" algorithm as per the XML MPU documentation. :type timeout: float or tuple :param timeout: @@ -1058,16 +1062,16 @@ def upload_chunks_concurrently( :type retry: google.api_core.retry.Retry :param retry: (Optional) How to retry the RPC. A None value will disable - retries. A google.api_core.retry.Retry value will enable retries, + retries. A `google.api_core.retry.Retry` value will enable retries, and the object will configure backoff and timeout options. Custom predicates (customizable error codes) are not supported for media operations such as this one. - This function does not accept ConditionalRetryPolicy values because + This function does not accept `ConditionalRetryPolicy` values because preconditions are not supported by the underlying API call. See the retry.py source code and docstrings in this package - (google.cloud.storage.retry) for information on retry types and how + (`google.cloud.storage.retry`) for information on retry types and how to configure them. :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. From 1ef0e1a94976780f1e847ec662344fe261757aec Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 13:04:28 -0700 Subject: [PATCH 216/509] chore(main): release 2.12.0 (#1132) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 22 ++++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c4c1f38..57d91347a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,28 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.12.0](https://github.com/googleapis/python-storage/compare/v2.11.0...v2.12.0) (2023-10-12) + + +### Features + +* Add additional_blob_attributes to upload_many_from_filenames ([#1162](https://github.com/googleapis/python-storage/issues/1162)) ([c7229f2](https://github.com/googleapis/python-storage/commit/c7229f2e53151fc2f2eb1268afc67dad87ebbb0a)) +* Add crc32c_checksum argument to download_chunks_concurrently ([#1138](https://github.com/googleapis/python-storage/issues/1138)) ([fc92ad1](https://github.com/googleapis/python-storage/commit/fc92ad19ff0f9704456452e8c7c47a5f90c29eab)) +* Add skip_if_exists to download_many ([#1161](https://github.com/googleapis/python-storage/issues/1161)) ([c5a983d](https://github.com/googleapis/python-storage/commit/c5a983d5a0b0632811af86fb64664b4382b05512)) +* Launch transfer manager to GA ([#1159](https://github.com/googleapis/python-storage/issues/1159)) ([5c90563](https://github.com/googleapis/python-storage/commit/5c905637947c45e39ed8ee84911a12e254bde571)) + + +### Bug Fixes + +* Bump python-auth version to fix issue and remove workaround ([#1158](https://github.com/googleapis/python-storage/issues/1158)) ([28c02dd](https://github.com/googleapis/python-storage/commit/28c02dd41010e6d818a77f51c539457b2dbfa233)) +* Mark _deprecate_threads_param as a wrapper to unblock introspection and docs ([#1122](https://github.com/googleapis/python-storage/issues/1122)) ([69bd4a9](https://github.com/googleapis/python-storage/commit/69bd4a935a995f8f261a589ee2978f58b90224ab)) + + +### Documentation + +* Add snippets for upload_chunks_concurrently and add chunk_size ([#1135](https://github.com/googleapis/python-storage/issues/1135)) ([3a0f551](https://github.com/googleapis/python-storage/commit/3a0f551436b659afb2208fd558ddb846f4d62d98)) +* Update formatting and wording in transfer_manager docstrings ([#1163](https://github.com/googleapis/python-storage/issues/1163)) ([9e460d8](https://github.com/googleapis/python-storage/commit/9e460d8106cbfb76caf35df4f6beed159fa2c22d)) + ## [2.11.0](https://github.com/googleapis/python-storage/compare/v2.10.0...v2.11.0) (2023-09-19) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index e6e357434..67e043bde 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.11.0" +__version__ = "2.12.0" From 2f92c3a2a3a1585d0f77be8fe3c2c5324140b71a Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 19 Oct 2023 11:52:11 -0700 Subject: [PATCH 217/509] feat: add support for custom headers (#1121) * Chore: refactor client.download_blob_to_file (#1052) * Refactor client.download_blob_to_file * Chore: clean up code * refactor blob and client unit tests * lint reformat * Rename _prep_and_do_download * Chore: refactor blob.upload_from_file (#1063) * Refactor client.download_blob_to_file * Chore: clean up code * refactor blob and client unit tests * lint reformat * Rename _prep_and_do_download * Refactor blob.upload_from_file * Lint reformat * feature: add 'command' argument to private upload/download interface (#1082) * Refactor client.download_blob_to_file * Chore: clean up code * refactor blob and client unit tests * lint reformat * Rename _prep_and_do_download * Refactor blob.upload_from_file * Lint reformat * feature: add 'command' argument to private upload/download interface * lint reformat * reduce duplication and edit docstring * feat: add support for custom headers starting with metadata op * add custom headers to downloads in client blob modules * add custom headers to uploads with tests * update mocks and tests * test custom headers support tm mpu uploads * update tm test * update test --------- Co-authored-by: MiaCY <97990237+MiaCY@users.noreply.github.com> --- google/cloud/storage/blob.py | 4 + google/cloud/storage/client.py | 12 +- google/cloud/storage/transfer_manager.py | 2 + tests/unit/test__http.py | 49 ++++++++ tests/unit/test_blob.py | 148 +++++++++++++++++++---- tests/unit/test_client.py | 12 ++ tests/unit/test_transfer_manager.py | 19 ++- 7 files changed, 219 insertions(+), 27 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index a95e08911..aebf24c26 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -1738,11 +1738,13 @@ def _get_upload_arguments(self, client, content_type, filename=None, command=Non * The ``content_type`` as a string (according to precedence) """ content_type = self._get_content_type(content_type, filename=filename) + # Add any client attached custom headers to the upload headers. headers = { **_get_default_headers( client._connection.user_agent, content_type, command=command ), **_get_encryption_headers(self._encryption_key), + **client._extra_headers, } object_metadata = self._get_writable_metadata() return headers, object_metadata, content_type @@ -4313,9 +4315,11 @@ def _prep_and_do_download( if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match, ) + # Add any client attached custom headers to be sent with the request. headers = { **_get_default_headers(client._connection.user_agent, command=command), **headers, + **client._extra_headers, } transport = client._http diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 10f2e5904..eea889f67 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -94,6 +94,11 @@ class Client(ClientWithProject): (Optional) Whether authentication is required under custom endpoints. If false, uses AnonymousCredentials and bypasses authentication. Defaults to True. Note this is only used when a custom endpoint is set in conjunction. + + :type extra_headers: dict + :param extra_headers: + (Optional) Custom headers to be sent with the requests attached to the client. + For example, you can add custom audit logging headers. """ SCOPE = ( @@ -111,6 +116,7 @@ def __init__( client_info=None, client_options=None, use_auth_w_custom_endpoint=True, + extra_headers={}, ): self._base_connection = None @@ -127,6 +133,7 @@ def __init__( # are passed along, for use in __reduce__ defined elsewhere. self._initial_client_info = client_info self._initial_client_options = client_options + self._extra_headers = extra_headers kw_args = {"client_info": client_info} @@ -172,7 +179,10 @@ def __init__( if no_project: self.project = None - self._connection = Connection(self, **kw_args) + # Pass extra_headers to Connection + connection = Connection(self, **kw_args) + connection.extra_headers = extra_headers + self._connection = connection self._batch_stack = _LocalStack() @classmethod diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 41a67b5a4..6abdb487e 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -1289,6 +1289,7 @@ def _reduce_client(cl): _http = None # Can't carry this over client_info = cl._initial_client_info client_options = cl._initial_client_options + extra_headers = cl._extra_headers return _LazyClient, ( client_object_id, @@ -1297,6 +1298,7 @@ def _reduce_client(cl): _http, client_info, client_options, + extra_headers, ) diff --git a/tests/unit/test__http.py b/tests/unit/test__http.py index e64ae0bab..3ea3ed1a4 100644 --- a/tests/unit/test__http.py +++ b/tests/unit/test__http.py @@ -71,6 +71,55 @@ def test_extra_headers(self): timeout=_DEFAULT_TIMEOUT, ) + def test_metadata_op_has_client_custom_headers(self): + import requests + import google.auth.credentials + from google.cloud import _http as base_http + from google.cloud.storage import Client + from google.cloud.storage.constants import _DEFAULT_TIMEOUT + + custom_headers = { + "x-goog-custom-audit-foo": "bar", + "x-goog-custom-audit-user": "baz", + } + http = mock.create_autospec(requests.Session, instance=True) + response = requests.Response() + response.status_code = 200 + data = b"brent-spiner" + response._content = data + http.is_mtls = False + http.request.return_value = response + credentials = mock.Mock(spec=google.auth.credentials.Credentials) + client = Client( + project="project", + credentials=credentials, + _http=http, + extra_headers=custom_headers, + ) + req_data = "hey-yoooouuuuu-guuuuuyyssss" + with patch.object( + _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST + ): + result = client._connection.api_request( + "GET", "/rainbow", data=req_data, expect_json=False + ) + self.assertEqual(result, data) + + expected_headers = { + **custom_headers, + "Accept-Encoding": "gzip", + base_http.CLIENT_INFO_HEADER: f"{client._connection.user_agent} {GCCL_INVOCATION_TEST_CONST}", + "User-Agent": client._connection.user_agent, + } + expected_uri = client._connection.build_api_url("/rainbow") + http.request.assert_called_once_with( + data=req_data, + headers=expected_headers, + method="GET", + url=expected_uri, + timeout=_DEFAULT_TIMEOUT, + ) + def test_build_api_url_no_extra_query_params(self): from urllib.parse import parse_qsl from urllib.parse import urlsplit diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 1e84704b1..cb164f6e2 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -2246,8 +2246,13 @@ def test__set_metadata_to_none(self): def test__get_upload_arguments(self): name = "blob-name" key = b"[pXw@,p@@AfBfrR3x-2b2SCHR,.?YwRO" + custom_headers = { + "x-goog-custom-audit-foo": "bar", + "x-goog-custom-audit-user": "baz", + } client = mock.Mock(_connection=_Connection) client._connection.user_agent = "testing 1.2.3" + client._extra_headers = custom_headers blob = self._make_one(name, bucket=None, encryption_key=key) blob.content_disposition = "inline" @@ -2271,6 +2276,7 @@ def test__get_upload_arguments(self): "X-Goog-Encryption-Algorithm": "AES256", "X-Goog-Encryption-Key": header_key_value, "X-Goog-Encryption-Key-Sha256": header_key_hash_value, + **custom_headers, } self.assertEqual( headers["X-Goog-API-Client"], @@ -2325,6 +2331,7 @@ def _do_multipart_success( client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = {} # Mock get_api_base_url_for_mtls function. mtls_url = "https://foo.mtls" @@ -2424,11 +2431,14 @@ def _do_multipart_success( with patch.object( _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): - headers = _get_default_headers( - client._connection.user_agent, - b'multipart/related; boundary="==0=="', - "application/xml", - ) + headers = { + **_get_default_headers( + client._connection.user_agent, + b'multipart/related; boundary="==0=="', + "application/xml", + ), + **client._extra_headers, + } client._http.request.assert_called_once_with( "POST", upload_url, data=payload, headers=headers, timeout=expected_timeout ) @@ -2520,6 +2530,19 @@ def test__do_multipart_upload_with_client(self, mock_get_boundary): transport = self._mock_transport(http.client.OK, {}) client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = {} + self._do_multipart_success(mock_get_boundary, client=client) + + @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") + def test__do_multipart_upload_with_client_custom_headers(self, mock_get_boundary): + custom_headers = { + "x-goog-custom-audit-foo": "bar", + "x-goog-custom-audit-user": "baz", + } + transport = self._mock_transport(http.client.OK, {}) + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) + client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = custom_headers self._do_multipart_success(mock_get_boundary, client=client) @mock.patch("google.resumable_media._upload.get_boundary", return_value=b"==0==") @@ -2597,6 +2620,7 @@ def _initiate_resumable_helper( # Create some mock arguments and call the method under test. client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = {} # Mock get_api_base_url_for_mtls function. mtls_url = "https://foo.mtls" @@ -2677,13 +2701,15 @@ def _initiate_resumable_helper( _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): if extra_headers is None: - self.assertEqual( - upload._headers, - _get_default_headers(client._connection.user_agent, content_type), - ) + expected_headers = { + **_get_default_headers(client._connection.user_agent, content_type), + **client._extra_headers, + } + self.assertEqual(upload._headers, expected_headers) else: expected_headers = { **_get_default_headers(client._connection.user_agent, content_type), + **client._extra_headers, **extra_headers, } self.assertEqual(upload._headers, expected_headers) @@ -2730,9 +2756,12 @@ def _initiate_resumable_helper( with patch.object( _helpers, "_get_invocation_id", return_value=GCCL_INVOCATION_TEST_CONST ): - expected_headers = _get_default_headers( - client._connection.user_agent, x_upload_content_type=content_type - ) + expected_headers = { + **_get_default_headers( + client._connection.user_agent, x_upload_content_type=content_type + ), + **client._extra_headers, + } if size is not None: expected_headers["x-upload-content-length"] = str(size) if extra_headers is not None: @@ -2824,6 +2853,21 @@ def test__initiate_resumable_upload_with_client(self): client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = {} + self._initiate_resumable_helper(client=client) + + def test__initiate_resumable_upload_with_client_custom_headers(self): + custom_headers = { + "x-goog-custom-audit-foo": "bar", + "x-goog-custom-audit-user": "baz", + } + resumable_url = "http://test.invalid?upload_id=hey-you" + response_headers = {"location": resumable_url} + transport = self._mock_transport(http.client.OK, response_headers) + + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) + client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = custom_headers self._initiate_resumable_helper(client=client) def _make_resumable_transport( @@ -3000,6 +3044,7 @@ def _do_resumable_helper( client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) client._connection.API_BASE_URL = "https://storage.googleapis.com" client._connection.user_agent = USER_AGENT + client._extra_headers = {} stream = io.BytesIO(data) bucket = _Bucket(name="yesterday") @@ -3612,26 +3657,32 @@ def _create_resumable_upload_session_helper( if_metageneration_match=None, if_metageneration_not_match=None, retry=None, + client=None, ): bucket = _Bucket(name="alex-trebek") blob = self._make_one("blob-name", bucket=bucket) chunk_size = 99 * blob._CHUNK_SIZE_MULTIPLE blob.chunk_size = chunk_size - - # Create mocks to be checked for doing transport. resumable_url = "http://test.invalid?upload_id=clean-up-everybody" - response_headers = {"location": resumable_url} - transport = self._mock_transport(http.client.OK, response_headers) - if side_effect is not None: - transport.request.side_effect = side_effect - - # Create some mock arguments and call the method under test. content_type = "text/plain" size = 10000 - client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) - client._connection.API_BASE_URL = "https://storage.googleapis.com" - client._connection.user_agent = "testing 1.2.3" + transport = None + if not client: + # Create mocks to be checked for doing transport. + response_headers = {"location": resumable_url} + transport = self._mock_transport(http.client.OK, response_headers) + + # Create some mock arguments and call the method under test. + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) + client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._connection.user_agent = "testing 1.2.3" + client._extra_headers = {} + + if transport is None: + transport = client._http + if side_effect is not None: + transport.request.side_effect = side_effect if timeout is None: expected_timeout = self._get_default_timeout() timeout_kwarg = {} @@ -3689,6 +3740,7 @@ def _create_resumable_upload_session_helper( **_get_default_headers( client._connection.user_agent, x_upload_content_type=content_type ), + **client._extra_headers, "x-upload-content-length": str(size), "x-upload-content-type": content_type, } @@ -3750,6 +3802,28 @@ def test_create_resumable_upload_session_with_failure(self): self.assertIn(message, exc_info.exception.message) self.assertEqual(exc_info.exception.errors, []) + def test_create_resumable_upload_session_with_client(self): + resumable_url = "http://test.invalid?upload_id=clean-up-everybody" + response_headers = {"location": resumable_url} + transport = self._mock_transport(http.client.OK, response_headers) + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) + client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = {} + self._create_resumable_upload_session_helper(client=client) + + def test_create_resumable_upload_session_with_client_custom_headers(self): + custom_headers = { + "x-goog-custom-audit-foo": "bar", + "x-goog-custom-audit-user": "baz", + } + resumable_url = "http://test.invalid?upload_id=clean-up-everybody" + response_headers = {"location": resumable_url} + transport = self._mock_transport(http.client.OK, response_headers) + client = mock.Mock(_http=transport, _connection=_Connection, spec=["_http"]) + client._connection.API_BASE_URL = "https://storage.googleapis.com" + client._extra_headers = custom_headers + self._create_resumable_upload_session_helper(client=client) + def test_get_iam_policy_defaults(self): from google.cloud.storage.iam import STORAGE_OWNER_ROLE from google.cloud.storage.iam import STORAGE_EDITOR_ROLE @@ -5815,6 +5889,34 @@ def test_open(self): with self.assertRaises(ValueError): blob.open("w", ignore_flush=False) + def test_downloads_w_client_custom_headers(self): + import google.auth.credentials + from google.cloud.storage import Client + + custom_headers = { + "x-goog-custom-audit-foo": "bar", + "x-goog-custom-audit-user": "baz", + } + credentials = mock.Mock(spec=google.auth.credentials.Credentials) + client = Client( + project="project", credentials=credentials, extra_headers=custom_headers + ) + blob = self._make_one("blob-name", bucket=_Bucket(client)) + file_obj = io.BytesIO() + + downloads = { + client.download_blob_to_file: (blob, file_obj), + blob.download_to_file: (file_obj,), + blob.download_as_bytes: (), + } + for method, args in downloads.items(): + with mock.patch.object(blob, "_do_download"): + method(*args) + blob._do_download.assert_called() + called_headers = blob._do_download.call_args.args[-4] + self.assertIsInstance(called_headers, dict) + self.assertDictContainsSubset(custom_headers, called_headers) + class Test__quote(unittest.TestCase): @staticmethod diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 0c1c5efee..4629ecf28 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -178,6 +178,18 @@ def test_ctor_w_client_options_object(self): client._connection.API_BASE_URL, "https://www.foo-googleapis.com" ) + def test_ctor_w_custom_headers(self): + PROJECT = "PROJECT" + credentials = _make_credentials() + custom_headers = {"x-goog-custom-audit-foo": "bar"} + client = self._make_one( + project=PROJECT, credentials=credentials, extra_headers=custom_headers + ) + self.assertEqual( + client._connection.API_BASE_URL, client._connection.DEFAULT_API_ENDPOINT + ) + self.assertEqual(client._connection.extra_headers, custom_headers) + def test_ctor_wo_project(self): PROJECT = "PROJECT" credentials = _make_credentials(project=PROJECT) diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 54284becd..9042b05e0 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -850,6 +850,9 @@ def test_upload_chunks_concurrently_with_metadata_and_encryption(): custom_metadata = {"key_a": "value_a", "key_b": "value_b"} encryption_key = "b23ff11bba187db8c37077e6af3b25b8" kms_key_name = "sample_key_name" + custom_headers = { + "x-goog-custom-audit-foo": "bar", + } METADATA = { "cache_control": "private", @@ -862,7 +865,9 @@ def test_upload_chunks_concurrently_with_metadata_and_encryption(): bucket = mock.Mock() bucket.name = "bucket" - bucket.client = _PickleableMockClient(identify_as_client=True) + bucket.client = _PickleableMockClient( + identify_as_client=True, extra_headers=custom_headers + ) transport = bucket.client._http user_project = "my_project" bucket.user_project = user_project @@ -920,6 +925,7 @@ def test_upload_chunks_concurrently_with_metadata_and_encryption(): "x-goog-meta-key_b": "value_b", "x-goog-user-project": "my_project", "x-goog-encryption-kms-key-name": "sample_key_name", + **custom_headers, } container_cls_mock.assert_called_once_with( URL, FILENAME, headers=expected_headers @@ -966,10 +972,11 @@ def get_api_base_url_for_mtls(): class _PickleableMockClient: - def __init__(self, identify_as_client=False): + def __init__(self, identify_as_client=False, extra_headers={}): self._http = "my_transport" # used as an identifier for "called_with" self._connection = _PickleableMockConnection() self.identify_as_client = identify_as_client + self._extra_headers = extra_headers @property def __class__(self): @@ -1083,11 +1090,17 @@ def test__get_pool_class_and_requirements_error(): def test__reduce_client(): fake_cache = {} client = mock.Mock() + custom_headers = { + "x-goog-custom-audit-foo": "bar", + } + client._extra_headers = custom_headers with mock.patch( "google.cloud.storage.transfer_manager._cached_clients", new=fake_cache ), mock.patch("google.cloud.storage.transfer_manager.Client"): - transfer_manager._reduce_client(client) + replicated_client, kwargs = transfer_manager._reduce_client(client) + assert replicated_client is not None + assert custom_headers in kwargs def test__call_method_on_maybe_pickled_blob(): From eac91cb6ffb0066248f824fc1f307140dd7c85da Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Fri, 20 Oct 2023 13:06:13 -0700 Subject: [PATCH 218/509] docs: fix exception field in tm reference docs (#1164) --- google/cloud/storage/transfer_manager.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 6abdb487e..8190f844d 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -865,11 +865,11 @@ def download_chunks_concurrently( :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - :exc:`google.resumable_media.common.DataCorruption` if the download's - checksum doesn't agree with server-computed checksum. The - `google.resumable_media` exception is used here for consistency - with other download methods despite the exception originating - elsewhere. + :exc:`google.resumable_media.common.DataCorruption` + if the download's checksum doesn't agree with server-computed + checksum. The `google.resumable_media` exception is used here for + consistency with other download methods despite the exception + originating elsewhere. """ client = blob.client From eae9ebed12d26832405c2f29fbdb14b4babf080d Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 23 Oct 2023 15:06:13 -0700 Subject: [PATCH 219/509] fix: fix typo in Bucket.clear_lifecycle_rules() (#1169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1074 🦕 --- google/cloud/storage/bucket.py | 6 +++++- tests/unit/test_bucket.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index f6d5e5aa2..3809a94b9 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2275,7 +2275,7 @@ def lifecycle_rules(self, rules): rules = [dict(rule) for rule in rules] # Convert helpers if needed self._patch_property("lifecycle", {"rule": rules}) - def clear_lifecyle_rules(self): + def clear_lifecycle_rules(self): """Clear lifecycle rules configured for this bucket. See https://cloud.google.com/storage/docs/lifecycle and @@ -2283,6 +2283,10 @@ def clear_lifecyle_rules(self): """ self.lifecycle_rules = [] + def clear_lifecyle_rules(self): + """Deprecated alias for clear_lifecycle_rules.""" + return self.clear_lifecycle_rules() + def add_lifecycle_delete_rule(self, **kw): """Add a "delete" rule to lifecycle rules configured for this bucket. diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 0c0873ee4..3f26fff2f 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2448,6 +2448,7 @@ def test_clear_lifecycle_rules(self): bucket._properties["lifecycle"] = {"rule": rules} self.assertEqual(list(bucket.lifecycle_rules), rules) + # This is a deprecated alias and will test both methods bucket.clear_lifecyle_rules() self.assertEqual(list(bucket.lifecycle_rules), []) From 4c30d620c36683dd4f3fa82a8151fbe580d045ad Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 07:09:12 -0400 Subject: [PATCH 220/509] chore(deps): bump urllib3 from 1.26.17 to 1.26.18 in /.kokoro (#1167) Source-Link: https://github.com/googleapis/synthtool/commit/d52e638b37b091054c869bfa6f5a9fedaba9e0dd Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:4f9b3b106ad0beafc2c8a415e3f62c1a0cc23cabea115dbe841b848f581cfe99 Co-authored-by: Owl Bot Co-authored-by: Victor Chudnovsky --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index dd98abbde..7f291dbd5 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:08e34975760f002746b1d8c86fdc90660be45945ee6d9db914d1508acdf9a547 -# created: 2023-10-09T14:06:13.397766266Z + digest: sha256:4f9b3b106ad0beafc2c8a415e3f62c1a0cc23cabea115dbe841b848f581cfe99 +# created: 2023-10-18T20:26:37.410353675Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 0332d3267..16170d0ca 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -467,9 +467,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via -r requirements.in -urllib3==1.26.17 \ - --hash=sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21 \ - --hash=sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b +urllib3==1.26.18 \ + --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ + --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 # via # requests # twine From d38adb6a3136152ad68ad8a9c4583d06509307b2 Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 30 Oct 2023 11:02:20 -0700 Subject: [PATCH 221/509] feat: add Autoclass v2.1 support (#1117) * feat: add Autoclass v2.1 support * update tests and coverage * update samples with v2.1 additions * fix lint * update samples --- google/cloud/storage/bucket.py | 51 ++++++++++++++++++++--- samples/snippets/snippets_test.py | 14 ++++--- samples/snippets/storage_get_autoclass.py | 3 ++ samples/snippets/storage_set_autoclass.py | 20 +++++---- tests/system/test_bucket.py | 38 ++++++++++++++++- tests/unit/test_bucket.py | 29 ++++++++++++- 6 files changed, 133 insertions(+), 22 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 3809a94b9..bc3f1e026 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2689,13 +2689,10 @@ def autoclass_enabled(self, value): :type value: convertible to boolean :param value: If true, enable Autoclass for this bucket. If false, disable Autoclass for this bucket. - - .. note:: - To enable autoclass, you must set it at bucket creation time. - Currently, only patch requests that disable autoclass are supported. - """ - self._patch_property("autoclass", {"enabled": bool(value)}) + autoclass = self._properties.get("autoclass", {}) + autoclass["enabled"] = bool(value) + self._patch_property("autoclass", autoclass) @property def autoclass_toggle_time(self): @@ -2709,6 +2706,48 @@ def autoclass_toggle_time(self): if timestamp is not None: return _rfc3339_nanos_to_datetime(timestamp) + @property + def autoclass_terminal_storage_class(self): + """The storage class that objects in an Autoclass bucket eventually transition to if + they are not read for a certain length of time. Valid values are NEARLINE and ARCHIVE. + + See https://cloud.google.com/storage/docs/using-autoclass for details. + + :setter: Set the terminal storage class for Autoclass configuration. + :getter: Get the terminal storage class for Autoclass configuration. + + :rtype: str + :returns: The terminal storage class if Autoclass is enabled, else ``None``. + """ + autoclass = self._properties.get("autoclass", {}) + return autoclass.get("terminalStorageClass", None) + + @autoclass_terminal_storage_class.setter + def autoclass_terminal_storage_class(self, value): + """The storage class that objects in an Autoclass bucket eventually transition to if + they are not read for a certain length of time. Valid values are NEARLINE and ARCHIVE. + + See https://cloud.google.com/storage/docs/using-autoclass for details. + + :type value: str + :param value: The only valid values are `"NEARLINE"` and `"ARCHIVE"`. + """ + autoclass = self._properties.get("autoclass", {}) + autoclass["terminalStorageClass"] = value + self._patch_property("autoclass", autoclass) + + @property + def autoclass_terminal_storage_class_update_time(self): + """The time at which the Autoclass terminal_storage_class field was last updated for this bucket + :rtype: datetime.datetime or ``NoneType`` + :returns: point-in time at which the bucket's terminal_storage_class is last updated, or ``None`` if the property is not set locally. + """ + autoclass = self._properties.get("autoclass") + if autoclass is not None: + timestamp = autoclass.get("terminalStorageClassUpdateTime") + if timestamp is not None: + return _rfc3339_nanos_to_datetime(timestamp) + def configure_website(self, main_page_suffix=None, not_found_page=None): """Configure website-related properties. diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 7a5f8c960..7add15184 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -449,23 +449,27 @@ def test_get_set_autoclass(new_bucket_obj, test_bucket, capsys): out, _ = capsys.readouterr() assert "Autoclass enabled is set to False" in out assert bucket.autoclass_toggle_time is None + assert bucket.autoclass_terminal_storage_class_update_time is None # Test enabling Autoclass at bucket creation new_bucket_obj.autoclass_enabled = True bucket = storage.Client().create_bucket(new_bucket_obj) assert bucket.autoclass_enabled is True + assert bucket.autoclass_terminal_storage_class == "NEARLINE" - # Test disabling Autoclass - bucket = storage_set_autoclass.set_autoclass(bucket.name, False) + # Test set terminal_storage_class to ARCHIVE + bucket = storage_set_autoclass.set_autoclass(bucket.name) out, _ = capsys.readouterr() - assert "Autoclass enabled is set to False" in out - assert bucket.autoclass_enabled is False + assert "Autoclass enabled is set to True" in out + assert bucket.autoclass_enabled is True + assert bucket.autoclass_terminal_storage_class == "ARCHIVE" # Test get Autoclass bucket = storage_get_autoclass.get_autoclass(bucket.name) out, _ = capsys.readouterr() - assert "Autoclass enabled is set to False" in out + assert "Autoclass enabled is set to True" in out assert bucket.autoclass_toggle_time is not None + assert bucket.autoclass_terminal_storage_class_update_time is not None def test_bucket_lifecycle_management(test_bucket, capsys): diff --git a/samples/snippets/storage_get_autoclass.py b/samples/snippets/storage_get_autoclass.py index d4bcbf3f4..30fa0c4f6 100644 --- a/samples/snippets/storage_get_autoclass.py +++ b/samples/snippets/storage_get_autoclass.py @@ -29,8 +29,11 @@ def get_autoclass(bucket_name): bucket = storage_client.get_bucket(bucket_name) autoclass_enabled = bucket.autoclass_enabled autoclass_toggle_time = bucket.autoclass_toggle_time + terminal_storage_class = bucket.autoclass_terminal_storage_class + tsc_update_time = bucket.autoclass_terminal_storage_class_update_time print(f"Autoclass enabled is set to {autoclass_enabled} for {bucket.name} at {autoclass_toggle_time}.") + print(f"Autoclass terminal storage class is set to {terminal_storage_class} for {bucket.name} at {tsc_update_time}.") return bucket diff --git a/samples/snippets/storage_set_autoclass.py b/samples/snippets/storage_set_autoclass.py index a25151f3b..eec5a550f 100644 --- a/samples/snippets/storage_set_autoclass.py +++ b/samples/snippets/storage_set_autoclass.py @@ -20,23 +20,27 @@ from google.cloud import storage -def set_autoclass(bucket_name, toggle): - """Disable Autoclass for a bucket. +def set_autoclass(bucket_name): + """Configure the Autoclass setting for a bucket. - Note: Only patch requests that disable autoclass are currently supported. - To enable autoclass, you must set it at bucket creation time. + terminal_storage_class field is optional and defaults to NEARLINE if not otherwise specified. + Valid terminal_storage_class values are NEARLINE and ARCHIVE. """ # The ID of your GCS bucket # bucket_name = "my-bucket" - # Boolean toggle - if true, enables Autoclass; if false, disables Autoclass - # toggle = False + # Enable Autoclass for a bucket. Set enabled to false to disable Autoclass. + # Set Autoclass.TerminalStorageClass, valid values are NEARLINE and ARCHIVE. + enabled = True + terminal_storage_class = "ARCHIVE" storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) - bucket.autoclass_enabled = toggle + bucket.autoclass_enabled = enabled + bucket.autoclass_terminal_storage_class = terminal_storage_class bucket.patch() print(f"Autoclass enabled is set to {bucket.autoclass_enabled} for {bucket.name} at {bucket.autoclass_toggle_time}.") + print(f"Autoclass terminal storage class is {bucket.autoclass_terminal_storage_class}.") return bucket @@ -44,4 +48,4 @@ def set_autoclass(bucket_name, toggle): # [END storage_set_autoclass] if __name__ == "__main__": - set_autoclass(bucket_name=sys.argv[1], toggle=sys.argv[2]) + set_autoclass(bucket_name=sys.argv[1]) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index ac949cf96..e825c72a6 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1047,7 +1047,9 @@ def test_new_bucket_with_autoclass( storage_client, buckets_to_delete, ): - # Autoclass can be enabled/disabled via bucket create + from google.cloud.storage import constants + + # Autoclass can be enabled via bucket create bucket_name = _helpers.unique_name("new-w-autoclass") bucket_obj = storage_client.bucket(bucket_name) bucket_obj.autoclass_enabled = True @@ -1055,7 +1057,9 @@ def test_new_bucket_with_autoclass( previous_toggle_time = bucket.autoclass_toggle_time buckets_to_delete.append(bucket) + # Autoclass terminal_storage_class is defaulted to NEARLINE if not specified assert bucket.autoclass_enabled is True + assert bucket.autoclass_terminal_storage_class == constants.NEARLINE_STORAGE_CLASS # Autoclass can be enabled/disabled via bucket patch bucket.autoclass_enabled = False @@ -1063,3 +1067,35 @@ def test_new_bucket_with_autoclass( assert bucket.autoclass_enabled is False assert bucket.autoclass_toggle_time != previous_toggle_time + + +def test_config_autoclass_w_existing_bucket( + storage_client, + buckets_to_delete, +): + from google.cloud.storage import constants + + bucket_name = _helpers.unique_name("for-autoclass") + bucket = storage_client.create_bucket(bucket_name) + buckets_to_delete.append(bucket) + assert bucket.autoclass_enabled is False + assert bucket.autoclass_toggle_time is None + assert bucket.autoclass_terminal_storage_class is None + assert bucket.autoclass_terminal_storage_class_update_time is None + + # Enable Autoclass on existing buckets with terminal_storage_class set to ARCHIVE + bucket.autoclass_enabled = True + bucket.autoclass_terminal_storage_class = constants.ARCHIVE_STORAGE_CLASS + bucket.patch(if_metageneration_match=bucket.metageneration) + previous_tsc_update_time = bucket.autoclass_terminal_storage_class_update_time + assert bucket.autoclass_enabled is True + assert bucket.autoclass_terminal_storage_class == constants.ARCHIVE_STORAGE_CLASS + + # Configure Autoclass terminal_storage_class to NEARLINE + bucket.autoclass_terminal_storage_class = constants.NEARLINE_STORAGE_CLASS + bucket.patch(if_metageneration_match=bucket.metageneration) + assert bucket.autoclass_enabled is True + assert bucket.autoclass_terminal_storage_class == constants.NEARLINE_STORAGE_CLASS + assert ( + bucket.autoclass_terminal_storage_class_update_time != previous_tsc_update_time + ) diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 3f26fff2f..8e07ed96d 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2659,15 +2659,19 @@ def test_autoclass_enabled_getter_and_setter(self): self.assertIn("autoclass", bucket._changes) self.assertFalse(bucket.autoclass_enabled) - def test_autoclass_toggle_time_missing(self): + def test_autoclass_config_unset(self): bucket = self._make_one() self.assertIsNone(bucket.autoclass_toggle_time) + self.assertIsNone(bucket.autoclass_terminal_storage_class) + self.assertIsNone(bucket.autoclass_terminal_storage_class_update_time) properties = {"autoclass": {}} bucket = self._make_one(properties=properties) self.assertIsNone(bucket.autoclass_toggle_time) + self.assertIsNone(bucket.autoclass_terminal_storage_class) + self.assertIsNone(bucket.autoclass_terminal_storage_class_update_time) - def test_autoclass_toggle_time(self): + def test_autoclass_toggle_and_tsc_update_time(self): import datetime from google.cloud._helpers import _datetime_to_rfc3339 from google.cloud._helpers import UTC @@ -2677,10 +2681,31 @@ def test_autoclass_toggle_time(self): "autoclass": { "enabled": True, "toggleTime": _datetime_to_rfc3339(effective_time), + "terminalStorageClass": "NEARLINE", + "terminalStorageClassUpdateTime": _datetime_to_rfc3339(effective_time), } } bucket = self._make_one(properties=properties) self.assertEqual(bucket.autoclass_toggle_time, effective_time) + self.assertEqual( + bucket.autoclass_terminal_storage_class_update_time, effective_time + ) + + def test_autoclass_tsc_getter_and_setter(self): + from google.cloud.storage import constants + + properties = { + "autoclass": {"terminalStorageClass": constants.ARCHIVE_STORAGE_CLASS} + } + bucket = self._make_one(properties=properties) + self.assertEqual( + bucket.autoclass_terminal_storage_class, constants.ARCHIVE_STORAGE_CLASS + ) + bucket.autoclass_terminal_storage_class = constants.NEARLINE_STORAGE_CLASS + self.assertIn("autoclass", bucket._changes) + self.assertEqual( + bucket.autoclass_terminal_storage_class, constants.NEARLINE_STORAGE_CLASS + ) def test_get_logging_w_prefix(self): NAME = "name" From 0a243faf5d6ca89b977ea1cf543356e0dd04df95 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 31 Oct 2023 09:13:43 -0700 Subject: [PATCH 222/509] fix: Blob.from_string parse storage uri with regex (#1170) --- google/cloud/storage/blob.py | 13 +++++++------ tests/unit/test_blob.py | 14 +++++++++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index aebf24c26..33998f81a 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -134,7 +134,9 @@ "Blob.download_as_string() is deprecated and will be removed in future. " "Use Blob.download_as_bytes() instead." ) - +_GS_URL_REGEX_PATTERN = re.compile( + r"(?Pgs)://(?P[a-z0-9_.-]+)/(?P.+)" +) _DEFAULT_CHUNKSIZE = 104857600 # 1024 * 1024 B * 100 = 100 MB _MAX_MULTIPART_SIZE = 8388608 # 8 MB @@ -403,12 +405,11 @@ def from_string(cls, uri, client=None): """ from google.cloud.storage.bucket import Bucket - scheme, netloc, path, query, frag = urlsplit(uri) - if scheme != "gs": + match = _GS_URL_REGEX_PATTERN.match(uri) + if not match: raise ValueError("URI scheme must be gs") - - bucket = Bucket(client, name=netloc) - return cls(path[1:], bucket) + bucket = Bucket(client, name=match.group("bucket_name")) + return cls(match.group("object_name"), bucket) def generate_signed_url( self, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index cb164f6e2..d5058e23c 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -5819,13 +5819,21 @@ def test_from_string_w_valid_uri(self): from google.cloud.storage.blob import Blob client = self._make_client() - uri = "gs://BUCKET_NAME/b" - blob = Blob.from_string(uri, client) + basic_uri = "gs://bucket_name/b" + blob = Blob.from_string(basic_uri, client) self.assertIsInstance(blob, Blob) self.assertIs(blob.client, client) self.assertEqual(blob.name, "b") - self.assertEqual(blob.bucket.name, "BUCKET_NAME") + self.assertEqual(blob.bucket.name, "bucket_name") + + nested_uri = "gs://bucket_name/path1/path2/b#name" + blob = Blob.from_string(nested_uri, client) + + self.assertIsInstance(blob, Blob) + self.assertIs(blob.client, client) + self.assertEqual(blob.name, "path1/path2/b#name") + self.assertEqual(blob.bucket.name, "bucket_name") def test_from_string_w_invalid_uri(self): from google.cloud.storage.blob import Blob From 0de09d30ea6083d962be1c1f5341ea14a2456dc7 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 31 Oct 2023 10:10:14 -0700 Subject: [PATCH 223/509] fix: bucket.delete(force=True) now works with version-enabled buckets (#1172) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1071 🦕 As a side-effect, the behavior of this method during a race condition has changed slightly. Previously, if a new object was created while the bucket.delete(force=True) method is running, it would fail, but if a new generation of an existing object was uploaded, it would still succeed. Now it will fail in both cases. Regardless of the exact behavior, please do not use this method on a bucket that is still being updated by another process. --- google/cloud/storage/bucket.py | 2 ++ tests/system/test_bucket.py | 42 ++++++++++++++++++++++++++++++++++ tests/unit/test_bucket.py | 10 ++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index bc3f1e026..de3b2502e 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1539,6 +1539,7 @@ def delete( client=client, timeout=timeout, retry=retry, + versions=True, ) ) if len(blobs) > self._MAX_OBJECTS_FOR_ITERATION: @@ -1557,6 +1558,7 @@ def delete( client=client, timeout=timeout, retry=retry, + preserve_generation=True, ) # We intentionally pass `_target_object=None` since a DELETE diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index e825c72a6..19b21bac2 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1069,6 +1069,48 @@ def test_new_bucket_with_autoclass( assert bucket.autoclass_toggle_time != previous_toggle_time +def test_bucket_delete_force(storage_client): + bucket_name = _helpers.unique_name("version-disabled") + bucket_obj = storage_client.bucket(bucket_name) + bucket = storage_client.create_bucket(bucket_obj) + + BLOB_NAME = "my_object" + blob = bucket.blob(BLOB_NAME) + blob.upload_from_string("abcd") + blob.upload_from_string("efgh") + + blobs = bucket.list_blobs(versions=True) + counter = 0 + for blob in blobs: + counter += 1 + assert blob.name == BLOB_NAME + assert counter == 1 + + bucket.delete(force=True) # Will fail with 409 if blobs aren't deleted + + +def test_bucket_delete_force_works_with_versions(storage_client): + bucket_name = _helpers.unique_name("version-enabled") + bucket_obj = storage_client.bucket(bucket_name) + bucket_obj.versioning_enabled = True + bucket = storage_client.create_bucket(bucket_obj) + assert bucket.versioning_enabled + + BLOB_NAME = "my_versioned_object" + blob = bucket.blob(BLOB_NAME) + blob.upload_from_string("abcd") + blob.upload_from_string("efgh") + + blobs = bucket.list_blobs(versions=True) + counter = 0 + for blob in blobs: + counter += 1 + assert blob.name == BLOB_NAME + assert counter == 2 + + bucket.delete(force=True) # Will fail with 409 if versions aren't deleted + + def test_config_autoclass_w_existing_bucket( storage_client, buckets_to_delete, diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 8e07ed96d..8db6a2e62 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1419,6 +1419,7 @@ def test_delete_hit_w_force_w_user_project_w_explicit_timeout_retry(self): client=client, timeout=timeout, retry=retry, + versions=True, ) bucket.delete_blobs.assert_called_once_with( @@ -1427,6 +1428,7 @@ def test_delete_hit_w_force_w_user_project_w_explicit_timeout_retry(self): client=client, timeout=timeout, retry=retry, + preserve_generation=True, ) expected_query_params = {"userProject": user_project} @@ -1456,6 +1458,7 @@ def test_delete_hit_w_force_delete_blobs(self): client=client, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + versions=True, ) bucket.delete_blobs.assert_called_once_with( @@ -1464,6 +1467,7 @@ def test_delete_hit_w_force_delete_blobs(self): client=client, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + preserve_generation=True, ) expected_query_params = {} @@ -1483,8 +1487,10 @@ def test_delete_w_force_w_user_project_w_miss_on_blob(self): client = mock.Mock(spec=["_delete_resource"]) client._delete_resource.return_value = None bucket = self._make_one(client=client, name=name) - blob = mock.Mock(spec=["name"]) + blob = mock.Mock(spec=["name", "generation"]) blob.name = blob_name + GEN = 1234 + blob.generation = GEN blobs = [blob] bucket.list_blobs = mock.Mock(return_value=iter(blobs)) bucket.delete_blob = mock.Mock(side_effect=NotFound("testing")) @@ -1496,7 +1502,7 @@ def test_delete_w_force_w_user_project_w_miss_on_blob(self): bucket.delete_blob.assert_called_once_with( blob_name, client=client, - generation=None, + generation=GEN, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, From fcbee59f0a0069018dea8d662cb3ee9e5ff22019 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 10:37:54 -0700 Subject: [PATCH 224/509] chore(main): release 2.13.0 (#1168) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 20 ++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57d91347a..9a2f34ecb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.13.0](https://github.com/googleapis/python-storage/compare/v2.12.0...v2.13.0) (2023-10-31) + + +### Features + +* Add Autoclass v2.1 support ([#1117](https://github.com/googleapis/python-storage/issues/1117)) ([d38adb6](https://github.com/googleapis/python-storage/commit/d38adb6a3136152ad68ad8a9c4583d06509307b2)) +* Add support for custom headers ([#1121](https://github.com/googleapis/python-storage/issues/1121)) ([2f92c3a](https://github.com/googleapis/python-storage/commit/2f92c3a2a3a1585d0f77be8fe3c2c5324140b71a)) + + +### Bug Fixes + +* Blob.from_string parse storage uri with regex ([#1170](https://github.com/googleapis/python-storage/issues/1170)) ([0a243fa](https://github.com/googleapis/python-storage/commit/0a243faf5d6ca89b977ea1cf543356e0dd04df95)) +* Bucket.delete(force=True) now works with version-enabled buckets ([#1172](https://github.com/googleapis/python-storage/issues/1172)) ([0de09d3](https://github.com/googleapis/python-storage/commit/0de09d30ea6083d962be1c1f5341ea14a2456dc7)) +* Fix typo in Bucket.clear_lifecycle_rules() ([#1169](https://github.com/googleapis/python-storage/issues/1169)) ([eae9ebe](https://github.com/googleapis/python-storage/commit/eae9ebed12d26832405c2f29fbdb14b4babf080d)) + + +### Documentation + +* Fix exception field in tm reference docs ([#1164](https://github.com/googleapis/python-storage/issues/1164)) ([eac91cb](https://github.com/googleapis/python-storage/commit/eac91cb6ffb0066248f824fc1f307140dd7c85da)) + ## [2.12.0](https://github.com/googleapis/python-storage/compare/v2.11.0...v2.12.0) (2023-10-12) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 67e043bde..b6000e20f 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.12.0" +__version__ = "2.13.0" From 9f77f0b46f329ebbe136aa8a9cafb3e22eb588f8 Mon Sep 17 00:00:00 2001 From: Dan Lee <71398022+dandhlee@users.noreply.github.com> Date: Fri, 3 Nov 2023 13:58:25 -0400 Subject: [PATCH 225/509] chore: update docfx minimum Python version (#1175) --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 895f5ee32..d3613196b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -245,7 +245,7 @@ def docs(session): ) -@nox.session(python="3.9") +@nox.session(python="3.10") def docfx(session): """Build the docfx yaml files for this library.""" From 003d5c684d47697b5f17d9e20eec5c7ca4dfb650 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 7 Nov 2023 20:50:19 -0800 Subject: [PATCH 226/509] chore(samples): bump storage to latest (#1177) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index f9b37be52..617ae8a33 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ google-cloud-pubsub==2.18.3 -google-cloud-storage==2.10.0 +google-cloud-storage==2.13.0 pandas===1.3.5; python_version == '3.7' pandas==2.0.3; python_version >= '3.8' From 2ed915ec4b35df6fad04f42df25e48667148fcf5 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 9 Nov 2023 02:10:16 -0800 Subject: [PATCH 227/509] fix: use native namespace to avoid pkg_resources warnings (#1176) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: use native namespace to avoid pkg_resources warnings * remove comment header of empty files * bring in line with auth library changes * lint * fix coverage * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * add tests and remove namespace_packages in setup.py * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * mark this as a system test * remove test for now * remove obsolete namespace list --------- Co-authored-by: Owl Bot --- .coveragerc | 2 ++ google/__init__.py | 22 ---------------------- google/cloud/__init__.py | 22 ---------------------- owlbot.py | 6 ++++++ setup.py | 10 +++------- 5 files changed, 11 insertions(+), 51 deletions(-) delete mode 100644 google/__init__.py delete mode 100644 google/cloud/__init__.py diff --git a/.coveragerc b/.coveragerc index c540edf34..21a2eaca4 100644 --- a/.coveragerc +++ b/.coveragerc @@ -18,6 +18,7 @@ [run] branch = True omit = + .nox/* google/__init__.py google/cloud/__init__.py @@ -32,6 +33,7 @@ exclude_lines = # Ignore abstract methods raise NotImplementedError omit = + .nox/* */gapic/*.py */proto/*.py */core/*.py diff --git a/google/__init__.py b/google/__init__.py deleted file mode 100644 index 0e1bc5131..000000000 --- a/google/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2016 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -try: - import pkg_resources - - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - - __path__ = pkgutil.extend_path(__path__, __name__) diff --git a/google/cloud/__init__.py b/google/cloud/__init__.py deleted file mode 100644 index 0e1bc5131..000000000 --- a/google/cloud/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2016 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -try: - import pkg_resources - - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - - __path__ = pkgutil.extend_path(__path__, __name__) diff --git a/owlbot.py b/owlbot.py index 50a787f34..0333b1d48 100644 --- a/owlbot.py +++ b/owlbot.py @@ -67,6 +67,12 @@ export DUAL_REGION_LOC_1 export DUAL_REGION_LOC_2""") +s.replace( + ".coveragerc", + "omit =", + """omit = + .nox/*""") + python.py_samples(skip_readmes=True) s.shell.run(["nox", "-s", "blacken"], hide_output=False) diff --git a/setup.py b/setup.py index 88d2f581b..67958419f 100644 --- a/setup.py +++ b/setup.py @@ -54,14 +54,11 @@ # Only include packages under the 'google' namespace. Do not include tests, # benchmarks, etc. packages = [ - package for package in setuptools.find_packages() if package.startswith("google") + package + for package in setuptools.find_namespace_packages() + if package.startswith("google") ] -# Determine which namespaces are needed. -namespaces = ["google"] -if "google.cloud" in packages: - namespaces.append("google.cloud") - setuptools.setup( name=name, @@ -88,7 +85,6 @@ ], platforms="Posix; MacOS X; Windows", packages=packages, - namespace_packages=namespaces, install_requires=dependencies, extras_require=extras, python_requires=">=3.7", From 73d033d9df92f6a161f1567bbd8ff6270a38b72a Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 05:11:03 -0500 Subject: [PATCH 228/509] chore: bump urllib3 from 1.26.12 to 1.26.18 (#1178) Source-Link: https://github.com/googleapis/synthtool/commit/febacccc98d6d224aff9d0bd0373bb5a4cd5969c Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:caffe0a9277daeccc4d1de5c9b55ebba0901b57c2f713ec9c876b0d4ec064f61 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/requirements.txt | 532 ++++++++++++++++++++------------------ 2 files changed, 277 insertions(+), 259 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 7f291dbd5..453b540c1 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:4f9b3b106ad0beafc2c8a415e3f62c1a0cc23cabea115dbe841b848f581cfe99 -# created: 2023-10-18T20:26:37.410353675Z + digest: sha256:caffe0a9277daeccc4d1de5c9b55ebba0901b57c2f713ec9c876b0d4ec064f61 +# created: 2023-11-08T19:46:45.022803742Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 16170d0ca..8957e2110 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -4,91 +4,75 @@ # # pip-compile --allow-unsafe --generate-hashes requirements.in # -argcomplete==2.0.0 \ - --hash=sha256:6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20 \ - --hash=sha256:cffa11ea77999bb0dd27bb25ff6dc142a6796142f68d45b1a26b11f58724561e +argcomplete==3.1.4 \ + --hash=sha256:72558ba729e4c468572609817226fb0a6e7e9a0a7d477b882be168c0b4a62b94 \ + --hash=sha256:fbe56f8cda08aa9a04b307d8482ea703e96a6a801611acb4be9bf3942017989f # via nox -attrs==22.1.0 \ - --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ - --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c +attrs==23.1.0 \ + --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ + --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 # via gcp-releasetool -bleach==5.0.1 \ - --hash=sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a \ - --hash=sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c - # via readme-renderer -cachetools==5.2.0 \ - --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ - --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db +cachetools==5.3.2 \ + --hash=sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2 \ + --hash=sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 # via google-auth certifi==2023.7.22 \ --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 # via requests -cffi==1.15.1 \ - --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ - --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ - --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ - --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ - --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ - --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ - --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ - --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ - --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ - --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ - --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ - --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ - --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ - --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ - --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ - --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ - --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ - --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ - --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ - --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ - --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ - --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ - --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ - --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ - --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ - --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ - --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ - --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ - --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ - --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ - --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ - --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ - --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ - --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ - --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ - --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ - --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ - --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ - --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ - --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ - --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ - --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ - --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ - --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ - --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ - --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ - --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ - --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ - --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ - --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ - --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ - --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ - --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ - --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ - --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ - --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ - --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ - --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ - --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ - --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ - --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ - --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ - --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ - --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 +cffi==1.16.0 \ + --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ + --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ + --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ + --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ + --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ + --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ + --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ + --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ + --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ + --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ + --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ + --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ + --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ + --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ + --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ + --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ + --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ + --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ + --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ + --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ + --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ + --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ + --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ + --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ + --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ + --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ + --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ + --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ + --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ + --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ + --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ + --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ + --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ + --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ + --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ + --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ + --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ + --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ + --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ + --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ + --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ + --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ + --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ + --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ + --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ + --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ + --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ + --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ + --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ + --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ + --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ + --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 # via cryptography charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ @@ -109,78 +93,74 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -commonmark==0.9.1 \ - --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ - --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 - # via rich -cryptography==41.0.4 \ - --hash=sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67 \ - --hash=sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311 \ - --hash=sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8 \ - --hash=sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13 \ - --hash=sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143 \ - --hash=sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f \ - --hash=sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829 \ - --hash=sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd \ - --hash=sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397 \ - --hash=sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac \ - --hash=sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d \ - --hash=sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a \ - --hash=sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839 \ - --hash=sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e \ - --hash=sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6 \ - --hash=sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9 \ - --hash=sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860 \ - --hash=sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca \ - --hash=sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91 \ - --hash=sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d \ - --hash=sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714 \ - --hash=sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb \ - --hash=sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f +cryptography==41.0.5 \ + --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ + --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ + --hash=sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e \ + --hash=sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8 \ + --hash=sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7 \ + --hash=sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1 \ + --hash=sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88 \ + --hash=sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86 \ + --hash=sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179 \ + --hash=sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81 \ + --hash=sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20 \ + --hash=sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548 \ + --hash=sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d \ + --hash=sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d \ + --hash=sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5 \ + --hash=sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1 \ + --hash=sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147 \ + --hash=sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936 \ + --hash=sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797 \ + --hash=sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696 \ + --hash=sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72 \ + --hash=sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da \ + --hash=sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723 # via # gcp-releasetool # secretstorage -distlib==0.3.6 \ - --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ - --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e +distlib==0.3.7 \ + --hash=sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057 \ + --hash=sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8 # via virtualenv -docutils==0.19 \ - --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ - --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc +docutils==0.20.1 \ + --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ + --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b # via readme-renderer -filelock==3.8.0 \ - --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ - --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 +filelock==3.13.1 \ + --hash=sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e \ + --hash=sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c # via virtualenv -gcp-docuploader==0.6.4 \ - --hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \ - --hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf +gcp-docuploader==0.6.5 \ + --hash=sha256:30221d4ac3e5a2b9c69aa52fdbef68cc3f27d0e6d0d90e220fc024584b8d2318 \ + --hash=sha256:b7458ef93f605b9d46a4bf3a8dc1755dad1f31d030c8679edf304e343b347eea # via -r requirements.in -gcp-releasetool==1.10.5 \ - --hash=sha256:174b7b102d704b254f2a26a3eda2c684fd3543320ec239baf771542a2e58e109 \ - --hash=sha256:e29d29927fe2ca493105a82958c6873bb2b90d503acac56be2c229e74de0eec9 +gcp-releasetool==1.16.0 \ + --hash=sha256:27bf19d2e87aaa884096ff941aa3c592c482be3d6a2bfe6f06afafa6af2353e3 \ + --hash=sha256:a316b197a543fd036209d0caba7a8eb4d236d8e65381c80cbc6d7efaa7606d63 # via -r requirements.in -google-api-core==2.10.2 \ - --hash=sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320 \ - --hash=sha256:34f24bd1d5f72a8c4519773d99ca6bf080a6c4e041b4e9f024fe230191dda62e +google-api-core==2.12.0 \ + --hash=sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553 \ + --hash=sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160 # via # google-cloud-core # google-cloud-storage -google-auth==2.14.1 \ - --hash=sha256:ccaa901f31ad5cbb562615eb8b664b3dd0bf5404a67618e642307f00613eda4d \ - --hash=sha256:f5d8701633bebc12e0deea4df8abd8aff31c28b355360597f7f2ee60f2e4d016 +google-auth==2.23.4 \ + --hash=sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3 \ + --hash=sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2 # via # gcp-releasetool # google-api-core # google-cloud-core # google-cloud-storage -google-cloud-core==2.3.2 \ - --hash=sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe \ - --hash=sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a +google-cloud-core==2.3.3 \ + --hash=sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb \ + --hash=sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863 # via google-cloud-storage -google-cloud-storage==2.6.0 \ - --hash=sha256:104ca28ae61243b637f2f01455cc8a05e8f15a2a18ced96cb587241cdd3820f5 \ - --hash=sha256:4ad0415ff61abdd8bb2ae81c1f8f7ec7d91a1011613f2db87c614c550f97bfe9 +google-cloud-storage==2.13.0 \ + --hash=sha256:ab0bf2e1780a1b74cf17fccb13788070b729f50c252f0c94ada2aae0ca95437d \ + --hash=sha256:f62dc4c7b6cd4360d072e3deb28035fbdad491ac3d9b0b1815a12daea10f37c7 # via gcp-docuploader google-crc32c==1.5.0 \ --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ @@ -251,29 +231,31 @@ google-crc32c==1.5.0 \ --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 - # via google-resumable-media -google-resumable-media==2.4.0 \ - --hash=sha256:2aa004c16d295c8f6c33b2b4788ba59d366677c0a25ae7382436cb30f776deaa \ - --hash=sha256:8d5518502f92b9ecc84ac46779bd4f09694ecb3ba38a3e7ca737a86d15cbca1f + # via + # google-cloud-storage + # google-resumable-media +google-resumable-media==2.6.0 \ + --hash=sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7 \ + --hash=sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b # via google-cloud-storage -googleapis-common-protos==1.57.0 \ - --hash=sha256:27a849d6205838fb6cc3c1c21cb9800707a661bb21c6ce7fb13e99eb1f8a0c46 \ - --hash=sha256:a9f4a1d7f6d9809657b7f1316a1aa527f6664891531bcfcc13b6696e685f443c +googleapis-common-protos==1.61.0 \ + --hash=sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0 \ + --hash=sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b # via google-api-core idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via requests -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==6.8.0 \ + --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ + --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 # via # -r requirements.in # keyring # twine -jaraco-classes==3.2.3 \ - --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ - --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a +jaraco-classes==3.3.0 \ + --hash=sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb \ + --hash=sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621 # via keyring jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ @@ -285,75 +267,121 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via gcp-releasetool -keyring==23.11.0 \ - --hash=sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e \ - --hash=sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361 +keyring==24.2.0 \ + --hash=sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6 \ + --hash=sha256:ca0746a19ec421219f4d713f848fa297a661a8a8c1504867e55bfb5e09091509 # via # gcp-releasetool # twine -markupsafe==2.1.1 \ - --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ - --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ - --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ - --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ - --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ - --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ - --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ - --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ - --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ - --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ - --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ - --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ - --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ - --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ - --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ - --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ - --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ - --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \ - --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ - --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ - --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ - --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ - --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ - --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ - --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ - --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ - --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ - --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ - --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ - --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ - --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ - --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ - --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ - --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ - --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ - --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ - --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ - --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ - --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ - --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 +markdown-it-py==3.0.0 \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ + --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb + # via rich +markupsafe==2.1.3 \ + --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ + --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ + --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ + --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ + --hash=sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c \ + --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ + --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ + --hash=sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb \ + --hash=sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939 \ + --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ + --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ + --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ + --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ + --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ + --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ + --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ + --hash=sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd \ + --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ + --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ + --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ + --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ + --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ + --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ + --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ + --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ + --hash=sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007 \ + --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ + --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ + --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ + --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ + --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ + --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ + --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ + --hash=sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1 \ + --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ + --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ + --hash=sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c \ + --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ + --hash=sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823 \ + --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ + --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ + --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ + --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ + --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ + --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ + --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ + --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ + --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ + --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ + --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ + --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ + --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ + --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ + --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ + --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ + --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ + --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ + --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc \ + --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ + --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 # via jinja2 -more-itertools==9.0.0 \ - --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ - --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +more-itertools==10.1.0 \ + --hash=sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a \ + --hash=sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6 # via jaraco-classes -nox==2022.11.21 \ - --hash=sha256:0e41a990e290e274cb205a976c4c97ee3c5234441a8132c8c3fd9ea3c22149eb \ - --hash=sha256:e21c31de0711d1274ca585a2c5fde36b1aa962005ba8e9322bf5eeed16dcd684 +nh3==0.2.14 \ + --hash=sha256:116c9515937f94f0057ef50ebcbcc10600860065953ba56f14473ff706371873 \ + --hash=sha256:18415df36db9b001f71a42a3a5395db79cf23d556996090d293764436e98e8ad \ + --hash=sha256:203cac86e313cf6486704d0ec620a992c8bc164c86d3a4fd3d761dd552d839b5 \ + --hash=sha256:2b0be5c792bd43d0abef8ca39dd8acb3c0611052ce466d0401d51ea0d9aa7525 \ + --hash=sha256:377aaf6a9e7c63962f367158d808c6a1344e2b4f83d071c43fbd631b75c4f0b2 \ + --hash=sha256:525846c56c2bcd376f5eaee76063ebf33cf1e620c1498b2a40107f60cfc6054e \ + --hash=sha256:5529a3bf99402c34056576d80ae5547123f1078da76aa99e8ed79e44fa67282d \ + --hash=sha256:7771d43222b639a4cd9e341f870cee336b9d886de1ad9bec8dddab22fe1de450 \ + --hash=sha256:88c753efbcdfc2644a5012938c6b9753f1c64a5723a67f0301ca43e7b85dcf0e \ + --hash=sha256:93a943cfd3e33bd03f77b97baa11990148687877b74193bf777956b67054dcc6 \ + --hash=sha256:9be2f68fb9a40d8440cbf34cbf40758aa7f6093160bfc7fb018cce8e424f0c3a \ + --hash=sha256:a0c509894fd4dccdff557068e5074999ae3b75f4c5a2d6fb5415e782e25679c4 \ + --hash=sha256:ac8056e937f264995a82bf0053ca898a1cb1c9efc7cd68fa07fe0060734df7e4 \ + --hash=sha256:aed56a86daa43966dd790ba86d4b810b219f75b4bb737461b6886ce2bde38fd6 \ + --hash=sha256:e8986f1dd3221d1e741fda0a12eaa4a273f1d80a35e31a1ffe579e7c621d069e \ + --hash=sha256:f99212a81c62b5f22f9e7c3e347aa00491114a5647e1f13bbebd79c3e5f08d75 + # via readme-renderer +nox==2023.4.22 \ + --hash=sha256:0b1adc619c58ab4fa57d6ab2e7823fe47a32e70202f287d78474adcc7bda1891 \ + --hash=sha256:46c0560b0dc609d7d967dc99e22cb463d3c4caf54a5fda735d6c11b5177e3a9f # via -r requirements.in -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==23.2 \ + --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ + --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 # via # gcp-releasetool # nox -pkginfo==1.8.3 \ - --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ - --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c +pkginfo==1.9.6 \ + --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ + --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 # via twine -platformdirs==2.5.4 \ - --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ - --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 +platformdirs==3.11.0 \ + --hash=sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3 \ + --hash=sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e # via virtualenv protobuf==3.20.3 \ --hash=sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7 \ @@ -383,34 +411,30 @@ protobuf==3.20.3 \ # gcp-releasetool # google-api-core # googleapis-common-protos -pyasn1==0.4.8 \ - --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ - --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba +pyasn1==0.5.0 \ + --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ + --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde # via # pyasn1-modules # rsa -pyasn1-modules==0.2.8 \ - --hash=sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e \ - --hash=sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74 +pyasn1-modules==0.3.0 \ + --hash=sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c \ + --hash=sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d # via google-auth pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pygments==2.15.0 \ - --hash=sha256:77a3299119af881904cd5ecd1ac6a66214b6e9bed1f2db16993b54adede64094 \ - --hash=sha256:f7e36cffc4c517fbc252861b9a6e4644ca0e5abadf9a113c72d1358ad09b9500 +pygments==2.16.1 \ + --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ + --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 # via # readme-renderer # rich -pyjwt==2.6.0 \ - --hash=sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd \ - --hash=sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14 +pyjwt==2.8.0 \ + --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ + --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 # via gcp-releasetool -pyparsing==3.0.9 \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via packaging pyperclip==1.8.2 \ --hash=sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57 # via gcp-releasetool @@ -418,9 +442,9 @@ python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 # via gcp-releasetool -readme-renderer==37.3 \ - --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ - --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 +readme-renderer==42.0 \ + --hash=sha256:13d039515c1f24de668e2c93f2e877b9dbe6c6c32328b90a40a49d8b2b85f36d \ + --hash=sha256:2d55489f83be4992fe4454939d1a051c33edbab778e82761d060c9fc6b308cd1 # via twine requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ @@ -431,17 +455,17 @@ requests==2.31.0 \ # google-cloud-storage # requests-toolbelt # twine -requests-toolbelt==0.10.1 \ - --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ - --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d +requests-toolbelt==1.0.0 \ + --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==12.6.0 \ - --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ - --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 +rich==13.6.0 \ + --hash=sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245 \ + --hash=sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef # via twine rsa==4.9 \ --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ @@ -455,43 +479,37 @@ six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via - # bleach # gcp-docuploader - # google-auth # python-dateutil -twine==4.0.1 \ - --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ - --hash=sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0 +twine==4.0.2 \ + --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ + --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 # via -r requirements.in -typing-extensions==4.4.0 \ - --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ - --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e +typing-extensions==4.8.0 \ + --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ + --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef # via -r requirements.in -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 +urllib3==2.0.7 \ + --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ + --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e # via # requests # twine -virtualenv==20.16.7 \ - --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ - --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 +virtualenv==20.24.6 \ + --hash=sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af \ + --hash=sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381 # via nox -webencodings==0.5.1 \ - --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ - --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 - # via bleach -wheel==0.38.4 \ - --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ - --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 +wheel==0.41.3 \ + --hash=sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942 \ + --hash=sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841 # via -r requirements.in -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.17.0 \ + --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ + --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f +setuptools==68.2.2 \ + --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ + --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a # via -r requirements.in From ecf41504ba7f2a2c2db2e3c7e267686283d2cab3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:46:24 -0800 Subject: [PATCH 229/509] feat: Add support for Python 3.12 (#1187) * chore(python): Add Python 3.12 Source-Link: https://github.com/googleapis/synthtool/commit/af16e6d4672cc7b400f144de2fc3068b54ff47d2 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:bacc3af03bff793a03add584537b36b5644342931ad989e3ba1171d3bd5399f5 * Add trove classifier for python 3.12 * Update contributing.rst, noxfile and constraints to include python 3.12 * remove usage of deprecated assertDictContainsSubset https://github.com/python/cpython/pull/28268 * update tests KMS key settings --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou Co-authored-by: Cathy Ouyang --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/samples/python3.12/common.cfg | 40 ++++++++++++++++++++ .kokoro/samples/python3.12/continuous.cfg | 6 +++ .kokoro/samples/python3.12/periodic-head.cfg | 11 ++++++ .kokoro/samples/python3.12/periodic.cfg | 6 +++ .kokoro/samples/python3.12/presubmit.cfg | 6 +++ CONTRIBUTING.rst | 2 +- noxfile.py | 2 +- samples/snippets/encryption_test.py | 2 +- samples/snippets/noxfile.py | 2 +- samples/snippets/noxfile_config.py | 10 ++++- setup.py | 1 + testing/constraints-3.12.txt | 0 tests/unit/test_blob.py | 2 +- tests/unit/test_fileio.py | 2 +- 15 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 .kokoro/samples/python3.12/common.cfg create mode 100644 .kokoro/samples/python3.12/continuous.cfg create mode 100644 .kokoro/samples/python3.12/periodic-head.cfg create mode 100644 .kokoro/samples/python3.12/periodic.cfg create mode 100644 .kokoro/samples/python3.12/presubmit.cfg create mode 100644 testing/constraints-3.12.txt diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 453b540c1..eb4d9f794 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:caffe0a9277daeccc4d1de5c9b55ebba0901b57c2f713ec9c876b0d4ec064f61 -# created: 2023-11-08T19:46:45.022803742Z + digest: sha256:bacc3af03bff793a03add584537b36b5644342931ad989e3ba1171d3bd5399f5 +# created: 2023-11-23T18:17:28.105124211Z diff --git a/.kokoro/samples/python3.12/common.cfg b/.kokoro/samples/python3.12/common.cfg new file mode 100644 index 000000000..40c79a35a --- /dev/null +++ b/.kokoro/samples/python3.12/common.cfg @@ -0,0 +1,40 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Specify which tests to run +env_vars: { + key: "RUN_TESTS_SESSION" + value: "py-3.12" +} + +# Declare build specific Cloud project. +env_vars: { + key: "BUILD_SPECIFIC_GCLOUD_PROJECT" + value: "python-docs-samples-tests-312" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-storage/.kokoro/test-samples.sh" +} + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" +} + +# Download secrets for samples +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-storage/.kokoro/trampoline_v2.sh" \ No newline at end of file diff --git a/.kokoro/samples/python3.12/continuous.cfg b/.kokoro/samples/python3.12/continuous.cfg new file mode 100644 index 000000000..a1c8d9759 --- /dev/null +++ b/.kokoro/samples/python3.12/continuous.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/.kokoro/samples/python3.12/periodic-head.cfg b/.kokoro/samples/python3.12/periodic-head.cfg new file mode 100644 index 000000000..5d0faf58f --- /dev/null +++ b/.kokoro/samples/python3.12/periodic-head.cfg @@ -0,0 +1,11 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-storage/.kokoro/test-samples-against-head.sh" +} diff --git a/.kokoro/samples/python3.12/periodic.cfg b/.kokoro/samples/python3.12/periodic.cfg new file mode 100644 index 000000000..71cd1e597 --- /dev/null +++ b/.kokoro/samples/python3.12/periodic.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "False" +} diff --git a/.kokoro/samples/python3.12/presubmit.cfg b/.kokoro/samples/python3.12/presubmit.cfg new file mode 100644 index 000000000..a1c8d9759 --- /dev/null +++ b/.kokoro/samples/python3.12/presubmit.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 80c4bfb58..d53ad8707 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.7, 3.8, 3.9, 3.10 and 3.11 on both UNIX and Windows. + 3.7, 3.8, 3.9, 3.10, 3.11 and 3.12 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should diff --git a/noxfile.py b/noxfile.py index d3613196b..bb79cfa2d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -29,7 +29,7 @@ DEFAULT_PYTHON_VERSION = "3.8" SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"] -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"] +UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.8"] _DEFAULT_STORAGE_HOST = "https://storage.googleapis.com" diff --git a/samples/snippets/encryption_test.py b/samples/snippets/encryption_test.py index 5a5eb7b2d..ff7a568e0 100644 --- a/samples/snippets/encryption_test.py +++ b/samples/snippets/encryption_test.py @@ -29,7 +29,7 @@ import storage_upload_encrypted_file BUCKET = os.environ["CLOUD_STORAGE_BUCKET"] -KMS_KEY = os.environ["CLOUD_KMS_KEY"] +KMS_KEY = os.environ["MAIN_CLOUD_KMS_KEY"] TEST_ENCRYPTION_KEY = "brtJUWneL92g5q0N2gyDSnlPSYAiIVZ/cWgjyZNeMy0=" TEST_ENCRYPTION_KEY_DECODED = base64.b64decode(TEST_ENCRYPTION_KEY) diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 7c8a63994..483b55901 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -89,7 +89,7 @@ def get_pytest_env_vars() -> Dict[str, str]: # DO NOT EDIT - automatically generated. # All versions used to test samples. -ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"] +ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] # Any default versions that should be ignored. IGNORED_VERSIONS = TEST_CONFIG["ignored_versions"] diff --git a/samples/snippets/noxfile_config.py b/samples/snippets/noxfile_config.py index ecd7fdce7..4f184ede0 100644 --- a/samples/snippets/noxfile_config.py +++ b/samples/snippets/noxfile_config.py @@ -67,6 +67,12 @@ def get_cloud_kms_key(): if session == 'py-3.10': return ('projects/python-docs-samples-tests-310/locations/us/' 'keyRings/gcs-kms-key-ring/cryptoKeys/gcs-kms-key') + if session == 'py-3.11': + return ('projects/python-docs-samples-tests-311/locations/us/' + 'keyRings/gcs-kms-key-ring/cryptoKeys/gcs-kms-key') + if session == 'py-3.12': + return ('projects/python-docs-samples-tests-312/locations/us/' + 'keyRings/gcs-kms-key-ring/cryptoKeys/gcs-kms-key') return os.environ['CLOUD_KMS_KEY'] @@ -91,6 +97,8 @@ def get_cloud_kms_key(): # 'constraints/iam.disableServiceAccountKeyCreation' policy. # 2. The new projects buckets need to have universal permission model. # For those tests, we'll use the original project. - 'MAIN_GOOGLE_CLOUD_PROJECT': 'python-docs-samples-tests' + 'MAIN_GOOGLE_CLOUD_PROJECT': 'python-docs-samples-tests', + 'MAIN_CLOUD_KMS_KEY': ('projects/python-docs-samples-tests/locations/us/' + 'keyRings/gcs-kms-key-ring/cryptoKeys/gcs-kms-key') }, } diff --git a/setup.py b/setup.py index 67958419f..fa0200cdf 100644 --- a/setup.py +++ b/setup.py @@ -80,6 +80,7 @@ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/testing/constraints-3.12.txt b/testing/constraints-3.12.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index d5058e23c..dcaf3e028 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -5923,7 +5923,7 @@ def test_downloads_w_client_custom_headers(self): blob._do_download.assert_called() called_headers = blob._do_download.call_args.args[-4] self.assertIsInstance(called_headers, dict) - self.assertDictContainsSubset(custom_headers, called_headers) + self.assertLessEqual(custom_headers.items(), called_headers.items()) class Test__quote(unittest.TestCase): diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index dab272a90..a92df37da 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -434,7 +434,7 @@ def test_seek_fails(self): writer = self._make_blob_writer(blob) with self.assertRaises(io.UnsupportedOperation): - writer.seek() + writer.seek(0) def test_conditional_retry_failure(self): blob = mock.Mock() From 62d6366dda55e33cf6ffcca9931b8b357d1720f3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 19:41:03 -0500 Subject: [PATCH 230/509] chore: bump cryptography from 41.0.5 to 41.0.6 in /synthtool/gcp/templates/python_library/.kokoro (#1190) Source-Link: https://github.com/googleapis/synthtool/commit/9367caadcbb30b5b2719f30eb00c44cc913550ed Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:2f155882785883336b4468d5218db737bb1d10c9cea7cb62219ad16fe248c03c Co-authored-by: Owl Bot Co-authored-by: cojenco --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/requirements.txt | 48 +++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index eb4d9f794..effbde6b0 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:bacc3af03bff793a03add584537b36b5644342931ad989e3ba1171d3bd5399f5 -# created: 2023-11-23T18:17:28.105124211Z + digest: sha256:2f155882785883336b4468d5218db737bb1d10c9cea7cb62219ad16fe248c03c +# created: 2023-11-29T14:54:29.548172703Z \ No newline at end of file diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 8957e2110..e5c1ffca9 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -93,30 +93,30 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -cryptography==41.0.5 \ - --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ - --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ - --hash=sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e \ - --hash=sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8 \ - --hash=sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7 \ - --hash=sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1 \ - --hash=sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88 \ - --hash=sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86 \ - --hash=sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179 \ - --hash=sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81 \ - --hash=sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20 \ - --hash=sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548 \ - --hash=sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d \ - --hash=sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d \ - --hash=sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5 \ - --hash=sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1 \ - --hash=sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147 \ - --hash=sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936 \ - --hash=sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797 \ - --hash=sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696 \ - --hash=sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72 \ - --hash=sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da \ - --hash=sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723 +cryptography==41.0.6 \ + --hash=sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596 \ + --hash=sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c \ + --hash=sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660 \ + --hash=sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4 \ + --hash=sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead \ + --hash=sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed \ + --hash=sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3 \ + --hash=sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7 \ + --hash=sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09 \ + --hash=sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c \ + --hash=sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43 \ + --hash=sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65 \ + --hash=sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6 \ + --hash=sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da \ + --hash=sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c \ + --hash=sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b \ + --hash=sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8 \ + --hash=sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c \ + --hash=sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d \ + --hash=sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9 \ + --hash=sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86 \ + --hash=sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36 \ + --hash=sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae # via # gcp-releasetool # secretstorage From 9e4d1d8b44e55a1a10032b844932a8f5140c68fe Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 2 Dec 2023 17:30:22 +0100 Subject: [PATCH 231/509] chore(deps): update all dependencies (#1114) * chore(deps): update all dependencies * See https://github.com/pandas-dev/pandas/releases/tag/v2.1.0 --------- Co-authored-by: Anthonios Partheniou --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 2883c5abc..52e47f6e3 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.4.0 +pytest==7.4.3 mock==5.1.0 backoff==2.2.1 \ No newline at end of file diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 617ae8a33..f52051872 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,5 @@ -google-cloud-pubsub==2.18.3 +google-cloud-pubsub==2.18.4 google-cloud-storage==2.13.0 pandas===1.3.5; python_version == '3.7' -pandas==2.0.3; python_version >= '3.8' +pandas===2.0.3; python_version == '3.8' +pandas==2.1.3; python_version >= '3.9' From 22f36da1ce5b04408653ddbdbf35f25ed1072af8 Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 4 Dec 2023 13:14:20 -0800 Subject: [PATCH 232/509] fix: propagate timeout in BlobWriter (#1186) Fixes #1184 --- google/cloud/storage/fileio.py | 8 +++++++- tests/unit/test_fileio.py | 10 +++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index 639e731ba..97d234983 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -406,9 +406,15 @@ def _upload_chunks_from_buffer(self, num_chunks): upload, transport = self._upload_and_transport + # Attach timeout if specified in the keyword arguments. + # Otherwise, the default timeout will be used from the media library. + kwargs = {} + if "timeout" in self._upload_kwargs: + kwargs = {"timeout": self._upload_kwargs.get("timeout")} + # Upload chunks. The SlidingBuffer class will manage seek position. for _ in range(num_chunks): - upload.transmit_next_chunk(transport) + upload.transmit_next_chunk(transport, **kwargs) # Wipe the buffer of chunks uploaded, preserving any remaining data. self._buffer.flush() diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index a92df37da..cafc65e49 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -346,6 +346,7 @@ def test_write(self, mock_warn): blob = mock.Mock() upload = mock.Mock() transport = mock.Mock() + timeout = 600 blob._initiate_resumable_upload.return_value = (upload, transport) @@ -354,7 +355,10 @@ def test_write(self, mock_warn): # arguments are used. # It would be normal to use a context manager here, but not doing so # gives us more control over close() for test purposes. - upload_kwargs = {"if_metageneration_match": 1} + upload_kwargs = { + "if_metageneration_match": 1, + "timeout": timeout, + } chunk_size = 8 # Note: Real upload requires a multiple of 256KiB. writer = self._make_blob_writer( blob, @@ -366,7 +370,7 @@ def test_write(self, mock_warn): # The transmit_next_chunk method must actually consume bytes from the # sliding buffer for the flush() feature to work properly. - upload.transmit_next_chunk.side_effect = lambda _: writer._buffer.read( + upload.transmit_next_chunk.side_effect = lambda _, timeout: writer._buffer.read( chunk_size ) @@ -388,7 +392,7 @@ def test_write(self, mock_warn): retry=None, **upload_kwargs ) - upload.transmit_next_chunk.assert_called_with(transport) + upload.transmit_next_chunk.assert_called_with(transport, timeout=timeout) self.assertEqual(upload.transmit_next_chunk.call_count, 4) # Write another byte, finalize and close. From a1793375cf038ce79d4d4b7077f6b4dcc4b4aeec Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 7 Dec 2023 13:40:39 -0800 Subject: [PATCH 233/509] feat: support object retention lock (#1188) * feat: add support for object retention lock * add Retention config object in Blob * update tests * update test coverage * clarify docstrings --------- Co-authored-by: Anthonios Partheniou --- google/cloud/storage/_helpers.py | 20 +++++ google/cloud/storage/blob.py | 135 +++++++++++++++++++++++++++++++ google/cloud/storage/bucket.py | 19 +++++ google/cloud/storage/client.py | 7 ++ tests/system/test_blob.py | 29 +++++++ tests/unit/test__helpers.py | 6 ++ tests/unit/test_blob.py | 75 +++++++++++++++++ tests/unit/test_bucket.py | 12 +++ tests/unit/test_client.py | 7 +- 9 files changed, 308 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 77a9dffd0..0fb4e0ff8 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -290,6 +290,7 @@ def patch( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED, + override_unlocked_retention=False, ): """Sends all changed properties in a PATCH request. @@ -326,12 +327,21 @@ def patch( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + + :type override_unlocked_retention: bool + :param override_unlocked_retention: + (Optional) override_unlocked_retention must be set to True if the operation includes + a retention property that changes the mode from Unlocked to Locked, reduces the + retainUntilTime, or removes the retention configuration from the object. See: + https://cloud.google.com/storage/docs/json_api/v1/objects/patch """ client = self._require_client(client) query_params = self._query_params # Pass '?projection=full' here because 'PATCH' documented not # to work properly w/ 'noAcl'. query_params["projection"] = "full" + if override_unlocked_retention: + query_params["overrideUnlockedRetention"] = override_unlocked_retention _add_generation_match_parameters( query_params, if_generation_match=if_generation_match, @@ -361,6 +371,7 @@ def update( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED, + override_unlocked_retention=False, ): """Sends all properties in a PUT request. @@ -397,11 +408,20 @@ def update( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + + :type override_unlocked_retention: bool + :param override_unlocked_retention: + (Optional) override_unlocked_retention must be set to True if the operation includes + a retention property that changes the mode from Unlocked to Locked, reduces the + retainUntilTime, or removes the retention configuration from the object. See: + https://cloud.google.com/storage/docs/json_api/v1/objects/patch """ client = self._require_client(client) query_params = self._query_params query_params["projection"] = "full" + if override_unlocked_retention: + query_params["overrideUnlockedRetention"] = override_unlocked_retention _add_generation_match_parameters( query_params, if_generation_match=if_generation_match, diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 33998f81a..74cdc76e1 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -102,6 +102,7 @@ "md5Hash", "metadata", "name", + "retention", "storageClass", ) _READ_LESS_THAN_SIZE = ( @@ -1700,6 +1701,7 @@ def _get_writable_metadata(self): * ``md5Hash`` * ``metadata`` * ``name`` + * ``retention`` * ``storageClass`` For now, we don't support ``acl``, access control lists should be @@ -4667,6 +4669,16 @@ def custom_time(self, value): self._patch_property("customTime", value) + @property + def retention(self): + """Retrieve the retention configuration for this object. + + :rtype: :class:`Retention` + :returns: an instance for managing the object's retention configuration. + """ + info = self._properties.get("retention", {}) + return Retention.from_api_repr(info, self) + def _get_host_name(connection): """Returns the host name from the given connection. @@ -4797,3 +4809,126 @@ def _add_query_parameters(base_url, name_value_pairs): query = parse_qsl(query) query.extend(name_value_pairs) return urlunsplit((scheme, netloc, path, urlencode(query), frag)) + + +class Retention(dict): + """Map an object's retention configuration. + + :type blob: :class:`Blob` + :params blob: blob for which this retention configuration applies to. + + :type mode: str or ``NoneType`` + :params mode: + (Optional) The mode of the retention configuration, which can be either Unlocked or Locked. + See: https://cloud.google.com/storage/docs/object-lock + + :type retain_until_time: :class:`datetime.datetime` or ``NoneType`` + :params retain_until_time: + (Optional) The earliest time that the object can be deleted or replaced, which is the + retention configuration set for this object. + + :type retention_expiration_time: :class:`datetime.datetime` or ``NoneType`` + :params retention_expiration_time: + (Optional) The earliest time that the object can be deleted, which depends on any + retention configuration set for the object and any retention policy set for the bucket + that contains the object. This value should normally only be set by the back-end API. + """ + + def __init__( + self, + blob, + mode=None, + retain_until_time=None, + retention_expiration_time=None, + ): + data = {"mode": mode} + if retain_until_time is not None: + retain_until_time = _datetime_to_rfc3339(retain_until_time) + data["retainUntilTime"] = retain_until_time + + if retention_expiration_time is not None: + retention_expiration_time = _datetime_to_rfc3339(retention_expiration_time) + data["retentionExpirationTime"] = retention_expiration_time + + super(Retention, self).__init__(data) + self._blob = blob + + @classmethod + def from_api_repr(cls, resource, blob): + """Factory: construct instance from resource. + + :type blob: :class:`Blob` + :params blob: Blob for which this retention configuration applies to. + + :type resource: dict + :param resource: mapping as returned from API call. + + :rtype: :class:`Retention` + :returns: Retention configuration created from resource. + """ + instance = cls(blob) + instance.update(resource) + return instance + + @property + def blob(self): + """Blob for which this retention configuration applies to. + + :rtype: :class:`Blob` + :returns: the instance's blob. + """ + return self._blob + + @property + def mode(self): + """The mode of the retention configuration. Options are 'Unlocked' or 'Locked'. + + :rtype: string + :returns: The mode of the retention configuration, which can be either set to 'Unlocked' or 'Locked'. + """ + return self.get("mode") + + @mode.setter + def mode(self, value): + self["mode"] = value + self.blob._patch_property("retention", self) + + @property + def retain_until_time(self): + """The earliest time that the object can be deleted or replaced, which is the + retention configuration set for this object. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: Datetime object parsed from RFC3339 valid timestamp, or + ``None`` if the blob's resource has not been loaded from + the server (see :meth:`reload`). + """ + value = self.get("retainUntilTime") + if value is not None: + return _rfc3339_nanos_to_datetime(value) + + @retain_until_time.setter + def retain_until_time(self, value): + """Set the retain_until_time for the object retention configuration. + + :type value: :class:`datetime.datetime` + :param value: The earliest time that the object can be deleted or replaced. + """ + if value is not None: + value = _datetime_to_rfc3339(value) + self["retainUntilTime"] = value + self.blob._patch_property("retention", self) + + @property + def retention_expiration_time(self): + """The earliest time that the object can be deleted, which depends on any + retention configuration set for the object and any retention policy set for + the bucket that contains the object. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: + (readonly) The earliest time that the object can be deleted. + """ + retention_expiration_time = self.get("retentionExpirationTime") + if retention_expiration_time is not None: + return _rfc3339_nanos_to_datetime(retention_expiration_time) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index de3b2502e..95017a14d 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -917,6 +917,7 @@ def create( location=None, predefined_acl=None, predefined_default_object_acl=None, + enable_object_retention=False, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): @@ -956,6 +957,11 @@ def create( (Optional) Name of predefined ACL to apply to bucket's objects. See: https://cloud.google.com/storage/docs/access-control/lists#predefined-acl + :type enable_object_retention: bool + :param enable_object_retention: + (Optional) Whether object retention should be enabled on this bucket. See: + https://cloud.google.com/storage/docs/object-lock + :type timeout: float or tuple :param timeout: (Optional) The amount of time, in seconds, to wait @@ -974,6 +980,7 @@ def create( location=location, predefined_acl=predefined_acl, predefined_default_object_acl=predefined_default_object_acl, + enable_object_retention=enable_object_retention, timeout=timeout, retry=retry, ) @@ -2750,6 +2757,18 @@ def autoclass_terminal_storage_class_update_time(self): if timestamp is not None: return _rfc3339_nanos_to_datetime(timestamp) + @property + def object_retention_mode(self): + """Retrieve the object retention mode set on the bucket. + + :rtype: str + :returns: When set to Enabled, retention configurations can be + set on objects in the bucket. + """ + object_retention = self._properties.get("objectRetention") + if object_retention is not None: + return object_retention.get("mode") + def configure_website(self, main_page_suffix=None, not_found_page=None): """Configure website-related properties. diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index eea889f67..69019f218 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -845,6 +845,7 @@ def create_bucket( data_locations=None, predefined_acl=None, predefined_default_object_acl=None, + enable_object_retention=False, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): @@ -883,6 +884,9 @@ def create_bucket( predefined_default_object_acl (str): (Optional) Name of predefined ACL to apply to bucket's objects. See: https://cloud.google.com/storage/docs/access-control/lists#predefined-acl + enable_object_retention (bool): + (Optional) Whether object retention should be enabled on this bucket. See: + https://cloud.google.com/storage/docs/object-lock timeout (Optional[Union[float, Tuple[float, float]]]): The amount of time, in seconds, to wait for the server response. @@ -951,6 +955,9 @@ def create_bucket( if user_project is not None: query_params["userProject"] = user_project + if enable_object_retention: + query_params["enableObjectRetention"] = enable_object_retention + properties = {key: bucket._properties[key] for key in bucket._changes} properties["name"] = bucket.name diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 4c2078f6a..e67e1c24f 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -1117,3 +1117,32 @@ def test_blob_update_storage_class_large_file( blob.update_storage_class(constants.COLDLINE_STORAGE_CLASS) blob.reload() assert blob.storage_class == constants.COLDLINE_STORAGE_CLASS + + +def test_object_retention_lock(storage_client, buckets_to_delete, blobs_to_delete): + # Test bucket created with object retention enabled + new_bucket_name = _helpers.unique_name("object-retention") + created_bucket = _helpers.retry_429_503(storage_client.create_bucket)( + new_bucket_name, enable_object_retention=True + ) + buckets_to_delete.append(created_bucket) + assert created_bucket.object_retention_mode == "Enabled" + + # Test create object with object retention enabled + payload = b"Hello World" + mode = "Unlocked" + current_time = datetime.datetime.utcnow() + expiration_time = current_time + datetime.timedelta(seconds=10) + blob = created_bucket.blob("object-retention-lock") + blob.retention.mode = mode + blob.retention.retain_until_time = expiration_time + blob.upload_from_string(payload) + blobs_to_delete.append(blob) + blob.reload() + assert blob.retention.mode == mode + + # Test patch object to disable object retention + blob.retention.mode = None + blob.retention.retain_until_time = None + blob.patch(override_unlocked_retention=True) + assert blob.retention.mode is None diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index 324705e79..7f05a8d00 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -353,12 +353,14 @@ def test_patch_w_metageneration_match_w_timeout_w_retry(self): retry = mock.Mock(spec=[]) generation_number = 9 metageneration_number = 6 + override_unlocked_retention = True derived.patch( if_generation_match=generation_number, if_metageneration_match=metageneration_number, timeout=timeout, retry=retry, + override_unlocked_retention=override_unlocked_retention, ) self.assertEqual(derived._properties, {"foo": "Foo"}) @@ -370,6 +372,7 @@ def test_patch_w_metageneration_match_w_timeout_w_retry(self): "projection": "full", "ifGenerationMatch": generation_number, "ifMetagenerationMatch": metageneration_number, + "overrideUnlockedRetention": override_unlocked_retention, } client._patch_resource.assert_called_once_with( path, @@ -454,10 +457,12 @@ def test_update_with_metageneration_not_match_w_timeout_w_retry(self): client = derived.client = mock.Mock(spec=["_put_resource"]) client._put_resource.return_value = api_response timeout = 42 + override_unlocked_retention = True derived.update( if_metageneration_not_match=generation_number, timeout=timeout, + override_unlocked_retention=override_unlocked_retention, ) self.assertEqual(derived._properties, {"foo": "Foo"}) @@ -467,6 +472,7 @@ def test_update_with_metageneration_not_match_w_timeout_w_retry(self): expected_query_params = { "projection": "full", "ifMetagenerationNotMatch": generation_number, + "overrideUnlockedRetention": override_unlocked_retention, } client._put_resource.assert_called_once_with( path, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index dcaf3e028..5cd37cae3 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -5925,6 +5925,81 @@ def test_downloads_w_client_custom_headers(self): self.assertIsInstance(called_headers, dict) self.assertLessEqual(custom_headers.items(), called_headers.items()) + def test_object_lock_retention_configuration(self): + from google.cloud.storage.blob import Retention + + BLOB_NAME = "blob-name" + BUCKET = object() + blob = self._make_one(BLOB_NAME, bucket=BUCKET) + + retention = blob.retention + + self.assertIsInstance(retention, Retention) + self.assertIs(retention.blob, blob) + self.assertIsNone(retention.mode) + self.assertIsNone(retention.retain_until_time) + self.assertIsNone(retention.retention_expiration_time) + + def test_object_lock_retention_configuration_w_entry(self): + import datetime + from google.cloud._helpers import _RFC3339_MICROS + from google.cloud._helpers import UTC + from google.cloud.storage.blob import Retention + + now = datetime.datetime.utcnow().replace(tzinfo=UTC) + expiration_time = now + datetime.timedelta(hours=1) + expiration = expiration_time.strftime(_RFC3339_MICROS) + mode = "Locked" + properties = { + "retention": { + "mode": mode, + "retainUntilTime": expiration, + "retentionExpirationTime": expiration, + } + } + BLOB_NAME = "blob-name" + BUCKET = object() + blob = self._make_one(BLOB_NAME, bucket=BUCKET, properties=properties) + retention_config = Retention( + blob=blob, + mode=mode, + retain_until_time=expiration_time, + retention_expiration_time=expiration_time, + ) + + retention = blob.retention + + self.assertIsInstance(retention, Retention) + self.assertEqual(retention, retention_config) + self.assertIs(retention.blob, blob) + self.assertEqual(retention.mode, mode) + self.assertEqual(retention.retain_until_time, expiration_time) + self.assertEqual(retention.retention_expiration_time, expiration_time) + + def test_object_lock_retention_configuration_setter(self): + import datetime + from google.cloud._helpers import UTC + from google.cloud.storage.blob import Retention + + BLOB_NAME = "blob-name" + bucket = _Bucket() + blob = self._make_one(BLOB_NAME, bucket=bucket) + self.assertIsInstance(blob.retention, Retention) + + mode = "Locked" + now = datetime.datetime.utcnow().replace(tzinfo=UTC) + expiration_time = now + datetime.timedelta(hours=1) + retention_config = Retention( + blob=blob, mode=mode, retain_until_time=expiration_time + ) + blob.retention.mode = mode + blob.retention.retain_until_time = expiration_time + self.assertEqual(blob.retention, retention_config) + self.assertIn("retention", blob._changes) + blob.retention.retain_until_time = None + self.assertIsNone(blob.retention.retain_until_time) + self.assertIn("retention", blob._changes) + class Test__quote(unittest.TestCase): @staticmethod diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 8db6a2e62..1b21e097a 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -3000,6 +3000,7 @@ def test_create_w_defaults(self): location=None, predefined_acl=None, predefined_default_object_acl=None, + enable_object_retention=False, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, ) @@ -3011,6 +3012,7 @@ def test_create_w_explicit(self): bucket_name = "bucket-name" predefined_acl = "authenticatedRead" predefined_default_object_acl = "bucketOwnerFullControl" + enable_object_retention = True api_response = {"name": bucket_name} client = mock.Mock(spec=["create_bucket"]) client.create_bucket.return_value = api_response @@ -3025,6 +3027,7 @@ def test_create_w_explicit(self): location=location, predefined_acl=predefined_acl, predefined_default_object_acl=predefined_default_object_acl, + enable_object_retention=enable_object_retention, timeout=timeout, retry=retry, ) @@ -3036,6 +3039,7 @@ def test_create_w_explicit(self): location=location, predefined_acl=predefined_acl, predefined_default_object_acl=predefined_default_object_acl, + enable_object_retention=enable_object_retention, timeout=timeout, retry=retry, ) @@ -3065,6 +3069,14 @@ def test_requester_pays_setter(self): bucket.requester_pays = True self.assertTrue(bucket.requester_pays) + def test_object_retention_mode_getter(self): + bucket = self._make_one() + self.assertIsNone(bucket.object_retention_mode) + mode = "Enabled" + properties = {"objectRetention": {"mode": mode}} + bucket = self._make_one(properties=properties) + self.assertEqual(bucket.object_retention_mode, mode) + def test_configure_website_defaults(self): NAME = "name" UNSET = {"website": {"mainPageSuffix": None, "notFoundPage": None}} diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 4629ecf28..592920d0e 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1614,11 +1614,14 @@ def test_create_bucket_w_extra_properties(self): bucket.requester_pays = True bucket.labels = labels - client.create_bucket(bucket, location=location) + client.create_bucket(bucket, location=location, enable_object_retention=True) expected_path = "/b" expected_data = api_response - expected_query_params = {"project": project} + expected_query_params = { + "project": project, + "enableObjectRetention": True, + } client._post_resource.assert_called_once_with( expected_path, expected_data, From 92c20d3f7520c6b94308ebb156202fdfd1dcd482 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 7 Dec 2023 14:09:20 -0800 Subject: [PATCH 234/509] fix: clarify error message and docstrings in Blob class method (#1196) * fix: clarify error message and docstrings * run docs --- google/cloud/storage/blob.py | 5 +++-- tests/unit/test_blob.py | 2 +- tests/unit/test_client.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 74cdc76e1..47564b6da 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -394,7 +394,8 @@ def from_string(cls, uri, client=None): blob = Blob.from_string("gs://bucket/object", client=client) :type uri: str - :param uri: The blob uri pass to get blob object. + :param uri: The blob uri following a gs://bucket/object pattern. + Both a bucket and object name is required to construct a blob object. :type client: :class:`~google.cloud.storage.client.Client` :param client: @@ -408,7 +409,7 @@ def from_string(cls, uri, client=None): match = _GS_URL_REGEX_PATTERN.match(uri) if not match: - raise ValueError("URI scheme must be gs") + raise ValueError("URI pattern must be gs://bucket/object") bucket = Bucket(client, name=match.group("bucket_name")) return cls(match.group("object_name"), bucket) diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 5cd37cae3..563111ef0 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -5840,7 +5840,7 @@ def test_from_string_w_invalid_uri(self): client = self._make_client() - with pytest.raises(ValueError, match="URI scheme must be gs"): + with pytest.raises(ValueError): Blob.from_string("http://bucket_name/b", client) def test_from_string_w_domain_name_bucket(self): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 592920d0e..9650de976 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1750,7 +1750,7 @@ def test_download_blob_to_file_with_invalid_uri(self): client = self._make_one(project=project, credentials=credentials) file_obj = io.BytesIO() - with pytest.raises(ValueError, match="URI scheme must be gs"): + with pytest.raises(ValueError): client.download_blob_to_file("http://bucket_name/path/to/object", file_obj) def test_download_blob_to_file_w_no_retry(self): From 4392e2fbdfedd15caaec024150249cf882bf47d1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 10 Dec 2023 15:23:53 +0100 Subject: [PATCH 235/509] chore(deps): update dependency pandas to v2.1.4 (#1198) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index f52051872..5f6d54003 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -2,4 +2,4 @@ google-cloud-pubsub==2.18.4 google-cloud-storage==2.13.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' -pandas==2.1.3; python_version >= '3.9' +pandas==2.1.4; python_version >= '3.9' From 412fdbcc4e20a8b5513c49342923265ae2e08cb6 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 11:01:04 -0800 Subject: [PATCH 236/509] chore(main): release 2.14.0 (#1182) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a2f34ecb..d08b71376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.14.0](https://github.com/googleapis/python-storage/compare/v2.13.0...v2.14.0) (2023-12-10) + + +### Features + +* Add support for Python 3.12 ([#1187](https://github.com/googleapis/python-storage/issues/1187)) ([ecf4150](https://github.com/googleapis/python-storage/commit/ecf41504ba7f2a2c2db2e3c7e267686283d2cab3)) +* Support object retention lock ([#1188](https://github.com/googleapis/python-storage/issues/1188)) ([a179337](https://github.com/googleapis/python-storage/commit/a1793375cf038ce79d4d4b7077f6b4dcc4b4aeec)) + + +### Bug Fixes + +* Clarify error message and docstrings in Blob class method ([#1196](https://github.com/googleapis/python-storage/issues/1196)) ([92c20d3](https://github.com/googleapis/python-storage/commit/92c20d3f7520c6b94308ebb156202fdfd1dcd482)) +* Propagate timeout in BlobWriter ([#1186](https://github.com/googleapis/python-storage/issues/1186)) ([22f36da](https://github.com/googleapis/python-storage/commit/22f36da1ce5b04408653ddbdbf35f25ed1072af8)), closes [#1184](https://github.com/googleapis/python-storage/issues/1184) +* Use native namespace to avoid pkg_resources warnings ([#1176](https://github.com/googleapis/python-storage/issues/1176)) ([2ed915e](https://github.com/googleapis/python-storage/commit/2ed915ec4b35df6fad04f42df25e48667148fcf5)) + ## [2.13.0](https://github.com/googleapis/python-storage/compare/v2.12.0...v2.13.0) (2023-10-31) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index b6000e20f..ba8b4e8af 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.13.0" +__version__ = "2.14.0" From 828f529b0870d962ecaaf3b06765ca7b898dc244 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 14 Dec 2023 13:26:33 +0100 Subject: [PATCH 237/509] chore(deps): update all dependencies (#1199) --- samples/snippets/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 5f6d54003..15a684973 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-pubsub==2.18.4 -google-cloud-storage==2.13.0 +google-cloud-pubsub==2.19.0 +google-cloud-storage==2.14.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' pandas==2.1.4; python_version >= '3.9' From 243c5dea5cbd08aa0d4fd993f17ca56d65f2eeda Mon Sep 17 00:00:00 2001 From: Chris Cotter Date: Wed, 3 Jan 2024 19:08:28 -0500 Subject: [PATCH 238/509] chore: fix get RPO sample (#1207) * chore: fix get RPO sample There was an extra line here that doesn't make sense. Fixing based on external user feedback. * Update samples/snippets/storage_get_rpo.py Co-authored-by: cojenco * remove constant import --------- Co-authored-by: cojenco --- samples/snippets/storage_get_rpo.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/samples/snippets/storage_get_rpo.py b/samples/snippets/storage_get_rpo.py index 29ae186fa..ab40ca3a5 100644 --- a/samples/snippets/storage_get_rpo.py +++ b/samples/snippets/storage_get_rpo.py @@ -25,7 +25,6 @@ # [START storage_get_rpo] from google.cloud import storage -from google.cloud.storage.constants import RPO_DEFAULT def get_rpo(bucket_name): @@ -34,9 +33,7 @@ def get_rpo(bucket_name): # bucket_name = "my-bucket" storage_client = storage.Client() - bucket = storage_client.bucket(bucket_name) - - bucket.rpo = RPO_DEFAULT + bucket = storage_client.get_bucket(bucket_name) rpo = bucket.rpo print(f"RPO for {bucket.name} is {rpo}.") From 4e4079506bf66eda2ba98ac002abad3b1d328d24 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 5 Jan 2024 00:06:56 +0100 Subject: [PATCH 239/509] chore(deps): update dependency pytest to v7.4.4 (#1204) Co-authored-by: cojenco --- samples/snippets/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 52e47f6e3..9035a0f91 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,3 @@ -pytest==7.4.3 +pytest==7.4.4 mock==5.1.0 backoff==2.2.1 \ No newline at end of file From a0416a24c6194850177082bec023346b8acd17a6 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:50:21 -0800 Subject: [PATCH 240/509] build(python): fix `docs` and `docfx` builds (#1210) * build(python): fix `docs` and `docfx` builds Source-Link: https://github.com/googleapis/synthtool/commit/fac8444edd5f5526e804c306b766a271772a3e2f Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:5ea6d0ab82c956b50962f91d94e206d3921537ae5fe1549ec5326381d8905cfa * apply googleapis/synthtool#1916 --------- Co-authored-by: Owl Bot Co-authored-by: Cathy Ouyang --- .github/.OwlBot.lock.yaml | 6 +++--- .kokoro/requirements.txt | 6 +++--- noxfile.py | 30 ++++++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index effbde6b0..d8a1bbca7 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -1,4 +1,4 @@ -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:2f155882785883336b4468d5218db737bb1d10c9cea7cb62219ad16fe248c03c -# created: 2023-11-29T14:54:29.548172703Z \ No newline at end of file + digest: sha256:5ea6d0ab82c956b50962f91d94e206d3921537ae5fe1549ec5326381d8905cfa +# created: 2024-01-15T16:32:08.142785673Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index e5c1ffca9..bb3d6ca38 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -263,9 +263,9 @@ jeepney==0.8.0 \ # via # keyring # secretstorage -jinja2==3.1.2 \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 +jinja2==3.1.3 \ + --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ + --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 # via gcp-releasetool keyring==24.2.0 \ --hash=sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6 \ diff --git a/noxfile.py b/noxfile.py index bb79cfa2d..fb3d8f89e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -228,7 +228,20 @@ def docs(session): """Build the docs for this library.""" session.install("-e", ".") - session.install("sphinx==4.0.1", "alabaster", "recommonmark") + session.install( + # We need to pin to specific versions of the `sphinxcontrib-*` packages + # which still support sphinx 4.x. + # See https://github.com/googleapis/sphinx-docfx-yaml/issues/344 + # and https://github.com/googleapis/sphinx-docfx-yaml/issues/345. + "sphinxcontrib-applehelp==1.0.4", + "sphinxcontrib-devhelp==1.0.2", + "sphinxcontrib-htmlhelp==2.0.1", + "sphinxcontrib-qthelp==1.0.3", + "sphinxcontrib-serializinghtml==1.1.5", + "sphinx==4.5.0", + "alabaster", + "recommonmark", + ) shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) session.run( @@ -251,7 +264,20 @@ def docfx(session): session.install("-e", ".") session.install("grpcio") - session.install("gcp-sphinx-docfx-yaml", "alabaster", "recommonmark") + session.install( + # We need to pin to specific versions of the `sphinxcontrib-*` packages + # which still support sphinx 4.x. + # See https://github.com/googleapis/sphinx-docfx-yaml/issues/344 + # and https://github.com/googleapis/sphinx-docfx-yaml/issues/345. + "sphinxcontrib-applehelp==1.0.4", + "sphinxcontrib-devhelp==1.0.2", + "sphinxcontrib-htmlhelp==2.0.1", + "sphinxcontrib-qthelp==1.0.3", + "sphinxcontrib-serializinghtml==1.1.5", + "gcp-sphinx-docfx-yaml", + "alabaster", + "recommonmark", + ) shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) session.run( From f4cf041a5f2075cecf5f4993f8b7afda0476a52b Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 6 Feb 2024 13:22:22 -0800 Subject: [PATCH 241/509] feat: support custom universe domains/TPC (#1212) --- google/cloud/storage/_helpers.py | 51 ++++++++++-- google/cloud/storage/_http.py | 12 ++- google/cloud/storage/_signing.py | 2 +- google/cloud/storage/blob.py | 50 ++++++++---- google/cloud/storage/bucket.py | 40 ++++++--- google/cloud/storage/client.py | 136 +++++++++++++++++++++++++------ setup.py | 4 +- tests/system/_helpers.py | 6 +- tests/system/test__signing.py | 2 +- tests/unit/test__helpers.py | 43 ++++++++-- tests/unit/test__http.py | 5 +- tests/unit/test_batch.py | 7 +- tests/unit/test_blob.py | 38 +++++++-- tests/unit/test_bucket.py | 21 ++++- tests/unit/test_client.py | 94 +++++++++++++++++++-- 15 files changed, 415 insertions(+), 96 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 0fb4e0ff8..7afa43d7d 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -21,6 +21,7 @@ from hashlib import md5 import os from urllib.parse import urlsplit +from urllib.parse import urlunsplit from uuid import uuid4 from google import resumable_media @@ -30,19 +31,24 @@ from google.cloud.storage.retry import DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED -STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" +STORAGE_EMULATOR_ENV_VAR = "STORAGE_EMULATOR_HOST" # Despite name, includes scheme. """Environment variable defining host for Storage emulator.""" -_API_ENDPOINT_OVERRIDE_ENV_VAR = "API_ENDPOINT_OVERRIDE" +_API_ENDPOINT_OVERRIDE_ENV_VAR = "API_ENDPOINT_OVERRIDE" # Includes scheme. """This is an experimental configuration variable. Use api_endpoint instead.""" _API_VERSION_OVERRIDE_ENV_VAR = "API_VERSION_OVERRIDE" """This is an experimental configuration variable used for internal testing.""" -_DEFAULT_STORAGE_HOST = os.getenv( - _API_ENDPOINT_OVERRIDE_ENV_VAR, "https://storage.googleapis.com" +_DEFAULT_UNIVERSE_DOMAIN = "googleapis.com" + +_STORAGE_HOST_TEMPLATE = "storage.{universe_domain}" + +_TRUE_DEFAULT_STORAGE_HOST = _STORAGE_HOST_TEMPLATE.format( + universe_domain=_DEFAULT_UNIVERSE_DOMAIN ) -"""Default storage host for JSON API.""" + +_DEFAULT_SCHEME = "https://" _API_VERSION = os.getenv(_API_VERSION_OVERRIDE_ENV_VAR, "v1") """API version of the default storage host""" @@ -72,8 +78,39 @@ ) -def _get_storage_host(): - return os.environ.get(STORAGE_EMULATOR_ENV_VAR, _DEFAULT_STORAGE_HOST) +def _get_storage_emulator_override(): + return os.environ.get(STORAGE_EMULATOR_ENV_VAR, None) + + +def _get_default_storage_base_url(): + return os.getenv( + _API_ENDPOINT_OVERRIDE_ENV_VAR, _DEFAULT_SCHEME + _TRUE_DEFAULT_STORAGE_HOST + ) + + +def _get_api_endpoint_override(): + """This is an experimental configuration variable. Use api_endpoint instead.""" + if _get_default_storage_base_url() != _DEFAULT_SCHEME + _TRUE_DEFAULT_STORAGE_HOST: + return _get_default_storage_base_url() + return None + + +def _virtual_hosted_style_base_url(url, bucket, trailing_slash=False): + """Returns the scheme and netloc sections of the url, with the bucket + prepended to the netloc. + + Not intended for use with netlocs which include a username and password. + """ + parsed_url = urlsplit(url) + new_netloc = f"{bucket}.{parsed_url.netloc}" + base_url = urlunsplit( + (parsed_url.scheme, new_netloc, "/" if trailing_slash else "", "", "") + ) + return base_url + + +def _use_client_cert(): + return os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true" def _get_environ_project(): diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index fdf1d56b4..b4e16ebe4 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -21,8 +21,14 @@ class Connection(_http.JSONConnection): - """A connection to Google Cloud Storage via the JSON REST API. Mutual TLS feature will be - enabled if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "true". + """A connection to Google Cloud Storage via the JSON REST API. + + Mutual TLS will be enabled if the "GOOGLE_API_USE_CLIENT_CERTIFICATE" + environment variable is set to the exact string "true" (case-sensitive). + + Mutual TLS is not compatible with any API endpoint or universe domain + override at this time. If such settings are enabled along with + "GOOGLE_API_USE_CLIENT_CERTIFICATE", a ValueError will be raised. :type client: :class:`~google.cloud.storage.client.Client` :param client: The client that owns the current connection. @@ -34,7 +40,7 @@ class Connection(_http.JSONConnection): :param api_endpoint: (Optional) api endpoint to use. """ - DEFAULT_API_ENDPOINT = _helpers._DEFAULT_STORAGE_HOST + DEFAULT_API_ENDPOINT = _helpers._get_default_storage_base_url() DEFAULT_API_MTLS_ENDPOINT = "https://storage.mtls.googleapis.com" def __init__(self, client, client_info=None, api_endpoint=None): diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index 1ec61142d..10232ac51 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -466,7 +466,7 @@ def generate_signed_url_v4( ``tzinfo`` set, it will be assumed to be ``UTC``. :type api_access_endpoint: str - :param api_access_endpoint: (Optional) URI base. Defaults to + :param api_access_endpoint: URI base. Defaults to "https://storage.googleapis.com/" :type method: str diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 47564b6da..6cfa56190 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -57,11 +57,12 @@ from google.cloud.storage._helpers import _raise_if_more_than_one_set from google.cloud.storage._helpers import _api_core_retry_to_resumable_media_retry from google.cloud.storage._helpers import _get_default_headers +from google.cloud.storage._helpers import _get_default_storage_base_url from google.cloud.storage._signing import generate_signed_url_v2 from google.cloud.storage._signing import generate_signed_url_v4 from google.cloud.storage._helpers import _NUM_RETRIES_MESSAGE -from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST from google.cloud.storage._helpers import _API_VERSION +from google.cloud.storage._helpers import _virtual_hosted_style_base_url from google.cloud.storage.acl import ACL from google.cloud.storage.acl import ObjectACL from google.cloud.storage.constants import _DEFAULT_TIMEOUT @@ -80,7 +81,6 @@ from google.cloud.storage.fileio import BlobWriter -_API_ACCESS_ENDPOINT = _DEFAULT_STORAGE_HOST _DEFAULT_CONTENT_TYPE = "application/octet-stream" _DOWNLOAD_URL_TEMPLATE = "{hostname}/download/storage/{api_version}{path}?alt=media" _BASE_UPLOAD_TEMPLATE = ( @@ -376,8 +376,12 @@ def public_url(self): :rtype: `string` :returns: The public URL for this blob. """ + if self.client: + endpoint = self.client.api_endpoint + else: + endpoint = _get_default_storage_base_url() return "{storage_base_url}/{bucket_name}/{quoted_name}".format( - storage_base_url=_API_ACCESS_ENDPOINT, + storage_base_url=endpoint, bucket_name=self.bucket.name, quoted_name=_quote(self.name, safe=b"/~"), ) @@ -416,7 +420,7 @@ def from_string(cls, uri, client=None): def generate_signed_url( self, expiration=None, - api_access_endpoint=_API_ACCESS_ENDPOINT, + api_access_endpoint=None, method="GET", content_md5=None, content_type=None, @@ -464,7 +468,9 @@ def generate_signed_url( assumed to be ``UTC``. :type api_access_endpoint: str - :param api_access_endpoint: (Optional) URI base. + :param api_access_endpoint: (Optional) URI base, for instance + "https://storage.googleapis.com". If not specified, the client's + api_endpoint will be used. Incompatible with bucket_bound_hostname. :type method: str :param method: The HTTP verb that will be used when requesting the URL. @@ -537,13 +543,14 @@ def generate_signed_url( :param virtual_hosted_style: (Optional) If true, then construct the URL relative the bucket's virtual hostname, e.g., '.storage.googleapis.com'. + Incompatible with bucket_bound_hostname. :type bucket_bound_hostname: str :param bucket_bound_hostname: - (Optional) If passed, then construct the URL relative to the - bucket-bound hostname. Value can be a bare or with scheme, e.g., - 'example.com' or 'http://example.com'. See: - https://cloud.google.com/storage/docs/request-endpoints#cname + (Optional) If passed, then construct the URL relative to the bucket-bound hostname. + Value can be a bare or with scheme, e.g., 'example.com' or 'http://example.com'. + Incompatible with api_access_endpoint and virtual_hosted_style. + See: https://cloud.google.com/storage/docs/request-endpoints#cname :type scheme: str :param scheme: @@ -551,7 +558,7 @@ def generate_signed_url( hostname, use this value as the scheme. ``https`` will work only when using a CDN. Defaults to ``"http"``. - :raises: :exc:`ValueError` when version is invalid. + :raises: :exc:`ValueError` when version is invalid or mutually exclusive arguments are used. :raises: :exc:`TypeError` when expiration is not a valid type. :raises: :exc:`AttributeError` if credentials is not an instance of :class:`google.auth.credentials.Signing`. @@ -565,25 +572,38 @@ def generate_signed_url( elif version not in ("v2", "v4"): raise ValueError("'version' must be either 'v2' or 'v4'") + if ( + api_access_endpoint is not None or virtual_hosted_style + ) and bucket_bound_hostname: + raise ValueError( + "The bucket_bound_hostname argument is not compatible with " + "either api_access_endpoint or virtual_hosted_style." + ) + + if api_access_endpoint is None: + client = self._require_client(client) + api_access_endpoint = client.api_endpoint + quoted_name = _quote(self.name, safe=b"/~") # If you are on Google Compute Engine, you can't generate a signed URL # using GCE service account. # See https://github.com/googleapis/google-auth-library-python/issues/50 if virtual_hosted_style: - api_access_endpoint = f"https://{self.bucket.name}.storage.googleapis.com" + api_access_endpoint = _virtual_hosted_style_base_url( + api_access_endpoint, self.bucket.name + ) + resource = f"/{quoted_name}" elif bucket_bound_hostname: api_access_endpoint = _bucket_bound_hostname_url( bucket_bound_hostname, scheme ) + resource = f"/{quoted_name}" else: resource = f"/{self.bucket.name}/{quoted_name}" - if virtual_hosted_style or bucket_bound_hostname: - resource = f"/{quoted_name}" - if credentials is None: - client = self._require_client(client) + client = self._require_client(client) # May be redundant, but that's ok. credentials = client._credentials if version == "v2": diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 95017a14d..8f44f07d3 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -36,6 +36,7 @@ from google.cloud.storage._signing import generate_signed_url_v2 from google.cloud.storage._signing import generate_signed_url_v4 from google.cloud.storage._helpers import _bucket_bound_hostname_url +from google.cloud.storage._helpers import _virtual_hosted_style_base_url from google.cloud.storage.acl import BucketACL from google.cloud.storage.acl import DefaultObjectACL from google.cloud.storage.blob import Blob @@ -82,7 +83,6 @@ "valid before the bucket is created. Instead, pass the location " "to `Bucket.create`." ) -_API_ACCESS_ENDPOINT = "https://storage.googleapis.com" def _blobs_page_start(iterator, page, response): @@ -3265,7 +3265,7 @@ def lock_retention_policy( def generate_signed_url( self, expiration=None, - api_access_endpoint=_API_ACCESS_ENDPOINT, + api_access_endpoint=None, method="GET", headers=None, query_parameters=None, @@ -3298,7 +3298,9 @@ def generate_signed_url( ``tzinfo`` set, it will be assumed to be ``UTC``. :type api_access_endpoint: str - :param api_access_endpoint: (Optional) URI base. + :param api_access_endpoint: (Optional) URI base, for instance + "https://storage.googleapis.com". If not specified, the client's + api_endpoint will be used. Incompatible with bucket_bound_hostname. :type method: str :param method: The HTTP verb that will be used when requesting the URL. @@ -3322,7 +3324,6 @@ def generate_signed_url( :param client: (Optional) The client to use. If not passed, falls back to the ``client`` stored on the blob's bucket. - :type credentials: :class:`google.auth.credentials.Credentials` or :class:`NoneType` :param credentials: The authorization credentials to attach to requests. @@ -3338,11 +3339,13 @@ def generate_signed_url( :param virtual_hosted_style: (Optional) If true, then construct the URL relative the bucket's virtual hostname, e.g., '.storage.googleapis.com'. + Incompatible with bucket_bound_hostname. :type bucket_bound_hostname: str :param bucket_bound_hostname: - (Optional) If pass, then construct the URL relative to the bucket-bound hostname. - Value cane be a bare or with scheme, e.g., 'example.com' or 'http://example.com'. + (Optional) If passed, then construct the URL relative to the bucket-bound hostname. + Value can be a bare or with scheme, e.g., 'example.com' or 'http://example.com'. + Incompatible with api_access_endpoint and virtual_hosted_style. See: https://cloud.google.com/storage/docs/request-endpoints#cname :type scheme: str @@ -3351,7 +3354,7 @@ def generate_signed_url( this value as the scheme. ``https`` will work only when using a CDN. Defaults to ``"http"``. - :raises: :exc:`ValueError` when version is invalid. + :raises: :exc:`ValueError` when version is invalid or mutually exclusive arguments are used. :raises: :exc:`TypeError` when expiration is not a valid type. :raises: :exc:`AttributeError` if credentials is not an instance of :class:`google.auth.credentials.Signing`. @@ -3365,23 +3368,36 @@ def generate_signed_url( elif version not in ("v2", "v4"): raise ValueError("'version' must be either 'v2' or 'v4'") + if ( + api_access_endpoint is not None or virtual_hosted_style + ) and bucket_bound_hostname: + raise ValueError( + "The bucket_bound_hostname argument is not compatible with " + "either api_access_endpoint or virtual_hosted_style." + ) + + if api_access_endpoint is None: + client = self._require_client(client) + api_access_endpoint = client.api_endpoint + # If you are on Google Compute Engine, you can't generate a signed URL # using GCE service account. # See https://github.com/googleapis/google-auth-library-python/issues/50 if virtual_hosted_style: - api_access_endpoint = f"https://{self.name}.storage.googleapis.com" + api_access_endpoint = _virtual_hosted_style_base_url( + api_access_endpoint, self.name + ) + resource = "/" elif bucket_bound_hostname: api_access_endpoint = _bucket_bound_hostname_url( bucket_bound_hostname, scheme ) + resource = "/" else: resource = f"/{self.name}" - if virtual_hosted_style or bucket_bound_hostname: - resource = "/" - if credentials is None: - client = self._require_client(client) + client = self._require_client(client) # May be redundant, but that's ok. credentials = client._credentials if version == "v2": diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 69019f218..2fcdaecd8 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -31,9 +31,14 @@ from google.cloud.exceptions import NotFound from google.cloud.storage._helpers import _get_environ_project -from google.cloud.storage._helpers import _get_storage_host -from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST +from google.cloud.storage._helpers import _use_client_cert +from google.cloud.storage._helpers import _get_storage_emulator_override +from google.cloud.storage._helpers import _get_api_endpoint_override +from google.cloud.storage._helpers import _STORAGE_HOST_TEMPLATE from google.cloud.storage._helpers import _bucket_bound_hostname_url +from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN +from google.cloud.storage._helpers import _DEFAULT_SCHEME +from google.cloud.storage._helpers import _virtual_hosted_style_base_url from google.cloud.storage._http import Connection from google.cloud.storage._signing import ( @@ -87,7 +92,7 @@ class Client(ClientWithProject): :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` :param client_options: (Optional) Client options used to set user options on the client. - API Endpoint should be set through client_options. + A non-default universe domain or api endpoint should be set through client_options. :type use_auth_w_custom_endpoint: bool :param use_auth_w_custom_endpoint: @@ -135,32 +140,79 @@ def __init__( self._initial_client_options = client_options self._extra_headers = extra_headers - kw_args = {"client_info": client_info} - - # `api_endpoint` should be only set by the user via `client_options`, - # or if the _get_storage_host() returns a non-default value (_is_emulator_set). - # `api_endpoint` plays an important role for mTLS, if it is not set, - # then mTLS logic will be applied to decide which endpoint will be used. - storage_host = _get_storage_host() - _is_emulator_set = storage_host != _DEFAULT_STORAGE_HOST - kw_args["api_endpoint"] = storage_host if _is_emulator_set else None + connection_kw_args = {"client_info": client_info} if client_options: if isinstance(client_options, dict): client_options = google.api_core.client_options.from_dict( client_options ) - if client_options.api_endpoint: - api_endpoint = client_options.api_endpoint - kw_args["api_endpoint"] = api_endpoint + + if client_options and client_options.universe_domain: + self._universe_domain = client_options.universe_domain + else: + self._universe_domain = None + + storage_emulator_override = _get_storage_emulator_override() + api_endpoint_override = _get_api_endpoint_override() + + # Determine the api endpoint. The rules are as follows: + + # 1. If the `api_endpoint` is set in `client_options`, use that as the + # endpoint. + if client_options and client_options.api_endpoint: + api_endpoint = client_options.api_endpoint + + # 2. Elif the "STORAGE_EMULATOR_HOST" env var is set, then use that as the + # endpoint. + elif storage_emulator_override: + api_endpoint = storage_emulator_override + + # 3. Elif the "API_ENDPOINT_OVERRIDE" env var is set, then use that as the + # endpoint. + elif api_endpoint_override: + api_endpoint = api_endpoint_override + + # 4. Elif the `universe_domain` is set in `client_options`, + # create the endpoint using that as the default. + # + # Mutual TLS is not compatible with a non-default universe domain + # at this time. If such settings are enabled along with the + # "GOOGLE_API_USE_CLIENT_CERTIFICATE" env variable, a ValueError will + # be raised. + + elif self._universe_domain: + # The final decision of whether to use mTLS takes place in + # google-auth-library-python. We peek at the environment variable + # here only to issue an exception in case of a conflict. + if _use_client_cert(): + raise ValueError( + 'The "GOOGLE_API_USE_CLIENT_CERTIFICATE" env variable is ' + 'set to "true" and a non-default universe domain is ' + "configured. mTLS is not supported in any universe other than" + "googleapis.com." + ) + api_endpoint = _DEFAULT_SCHEME + _STORAGE_HOST_TEMPLATE.format( + universe_domain=self._universe_domain + ) + + # 5. Else, use the default, which is to use the default + # universe domain of "googleapis.com" and create the endpoint + # "storage.googleapis.com" from that. + else: + api_endpoint = None + + connection_kw_args["api_endpoint"] = api_endpoint + + self._is_emulator_set = True if storage_emulator_override else False # If a custom endpoint is set, the client checks for credentials # or finds the default credentials based on the current environment. # Authentication may be bypassed under certain conditions: # (1) STORAGE_EMULATOR_HOST is set (for backwards compatibility), OR # (2) use_auth_w_custom_endpoint is set to False. - if kw_args["api_endpoint"] is not None: - if _is_emulator_set or not use_auth_w_custom_endpoint: + if connection_kw_args["api_endpoint"] is not None: + if self._is_emulator_set or not use_auth_w_custom_endpoint: if credentials is None: credentials = AnonymousCredentials() if project is None: @@ -176,11 +228,24 @@ def __init__( _http=_http, ) + # Validate that the universe domain of the credentials matches the + # universe domain of the client. + if self._credentials.universe_domain != self.universe_domain: + raise ValueError( + "The configured universe domain ({client_ud}) does not match " + "the universe domain found in the credentials ({cred_ud}). If " + "you haven't configured the universe domain explicitly, " + "`googleapis.com` is the default.".format( + client_ud=self.universe_domain, + cred_ud=self._credentials.universe_domain, + ) + ) + if no_project: self.project = None # Pass extra_headers to Connection - connection = Connection(self, **kw_args) + connection = Connection(self, **connection_kw_args) connection.extra_headers = extra_headers self._connection = connection self._batch_stack = _LocalStack() @@ -201,6 +266,14 @@ def create_anonymous_client(cls): client.project = None return client + @property + def universe_domain(self): + return self._universe_domain or _DEFAULT_UNIVERSE_DOMAIN + + @property + def api_endpoint(self): + return self._connection.API_BASE_URL + @property def _connection(self): """Get connection or batch on the client. @@ -922,8 +995,7 @@ def create_bucket( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - _is_emulator_set = _get_storage_host() != _DEFAULT_STORAGE_HOST - if _is_emulator_set: + if self._is_emulator_set: if project is None: project = _get_environ_project() if project is None: @@ -1338,8 +1410,7 @@ def list_buckets( project = self.project # Use no project if STORAGE_EMULATOR_HOST is set - _is_emulator_set = _get_storage_host() != _DEFAULT_STORAGE_HOST - if _is_emulator_set: + if self._is_emulator_set: if project is None: project = _get_environ_project() if project is None: @@ -1574,13 +1645,16 @@ def generate_signed_post_policy_v4( key to sign text. :type virtual_hosted_style: bool - :param virtual_hosted_style: (Optional) If True, construct the URL relative to the bucket - virtual hostname, e.g., '.storage.googleapis.com'. + :param virtual_hosted_style: + (Optional) If True, construct the URL relative to the bucket + virtual hostname, e.g., '.storage.googleapis.com'. + Incompatible with bucket_bound_hostname. :type bucket_bound_hostname: str :param bucket_bound_hostname: (Optional) If passed, construct the URL relative to the bucket-bound hostname. Value can be bare or with a scheme, e.g., 'example.com' or 'http://example.com'. + Incompatible with virtual_hosted_style. See: https://cloud.google.com/storage/docs/request-endpoints#cname :type scheme: str @@ -1595,9 +1669,17 @@ def generate_signed_post_policy_v4( :type access_token: str :param access_token: (Optional) Access token for a service account. + :raises: :exc:`ValueError` when mutually exclusive arguments are used. + :rtype: dict :returns: Signed POST policy. """ + if virtual_hosted_style and bucket_bound_hostname: + raise ValueError( + "Only one of virtual_hosted_style and bucket_bound_hostname " + "can be specified." + ) + credentials = self._credentials if credentials is None else credentials ensure_signed_credentials(credentials) @@ -1669,11 +1751,13 @@ def generate_signed_post_policy_v4( ) # designate URL if virtual_hosted_style: - url = f"https://{bucket_name}.storage.googleapis.com/" + url = _virtual_hosted_style_base_url( + self.api_endpoint, bucket_name, trailing_slash=True + ) elif bucket_bound_hostname: url = f"{_bucket_bound_hostname_url(bucket_bound_hostname, scheme)}/" else: - url = f"https://storage.googleapis.com/{bucket_name}/" + url = f"{self.api_endpoint}/{bucket_name}/" return {"url": url, "fields": policy_fields} diff --git a/setup.py b/setup.py index fa0200cdf..b2f5e411e 100644 --- a/setup.py +++ b/setup.py @@ -28,8 +28,8 @@ # 'Development Status :: 5 - Production/Stable' release_status = "Development Status :: 5 - Production/Stable" dependencies = [ - "google-auth >= 2.23.3, < 3.0dev", - "google-api-core >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", + "google-auth >= 2.26.1, < 3.0dev", + "google-api-core >= 2.15.0, <3.0.0dev", "google-cloud-core >= 2.3.0, < 3.0dev", "google-resumable-media >= 2.6.0", "requests >= 2.18.0, < 3.0.0dev", diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index e298d7932..a044c4ca8 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -20,7 +20,7 @@ from test_utils.retry import RetryErrors from test_utils.retry import RetryInstanceState from test_utils.system import unique_resource_id -from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST +from google.cloud.storage._helpers import _get_default_storage_base_url retry_429 = RetryErrors(exceptions.TooManyRequests) retry_429_harder = RetryErrors(exceptions.TooManyRequests, max_tries=10) @@ -32,7 +32,9 @@ user_project = os.environ.get("GOOGLE_CLOUD_TESTS_USER_PROJECT") testing_mtls = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true" signing_blob_content = b"This time for sure, Rocky!" -is_api_endpoint_override = _DEFAULT_STORAGE_HOST != "https://storage.googleapis.com" +is_api_endpoint_override = ( + _get_default_storage_base_url() != "https://storage.googleapis.com" +) def _bad_copy(bad_request): diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index 26d73e543..30a898e11 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -45,7 +45,7 @@ def _create_signed_list_blobs_url_helper( method=method, client=client, version=version, - api_access_endpoint=_helpers._DEFAULT_STORAGE_HOST, + api_access_endpoint=_helpers._get_default_storage_base_url(), ) response = requests.get(signed_url) diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index 7f05a8d00..401e0dd15 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -22,20 +22,18 @@ GCCL_INVOCATION_TEST_CONST = "gccl-invocation-id/test-invocation-123" -class Test__get_storage_host(unittest.TestCase): +class Test__get_storage_emulator_override(unittest.TestCase): @staticmethod def _call_fut(): - from google.cloud.storage._helpers import _get_storage_host + from google.cloud.storage._helpers import _get_storage_emulator_override - return _get_storage_host() + return _get_storage_emulator_override() def test_wo_env_var(self): - from google.cloud.storage._helpers import _DEFAULT_STORAGE_HOST - with mock.patch("os.environ", {}): - host = self._call_fut() + override = self._call_fut() - self.assertEqual(host, _DEFAULT_STORAGE_HOST) + self.assertIsNone(override) def test_w_env_var(self): from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR @@ -43,9 +41,36 @@ def test_w_env_var(self): HOST = "https://api.example.com" with mock.patch("os.environ", {STORAGE_EMULATOR_ENV_VAR: HOST}): - host = self._call_fut() + emu = self._call_fut() + + self.assertEqual(emu, HOST) + + +class Test__get_api_endpoint_override(unittest.TestCase): + @staticmethod + def _call_fut(): + from google.cloud.storage._helpers import _get_api_endpoint_override + + return _get_api_endpoint_override() + + def test_wo_env_var(self): + from google.cloud.storage._helpers import _TRUE_DEFAULT_STORAGE_HOST + from google.cloud.storage._helpers import _DEFAULT_SCHEME + + with mock.patch("os.environ", {}): + override = self._call_fut() + + self.assertIsNone(override, _DEFAULT_SCHEME + _TRUE_DEFAULT_STORAGE_HOST) + + def test_w_env_var(self): + from google.cloud.storage._helpers import _API_ENDPOINT_OVERRIDE_ENV_VAR + + BASE_URL = "https://api.example.com" + + with mock.patch("os.environ", {_API_ENDPOINT_OVERRIDE_ENV_VAR: BASE_URL}): + override = self._call_fut() - self.assertEqual(host, HOST) + self.assertEqual(override, BASE_URL) class Test__get_environ_project(unittest.TestCase): diff --git a/tests/unit/test__http.py b/tests/unit/test__http.py index 3ea3ed1a4..33ff1a890 100644 --- a/tests/unit/test__http.py +++ b/tests/unit/test__http.py @@ -89,7 +89,10 @@ def test_metadata_op_has_client_custom_headers(self): response._content = data http.is_mtls = False http.request.return_value = response - credentials = mock.Mock(spec=google.auth.credentials.Credentials) + credentials = mock.Mock( + spec=google.auth.credentials.Credentials, + universe_domain=_helpers._DEFAULT_UNIVERSE_DOMAIN, + ) client = Client( project="project", credentials=credentials, diff --git a/tests/unit/test_batch.py b/tests/unit/test_batch.py index c1f6bad9a..3070af956 100644 --- a/tests/unit/test_batch.py +++ b/tests/unit/test_batch.py @@ -20,11 +20,16 @@ import mock import requests +from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN + def _make_credentials(): import google.auth.credentials - return mock.Mock(spec=google.auth.credentials.Credentials) + return mock.Mock( + spec=google.auth.credentials.Credentials, + universe_domain=_DEFAULT_UNIVERSE_DOMAIN, + ) def _make_response(status=http.client.OK, content=b"", headers={}): diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 563111ef0..805dae741 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -29,6 +29,8 @@ from google.cloud.storage import _helpers from google.cloud.storage._helpers import _get_default_headers +from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN +from google.cloud.storage._helpers import _get_default_storage_base_url from google.cloud.storage.retry import ( DEFAULT_RETRY, DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED, @@ -64,6 +66,7 @@ def _get_default_timeout(): def _make_client(*args, **kw): from google.cloud.storage.client import Client + kw["api_endpoint"] = kw.get("api_endpoint") or _get_default_storage_base_url() return mock.create_autospec(Client, instance=True, **kw) def test_ctor_wo_encryption_key(self): @@ -426,6 +429,15 @@ def test_public_url_with_non_ascii(self): expected_url = "https://storage.googleapis.com/name/winter%20%E2%98%83" self.assertEqual(blob.public_url, expected_url) + def test_public_url_without_client(self): + BLOB_NAME = "blob-name" + bucket = _Bucket() + bucket.client = None + blob = self._make_one(BLOB_NAME, bucket=bucket) + self.assertEqual( + blob.public_url, f"https://storage.googleapis.com/name/{BLOB_NAME}" + ) + def test_generate_signed_url_w_invalid_version(self): BLOB_NAME = "blob-name" EXPIRATION = "2014-10-16T20:34:37.000Z" @@ -461,11 +473,9 @@ def _generate_signed_url_helper( from urllib import parse from google.cloud._helpers import UTC from google.cloud.storage._helpers import _bucket_bound_hostname_url - from google.cloud.storage.blob import _API_ACCESS_ENDPOINT + from google.cloud.storage._helpers import _get_default_storage_base_url from google.cloud.storage.blob import _get_encryption_headers - api_access_endpoint = api_access_endpoint or _API_ACCESS_ENDPOINT - delta = datetime.timedelta(hours=1) if expiration is None: @@ -522,7 +532,11 @@ def _generate_signed_url_helper( bucket_bound_hostname, scheme ) else: - expected_api_access_endpoint = api_access_endpoint + expected_api_access_endpoint = ( + api_access_endpoint + if api_access_endpoint + else _get_default_storage_base_url() + ) expected_resource = f"/{bucket.name}/{quoted_name}" if virtual_hosted_style or bucket_bound_hostname: @@ -694,6 +708,17 @@ def test_generate_signed_url_v4_w_credentials(self): credentials = object() self._generate_signed_url_v4_helper(credentials=credentials) + def test_generate_signed_url_v4_w_incompatible_params(self): + with self.assertRaises(ValueError): + self._generate_signed_url_v4_helper( + api_access_endpoint="example.com", + bucket_bound_hostname="cdn.example.com", + ) + with self.assertRaises(ValueError): + self._generate_signed_url_v4_helper( + virtual_hosted_style=True, bucket_bound_hostname="cdn.example.com" + ) + def test_exists_miss_w_defaults(self): from google.cloud.exceptions import NotFound @@ -5905,7 +5930,10 @@ def test_downloads_w_client_custom_headers(self): "x-goog-custom-audit-foo": "bar", "x-goog-custom-audit-user": "baz", } - credentials = mock.Mock(spec=google.auth.credentials.Credentials) + credentials = mock.Mock( + spec=google.auth.credentials.Credentials, + universe_domain=_DEFAULT_UNIVERSE_DOMAIN, + ) client = Client( project="project", credentials=credentials, extra_headers=custom_headers ) diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 1b21e097a..642b09158 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -27,6 +27,7 @@ from google.cloud.storage.constants import PUBLIC_ACCESS_PREVENTION_UNSPECIFIED from google.cloud.storage.constants import RPO_DEFAULT from google.cloud.storage.constants import RPO_ASYNC_TURBO +from google.cloud.storage._helpers import _get_default_storage_base_url def _create_signing_credentials(): @@ -608,6 +609,7 @@ def _get_default_timeout(): def _make_client(**kw): from google.cloud.storage.client import Client + kw["api_endpoint"] = kw.get("api_endpoint") or _get_default_storage_base_url() return mock.create_autospec(Client, instance=True, **kw) def _make_one(self, client=None, name=None, properties=None, user_project=None): @@ -4058,9 +4060,7 @@ def _generate_signed_url_helper( from urllib import parse from google.cloud._helpers import UTC from google.cloud.storage._helpers import _bucket_bound_hostname_url - from google.cloud.storage.blob import _API_ACCESS_ENDPOINT - - api_access_endpoint = api_access_endpoint or _API_ACCESS_ENDPOINT + from google.cloud.storage._helpers import _get_default_storage_base_url delta = datetime.timedelta(hours=1) @@ -4108,7 +4108,9 @@ def _generate_signed_url_helper( bucket_bound_hostname, scheme ) else: - expected_api_access_endpoint = api_access_endpoint + expected_api_access_endpoint = ( + api_access_endpoint or _get_default_storage_base_url() + ) expected_resource = f"/{parse.quote(bucket_name)}" if virtual_hosted_style or bucket_bound_hostname: @@ -4258,6 +4260,17 @@ def test_generate_signed_url_v4_w_bucket_bound_hostname_w_scheme(self): def test_generate_signed_url_v4_w_bucket_bound_hostname_w_bare_hostname(self): self._generate_signed_url_v4_helper(bucket_bound_hostname="cdn.example.com") + def test_generate_signed_url_v4_w_incompatible_params(self): + with self.assertRaises(ValueError): + self._generate_signed_url_v4_helper( + api_access_endpoint="example.com", + bucket_bound_hostname="cdn.example.com", + ) + with self.assertRaises(ValueError): + self._generate_signed_url_v4_helper( + virtual_hosted_style=True, bucket_bound_hostname="cdn.example.com" + ) + class Test__item_to_notification(unittest.TestCase): def _call_fut(self, iterator, item): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 9650de976..8e1130227 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -30,7 +30,9 @@ from google.cloud.storage import _helpers from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR +from google.cloud.storage._helpers import _API_ENDPOINT_OVERRIDE_ENV_VAR from google.cloud.storage._helpers import _get_default_headers +from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN from google.cloud.storage._http import Connection from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED @@ -45,13 +47,19 @@ _FAKE_CREDENTIALS = Credentials.from_service_account_info(_SERVICE_ACCOUNT_JSON) -def _make_credentials(project=None): +def _make_credentials(project=None, universe_domain=_DEFAULT_UNIVERSE_DOMAIN): import google.auth.credentials if project is not None: - return mock.Mock(spec=google.auth.credentials.Credentials, project_id=project) + return mock.Mock( + spec=google.auth.credentials.Credentials, + project_id=project, + universe_domain=universe_domain, + ) - return mock.Mock(spec=google.auth.credentials.Credentials) + return mock.Mock( + spec=google.auth.credentials.Credentials, universe_domain=universe_domain + ) def _create_signing_credentials(): @@ -62,7 +70,9 @@ class _SigningCredentials( ): pass - credentials = mock.Mock(spec=_SigningCredentials) + credentials = mock.Mock( + spec=_SigningCredentials, universe_domain=_DEFAULT_UNIVERSE_DOMAIN + ) credentials.sign_bytes = mock.Mock(return_value=b"Signature_bytes") credentials.signer_email = "test@mail.com" return credentials @@ -162,22 +172,63 @@ def test_ctor_w_client_options_dict(self): ) self.assertEqual(client._connection.API_BASE_URL, api_endpoint) + self.assertEqual(client.api_endpoint, api_endpoint) def test_ctor_w_client_options_object(self): from google.api_core.client_options import ClientOptions PROJECT = "PROJECT" credentials = _make_credentials() - client_options = ClientOptions(api_endpoint="https://www.foo-googleapis.com") + api_endpoint = "https://www.foo-googleapis.com" + client_options = ClientOptions(api_endpoint=api_endpoint) client = self._make_one( project=PROJECT, credentials=credentials, client_options=client_options ) - self.assertEqual( - client._connection.API_BASE_URL, "https://www.foo-googleapis.com" + self.assertEqual(client._connection.API_BASE_URL, api_endpoint) + self.assertEqual(client.api_endpoint, api_endpoint) + + def test_ctor_w_universe_domain_and_matched_credentials(self): + PROJECT = "PROJECT" + universe_domain = "example.com" + expected_api_endpoint = f"https://storage.{universe_domain}" + credentials = _make_credentials(universe_domain=universe_domain) + client_options = {"universe_domain": universe_domain} + + client = self._make_one( + project=PROJECT, credentials=credentials, client_options=client_options ) + self.assertEqual(client._connection.API_BASE_URL, expected_api_endpoint) + self.assertEqual(client.api_endpoint, expected_api_endpoint) + self.assertEqual(client.universe_domain, universe_domain) + + def test_ctor_w_universe_domain_and_mismatched_credentials(self): + PROJECT = "PROJECT" + universe_domain = "example.com" + credentials = _make_credentials() # default universe domain + client_options = {"universe_domain": universe_domain} + + with self.assertRaises(ValueError): + self._make_one( + project=PROJECT, credentials=credentials, client_options=client_options + ) + + def test_ctor_w_universe_domain_and_mtls(self): + PROJECT = "PROJECT" + universe_domain = "example.com" + client_options = {"universe_domain": universe_domain} + + credentials = _make_credentials( + project=PROJECT, universe_domain=universe_domain + ) + + environ = {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"} + with mock.patch("os.environ", environ): + with self.assertRaises(ValueError): + self._make_one(credentials=credentials, client_options=client_options) + def test_ctor_w_custom_headers(self): PROJECT = "PROJECT" credentials = _make_credentials() @@ -330,6 +381,16 @@ def test_ctor_w_emulator_w_credentials(self): self.assertEqual(client._connection.API_BASE_URL, host) self.assertIs(client._connection.credentials, credentials) + def test_ctor_w_api_endpoint_override(self): + host = "http://localhost:8080" + environ = {_API_ENDPOINT_OVERRIDE_ENV_VAR: host} + project = "my-test-project" + with mock.patch("os.environ", environ): + client = self._make_one(project=project) + + self.assertEqual(client.project, project) + self.assertEqual(client._connection.API_BASE_URL, host) + def test_create_anonymous_client(self): klass = self._get_target_class() client = klass.create_anonymous_client() @@ -2677,6 +2738,25 @@ def test_get_signed_policy_v4_bucket_bound_hostname(self): ) self.assertEqual(policy["url"], "https://bucket.bound_hostname/") + def test_get_signed_policy_v4_with_conflicting_arguments(self): + import datetime + + project = "PROJECT" + credentials = _make_credentials(project=project) + client = self._make_one(credentials=credentials) + + dtstamps_patch, _, _ = _time_functions_patches() + with dtstamps_patch: + with self.assertRaises(ValueError): + client.generate_signed_post_policy_v4( + "bucket-name", + "object-name", + expiration=datetime.datetime(2020, 3, 12), + bucket_bound_hostname="https://bucket.bound_hostname", + virtual_hosted_style=True, + credentials=_create_signing_credentials(), + ) + def test_get_signed_policy_v4_bucket_bound_hostname_with_scheme(self): import datetime From 8d8a53a1368392ad7a1c4352f559c12932c5a9c9 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 6 Feb 2024 15:37:10 -0800 Subject: [PATCH 242/509] fix: remove utcnow usage (#1215) * fix: replace utcnow in Bucket * replace utcnow in signing * update constant and tests * update datetime in post policy * replace utcnow in system tests * replace tzinfo --- google/cloud/storage/_helpers.py | 7 ++++ google/cloud/storage/_signing.py | 13 +++--- google/cloud/storage/bucket.py | 5 ++- google/cloud/storage/client.py | 16 +++---- tests/system/test__signing.py | 16 ++++--- tests/system/test_blob.py | 5 ++- tests/system/test_hmac_key_metadata.py | 7 ++-- tests/system/test_transfer_manager.py | 6 +-- tests/unit/test__signing.py | 58 ++++++++++++-------------- tests/unit/test_blob.py | 49 +++++++--------------- tests/unit/test_bucket.py | 43 ++++++------------- tests/unit/test_client.py | 8 ++-- tests/unit/test_hmac_key.py | 16 +++---- tests/unit/test_transfer_manager.py | 4 +- 14 files changed, 114 insertions(+), 139 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 7afa43d7d..6f8702050 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -18,6 +18,7 @@ """ import base64 +import datetime from hashlib import md5 import os from urllib.parse import urlsplit @@ -77,6 +78,12 @@ "object, or None, instead." ) +# _NOW() returns the current local date and time. +# It is preferred to use timezone-aware datetimes _NOW(_UTC), +# which returns the current UTC date and time. +_NOW = datetime.datetime.now +_UTC = datetime.timezone.utc + def _get_storage_emulator_override(): return os.environ.get(STORAGE_EMULATOR_ENV_VAR, None) diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index 10232ac51..ecf110769 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -28,9 +28,13 @@ from google.auth import exceptions from google.auth.transport import requests from google.cloud import _helpers +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC -NOW = datetime.datetime.utcnow # To be replaced by tests. +# `google.cloud.storage._signing.NOW` is deprecated. +# Use `_NOW(_UTC)` instead. +NOW = datetime.datetime.utcnow SERVICE_ACCOUNT_URL = ( "https://googleapis.dev/python/google-api-core/latest/" @@ -103,7 +107,7 @@ def get_expiration_seconds_v2(expiration): """ # If it's a timedelta, add it to `now` in UTC. if isinstance(expiration, datetime.timedelta): - now = NOW().replace(tzinfo=_helpers.UTC) + now = _NOW(_UTC) expiration = now + expiration # If it's a datetime, convert to a timestamp. @@ -141,7 +145,7 @@ def get_expiration_seconds_v4(expiration): "timedelta. Got %s" % type(expiration) ) - now = NOW().replace(tzinfo=_helpers.UTC) + now = _NOW(_UTC) if isinstance(expiration, int): seconds = expiration @@ -149,7 +153,6 @@ def get_expiration_seconds_v4(expiration): if isinstance(expiration, datetime.datetime): if expiration.tzinfo is None: expiration = expiration.replace(tzinfo=_helpers.UTC) - expiration = expiration - now if isinstance(expiration, datetime.timedelta): @@ -638,7 +641,7 @@ def get_v4_now_dtstamps(): :rtype: str, str :returns: Current timestamp, datestamp. """ - now = NOW() + now = _NOW(_UTC).replace(tzinfo=None) timestamp = now.strftime("%Y%m%dT%H%M%SZ") datestamp = now.date().strftime("%Y%m%d") return timestamp, datestamp diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 8f44f07d3..215e9ea20 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -23,14 +23,15 @@ from google.api_core import datetime_helpers from google.cloud._helpers import _datetime_to_rfc3339 -from google.cloud._helpers import _NOW from google.cloud._helpers import _rfc3339_nanos_to_datetime from google.cloud.exceptions import NotFound from google.api_core.iam import Policy from google.cloud.storage import _signing from google.cloud.storage._helpers import _add_etag_match_headers from google.cloud.storage._helpers import _add_generation_match_parameters +from google.cloud.storage._helpers import _NOW from google.cloud.storage._helpers import _PropertyMixin +from google.cloud.storage._helpers import _UTC from google.cloud.storage._helpers import _scalar_property from google.cloud.storage._helpers import _validate_name from google.cloud.storage._signing import generate_signed_url_v2 @@ -3186,7 +3187,7 @@ def generate_upload_policy(self, conditions, expiration=None, client=None): _signing.ensure_signed_credentials(credentials) if expiration is None: - expiration = _NOW() + datetime.timedelta(hours=1) + expiration = _NOW(_UTC).replace(tzinfo=None) + datetime.timedelta(hours=1) conditions = conditions + [{"bucket": self.name}] diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 2fcdaecd8..e051b9750 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -26,19 +26,21 @@ from google.auth.credentials import AnonymousCredentials from google.api_core import page_iterator -from google.cloud._helpers import _LocalStack, _NOW +from google.cloud._helpers import _LocalStack from google.cloud.client import ClientWithProject from google.cloud.exceptions import NotFound +from google.cloud.storage._helpers import _bucket_bound_hostname_url +from google.cloud.storage._helpers import _get_api_endpoint_override from google.cloud.storage._helpers import _get_environ_project -from google.cloud.storage._helpers import _use_client_cert from google.cloud.storage._helpers import _get_storage_emulator_override -from google.cloud.storage._helpers import _get_api_endpoint_override -from google.cloud.storage._helpers import _STORAGE_HOST_TEMPLATE -from google.cloud.storage._helpers import _bucket_bound_hostname_url +from google.cloud.storage._helpers import _use_client_cert +from google.cloud.storage._helpers import _virtual_hosted_style_base_url from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN from google.cloud.storage._helpers import _DEFAULT_SCHEME -from google.cloud.storage._helpers import _virtual_hosted_style_base_url +from google.cloud.storage._helpers import _STORAGE_HOST_TEMPLATE +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC from google.cloud.storage._http import Connection from google.cloud.storage._signing import ( @@ -1707,7 +1709,7 @@ def generate_signed_post_policy_v4( conditions += required_conditions # calculate policy expiration time - now = _NOW() + now = _NOW(_UTC).replace(tzinfo=None) if expiration is None: expiration = now + datetime.timedelta(hours=1) diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index 30a898e11..94930739e 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -22,6 +22,8 @@ from google.api_core import path_template from google.cloud import iam_credentials_v1 +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC from . import _helpers @@ -63,7 +65,7 @@ def test_create_signed_list_blobs_url_v2(storage_client, signing_bucket, no_mtls def test_create_signed_list_blobs_url_v2_w_expiration( storage_client, signing_bucket, no_mtls ): - now = datetime.datetime.utcnow() + now = _NOW(_UTC).replace(tzinfo=None) delta = datetime.timedelta(seconds=10) _create_signed_list_blobs_url_helper( @@ -85,7 +87,7 @@ def test_create_signed_list_blobs_url_v4(storage_client, signing_bucket, no_mtls def test_create_signed_list_blobs_url_v4_w_expiration( storage_client, signing_bucket, no_mtls ): - now = datetime.datetime.utcnow() + now = _NOW(_UTC).replace(tzinfo=None) delta = datetime.timedelta(seconds=10) _create_signed_list_blobs_url_helper( storage_client, @@ -158,7 +160,7 @@ def test_create_signed_read_url_v4(storage_client, signing_bucket, no_mtls): def test_create_signed_read_url_v2_w_expiration( storage_client, signing_bucket, no_mtls ): - now = datetime.datetime.utcnow() + now = _NOW(_UTC).replace(tzinfo=None) delta = datetime.timedelta(seconds=10) _create_signed_read_url_helper( @@ -169,7 +171,7 @@ def test_create_signed_read_url_v2_w_expiration( def test_create_signed_read_url_v4_w_expiration( storage_client, signing_bucket, no_mtls ): - now = datetime.datetime.utcnow() + now = _NOW(_UTC).replace(tzinfo=None) delta = datetime.timedelta(seconds=10) _create_signed_read_url_helper( storage_client, signing_bucket, expiration=now + delta, version="v4" @@ -391,6 +393,7 @@ def test_generate_signed_post_policy_v4( with open(blob_name, "wb") as f: f.write(payload) + now = _NOW(_UTC).replace(tzinfo=None) policy = storage_client.generate_signed_post_policy_v4( bucket_name, blob_name, @@ -398,7 +401,7 @@ def test_generate_signed_post_policy_v4( {"bucket": bucket_name}, ["starts-with", "$Content-Type", "text/pla"], ], - expiration=datetime.datetime.utcnow() + datetime.timedelta(hours=1), + expiration=now + datetime.timedelta(hours=1), fields={"content-type": "text/plain"}, ) with open(blob_name, "r") as f: @@ -424,6 +427,7 @@ def test_generate_signed_post_policy_v4_invalid_field( with open(blob_name, "wb") as f: f.write(payload) + now = _NOW(_UTC).replace(tzinfo=None) policy = storage_client.generate_signed_post_policy_v4( bucket_name, blob_name, @@ -431,7 +435,7 @@ def test_generate_signed_post_policy_v4_invalid_field( {"bucket": bucket_name}, ["starts-with", "$Content-Type", "text/pla"], ], - expiration=datetime.datetime.utcnow() + datetime.timedelta(hours=1), + expiration=now + datetime.timedelta(hours=1), fields={"x-goog-random": "invalid_field", "content-type": "text/plain"}, ) with open(blob_name, "r") as f: diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index e67e1c24f..a35c047b1 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -1120,6 +1120,9 @@ def test_blob_update_storage_class_large_file( def test_object_retention_lock(storage_client, buckets_to_delete, blobs_to_delete): + from google.cloud.storage._helpers import _NOW + from google.cloud.storage._helpers import _UTC + # Test bucket created with object retention enabled new_bucket_name = _helpers.unique_name("object-retention") created_bucket = _helpers.retry_429_503(storage_client.create_bucket)( @@ -1131,7 +1134,7 @@ def test_object_retention_lock(storage_client, buckets_to_delete, blobs_to_delet # Test create object with object retention enabled payload = b"Hello World" mode = "Unlocked" - current_time = datetime.datetime.utcnow() + current_time = _NOW(_UTC).replace(tzinfo=None) expiration_time = current_time + datetime.timedelta(seconds=10) blob = created_bucket.blob("object-retention-lock") blob.retention.mode = mode diff --git a/tests/system/test_hmac_key_metadata.py b/tests/system/test_hmac_key_metadata.py index 705b1350b..d91e613b1 100644 --- a/tests/system/test_hmac_key_metadata.py +++ b/tests/system/test_hmac_key_metadata.py @@ -16,8 +16,6 @@ import pytest -from google.cloud import _helpers as _cloud_helpers - from . import _helpers @@ -32,9 +30,12 @@ def ensure_hmac_key_deleted(hmac_key): @pytest.fixture def scrubbed_hmac_keys(storage_client): + from google.cloud.storage._helpers import _NOW + from google.cloud.storage._helpers import _UTC + before_hmac_keys = set(storage_client.list_hmac_keys()) - now = datetime.datetime.utcnow().replace(tzinfo=_cloud_helpers.UTC) + now = _NOW(_UTC) yesterday = now - datetime.timedelta(days=1) # Delete any HMAC keys older than a day. diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index c29bbe718..0deab356b 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -267,10 +267,10 @@ def test_upload_chunks_concurrently(shared_bucket, file_data, blobs_to_delete): def test_upload_chunks_concurrently_with_metadata( shared_bucket, file_data, blobs_to_delete ): - import datetime - from google.cloud._helpers import UTC + from google.cloud.storage._helpers import _NOW + from google.cloud.storage._helpers import _UTC - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) custom_metadata = {"key_a": "value_a", "key_b": "value_b"} METADATA = { diff --git a/tests/unit/test__signing.py b/tests/unit/test__signing.py index a7fed514d..156911a73 100644 --- a/tests/unit/test__signing.py +++ b/tests/unit/test__signing.py @@ -26,6 +26,7 @@ import mock import pytest +from google.cloud.storage._helpers import _UTC from . import _read_local_json @@ -74,9 +75,7 @@ def test_w_expiration_naive_datetime(self): self.assertEqual(self._call_fut(expiration_no_tz), utc_seconds) def test_w_expiration_utc_datetime(self): - from google.cloud._helpers import UTC - - expiration_utc = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, UTC) + expiration_utc = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) utc_seconds = _utc_seconds(expiration_utc) self.assertEqual(self._call_fut(expiration_utc), utc_seconds) @@ -88,32 +87,32 @@ def test_w_expiration_other_zone_datetime(self): self.assertEqual(self._call_fut(expiration_other), cet_seconds) def test_w_expiration_timedelta_seconds(self): - fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0) + fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) utc_seconds = _utc_seconds(fake_utcnow) expiration_as_delta = datetime.timedelta(seconds=10) patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_as_delta) self.assertEqual(result, utc_seconds + 10) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) def test_w_expiration_timedelta_days(self): - fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0) + fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) utc_seconds = _utc_seconds(fake_utcnow) expiration_as_delta = datetime.timedelta(days=1) patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_as_delta) self.assertEqual(result, utc_seconds + 86400) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) class Test_get_expiration_seconds_v4(unittest.TestCase): @@ -138,88 +137,83 @@ def test_w_expiration_int_gt_seven_days(self): expiration_seconds = _utc_seconds(expiration_utc) patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: with self.assertRaises(ValueError): self._call_fut(expiration_seconds) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) def test_w_expiration_int(self): fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0) expiration_seconds = 10 patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_seconds) self.assertEqual(result, expiration_seconds) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) def test_w_expiration_naive_datetime(self): - fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0) + fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) delta = datetime.timedelta(seconds=10) expiration_no_tz = fake_utcnow + delta patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_no_tz) self.assertEqual(result, delta.seconds) - utcnow.assert_called_once_with() + utcnow.assert_called_once() def test_w_expiration_utc_datetime(self): - from google.cloud._helpers import UTC - - fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, UTC) + fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) delta = datetime.timedelta(seconds=10) expiration_utc = fake_utcnow + delta patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_utc) self.assertEqual(result, delta.seconds) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) def test_w_expiration_other_zone_datetime(self): - from google.cloud._helpers import UTC - zone = _make_cet_timezone() - fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, UTC) + fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) fake_cetnow = fake_utcnow.astimezone(zone) delta = datetime.timedelta(seconds=10) expiration_other = fake_cetnow + delta patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_other) - self.assertEqual(result, delta.seconds) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) def test_w_expiration_timedelta(self): - fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0) + fake_utcnow = datetime.datetime(2004, 8, 19, 0, 0, 0, 0, _UTC) expiration_as_delta = datetime.timedelta(seconds=10) patch = mock.patch( - "google.cloud.storage._signing.NOW", return_value=fake_utcnow + "google.cloud.storage._signing._NOW", return_value=fake_utcnow ) with patch as utcnow: result = self._call_fut(expiration_as_delta) self.assertEqual(result, expiration_as_delta.total_seconds()) - utcnow.assert_called_once_with() + utcnow.assert_called_once_with(datetime.timezone.utc) class Test_get_signed_query_params_v2(unittest.TestCase): @@ -534,7 +528,7 @@ def _generate_helper( credentials = _make_credentials(signer_email=signer_email) credentials.sign_bytes.return_value = b"DEADBEEF" - with mock.patch("google.cloud.storage._signing.NOW", lambda: now): + with mock.patch("google.cloud.storage._signing._NOW", lambda tz: now): url = self._call_fut( credentials, resource, @@ -797,7 +791,7 @@ def test_get_v4_now_dtstamps(self): from google.cloud.storage._signing import get_v4_now_dtstamps with mock.patch( - "google.cloud.storage._signing.NOW", + "google.cloud.storage._signing._NOW", return_value=datetime.datetime(2020, 3, 12, 13, 14, 15), ) as now_mock: timestamp, datestamp = get_v4_now_dtstamps() diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 805dae741..3bc775499 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -29,8 +29,10 @@ from google.cloud.storage import _helpers from google.cloud.storage._helpers import _get_default_headers -from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN from google.cloud.storage._helpers import _get_default_storage_base_url +from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC from google.cloud.storage.retry import ( DEFAULT_RETRY, DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED, @@ -135,11 +137,9 @@ def test_ctor_with_generation(self): self.assertEqual(blob.generation, GENERATION) def _set_properties_helper(self, kms_key_name=None): - import datetime - from google.cloud._helpers import UTC from google.cloud._helpers import _RFC3339_MICROS - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) NOW = now.strftime(_RFC3339_MICROS) BLOB_NAME = "blob-name" GENERATION = 12345 @@ -471,7 +471,6 @@ def _generate_signed_url_helper( scheme="http", ): from urllib import parse - from google.cloud._helpers import UTC from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _get_default_storage_base_url from google.cloud.storage.blob import _get_encryption_headers @@ -479,7 +478,7 @@ def _generate_signed_url_helper( delta = datetime.timedelta(hours=1) if expiration is None: - expiration = datetime.datetime.utcnow().replace(tzinfo=UTC) + delta + expiration = _NOW(_UTC) + delta if credentials is None: expected_creds = _make_credentials() @@ -579,9 +578,7 @@ def test_generate_signed_url_v2_w_defaults(self): self._generate_signed_url_v2_helper() def test_generate_signed_url_v2_w_expiration(self): - from google.cloud._helpers import UTC - - expiration = datetime.datetime.utcnow().replace(tzinfo=UTC) + expiration = _NOW(_UTC) self._generate_signed_url_v2_helper(expiration=expiration) def test_generate_signed_url_v2_w_non_ascii_name(self): @@ -3321,8 +3318,6 @@ def test__do_upload_with_conditional_retry_failure(self): self._do_upload_helper(retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED) def _upload_from_file_helper(self, side_effect=None, **kwargs): - from google.cloud._helpers import UTC - blob = self._make_one("blob-name", bucket=None) # Mock low-level upload helper on blob (it is tested elsewhere). created_json = {"updated": "2017-01-01T09:09:09.081Z"} @@ -3353,7 +3348,7 @@ def _upload_from_file_helper(self, side_effect=None, **kwargs): # Check the response and side-effects. self.assertIsNone(ret_val) - new_updated = datetime.datetime(2017, 1, 1, 9, 9, 9, 81000, tzinfo=UTC) + new_updated = datetime.datetime(2017, 1, 1, 9, 9, 9, 81000, tzinfo=_UTC) self.assertEqual(blob.updated, new_updated) expected_timeout = kwargs.get("timeout", self._get_default_timeout()) @@ -5657,11 +5652,10 @@ def test_owner(self): def test_retention_expiration_time(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) TIME_CREATED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"retentionExpirationTime": TIME_CREATED} blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) @@ -5748,11 +5742,10 @@ def test_temporary_hold_setter(self): def test_time_deleted(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) TIME_DELETED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"timeDeleted": TIME_DELETED} blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) @@ -5765,11 +5758,10 @@ def test_time_deleted_unset(self): def test_time_created(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) TIME_CREATED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"timeCreated": TIME_CREATED} blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) @@ -5782,11 +5774,10 @@ def test_time_created_unset(self): def test_updated(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) UPDATED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"updated": UPDATED} blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) @@ -5799,22 +5790,19 @@ def test_updated_unset(self): def test_custom_time_getter(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) TIME_CREATED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"customTime": TIME_CREATED} blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) self.assertEqual(blob.custom_time, TIMESTAMP) def test_custom_time_setter(self): - from google.cloud._helpers import UTC - BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) blob = self._make_one(BLOB_NAME, bucket=bucket) self.assertIsNone(blob.custom_time) blob.custom_time = TIMESTAMP @@ -5823,11 +5811,10 @@ def test_custom_time_setter(self): def test_custom_time_setter_none_value(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC BLOB_NAME = "blob-name" bucket = _Bucket() - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) TIME_CREATED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"customTime": TIME_CREATED} blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) @@ -5969,12 +5956,10 @@ def test_object_lock_retention_configuration(self): self.assertIsNone(retention.retention_expiration_time) def test_object_lock_retention_configuration_w_entry(self): - import datetime from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC from google.cloud.storage.blob import Retention - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) expiration_time = now + datetime.timedelta(hours=1) expiration = expiration_time.strftime(_RFC3339_MICROS) mode = "Locked" @@ -6005,8 +5990,6 @@ def test_object_lock_retention_configuration_w_entry(self): self.assertEqual(retention.retention_expiration_time, expiration_time) def test_object_lock_retention_configuration_setter(self): - import datetime - from google.cloud._helpers import UTC from google.cloud.storage.blob import Retention BLOB_NAME = "blob-name" @@ -6015,7 +5998,7 @@ def test_object_lock_retention_configuration_setter(self): self.assertIsInstance(blob.retention, Retention) mode = "Locked" - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) expiration_time = now + datetime.timedelta(hours=1) retention_config = Retention( blob=blob, mode=mode, retain_until_time=expiration_time diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 642b09158..6a0e5e285 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -27,6 +27,8 @@ from google.cloud.storage.constants import PUBLIC_ACCESS_PREVENTION_UNSPECIFIED from google.cloud.storage.constants import RPO_DEFAULT from google.cloud.storage.constants import RPO_ASYNC_TURBO +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC from google.cloud.storage._helpers import _get_default_storage_base_url @@ -430,11 +432,8 @@ def test_ctor_defaults(self): self.assertIsNone(config.bucket_policy_only_locked_time) def test_ctor_explicit_ubla(self): - import datetime - from google.cloud._helpers import UTC - bucket = self._make_bucket() - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) config = self._make_one( bucket, @@ -470,11 +469,8 @@ def test_ctor_explicit_pap(self): ) def test_ctor_explicit_bpo(self): - import datetime - from google.cloud._helpers import UTC - bucket = self._make_bucket() - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) config = pytest.deprecated_call( self._make_one, @@ -500,11 +496,8 @@ def test_ctor_ubla_and_bpo_enabled(self): ) def test_ctor_ubla_and_bpo_time(self): - import datetime - from google.cloud._helpers import UTC - bucket = self._make_bucket() - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) with self.assertRaises(ValueError): self._make_one( @@ -548,13 +541,11 @@ def test_from_api_repr_w_disabled(self): self.assertIsNone(config.bucket_policy_only_locked_time) def test_from_api_repr_w_enabled(self): - import datetime - from google.cloud._helpers import UTC from google.cloud._helpers import _datetime_to_rfc3339 klass = self._get_target_class() bucket = self._make_bucket() - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) resource = { "uniformBucketLevelAccess": { "enabled": True, @@ -2326,12 +2317,10 @@ def test_iam_configuration_policy_missing(self): self.assertIsNone(config.bucket_policy_only_locked_time) def test_iam_configuration_policy_w_entry(self): - import datetime - from google.cloud._helpers import UTC from google.cloud._helpers import _datetime_to_rfc3339 from google.cloud.storage.bucket import IAMConfiguration - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) NAME = "name" properties = { "iamConfiguration": { @@ -2680,11 +2669,9 @@ def test_autoclass_config_unset(self): self.assertIsNone(bucket.autoclass_terminal_storage_class_update_time) def test_autoclass_toggle_and_tsc_update_time(self): - import datetime from google.cloud._helpers import _datetime_to_rfc3339 - from google.cloud._helpers import UTC - effective_time = datetime.datetime.utcnow().replace(tzinfo=UTC) + effective_time = _NOW(_UTC) properties = { "autoclass": { "enabled": True, @@ -2807,11 +2794,9 @@ def test_retention_policy_effective_time_et_missing(self): self.assertIsNone(bucket.retention_policy_effective_time) def test_retention_policy_effective_time(self): - import datetime from google.cloud._helpers import _datetime_to_rfc3339 - from google.cloud._helpers import UTC - effective_time = datetime.datetime.utcnow().replace(tzinfo=UTC) + effective_time = _NOW(_UTC) properties = { "retentionPolicy": {"effectiveTime": _datetime_to_rfc3339(effective_time)} } @@ -2963,9 +2948,8 @@ def test_storage_class_setter_DURABLE_REDUCED_AVAILABILITY(self): def test_time_created(self): from google.cloud._helpers import _RFC3339_MICROS - from google.cloud._helpers import UTC - TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=UTC) + TIMESTAMP = datetime.datetime(2014, 11, 5, 20, 34, 37, tzinfo=_UTC) TIME_CREATED = TIMESTAMP.strftime(_RFC3339_MICROS) properties = {"timeCreated": TIME_CREATED} bucket = self._make_one(properties=properties) @@ -4058,14 +4042,13 @@ def _generate_signed_url_helper( scheme="http", ): from urllib import parse - from google.cloud._helpers import UTC from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _get_default_storage_base_url delta = datetime.timedelta(hours=1) if expiration is None: - expiration = datetime.datetime.utcnow().replace(tzinfo=UTC) + delta + expiration = _NOW(_UTC) + delta client = self._make_client(_credentials=credentials) bucket = self._make_one(name=bucket_name, client=client) @@ -4171,9 +4154,7 @@ def test_generate_signed_url_v2_w_defaults(self): self._generate_signed_url_v2_helper() def test_generate_signed_url_v2_w_expiration(self): - from google.cloud._helpers import UTC - - expiration = datetime.datetime.utcnow().replace(tzinfo=UTC) + expiration = _NOW(_UTC) self._generate_signed_url_v2_helper(expiration=expiration) def test_generate_signed_url_v2_w_endpoint(self): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 8e1130227..0adc56e1d 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -29,6 +29,8 @@ from google.oauth2.service_account import Credentials from google.cloud.storage import _helpers +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC from google.cloud.storage._helpers import STORAGE_EMULATOR_ENV_VAR from google.cloud.storage._helpers import _API_ENDPOINT_OVERRIDE_ENV_VAR from google.cloud.storage._helpers import _get_default_headers @@ -2311,8 +2313,6 @@ def _create_hmac_key_helper( timeout=None, retry=None, ): - import datetime - from google.cloud._helpers import UTC from google.cloud.storage.hmac_key import HMACKeyMetadata project = "PROJECT" @@ -2320,7 +2320,7 @@ def _create_hmac_key_helper( credentials = _make_credentials() email = "storage-user-123@example.com" secret = "a" * 40 - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = _NOW(_UTC) now_stamp = f"{now.isoformat()}Z" if explicit_project is not None: @@ -2907,7 +2907,7 @@ def test_conformance_post_policy(test_data): client = Client(credentials=_FAKE_CREDENTIALS, project="PROJECT") # mocking time functions - with mock.patch("google.cloud.storage._signing.NOW", return_value=timestamp): + with mock.patch("google.cloud.storage._signing._NOW", return_value=timestamp): with mock.patch( "google.cloud.storage.client.get_expiration_seconds_v4", return_value=in_data["expiration"], diff --git a/tests/unit/test_hmac_key.py b/tests/unit/test_hmac_key.py index b74bc1e7e..941852d37 100644 --- a/tests/unit/test_hmac_key.py +++ b/tests/unit/test_hmac_key.py @@ -18,6 +18,8 @@ from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_ETAG_IN_JSON +from google.cloud.storage._helpers import _NOW +from google.cloud.storage._helpers import _UTC class TestHMACKeyMetadata(unittest.TestCase): @@ -173,24 +175,18 @@ def test_state_setter_active(self): self.assertEqual(metadata._properties["state"], expected) def test_time_created_getter(self): - import datetime - from google.cloud._helpers import UTC - metadata = self._make_one() - now = datetime.datetime.utcnow() + now = _NOW() now_stamp = f"{now.isoformat()}Z" metadata._properties["timeCreated"] = now_stamp - self.assertEqual(metadata.time_created, now.replace(tzinfo=UTC)) + self.assertEqual(metadata.time_created, now.replace(tzinfo=_UTC)) def test_updated_getter(self): - import datetime - from google.cloud._helpers import UTC - metadata = self._make_one() - now = datetime.datetime.utcnow() + now = _NOW() now_stamp = f"{now.isoformat()}Z" metadata._properties["updated"] = now_stamp - self.assertEqual(metadata.updated, now.replace(tzinfo=UTC)) + self.assertEqual(metadata.updated, now.replace(tzinfo=_UTC)) def test_path_wo_access_id(self): metadata = self._make_one() diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 9042b05e0..aa42dd9ff 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -841,10 +841,10 @@ def test_upload_chunks_concurrently_passes_concurrency_options(): def test_upload_chunks_concurrently_with_metadata_and_encryption(): import datetime - from google.cloud._helpers import UTC + from google.cloud.storage._helpers import _UTC from google.cloud._helpers import _RFC3339_MICROS - now = datetime.datetime.utcnow().replace(tzinfo=UTC) + now = datetime.datetime.now(_UTC) now_str = now.strftime(_RFC3339_MICROS) custom_metadata = {"key_a": "value_a", "key_b": "value_b"} From dcd67745f66afab965ff719a3df788a4d2d0da0b Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:39:53 -0800 Subject: [PATCH 243/509] build(deps): bump cryptography from 41.0.6 to 42.0.0 in /synthtool/gcp/templates/python_library/.kokoro (#1217) Source-Link: https://github.com/googleapis/synthtool/commit/e13b22b1f660c80e4c3e735a9177d2f16c4b8bdc Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:97b671488ad548ef783a452a9e1276ac10f144d5ae56d98cc4bf77ba504082b4 Co-authored-by: Owl Bot Co-authored-by: cojenco --- .github/.OwlBot.lock.yaml | 4 +-- .kokoro/requirements.txt | 57 ++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index d8a1bbca7..2aefd0e91 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:5ea6d0ab82c956b50962f91d94e206d3921537ae5fe1549ec5326381d8905cfa -# created: 2024-01-15T16:32:08.142785673Z + digest: sha256:97b671488ad548ef783a452a9e1276ac10f144d5ae56d98cc4bf77ba504082b4 +# created: 2024-02-06T03:20:16.660474034Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index bb3d6ca38..8c11c9f3e 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -93,30 +93,39 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -cryptography==41.0.6 \ - --hash=sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596 \ - --hash=sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c \ - --hash=sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660 \ - --hash=sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4 \ - --hash=sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead \ - --hash=sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed \ - --hash=sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3 \ - --hash=sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7 \ - --hash=sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09 \ - --hash=sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c \ - --hash=sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43 \ - --hash=sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65 \ - --hash=sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6 \ - --hash=sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da \ - --hash=sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c \ - --hash=sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b \ - --hash=sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8 \ - --hash=sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c \ - --hash=sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d \ - --hash=sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9 \ - --hash=sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86 \ - --hash=sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36 \ - --hash=sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae +cryptography==42.0.0 \ + --hash=sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b \ + --hash=sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd \ + --hash=sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94 \ + --hash=sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221 \ + --hash=sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e \ + --hash=sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513 \ + --hash=sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d \ + --hash=sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc \ + --hash=sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0 \ + --hash=sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2 \ + --hash=sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87 \ + --hash=sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01 \ + --hash=sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0 \ + --hash=sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4 \ + --hash=sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b \ + --hash=sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81 \ + --hash=sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3 \ + --hash=sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4 \ + --hash=sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf \ + --hash=sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec \ + --hash=sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce \ + --hash=sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0 \ + --hash=sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f \ + --hash=sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f \ + --hash=sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3 \ + --hash=sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689 \ + --hash=sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08 \ + --hash=sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139 \ + --hash=sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434 \ + --hash=sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17 \ + --hash=sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8 \ + --hash=sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440 # via # gcp-releasetool # secretstorage From ae9a53b464e7d82c79a019a4111c49a4cdcc3ae0 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 14 Feb 2024 16:28:33 -0800 Subject: [PATCH 244/509] fix: add "updated" as property for Bucket (#1220) --- google/cloud/storage/bucket.py | 15 +++++++++++++++ tests/unit/test_bucket.py | 13 +++++++++++++ 2 files changed, 28 insertions(+) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 215e9ea20..caa3ddd57 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2618,6 +2618,21 @@ def time_created(self): if value is not None: return _rfc3339_nanos_to_datetime(value) + @property + def updated(self): + """Retrieve the timestamp at which the bucket was last updated. + + See https://cloud.google.com/storage/docs/json_api/v1/buckets + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: Datetime object parsed from RFC3339 valid timestamp, or + ``None`` if the bucket's resource has not been loaded + from the server. + """ + value = self._properties.get("updated") + if value is not None: + return _rfc3339_nanos_to_datetime(value) + @property def versioning_enabled(self): """Is versioning enabled for this bucket? diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 6a0e5e285..a5d276391 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2959,6 +2959,19 @@ def test_time_created_unset(self): bucket = self._make_one() self.assertIsNone(bucket.time_created) + def test_updated(self): + from google.cloud._helpers import _RFC3339_MICROS + + TIMESTAMP = datetime.datetime(2023, 11, 5, 20, 34, 37, tzinfo=_UTC) + UPDATED = TIMESTAMP.strftime(_RFC3339_MICROS) + properties = {"updated": UPDATED} + bucket = self._make_one(properties=properties) + self.assertEqual(bucket.updated, TIMESTAMP) + + def test_updated_unset(self): + bucket = self._make_one() + self.assertIsNone(bucket.updated) + def test_versioning_enabled_getter_missing(self): NAME = "name" bucket = self._make_one(name=NAME) From 0b8f5b0262193e220e66d6ae0e15e7f616b5b1bb Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 28 Feb 2024 13:25:37 -0800 Subject: [PATCH 245/509] samples: replace deprecated method (#1211) * samples: replace deprecated method * update print statement, decode --- samples/snippets/snippets_test.py | 4 ++-- samples/snippets/storage_download_into_memory.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 7add15184..ff1d23005 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -361,7 +361,7 @@ def test_generate_upload_signed_url_v4(test_bucket, capsys): bucket = storage.Client().bucket(test_bucket.name) blob = bucket.blob(blob_name) - assert blob.download_as_string() == content + assert blob.download_as_bytes() == content def test_generate_signed_policy_v4(test_bucket, capsys): @@ -592,7 +592,7 @@ def test_storage_compose_file(test_bucket): source_files[1], dest_file.name, ) - composed = destination.download_as_string() + composed = destination.download_as_bytes() assert composed.decode("utf-8") == source_files[0] + source_files[1] diff --git a/samples/snippets/storage_download_into_memory.py b/samples/snippets/storage_download_into_memory.py index 453a13e21..97f677054 100644 --- a/samples/snippets/storage_download_into_memory.py +++ b/samples/snippets/storage_download_into_memory.py @@ -37,11 +37,11 @@ def download_blob_into_memory(bucket_name, blob_name): # any content from Google Cloud Storage. As we don't need additional data, # using `Bucket.blob` is preferred here. blob = bucket.blob(blob_name) - contents = blob.download_as_string() + contents = blob.download_as_bytes() print( - "Downloaded storage object {} from bucket {} as the following string: {}.".format( - blob_name, bucket_name, contents + "Downloaded storage object {} from bucket {} as the following bytes object: {}.".format( + blob_name, bucket_name, contents.decode("utf-8") ) ) From b25b112a4670928d391ec76338bfc314ab05de3c Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:29:52 -0800 Subject: [PATCH 246/509] chore(main): release 2.15.0 (#1219) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d08b71376..c2c5af91c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.15.0](https://github.com/googleapis/python-storage/compare/v2.14.0...v2.15.0) (2024-02-28) + + +### Features + +* Support custom universe domains/TPC ([#1212](https://github.com/googleapis/python-storage/issues/1212)) ([f4cf041](https://github.com/googleapis/python-storage/commit/f4cf041a5f2075cecf5f4993f8b7afda0476a52b)) + + +### Bug Fixes + +* Add "updated" as property for Bucket ([#1220](https://github.com/googleapis/python-storage/issues/1220)) ([ae9a53b](https://github.com/googleapis/python-storage/commit/ae9a53b464e7d82c79a019a4111c49a4cdcc3ae0)) +* Remove utcnow usage ([#1215](https://github.com/googleapis/python-storage/issues/1215)) ([8d8a53a](https://github.com/googleapis/python-storage/commit/8d8a53a1368392ad7a1c4352f559c12932c5a9c9)) + ## [2.14.0](https://github.com/googleapis/python-storage/compare/v2.13.0...v2.14.0) (2023-12-10) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index ba8b4e8af..a8381fff6 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.14.0" +__version__ = "2.15.0" From 1d1942305bd4ec7b3e2a4c1dea664c4f91e32162 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 10:03:31 -0500 Subject: [PATCH 247/509] build(deps): bump cryptography from 42.0.2 to 42.0.4 in .kokoro (#1233) Source-Link: https://github.com/googleapis/synthtool/commit/d895aec3679ad22aa120481f746bf9f2f325f26f Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:98f3afd11308259de6e828e37376d18867fd321aba07826e29e4f8d9cab56bad Co-authored-by: Owl Bot Co-authored-by: cojenco --- .github/.OwlBot.lock.yaml | 4 +-- .kokoro/requirements.txt | 66 +++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 2aefd0e91..e4e943e02 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:97b671488ad548ef783a452a9e1276ac10f144d5ae56d98cc4bf77ba504082b4 -# created: 2024-02-06T03:20:16.660474034Z + digest: sha256:98f3afd11308259de6e828e37376d18867fd321aba07826e29e4f8d9cab56bad +# created: 2024-02-27T15:56:18.442440378Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 8c11c9f3e..bda8e38c4 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -93,39 +93,39 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -cryptography==42.0.0 \ - --hash=sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b \ - --hash=sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd \ - --hash=sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94 \ - --hash=sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221 \ - --hash=sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e \ - --hash=sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513 \ - --hash=sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d \ - --hash=sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc \ - --hash=sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0 \ - --hash=sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2 \ - --hash=sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87 \ - --hash=sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01 \ - --hash=sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0 \ - --hash=sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4 \ - --hash=sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b \ - --hash=sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81 \ - --hash=sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3 \ - --hash=sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4 \ - --hash=sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf \ - --hash=sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec \ - --hash=sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce \ - --hash=sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0 \ - --hash=sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f \ - --hash=sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f \ - --hash=sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3 \ - --hash=sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689 \ - --hash=sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08 \ - --hash=sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139 \ - --hash=sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434 \ - --hash=sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17 \ - --hash=sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8 \ - --hash=sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440 +cryptography==42.0.4 \ + --hash=sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b \ + --hash=sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce \ + --hash=sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88 \ + --hash=sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7 \ + --hash=sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20 \ + --hash=sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9 \ + --hash=sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff \ + --hash=sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1 \ + --hash=sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764 \ + --hash=sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b \ + --hash=sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298 \ + --hash=sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1 \ + --hash=sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824 \ + --hash=sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257 \ + --hash=sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a \ + --hash=sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129 \ + --hash=sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb \ + --hash=sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929 \ + --hash=sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854 \ + --hash=sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52 \ + --hash=sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923 \ + --hash=sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885 \ + --hash=sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0 \ + --hash=sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd \ + --hash=sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2 \ + --hash=sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18 \ + --hash=sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b \ + --hash=sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992 \ + --hash=sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74 \ + --hash=sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660 \ + --hash=sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925 \ + --hash=sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449 # via # gcp-releasetool # secretstorage From 3928aa0680ec03addae1f792c73abb5c9dc8586f Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 18 Mar 2024 14:43:40 -0700 Subject: [PATCH 248/509] feat: add support for soft delete (#1229) * feat: add support for soft delete * add restore, get object, list_objects, unit tests * integration test * update restore_blob * SoftDeletePolicy data class * update docstrings; address comments --- google/cloud/storage/_helpers.py | 10 ++ google/cloud/storage/blob.py | 36 +++++ google/cloud/storage/bucket.py | 230 +++++++++++++++++++++++++++++++ google/cloud/storage/client.py | 10 ++ tests/system/test_bucket.py | 54 ++++++++ tests/unit/test_blob.py | 49 +++++++ tests/unit/test_bucket.py | 178 ++++++++++++++++++++++++ tests/unit/test_client.py | 3 + 8 files changed, 570 insertions(+) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 6f8702050..b90bf4eb2 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -225,6 +225,7 @@ def reload( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + soft_deleted=None, ): """Reload properties from Cloud Storage. @@ -270,6 +271,13 @@ def reload( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + + :type soft_deleted: bool + :param soft_deleted: + (Optional) If True, looks for a soft-deleted object. Will only return + the object metadata if the object exists and is in a soft-deleted state. + :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True. + See: https://cloud.google.com/storage/docs/soft-delete """ client = self._require_client(client) query_params = self._query_params @@ -283,6 +291,8 @@ def reload( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, ) + if soft_deleted is not None: + query_params["softDeleted"] = soft_deleted headers = self._encryption_headers() _add_etag_match_headers( headers, if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 6cfa56190..9c0cf33ab 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -650,6 +650,7 @@ def exists( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + soft_deleted=None, ): """Determines whether or not this blob exists. @@ -694,6 +695,13 @@ def exists( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + :type soft_deleted: bool + :param soft_deleted: + (Optional) If True, looks for a soft-deleted object. Will only return True + if the object exists and is in a soft-deleted state. + :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True. + See: https://cloud.google.com/storage/docs/soft-delete + :rtype: bool :returns: True if the blob exists in Cloud Storage. """ @@ -702,6 +710,8 @@ def exists( # minimize the returned payload. query_params = self._query_params query_params["fields"] = "name" + if soft_deleted is not None: + query_params["softDeleted"] = soft_deleted _add_generation_match_parameters( query_params, @@ -4700,6 +4710,32 @@ def retention(self): info = self._properties.get("retention", {}) return Retention.from_api_repr(info, self) + @property + def soft_delete_time(self): + """If this object has been soft-deleted, returns the time at which it became soft-deleted. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: + (readonly) The time that the object became soft-deleted. + Note this property is only set for soft-deleted objects. + """ + soft_delete_time = self._properties.get("softDeleteTime") + if soft_delete_time is not None: + return _rfc3339_nanos_to_datetime(soft_delete_time) + + @property + def hard_delete_time(self): + """If this object has been soft-deleted, returns the time at which it will be permanently deleted. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: + (readonly) The time that the object will be permanently deleted. + Note this property is only set for soft-deleted objects. + """ + hard_delete_time = self._properties.get("hardDeleteTime") + if hard_delete_time is not None: + return _rfc3339_nanos_to_datetime(hard_delete_time) + def _get_host_name(connection): """Returns the host name from the given connection. diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index caa3ddd57..5855c4c8a 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1188,6 +1188,7 @@ def get_blob( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + soft_deleted=None, **kwargs, ): """Get a blob object by name. @@ -1248,6 +1249,13 @@ def get_blob( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + :type soft_deleted: bool + :param soft_deleted: + (Optional) If True, looks for a soft-deleted object. Will only return + the object metadata if the object exists and is in a soft-deleted state. + Object ``generation`` is required if ``soft_deleted`` is set to True. + See: https://cloud.google.com/storage/docs/soft-delete + :param kwargs: Keyword arguments to pass to the :class:`~google.cloud.storage.blob.Blob` constructor. @@ -1275,6 +1283,7 @@ def get_blob( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=retry, + soft_deleted=soft_deleted, ) except NotFound: return None @@ -1297,6 +1306,7 @@ def list_blobs( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, match_glob=None, + soft_deleted=None, ): """Return an iterator used to find blobs in the bucket. @@ -1378,6 +1388,13 @@ def list_blobs( The string value must be UTF-8 encoded. See: https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob + :type soft_deleted: bool + :param soft_deleted: + (Optional) If true, only soft-deleted objects will be listed as distinct results in order of increasing + generation number. This parameter can only be used successfully if the bucket has a soft delete policy. + Note ``soft_deleted`` and ``versions`` cannot be set to True simultaneously. See: + https://cloud.google.com/storage/docs/soft-delete + :rtype: :class:`~google.api_core.page_iterator.Iterator` :returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. @@ -1398,6 +1415,7 @@ def list_blobs( timeout=timeout, retry=retry, match_glob=match_glob, + soft_deleted=soft_deleted, ) def list_notifications( @@ -2060,6 +2078,110 @@ def rename_blob( ) return new_blob + def restore_blob( + self, + blob_name, + client=None, + generation=None, + copy_source_acl=None, + projection=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=_DEFAULT_TIMEOUT, + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + ): + """Restores a soft-deleted object. + + If :attr:`user_project` is set on the bucket, bills the API request to that project. + + See [API reference docs](https://cloud.google.com/storage/docs/json_api/v1/objects/restore) + + :type blob_name: str + :param blob_name: The name of the blob to be restored. + + :type client: :class:`~google.cloud.storage.client.Client` + :param client: (Optional) The client to use. If not passed, falls back + to the ``client`` stored on the current bucket. + + :type generation: long + :param generation: (Optional) If present, selects a specific revision of this object. + + :type copy_source_acl: bool + :param copy_source_acl: (Optional) If true, copy the soft-deleted object's access controls. + + :type projection: str + :param projection: (Optional) Specifies the set of properties to return. + If used, must be 'full' or 'noAcl'. + + :type if_generation_match: long + :param if_generation_match: + (Optional) See :ref:`using-if-generation-match` + + :type if_generation_not_match: long + :param if_generation_not_match: + (Optional) See :ref:`using-if-generation-not-match` + + :type if_metageneration_match: long + :param if_metageneration_match: + (Optional) See :ref:`using-if-metageneration-match` + + :type if_metageneration_not_match: long + :param if_metageneration_not_match: + (Optional) See :ref:`using-if-metageneration-not-match` + + :type timeout: float or tuple + :param timeout: + (Optional) The amount of time, in seconds, to wait + for the server response. See: :ref:`configuring_timeouts` + + :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy + :param retry: + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, which + only restore operations with ``if_generation_match`` or ``generation`` set + will be retried. + + Users can configure non-default retry behavior. A ``None`` value will + disable retries. A ``DEFAULT_RETRY`` value will enable retries + even if restore operations are not guaranteed to be idempotent. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). + + :rtype: :class:`google.cloud.storage.blob.Blob` + :returns: The restored Blob. + """ + client = self._require_client(client) + query_params = {} + + if self.user_project is not None: + query_params["userProject"] = self.user_project + if generation is not None: + query_params["generation"] = generation + if copy_source_acl is not None: + query_params["copySourceAcl"] = copy_source_acl + if projection is not None: + query_params["projection"] = projection + + _add_generation_match_parameters( + query_params, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + ) + + blob = Blob(bucket=self, name=blob_name) + api_response = client._post_resource( + f"{blob.path}/restore", + None, + query_params=query_params, + timeout=timeout, + retry=retry, + ) + blob._set_properties(api_response) + return blob + @property def cors(self): """Retrieve or set CORS policies configured for this bucket. @@ -2227,6 +2349,18 @@ def iam_configuration(self): info = self._properties.get("iamConfiguration", {}) return IAMConfiguration.from_api_repr(info, self) + @property + def soft_delete_policy(self): + """Retrieve the soft delete policy for this bucket. + + See https://cloud.google.com/storage/docs/soft-delete + + :rtype: :class:`SoftDeletePolicy` + :returns: an instance for managing the bucket's soft delete policy. + """ + policy = self._properties.get("softDeletePolicy", {}) + return SoftDeletePolicy.from_api_repr(policy, self) + @property def lifecycle_rules(self): """Retrieve or set lifecycle rules configured for this bucket. @@ -3432,6 +3566,102 @@ def generate_signed_url( ) +class SoftDeletePolicy(dict): + """Map a bucket's soft delete policy. + + See https://cloud.google.com/storage/docs/soft-delete + + :type bucket: :class:`Bucket` + :param bucket: Bucket for which this instance is the policy. + + :type retention_duration_seconds: int + :param retention_duration_seconds: + (Optional) The period of time in seconds that soft-deleted objects in the bucket + will be retained and cannot be permanently deleted. + + :type effective_time: :class:`datetime.datetime` + :param effective_time: + (Optional) When the bucket's soft delete policy is effective. + This value should normally only be set by the back-end API. + """ + + def __init__(self, bucket, **kw): + data = {} + retention_duration_seconds = kw.get("retention_duration_seconds") + data["retentionDurationSeconds"] = retention_duration_seconds + + effective_time = kw.get("effective_time") + if effective_time is not None: + effective_time = _datetime_to_rfc3339(effective_time) + data["effectiveTime"] = effective_time + + super().__init__(data) + self._bucket = bucket + + @classmethod + def from_api_repr(cls, resource, bucket): + """Factory: construct instance from resource. + + :type resource: dict + :param resource: mapping as returned from API call. + + :type bucket: :class:`Bucket` + :params bucket: Bucket for which this instance is the policy. + + :rtype: :class:`SoftDeletePolicy` + :returns: Instance created from resource. + """ + instance = cls(bucket) + instance.update(resource) + return instance + + @property + def bucket(self): + """Bucket for which this instance is the policy. + + :rtype: :class:`Bucket` + :returns: the instance's bucket. + """ + return self._bucket + + @property + def retention_duration_seconds(self): + """Get the retention duration of the bucket's soft delete policy. + + :rtype: int or ``NoneType`` + :returns: The period of time in seconds that soft-deleted objects in the bucket + will be retained and cannot be permanently deleted; Or ``None`` if the + property is not set. + """ + duration = self.get("retentionDurationSeconds") + if duration is not None: + return int(duration) + + @retention_duration_seconds.setter + def retention_duration_seconds(self, value): + """Set the retention duration of the bucket's soft delete policy. + + :type value: int + :param value: + The period of time in seconds that soft-deleted objects in the bucket + will be retained and cannot be permanently deleted. + """ + self["retentionDurationSeconds"] = value + self.bucket._patch_property("softDeletePolicy", self) + + @property + def effective_time(self): + """Get the effective time of the bucket's soft delete policy. + + :rtype: datetime.datetime or ``NoneType`` + :returns: point-in time at which the bucket's soft delte policy is + effective, or ``None`` if the property is not set. + """ + timestamp = self.get("effectiveTime") + if timestamp is not None: + return _rfc3339_nanos_to_datetime(timestamp) + + def _raise_if_len_differs(expected_len, **generation_match_args): """ Raise an error if any generation match argument diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index e051b9750..73351f1f7 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1184,6 +1184,7 @@ def list_blobs( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, match_glob=None, + soft_deleted=None, ): """Return an iterator used to find blobs in the bucket. @@ -1282,6 +1283,12 @@ def list_blobs( The string value must be UTF-8 encoded. See: https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob + soft_deleted (bool): + (Optional) If true, only soft-deleted objects will be listed as distinct results in order of increasing + generation number. This parameter can only be used successfully if the bucket has a soft delete policy. + Note ``soft_deleted`` and ``versions`` cannot be set to True simultaneously. See: + https://cloud.google.com/storage/docs/soft-delete + Returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. The RPC call @@ -1318,6 +1325,9 @@ def list_blobs( if fields is not None: extra_params["fields"] = fields + if soft_deleted is not None: + extra_params["softDeleted"] = soft_deleted + if bucket.user_project is not None: extra_params["userProject"] = bucket.user_project diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 19b21bac2..0fb25d54e 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1141,3 +1141,57 @@ def test_config_autoclass_w_existing_bucket( assert ( bucket.autoclass_terminal_storage_class_update_time != previous_tsc_update_time ) + + +def test_soft_delete_policy( + storage_client, + buckets_to_delete, +): + from google.cloud.storage.bucket import SoftDeletePolicy + + # Create a bucket with soft delete policy. + duration_secs = 7 * 86400 + bucket = storage_client.bucket(_helpers.unique_name("w-soft-delete")) + bucket.soft_delete_policy.retention_duration_seconds = duration_secs + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket) + buckets_to_delete.append(bucket) + + policy = bucket.soft_delete_policy + assert isinstance(policy, SoftDeletePolicy) + assert policy.retention_duration_seconds == duration_secs + assert isinstance(policy.effective_time, datetime.datetime) + + # Insert an object and get object metadata prior soft-deleted. + payload = b"DEADBEEF" + blob_name = _helpers.unique_name("soft-delete") + blob = bucket.blob(blob_name) + blob.upload_from_string(payload) + + blob = bucket.get_blob(blob_name) + gen = blob.generation + assert blob.soft_delete_time is None + assert blob.hard_delete_time is None + + # Delete the object to enter soft-deleted state. + blob.delete() + + iter_default = bucket.list_blobs() + assert len(list(iter_default)) == 0 + iter_w_soft_delete = bucket.list_blobs(soft_deleted=True) + assert len(list(iter_w_soft_delete)) > 0 + + # Get the soft-deleted object. + soft_deleted_blob = bucket.get_blob(blob_name, generation=gen, soft_deleted=True) + assert soft_deleted_blob.soft_delete_time is not None + assert soft_deleted_blob.hard_delete_time is not None + + # Restore the soft-deleted object. + restored_blob = bucket.restore_blob(blob_name, generation=gen) + assert restored_blob.exists() is True + assert restored_blob.generation != gen + + # Patch the soft delete policy on an existing bucket. + new_duration_secs = 10 * 86400 + bucket.soft_delete_policy.retention_duration_seconds = new_duration_secs + bucket.patch() + assert bucket.soft_delete_policy.retention_duration_seconds == new_duration_secs diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 3bc775499..98d744d6c 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -784,6 +784,32 @@ def test_exists_hit_w_generation_w_retry(self): _target_object=None, ) + def test_exists_hit_w_generation_w_soft_deleted(self): + blob_name = "blob-name" + generation = 123456 + api_response = {"name": blob_name} + client = mock.Mock(spec=["_get_resource"]) + client._get_resource.return_value = api_response + bucket = _Bucket(client) + blob = self._make_one(blob_name, bucket=bucket, generation=generation) + + self.assertTrue(blob.exists(retry=None, soft_deleted=True)) + + expected_query_params = { + "fields": "name", + "generation": generation, + "softDeleted": True, + } + expected_headers = {} + client._get_resource.assert_called_once_with( + blob.path, + query_params=expected_query_params, + headers=expected_headers, + timeout=self._get_default_timeout(), + retry=None, + _target_object=None, + ) + def test_exists_w_etag_match(self): blob_name = "blob-name" etag = "kittens" @@ -5827,6 +5853,29 @@ def test_custom_time_unset(self): blob = self._make_one("blob-name", bucket=BUCKET) self.assertIsNone(blob.custom_time) + def test_soft_hard_delete_time_getter(self): + from google.cloud._helpers import _RFC3339_MICROS + + BLOB_NAME = "blob-name" + bucket = _Bucket() + soft_timstamp = datetime.datetime(2024, 1, 5, 20, 34, 37, tzinfo=_UTC) + soft_delete = soft_timstamp.strftime(_RFC3339_MICROS) + hard_timstamp = datetime.datetime(2024, 1, 15, 20, 34, 37, tzinfo=_UTC) + hard_delete = hard_timstamp.strftime(_RFC3339_MICROS) + properties = { + "softDeleteTime": soft_delete, + "hardDeleteTime": hard_delete, + } + blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) + self.assertEqual(blob.soft_delete_time, soft_timstamp) + self.assertEqual(blob.hard_delete_time, hard_timstamp) + + def test_soft_hard_delte_time_unset(self): + BUCKET = object() + blob = self._make_one("blob-name", bucket=BUCKET) + self.assertIsNone(blob.soft_delete_time) + self.assertIsNone(blob.hard_delete_time) + def test_from_string_w_valid_uri(self): from google.cloud.storage.blob import Blob diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index a5d276391..7f25fee05 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -982,6 +982,40 @@ def test_get_blob_hit_w_user_project(self): _target_object=blob, ) + def test_get_blob_hit_w_generation_w_soft_deleted(self): + from google.cloud.storage.blob import Blob + + name = "name" + blob_name = "blob-name" + generation = 1512565576797178 + api_response = {"name": blob_name, "generation": generation} + client = mock.Mock(spec=["_get_resource"]) + client._get_resource.return_value = api_response + bucket = self._make_one(client, name=name) + + blob = bucket.get_blob(blob_name, generation=generation, soft_deleted=True) + + self.assertIsInstance(blob, Blob) + self.assertIs(blob.bucket, bucket) + self.assertEqual(blob.name, blob_name) + self.assertEqual(blob.generation, generation) + + expected_path = f"/b/{name}/o/{blob_name}" + expected_query_params = { + "generation": generation, + "projection": "noAcl", + "softDeleted": True, + } + expected_headers = {} + client._get_resource.assert_called_once_with( + expected_path, + query_params=expected_query_params, + headers=expected_headers, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=blob, + ) + def test_get_blob_hit_w_generation_w_timeout(self): from google.cloud.storage.blob import Blob @@ -1143,6 +1177,7 @@ def test_list_blobs_w_defaults(self): expected_versions = None expected_projection = "noAcl" expected_fields = None + soft_deleted = None client.list_blobs.assert_called_once_with( bucket, max_results=expected_max_results, @@ -1158,6 +1193,7 @@ def test_list_blobs_w_defaults(self): timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, match_glob=expected_match_glob, + soft_deleted=soft_deleted, ) def test_list_blobs_w_explicit(self): @@ -1171,6 +1207,7 @@ def test_list_blobs_w_explicit(self): end_offset = "g" include_trailing_delimiter = True versions = True + soft_deleted = True projection = "full" fields = "items/contentLanguage,nextPageToken" bucket = self._make_one(client=None, name=name) @@ -1194,6 +1231,7 @@ def test_list_blobs_w_explicit(self): timeout=timeout, retry=retry, match_glob=match_glob, + soft_deleted=soft_deleted, ) self.assertIs(iterator, other_client.list_blobs.return_value) @@ -1209,6 +1247,7 @@ def test_list_blobs_w_explicit(self): expected_versions = versions expected_projection = projection expected_fields = fields + expected_soft_deleted = soft_deleted other_client.list_blobs.assert_called_once_with( bucket, max_results=expected_max_results, @@ -1224,6 +1263,7 @@ def test_list_blobs_w_explicit(self): timeout=timeout, retry=retry, match_glob=expected_match_glob, + soft_deleted=expected_soft_deleted, ) def test_list_notifications_w_defaults(self): @@ -3076,6 +3116,41 @@ def test_object_retention_mode_getter(self): bucket = self._make_one(properties=properties) self.assertEqual(bucket.object_retention_mode, mode) + def test_soft_delete_policy_getter_w_entry(self): + from google.cloud.storage.bucket import SoftDeletePolicy + from google.cloud._helpers import _datetime_to_rfc3339 + + seconds = 86400 * 10 # 10 days + effective_time = _NOW(_UTC) + properties = { + "softDeletePolicy": { + "retentionDurationSeconds": seconds, + "effectiveTime": _datetime_to_rfc3339(effective_time), + } + } + bucket = self._make_one(properties=properties) + + policy = SoftDeletePolicy( + bucket=bucket, + retention_duration_seconds=seconds, + effective_time=effective_time, + ) + self.assertIsInstance(bucket.soft_delete_policy, SoftDeletePolicy) + self.assertEqual(bucket.soft_delete_policy, policy) + self.assertEqual(bucket.soft_delete_policy.retention_duration_seconds, seconds) + self.assertEqual(bucket.soft_delete_policy.effective_time, effective_time) + + def test_soft_delete_policy_setter(self): + bucket = self._make_one() + policy = bucket.soft_delete_policy + self.assertIsNone(policy.retention_duration_seconds) + self.assertIsNone(policy.effective_time) + + seconds = 86400 * 10 # 10 days + bucket.soft_delete_policy.retention_duration_seconds = seconds + self.assertTrue("softDeletePolicy" in bucket._changes) + self.assertEqual(bucket.soft_delete_policy.retention_duration_seconds, seconds) + def test_configure_website_defaults(self): NAME = "name" UNSET = {"website": {"mainPageSuffix": None, "notFoundPage": None}} @@ -4028,6 +4103,109 @@ def test_lock_retention_policy_w_user_project(self): _target_object=bucket, ) + def test_restore_blob_w_defaults(self): + bucket_name = "restore_bucket" + blob_name = "restore_blob" + generation = 123456 + api_response = {"name": blob_name, "generation": generation} + client = mock.Mock(spec=["_post_resource"]) + client._post_resource.return_value = api_response + bucket = self._make_one(client=client, name=bucket_name) + + restored_blob = bucket.restore_blob(blob_name) + + self.assertIs(restored_blob.bucket, bucket) + self.assertEqual(restored_blob.name, blob_name) + expected_path = f"/b/{bucket_name}/o/{blob_name}/restore" + expected_data = None + expected_query_params = {} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + ) + + def test_restore_blob_w_explicit(self): + user_project = "user-project-123" + bucket_name = "restore_bucket" + blob_name = "restore_blob" + generation = 123456 + api_response = {"name": blob_name, "generation": generation} + client = mock.Mock(spec=["_post_resource"]) + client._post_resource.return_value = api_response + bucket = self._make_one( + client=client, name=bucket_name, user_project=user_project + ) + if_generation_match = 123456 + if_generation_not_match = 654321 + if_metageneration_match = 1 + if_metageneration_not_match = 2 + projection = "noAcl" + + restored_blob = bucket.restore_blob( + blob_name, + client=client, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + projection=projection, + ) + + self.assertEqual(restored_blob.name, blob_name) + self.assertEqual(restored_blob.bucket, bucket) + expected_path = f"/b/{bucket_name}/o/{blob_name}/restore" + expected_data = None + expected_query_params = { + "userProject": user_project, + "projection": projection, + "ifGenerationMatch": if_generation_match, + "ifGenerationNotMatch": if_generation_not_match, + "ifMetagenerationMatch": if_metageneration_match, + "ifMetagenerationNotMatch": if_metageneration_not_match, + } + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + ) + + def test_restore_blob_explicit_copy_source_acl(self): + bucket_name = "restore_bucket" + blob_name = "restore" + generation = 123456 + api_response = {"name": blob_name, "generation": generation} + client = mock.Mock(spec=["_post_resource"]) + client._post_resource.return_value = api_response + bucket = self._make_one(client=client, name=bucket_name) + copy_source_acl = False + + restored_blob = bucket.restore_blob( + blob_name, + copy_source_acl=copy_source_acl, + generation=generation, + ) + + self.assertEqual(restored_blob.name, blob_name) + self.assertEqual(restored_blob.bucket, bucket) + expected_path = f"/b/{bucket_name}/o/{blob_name}/restore" + expected_data = None + expected_query_params = { + "copySourceAcl": False, + "generation": generation, + } + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, + ) + def test_generate_signed_url_w_invalid_version(self): expiration = "2014-10-16T20:34:37.000Z" client = self._make_client() diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 0adc56e1d..c5da9e4cf 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -2015,6 +2015,7 @@ def test_list_blobs_w_explicit_w_user_project(self): start_offset = "c" end_offset = "g" include_trailing_delimiter = True + soft_deleted = False versions = True projection = "full" page_size = 2 @@ -2047,6 +2048,7 @@ def test_list_blobs_w_explicit_w_user_project(self): timeout=timeout, retry=retry, match_glob=match_glob, + soft_deleted=soft_deleted, ) self.assertIs(iterator, client._list_resource.return_value) @@ -2068,6 +2070,7 @@ def test_list_blobs_w_explicit_w_user_project(self): "versions": versions, "fields": fields, "userProject": user_project, + "softDeleted": soft_deleted, } expected_page_start = _blobs_page_start expected_page_size = 2 From 7bb806538cf3d7a5e16390db1983620933d5e51a Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 18 Mar 2024 16:18:33 -0700 Subject: [PATCH 249/509] feat: support includeFoldersAsPrefixes (#1223) * feat: support includeFoldersAsPrefixes * sys test * update sys test with cleanup --- google/cloud/storage/bucket.py | 7 ++++++ google/cloud/storage/client.py | 9 ++++++++ tests/system/test_bucket.py | 41 ++++++++++++++++++++++++++++++++++ tests/unit/test_bucket.py | 6 +++++ tests/unit/test_client.py | 3 +++ 5 files changed, 66 insertions(+) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 5855c4c8a..c83e2a958 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1306,6 +1306,7 @@ def list_blobs( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, match_glob=None, + include_folders_as_prefixes=None, soft_deleted=None, ): """Return an iterator used to find blobs in the bucket. @@ -1388,6 +1389,11 @@ def list_blobs( The string value must be UTF-8 encoded. See: https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob + :type include_folders_as_prefixes: bool + (Optional) If true, includes Folders and Managed Folders in the set of + ``prefixes`` returned by the query. Only applicable if ``delimiter`` is set to /. + See: https://cloud.google.com/storage/docs/managed-folders + :type soft_deleted: bool :param soft_deleted: (Optional) If true, only soft-deleted objects will be listed as distinct results in order of increasing @@ -1415,6 +1421,7 @@ def list_blobs( timeout=timeout, retry=retry, match_glob=match_glob, + include_folders_as_prefixes=include_folders_as_prefixes, soft_deleted=soft_deleted, ) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 73351f1f7..57bbab008 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1184,6 +1184,7 @@ def list_blobs( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, match_glob=None, + include_folders_as_prefixes=None, soft_deleted=None, ): """Return an iterator used to find blobs in the bucket. @@ -1283,6 +1284,11 @@ def list_blobs( The string value must be UTF-8 encoded. See: https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob + include_folders_as_prefixes (bool): + (Optional) If true, includes Folders and Managed Folders in the set of + ``prefixes`` returned by the query. Only applicable if ``delimiter`` is set to /. + See: https://cloud.google.com/storage/docs/managed-folders + soft_deleted (bool): (Optional) If true, only soft-deleted objects will be listed as distinct results in order of increasing generation number. This parameter can only be used successfully if the bucket has a soft delete policy. @@ -1325,6 +1331,9 @@ def list_blobs( if fields is not None: extra_params["fields"] = fields + if include_folders_as_prefixes is not None: + extra_params["includeFoldersAsPrefixes"] = include_folders_as_prefixes + if soft_deleted is not None: extra_params["softDeleted"] = soft_deleted diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 0fb25d54e..9b2fcd614 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -653,6 +653,47 @@ def test_bucket_list_blobs_w_match_glob( assert [blob.name for blob in blobs] == expected_names +def test_bucket_list_blobs_include_managed_folders( + storage_client, + buckets_to_delete, + blobs_to_delete, + hierarchy_filenames, +): + bucket_name = _helpers.unique_name("ubla-mf") + bucket = storage_client.bucket(bucket_name) + bucket.iam_configuration.uniform_bucket_level_access_enabled = True + _helpers.retry_429_503(bucket.create)() + buckets_to_delete.append(bucket) + + payload = b"helloworld" + for filename in hierarchy_filenames: + blob = bucket.blob(filename) + blob.upload_from_string(payload) + blobs_to_delete.append(blob) + + # Make API call to create a managed folder. + # TODO: change to use storage control client once available. + path = f"/b/{bucket_name}/managedFolders" + properties = {"name": "managedfolder1"} + storage_client._post_resource(path, properties) + + expected_prefixes = set(["parent/"]) + blob_iter = bucket.list_blobs(delimiter="/") + list(blob_iter) + assert blob_iter.prefixes == expected_prefixes + + # Test that managed folders are only included when IncludeFoldersAsPrefixes is set. + expected_prefixes = set(["parent/", "managedfolder1/"]) + blob_iter = bucket.list_blobs(delimiter="/", include_folders_as_prefixes=True) + list(blob_iter) + assert blob_iter.prefixes == expected_prefixes + + # Cleanup: API call to delete a managed folder. + # TODO: change to use storage control client once available. + path = f"/b/{bucket_name}/managedFolders/managedfolder1" + storage_client._delete_resource(path) + + def test_bucket_update_retention_period( storage_client, buckets_to_delete, diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 7f25fee05..d8ce1e0f5 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1177,6 +1177,7 @@ def test_list_blobs_w_defaults(self): expected_versions = None expected_projection = "noAcl" expected_fields = None + expected_include_folders_as_prefixes = None soft_deleted = None client.list_blobs.assert_called_once_with( bucket, @@ -1193,6 +1194,7 @@ def test_list_blobs_w_defaults(self): timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, match_glob=expected_match_glob, + include_folders_as_prefixes=expected_include_folders_as_prefixes, soft_deleted=soft_deleted, ) @@ -1206,6 +1208,7 @@ def test_list_blobs_w_explicit(self): start_offset = "c" end_offset = "g" include_trailing_delimiter = True + include_folders_as_prefixes = True versions = True soft_deleted = True projection = "full" @@ -1231,6 +1234,7 @@ def test_list_blobs_w_explicit(self): timeout=timeout, retry=retry, match_glob=match_glob, + include_folders_as_prefixes=include_folders_as_prefixes, soft_deleted=soft_deleted, ) @@ -1247,6 +1251,7 @@ def test_list_blobs_w_explicit(self): expected_versions = versions expected_projection = projection expected_fields = fields + expected_include_folders_as_prefixes = include_folders_as_prefixes expected_soft_deleted = soft_deleted other_client.list_blobs.assert_called_once_with( bucket, @@ -1263,6 +1268,7 @@ def test_list_blobs_w_explicit(self): timeout=timeout, retry=retry, match_glob=expected_match_glob, + include_folders_as_prefixes=expected_include_folders_as_prefixes, soft_deleted=expected_soft_deleted, ) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index c5da9e4cf..b664e701d 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -2015,6 +2015,7 @@ def test_list_blobs_w_explicit_w_user_project(self): start_offset = "c" end_offset = "g" include_trailing_delimiter = True + include_folders_as_prefixes = True soft_deleted = False versions = True projection = "full" @@ -2048,6 +2049,7 @@ def test_list_blobs_w_explicit_w_user_project(self): timeout=timeout, retry=retry, match_glob=match_glob, + include_folders_as_prefixes=include_folders_as_prefixes, soft_deleted=soft_deleted, ) @@ -2070,6 +2072,7 @@ def test_list_blobs_w_explicit_w_user_project(self): "versions": versions, "fields": fields, "userProject": user_project, + "includeFoldersAsPrefixes": include_folders_as_prefixes, "softDeleted": soft_deleted, } expected_page_start = _blobs_page_start From afc433c1676f59ed127a4ff58e6089169f586024 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:51:49 -0700 Subject: [PATCH 250/509] chore(main): release 2.16.0 (#1241) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2c5af91c..25b6fe162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.16.0](https://github.com/googleapis/python-storage/compare/v2.15.0...v2.16.0) (2024-03-18) + + +### Features + +* Add support for soft delete ([#1229](https://github.com/googleapis/python-storage/issues/1229)) ([3928aa0](https://github.com/googleapis/python-storage/commit/3928aa0680ec03addae1f792c73abb5c9dc8586f)) +* Support includeFoldersAsPrefixes ([#1223](https://github.com/googleapis/python-storage/issues/1223)) ([7bb8065](https://github.com/googleapis/python-storage/commit/7bb806538cf3d7a5e16390db1983620933d5e51a)) + ## [2.15.0](https://github.com/googleapis/python-storage/compare/v2.14.0...v2.15.0) (2024-02-28) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index a8381fff6..a93d72c2b 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.15.0" +__version__ = "2.16.0" From e1bae037d4fbc613a701d54899cdb6904806d0df Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:18:24 -0700 Subject: [PATCH 251/509] chore(python): update dependencies in /.kokoro (#1239) Source-Link: https://github.com/googleapis/synthtool/commit/db94845da69ccdfefd7ce55c84e6cfa74829747e Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:a8a80fc6456e433df53fc2a0d72ca0345db0ddefb409f1b75b118dfd1babd952 Co-authored-by: Owl Bot Co-authored-by: cojenco --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/build.sh | 7 -- .kokoro/docker/docs/Dockerfile | 4 + .kokoro/docker/docs/requirements.in | 1 + .kokoro/docker/docs/requirements.txt | 38 +++++++++ .kokoro/requirements.in | 3 +- .kokoro/requirements.txt | 114 ++++++++++++--------------- 7 files changed, 99 insertions(+), 72 deletions(-) create mode 100644 .kokoro/docker/docs/requirements.in create mode 100644 .kokoro/docker/docs/requirements.txt diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index e4e943e02..4bdeef390 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:98f3afd11308259de6e828e37376d18867fd321aba07826e29e4f8d9cab56bad -# created: 2024-02-27T15:56:18.442440378Z + digest: sha256:a8a80fc6456e433df53fc2a0d72ca0345db0ddefb409f1b75b118dfd1babd952 +# created: 2024-03-15T16:25:47.905264637Z diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 4e816ecf6..99690a243 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -43,13 +43,6 @@ export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/service-account.json # Setup project id. export PROJECT_ID=$(cat "${KOKORO_GFILE_DIR}/project-id.json") -# Remove old nox -python3 -m pip uninstall --yes --quiet nox-automation - -# Install nox -python3 -m pip install --upgrade --quiet nox -python3 -m nox --version - # If this is a continuous build, send the test log to the FlakyBot. # See https://github.com/googleapis/repo-automation-bots/tree/main/packages/flakybot. if [[ $KOKORO_BUILD_ARTIFACTS_SUBDIR = *"continuous"* ]]; then diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index 8e39a2cc4..bdaf39fe2 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -80,4 +80,8 @@ RUN wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \ # Test pip RUN python3 -m pip +# Install build requirements +COPY requirements.txt /requirements.txt +RUN python3 -m pip install --require-hashes -r requirements.txt + CMD ["python3.8"] diff --git a/.kokoro/docker/docs/requirements.in b/.kokoro/docker/docs/requirements.in new file mode 100644 index 000000000..816817c67 --- /dev/null +++ b/.kokoro/docker/docs/requirements.in @@ -0,0 +1 @@ +nox diff --git a/.kokoro/docker/docs/requirements.txt b/.kokoro/docker/docs/requirements.txt new file mode 100644 index 000000000..0e5d70f20 --- /dev/null +++ b/.kokoro/docker/docs/requirements.txt @@ -0,0 +1,38 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --generate-hashes requirements.in +# +argcomplete==3.2.3 \ + --hash=sha256:bf7900329262e481be5a15f56f19736b376df6f82ed27576fa893652c5de6c23 \ + --hash=sha256:c12355e0494c76a2a7b73e3a59b09024ca0ba1e279fb9ed6c1b82d5b74b6a70c + # via nox +colorlog==6.8.2 \ + --hash=sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44 \ + --hash=sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33 + # via nox +distlib==0.3.8 \ + --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ + --hash=sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64 + # via virtualenv +filelock==3.13.1 \ + --hash=sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e \ + --hash=sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c + # via virtualenv +nox==2024.3.2 \ + --hash=sha256:e53514173ac0b98dd47585096a55572fe504fecede58ced708979184d05440be \ + --hash=sha256:f521ae08a15adbf5e11f16cb34e8d0e6ea521e0b92868f684e91677deb974553 + # via -r requirements.in +packaging==24.0 \ + --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ + --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 + # via nox +platformdirs==4.2.0 \ + --hash=sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 \ + --hash=sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768 + # via virtualenv +virtualenv==20.25.1 \ + --hash=sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a \ + --hash=sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197 + # via nox diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index ec867d9fd..fff4d9ce0 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -1,5 +1,5 @@ gcp-docuploader -gcp-releasetool>=1.10.5 # required for compatibility with cryptography>=39.x +gcp-releasetool>=2 # required for compatibility with cryptography>=42.x importlib-metadata typing-extensions twine @@ -8,3 +8,4 @@ setuptools nox>=2022.11.21 # required to remove dependency on py charset-normalizer<3 click<8.1.0 +cryptography>=42.0.5 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index bda8e38c4..dd61f5f32 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -93,40 +93,41 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -cryptography==42.0.4 \ - --hash=sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b \ - --hash=sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce \ - --hash=sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88 \ - --hash=sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7 \ - --hash=sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20 \ - --hash=sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9 \ - --hash=sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff \ - --hash=sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1 \ - --hash=sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764 \ - --hash=sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b \ - --hash=sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298 \ - --hash=sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1 \ - --hash=sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824 \ - --hash=sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257 \ - --hash=sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a \ - --hash=sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129 \ - --hash=sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb \ - --hash=sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929 \ - --hash=sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854 \ - --hash=sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52 \ - --hash=sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923 \ - --hash=sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885 \ - --hash=sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0 \ - --hash=sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd \ - --hash=sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2 \ - --hash=sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18 \ - --hash=sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b \ - --hash=sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992 \ - --hash=sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74 \ - --hash=sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660 \ - --hash=sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925 \ - --hash=sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449 +cryptography==42.0.5 \ + --hash=sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee \ + --hash=sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576 \ + --hash=sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d \ + --hash=sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30 \ + --hash=sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413 \ + --hash=sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb \ + --hash=sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da \ + --hash=sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4 \ + --hash=sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd \ + --hash=sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc \ + --hash=sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8 \ + --hash=sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1 \ + --hash=sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc \ + --hash=sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e \ + --hash=sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8 \ + --hash=sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940 \ + --hash=sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400 \ + --hash=sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7 \ + --hash=sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16 \ + --hash=sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278 \ + --hash=sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74 \ + --hash=sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec \ + --hash=sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1 \ + --hash=sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2 \ + --hash=sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c \ + --hash=sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922 \ + --hash=sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a \ + --hash=sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6 \ + --hash=sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1 \ + --hash=sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e \ + --hash=sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac \ + --hash=sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7 # via + # -r requirements.in # gcp-releasetool # secretstorage distlib==0.3.7 \ @@ -145,9 +146,9 @@ gcp-docuploader==0.6.5 \ --hash=sha256:30221d4ac3e5a2b9c69aa52fdbef68cc3f27d0e6d0d90e220fc024584b8d2318 \ --hash=sha256:b7458ef93f605b9d46a4bf3a8dc1755dad1f31d030c8679edf304e343b347eea # via -r requirements.in -gcp-releasetool==1.16.0 \ - --hash=sha256:27bf19d2e87aaa884096ff941aa3c592c482be3d6a2bfe6f06afafa6af2353e3 \ - --hash=sha256:a316b197a543fd036209d0caba7a8eb4d236d8e65381c80cbc6d7efaa7606d63 +gcp-releasetool==2.0.0 \ + --hash=sha256:3d73480b50ba243f22d7c7ec08b115a30e1c7817c4899781840c26f9c55b8277 \ + --hash=sha256:7aa9fd935ec61e581eb8458ad00823786d91756c25e492f372b2b30962f3c28f # via -r requirements.in google-api-core==2.12.0 \ --hash=sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553 \ @@ -392,29 +393,18 @@ platformdirs==3.11.0 \ --hash=sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3 \ --hash=sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e # via virtualenv -protobuf==3.20.3 \ - --hash=sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7 \ - --hash=sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c \ - --hash=sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2 \ - --hash=sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b \ - --hash=sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050 \ - --hash=sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9 \ - --hash=sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7 \ - --hash=sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454 \ - --hash=sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480 \ - --hash=sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469 \ - --hash=sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c \ - --hash=sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e \ - --hash=sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db \ - --hash=sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905 \ - --hash=sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b \ - --hash=sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86 \ - --hash=sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4 \ - --hash=sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402 \ - --hash=sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7 \ - --hash=sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4 \ - --hash=sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99 \ - --hash=sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee +protobuf==4.25.3 \ + --hash=sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4 \ + --hash=sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 \ + --hash=sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c \ + --hash=sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d \ + --hash=sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4 \ + --hash=sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa \ + --hash=sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c \ + --hash=sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019 \ + --hash=sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9 \ + --hash=sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c \ + --hash=sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2 # via # gcp-docuploader # gcp-releasetool @@ -518,7 +508,7 @@ zipp==3.17.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==68.2.2 \ - --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ - --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a +setuptools==69.2.0 \ + --hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \ + --hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c # via -r requirements.in From 992f910baed0aa929217104984390140517c5db1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 28 Mar 2024 17:46:17 +0100 Subject: [PATCH 252/509] chore(deps): update all dependencies (#1213) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [filelock](https://togithub.com/tox-dev/py-filelock) | `==3.13.1` -> `==3.13.3` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/filelock/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/filelock/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/filelock/3.13.1/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/filelock/3.13.1/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [google-cloud-pubsub](https://togithub.com/googleapis/python-pubsub) | `==2.19.0` -> `==2.21.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/google-cloud-pubsub/2.21.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/google-cloud-pubsub/2.21.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/google-cloud-pubsub/2.19.0/2.21.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-cloud-pubsub/2.19.0/2.21.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [google-cloud-storage](https://togithub.com/googleapis/python-storage) | `==2.14.0` -> `==2.16.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/google-cloud-storage/2.16.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/google-cloud-storage/2.16.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/google-cloud-storage/2.14.0/2.16.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-cloud-storage/2.14.0/2.16.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pandas](https://pandas.pydata.org) ([source](https://togithub.com/pandas-dev/pandas)) | `==2.1.4` -> `==2.2.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pandas/2.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pandas/2.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pandas/2.1.4/2.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pandas/2.1.4/2.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pytest](https://togithub.com/pytest-dev/pytest) ([changelog](https://docs.pytest.org/en/stable/changelog.html)) | `==7.4.4` -> `==8.1.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest/8.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest/8.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest/7.4.4/8.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest/7.4.4/8.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
tox-dev/py-filelock (filelock) ### [`v3.13.3`](https://togithub.com/tox-dev/filelock/releases/tag/3.13.3) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.13.2...3.13.3) #### What's Changed - Make singleton class instance dict unique per subclass by [@​nefrob](https://togithub.com/nefrob) in [https://togithub.com/tox-dev/filelock/pull/318](https://togithub.com/tox-dev/filelock/pull/318) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.13.2...3.13.3 ### [`v3.13.2`](https://togithub.com/tox-dev/filelock/releases/tag/3.13.2) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.13.1...3.13.2) ##### What's Changed - Fixed small typo in \_unix.py by [@​snemes](https://togithub.com/snemes) in [https://togithub.com/tox-dev/filelock/pull/302](https://togithub.com/tox-dev/filelock/pull/302) - Update SECURITY.md to reflect Python 3.7 support dropoff by [@​kemzeb](https://togithub.com/kemzeb) in [https://togithub.com/tox-dev/filelock/pull/304](https://togithub.com/tox-dev/filelock/pull/304) - Update index.rst to improve the demo usage by [@​youkaichao](https://togithub.com/youkaichao) in [https://togithub.com/tox-dev/filelock/pull/314](https://togithub.com/tox-dev/filelock/pull/314) - \[BugFix] fix permission denied error when lock file is placed in `/tmp` by [@​kota-iizuka](https://togithub.com/kota-iizuka) in [https://togithub.com/tox-dev/filelock/pull/317](https://togithub.com/tox-dev/filelock/pull/317) ##### New Contributors - [@​snemes](https://togithub.com/snemes) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/302](https://togithub.com/tox-dev/filelock/pull/302) - [@​kemzeb](https://togithub.com/kemzeb) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/304](https://togithub.com/tox-dev/filelock/pull/304) - [@​youkaichao](https://togithub.com/youkaichao) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/314](https://togithub.com/tox-dev/filelock/pull/314) - [@​kota-iizuka](https://togithub.com/kota-iizuka) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/317](https://togithub.com/tox-dev/filelock/pull/317) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.13.1...3.13.2
googleapis/python-pubsub (google-cloud-pubsub) ### [`v2.21.0`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2210-2024-03-26) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.20.3...v2.21.0) ##### Features - Add custom datetime format for Cloud Storage subscriptions ([#​1131](https://togithub.com/googleapis/python-pubsub/issues/1131)) ([4da6744](https://togithub.com/googleapis/python-pubsub/commit/4da67441ddab01a173620d8c03bc640271c785c6)) ### [`v2.20.3`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2203-2024-03-21) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.20.2...v2.20.3) ##### Documentation - **samples:** Update Region Tags ([#​1128](https://togithub.com/googleapis/python-pubsub/issues/1128)) ([e3bc89e](https://togithub.com/googleapis/python-pubsub/commit/e3bc89eaa51337c93144d6c3100486353d494ad9)) ### [`v2.20.2`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2202-2024-03-15) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.20.1...v2.20.2) ##### Documentation - **samples:** Add Create Topic with Kinesis IngestionDataSourceSettings Sample ([#​1120](https://togithub.com/googleapis/python-pubsub/issues/1120)) ([83dc9ff](https://togithub.com/googleapis/python-pubsub/commit/83dc9fff13aa35518fb9b6a73472816da852d975)) - **samples:** Update Topic with Kinesis Ingestion Settings ([#​1123](https://togithub.com/googleapis/python-pubsub/issues/1123)) ([e0e2d83](https://togithub.com/googleapis/python-pubsub/commit/e0e2d831da8d17288c3ae8900bea2388ce8758af)) ### [`v2.20.1`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2201-2024-03-06) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.20.0...v2.20.1) ##### Bug Fixes - Catch and surface BaseException() ([#​1108](https://togithub.com/googleapis/python-pubsub/issues/1108)) ([07e427f](https://togithub.com/googleapis/python-pubsub/commit/07e427f675464b9aa79c68dede67082529054980)) ### [`v2.20.0`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2200-2024-03-05) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.8...v2.20.0) ##### Features - Add include_recaptcha_script for as a new action in firewall policies ([#​1109](https://togithub.com/googleapis/python-pubsub/issues/1109)) ([54041a5](https://togithub.com/googleapis/python-pubsub/commit/54041a527398eb0ec5daa97a346ba3202ce349f3)) ##### Documentation - **samples:** Correct type and description of `timeout` parameter in subscriber quickstart ([#​1051](https://togithub.com/googleapis/python-pubsub/issues/1051)) ([141a473](https://togithub.com/googleapis/python-pubsub/commit/141a473561bd0e45d3137a02cbefddb454ab3af4)) ### [`v2.19.8`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2198-2024-03-05) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.7...v2.19.8) ##### Bug Fixes - **deps:** Exclude google-auth 2.24.0 and 2.25.0 ([#​1102](https://togithub.com/googleapis/python-pubsub/issues/1102)) ([165c983](https://togithub.com/googleapis/python-pubsub/commit/165c983803c48a17141765395cf9ec2e6a7056fa)) ### [`v2.19.7`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2197-2024-02-24) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.6...v2.19.7) ##### Bug Fixes - **deps:** Require `google-api-core>=1.34.1` ([#​1080](https://togithub.com/googleapis/python-pubsub/issues/1080)) ([1a5a134](https://togithub.com/googleapis/python-pubsub/commit/1a5a1342de8736c6a2b1ac63476667f8a02b5bb8)) ### [`v2.19.6`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2196-2024-02-23) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.5...v2.19.6) ##### Bug Fixes - Remove LOGGER.exception() line ([#​1087](https://togithub.com/googleapis/python-pubsub/issues/1087)) ([a395d26](https://togithub.com/googleapis/python-pubsub/commit/a395d26ed0fffaee8662f988da97dd35c480af4f)) ### [`v2.19.5`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2195-2024-02-22) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.4...v2.19.5) ##### Bug Fixes - Update system_test_python_versions ([#​1096](https://togithub.com/googleapis/python-pubsub/issues/1096)) ([c659ac7](https://togithub.com/googleapis/python-pubsub/commit/c659ac777f177e54d7272a8de93fa9f554b15d46)) ### [`v2.19.4`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2194-2024-02-09) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.3...v2.19.4) ##### Bug Fixes - **diregapic:** S/bazel/bazelisk/ in DIREGAPIC build GitHub action ([#​1064](https://togithub.com/googleapis/python-pubsub/issues/1064)) ([d56ad12](https://togithub.com/googleapis/python-pubsub/commit/d56ad12f197e9e379d2a4a0a38be108808985c23)) ### [`v2.19.3`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2193-2024-02-08) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.2...v2.19.3) ##### Bug Fixes - Add google-auth as a direct dependency ([#​1076](https://togithub.com/googleapis/python-pubsub/issues/1076)) ([5ce7301](https://togithub.com/googleapis/python-pubsub/commit/5ce7301b3056191203bc89bbcf1f33083de72a2d)) ### [`v2.19.2`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2192-2024-02-08) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.1...v2.19.2) ##### Bug Fixes - Unit test failures in https://togithub.com/googleapis/python-pubsu… ([#​1074](https://togithub.com/googleapis/python-pubsub/issues/1074)) ([3c6d128](https://togithub.com/googleapis/python-pubsub/commit/3c6d128a53d83439036aaec1f1fd48331152935b)) ### [`v2.19.1`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2191-2024-02-02) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.19.0...v2.19.1) ##### Documentation - **samples:** Swap writer and reader schema to correct places ([265f410](https://togithub.com/googleapis/python-pubsub/commit/265f4106f499ec5d2d01a127ba192404c1836a28))
googleapis/python-storage (google-cloud-storage) ### [`v2.16.0`](https://togithub.com/googleapis/python-storage/blob/HEAD/CHANGELOG.md#2160-2024-03-18) [Compare Source](https://togithub.com/googleapis/python-storage/compare/v2.15.0...v2.16.0) ##### Features - Add support for soft delete ([#​1229](https://togithub.com/googleapis/python-storage/issues/1229)) ([3928aa0](https://togithub.com/googleapis/python-storage/commit/3928aa0680ec03addae1f792c73abb5c9dc8586f)) - Support includeFoldersAsPrefixes ([#​1223](https://togithub.com/googleapis/python-storage/issues/1223)) ([7bb8065](https://togithub.com/googleapis/python-storage/commit/7bb806538cf3d7a5e16390db1983620933d5e51a)) ### [`v2.15.0`](https://togithub.com/googleapis/python-storage/blob/HEAD/CHANGELOG.md#2150-2024-02-28) [Compare Source](https://togithub.com/googleapis/python-storage/compare/v2.14.0...v2.15.0) ##### Features - Support custom universe domains/TPC ([#​1212](https://togithub.com/googleapis/python-storage/issues/1212)) ([f4cf041](https://togithub.com/googleapis/python-storage/commit/f4cf041a5f2075cecf5f4993f8b7afda0476a52b)) ##### Bug Fixes - Add "updated" as property for Bucket ([#​1220](https://togithub.com/googleapis/python-storage/issues/1220)) ([ae9a53b](https://togithub.com/googleapis/python-storage/commit/ae9a53b464e7d82c79a019a4111c49a4cdcc3ae0)) - Remove utcnow usage ([#​1215](https://togithub.com/googleapis/python-storage/issues/1215)) ([8d8a53a](https://togithub.com/googleapis/python-storage/commit/8d8a53a1368392ad7a1c4352f559c12932c5a9c9))
pandas-dev/pandas (pandas) ### [`v2.2.1`](https://togithub.com/pandas-dev/pandas/releases/tag/v2.2.1): Pandas 2.2.1 [Compare Source](https://togithub.com/pandas-dev/pandas/compare/v2.2.0...v2.2.1) We are pleased to announce the release of pandas 2.2.1. This release includes some new features, bug fixes, and performance improvements. We recommend that all users upgrade to this version. See the [full whatsnew](https://pandas.pydata.org/pandas-docs/version/2.2.1/whatsnew/v2.2.1.html) for a list of all the changes. Pandas 2.2.1 supports Python 3.9 and higher. The release will be available on the defaults and conda-forge channels: conda install pandas Or via PyPI: python3 -m pip install --upgrade pandas Please report any issues with the release on the [pandas issue tracker](https://togithub.com/pandas-dev/pandas/issues). Thanks to all the contributors who made this release possible. ### [`v2.2.0`](https://togithub.com/pandas-dev/pandas/compare/v2.1.4...v2.2.0) [Compare Source](https://togithub.com/pandas-dev/pandas/compare/v2.1.4...v2.2.0)
pytest-dev/pytest (pytest) ### [`v8.1.1`](https://togithub.com/pytest-dev/pytest/releases/tag/8.1.1) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.1.0...8.1.1) # pytest 8.1.1 (2024-03-08) ::: {.note} ::: {.title} Note ::: This release is not a usual bug fix release -- it contains features and improvements, being a follow up to `8.1.0`, which has been yanked from PyPI. ::: ## Features - [#​11475](https://togithub.com/pytest-dev/pytest/issues/11475): Added the new `consider_namespace_packages`{.interpreted-text role="confval"} configuration option, defaulting to `False`. If set to `True`, pytest will attempt to identify modules that are part of [namespace packages](https://packaging.python.org/en/latest/guides/packaging-namespace-packages) when importing modules. - [#​11653](https://togithub.com/pytest-dev/pytest/issues/11653): Added the new `verbosity_test_cases`{.interpreted-text role="confval"} configuration option for fine-grained control of test execution verbosity. See `Fine-grained verbosity `{.interpreted-text role="ref"} for more details. ## Improvements - [#​10865](https://togithub.com/pytest-dev/pytest/issues/10865): `pytest.warns`{.interpreted-text role="func"} now validates that `warnings.warn`{.interpreted-text role="func"} was called with a \[str]{.title-ref} or a \[Warning]{.title-ref}. Currently in Python it is possible to use other types, however this causes an exception when `warnings.filterwarnings`{.interpreted-text role="func"} is used to filter those warnings (see [CPython #​103577](https://togithub.com/python/cpython/issues/103577) for a discussion). While this can be considered a bug in CPython, we decided to put guards in pytest as the error message produced without this check in place is confusing. - [#​11311](https://togithub.com/pytest-dev/pytest/issues/11311): When using `--override-ini` for paths in invocations without a configuration file defined, the current working directory is used as the relative directory. Previoulsy this would raise an `AssertionError`{.interpreted-text role="class"}. - [#​11475](https://togithub.com/pytest-dev/pytest/issues/11475): `--import-mode=importlib `{.interpreted-text role="ref"} now tries to import modules using the standard import mechanism (but still without changing :py`sys.path`{.interpreted-text role="data"}), falling back to importing modules directly only if that fails. This means that installed packages will be imported under their canonical name if possible first, for example `app.core.models`, instead of having the module name always be derived from their path (for example `.env310.lib.site_packages.app.core.models`). - [#​11801](https://togithub.com/pytest-dev/pytest/issues/11801): Added the `iter_parents() <_pytest.nodes.Node.iter_parents>`{.interpreted-text role="func"} helper method on nodes. It is similar to `listchain <_pytest.nodes.Node.listchain>`{.interpreted-text role="func"}, but goes from bottom to top, and returns an iterator, not a list. - [#​11850](https://togithub.com/pytest-dev/pytest/issues/11850): Added support for `sys.last_exc`{.interpreted-text role="data"} for post-mortem debugging on Python>=3.12. - [#​11962](https://togithub.com/pytest-dev/pytest/issues/11962): In case no other suitable candidates for configuration file are found, a `pyproject.toml` (even without a `[tool.pytest.ini_options]` table) will be considered as the configuration file and define the `rootdir`. - [#​11978](https://togithub.com/pytest-dev/pytest/issues/11978): Add `--log-file-mode` option to the logging plugin, enabling appending to log-files. This option accepts either `"w"` or `"a"` and defaults to `"w"`. Previously, the mode was hard-coded to be `"w"` which truncates the file before logging. - [#​12047](https://togithub.com/pytest-dev/pytest/issues/12047): When multiple finalizers of a fixture raise an exception, now all exceptions are reported as an exception group. Previously, only the first exception was reported. ## Bug Fixes - [#​11475](https://togithub.com/pytest-dev/pytest/issues/11475): Fixed regression where `--importmode=importlib` would import non-test modules more than once. - [#​11904](https://togithub.com/pytest-dev/pytest/issues/11904): Fixed a regression in pytest 8.0.0 that would cause test collection to fail due to permission errors when using `--pyargs`. This change improves the collection tree for tests specified using `--pyargs`, see `12043`{.interpreted-text role="pull"} for a comparison with pytest 8.0 and <8. - [#​12011](https://togithub.com/pytest-dev/pytest/issues/12011): Fixed a regression in 8.0.1 whereby `setup_module` xunit-style fixtures are not executed when `--doctest-modules` is passed. - [#​12014](https://togithub.com/pytest-dev/pytest/issues/12014): Fix the `stacklevel` used when warning about marks used on fixtures. - [#​12039](https://togithub.com/pytest-dev/pytest/issues/12039): Fixed a regression in `8.0.2` where tests created using `tmp_path`{.interpreted-text role="fixture"} have been collected multiple times in CI under Windows. ## Improved Documentation - [#​11790](https://togithub.com/pytest-dev/pytest/issues/11790): Documented the retention of temporary directories created using the `tmp_path` fixture in more detail. ## Trivial/Internal Changes - [#​11785](https://togithub.com/pytest-dev/pytest/issues/11785): Some changes were made to private functions which may affect plugins which access them: - `FixtureManager._getautousenames()` now takes a `Node` itself instead of the nodeid. - `FixtureManager.getfixturedefs()` now takes the `Node` itself instead of the nodeid. - The `_pytest.nodes.iterparentnodeids()` function is removed without replacement. Prefer to traverse the node hierarchy itself instead. If you really need to, copy the function from the previous pytest release. - [#​12069](https://togithub.com/pytest-dev/pytest/issues/12069): Delayed the deprecation of the following features to `9.0.0`: - `node-ctor-fspath-deprecation`{.interpreted-text role="ref"}. - `legacy-path-hooks-deprecated`{.interpreted-text role="ref"}. It was discovered after `8.1.0` was released that the warnings about the impeding removal were not being displayed, so the team decided to revert the removal. This is the reason for `8.1.0` being yanked. # pytest 8.1.0 (YANKED) ::: {.note} ::: {.title} Note ::: This release has been **yanked**: it broke some plugins without the proper warning period, due to some warnings not showing up as expected. See [#​12069](https://togithub.com/pytest-dev/pytest/issues/12069). ::: ### [`v8.1.0`](https://togithub.com/pytest-dev/pytest/releases/tag/8.1.0) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.0.2...8.1.0) # pytest 8.1.0 (YANKED) > \[!IMPORTANT]\ > This release has been **yanked**: it broke some plugins without the proper warning period, due to some warnings not showing up as expected. See [#​12069](https://togithub.com/pytest-dev/pytest/issues/12069). ## Features - [#​11475](https://togithub.com/pytest-dev/pytest/issues/11475): Added the new `consider_namespace_packages`{.interpreted-text role="confval"} configuration option, defaulting to `False`. If set to `True`, pytest will attempt to identify modules that are part of [namespace packages](https://packaging.python.org/en/latest/guides/packaging-namespace-packages) when importing modules. - [#​11653](https://togithub.com/pytest-dev/pytest/issues/11653): Added the new `verbosity_test_cases`{.interpreted-text role="confval"} configuration option for fine-grained control of test execution verbosity. See `Fine-grained verbosity `{.interpreted-text role="ref"} for more details. ## Improvements - [#​10865](https://togithub.com/pytest-dev/pytest/issues/10865): `pytest.warns`{.interpreted-text role="func"} now validates that `warnings.warn`{.interpreted-text role="func"} was called with a \[str]{.title-ref} or a \[Warning]{.title-ref}. Currently in Python it is possible to use other types, however this causes an exception when `warnings.filterwarnings`{.interpreted-text role="func"} is used to filter those warnings (see [CPython #​103577](https://togithub.com/python/cpython/issues/103577) for a discussion). While this can be considered a bug in CPython, we decided to put guards in pytest as the error message produced without this check in place is confusing. - [#​11311](https://togithub.com/pytest-dev/pytest/issues/11311): When using `--override-ini` for paths in invocations without a configuration file defined, the current working directory is used as the relative directory. Previoulsy this would raise an `AssertionError`{.interpreted-text role="class"}. - [#​11475](https://togithub.com/pytest-dev/pytest/issues/11475): `--import-mode=importlib `{.interpreted-text role="ref"} now tries to import modules using the standard import mechanism (but still without changing :py`sys.path`{.interpreted-text role="data"}), falling back to importing modules directly only if that fails. This means that installed packages will be imported under their canonical name if possible first, for example `app.core.models`, instead of having the module name always be derived from their path (for example `.env310.lib.site_packages.app.core.models`). - [#​11801](https://togithub.com/pytest-dev/pytest/issues/11801): Added the `iter_parents() <_pytest.nodes.Node.iter_parents>`{.interpreted-text role="func"} helper method on nodes. It is similar to `listchain <_pytest.nodes.Node.listchain>`{.interpreted-text role="func"}, but goes from bottom to top, and returns an iterator, not a list. - [#​11850](https://togithub.com/pytest-dev/pytest/issues/11850): Added support for `sys.last_exc`{.interpreted-text role="data"} for post-mortem debugging on Python>=3.12. - [#​11962](https://togithub.com/pytest-dev/pytest/issues/11962): In case no other suitable candidates for configuration file are found, a `pyproject.toml` (even without a `[tool.pytest.ini_options]` table) will be considered as the configuration file and define the `rootdir`. - [#​11978](https://togithub.com/pytest-dev/pytest/issues/11978): Add `--log-file-mode` option to the logging plugin, enabling appending to log-files. This option accepts either `"w"` or `"a"` and defaults to `"w"`. Previously, the mode was hard-coded to be `"w"` which truncates the file before logging. - [#​12047](https://togithub.com/pytest-dev/pytest/issues/12047): When multiple finalizers of a fixture raise an exception, now all exceptions are reported as an exception group. Previously, only the first exception was reported. ## Bug Fixes - [#​11904](https://togithub.com/pytest-dev/pytest/issues/11904): Fixed a regression in pytest 8.0.0 that would cause test collection to fail due to permission errors when using `--pyargs`. This change improves the collection tree for tests specified using `--pyargs`, see `12043`{.interpreted-text role="pull"} for a comparison with pytest 8.0 and <8. - [#​12011](https://togithub.com/pytest-dev/pytest/issues/12011): Fixed a regression in 8.0.1 whereby `setup_module` xunit-style fixtures are not executed when `--doctest-modules` is passed. - [#​12014](https://togithub.com/pytest-dev/pytest/issues/12014): Fix the `stacklevel` used when warning about marks used on fixtures. - [#​12039](https://togithub.com/pytest-dev/pytest/issues/12039): Fixed a regression in `8.0.2` where tests created using `tmp_path`{.interpreted-text role="fixture"} have been collected multiple times in CI under Windows. ## Improved Documentation - [#​11790](https://togithub.com/pytest-dev/pytest/issues/11790): Documented the retention of temporary directories created using the `tmp_path` fixture in more detail. ## Trivial/Internal Changes - [#​11785](https://togithub.com/pytest-dev/pytest/issues/11785): Some changes were made to private functions which may affect plugins which access them: - `FixtureManager._getautousenames()` now takes a `Node` itself instead of the nodeid. - `FixtureManager.getfixturedefs()` now takes the `Node` itself instead of the nodeid. - The `_pytest.nodes.iterparentnodeids()` function is removed without replacement. Prefer to traverse the node hierarchy itself instead. If you really need to, copy the function from the previous pytest release. ### [`v8.0.2`](https://togithub.com/pytest-dev/pytest/releases/tag/8.0.2) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.0.1...8.0.2) # pytest 8.0.2 (2024-02-24) ## Bug Fixes - [#​11895](https://togithub.com/pytest-dev/pytest/issues/11895): Fix collection on Windows where initial paths contain the short version of a path (for example `c:\PROGRA~1\tests`). - [#​11953](https://togithub.com/pytest-dev/pytest/issues/11953): Fix an `IndexError` crash raising from `getstatementrange_ast`. - [#​12021](https://togithub.com/pytest-dev/pytest/issues/12021): Reverted a fix to \[--maxfail]{.title-ref} handling in pytest 8.0.0 because it caused a regression in pytest-xdist whereby session fixture teardowns may get executed multiple times when the max-fails is reached. ### [`v8.0.1`](https://togithub.com/pytest-dev/pytest/releases/tag/8.0.1) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.0.0...8.0.1) # pytest 8.0.1 (2024-02-16) ## Bug Fixes - [#​11875](https://togithub.com/pytest-dev/pytest/issues/11875): Correctly handle errors from `getpass.getuser`{.interpreted-text role="func"} in Python 3.13. - [#​11879](https://togithub.com/pytest-dev/pytest/issues/11879): Fix an edge case where `ExceptionInfo._stringify_exception` could crash `pytest.raises`{.interpreted-text role="func"}. - [#​11906](https://togithub.com/pytest-dev/pytest/issues/11906): Fix regression with `pytest.warns`{.interpreted-text role="func"} using custom warning subclasses which have more than one parameter in their \[\__init\_\_]{.title-ref}. - [#​11907](https://togithub.com/pytest-dev/pytest/issues/11907): Fix a regression in pytest 8.0.0 whereby calling `pytest.skip`{.interpreted-text role="func"} and similar control-flow exceptions within a `pytest.warns()`{.interpreted-text role="func"} block would get suppressed instead of propagating. - [#​11929](https://togithub.com/pytest-dev/pytest/issues/11929): Fix a regression in pytest 8.0.0 whereby autouse fixtures defined in a module get ignored by the doctests in the module. - [#​11937](https://togithub.com/pytest-dev/pytest/issues/11937): Fix a regression in pytest 8.0.0 whereby items would be collected in reverse order in some circumstances. ### [`v8.0.0`](https://togithub.com/pytest-dev/pytest/releases/tag/8.0.0): pytest 8.0.0 (2024-01-27) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/7.4.4...8.0.0) See [8.0.0rc1](https://togithub.com/pytest-dev/pytest/releases/tag/8.0.0rc1) and [8.0.0rc2](https://togithub.com/pytest-dev/pytest/releases/tag/8.0.0rc2) for the full changes since pytest 7.4! #### Bug Fixes - [#​11842](https://togithub.com/pytest-dev/pytest/issues/11842): Properly escape the `reason` of a `skip `{.interpreted-text role="ref"} mark when writing JUnit XML files. - [#​11861](https://togithub.com/pytest-dev/pytest/issues/11861): Avoid microsecond exceeds `1_000_000` when using `log-date-format` with `%f` specifier, which might cause the test suite to crash.
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/googleapis/python-storage). --- samples/snippets/requirements-test.txt | 5 +++-- samples/snippets/requirements.txt | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 9035a0f91..86a3ade30 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,3 +1,4 @@ -pytest==7.4.4 +pytest===7.4.4; python_version == '3.7' +pytest==8.1.1; python_version >= '3.8' mock==5.1.0 -backoff==2.2.1 \ No newline at end of file +backoff==2.2.1 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 15a684973..782275255 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-pubsub==2.19.0 -google-cloud-storage==2.14.0 +google-cloud-pubsub==2.21.0 +google-cloud-storage==2.16.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' -pandas==2.1.4; python_version >= '3.9' +pandas==2.2.1; python_version >= '3.9' From bdd426adf5901faa36115885af868ef50e356a36 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 10 Apr 2024 19:06:31 -0700 Subject: [PATCH 253/509] docs: update DEFAULT_RETRY_IF_GENERATION_SPECIFIED docstrings (#1234) * docs: update DEFAULT_RETRY_IF_GENERATION_SPECIFIED docstrings * update docstrings --- google/cloud/storage/blob.py | 139 +++++++++++++++------------------ google/cloud/storage/bucket.py | 32 +++++++- 2 files changed, 93 insertions(+), 78 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 9c0cf33ab..b0b4a663f 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -787,7 +787,13 @@ def delete( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). :raises: :class:`google.cloud.exceptions.NotFound` (propagated from @@ -2769,26 +2775,17 @@ def upload_from_file( "md5", "crc32c" and None. The default is None. :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy - :param retry: (Optional) How to retry the RPC. A None value will disable - retries. A google.api_core.retry.Retry value will enable retries, - and the object will define retriable response codes and errors and - configure backoff and timeout options. - - A google.cloud.storage.retry.ConditionalRetryPolicy value wraps a - Retry object and activates it only if certain conditions are met. - This class exists to provide safe defaults for RPC calls that are - not technically safe to retry normally (due to potential data - duplication or other side-effects) but become safe to retry if a - condition such as if_generation_match is set. - - See the retry.py source code and docstrings in this package - (google.cloud.storage.retry) for information on retry types and how - to configure them. + :param retry: (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). Media operations (downloads and uploads) do not support non-default - predicates in a Retry object. The default will always be used. Other - configuration changes for Retry objects such as delays and deadlines - are respected. + predicates in a Retry object. Other configuration changes for Retry objects + such as delays and deadlines are respected. :raises: :class:`~google.cloud.exceptions.GoogleCloudError` if the upload response returns an error status. @@ -2934,26 +2931,17 @@ def upload_from_filename( "md5", "crc32c" and None. The default is None. :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy - :param retry: (Optional) How to retry the RPC. A None value will disable - retries. A google.api_core.retry.Retry value will enable retries, - and the object will define retriable response codes and errors and - configure backoff and timeout options. - - A google.cloud.storage.retry.ConditionalRetryPolicy value wraps a - Retry object and activates it only if certain conditions are met. - This class exists to provide safe defaults for RPC calls that are - not technically safe to retry normally (due to potential data - duplication or other side-effects) but become safe to retry if a - condition such as if_generation_match is set. - - See the retry.py source code and docstrings in this package - (google.cloud.storage.retry) for information on retry types and how - to configure them. + :param retry: (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). Media operations (downloads and uploads) do not support non-default - predicates in a Retry object. The default will always be used. Other - configuration changes for Retry objects such as delays and deadlines - are respected. + predicates in a Retry object. Other configuration changes for Retry objects + such as delays and deadlines are respected. """ self._handle_filename_and_upload( @@ -3063,26 +3051,17 @@ def upload_from_string( "md5", "crc32c" and None. The default is None. :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy - :param retry: (Optional) How to retry the RPC. A None value will disable - retries. A google.api_core.retry.Retry value will enable retries, - and the object will define retriable response codes and errors and - configure backoff and timeout options. - - A google.cloud.storage.retry.ConditionalRetryPolicy value wraps a - Retry object and activates it only if certain conditions are met. - This class exists to provide safe defaults for RPC calls that are - not technically safe to retry normally (due to potential data - duplication or other side-effects) but become safe to retry if a - condition such as if_generation_match is set. - - See the retry.py source code and docstrings in this package - (google.cloud.storage.retry) for information on retry types and how - to configure them. + :param retry: (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). Media operations (downloads and uploads) do not support non-default - predicates in a Retry object. The default will always be used. Other - configuration changes for Retry objects such as delays and deadlines - are respected. + predicates in a Retry object. Other configuration changes for Retry objects + such as delays and deadlines are respected. """ data = _to_bytes(data, encoding="utf-8") string_buffer = BytesIO(data) @@ -3209,23 +3188,17 @@ def create_resumable_upload_session( (Optional) See :ref:`using-if-metageneration-not-match` :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy - :param retry: (Optional) How to retry the RPC. A None value will disable - retries. A google.api_core.retry.Retry value will enable retries, - and the object will define retriable response codes and errors and - configure backoff and timeout options. - A google.cloud.storage.retry.ConditionalRetryPolicy value wraps a - Retry object and activates it only if certain conditions are met. - This class exists to provide safe defaults for RPC calls that are - not technically safe to retry normally (due to potential data - duplication or other side-effects) but become safe to retry if a - condition such as if_generation_match is set. - See the retry.py source code and docstrings in this package - (google.cloud.storage.retry) for information on retry types and how - to configure them. + :param retry: (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). + Media operations (downloads and uploads) do not support non-default - predicates in a Retry object. The default will always be used. Other - configuration changes for Retry objects such as delays and deadlines - are respected. + predicates in a Retry object. Other configuration changes for Retry objects + such as delays and deadlines are respected. :rtype: str :returns: The resumable upload session URL. The upload can be @@ -3631,7 +3604,13 @@ def compose( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). """ sources_len = len(sources) client = self._require_client(client) @@ -3793,7 +3772,13 @@ def rewrite( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). :rtype: tuple :returns: ``(token, bytes_rewritten, total_bytes)``, where ``token`` @@ -3953,7 +3938,13 @@ def update_storage_class( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). """ # Update current blob's storage class prior to rewrite self._patch_property("storageClass", new_class) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index c83e2a958..2b42b81a9 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1656,7 +1656,13 @@ def delete_blob( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). :raises: :class:`google.cloud.exceptions.NotFound` Raises a NotFound if the blob isn't found. To suppress @@ -1757,7 +1763,13 @@ def delete_blobs( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). :raises: :class:`~google.cloud.exceptions.NotFound` (if `on_error` is not passed). @@ -1902,7 +1914,13 @@ def copy_blob( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). :rtype: :class:`google.cloud.storage.blob.Blob` :returns: The new Blob. @@ -2049,7 +2067,13 @@ def rename_blob( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: - (Optional) How to retry the RPC. See: :ref:`configuring_retries` + (Optional) How to retry the RPC. + The default value is ``DEFAULT_RETRY_IF_GENERATION_SPECIFIED``, a conditional retry + policy which will only enable retries if ``if_generation_match`` or ``generation`` + is set, in order to ensure requests are idempotent before retrying them. + Change the value to ``DEFAULT_RETRY`` or another `google.api_core.retry.Retry` object + to enable retries regardless of generation precondition setting. + See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). :rtype: :class:`Blob` :returns: The newly-renamed blob. From 343f4c0890fd98347217fafbf8ca2424d302e164 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 11 Apr 2024 12:09:43 -0700 Subject: [PATCH 254/509] samples: add samples for object retention (#1247) --- samples/snippets/snippets_test.py | 23 +++++++ .../storage_create_bucket_object_retention.py | 38 +++++++++++ .../snippets/storage_get_bucket_metadata.py | 1 + samples/snippets/storage_get_metadata.py | 2 + .../storage_set_object_retention_policy.py | 67 +++++++++++++++++++ 5 files changed, 131 insertions(+) create mode 100644 samples/snippets/storage_create_bucket_object_retention.py create mode 100644 samples/snippets/storage_set_object_retention_policy.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index ff1d23005..f9851b0ec 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -37,6 +37,7 @@ import storage_cors_configuration import storage_create_bucket_class_location import storage_create_bucket_dual_region +import storage_create_bucket_object_retention import storage_define_bucket_website_configuration import storage_delete_file import storage_delete_file_archived_generation @@ -71,6 +72,7 @@ import storage_set_autoclass import storage_set_bucket_default_kms_key import storage_set_client_endpoint +import storage_set_object_retention_policy import storage_set_metadata import storage_transfer_manager_download_bucket import storage_transfer_manager_download_chunks_concurrently @@ -818,3 +820,24 @@ def test_transfer_manager_upload_chunks_concurrently(test_bucket, capsys): out, _ = capsys.readouterr() assert "File {} uploaded to {}".format(file.name, BLOB_NAME) in out + + +def test_object_retention_policy(test_bucket_create, capsys): + storage_create_bucket_object_retention.create_bucket_object_retention( + test_bucket_create.name + ) + out, _ = capsys.readouterr() + assert f"Created bucket {test_bucket_create.name} with object retention enabled setting" in out + + blob_name = "test_object_retention" + storage_set_object_retention_policy.set_object_retention_policy( + test_bucket_create.name, "hello world", blob_name + ) + out, _ = capsys.readouterr() + assert f"Retention policy for file {blob_name}" in out + + # Remove retention policy for test cleanup + blob = test_bucket_create.blob(blob_name) + blob.retention.mode = None + blob.retention.retain_until_time = None + blob.patch(override_unlocked_retention=True) diff --git a/samples/snippets/storage_create_bucket_object_retention.py b/samples/snippets/storage_create_bucket_object_retention.py new file mode 100644 index 000000000..4ebc32c0a --- /dev/null +++ b/samples/snippets/storage_create_bucket_object_retention.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_create_bucket_with_object_retention] +from google.cloud import storage + + +def create_bucket_object_retention(bucket_name): + """Creates a bucket with object retention enabled.""" + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.create_bucket(bucket_name, enable_object_retention=True) + + print(f"Created bucket {bucket_name} with object retention enabled setting: {bucket.object_retention_mode}") + + +# [END storage_create_bucket_with_object_retention] + + +if __name__ == "__main__": + create_bucket_object_retention(bucket_name=sys.argv[1]) diff --git a/samples/snippets/storage_get_bucket_metadata.py b/samples/snippets/storage_get_bucket_metadata.py index 87cd5eddc..c86e154de 100644 --- a/samples/snippets/storage_get_bucket_metadata.py +++ b/samples/snippets/storage_get_bucket_metadata.py @@ -44,6 +44,7 @@ def bucket_metadata(bucket_name): print(f"Retention Effective Time: {bucket.retention_policy_effective_time}") print(f"Retention Period: {bucket.retention_period}") print(f"Retention Policy Locked: {bucket.retention_policy_locked}") + print(f"Object Retention Mode: {bucket.object_retention_mode}") print(f"Requester Pays: {bucket.requester_pays}") print(f"Self Link: {bucket.self_link}") print(f"Time Created: {bucket.time_created}") diff --git a/samples/snippets/storage_get_metadata.py b/samples/snippets/storage_get_metadata.py index eece8028a..7216efdb4 100644 --- a/samples/snippets/storage_get_metadata.py +++ b/samples/snippets/storage_get_metadata.py @@ -59,6 +59,8 @@ def blob_metadata(bucket_name, blob_name): "Event based hold: ", "enabled" if blob.event_based_hold else "disabled", ) + print(f"Retention mode: {blob.retention.mode}") + print(f"Retention retain until time: {blob.retention.retain_until_time}") if blob.retention_expiration_time: print( f"retentionExpirationTime: {blob.retention_expiration_time}" diff --git a/samples/snippets/storage_set_object_retention_policy.py b/samples/snippets/storage_set_object_retention_policy.py new file mode 100644 index 000000000..d0d3a54ec --- /dev/null +++ b/samples/snippets/storage_set_object_retention_policy.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import sys + +# [START storage_set_object_retention_policy] +from google.cloud import storage + + +def set_object_retention_policy(bucket_name, contents, destination_blob_name): + """Set the object retention policy of a file.""" + + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + # The contents to upload to the file + # contents = "these are my contents" + + # The ID of your GCS object + # destination_blob_name = "storage-object-name" + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(destination_blob_name) + blob.upload_from_string(contents) + + # Set the retention policy for the file. + blob.retention.mode = "Unlocked" + retention_date = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=10) + blob.retention.retain_until_time = retention_date + blob.patch() + print( + f"Retention policy for file {destination_blob_name} was set to: {blob.retention.mode}." + ) + + # To modify an existing policy on an unlocked file object, pass in the override parameter. + new_retention_date = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=9) + blob.retention.retain_until_time = new_retention_date + blob.patch(override_unlocked_retention=True) + print( + f"Retention policy for file {destination_blob_name} was updated to: {blob.retention.retain_until_time}." + ) + + +# [END storage_set_object_retention_policy] + + +if __name__ == "__main__": + set_object_retention_policy( + bucket_name=sys.argv[1], + contents=sys.argv[2], + destination_blob_name=sys.argv[3], + ) From aec255f696389e9d0919799e1dc9c4f327594d67 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 12 Apr 2024 17:35:59 +0200 Subject: [PATCH 255/509] chore(deps): update all dependencies (#1250) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 782275255..f08196685 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.21.0 +google-cloud-pubsub==2.21.1 google-cloud-storage==2.16.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' From cb3459ee15c57598fe0ede41c00ab0ab0a05415e Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 12:01:38 -0400 Subject: [PATCH 256/509] chore(python): bump idna from 3.4 to 3.7 in .kokoro (#1259) * chore(python): bump idna from 3.4 to 3.7 in .kokoro Source-Link: https://github.com/googleapis/synthtool/commit/d50980e704793a2d3310bfb3664f3a82f24b5796 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:5a4c19d17e597b92d786e569be101e636c9c2817731f80a5adec56b2aa8fe070 * Apply changes from googleapis/synthtool#1950 --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 ++-- .github/auto-label.yaml | 5 +++++ .github/blunderbuss.yml | 17 +++++++++++++++++ .kokoro/requirements.txt | 6 +++--- docs/index.rst | 5 +++++ docs/summary_overview.md | 22 ++++++++++++++++++++++ 6 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 .github/blunderbuss.yml create mode 100644 docs/summary_overview.md diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 4bdeef390..81f87c569 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:a8a80fc6456e433df53fc2a0d72ca0345db0ddefb409f1b75b118dfd1babd952 -# created: 2024-03-15T16:25:47.905264637Z + digest: sha256:5a4c19d17e597b92d786e569be101e636c9c2817731f80a5adec56b2aa8fe070 +# created: 2024-04-12T11:35:58.922854369Z diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml index b2016d119..8b37ee897 100644 --- a/.github/auto-label.yaml +++ b/.github/auto-label.yaml @@ -13,3 +13,8 @@ # limitations under the License. requestsize: enabled: true + +path: + pullrequest: true + paths: + samples: "samples" diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml new file mode 100644 index 000000000..d0b41f786 --- /dev/null +++ b/.github/blunderbuss.yml @@ -0,0 +1,17 @@ +# Blunderbuss config +# +# This file controls who is assigned for pull requests and issues. +# Note: This file is autogenerated. To make changes to the assignee +# team, please update `codeowner_team` in `.repo-metadata.json`. +assign_issues: + - googleapis/cloud-storage-dpe + +assign_issues_by: + - labels: + - "samples" + to: + - googleapis/python-samples-reviewers + - googleapis/cloud-storage-dpe + +assign_prs: + - googleapis/cloud-storage-dpe diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index dd61f5f32..51f92b8e1 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -252,9 +252,9 @@ googleapis-common-protos==1.61.0 \ --hash=sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0 \ --hash=sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b # via google-api-core -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests importlib-metadata==6.8.0 \ --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ diff --git a/docs/index.rst b/docs/index.rst index 1dd08278a..7772500bb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -49,3 +49,8 @@ Changelog :maxdepth: 2 changelog + +.. toctree:: + :hidden: + + summary_overview.md diff --git a/docs/summary_overview.md b/docs/summary_overview.md new file mode 100644 index 000000000..e735f9658 --- /dev/null +++ b/docs/summary_overview.md @@ -0,0 +1,22 @@ +[ +This is a templated file. Adding content to this file may result in it being +reverted. Instead, if you want to place additional content, create an +"overview_content.md" file in `docs/` directory. The Sphinx tool will +pick up on the content and merge the content. +]: # + +# Google Cloud Storage API + +Overview of the APIs available for Google Cloud Storage API. + +## All entries + +Classes, methods and properties & attributes for +Google Cloud Storage API. + +[classes](https://cloud.google.com/python/docs/reference/storage/latest/summary_class.html) + +[methods](https://cloud.google.com/python/docs/reference/storage/latest/summary_method.html) + +[properties and +attributes](https://cloud.google.com/python/docs/reference/storage/latest/summary_property.html) From 2f77e1bf1de23352c6d83cd85b429a6b654ee51c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 12 Apr 2024 18:02:21 +0200 Subject: [PATCH 257/509] chore(deps): update all dependencies (#1260) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index f08196685..b0e41fa84 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -2,4 +2,4 @@ google-cloud-pubsub==2.21.1 google-cloud-storage==2.16.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' -pandas==2.2.1; python_version >= '3.9' +pandas==2.2.2; python_version >= '3.9' From 6ed22ee91d4596dd27338ff8b35076d1238a603c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 12 Apr 2024 23:42:46 +0200 Subject: [PATCH 258/509] chore(deps): update dependency pandas (#1261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot From 3d6d3693d5c1b24cd3d2bbdeabfd78b8bfd4161a Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 8 May 2024 16:22:39 -0700 Subject: [PATCH 259/509] docs: reference Storage Control in readme (#1254) * docs: reference Storage Control in readme * review comment --- README.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.rst b/README.rst index 61b5a62eb..9eef57645 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,11 @@ A comprehensive list of changes in each version may be found in the `CHANGELOG`_ - `Client Library Documentation`_ - `github.com/googleapis/python-storage`_ +Certain control plane and long-running operations for Cloud Storage (including Folder +and Managed Folder operations) are supported via the `Storage Control Client`_. +The `Storage Control API`_ creates one space to perform metadata-specific, control plane, +and long-running operations apart from the Storage API. + Read more about the client libraries for Cloud APIs, including the older Google APIs Client Libraries, in `Client Libraries Explained`_. @@ -28,6 +33,8 @@ Google APIs Client Libraries, in `Client Libraries Explained`_. .. _Product Documentation: https://cloud.google.com/storage .. _CHANGELOG: https://github.com/googleapis/python-storage/blob/main/CHANGELOG.md .. _github.com/googleapis/python-storage: https://github.com/googleapis/python-storage +.. _Storage Control Client: https://cloud.google.com/python/docs/reference/google-cloud-storage-control/latest +.. _Storage Control API: https://cloud.google.com/storage/docs/reference/rpc/google.storage.control.v2 .. _Client Libraries Explained: https://cloud.google.com/apis/docs/client-libraries-explained Quick Start From 4db96c960b07e503c1031c9fa879cf2af195f513 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 16 May 2024 14:42:23 -0700 Subject: [PATCH 260/509] fix: remove deprecated methods in samples and tests (#1274) * chore: remove deprecated methods in samples and tests * update method --- docs/snippets.py | 2 +- samples/snippets/encryption_test.py | 2 +- samples/snippets/rpo_test.py | 4 ++-- samples/snippets/storage_create_bucket_turbo_replication.py | 4 ++-- tests/system/test_blob.py | 2 +- tests/system/test_bucket.py | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/snippets.py b/docs/snippets.py index 93884900f..631dca468 100644 --- a/docs/snippets.py +++ b/docs/snippets.py @@ -39,7 +39,7 @@ def storage_get_started(to_delete): bucket = client.get_bucket("bucket-id-here") # Then do other things... blob = bucket.get_blob("/remote/path/to/file.txt") - assert blob.download_as_string() == b"My old contents!" + assert blob.download_as_bytes() == b"My old contents!" blob.upload_from_string("New contents!") blob2 = bucket.blob("/remote/path/storage.txt") blob2.upload_from_filename(filename="/local/path.txt") diff --git a/samples/snippets/encryption_test.py b/samples/snippets/encryption_test.py index ff7a568e0..9039b1fad 100644 --- a/samples/snippets/encryption_test.py +++ b/samples/snippets/encryption_test.py @@ -125,4 +125,4 @@ def test_object_csek_to_cmek(test_blob): BUCKET, test_blob_name, TEST_ENCRYPTION_KEY_2, KMS_KEY ) - assert cmek_blob.download_as_string(), test_blob_content + assert cmek_blob.download_as_bytes(), test_blob_content diff --git a/samples/snippets/rpo_test.py b/samples/snippets/rpo_test.py index befc0334a..0dcf15746 100644 --- a/samples/snippets/rpo_test.py +++ b/samples/snippets/rpo_test.py @@ -27,11 +27,11 @@ def dual_region_bucket(): """Yields a dual region bucket that is deleted after the test completes.""" bucket = None + location = "NAM4" while bucket is None or bucket.exists(): bucket_name = f"bucket-lock-{uuid.uuid4()}" bucket = storage.Client().bucket(bucket_name) - bucket.location = "NAM4" - bucket.create() + bucket.create(location=location) yield bucket bucket.delete(force=True) diff --git a/samples/snippets/storage_create_bucket_turbo_replication.py b/samples/snippets/storage_create_bucket_turbo_replication.py index 3d26616ec..bc0559795 100644 --- a/samples/snippets/storage_create_bucket_turbo_replication.py +++ b/samples/snippets/storage_create_bucket_turbo_replication.py @@ -35,9 +35,9 @@ def create_bucket_turbo_replication(bucket_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) - bucket.location = "NAM4" + bucket_location = "NAM4" bucket.rpo = RPO_ASYNC_TURBO - bucket.create() + bucket.create(location=bucket_location) print(f"{bucket.name} created with the recovery point objective (RPO) set to {bucket.rpo} in {bucket.location}.") diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index a35c047b1..6069725ce 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -761,7 +761,7 @@ def test_blob_upload_download_crc32_md5_hash( download_blob = shared_bucket.blob("MyBuffer") - assert download_blob.download_as_string() == payload + assert download_blob.download_as_bytes() == payload assert download_blob.crc32c == blob.crc32c assert download_blob.md5_hash == blob.md5_hash diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 9b2fcd614..735570f6c 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -410,9 +410,9 @@ def test_bucket_copy_blob_w_metageneration_match( ): payload = b"DEADBEEF" bucket_name = _helpers.unique_name("generation-match") - created = _helpers.retry_429_503(storage_client.create_bucket)( - bucket_name, requester_pays=True - ) + bucket = storage_client.bucket(bucket_name) + bucket.requester_pays = True + created = _helpers.retry_429_503(storage_client.create_bucket)(bucket) buckets_to_delete.append(created) assert created.name == bucket_name From c52e882f65583a7739392926308cc34984561165 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 16 May 2024 17:35:37 -0700 Subject: [PATCH 261/509] feat: support page_size in bucket.list_blobs (#1275) --- google/cloud/storage/bucket.py | 7 +++++++ tests/unit/test_bucket.py | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 2b42b81a9..15fb408e8 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1308,6 +1308,7 @@ def list_blobs( match_glob=None, include_folders_as_prefixes=None, soft_deleted=None, + page_size=None, ): """Return an iterator used to find blobs in the bucket. @@ -1401,6 +1402,11 @@ def list_blobs( Note ``soft_deleted`` and ``versions`` cannot be set to True simultaneously. See: https://cloud.google.com/storage/docs/soft-delete + :type page_size: int + :param page_size: + (Optional) Maximum number of blobs to return in each page. + Defaults to a value set by the API. + :rtype: :class:`~google.api_core.page_iterator.Iterator` :returns: Iterator of all :class:`~google.cloud.storage.blob.Blob` in this bucket matching the arguments. @@ -1418,6 +1424,7 @@ def list_blobs( versions=versions, projection=projection, fields=fields, + page_size=page_size, timeout=timeout, retry=retry, match_glob=match_glob, diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index d8ce1e0f5..2df41c3ff 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1179,6 +1179,7 @@ def test_list_blobs_w_defaults(self): expected_fields = None expected_include_folders_as_prefixes = None soft_deleted = None + page_size = None client.list_blobs.assert_called_once_with( bucket, max_results=expected_max_results, @@ -1196,6 +1197,7 @@ def test_list_blobs_w_defaults(self): match_glob=expected_match_glob, include_folders_as_prefixes=expected_include_folders_as_prefixes, soft_deleted=soft_deleted, + page_size=page_size, ) def test_list_blobs_w_explicit(self): @@ -1211,6 +1213,7 @@ def test_list_blobs_w_explicit(self): include_folders_as_prefixes = True versions = True soft_deleted = True + page_size = 2 projection = "full" fields = "items/contentLanguage,nextPageToken" bucket = self._make_one(client=None, name=name) @@ -1236,6 +1239,7 @@ def test_list_blobs_w_explicit(self): match_glob=match_glob, include_folders_as_prefixes=include_folders_as_prefixes, soft_deleted=soft_deleted, + page_size=page_size, ) self.assertIs(iterator, other_client.list_blobs.return_value) @@ -1253,6 +1257,7 @@ def test_list_blobs_w_explicit(self): expected_fields = fields expected_include_folders_as_prefixes = include_folders_as_prefixes expected_soft_deleted = soft_deleted + expected_page_size = page_size other_client.list_blobs.assert_called_once_with( bucket, max_results=expected_max_results, @@ -1270,6 +1275,7 @@ def test_list_blobs_w_explicit(self): match_glob=expected_match_glob, include_folders_as_prefixes=expected_include_folders_as_prefixes, soft_deleted=expected_soft_deleted, + page_size=expected_page_size, ) def test_list_notifications_w_defaults(self): From add3c01f0974e22df7f0b50504d5e83e4235fd81 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 22 May 2024 10:10:58 -0700 Subject: [PATCH 262/509] feat: support HNS enablement in bucket metadata (#1278) * feat: support HNS enablement in bucket metadata * update docstrings --- google/cloud/storage/bucket.py | 29 +++++++++++++++++++++++++++++ tests/system/test_bucket.py | 29 +++++++++++++++++++++++++++++ tests/unit/test_bucket.py | 13 +++++++++++++ 3 files changed, 71 insertions(+) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 15fb408e8..7b6421d29 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2957,6 +2957,35 @@ def object_retention_mode(self): if object_retention is not None: return object_retention.get("mode") + @property + def hierarchical_namespace_enabled(self): + """Whether hierarchical namespace is enabled for this bucket. + + :setter: Update whether hierarchical namespace is enabled for this bucket. + :getter: Query whether hierarchical namespace is enabled for this bucket. + + :rtype: bool + :returns: True if enabled, else False. + """ + hns = self._properties.get("hierarchicalNamespace", {}) + return hns.get("enabled") + + @hierarchical_namespace_enabled.setter + def hierarchical_namespace_enabled(self, value): + """Enable or disable hierarchical namespace at the bucket-level. + + :type value: convertible to boolean + :param value: If true, enable hierarchical namespace for this bucket. + If false, disable hierarchical namespace for this bucket. + + .. note:: + To enable hierarchical namespace, you must set it at bucket creation time. + Currently, hierarchical namespace configuration cannot be changed after bucket creation. + """ + hns = self._properties.get("hierarchicalNamespace", {}) + hns["enabled"] = bool(value) + self._patch_property("hierarchicalNamespace", hns) + def configure_website(self, main_page_suffix=None, not_found_page=None): """Configure website-related properties. diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 735570f6c..270a77ad1 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1236,3 +1236,32 @@ def test_soft_delete_policy( bucket.soft_delete_policy.retention_duration_seconds = new_duration_secs bucket.patch() assert bucket.soft_delete_policy.retention_duration_seconds == new_duration_secs + + +def test_new_bucket_with_hierarchical_namespace( + storage_client, + buckets_to_delete, +): + # Test new bucket without specifying hierarchical namespace + bucket_name = _helpers.unique_name("new-wo-hns") + bucket_obj = storage_client.bucket(bucket_name) + bucket = storage_client.create_bucket(bucket_obj) + buckets_to_delete.append(bucket) + assert bucket.hierarchical_namespace_enabled is None + + # Test new bucket with hierarchical namespace disabled + bucket_name = _helpers.unique_name("new-hns-disabled") + bucket_obj = storage_client.bucket(bucket_name) + bucket_obj.hierarchical_namespace_enabled = False + bucket = storage_client.create_bucket(bucket_obj) + buckets_to_delete.append(bucket) + assert bucket.hierarchical_namespace_enabled is False + + # Test new bucket with hierarchical namespace enabled + bucket_name = _helpers.unique_name("new-hns-enabled") + bucket_obj = storage_client.bucket(bucket_name) + bucket_obj.hierarchical_namespace_enabled = True + bucket_obj.iam_configuration.uniform_bucket_level_access_enabled = True + bucket = storage_client.create_bucket(bucket_obj) + buckets_to_delete.append(bucket) + assert bucket.hierarchical_namespace_enabled is True diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 2df41c3ff..030fba72b 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -3163,6 +3163,19 @@ def test_soft_delete_policy_setter(self): self.assertTrue("softDeletePolicy" in bucket._changes) self.assertEqual(bucket.soft_delete_policy.retention_duration_seconds, seconds) + def test_hierarchical_namespace_enabled_getter_and_setter(self): + # Test hierarchical_namespace configuration unset + bucket = self._make_one() + self.assertIsNone(bucket.hierarchical_namespace_enabled) + + # Test hierarchical_namespace configuration explicitly set + properties = {"hierarchicalNamespace": {"enabled": True}} + bucket = self._make_one(properties=properties) + self.assertTrue(bucket.hierarchical_namespace_enabled) + bucket.hierarchical_namespace_enabled = False + self.assertIn("hierarchicalNamespace", bucket._changes) + self.assertFalse(bucket.hierarchical_namespace_enabled) + def test_configure_website_defaults(self): NAME = "name" UNSET = {"website": {"mainPageSuffix": None, "notFoundPage": None}} From 64edbd922a605247203790a90f9536d54e3a705a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:45:36 -0700 Subject: [PATCH 263/509] chore(main): release 2.17.0 (#1256) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 19 +++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25b6fe162..4a7fefeb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.17.0](https://github.com/googleapis/python-storage/compare/v2.16.0...v2.17.0) (2024-05-22) + + +### Features + +* Support HNS enablement in bucket metadata ([#1278](https://github.com/googleapis/python-storage/issues/1278)) ([add3c01](https://github.com/googleapis/python-storage/commit/add3c01f0974e22df7f0b50504d5e83e4235fd81)) +* Support page_size in bucket.list_blobs ([#1275](https://github.com/googleapis/python-storage/issues/1275)) ([c52e882](https://github.com/googleapis/python-storage/commit/c52e882f65583a7739392926308cc34984561165)) + + +### Bug Fixes + +* Remove deprecated methods in samples and tests ([#1274](https://github.com/googleapis/python-storage/issues/1274)) ([4db96c9](https://github.com/googleapis/python-storage/commit/4db96c960b07e503c1031c9fa879cf2af195f513)) + + +### Documentation + +* Reference Storage Control in readme ([#1254](https://github.com/googleapis/python-storage/issues/1254)) ([3d6d369](https://github.com/googleapis/python-storage/commit/3d6d3693d5c1b24cd3d2bbdeabfd78b8bfd4161a)) +* Update DEFAULT_RETRY_IF_GENERATION_SPECIFIED docstrings ([#1234](https://github.com/googleapis/python-storage/issues/1234)) ([bdd426a](https://github.com/googleapis/python-storage/commit/bdd426adf5901faa36115885af868ef50e356a36)) + ## [2.16.0](https://github.com/googleapis/python-storage/compare/v2.15.0...v2.16.0) (2024-03-18) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index a93d72c2b..422b383cc 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.16.0" +__version__ = "2.17.0" From 693f1954748154d895b3671339eeafe43dfa415d Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 11 Jun 2024 09:55:14 -0700 Subject: [PATCH 264/509] samples: create bucket with HNS enabled (#1285) * samples: create bucket with HNS enabled * allow sample tests to run in specific runtimes --- samples/snippets/noxfile_config.py | 2 +- samples/snippets/snippets_test.py | 9 ++++ ...ge_create_bucket_hierarchical_namespace.py | 41 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 samples/snippets/storage_create_bucket_hierarchical_namespace.py diff --git a/samples/snippets/noxfile_config.py b/samples/snippets/noxfile_config.py index 4f184ede0..17a05b9f2 100644 --- a/samples/snippets/noxfile_config.py +++ b/samples/snippets/noxfile_config.py @@ -78,7 +78,7 @@ def get_cloud_kms_key(): TEST_CONFIG_OVERRIDE = { # You can opt out from the test for specific Python versions. - 'ignored_versions': ["2.7", "3.6"], + 'ignored_versions': ["2.7", "3.6", "3.7", "3.11", "3.12"], # An envvar key for determining the project id to use. Change it # to 'BUILD_SPECIFIC_GCLOUD_PROJECT' if you want to opt in using a diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index f9851b0ec..8c021f870 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -37,6 +37,7 @@ import storage_cors_configuration import storage_create_bucket_class_location import storage_create_bucket_dual_region +import storage_create_bucket_hierarchical_namespace import storage_create_bucket_object_retention import storage_define_bucket_website_configuration import storage_delete_file @@ -841,3 +842,11 @@ def test_object_retention_policy(test_bucket_create, capsys): blob.retention.mode = None blob.retention.retain_until_time = None blob.patch(override_unlocked_retention=True) + + +def test_create_bucket_hierarchical_namespace(test_bucket_create, capsys): + storage_create_bucket_hierarchical_namespace.create_bucket_hierarchical_namespace( + test_bucket_create.name + ) + out, _ = capsys.readouterr() + assert f"Created bucket {test_bucket_create.name} with hierarchical namespace enabled" in out diff --git a/samples/snippets/storage_create_bucket_hierarchical_namespace.py b/samples/snippets/storage_create_bucket_hierarchical_namespace.py new file mode 100644 index 000000000..d9d310772 --- /dev/null +++ b/samples/snippets/storage_create_bucket_hierarchical_namespace.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_create_bucket_hierarchical_namespace] +from google.cloud import storage + + +def create_bucket_hierarchical_namespace(bucket_name): + """Creates a bucket with hierarchical namespace enabled.""" + # The ID of your GCS bucket + # bucket_name = "your-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + bucket.iam_configuration.uniform_bucket_level_access_enabled = True + bucket.hierarchical_namespace_enabled = True + bucket.create() + + print(f"Created bucket {bucket_name} with hierarchical namespace enabled.") + + +# [END storage_create_bucket_hierarchical_namespace] + + +if __name__ == "__main__": + create_bucket_hierarchical_namespace(bucket_name=sys.argv[1]) From 1cb977daa2d97c255a382ce81f56a43168b0637d Mon Sep 17 00:00:00 2001 From: Chris Cotter Date: Mon, 17 Jun 2024 16:28:04 -0400 Subject: [PATCH 265/509] fix: correct notification error message (#1290) To create a new notification, the notification_id field must be set to None. Update the error message to clarify this. Fixes #1289 --- google/cloud/storage/notification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index 4eb807fa9..9af476d58 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -255,7 +255,7 @@ def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): """ if self.notification_id is not None: raise ValueError( - f"Notification already exists w/ id: {self.notification_id}" + f"notification_id already set to {self.notification_id}; must be None to create a Notification." ) client = self._require_client(client) From c2ab0e035b179a919b27c7f50318472f14656e00 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 26 Jun 2024 15:03:27 -0700 Subject: [PATCH 266/509] feat: add OpenTelemetry Tracing support as a preview feature (#1288) * feat: introduce OpenTelemetry Tracing decorators (#1257) * feat: introduce OpenTelemetry Tracing decorators * update test coverage * add tests, update fixture * update noxfile, extras; remove print * update unit test * review comments * feat: instrument metadata ops with OTel tracing (#2) (#1267) * feat: instrument metadata ops with Otel tracing * update README plus test * update decorator name per review session * fix typo in readme * feat: OTel tracing media ops initial instrumentation (#1280) * feat: OTel tracing media ops initial instrumentation * use download class name as span name * avoid asserting filtered warnings from otel per https://github.com/open-telemetry/opentelemetry-python/pull/3164 * add copyright and preview note * comments --- README.rst | 55 +++++ google/cloud/storage/_http.py | 30 ++- .../cloud/storage/_opentelemetry_tracing.py | 112 +++++++++ google/cloud/storage/acl.py | 5 + google/cloud/storage/blob.py | 101 ++++++-- google/cloud/storage/bucket.py | 22 ++ google/cloud/storage/client.py | 28 ++- google/cloud/storage/hmac_key.py | 5 + google/cloud/storage/notification.py | 5 + noxfile.py | 6 +- setup.py | 7 +- tests/unit/test__opentelemetry_tracing.py | 223 ++++++++++++++++++ tests/unit/test_blob.py | 18 +- 13 files changed, 577 insertions(+), 40 deletions(-) create mode 100644 google/cloud/storage/_opentelemetry_tracing.py create mode 100644 tests/unit/test__opentelemetry_tracing.py diff --git a/README.rst b/README.rst index 9eef57645..32d66a1db 100644 --- a/README.rst +++ b/README.rst @@ -115,6 +115,61 @@ Windows .\\Scripts\activate pip install google-cloud-storage + +Tracing With OpenTelemetry +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a PREVIEW FEATURE: Coverage and functionality are still in development and subject to change. + +This library can be configured to use `OpenTelemetry`_ to generate traces on calls to Google Cloud Storage. +For information on the benefits and utility of tracing, read the `Cloud Trace Overview `_. + +To enable OpenTelemetry tracing in the Cloud Storage client, first install OpenTelemetry: + +.. code-block:: console + + pip install google-cloud-storage[tracing] + +Set the ``ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACES`` environment variable to selectively opt-in tracing for the Cloud Storage client: + +.. code-block:: console + + export ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACES=True + +You will also need to tell OpenTelemetry which exporter to use. An example to export traces to Google Cloud Trace can be found below. + +.. code-block:: console + + # Install the Google Cloud Trace exporter and propagator, however you can use any exporter of your choice. + pip install opentelemetry-exporter-gcp-trace opentelemetry-propagator-gcp + + # [Optional] Install the OpenTelemetry Requests Instrumentation to trace the underlying HTTP requests. + pip install opentelemetry-instrumentation-requests + +.. code-block:: python + + from opentelemetry import trace + from opentelemetry.sdk.trace import TracerProvider + from opentelemetry.sdk.trace.export import BatchSpanProcessor + from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter + + tracer_provider = TracerProvider() + tracer_provider.add_span_processor(BatchSpanProcessor(CloudTraceSpanExporter())) + trace.set_tracer_provider(tracer_provider) + + # Optional yet recommended to instrument the requests HTTP library + from opentelemetry.instrumentation.requests import RequestsInstrumentor + RequestsInstrumentor().instrument(tracer_provider=tracer_provider) + +In this example, tracing data will be published to the `Google Cloud Trace`_ console. +Tracing is most effective when many libraries are instrumented to provide insight over the entire lifespan of a request. +For a list of libraries that can be instrumented, refer to the `OpenTelemetry Registry`_. + +.. _OpenTelemetry: https://opentelemetry.io +.. _OpenTelemetry Registry: https://opentelemetry.io/ecosystem/registry +.. _Google Cloud Trace: https://cloud.google.com/trace + + Next Steps ~~~~~~~~~~ diff --git a/google/cloud/storage/_http.py b/google/cloud/storage/_http.py index b4e16ebe4..aea13cc57 100644 --- a/google/cloud/storage/_http.py +++ b/google/cloud/storage/_http.py @@ -18,6 +18,7 @@ from google.cloud import _http from google.cloud.storage import __version__ from google.cloud.storage import _helpers +from google.cloud.storage._opentelemetry_tracing import create_trace_span class Connection(_http.JSONConnection): @@ -65,14 +66,25 @@ def __init__(self, client, client_info=None, api_endpoint=None): def api_request(self, *args, **kwargs): retry = kwargs.pop("retry", None) - kwargs["extra_api_info"] = _helpers._get_invocation_id() + invocation_id = _helpers._get_invocation_id() + kwargs["extra_api_info"] = invocation_id + span_attributes = { + "gccl-invocation-id": invocation_id, + } call = functools.partial(super(Connection, self).api_request, *args, **kwargs) - if retry: - # If this is a ConditionalRetryPolicy, check conditions. - try: - retry = retry.get_retry_policy_if_conditions_met(**kwargs) - except AttributeError: # This is not a ConditionalRetryPolicy. - pass + with create_trace_span( + name="Storage.Connection.api_request", + attributes=span_attributes, + client=self._client, + api_request=kwargs, + retry=retry, + ): if retry: - call = retry(call) - return call() + # If this is a ConditionalRetryPolicy, check conditions. + try: + retry = retry.get_retry_policy_if_conditions_met(**kwargs) + except AttributeError: # This is not a ConditionalRetryPolicy. + pass + if retry: + call = retry(call) + return call() diff --git a/google/cloud/storage/_opentelemetry_tracing.py b/google/cloud/storage/_opentelemetry_tracing.py new file mode 100644 index 000000000..ac4c43e07 --- /dev/null +++ b/google/cloud/storage/_opentelemetry_tracing.py @@ -0,0 +1,112 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Manages OpenTelemetry tracing span creation and handling. This is a PREVIEW FEATURE: Coverage and functionality may change.""" + +import logging +import os + +from contextlib import contextmanager + +from google.api_core import exceptions as api_exceptions +from google.api_core import retry as api_retry +from google.cloud.storage import __version__ +from google.cloud.storage.retry import ConditionalRetryPolicy + + +ENABLE_OTEL_TRACES_ENV_VAR = "ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACES" +_DEFAULT_ENABLE_OTEL_TRACES_VALUE = False + +enable_otel_traces = os.environ.get( + ENABLE_OTEL_TRACES_ENV_VAR, _DEFAULT_ENABLE_OTEL_TRACES_VALUE +) +logger = logging.getLogger(__name__) + +try: + from opentelemetry import trace + + HAS_OPENTELEMETRY = True + +except ImportError: + logger.debug( + "This service is instrumented using OpenTelemetry. " + "OpenTelemetry or one of its components could not be imported; " + "please add compatible versions of opentelemetry-api and " + "opentelemetry-instrumentation packages in order to get Storage " + "Tracing data." + ) + HAS_OPENTELEMETRY = False + +_default_attributes = { + "rpc.service": "CloudStorage", + "rpc.system": "http", + "user_agent.original": f"gcloud-python/{__version__}", +} + + +@contextmanager +def create_trace_span(name, attributes=None, client=None, api_request=None, retry=None): + """Creates a context manager for a new span and set it as the current span + in the configured tracer. If no configuration exists yields None.""" + if not HAS_OPENTELEMETRY or not enable_otel_traces: + yield None + return + + tracer = trace.get_tracer(__name__) + final_attributes = _get_final_attributes(attributes, client, api_request, retry) + # Yield new span. + with tracer.start_as_current_span( + name=name, kind=trace.SpanKind.CLIENT, attributes=final_attributes + ) as span: + try: + yield span + except api_exceptions.GoogleAPICallError as error: + span.set_status(trace.Status(trace.StatusCode.ERROR)) + span.record_exception(error) + raise + + +def _get_final_attributes(attributes=None, client=None, api_request=None, retry=None): + collected_attr = _default_attributes.copy() + if api_request: + collected_attr.update(_set_api_request_attr(api_request, client)) + if isinstance(retry, api_retry.Retry): + collected_attr.update(_set_retry_attr(retry)) + if isinstance(retry, ConditionalRetryPolicy): + collected_attr.update( + _set_retry_attr(retry.retry_policy, retry.conditional_predicate) + ) + if attributes: + collected_attr.update(attributes) + final_attributes = {k: v for k, v in collected_attr.items() if v is not None} + return final_attributes + + +def _set_api_request_attr(request, client): + attr = {} + if request.get("method"): + attr["http.request.method"] = request.get("method") + if request.get("path"): + path = request.get("path") + full_path = f"{client._connection.API_BASE_URL}{path}" + attr["url.full"] = full_path + if request.get("timeout"): + attr["connect_timeout,read_timeout"] = request.get("timeout") + return attr + + +def _set_retry_attr(retry, conditional_predicate=None): + predicate = conditional_predicate if conditional_predicate else retry._predicate + retry_info = f"multiplier{retry._multiplier}/deadline{retry._deadline}/max{retry._maximum}/initial{retry._initial}/predicate{predicate}" + return {"retry": retry_info} diff --git a/google/cloud/storage/acl.py b/google/cloud/storage/acl.py index 1ca78f258..d20ca135b 100644 --- a/google/cloud/storage/acl.py +++ b/google/cloud/storage/acl.py @@ -15,6 +15,7 @@ """Manage access to objects and buckets.""" from google.cloud.storage._helpers import _add_generation_match_parameters +from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED @@ -359,6 +360,7 @@ def _require_client(self, client): client = self.client return client + @create_trace_span(name="Storage.ACL.reload") def reload(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Reload the ACL data from Cloud Storage. @@ -484,6 +486,7 @@ def _save( self.loaded = True + @create_trace_span(name="Storage.ACL.save") def save( self, acl=None, @@ -552,6 +555,7 @@ def save( retry=retry, ) + @create_trace_span(name="Storage.ACL.savePredefined") def save_predefined( self, predefined, @@ -617,6 +621,7 @@ def save_predefined( retry=retry, ) + @create_trace_span(name="Storage.ACL.clear") def clear( self, client=None, diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index b0b4a663f..e474f1681 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -63,6 +63,7 @@ from google.cloud.storage._helpers import _NUM_RETRIES_MESSAGE from google.cloud.storage._helpers import _API_VERSION from google.cloud.storage._helpers import _virtual_hosted_style_base_url +from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage.acl import ACL from google.cloud.storage.acl import ObjectACL from google.cloud.storage.constants import _DEFAULT_TIMEOUT @@ -639,6 +640,7 @@ def generate_signed_url( access_token=access_token, ) + @create_trace_span(name="Storage.Blob.exists") def exists( self, client=None, @@ -744,6 +746,7 @@ def exists( return False return True + @create_trace_span(name="Storage.Blob.delete") def delete( self, client=None, @@ -1005,11 +1008,21 @@ def _do_download( retry_strategy = _api_core_retry_to_resumable_media_retry(retry) + extra_attributes = { + "url.full": download_url, + "download.chunk_size": f"{self.chunk_size}", + "download.raw_download": raw_download, + "upload.checksum": f"{checksum}", + } + args = {"timeout": timeout} + if self.chunk_size is None: if raw_download: klass = RawDownload + download_class = "RawDownload" else: klass = Download + download_class = "Download" download = klass( download_url, @@ -1020,8 +1033,13 @@ def _do_download( checksum=checksum, ) download._retry_strategy = retry_strategy - response = download.consume(transport, timeout=timeout) - self._extract_headers_from_download(response) + with create_trace_span( + name=f"Storage.{download_class}/consume", + attributes=extra_attributes, + api_request=args, + ): + response = download.consume(transport, timeout=timeout) + self._extract_headers_from_download(response) else: if checksum: msg = _CHUNKED_DOWNLOAD_CHECKSUM_MESSAGE.format(checksum) @@ -1029,8 +1047,10 @@ def _do_download( if raw_download: klass = RawChunkedDownload + download_class = "RawChunkedDownload" else: klass = ChunkedDownload + download_class = "ChunkedDownload" download = klass( download_url, @@ -1042,9 +1062,15 @@ def _do_download( ) download._retry_strategy = retry_strategy - while not download.finished: - download.consume_next_chunk(transport, timeout=timeout) - + with create_trace_span( + name=f"Storage.{download_class}/consumeNextChunk", + attributes=extra_attributes, + api_request=args, + ): + while not download.finished: + download.consume_next_chunk(transport, timeout=timeout) + + @create_trace_span(name="Storage.Blob.downloadToFile") def download_to_file( self, file_obj, @@ -1207,6 +1233,7 @@ def _handle_filename_and_download(self, filename, *args, **kwargs): mtime = updated.timestamp() os.utime(file_obj.name, (mtime, mtime)) + @create_trace_span(name="Storage.Blob.downloadToFilename") def download_to_filename( self, filename, @@ -1332,6 +1359,7 @@ def download_to_filename( retry=retry, ) + @create_trace_span(name="Storage.Blob.downloadAsBytes") def download_as_bytes( self, client=None, @@ -1456,6 +1484,7 @@ def download_as_bytes( ) return string_buffer.getvalue() + @create_trace_span(name="Storage.Blob.downloadAsString") def download_as_string( self, client=None, @@ -1568,6 +1597,7 @@ def download_as_string( retry=retry, ) + @create_trace_span(name="Storage.Blob.downloadAsText") def download_as_text( self, client=None, @@ -1959,11 +1989,22 @@ def _do_multipart_upload( retry, num_retries ) - response = upload.transmit( - transport, data, object_metadata, content_type, timeout=timeout - ) + extra_attributes = { + "url.full": upload_url, + "upload.checksum": f"{checksum}", + } + args = {"timeout": timeout} + with create_trace_span( + name="Storage.MultipartUpload/transmit", + attributes=extra_attributes, + client=client, + api_request=args, + ): + response = upload.transmit( + transport, data, object_metadata, content_type, timeout=timeout + ) - return response + return response def _initiate_resumable_upload( self, @@ -2297,14 +2338,27 @@ def _do_resumable_upload( retry=retry, command=command, ) - while not upload.finished: - try: - response = upload.transmit_next_chunk(transport, timeout=timeout) - except resumable_media.DataCorruption: - # Attempt to delete the corrupted object. - self.delete() - raise - return response + extra_attributes = { + "url.full": upload.resumable_url, + "upload.chunk_size": upload.chunk_size, + "upload.checksum": f"{checksum}", + } + args = {"timeout": timeout} + # import pdb; pdb.set_trace() + with create_trace_span( + name="Storage.ResumableUpload/transmitNextChunk", + attributes=extra_attributes, + client=client, + api_request=args, + ): + while not upload.finished: + try: + response = upload.transmit_next_chunk(transport, timeout=timeout) + except resumable_media.DataCorruption: + # Attempt to delete the corrupted object. + self.delete() + raise + return response def _do_upload( self, @@ -2660,6 +2714,7 @@ def _prep_and_do_upload( except resumable_media.InvalidResponse as exc: _raise_from_invalid_response(exc) + @create_trace_span(name="Storage.Blob.uploadFromFile") def upload_from_file( self, file_obj, @@ -2831,6 +2886,7 @@ def _handle_filename_and_upload(self, filename, content_type=None, *args, **kwar **kwargs, ) + @create_trace_span(name="Storage.Blob.uploadFromFilename") def upload_from_filename( self, filename, @@ -2959,6 +3015,7 @@ def upload_from_filename( retry=retry, ) + @create_trace_span(name="Storage.Blob.uploadFromString") def upload_from_string( self, data, @@ -3081,6 +3138,7 @@ def upload_from_string( retry=retry, ) + @create_trace_span(name="Storage.Blob.createResumableUploadSession") def create_resumable_upload_session( self, content_type=None, @@ -3254,6 +3312,7 @@ def create_resumable_upload_session( except resumable_media.InvalidResponse as exc: _raise_from_invalid_response(exc) + @create_trace_span(name="Storage.Blob.getIamPolicy") def get_iam_policy( self, client=None, @@ -3322,6 +3381,7 @@ def get_iam_policy( ) return Policy.from_api_repr(info) + @create_trace_span(name="Storage.Blob.setIamPolicy") def set_iam_policy( self, policy, @@ -3383,6 +3443,7 @@ def set_iam_policy( ) return Policy.from_api_repr(info) + @create_trace_span(name="Storage.Blob.testIamPermissions") def test_iam_permissions( self, permissions, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY ): @@ -3437,6 +3498,7 @@ def test_iam_permissions( return resp.get("permissions", []) + @create_trace_span(name="Storage.Blob.makePublic") def make_public( self, client=None, @@ -3490,6 +3552,7 @@ def make_public( retry=retry, ) + @create_trace_span(name="Storage.Blob.makePrivate") def make_private( self, client=None, @@ -3543,6 +3606,7 @@ def make_private( retry=retry, ) + @create_trace_span(name="Storage.Blob.compose") def compose( self, sources, @@ -3682,6 +3746,7 @@ def compose( ) self._set_properties(api_response) + @create_trace_span(name="Storage.Blob.rewrite") def rewrite( self, source, @@ -3846,6 +3911,7 @@ def rewrite( return api_response["rewriteToken"], rewritten, size + @create_trace_span(name="Storage.Blob.updateStorageClass") def update_storage_class( self, new_class, @@ -3979,6 +4045,7 @@ def update_storage_class( retry=retry, ) + @create_trace_span(name="Storage.Blob.open") def open( self, mode="r", diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 7b6421d29..ad1d0de5d 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -38,6 +38,7 @@ from google.cloud.storage._signing import generate_signed_url_v4 from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _virtual_hosted_style_base_url +from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage.acl import BucketACL from google.cloud.storage.acl import DefaultObjectACL from google.cloud.storage.blob import Blob @@ -827,6 +828,7 @@ def notification( notification_id=notification_id, ) + @create_trace_span(name="Storage.Bucket.exists") def exists( self, client=None, @@ -911,6 +913,7 @@ def exists( return False return True + @create_trace_span(name="Storage.Bucket.create") def create( self, client=None, @@ -986,6 +989,7 @@ def create( retry=retry, ) + @create_trace_span(name="Storage.Bucket.update") def update( self, client=None, @@ -1030,6 +1034,7 @@ def update( retry=retry, ) + @create_trace_span(name="Storage.Bucket.reload") def reload( self, client=None, @@ -1091,6 +1096,7 @@ def reload( retry=retry, ) + @create_trace_span(name="Storage.Bucket.patch") def patch( self, client=None, @@ -1174,6 +1180,7 @@ def path(self): return self.path_helper(self.name) + @create_trace_span(name="Storage.Bucket.getBlob") def get_blob( self, blob_name, @@ -1290,6 +1297,7 @@ def get_blob( else: return blob + @create_trace_span(name="Storage.Bucket.listBlobs") def list_blobs( self, max_results=None, @@ -1432,6 +1440,7 @@ def list_blobs( soft_deleted=soft_deleted, ) + @create_trace_span(name="Storage.Bucket.listNotifications") def list_notifications( self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY ): @@ -1469,6 +1478,7 @@ def list_notifications( iterator.bucket = self return iterator + @create_trace_span(name="Storage.Bucket.getNotification") def get_notification( self, notification_id, @@ -1506,6 +1516,7 @@ def get_notification( notification.reload(client=client, timeout=timeout, retry=retry) return notification + @create_trace_span(name="Storage.Bucket.delete") def delete( self, force=False, @@ -1612,6 +1623,7 @@ def delete( _target_object=None, ) + @create_trace_span(name="Storage.Bucket.deleteBlob") def delete_blob( self, blob_name, @@ -1698,6 +1710,7 @@ def delete_blob( _target_object=None, ) + @create_trace_span(name="Storage.Bucket.deleteBlobs") def delete_blobs( self, blobs, @@ -1818,6 +1831,7 @@ def delete_blobs( else: raise + @create_trace_span(name="Storage.Bucket.copyBlob") def copy_blob( self, blob, @@ -1973,6 +1987,7 @@ def copy_blob( new_blob._set_properties(copy_result) return new_blob + @create_trace_span(name="Storage.Bucket.renameBlob") def rename_blob( self, blob, @@ -2116,6 +2131,7 @@ def rename_blob( ) return new_blob + @create_trace_span(name="Storage.Bucket.restore_blob") def restore_blob( self, blob_name, @@ -3017,6 +3033,7 @@ def disable_website(self): """ return self.configure_website(None, None) + @create_trace_span(name="Storage.Bucket.getIamPolicy") def get_iam_policy( self, client=None, @@ -3079,6 +3096,7 @@ def get_iam_policy( ) return Policy.from_api_repr(info) + @create_trace_span(name="Storage.Bucket.setIamPolicy") def set_iam_policy( self, policy, @@ -3135,6 +3153,7 @@ def set_iam_policy( return Policy.from_api_repr(info) + @create_trace_span(name="Storage.Bucket.testIamPermissions") def test_iam_permissions( self, permissions, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY ): @@ -3182,6 +3201,7 @@ def test_iam_permissions( ) return resp.get("permissions", []) + @create_trace_span(name="Storage.Bucket.makePublic") def make_public( self, recursive=False, @@ -3279,6 +3299,7 @@ def make_public( timeout=timeout, ) + @create_trace_span(name="Storage.Bucket.makePrivate") def make_private( self, recursive=False, @@ -3426,6 +3447,7 @@ def generate_upload_policy(self, conditions, expiration=None, client=None): return fields + @create_trace_span(name="Storage.Bucket.lockRetentionPolicy") def lock_retention_policy( self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY ): diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 57bbab008..b21ef7cef 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -41,6 +41,7 @@ from google.cloud.storage._helpers import _STORAGE_HOST_TEMPLATE from google.cloud.storage._helpers import _NOW from google.cloud.storage._helpers import _UTC +from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage._http import Connection from google.cloud.storage._signing import ( @@ -337,6 +338,7 @@ def current_batch(self): """ return self._batch_stack.top + @create_trace_span(name="Storage.Client.getServiceAccountEmail") def get_service_account_email( self, project=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY ): @@ -481,9 +483,20 @@ def _list_resource( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): - api_request = functools.partial( - self._connection.api_request, timeout=timeout, retry=retry - ) + kwargs = { + "method": "GET", + "path": path, + "timeout": timeout, + } + with create_trace_span( + name="Storage.Client._list_resource_returns_iterator", + client=self, + api_request=kwargs, + retry=retry, + ): + api_request = functools.partial( + self._connection.api_request, timeout=timeout, retry=retry + ) return page_iterator.HTTPIterator( client=self, api_request=api_request, @@ -798,6 +811,7 @@ def _bucket_arg_to_bucket(self, bucket_or_name): bucket = Bucket(self, name=bucket_or_name) return bucket + @create_trace_span(name="Storage.Client.getBucket") def get_bucket( self, bucket_or_name, @@ -863,6 +877,7 @@ def get_bucket( ) return bucket + @create_trace_span(name="Storage.Client.lookupBucket") def lookup_bucket( self, bucket_name, @@ -910,6 +925,7 @@ def lookup_bucket( except NotFound: return None + @create_trace_span(name="Storage.Client.createBucket") def create_bucket( self, bucket_or_name, @@ -1053,6 +1069,7 @@ def create_bucket( bucket._set_properties(api_response) return bucket + @create_trace_span(name="Storage.Client.downloadBlobToFile") def download_blob_to_file( self, blob_or_uri, @@ -1167,6 +1184,7 @@ def download_blob_to_file( retry=retry, ) + @create_trace_span(name="Storage.Client.listBlobs") def list_blobs( self, bucket_or_name, @@ -1356,6 +1374,7 @@ def list_blobs( iterator.prefixes = set() return iterator + @create_trace_span(name="Storage.Client.listBuckets") def list_buckets( self, max_results=None, @@ -1461,6 +1480,7 @@ def list_buckets( retry=retry, ) + @create_trace_span(name="Storage.Client.createHmacKey") def create_hmac_key( self, service_account_email, @@ -1525,6 +1545,7 @@ def create_hmac_key( secret = api_response["secret"] return metadata, secret + @create_trace_span(name="Storage.Client.listHmacKeys") def list_hmac_keys( self, max_results=None, @@ -1594,6 +1615,7 @@ def list_hmac_keys( retry=retry, ) + @create_trace_span(name="Storage.Client.getHmacKeyMetadata") def get_hmac_key_metadata( self, access_id, project_id=None, user_project=None, timeout=_DEFAULT_TIMEOUT ): diff --git a/google/cloud/storage/hmac_key.py b/google/cloud/storage/hmac_key.py index 41f513ec6..d37bc071b 100644 --- a/google/cloud/storage/hmac_key.py +++ b/google/cloud/storage/hmac_key.py @@ -20,6 +20,7 @@ from google.cloud.exceptions import NotFound from google.cloud._helpers import _rfc3339_nanos_to_datetime +from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_ETAG_IN_JSON @@ -187,6 +188,7 @@ def user_project(self): """ return self._user_project + @create_trace_span(name="Storage.HmacKey.exists") def exists(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Determine whether or not the key for this metadata exists. @@ -219,6 +221,7 @@ def exists(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): else: return True + @create_trace_span(name="Storage.HmacKey.reload") def reload(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Reload properties from Cloud Storage. @@ -246,6 +249,7 @@ def reload(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): retry=retry, ) + @create_trace_span(name="Storage.HmacKey.update") def update(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_ETAG_IN_JSON): """Save writable properties to Cloud Storage. @@ -274,6 +278,7 @@ def update(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_ETAG_IN_JSON): retry=retry, ) + @create_trace_span(name="Storage.HmacKey.delete") def delete(self, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Delete the key from Cloud Storage. diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index 9af476d58..d9d49fc4b 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -21,6 +21,7 @@ from google.api_core.exceptions import NotFound +from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.retry import DEFAULT_RETRY @@ -230,6 +231,7 @@ def _set_properties(self, response): self._properties.clear() self._properties.update(response) + @create_trace_span(name="Storage.BucketNotification.create") def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): """API wrapper: create the notification. @@ -282,6 +284,7 @@ def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): retry=retry, ) + @create_trace_span(name="Storage.BucketNotification.exists") def exists(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Test whether this notification exists. @@ -329,6 +332,7 @@ def exists(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): else: return True + @create_trace_span(name="Storage.BucketNotification.reload") def reload(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Update this notification from the server configuration. @@ -371,6 +375,7 @@ def reload(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): ) self._set_properties(response) + @create_trace_span(name="Storage.BucketNotification.delete") def delete(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY): """Delete this notification. diff --git a/noxfile.py b/noxfile.py index fb3d8f89e..319ae207e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -75,12 +75,16 @@ def lint_setup_py(session): session.run("python", "setup.py", "check", "--restructuredtext", "--strict") -def default(session): +def default(session, install_extras=True): constraints_path = str( CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) # Install all test dependencies, then install this package in-place. session.install("mock", "pytest", "pytest-cov", "-c", constraints_path) + + if install_extras: + session.install("opentelemetry-api", "opentelemetry-sdk") + session.install("-e", ".", "-c", constraints_path) # Run py.test against the unit tests. diff --git a/setup.py b/setup.py index b2f5e411e..391bf7770 100644 --- a/setup.py +++ b/setup.py @@ -35,7 +35,12 @@ "requests >= 2.18.0, < 3.0.0dev", "google-crc32c >= 1.0, < 2.0dev", ] -extras = {"protobuf": ["protobuf<5.0.0dev"]} +extras = { + "protobuf": ["protobuf<5.0.0dev"], + "tracing": [ + "opentelemetry-api >= 1.1.0", + ], +} # Setup boilerplate below this line. diff --git a/tests/unit/test__opentelemetry_tracing.py b/tests/unit/test__opentelemetry_tracing.py new file mode 100644 index 000000000..631ac9f82 --- /dev/null +++ b/tests/unit/test__opentelemetry_tracing.py @@ -0,0 +1,223 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import importlib +import os +import pytest +import sys + +import mock +from google.api_core.exceptions import GoogleAPICallError +from google.cloud.storage import __version__ +from google.cloud.storage import _opentelemetry_tracing + + +@pytest.fixture +def setup(): + """Setup OTel packages and tracer provider.""" + try: + from opentelemetry import trace as trace_api + from opentelemetry.sdk.trace import TracerProvider, export + from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, + ) + except ImportError: # pragma: NO COVER + pytest.skip("This test suite requires OpenTelemetry pacakges.") + + tracer_provider = TracerProvider() + memory_exporter = InMemorySpanExporter() + span_processor = export.SimpleSpanProcessor(memory_exporter) + tracer_provider.add_span_processor(span_processor) + trace_api.set_tracer_provider(tracer_provider) + importlib.reload(_opentelemetry_tracing) + yield memory_exporter + + +@pytest.fixture() +def mock_os_environ(monkeypatch): + """Mock os.environ.""" + monkeypatch.setattr(os, "environ", {}) + return os.environ + + +@pytest.fixture() +def setup_optin(mock_os_environ): + """Mock envar to opt-in tracing for storage client.""" + mock_os_environ["ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACES"] = True + importlib.reload(_opentelemetry_tracing) + + +def test_opentelemetry_not_installed(setup, monkeypatch): + monkeypatch.setitem(sys.modules, "opentelemetry", None) + importlib.reload(_opentelemetry_tracing) + # Test no-ops when OpenTelemetry is not installed. + with _opentelemetry_tracing.create_trace_span("No-ops w/o opentelemetry") as span: + assert span is None + assert not _opentelemetry_tracing.HAS_OPENTELEMETRY + + +def test_opentelemetry_no_trace_optin(setup): + assert _opentelemetry_tracing.HAS_OPENTELEMETRY + assert not _opentelemetry_tracing.enable_otel_traces + # Test no-ops when user has not opt-in. + # This prevents customers accidentally being billed for tracing. + with _opentelemetry_tracing.create_trace_span("No-ops w/o opt-in") as span: + assert span is None + + +def test_enable_trace_yield_span(setup, setup_optin): + assert _opentelemetry_tracing.HAS_OPENTELEMETRY + assert _opentelemetry_tracing.enable_otel_traces + with _opentelemetry_tracing.create_trace_span("No-ops for opentelemetry") as span: + assert span is not None + + +def test_enable_trace_call(setup, setup_optin): + from opentelemetry import trace as trace_api + + extra_attributes = { + "attribute1": "value1", + } + expected_attributes = { + "rpc.service": "CloudStorage", + "rpc.system": "http", + "user_agent.original": f"gcloud-python/{__version__}", + } + expected_attributes.update(extra_attributes) + + with _opentelemetry_tracing.create_trace_span( + "OtelTracing.Test", attributes=extra_attributes + ) as span: + span.set_attribute("after_setup_attribute", 1) + + expected_attributes["after_setup_attribute"] = 1 + + assert span.kind == trace_api.SpanKind.CLIENT + assert span.attributes == expected_attributes + assert span.name == "OtelTracing.Test" + + +def test_enable_trace_error(setup, setup_optin): + from opentelemetry import trace as trace_api + + extra_attributes = { + "attribute1": "value1", + } + expected_attributes = { + "rpc.service": "CloudStorage", + "rpc.system": "http", + "user_agent.original": f"gcloud-python/{__version__}", + } + expected_attributes.update(extra_attributes) + + with pytest.raises(GoogleAPICallError): + with _opentelemetry_tracing.create_trace_span( + "OtelTracing.Test", attributes=extra_attributes + ) as span: + from google.cloud.exceptions import NotFound + + assert span.kind == trace_api.SpanKind.CLIENT + assert span.attributes == expected_attributes + assert span.name == "OtelTracing.Test" + raise NotFound("Test catching NotFound error in trace span.") + + +def test_get_final_attributes(setup, setup_optin): + from google.api_core import retry as api_retry + + test_span_name = "OtelTracing.Test" + test_span_attributes = { + "foo": "bar", + } + api_request = { + "method": "GET", + "path": "/foo/bar/baz", + "timeout": (100, 100), + } + retry_obj = api_retry.Retry() + + expected_attributes = { + "foo": "bar", + "rpc.service": "CloudStorage", + "rpc.system": "http", + "user_agent.original": f"gcloud-python/{__version__}", + "http.request.method": "GET", + "url.full": "https://testOtel.org/foo/bar/baz", + "connect_timeout,read_timeout": (100, 100), + "retry": f"multiplier{retry_obj._multiplier}/deadline{retry_obj._deadline}/max{retry_obj._maximum}/initial{retry_obj._initial}/predicate{retry_obj._predicate}", + } + + with mock.patch("google.cloud.storage.client.Client") as test_client: + test_client.project = "test_project" + test_client._connection.API_BASE_URL = "https://testOtel.org" + with _opentelemetry_tracing.create_trace_span( + test_span_name, + attributes=test_span_attributes, + client=test_client, + api_request=api_request, + retry=retry_obj, + ) as span: + assert span is not None + assert span.name == test_span_name + assert span.attributes == expected_attributes + + +def test_set_conditional_retry_attr(setup, setup_optin): + from google.api_core import retry as api_retry + from google.cloud.storage.retry import ConditionalRetryPolicy + + test_span_name = "OtelTracing.Test" + retry_policy = api_retry.Retry() + conditional_predicate = mock.Mock() + required_kwargs = ("kwarg",) + retry_obj = ConditionalRetryPolicy( + retry_policy, conditional_predicate, required_kwargs + ) + + expected_attributes = { + "rpc.service": "CloudStorage", + "rpc.system": "http", + "user_agent.original": f"gcloud-python/{__version__}", + "retry": f"multiplier{retry_policy._multiplier}/deadline{retry_policy._deadline}/max{retry_policy._maximum}/initial{retry_policy._initial}/predicate{conditional_predicate}", + } + + with _opentelemetry_tracing.create_trace_span( + test_span_name, + retry=retry_obj, + ) as span: + assert span is not None + assert span.name == test_span_name + assert span.attributes == expected_attributes + + +def test_set_api_request_attr(): + from google.cloud.storage import Client + + test_client = Client() + args_method = {"method": "GET"} + expected_attributes = {"http.request.method": "GET"} + attr = _opentelemetry_tracing._set_api_request_attr(args_method, test_client) + assert attr == expected_attributes + + args_path = {"path": "/foo/bar/baz"} + expected_attributes = {"url.full": "https://storage.googleapis.com/foo/bar/baz"} + attr = _opentelemetry_tracing._set_api_request_attr(args_path, test_client) + assert attr == expected_attributes + + args_timeout = {"timeout": (100, 100)} + expected_attributes = { + "connect_timeout,read_timeout": (100, 100), + } + attr = _opentelemetry_tracing._set_api_request_attr(args_timeout, test_client) + assert attr == expected_attributes diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 98d744d6c..b0ff4f07b 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -2176,7 +2176,7 @@ def test_download_as_string(self, mock_warn): retry=DEFAULT_RETRY, ) - mock_warn.assert_called_once_with( + mock_warn.assert_any_call( _DOWNLOAD_AS_STRING_DEPRECATED, PendingDeprecationWarning, stacklevel=2, @@ -2214,7 +2214,7 @@ def test_download_as_string_no_retry(self, mock_warn): retry=None, ) - mock_warn.assert_called_once_with( + mock_warn.assert_any_call( _DOWNLOAD_AS_STRING_DEPRECATED, PendingDeprecationWarning, stacklevel=2, @@ -3410,7 +3410,7 @@ def test_upload_from_file_w_num_retries(self, mock_warn): self._upload_from_file_helper(num_retries=2) - mock_warn.assert_called_once_with( + mock_warn.assert_any_call( _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, @@ -3425,7 +3425,7 @@ def test_upload_from_file_with_retry_conflict(self, mock_warn): # through. self._upload_from_file_helper(retry=DEFAULT_RETRY, num_retries=2) - mock_warn.assert_called_once_with( + mock_warn.assert_any_call( _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, @@ -3595,7 +3595,7 @@ def test_upload_from_filename_w_num_retries(self, mock_warn): self.assertEqual(stream.mode, "rb") self.assertEqual(stream.name, temp.name) - mock_warn.assert_called_once_with( + mock_warn.assert_any_call( _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, @@ -3686,7 +3686,7 @@ def test_upload_from_string_with_num_retries(self, mock_warn): data = "\N{snowman} \N{sailboat}" self._upload_from_string_helper(data, num_retries=2) - mock_warn.assert_called_once_with( + mock_warn.assert_any_call( _NUM_RETRIES_MESSAGE, DeprecationWarning, stacklevel=2, @@ -4642,7 +4642,7 @@ def test_compose_w_if_generation_match_list_w_warning(self, mock_warn): _target_object=destination, ) - mock_warn.assert_called_with( + mock_warn.assert_any_call( _COMPOSE_IF_GENERATION_LIST_DEPRECATED, DeprecationWarning, stacklevel=2, @@ -4672,7 +4672,7 @@ def test_compose_w_if_generation_match_and_if_s_generation_match(self, mock_warn client._post_resource.assert_not_called() - mock_warn.assert_called_with( + mock_warn.assert_any_call( _COMPOSE_IF_GENERATION_LIST_DEPRECATED, DeprecationWarning, stacklevel=2, @@ -4716,7 +4716,7 @@ def test_compose_w_if_metageneration_match_list_w_warning(self, mock_warn): _target_object=destination, ) - mock_warn.assert_called_with( + mock_warn.assert_any_call( _COMPOSE_IF_METAGENERATION_LIST_DEPRECATED, DeprecationWarning, stacklevel=2, From ec7d3032420afed34dc16b98ab60ed33008b425b Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 1 Jul 2024 16:02:21 -0700 Subject: [PATCH 267/509] test: add check in pytest fixture (#1306) --- tests/system/conftest.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/system/conftest.py b/tests/system/conftest.py index 329be584f..c92aeddd5 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -150,7 +150,11 @@ def hierarchy_bucket_name(): @pytest.fixture(scope="session") def hierarchy_bucket(storage_client, hierarchy_bucket_name, file_data): bucket = storage_client.bucket(hierarchy_bucket_name) - _helpers.retry_429_503(bucket.create)() + # Create the hierarchy bucket only if it doesn't yet exist. + try: + storage_client.get_bucket(bucket) + except exceptions.NotFound: + _helpers.retry_429_503(bucket.create)() simple_path = _file_data["simple"]["path"] for filename in _hierarchy_filenames: From fb17d0c4c9595347b2fe48ad2b95c8d77e8edf3a Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 1 Jul 2024 16:28:48 -0700 Subject: [PATCH 268/509] test: enable retries for blobwriter tests (#1298) --- tests/system/test_fileio.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/test_fileio.py b/tests/system/test_fileio.py index 79e0ab7da..21c197eee 100644 --- a/tests/system/test_fileio.py +++ b/tests/system/test_fileio.py @@ -28,7 +28,7 @@ def test_blobwriter_and_blobreader( # Test BlobWriter works. info = file_data["big"] with open(info["path"], "rb") as file_obj: - with blob.open("wb", chunk_size=256 * 1024) as writer: + with blob.open("wb", chunk_size=256 * 1024, if_generation_match=0) as writer: writer.write(file_obj.read(100)) writer.write(file_obj.read(256 * 1024)) writer.write(file_obj.read()) @@ -63,7 +63,7 @@ def test_blobwriter_and_blobreader_text_mode( text_data = "\n".join([base_multibyte_text_string + str(x) for x in range(100)]) # Test text BlobWriter works. - with blob.open("wt") as writer: + with blob.open("wt", if_generation_match=0) as writer: writer.write(text_data[:100]) writer.write(text_data[100:]) blobs_to_delete.append(blob) From 5a179e70db1bff31edf633941ce6aa667710a6c8 Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 1 Jul 2024 16:51:57 -0700 Subject: [PATCH 269/509] chore: update blunderbuss assignment (#1297) * chore: update blunderbuss assignment * add comment --- .github/blunderbuss.yml | 13 ++++--------- owlbot.py | 1 + 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml index d0b41f786..8f2aae9b2 100644 --- a/.github/blunderbuss.yml +++ b/.github/blunderbuss.yml @@ -4,14 +4,9 @@ # Note: This file is autogenerated. To make changes to the assignee # team, please update `codeowner_team` in `.repo-metadata.json`. assign_issues: - - googleapis/cloud-storage-dpe - -assign_issues_by: - - labels: - - "samples" - to: - - googleapis/python-samples-reviewers - - googleapis/cloud-storage-dpe + - andrewsg + - cojenco assign_prs: - - googleapis/cloud-storage-dpe + - andrewsg + - cojenco diff --git a/owlbot.py b/owlbot.py index 0333b1d48..a06ae8cc4 100644 --- a/owlbot.py +++ b/owlbot.py @@ -47,6 +47,7 @@ "CONTRIBUTING.rst", "README.rst", ".kokoro/samples/python3.6", # remove python 3.6 support + ".github/blunderbuss.yml", # blunderbuss assignment to python squad ".github/workflows", # exclude gh actions as credentials are needed for tests ".github/release-please.yml", # special support for a python2 branch in this repo ], From 6d6216f6110cda89d3d0621f59f9865dea1cbac3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:06:39 -0400 Subject: [PATCH 270/509] chore: update templated files (#1307) Source-Link: https://github.com/googleapis/synthtool/commit/a37f74cd300d1f56d6f28c368d2931f72adee948 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:d3de8a02819f65001effcbd3ea76ce97e9bcff035c7a89457f40f892c87c5b32 Co-authored-by: Owl Bot --- .coveragerc | 2 +- .flake8 | 2 +- .github/.OwlBot.lock.yaml | 4 +- .github/auto-label.yaml | 2 +- .kokoro/build.sh | 2 +- .kokoro/docker/docs/Dockerfile | 2 +- .kokoro/populate-secrets.sh | 2 +- .kokoro/publish-docs.sh | 2 +- .kokoro/release.sh | 2 +- .kokoro/requirements.txt | 509 ++++++++++++++------------- .kokoro/test-samples-against-head.sh | 2 +- .kokoro/test-samples-impl.sh | 2 +- .kokoro/test-samples.sh | 2 +- .kokoro/trampoline.sh | 2 +- .kokoro/trampoline_v2.sh | 2 +- .pre-commit-config.yaml | 2 +- .trampolinerc | 2 +- MANIFEST.in | 2 +- docs/conf.py | 2 +- scripts/decrypt-secrets.sh | 2 +- scripts/readme-gen/readme_gen.py | 2 +- 21 files changed, 287 insertions(+), 264 deletions(-) diff --git a/.coveragerc b/.coveragerc index 21a2eaca4..e019a358a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.flake8 b/.flake8 index 87f6e408c..32986c792 100644 --- a/.flake8 +++ b/.flake8 @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 81f87c569..91d742b5b 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:5a4c19d17e597b92d786e569be101e636c9c2817731f80a5adec56b2aa8fe070 -# created: 2024-04-12T11:35:58.922854369Z + digest: sha256:d3de8a02819f65001effcbd3ea76ce97e9bcff035c7a89457f40f892c87c5b32 +# created: 2024-07-03T17:43:00.77142528Z diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml index 8b37ee897..21786a4eb 100644 --- a/.github/auto-label.yaml +++ b/.github/auto-label.yaml @@ -1,4 +1,4 @@ -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 99690a243..5ac9f8a51 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index bdaf39fe2..a26ce6193 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/populate-secrets.sh b/.kokoro/populate-secrets.sh index 6f3972140..c435402f4 100755 --- a/.kokoro/populate-secrets.sh +++ b/.kokoro/populate-secrets.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC. +# Copyright 2024 Google LLC. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh index 9eafe0be3..38f083f05 100755 --- a/.kokoro/publish-docs.sh +++ b/.kokoro/publish-docs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/release.sh b/.kokoro/release.sh index e8e52653e..c5fc555e1 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 51f92b8e1..35ece0e4d 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -4,21 +4,25 @@ # # pip-compile --allow-unsafe --generate-hashes requirements.in # -argcomplete==3.1.4 \ - --hash=sha256:72558ba729e4c468572609817226fb0a6e7e9a0a7d477b882be168c0b4a62b94 \ - --hash=sha256:fbe56f8cda08aa9a04b307d8482ea703e96a6a801611acb4be9bf3942017989f +argcomplete==3.4.0 \ + --hash=sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5 \ + --hash=sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f # via nox -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via gcp-releasetool -cachetools==5.3.2 \ - --hash=sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2 \ - --hash=sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 +backports-tarfile==1.2.0 \ + --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ + --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 + # via jaraco-context +cachetools==5.3.3 \ + --hash=sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945 \ + --hash=sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105 # via google-auth -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.6.2 \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 # via requests cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ @@ -87,90 +91,90 @@ click==8.0.4 \ # -r requirements.in # gcp-docuploader # gcp-releasetool -colorlog==6.7.0 \ - --hash=sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662 \ - --hash=sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5 +colorlog==6.8.2 \ + --hash=sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44 \ + --hash=sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33 # via # gcp-docuploader # nox -cryptography==42.0.5 \ - --hash=sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee \ - --hash=sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576 \ - --hash=sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d \ - --hash=sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30 \ - --hash=sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413 \ - --hash=sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb \ - --hash=sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da \ - --hash=sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4 \ - --hash=sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd \ - --hash=sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc \ - --hash=sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8 \ - --hash=sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1 \ - --hash=sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc \ - --hash=sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e \ - --hash=sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8 \ - --hash=sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940 \ - --hash=sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400 \ - --hash=sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7 \ - --hash=sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16 \ - --hash=sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278 \ - --hash=sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74 \ - --hash=sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec \ - --hash=sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1 \ - --hash=sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2 \ - --hash=sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c \ - --hash=sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922 \ - --hash=sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a \ - --hash=sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6 \ - --hash=sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1 \ - --hash=sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e \ - --hash=sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac \ - --hash=sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7 +cryptography==42.0.8 \ + --hash=sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad \ + --hash=sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583 \ + --hash=sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b \ + --hash=sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c \ + --hash=sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1 \ + --hash=sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648 \ + --hash=sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949 \ + --hash=sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba \ + --hash=sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c \ + --hash=sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9 \ + --hash=sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d \ + --hash=sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c \ + --hash=sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e \ + --hash=sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2 \ + --hash=sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d \ + --hash=sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7 \ + --hash=sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70 \ + --hash=sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2 \ + --hash=sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7 \ + --hash=sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14 \ + --hash=sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe \ + --hash=sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e \ + --hash=sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71 \ + --hash=sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961 \ + --hash=sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7 \ + --hash=sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c \ + --hash=sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28 \ + --hash=sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842 \ + --hash=sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902 \ + --hash=sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801 \ + --hash=sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a \ + --hash=sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e # via # -r requirements.in # gcp-releasetool # secretstorage -distlib==0.3.7 \ - --hash=sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057 \ - --hash=sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8 +distlib==0.3.8 \ + --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ + --hash=sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64 # via virtualenv -docutils==0.20.1 \ - --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ - --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b +docutils==0.21.2 \ + --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # via readme-renderer -filelock==3.13.1 \ - --hash=sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e \ - --hash=sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c +filelock==3.15.4 \ + --hash=sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb \ + --hash=sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7 # via virtualenv gcp-docuploader==0.6.5 \ --hash=sha256:30221d4ac3e5a2b9c69aa52fdbef68cc3f27d0e6d0d90e220fc024584b8d2318 \ --hash=sha256:b7458ef93f605b9d46a4bf3a8dc1755dad1f31d030c8679edf304e343b347eea # via -r requirements.in -gcp-releasetool==2.0.0 \ - --hash=sha256:3d73480b50ba243f22d7c7ec08b115a30e1c7817c4899781840c26f9c55b8277 \ - --hash=sha256:7aa9fd935ec61e581eb8458ad00823786d91756c25e492f372b2b30962f3c28f +gcp-releasetool==2.0.1 \ + --hash=sha256:34314a910c08e8911d9c965bd44f8f2185c4f556e737d719c33a41f6a610de96 \ + --hash=sha256:b0d5863c6a070702b10883d37c4bdfd74bf930fe417f36c0c965d3b7c779ae62 # via -r requirements.in -google-api-core==2.12.0 \ - --hash=sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553 \ - --hash=sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160 +google-api-core==2.19.1 \ + --hash=sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125 \ + --hash=sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd # via # google-cloud-core # google-cloud-storage -google-auth==2.23.4 \ - --hash=sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3 \ - --hash=sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2 +google-auth==2.31.0 \ + --hash=sha256:042c4702efa9f7d3c48d3a69341c209381b125faa6dbf3ebe56bc7e40ae05c23 \ + --hash=sha256:87805c36970047247c8afe614d4e3af8eceafc1ebba0c679fe75ddd1d575e871 # via # gcp-releasetool # google-api-core # google-cloud-core # google-cloud-storage -google-cloud-core==2.3.3 \ - --hash=sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb \ - --hash=sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863 +google-cloud-core==2.4.1 \ + --hash=sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073 \ + --hash=sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61 # via google-cloud-storage -google-cloud-storage==2.13.0 \ - --hash=sha256:ab0bf2e1780a1b74cf17fccb13788070b729f50c252f0c94ada2aae0ca95437d \ - --hash=sha256:f62dc4c7b6cd4360d072e3deb28035fbdad491ac3d9b0b1815a12daea10f37c7 +google-cloud-storage==2.17.0 \ + --hash=sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388 \ + --hash=sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1 # via gcp-docuploader google-crc32c==1.5.0 \ --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ @@ -244,28 +248,36 @@ google-crc32c==1.5.0 \ # via # google-cloud-storage # google-resumable-media -google-resumable-media==2.6.0 \ - --hash=sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7 \ - --hash=sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b +google-resumable-media==2.7.1 \ + --hash=sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c \ + --hash=sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33 # via google-cloud-storage -googleapis-common-protos==1.61.0 \ - --hash=sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0 \ - --hash=sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b +googleapis-common-protos==1.63.2 \ + --hash=sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945 \ + --hash=sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87 # via google-api-core idna==3.7 \ --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 +importlib-metadata==8.0.0 \ + --hash=sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f \ + --hash=sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812 # via # -r requirements.in # keyring # twine -jaraco-classes==3.3.0 \ - --hash=sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb \ - --hash=sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621 +jaraco-classes==3.4.0 \ + --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 + # via keyring +jaraco-context==5.3.0 \ + --hash=sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266 \ + --hash=sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2 + # via keyring +jaraco-functools==4.0.1 \ + --hash=sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664 \ + --hash=sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8 # via keyring jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ @@ -273,13 +285,13 @@ jeepney==0.8.0 \ # via # keyring # secretstorage -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via gcp-releasetool -keyring==24.2.0 \ - --hash=sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6 \ - --hash=sha256:ca0746a19ec421219f4d713f848fa297a661a8a8c1504867e55bfb5e09091509 +keyring==25.2.1 \ + --hash=sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50 \ + --hash=sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b # via # gcp-releasetool # twine @@ -287,146 +299,153 @@ markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich -markupsafe==2.1.3 \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb \ - --hash=sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939 \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007 \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ - --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via jinja2 mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -more-itertools==10.1.0 \ - --hash=sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a \ - --hash=sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6 - # via jaraco-classes -nh3==0.2.14 \ - --hash=sha256:116c9515937f94f0057ef50ebcbcc10600860065953ba56f14473ff706371873 \ - --hash=sha256:18415df36db9b001f71a42a3a5395db79cf23d556996090d293764436e98e8ad \ - --hash=sha256:203cac86e313cf6486704d0ec620a992c8bc164c86d3a4fd3d761dd552d839b5 \ - --hash=sha256:2b0be5c792bd43d0abef8ca39dd8acb3c0611052ce466d0401d51ea0d9aa7525 \ - --hash=sha256:377aaf6a9e7c63962f367158d808c6a1344e2b4f83d071c43fbd631b75c4f0b2 \ - --hash=sha256:525846c56c2bcd376f5eaee76063ebf33cf1e620c1498b2a40107f60cfc6054e \ - --hash=sha256:5529a3bf99402c34056576d80ae5547123f1078da76aa99e8ed79e44fa67282d \ - --hash=sha256:7771d43222b639a4cd9e341f870cee336b9d886de1ad9bec8dddab22fe1de450 \ - --hash=sha256:88c753efbcdfc2644a5012938c6b9753f1c64a5723a67f0301ca43e7b85dcf0e \ - --hash=sha256:93a943cfd3e33bd03f77b97baa11990148687877b74193bf777956b67054dcc6 \ - --hash=sha256:9be2f68fb9a40d8440cbf34cbf40758aa7f6093160bfc7fb018cce8e424f0c3a \ - --hash=sha256:a0c509894fd4dccdff557068e5074999ae3b75f4c5a2d6fb5415e782e25679c4 \ - --hash=sha256:ac8056e937f264995a82bf0053ca898a1cb1c9efc7cd68fa07fe0060734df7e4 \ - --hash=sha256:aed56a86daa43966dd790ba86d4b810b219f75b4bb737461b6886ce2bde38fd6 \ - --hash=sha256:e8986f1dd3221d1e741fda0a12eaa4a273f1d80a35e31a1ffe579e7c621d069e \ - --hash=sha256:f99212a81c62b5f22f9e7c3e347aa00491114a5647e1f13bbebd79c3e5f08d75 +more-itertools==10.3.0 \ + --hash=sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463 \ + --hash=sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320 + # via + # jaraco-classes + # jaraco-functools +nh3==0.2.17 \ + --hash=sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a \ + --hash=sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911 \ + --hash=sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb \ + --hash=sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a \ + --hash=sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc \ + --hash=sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028 \ + --hash=sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9 \ + --hash=sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3 \ + --hash=sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351 \ + --hash=sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10 \ + --hash=sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71 \ + --hash=sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f \ + --hash=sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b \ + --hash=sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a \ + --hash=sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062 \ + --hash=sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a # via readme-renderer -nox==2023.4.22 \ - --hash=sha256:0b1adc619c58ab4fa57d6ab2e7823fe47a32e70202f287d78474adcc7bda1891 \ - --hash=sha256:46c0560b0dc609d7d967dc99e22cb463d3c4caf54a5fda735d6c11b5177e3a9f +nox==2024.4.15 \ + --hash=sha256:6492236efa15a460ecb98e7b67562a28b70da006ab0be164e8821177577c0565 \ + --hash=sha256:ecf6700199cdfa9e5ea0a41ff5e6ef4641d09508eda6edb89d9987864115817f # via -r requirements.in -packaging==23.2 \ - --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ - --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via # gcp-releasetool # nox -pkginfo==1.9.6 \ - --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ - --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 +pkginfo==1.10.0 \ + --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \ + --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097 # via twine -platformdirs==3.11.0 \ - --hash=sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3 \ - --hash=sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e +platformdirs==4.2.2 \ + --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ + --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 # via virtualenv -protobuf==4.25.3 \ - --hash=sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4 \ - --hash=sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 \ - --hash=sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c \ - --hash=sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d \ - --hash=sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4 \ - --hash=sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa \ - --hash=sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c \ - --hash=sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019 \ - --hash=sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9 \ - --hash=sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c \ - --hash=sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2 +proto-plus==1.24.0 \ + --hash=sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445 \ + --hash=sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12 + # via google-api-core +protobuf==5.27.2 \ + --hash=sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505 \ + --hash=sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b \ + --hash=sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38 \ + --hash=sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863 \ + --hash=sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470 \ + --hash=sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6 \ + --hash=sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce \ + --hash=sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca \ + --hash=sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5 \ + --hash=sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e \ + --hash=sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714 # via # gcp-docuploader # gcp-releasetool # google-api-core # googleapis-common-protos -pyasn1==0.5.0 \ - --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ - --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde + # proto-plus +pyasn1==0.6.0 \ + --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ + --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 # via # pyasn1-modules # rsa -pyasn1-modules==0.3.0 \ - --hash=sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c \ - --hash=sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d +pyasn1-modules==0.4.0 \ + --hash=sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6 \ + --hash=sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b # via google-auth -pycparser==2.21 \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 +pycparser==2.22 \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc # via cffi -pygments==2.16.1 \ - --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ - --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 +pygments==2.18.0 \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # via # readme-renderer # rich @@ -434,20 +453,20 @@ pyjwt==2.8.0 \ --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 # via gcp-releasetool -pyperclip==1.8.2 \ - --hash=sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57 +pyperclip==1.9.0 \ + --hash=sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310 # via gcp-releasetool -python-dateutil==2.8.2 \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via gcp-releasetool -readme-renderer==42.0 \ - --hash=sha256:13d039515c1f24de668e2c93f2e877b9dbe6c6c32328b90a40a49d8b2b85f36d \ - --hash=sha256:2d55489f83be4992fe4454939d1a051c33edbab778e82761d060c9fc6b308cd1 +readme-renderer==43.0 \ + --hash=sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311 \ + --hash=sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9 # via twine -requests==2.31.0 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 +requests==2.32.3 \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via # gcp-releasetool # google-api-core @@ -462,9 +481,9 @@ rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==13.6.0 \ - --hash=sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245 \ - --hash=sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef +rich==13.7.1 \ + --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ + --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 # via twine rsa==4.9 \ --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ @@ -480,35 +499,39 @@ six==1.16.0 \ # via # gcp-docuploader # python-dateutil -twine==4.0.2 \ - --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ - --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via nox +twine==5.1.1 \ + --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \ + --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db # via -r requirements.in -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via -r requirements.in -urllib3==2.0.7 \ - --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ - --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 # via # requests # twine -virtualenv==20.24.6 \ - --hash=sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af \ - --hash=sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381 +virtualenv==20.26.3 \ + --hash=sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a \ + --hash=sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589 # via nox -wheel==0.41.3 \ - --hash=sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942 \ - --hash=sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841 +wheel==0.43.0 \ + --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ + --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 # via -r requirements.in -zipp==3.17.0 \ - --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ - --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==69.2.0 \ - --hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \ - --hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c +setuptools==70.2.0 \ + --hash=sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 \ + --hash=sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1 # via -r requirements.in diff --git a/.kokoro/test-samples-against-head.sh b/.kokoro/test-samples-against-head.sh index 63ac41dfa..e9d8bd79a 100755 --- a/.kokoro/test-samples-against-head.sh +++ b/.kokoro/test-samples-against-head.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/test-samples-impl.sh b/.kokoro/test-samples-impl.sh index 5a0f5fab6..55910c8ba 100755 --- a/.kokoro/test-samples-impl.sh +++ b/.kokoro/test-samples-impl.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/test-samples.sh b/.kokoro/test-samples.sh index 50b35a48c..7933d8201 100755 --- a/.kokoro/test-samples.sh +++ b/.kokoro/test-samples.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh index d85b1f267..48f796997 100755 --- a/.kokoro/trampoline.sh +++ b/.kokoro/trampoline.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/trampoline_v2.sh b/.kokoro/trampoline_v2.sh index 59a7cf3a9..35fa52923 100755 --- a/.kokoro/trampoline_v2.sh +++ b/.kokoro/trampoline_v2.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6a8e16950..1d74695f7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.trampolinerc b/.trampolinerc index a7dfeb42c..008015237 100644 --- a/.trampolinerc +++ b/.trampolinerc @@ -1,4 +1,4 @@ -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/MANIFEST.in b/MANIFEST.in index e0a667053..d6814cd60 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/docs/conf.py b/docs/conf.py index bee939ca1..a2af349a6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/decrypt-secrets.sh b/scripts/decrypt-secrets.sh index 0018b421d..120b0ddc4 100755 --- a/scripts/decrypt-secrets.sh +++ b/scripts/decrypt-secrets.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2023 Google LLC All rights reserved. +# Copyright 2024 Google LLC All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/readme-gen/readme_gen.py b/scripts/readme-gen/readme_gen.py index 1acc11983..8f5e248a0 100644 --- a/scripts/readme-gen/readme_gen.py +++ b/scripts/readme-gen/readme_gen.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 152b249472a09342777237d47b6c09f99c2d28e6 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Mon, 8 Jul 2024 12:43:11 -0400 Subject: [PATCH 271/509] fix: Allow Protobuf 5.x (#1317) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 391bf7770..3f80b2ffa 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ "google-crc32c >= 1.0, < 2.0dev", ] extras = { - "protobuf": ["protobuf<5.0.0dev"], + "protobuf": ["protobuf<6.0.0dev"], "tracing": [ "opentelemetry-api >= 1.1.0", ], From ed7cbbafc29ce462d12cd6b10dd975443967cdea Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 9 Jul 2024 10:09:12 -0700 Subject: [PATCH 272/509] test: harden pytest fixture setup stage (#1323) * test: update pytest fixtures bucket creation * apply default retry to fixture uploads --- tests/system/conftest.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/tests/system/conftest.py b/tests/system/conftest.py index c92aeddd5..a97b98648 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -20,6 +20,7 @@ from google.api_core import exceptions from google.cloud import kms from google.cloud.storage._helpers import _base64_md5hash +from google.cloud.storage.retry import DEFAULT_RETRY from . import _helpers @@ -104,7 +105,11 @@ def shared_bucket_name(): def shared_bucket(storage_client, shared_bucket_name): bucket = storage_client.bucket(shared_bucket_name) bucket.versioning_enabled = True - _helpers.retry_429_503(bucket.create)() + # Create the bucket only if it doesn't yet exist. + try: + storage_client.get_bucket(bucket) + except exceptions.NotFound: + _helpers.retry_429_503(bucket.create)() yield bucket @@ -119,11 +124,15 @@ def listable_bucket_name(): @pytest.fixture(scope="session") def listable_bucket(storage_client, listable_bucket_name, file_data): bucket = storage_client.bucket(listable_bucket_name) - _helpers.retry_429_503(bucket.create)() + # Create the bucket only if it doesn't yet exist. + try: + storage_client.get_bucket(bucket) + except exceptions.NotFound: + _helpers.retry_429_503(bucket.create)() info = file_data["logo"] source_blob = bucket.blob(_listable_filenames[0]) - source_blob.upload_from_filename(info["path"]) + source_blob.upload_from_filename(info["path"], retry=DEFAULT_RETRY) for filename in _listable_filenames[1:]: _helpers.retry_bad_copy(bucket.copy_blob)( @@ -159,7 +168,7 @@ def hierarchy_bucket(storage_client, hierarchy_bucket_name, file_data): simple_path = _file_data["simple"]["path"] for filename in _hierarchy_filenames: blob = bucket.blob(filename) - blob.upload_from_filename(simple_path) + blob.upload_from_filename(simple_path, retry=DEFAULT_RETRY) yield bucket @@ -179,7 +188,12 @@ def signing_bucket_name(): @pytest.fixture(scope="session") def signing_bucket(storage_client, signing_bucket_name): bucket = storage_client.bucket(signing_bucket_name) - _helpers.retry_429_503(bucket.create)() + # Create the bucket only if it doesn't yet exist. + try: + storage_client.get_bucket(bucket) + except exceptions.NotFound: + _helpers.retry_429_503(bucket.create)() + blob = bucket.blob("README.txt") blob.upload_from_string(_helpers.signing_blob_content) @@ -205,7 +219,11 @@ def default_ebh_bucket_name(): def default_ebh_bucket(storage_client, default_ebh_bucket_name): bucket = storage_client.bucket(default_ebh_bucket_name) bucket.default_event_based_hold = True - _helpers.retry_429_503(bucket.create)() + # Create the bucket only if it doesn't yet exist. + try: + storage_client.get_bucket(bucket) + except exceptions.NotFound: + _helpers.retry_429_503(bucket.create)() yield bucket From ea47943276fb3227bca5c7eea092f1bb4ce76fb9 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 9 Jul 2024 19:30:18 +0200 Subject: [PATCH 273/509] chore(deps): update all dependencies (#1308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | Type | Update | |---|---|---|---|---|---|---|---| | [argcomplete](https://togithub.com/kislyuk/argcomplete) ([changelog](https://togithub.com/kislyuk/argcomplete/blob/master/Changes.rst)) | `==3.2.3` -> `==3.4.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/argcomplete/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/argcomplete/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/argcomplete/3.2.3/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/argcomplete/3.2.3/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | | [filelock](https://togithub.com/tox-dev/py-filelock) | `==3.13.1` -> `==3.15.4` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/filelock/3.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/filelock/3.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/filelock/3.13.1/3.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/filelock/3.13.1/3.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | | [google-cloud-pubsub](https://togithub.com/googleapis/python-pubsub) | `==2.21.1` -> `==2.21.5` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/google-cloud-pubsub/2.21.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/google-cloud-pubsub/2.21.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/google-cloud-pubsub/2.21.1/2.21.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-cloud-pubsub/2.21.1/2.21.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | patch | | [google-cloud-storage](https://togithub.com/googleapis/python-storage) | `==2.16.0` -> `==2.17.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/google-cloud-storage/2.17.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/google-cloud-storage/2.17.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/google-cloud-storage/2.16.0/2.17.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-cloud-storage/2.16.0/2.17.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | | [nox](https://togithub.com/wntrblm/nox) | `==2024.3.2` -> `==2024.4.15` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/nox/2024.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/nox/2024.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/nox/2024.3.2/2024.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/nox/2024.3.2/2024.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | | [packaging](https://togithub.com/pypa/packaging) | `==24.0` -> `==24.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/packaging/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/packaging/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/packaging/24.0/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/packaging/24.0/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | | [platformdirs](https://togithub.com/platformdirs/platformdirs) | `==4.2.0` -> `==4.2.2` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/platformdirs/4.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/platformdirs/4.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/platformdirs/4.2.0/4.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/platformdirs/4.2.0/4.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | patch | | [pytest](https://togithub.com/pytest-dev/pytest) ([changelog](https://docs.pytest.org/en/stable/changelog.html)) | `==8.1.1` -> `==8.2.2` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest/8.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest/8.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest/8.1.1/8.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest/8.1.1/8.2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | | ubuntu | `22.04` -> `24.04` | [![age](https://developer.mend.io/api/mc/badges/age/docker/ubuntu/noble?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/docker/ubuntu/noble?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/docker/ubuntu/22.04/noble?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/docker/ubuntu/22.04/noble?slim=true)](https://docs.renovatebot.com/merge-confidence/) | final | major | | [virtualenv](https://togithub.com/pypa/virtualenv) | `==20.25.1` -> `==20.26.3` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/virtualenv/20.26.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/virtualenv/20.26.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/virtualenv/20.25.1/20.26.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/virtualenv/20.25.1/20.26.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | minor | --- ### Release Notes
kislyuk/argcomplete (argcomplete) ### [`v3.4.0`](https://togithub.com/kislyuk/argcomplete/blob/HEAD/Changes.rst#Changes-for-v340-2024-06-16) [Compare Source](https://togithub.com/kislyuk/argcomplete/compare/v3.3.0...v3.4.0) \=============================== - No stdin for python calls from bash completion functions ([#​488](https://togithub.com/kislyuk/argcomplete/issues/488)) Prevents usage of stdin by (python) executables that are called during completion generation. This prevents the completion locking up the entire shell when the python script is broken i.e. it enters an interactive mode (REPL) instead of generating the completions, as expected. - Localize shell variable REPLY to avoid overwriting users’ value ([#​489](https://togithub.com/kislyuk/argcomplete/issues/489)) The variable REPLY is used by default by the `read` shell builtin to store the return value, and like all bash/zsh variables, is scoped globally. This change allows this variable to be used for other needs by appropriately scoping its internal use by an argcomplete utility function that uses `read`. ### [`v3.3.0`](https://togithub.com/kislyuk/argcomplete/blob/HEAD/Changes.rst#Changes-for-v330-2024-04-14) [Compare Source](https://togithub.com/kislyuk/argcomplete/compare/v3.2.3...v3.3.0) \=============================== - Preserve compatibility with argparse option tuples of length 4. This update is required to use argcomplete on Python 3.11.9+ or 3.12.3+.
tox-dev/py-filelock (filelock) ### [`v3.15.4`](https://togithub.com/tox-dev/filelock/releases/tag/3.15.4) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.15.3...3.15.4) #### What's Changed - Pass `file_lock` as positional argument by [@​kwist-sgr](https://togithub.com/kwist-sgr) in [https://togithub.com/tox-dev/filelock/pull/347](https://togithub.com/tox-dev/filelock/pull/347) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.15.3...3.15.4 ### [`v3.15.3`](https://togithub.com/tox-dev/filelock/releases/tag/3.15.3) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.15.2...3.15.3) #### What's Changed - Add test for virtualenv stability by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/tox-dev/filelock/pull/344](https://togithub.com/tox-dev/filelock/pull/344) - Fix `TypeError: _CountedFileLock.__init__() got an unexpected keyword argument 'timeout'` by [@​kwist-sgr](https://togithub.com/kwist-sgr) in [https://togithub.com/tox-dev/filelock/pull/345](https://togithub.com/tox-dev/filelock/pull/345) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.15.2...3.15.3 ### [`v3.15.2`](https://togithub.com/tox-dev/filelock/releases/tag/3.15.2) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.15.1...3.15.2) #### What's Changed - Use a metaclass to implement the singleton pattern by [@​kwist-sgr](https://togithub.com/kwist-sgr) in [https://togithub.com/tox-dev/filelock/pull/340](https://togithub.com/tox-dev/filelock/pull/340) #### New Contributors - [@​kwist-sgr](https://togithub.com/kwist-sgr) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/340](https://togithub.com/tox-dev/filelock/pull/340) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.15.1...3.15.2 ### [`v3.15.1`](https://togithub.com/tox-dev/filelock/releases/tag/3.15.1) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.15.0...3.15.1) #### What's Changed - Hotfix: Restore **init** method; more robust initialization for singleton locks by [@​ethanbb](https://togithub.com/ethanbb) in [https://togithub.com/tox-dev/filelock/pull/338](https://togithub.com/tox-dev/filelock/pull/338) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.15.0...3.15.1 ### [`v3.15.0`](https://togithub.com/tox-dev/filelock/releases/tag/3.15.0) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.14.0...3.15.0) #### What's Changed - asyncio support by [@​Ovizro](https://togithub.com/Ovizro) in [https://togithub.com/tox-dev/filelock/pull/332](https://togithub.com/tox-dev/filelock/pull/332) - Don't initialize BaseFileLock when just returning existing instance by [@​ethanbb](https://togithub.com/ethanbb) in [https://togithub.com/tox-dev/filelock/pull/334](https://togithub.com/tox-dev/filelock/pull/334) #### New Contributors - [@​Ovizro](https://togithub.com/Ovizro) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/332](https://togithub.com/tox-dev/filelock/pull/332) - [@​ethanbb](https://togithub.com/ethanbb) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/334](https://togithub.com/tox-dev/filelock/pull/334) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.14.0...3.15.0 ### [`v3.14.0`](https://togithub.com/tox-dev/filelock/releases/tag/3.14.0) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.13.4...3.14.0) #### What's Changed - feat: `blocking` parameter on lock constructor with tests and docs by [@​iamkhav](https://togithub.com/iamkhav) in [https://togithub.com/tox-dev/filelock/pull/325](https://togithub.com/tox-dev/filelock/pull/325) #### New Contributors - [@​iamkhav](https://togithub.com/iamkhav) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/325](https://togithub.com/tox-dev/filelock/pull/325) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.13.4...3.14.0 ### [`v3.13.4`](https://togithub.com/tox-dev/filelock/releases/tag/3.13.4) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.13.3...3.13.4) #### What's Changed - Raise error on incompatible singleton timeout and mode args by [@​nefrob](https://togithub.com/nefrob) in [https://togithub.com/tox-dev/filelock/pull/320](https://togithub.com/tox-dev/filelock/pull/320) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.13.3...3.13.4 ### [`v3.13.3`](https://togithub.com/tox-dev/filelock/releases/tag/3.13.3) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.13.2...3.13.3) #### What's Changed - Make singleton class instance dict unique per subclass by [@​nefrob](https://togithub.com/nefrob) in [https://togithub.com/tox-dev/filelock/pull/318](https://togithub.com/tox-dev/filelock/pull/318) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.13.2...3.13.3 ### [`v3.13.2`](https://togithub.com/tox-dev/filelock/releases/tag/3.13.2) [Compare Source](https://togithub.com/tox-dev/py-filelock/compare/3.13.1...3.13.2) #### What's Changed - Fixed small typo in \_unix.py by [@​snemes](https://togithub.com/snemes) in [https://togithub.com/tox-dev/filelock/pull/302](https://togithub.com/tox-dev/filelock/pull/302) - Update SECURITY.md to reflect Python 3.7 support dropoff by [@​kemzeb](https://togithub.com/kemzeb) in [https://togithub.com/tox-dev/filelock/pull/304](https://togithub.com/tox-dev/filelock/pull/304) - Update index.rst to improve the demo usage by [@​youkaichao](https://togithub.com/youkaichao) in [https://togithub.com/tox-dev/filelock/pull/314](https://togithub.com/tox-dev/filelock/pull/314) - \[BugFix] fix permission denied error when lock file is placed in `/tmp` by [@​kota-iizuka](https://togithub.com/kota-iizuka) in [https://togithub.com/tox-dev/filelock/pull/317](https://togithub.com/tox-dev/filelock/pull/317) #### New Contributors - [@​snemes](https://togithub.com/snemes) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/302](https://togithub.com/tox-dev/filelock/pull/302) - [@​kemzeb](https://togithub.com/kemzeb) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/304](https://togithub.com/tox-dev/filelock/pull/304) - [@​youkaichao](https://togithub.com/youkaichao) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/314](https://togithub.com/tox-dev/filelock/pull/314) - [@​kota-iizuka](https://togithub.com/kota-iizuka) made their first contribution in [https://togithub.com/tox-dev/filelock/pull/317](https://togithub.com/tox-dev/filelock/pull/317) **Full Changelog**: https://togithub.com/tox-dev/filelock/compare/3.13.1...3.13.2
googleapis/python-pubsub (google-cloud-pubsub) ### [`v2.21.5`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2215-2024-06-20) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.21.4...v2.21.5) ##### Bug Fixes - Allow Protobuf 5.x ([a369f04](https://togithub.com/googleapis/python-pubsub/commit/a369f04c46e4b3db34dcf8cc2ef7cda4ea491e26)) ### [`v2.21.4`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2214-2024-06-18) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.21.3...v2.21.4) ##### Documentation - **samples:** Add code sample for optimistic subscribe ([#​1182](https://togithub.com/googleapis/python-pubsub/issues/1182)) ([d8e8aa5](https://togithub.com/googleapis/python-pubsub/commit/d8e8aa59ab0288fdaf5a1cc5e476581e73d0f82c)) ### [`v2.21.3`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2213-2024-06-10) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.21.2...v2.21.3) ##### Bug Fixes - Race condition where future callbacks invoked before client is in paused state ([#​1145](https://togithub.com/googleapis/python-pubsub/issues/1145)) ([d12bac6](https://togithub.com/googleapis/python-pubsub/commit/d12bac6d94b337aa8978006600fb00e5b13d741d)) - Suppress warnings caused during pytest runs ([#​1189](https://togithub.com/googleapis/python-pubsub/issues/1189)) ([cd51149](https://togithub.com/googleapis/python-pubsub/commit/cd51149c9e0d3c59d1c75395c05308e860908bf9)) - Typecheck errors in samples/snippets/subscriber.py ([#​1186](https://togithub.com/googleapis/python-pubsub/issues/1186)) ([3698450](https://togithub.com/googleapis/python-pubsub/commit/3698450041cb4db0e2957832c24450f674b89c11)) ### [`v2.21.2`](https://togithub.com/googleapis/python-pubsub/blob/HEAD/CHANGELOG.md#2212-2024-05-30) [Compare Source](https://togithub.com/googleapis/python-pubsub/compare/v2.21.1...v2.21.2) ##### Bug Fixes - Test failures due to grpcio changes ([#​1178](https://togithub.com/googleapis/python-pubsub/issues/1178)) ([086dd46](https://togithub.com/googleapis/python-pubsub/commit/086dd4660ec56d9ff2d41a32ec0b8e8dc44acc55))
googleapis/python-storage (google-cloud-storage) ### [`v2.17.0`](https://togithub.com/googleapis/python-storage/blob/HEAD/CHANGELOG.md#2170-2024-05-22) [Compare Source](https://togithub.com/googleapis/python-storage/compare/v2.16.0...v2.17.0) ##### Features - Support HNS enablement in bucket metadata ([#​1278](https://togithub.com/googleapis/python-storage/issues/1278)) ([add3c01](https://togithub.com/googleapis/python-storage/commit/add3c01f0974e22df7f0b50504d5e83e4235fd81)) - Support page_size in bucket.list_blobs ([#​1275](https://togithub.com/googleapis/python-storage/issues/1275)) ([c52e882](https://togithub.com/googleapis/python-storage/commit/c52e882f65583a7739392926308cc34984561165)) ##### Bug Fixes - Remove deprecated methods in samples and tests ([#​1274](https://togithub.com/googleapis/python-storage/issues/1274)) ([4db96c9](https://togithub.com/googleapis/python-storage/commit/4db96c960b07e503c1031c9fa879cf2af195f513)) ##### Documentation - Reference Storage Control in readme ([#​1254](https://togithub.com/googleapis/python-storage/issues/1254)) ([3d6d369](https://togithub.com/googleapis/python-storage/commit/3d6d3693d5c1b24cd3d2bbdeabfd78b8bfd4161a)) - Update DEFAULT_RETRY_IF_GENERATION_SPECIFIED docstrings ([#​1234](https://togithub.com/googleapis/python-storage/issues/1234)) ([bdd426a](https://togithub.com/googleapis/python-storage/commit/bdd426adf5901faa36115885af868ef50e356a36))
wntrblm/nox (nox) ### [`v2024.4.15`](https://togithub.com/wntrblm/nox/compare/2024.03.02...2024.04.15) [Compare Source](https://togithub.com/wntrblm/nox/compare/2024.03.02...2024.04.15)
pypa/packaging (packaging) ### [`v24.1`](https://togithub.com/pypa/packaging/releases/tag/24.1) [Compare Source](https://togithub.com/pypa/packaging/compare/24.0...24.1) #### What's Changed - pyupgrade/black/isort/flake8 → ruff by [@​DimitriPapadopoulos](https://togithub.com/DimitriPapadopoulos) in [https://togithub.com/pypa/packaging/pull/769](https://togithub.com/pypa/packaging/pull/769) - Add support for Python 3.13 and drop EOL 3.7 by [@​hugovk](https://togithub.com/hugovk) in [https://togithub.com/pypa/packaging/pull/783](https://togithub.com/pypa/packaging/pull/783) - Bump the github-actions group with 4 updates by [@​dependabot](https://togithub.com/dependabot) in [https://togithub.com/pypa/packaging/pull/782](https://togithub.com/pypa/packaging/pull/782) - Fix typo in `_parser` docstring by [@​pradyunsg](https://togithub.com/pradyunsg) in [https://togithub.com/pypa/packaging/pull/784](https://togithub.com/pypa/packaging/pull/784) - Modernise type annotations using FA rules from ruff by [@​pradyunsg](https://togithub.com/pradyunsg) in [https://togithub.com/pypa/packaging/pull/785](https://togithub.com/pypa/packaging/pull/785) - Document `markers.default_environment()` by [@​edgarrmondragon](https://togithub.com/edgarrmondragon) in [https://togithub.com/pypa/packaging/pull/753](https://togithub.com/pypa/packaging/pull/753) - Bump the github-actions group with 3 updates by [@​dependabot](https://togithub.com/dependabot) in [https://togithub.com/pypa/packaging/pull/789](https://togithub.com/pypa/packaging/pull/789) - Work around platform.python_version() returning non PEP 440 compliant version for non-tagged CPython builds by [@​sbidoul](https://togithub.com/sbidoul) in [https://togithub.com/pypa/packaging/pull/802](https://togithub.com/pypa/packaging/pull/802) #### New Contributors - [@​dependabot](https://togithub.com/dependabot) made their first contribution in [https://togithub.com/pypa/packaging/pull/782](https://togithub.com/pypa/packaging/pull/782) - [@​edgarrmondragon](https://togithub.com/edgarrmondragon) made their first contribution in [https://togithub.com/pypa/packaging/pull/753](https://togithub.com/pypa/packaging/pull/753) **Full Changelog**: https://togithub.com/pypa/packaging/compare/24.0...24.1
platformdirs/platformdirs (platformdirs) ### [`v4.2.2`](https://togithub.com/platformdirs/platformdirs/releases/tag/4.2.2) [Compare Source](https://togithub.com/platformdirs/platformdirs/compare/4.2.1...4.2.2) #### What's Changed - Fix android detection when python4android is present by [@​tmolitor-stud-tu](https://togithub.com/tmolitor-stud-tu) in [https://togithub.com/platformdirs/platformdirs/pull/277](https://togithub.com/platformdirs/platformdirs/pull/277) #### New Contributors - [@​tmolitor-stud-tu](https://togithub.com/tmolitor-stud-tu) made their first contribution in [https://togithub.com/platformdirs/platformdirs/pull/277](https://togithub.com/platformdirs/platformdirs/pull/277) **Full Changelog**: https://togithub.com/platformdirs/platformdirs/compare/4.2.1...4.2.2 ### [`v4.2.1`](https://togithub.com/platformdirs/platformdirs/releases/tag/4.2.1) [Compare Source](https://togithub.com/platformdirs/platformdirs/compare/4.2.0...4.2.1) #### What's Changed - Switch to ruff for formatting and use codespell and docformatter by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/platformdirs/platformdirs/pull/261](https://togithub.com/platformdirs/platformdirs/pull/261) - Use hatch over tox by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/platformdirs/platformdirs/pull/262](https://togithub.com/platformdirs/platformdirs/pull/262) - chore: various minor fixes by [@​deronnax](https://togithub.com/deronnax) in [https://togithub.com/platformdirs/platformdirs/pull/263](https://togithub.com/platformdirs/platformdirs/pull/263) - chore: update dead Microsoft's known folders documentation link by [@​deronnax](https://togithub.com/deronnax) in [https://togithub.com/platformdirs/platformdirs/pull/267](https://togithub.com/platformdirs/platformdirs/pull/267) - Allow working without ctypes by [@​youknowone](https://togithub.com/youknowone) in [https://togithub.com/platformdirs/platformdirs/pull/275](https://togithub.com/platformdirs/platformdirs/pull/275) #### New Contributors - [@​deronnax](https://togithub.com/deronnax) made their first contribution in [https://togithub.com/platformdirs/platformdirs/pull/263](https://togithub.com/platformdirs/platformdirs/pull/263) - [@​youknowone](https://togithub.com/youknowone) made their first contribution in [https://togithub.com/platformdirs/platformdirs/pull/275](https://togithub.com/platformdirs/platformdirs/pull/275) **Full Changelog**: https://togithub.com/platformdirs/platformdirs/compare/4.2.0...4.2.1
pytest-dev/pytest (pytest) ### [`v8.2.2`](https://togithub.com/pytest-dev/pytest/releases/tag/8.2.2) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.2.1...8.2.2) # pytest 8.2.2 (2024-06-04) ## Bug Fixes - [#​12355](https://togithub.com/pytest-dev/pytest/issues/12355): Fix possible catastrophic performance slowdown on a certain parametrization pattern involving many higher-scoped parameters. - [#​12367](https://togithub.com/pytest-dev/pytest/issues/12367): Fix a regression in pytest 8.2.0 where unittest class instances (a fresh one is created for each test) were not released promptly on test teardown but only on session teardown. - [#​12381](https://togithub.com/pytest-dev/pytest/issues/12381): Fix possible "Directory not empty" crashes arising from concurent cache dir (`.pytest_cache`) creation. Regressed in pytest 8.2.0. ## Improved Documentation - [#​12290](https://togithub.com/pytest-dev/pytest/issues/12290): Updated Sphinx theme to use Furo instead of Flask, enabling Dark mode theme. - [#​12356](https://togithub.com/pytest-dev/pytest/issues/12356): Added a subsection to the documentation for debugging flaky tests to mention lack of thread safety in pytest as a possible source of flakyness. - [#​12363](https://togithub.com/pytest-dev/pytest/issues/12363): The documentation webpages now links to a canonical version to reduce outdated documentation in search engine results. ### [`v8.2.1`](https://togithub.com/pytest-dev/pytest/releases/tag/8.2.1) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.2.0...8.2.1) # pytest 8.2.1 (2024-05-19) ## Improvements - [#​12334](https://togithub.com/pytest-dev/pytest/issues/12334): Support for Python 3.13 (beta1 at the time of writing). ## Bug Fixes - [#​12120](https://togithub.com/pytest-dev/pytest/issues/12120): Fix \[PermissionError]{.title-ref} crashes arising from directories which are not selected on the command-line. - [#​12191](https://togithub.com/pytest-dev/pytest/issues/12191): Keyboard interrupts and system exits are now properly handled during the test collection. - [#​12300](https://togithub.com/pytest-dev/pytest/issues/12300): Fixed handling of 'Function not implemented' error under squashfuse_ll, which is a different way to say that the mountpoint is read-only. - [#​12308](https://togithub.com/pytest-dev/pytest/issues/12308): Fix a regression in pytest 8.2.0 where the permissions of automatically-created `.pytest_cache` directories became `rwx------` instead of the expected `rwxr-xr-x`. ## Trivial/Internal Changes - [#​12333](https://togithub.com/pytest-dev/pytest/issues/12333): pytest releases are now attested using the recent [Artifact Attestation](https://github.blog/2024-05-02-introducing-artifact-attestations-now-in-public-beta/) support from GitHub, allowing users to verify the provenance of pytest's sdist and wheel artifacts. ### [`v8.2.0`](https://togithub.com/pytest-dev/pytest/releases/tag/8.2.0) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.1.2...8.2.0) # pytest 8.2.0 (2024-04-27) ## Deprecations - [#​12069](https://togithub.com/pytest-dev/pytest/issues/12069): A deprecation warning is now raised when implementations of one of the following hooks request a deprecated `py.path.local` parameter instead of the `pathlib.Path` parameter which replaced it: - `pytest_ignore_collect`{.interpreted-text role="hook"} - the `path` parameter - use `collection_path` instead. - `pytest_collect_file`{.interpreted-text role="hook"} - the `path` parameter - use `file_path` instead. - `pytest_pycollect_makemodule`{.interpreted-text role="hook"} - the `path` parameter - use `module_path` instead. - `pytest_report_header`{.interpreted-text role="hook"} - the `startdir` parameter - use `start_path` instead. - `pytest_report_collectionfinish`{.interpreted-text role="hook"} - the `startdir` parameter - use `start_path` instead. The replacement parameters are available since pytest 7.0.0. The old parameters will be removed in pytest 9.0.0. See `legacy-path-hooks-deprecated`{.interpreted-text role="ref"} for more details. ## Features - [#​11871](https://togithub.com/pytest-dev/pytest/issues/11871): Added support for reading command line arguments from a file using the prefix character `@`, like e.g.: `pytest @​tests.txt`. The file must have one argument per line. See `Read arguments from file `{.interpreted-text role="ref"} for details. ## Improvements - [#​11523](https://togithub.com/pytest-dev/pytest/issues/11523): `pytest.importorskip`{.interpreted-text role="func"} will now issue a warning if the module could be found, but raised `ImportError`{.interpreted-text role="class"} instead of `ModuleNotFoundError`{.interpreted-text role="class"}. The warning can be suppressed by passing `exc_type=ImportError` to `pytest.importorskip`{.interpreted-text role="func"}. See `import-or-skip-import-error`{.interpreted-text role="ref"} for details. - [#​11728](https://togithub.com/pytest-dev/pytest/issues/11728): For `unittest`-based tests, exceptions during class cleanup (as raised by functions registered with `TestCase.addClassCleanup `{.interpreted-text role="meth"}) are now reported instead of silently failing. - [#​11777](https://togithub.com/pytest-dev/pytest/issues/11777): Text is no longer truncated in the `short test summary info` section when `-vv` is given. - [#​12112](https://togithub.com/pytest-dev/pytest/issues/12112): Improved namespace packages detection when `consider_namespace_packages`{.interpreted-text role="confval"} is enabled, covering more situations (like editable installs). - [#​9502](https://togithub.com/pytest-dev/pytest/issues/9502): Added `PYTEST_VERSION`{.interpreted-text role="envvar"} environment variable which is defined at the start of the pytest session and undefined afterwards. It contains the value of `pytest.__version__`, and among other things can be used to easily check if code is running from within a pytest run. ## Bug Fixes - [#​12065](https://togithub.com/pytest-dev/pytest/issues/12065): Fixed a regression in pytest 8.0.0 where test classes containing `setup_method` and tests using `@staticmethod` or `@classmethod` would crash with `AttributeError: 'NoneType' object has no attribute 'setup_method'`. Now the `request.instance `{.interpreted-text role="attr"} attribute of tests using `@staticmethod` and `@classmethod` is no longer `None`, but a fresh instance of the class, like in non-static methods. Previously it was `None`, and all fixtures of such tests would share a single `self`. - [#​12135](https://togithub.com/pytest-dev/pytest/issues/12135): Fixed issue where fixtures adding their finalizer multiple times to fixtures they request would cause unreliable and non-intuitive teardown ordering in some instances. - [#​12194](https://togithub.com/pytest-dev/pytest/issues/12194): Fixed a bug with `--importmode=importlib` and `--doctest-modules` where child modules did not appear as attributes in parent modules. - [#​1489](https://togithub.com/pytest-dev/pytest/issues/1489): Fixed some instances where teardown of higher-scoped fixtures was not happening in the reverse order they were initialized in. ## Trivial/Internal Changes - [#​12069](https://togithub.com/pytest-dev/pytest/issues/12069): `pluggy>=1.5.0` is now required. - [#​12167](https://togithub.com/pytest-dev/pytest/issues/12167): `cache `{.interpreted-text role="ref"}: create supporting files (`CACHEDIR.TAG`, `.gitignore`, etc.) in a temporary directory to provide atomic semantics. ### [`v8.1.2`](https://togithub.com/pytest-dev/pytest/releases/tag/8.1.2) [Compare Source](https://togithub.com/pytest-dev/pytest/compare/8.1.1...8.1.2) # pytest 8.1.2 (2024-04-26) ## Bug Fixes - [#​12114](https://togithub.com/pytest-dev/pytest/issues/12114): Fixed error in `pytest.approx`{.interpreted-text role="func"} when used with \[numpy]{.title-ref} arrays and comparing with other types.
pypa/virtualenv (virtualenv) ### [`v20.26.3`](https://togithub.com/pypa/virtualenv/releases/tag/20.26.3) [Compare Source](https://togithub.com/pypa/virtualenv/compare/20.26.2...20.26.3) #### What's Changed - release 20.26.2 by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/pypa/virtualenv/pull/2724](https://togithub.com/pypa/virtualenv/pull/2724) - Bump embeded wheels by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/pypa/virtualenv/pull/2741](https://togithub.com/pypa/virtualenv/pull/2741) **Full Changelog**: https://togithub.com/pypa/virtualenv/compare/20.26.2...20.26.3 ### [`v20.26.2`](https://togithub.com/pypa/virtualenv/compare/20.26.1...20.26.2) [Compare Source](https://togithub.com/pypa/virtualenv/compare/20.26.1...20.26.2) ### [`v20.26.1`](https://togithub.com/pypa/virtualenv/compare/20.26.0...20.26.1) [Compare Source](https://togithub.com/pypa/virtualenv/compare/20.26.0...20.26.1) ### [`v20.26.0`](https://togithub.com/pypa/virtualenv/releases/tag/20.26.0) [Compare Source](https://togithub.com/pypa/virtualenv/compare/20.25.3...20.26.0) ##### What's Changed - release 20.25.3 by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/pypa/virtualenv/pull/2704](https://togithub.com/pypa/virtualenv/pull/2704) - Fixed a case when template variable is WindowsPath by [@​NtWriteCode](https://togithub.com/NtWriteCode) in [https://togithub.com/pypa/virtualenv/pull/2707](https://togithub.com/pypa/virtualenv/pull/2707) - Allow builtin interpreter discovery to find specific Python versions given a general spec by [@​flying-sheep](https://togithub.com/flying-sheep) in [https://togithub.com/pypa/virtualenv/pull/2709](https://togithub.com/pypa/virtualenv/pull/2709) ##### New Contributors - [@​NtWriteCode](https://togithub.com/NtWriteCode) made their first contribution in [https://togithub.com/pypa/virtualenv/pull/2707](https://togithub.com/pypa/virtualenv/pull/2707) - [@​flying-sheep](https://togithub.com/flying-sheep) made their first contribution in [https://togithub.com/pypa/virtualenv/pull/2709](https://togithub.com/pypa/virtualenv/pull/2709) **Full Changelog**: https://togithub.com/pypa/virtualenv/compare/20.25.3...20.26.0 ### [`v20.25.3`](https://togithub.com/pypa/virtualenv/releases/tag/20.25.3) [Compare Source](https://togithub.com/pypa/virtualenv/compare/20.25.2...20.25.3) #### What's Changed - release 20.25.2 by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/pypa/virtualenv/pull/2703](https://togithub.com/pypa/virtualenv/pull/2703) - Fix for tests: Python 3.13.0a6 renamed pathmod to parser by [@​befeleme](https://togithub.com/befeleme) in [https://togithub.com/pypa/virtualenv/pull/2702](https://togithub.com/pypa/virtualenv/pull/2702) #### New Contributors - [@​befeleme](https://togithub.com/befeleme) made their first contribution in [https://togithub.com/pypa/virtualenv/pull/2702](https://togithub.com/pypa/virtualenv/pull/2702) **Full Changelog**: https://togithub.com/pypa/virtualenv/compare/20.25.2...20.25.3 ### [`v20.25.2`](https://togithub.com/pypa/virtualenv/releases/tag/20.25.2) [Compare Source](https://togithub.com/pypa/virtualenv/compare/20.25.1...20.25.2) #### What's Changed - release 20.25.1 by [@​gaborbernat](https://togithub.com/gaborbernat) in [https://togithub.com/pypa/virtualenv/pull/2692](https://togithub.com/pypa/virtualenv/pull/2692) - Fix windows utf8 encoding issue by [@​PzaThief](https://togithub.com/PzaThief) in [https://togithub.com/pypa/virtualenv/pull/2687](https://togithub.com/pypa/virtualenv/pull/2687) - Update changelog.rst by [@​Callek](https://togithub.com/Callek) in [https://togithub.com/pypa/virtualenv/pull/2701](https://togithub.com/pypa/virtualenv/pull/2701) - Fix indentation in activate.fish by [@​junzh0u](https://togithub.com/junzh0u) in [https://togithub.com/pypa/virtualenv/pull/2700](https://togithub.com/pypa/virtualenv/pull/2700) #### New Contributors - [@​PzaThief](https://togithub.com/PzaThief) made their first contribution in [https://togithub.com/pypa/virtualenv/pull/2687](https://togithub.com/pypa/virtualenv/pull/2687) - [@​Callek](https://togithub.com/Callek) made their first contribution in [https://togithub.com/pypa/virtualenv/pull/2701](https://togithub.com/pypa/virtualenv/pull/2701) - [@​junzh0u](https://togithub.com/junzh0u) made their first contribution in [https://togithub.com/pypa/virtualenv/pull/2700](https://togithub.com/pypa/virtualenv/pull/2700) **Full Changelog**: https://togithub.com/pypa/virtualenv/compare/20.25.1...20.25.2
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/googleapis/python-storage). --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 86a3ade30..054670d8b 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,4 +1,4 @@ pytest===7.4.4; python_version == '3.7' -pytest==8.1.1; python_version >= '3.8' +pytest==8.2.2; python_version >= '3.8' mock==5.1.0 backoff==2.2.1 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index b0e41fa84..5e3e93d93 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-pubsub==2.21.1 -google-cloud-storage==2.16.0 +google-cloud-pubsub==2.21.5 +google-cloud-storage==2.17.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' pandas==2.2.2; python_version >= '3.9' From a4b07b8b99812b8ce1192850f48782f0be7b6a9f Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 9 Jul 2024 19:49:48 +0200 Subject: [PATCH 274/509] chore(deps): update all dependencies (#1324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 5e3e93d93..c5b45a4a2 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.21.5 +google-cloud-pubsub==2.22.0 google-cloud-storage==2.17.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' From d5d3c68a6e5c6f8cefc59892c1ccceaf181ff32d Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:40:47 -0400 Subject: [PATCH 275/509] chore(python): use python 3.10 for docs build (#1322) * chore(python): use python 3.10 for docs build Source-Link: https://github.com/googleapis/synthtool/commit/9ae07858520bf035a3d5be569b5a65d960ee4392 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:52210e0e0559f5ea8c52be148b33504022e1faef4e95fbe4b32d68022af2fa7e * Use python 3.10 for docs --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 +-- .kokoro/docker/docs/Dockerfile | 21 +++++++------ .kokoro/docker/docs/requirements.txt | 40 +++++++++++++----------- .kokoro/requirements.txt | 46 ++++++++++++++-------------- noxfile.py | 5 ++- 5 files changed, 63 insertions(+), 53 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 91d742b5b..f30cb3775 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:d3de8a02819f65001effcbd3ea76ce97e9bcff035c7a89457f40f892c87c5b32 -# created: 2024-07-03T17:43:00.77142528Z + digest: sha256:52210e0e0559f5ea8c52be148b33504022e1faef4e95fbe4b32d68022af2fa7e +# created: 2024-07-08T19:25:35.862283192Z diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index a26ce6193..5205308b3 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from ubuntu:22.04 +from ubuntu:24.04 ENV DEBIAN_FRONTEND noninteractive @@ -40,7 +40,6 @@ RUN apt-get update \ libssl-dev \ libsqlite3-dev \ portaudio19-dev \ - python3-distutils \ redis-server \ software-properties-common \ ssh \ @@ -60,18 +59,22 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && rm -f /var/cache/apt/archives/*.deb -###################### Install python 3.9.13 -# Download python 3.9.13 -RUN wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz +###################### Install python 3.10.14 for docs/docfx session + +# Download python 3.10.14 +RUN wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz # Extract files -RUN tar -xvf Python-3.9.13.tgz +RUN tar -xvf Python-3.10.14.tgz -# Install python 3.9.13 -RUN ./Python-3.9.13/configure --enable-optimizations +# Install python 3.10.14 +RUN ./Python-3.10.14/configure --enable-optimizations RUN make altinstall +RUN python3.10 -m venv /venv +ENV PATH /venv/bin:$PATH + ###################### Install pip RUN wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \ && python3 /tmp/get-pip.py \ @@ -84,4 +87,4 @@ RUN python3 -m pip COPY requirements.txt /requirements.txt RUN python3 -m pip install --require-hashes -r requirements.txt -CMD ["python3.8"] +CMD ["python3.10"] diff --git a/.kokoro/docker/docs/requirements.txt b/.kokoro/docker/docs/requirements.txt index 0e5d70f20..7129c7715 100644 --- a/.kokoro/docker/docs/requirements.txt +++ b/.kokoro/docker/docs/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes requirements.in # -argcomplete==3.2.3 \ - --hash=sha256:bf7900329262e481be5a15f56f19736b376df6f82ed27576fa893652c5de6c23 \ - --hash=sha256:c12355e0494c76a2a7b73e3a59b09024ca0ba1e279fb9ed6c1b82d5b74b6a70c +argcomplete==3.4.0 \ + --hash=sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5 \ + --hash=sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f # via nox colorlog==6.8.2 \ --hash=sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44 \ @@ -16,23 +16,27 @@ distlib==0.3.8 \ --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ --hash=sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64 # via virtualenv -filelock==3.13.1 \ - --hash=sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e \ - --hash=sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c +filelock==3.15.4 \ + --hash=sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb \ + --hash=sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7 # via virtualenv -nox==2024.3.2 \ - --hash=sha256:e53514173ac0b98dd47585096a55572fe504fecede58ced708979184d05440be \ - --hash=sha256:f521ae08a15adbf5e11f16cb34e8d0e6ea521e0b92868f684e91677deb974553 +nox==2024.4.15 \ + --hash=sha256:6492236efa15a460ecb98e7b67562a28b70da006ab0be164e8821177577c0565 \ + --hash=sha256:ecf6700199cdfa9e5ea0a41ff5e6ef4641d09508eda6edb89d9987864115817f # via -r requirements.in -packaging==24.0 \ - --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ - --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via nox -platformdirs==4.2.0 \ - --hash=sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 \ - --hash=sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768 +platformdirs==4.2.2 \ + --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ + --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 # via virtualenv -virtualenv==20.25.1 \ - --hash=sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a \ - --hash=sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197 +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via nox +virtualenv==20.26.3 \ + --hash=sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a \ + --hash=sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589 # via nox diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 35ece0e4d..9622baf0b 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.3.3 \ --hash=sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945 \ --hash=sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105 # via google-auth -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ @@ -371,23 +371,23 @@ more-itertools==10.3.0 \ # via # jaraco-classes # jaraco-functools -nh3==0.2.17 \ - --hash=sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a \ - --hash=sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911 \ - --hash=sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb \ - --hash=sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a \ - --hash=sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc \ - --hash=sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028 \ - --hash=sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9 \ - --hash=sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3 \ - --hash=sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351 \ - --hash=sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10 \ - --hash=sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71 \ - --hash=sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f \ - --hash=sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b \ - --hash=sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a \ - --hash=sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062 \ - --hash=sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a +nh3==0.2.18 \ + --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \ + --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \ + --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \ + --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \ + --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \ + --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \ + --hash=sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200 \ + --hash=sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189 \ + --hash=sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f \ + --hash=sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811 \ + --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 \ + --hash=sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4 \ + --hash=sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be \ + --hash=sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50 \ + --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \ + --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe # via readme-renderer nox==2024.4.15 \ --hash=sha256:6492236efa15a460ecb98e7b67562a28b70da006ab0be164e8821177577c0565 \ @@ -460,9 +460,9 @@ python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via gcp-releasetool -readme-renderer==43.0 \ - --hash=sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311 \ - --hash=sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9 +readme-renderer==44.0 \ + --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \ + --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1 # via twine requests==2.32.3 \ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ diff --git a/noxfile.py b/noxfile.py index 319ae207e..84b8ed309 100644 --- a/noxfile.py +++ b/noxfile.py @@ -36,6 +36,9 @@ CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() +# Error if a python version is missing +nox.options.error_on_missing_interpreters = True + @nox.session(python=DEFAULT_PYTHON_VERSION) def lint(session): @@ -227,7 +230,7 @@ def cover(session): session.run("coverage", "erase") -@nox.session(python="3.9") +@nox.session(python="3.10") def docs(session): """Build the docs for this library.""" From 3d29c6f8bc3fb4ab02ee2262b094f406326b98e8 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:18:45 -0700 Subject: [PATCH 276/509] chore(main): release 2.18.0 (#1291) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cojenco --- CHANGELOG.md | 13 +++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a7fefeb0..16895e045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.18.0](https://github.com/googleapis/python-storage/compare/v2.17.0...v2.18.0) (2024-07-09) + + +### Features + +* Add OpenTelemetry Tracing support as a preview feature ([#1288](https://github.com/googleapis/python-storage/issues/1288)) ([c2ab0e0](https://github.com/googleapis/python-storage/commit/c2ab0e035b179a919b27c7f50318472f14656e00)) + + +### Bug Fixes + +* Allow Protobuf 5.x ([#1317](https://github.com/googleapis/python-storage/issues/1317)) ([152b249](https://github.com/googleapis/python-storage/commit/152b249472a09342777237d47b6c09f99c2d28e6)) +* Correct notification error message ([#1290](https://github.com/googleapis/python-storage/issues/1290)) ([1cb977d](https://github.com/googleapis/python-storage/commit/1cb977daa2d97c255a382ce81f56a43168b0637d)), closes [#1289](https://github.com/googleapis/python-storage/issues/1289) + ## [2.17.0](https://github.com/googleapis/python-storage/compare/v2.16.0...v2.17.0) (2024-05-22) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 422b383cc..a613e5ea2 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.17.0" +__version__ = "2.18.0" From bf4d0e0a2ef1d608d679c22b13d8f5d90b39c7b2 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 5 Aug 2024 15:22:42 -0700 Subject: [PATCH 277/509] Fix: Properly escape URL construction for XML MPU API (#1333) --- google/cloud/storage/transfer_manager.py | 3 +- tests/system/test_transfer_manager.py | 57 ++++++++++++++++++++++++ tests/unit/test_transfer_manager.py | 51 +++++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 8190f844d..1b48cd9cf 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -30,6 +30,7 @@ from google.cloud.storage import Client from google.cloud.storage import Blob from google.cloud.storage.blob import _get_host_name +from google.cloud.storage.blob import _quote from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage._helpers import _api_core_retry_to_resumable_media_retry from google.cloud.storage.retry import DEFAULT_RETRY @@ -1083,7 +1084,7 @@ def upload_chunks_concurrently( hostname = _get_host_name(client._connection) url = "{hostname}/{bucket}/{blob}".format( - hostname=hostname, bucket=bucket.name, blob=blob.name + hostname=hostname, bucket=bucket.name, blob=_quote(blob.name) ) base_headers, object_metadata, content_type = blob._get_upload_arguments( diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index 0deab356b..7a257e960 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -245,6 +245,8 @@ def test_upload_chunks_concurrently(shared_bucket, file_data, blobs_to_delete): chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + blobs_to_delete.append(upload_blob) + transfer_manager.upload_chunks_concurrently( filename, upload_blob, @@ -418,3 +420,58 @@ def test_upload_chunks_concurrently_with_kms( source_contents = sf.read() temp_contents = tmp.read() assert source_contents == temp_contents + + +def test_upload_chunks_concurrently_with_quoted_blob_names( + shared_bucket, file_data, blobs_to_delete +): + source_file = file_data["big"] + filename = source_file["path"] + blob_name = "../example_bucket/mpu_file" + upload_blob = shared_bucket.blob(blob_name) + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + blobs_to_delete.append(upload_blob) + + # If the blob name is not quoted/encoded at all, this will result in a 403. + transfer_manager.upload_chunks_concurrently( + filename, upload_blob, chunk_size=chunk_size, deadline=DEADLINE + ) + + with tempfile.NamedTemporaryFile() as tmp: + # If the blob name is not quoted correctly, this will result in a 404. + download_blob = shared_bucket.blob(blob_name) + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents + + # Test emoji names are not mangled. + blob_name = "\U0001f681" # Helicopter emoji + upload_blob = shared_bucket.blob(blob_name) + chunk_size = 5 * 1024 * 1024 # Minimum supported by XML MPU API + assert os.path.getsize(filename) > chunk_size # Won't make a good test otherwise + + blobs_to_delete.append(upload_blob) + + transfer_manager.upload_chunks_concurrently( + filename, + upload_blob, + chunk_size=chunk_size, + deadline=DEADLINE, + worker_type=transfer_manager.THREAD, + ) + + with tempfile.NamedTemporaryFile() as tmp: + download_blob = shared_bucket.blob(blob_name) + download_blob.download_to_file(tmp) + tmp.seek(0) + + with open(source_file["path"], "rb") as sf: + source_contents = sf.read() + temp_contents = tmp.read() + assert source_contents == temp_contents diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index aa42dd9ff..cee83ba54 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -794,6 +794,57 @@ def test_upload_chunks_concurrently(): part_mock.upload.assert_called_with(transport) +def test_upload_chunks_concurrently_quotes_urls(): + bucket = mock.Mock() + bucket.name = "bucket" + bucket.client = _PickleableMockClient(identify_as_client=True) + transport = bucket.client._http + bucket.user_project = None + + blob = Blob(b"../wrongbucket/blob", bucket) + blob.content_type = FAKE_CONTENT_TYPE + quoted_url = "https://example.com/bucket/..%2Fwrongbucket%2Fblob" + + FILENAME = "file_a.txt" + SIZE = 2048 + + container_mock = mock.Mock() + container_mock.upload_id = "abcd" + part_mock = mock.Mock() + ETAG = "efgh" + part_mock.etag = ETAG + container_cls_mock = mock.Mock(return_value=container_mock) + + with mock.patch("os.path.getsize", return_value=SIZE), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUContainer", new=container_cls_mock + ), mock.patch( + "google.cloud.storage.transfer_manager.XMLMPUPart", return_value=part_mock + ): + transfer_manager.upload_chunks_concurrently( + FILENAME, + blob, + chunk_size=SIZE // 2, + worker_type=transfer_manager.THREAD, + ) + + container_mock.initiate.assert_called_once_with( + transport=transport, content_type=blob.content_type + ) + container_mock.register_part.assert_any_call(1, ETAG) + container_mock.register_part.assert_any_call(2, ETAG) + container_mock.finalize.assert_called_once_with(bucket.client._http) + + assert container_mock._retry_strategy.max_sleep == 60.0 + assert container_mock._retry_strategy.max_cumulative_retry == 120.0 + assert container_mock._retry_strategy.max_retries is None + + container_cls_mock.assert_called_once_with( + quoted_url, FILENAME, headers=mock.ANY + ) + + part_mock.upload.assert_called_with(transport) + + def test_upload_chunks_concurrently_passes_concurrency_options(): bucket = mock.Mock() bucket.name = "bucket" From 5c935030751a24f1b5e7a29146f5ec4d5f2ed0ec Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:13:04 -0700 Subject: [PATCH 278/509] chore(main): release 2.18.1 (#1334) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16895e045..6c32942a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.18.1](https://github.com/googleapis/python-storage/compare/v2.18.0...v2.18.1) (2024-08-05) + + +### Bug Fixes + +* Properly escape URL construction for XML MPU API ([#1333](https://github.com/googleapis/python-storage/issues/1333)) ([bf4d0e0](https://github.com/googleapis/python-storage/commit/bf4d0e0a2ef1d608d679c22b13d8f5d90b39c7b2)) + ## [2.18.0](https://github.com/googleapis/python-storage/compare/v2.17.0...v2.18.0) (2024-07-09) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index a613e5ea2..fdae0c9bb 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.18.0" +__version__ = "2.18.1" From 0323647d768b3be834cfab53efb3c557a47d41c3 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 8 Aug 2024 13:52:48 -0700 Subject: [PATCH 279/509] Fix: Add regression test for range read retry issue and bump dependency to fix (#1338) --- setup.py | 2 +- tests/conformance/test_conformance.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3f80b2ffa..bcb839106 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ "google-auth >= 2.26.1, < 3.0dev", "google-api-core >= 2.15.0, <3.0.0dev", "google-cloud-core >= 2.3.0, < 3.0dev", - "google-resumable-media >= 2.6.0", + "google-resumable-media >= 2.7.2", "requests >= 2.18.0, < 3.0.0dev", "google-crc32c >= 1.0, < 2.0dev", ] diff --git a/tests/conformance/test_conformance.py b/tests/conformance/test_conformance.py index 4d16fc36f..45c0cb51e 100644 --- a/tests/conformance/test_conformance.py +++ b/tests/conformance/test_conformance.py @@ -115,6 +115,17 @@ def blob_download_to_filename_chunked(client, _preconditions, **resources): assert stored_contents == data +def blob_download_to_filename_range(client, _preconditions, **resources): + bucket = resources.get("bucket") + file, data = resources.get("file_data") + blob = client.bucket(bucket.name).blob(file.name) + with tempfile.NamedTemporaryFile() as temp_f: + blob.download_to_filename(temp_f.name, start=1024, end=512 * 1024) + with open(temp_f.name, "r") as file_obj: + stored_contents = file_obj.read() + assert stored_contents == data[1024 : 512 * 1024 + 1] + + def client_download_blob_to_file(client, _preconditions, **resources): bucket = resources.get("bucket") file, data = resources.get("file_data") @@ -748,6 +759,7 @@ def object_acl_clear(client, _preconditions, **resources): client_download_blob_to_file, blob_download_to_filename, blob_download_to_filename_chunked, + blob_download_to_filename_range, blob_download_as_bytes, blob_download_as_text, blobreader_read, @@ -756,6 +768,7 @@ def object_acl_clear(client, _preconditions, **resources): client_download_blob_to_file, blob_download_to_filename, blob_download_to_filename_chunked, + blob_download_to_filename_range, blob_download_as_bytes, blob_download_as_text, blobreader_read, From 85aa02fc88ddeb7f036957bd5fe96e07e7f56f14 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 14:55:07 -0700 Subject: [PATCH 280/509] chore(main): release 2.18.2 (#1339) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c32942a7..06c80ebae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.18.2](https://github.com/googleapis/python-storage/compare/v2.18.1...v2.18.2) (2024-08-08) + + +### Bug Fixes + +* Add regression test for range read retry issue and bump dependency to fix ([#1338](https://github.com/googleapis/python-storage/issues/1338)) ([0323647](https://github.com/googleapis/python-storage/commit/0323647d768b3be834cfab53efb3c557a47d41c3)) + ## [2.18.1](https://github.com/googleapis/python-storage/compare/v2.18.0...v2.18.1) (2024-08-05) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index fdae0c9bb..bbe5b63fe 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.18.1" +__version__ = "2.18.2" From 02a972d35fae6d05edfb26381f6a71e3b8f59d6d Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 24 Sep 2024 20:40:27 -0700 Subject: [PATCH 281/509] feat: add integration test for universe domain (#1346) --- .kokoro/build.sh | 8 +++++ .kokoro/presubmit/system-3.8.cfg | 6 ++++ owlbot.py | 11 ++++++- tests/system/_helpers.py | 4 +++ tests/system/conftest.py | 53 ++++++++++++++++++++++++++++++++ tests/system/test_client.py | 27 ++++++++++++++++ 6 files changed, 108 insertions(+), 1 deletion(-) diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 5ac9f8a51..fdc6d0271 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -34,6 +34,14 @@ export API_VERSION_OVERRIDE export DUAL_REGION_LOC_1 export DUAL_REGION_LOC_2 +# Setup universe domain testing needed environment variables. +export TEST_UNIVERSE_DOMAIN_CREDENTIAL=$(realpath ${KOKORO_GFILE_DIR}/secret_manager/client-library-test-universe-domain-credential) +export TEST_UNIVERSE_DOMAIN=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-domain) +export TEST_UNIVERSE_PROJECT_ID=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-project-id) +export TEST_UNIVERSE_LOCATION=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-storage-location) + + + # Debug: show build environment env | grep KOKORO diff --git a/.kokoro/presubmit/system-3.8.cfg b/.kokoro/presubmit/system-3.8.cfg index f4bcee3db..6d3603eed 100644 --- a/.kokoro/presubmit/system-3.8.cfg +++ b/.kokoro/presubmit/system-3.8.cfg @@ -4,4 +4,10 @@ env_vars: { key: "NOX_SESSION" value: "system-3.8" +} + +# Credentials needed to test universe domain. +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "client-library-test-universe-domain-credential" } \ No newline at end of file diff --git a/owlbot.py b/owlbot.py index a06ae8cc4..61871e3e4 100644 --- a/owlbot.py +++ b/owlbot.py @@ -46,6 +46,7 @@ "noxfile.py", "CONTRIBUTING.rst", "README.rst", + ".kokoro/presubmit/system-3.8.cfg", ".kokoro/samples/python3.6", # remove python 3.6 support ".github/blunderbuss.yml", # blunderbuss assignment to python squad ".github/workflows", # exclude gh actions as credentials are needed for tests @@ -66,7 +67,15 @@ # Export dual region locations export DUAL_REGION_LOC_1 -export DUAL_REGION_LOC_2""") +export DUAL_REGION_LOC_2 + +# Setup universe domain testing needed environment variables. +export TEST_UNIVERSE_DOMAIN_CREDENTIAL=$(realpath ${KOKORO_GFILE_DIR}/secret_manager/client-library-test-universe-domain-credential) +export TEST_UNIVERSE_DOMAIN=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-domain) +export TEST_UNIVERSE_PROJECT_ID=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-project-id) +export TEST_UNIVERSE_LOCATION=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-storage-location) + +""") s.replace( ".coveragerc", diff --git a/tests/system/_helpers.py b/tests/system/_helpers.py index a044c4ca8..7274610a8 100644 --- a/tests/system/_helpers.py +++ b/tests/system/_helpers.py @@ -31,6 +31,10 @@ user_project = os.environ.get("GOOGLE_CLOUD_TESTS_USER_PROJECT") testing_mtls = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true" +test_universe_domain = os.getenv("TEST_UNIVERSE_DOMAIN") +test_universe_project_id = os.getenv("TEST_UNIVERSE_PROJECT_ID") +test_universe_location = os.getenv("TEST_UNIVERSE_LOCATION") +test_universe_domain_credential = os.getenv("TEST_UNIVERSE_DOMAIN_CREDENTIAL") signing_blob_content = b"This time for sure, Rocky!" is_api_endpoint_override = ( _get_default_storage_base_url() != "https://storage.googleapis.com" diff --git a/tests/system/conftest.py b/tests/system/conftest.py index a97b98648..4ec56176d 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -331,3 +331,56 @@ def keyring(storage_client, kms_bucket, kms_client): except exceptions.NotFound: key = {"purpose": purpose} kms_client.create_crypto_key(keyring_path, key_name, key) + + +@pytest.fixture(scope="function") +def test_universe_domain(): + if _helpers.test_universe_domain is None: + pytest.skip("TEST_UNIVERSE_DOMAIN not set in environment.") + return _helpers.test_universe_domain + + +@pytest.fixture(scope="function") +def test_universe_project_id(): + if _helpers.test_universe_project_id is None: + pytest.skip("TEST_UNIVERSE_PROJECT_ID not set in environment.") + return _helpers.test_universe_project_id + + +@pytest.fixture(scope="function") +def test_universe_location(): + if _helpers.test_universe_location is None: + pytest.skip("TEST_UNIVERSE_LOCATION not set in environment.") + return _helpers.test_universe_location + + +@pytest.fixture(scope="function") +def test_universe_domain_credential(): + if _helpers.test_universe_domain_credential is None: + pytest.skip("TEST_UNIVERSE_DOMAIN_CREDENTIAL not set in environment.") + return _helpers.test_universe_domain_credential + + +@pytest.fixture(scope="function") +def universe_domain_credential(test_universe_domain_credential): + from google.oauth2 import service_account + + return service_account.Credentials.from_service_account_file( + test_universe_domain_credential + ) + + +@pytest.fixture(scope="function") +def universe_domain_client( + test_universe_domain, test_universe_project_id, universe_domain_credential +): + from google.cloud.storage import Client + + client_options = {"universe_domain": test_universe_domain} + ud_storage_client = Client( + project=test_universe_project_id, + credentials=universe_domain_credential, + client_options=client_options, + ) + with contextlib.closing(ud_storage_client): + yield ud_storage_client diff --git a/tests/system/test_client.py b/tests/system/test_client.py index 70f341851..baf4556b7 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -184,3 +184,30 @@ def test_download_blob_to_file_w_etag( if_etag_match=blob.etag, ) assert buffer.getvalue() == payload + + +def test_client_universe_domain( + universe_domain_client, + test_universe_location, + buckets_to_delete, + blobs_to_delete, +): + bucket_name = _helpers.unique_name("gcp-systest-ud") + ud_bucket = universe_domain_client.create_bucket( + bucket_name, location=test_universe_location + ) + buckets_to_delete.append(ud_bucket) + + blob_name = _helpers.unique_name("gcp-systest-ud") + blob = ud_bucket.blob(blob_name) + payload = b"The quick brown fox jumps over the lazy dog" + blob.upload_from_string(payload) + blobs_to_delete.append(blob) + + with tempfile.NamedTemporaryFile() as temp_f: + with open(temp_f.name, "wb") as file_obj: + universe_domain_client.download_blob_to_file(blob, file_obj) + with open(temp_f.name, "rb") as file_obj: + stored_contents = file_obj.read() + + assert stored_contents == payload From e3cfc4786209c77e3c879c9ff2978f4884a0d677 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 25 Sep 2024 17:13:50 -0700 Subject: [PATCH 282/509] chore: update secret manager in kokoro (#1350) --- .kokoro/continuous/common.cfg | 6 ++++++ .kokoro/release/common.cfg | 2 +- owlbot.py | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.kokoro/continuous/common.cfg b/.kokoro/continuous/common.cfg index 51201dfab..fd7c8cc69 100644 --- a/.kokoro/continuous/common.cfg +++ b/.kokoro/continuous/common.cfg @@ -25,3 +25,9 @@ env_vars: { key: "TRAMPOLINE_BUILD_FILE" value: "github/python-storage/.kokoro/build.sh" } + +# Credentials needed to test universe domain. +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "client-library-test-universe-domain-credential" +} diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg index a11679f43..3464807cf 100644 --- a/.kokoro/release/common.cfg +++ b/.kokoro/release/common.cfg @@ -36,7 +36,7 @@ before_action { # Tokens needed to report release status back to GitHub env_vars: { key: "SECRET_MANAGER_KEYS" - value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem" + value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem, client-library-test-universe-domain-credential" } # Store the packages we uploaded to PyPI. That way, we have a record of exactly diff --git a/owlbot.py b/owlbot.py index 61871e3e4..93e8ceb1c 100644 --- a/owlbot.py +++ b/owlbot.py @@ -46,6 +46,7 @@ "noxfile.py", "CONTRIBUTING.rst", "README.rst", + ".kokoro/continuous/common.cfg", ".kokoro/presubmit/system-3.8.cfg", ".kokoro/samples/python3.6", # remove python 3.6 support ".github/blunderbuss.yml", # blunderbuss assignment to python squad @@ -83,6 +84,12 @@ """omit = .nox/*""") +s.replace( + ".kokoro/release/common.cfg", + 'value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem"', + 'value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem, client-library-test-universe-domain-credential"' +) + python.py_samples(skip_readmes=True) s.shell.run(["nox", "-s", "blacken"], hide_output=False) From 76316438f581b21bc229b13c5f1fb545f158dd77 Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 27 Sep 2024 10:05:47 -0700 Subject: [PATCH 283/509] chore: update secret manager in kokoro (#1352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update secret manager in kokoro * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .kokoro/continuous/common.cfg | 6 ------ .kokoro/continuous/continuous.cfg | 8 +++++++- owlbot.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.kokoro/continuous/common.cfg b/.kokoro/continuous/common.cfg index fd7c8cc69..51201dfab 100644 --- a/.kokoro/continuous/common.cfg +++ b/.kokoro/continuous/common.cfg @@ -25,9 +25,3 @@ env_vars: { key: "TRAMPOLINE_BUILD_FILE" value: "github/python-storage/.kokoro/build.sh" } - -# Credentials needed to test universe domain. -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "client-library-test-universe-domain-credential" -} diff --git a/.kokoro/continuous/continuous.cfg b/.kokoro/continuous/continuous.cfg index 8f43917d9..0cfe6b6e2 100644 --- a/.kokoro/continuous/continuous.cfg +++ b/.kokoro/continuous/continuous.cfg @@ -1 +1,7 @@ -# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file +# Format: //devtools/kokoro/config/proto/build.proto + +# Credentials needed to test universe domain. +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "client-library-test-universe-domain-credential" +} diff --git a/owlbot.py b/owlbot.py index 93e8ceb1c..8bd9de751 100644 --- a/owlbot.py +++ b/owlbot.py @@ -46,7 +46,7 @@ "noxfile.py", "CONTRIBUTING.rst", "README.rst", - ".kokoro/continuous/common.cfg", + ".kokoro/continuous/continuous.cfg", ".kokoro/presubmit/system-3.8.cfg", ".kokoro/samples/python3.6", # remove python 3.6 support ".github/blunderbuss.yml", # blunderbuss assignment to python squad From bebd97afaf0365693e97f88521e90dc60776e37f Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 27 Sep 2024 16:40:50 -0700 Subject: [PATCH 284/509] tests: unflake ud system test to only run in prod and hmac sample test (#1353) * test: test universe domain client only in prod * unflake hmac snippet test --- samples/snippets/hmac_samples_test.py | 5 ++++- tests/system/test_client.py | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/samples/snippets/hmac_samples_test.py b/samples/snippets/hmac_samples_test.py index 60eba2401..988b40305 100644 --- a/samples/snippets/hmac_samples_test.py +++ b/samples/snippets/hmac_samples_test.py @@ -64,7 +64,10 @@ def new_hmac_key(): if not hmac_key.state == "INACTIVE": hmac_key.state = "INACTIVE" hmac_key.update() - hmac_key.delete() + try: + hmac_key.delete() + except google.api_core.exceptions.BadRequest: + pass def test_list_keys(capsys, new_hmac_key): diff --git a/tests/system/test_client.py b/tests/system/test_client.py index baf4556b7..c1b3858f2 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -186,6 +186,10 @@ def test_download_blob_to_file_w_etag( assert buffer.getvalue() == payload +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Credentials not yet supported in preprod testing.", +) def test_client_universe_domain( universe_domain_client, test_universe_location, From 1963de91f1e0e0fa331a59906c232738c8ebeaf3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 18:24:10 -0700 Subject: [PATCH 285/509] build(python): release script update (#1345) Source-Link: https://github.com/googleapis/synthtool/commit/71a72973dddbc66ea64073b53eda49f0d22e0942 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:e8dcfd7cbfd8beac3a3ff8d3f3185287ea0625d859168cc80faccfc9a7a00455 Co-authored-by: Owl Bot Co-authored-by: cojenco --- .github/.OwlBot.lock.yaml | 4 ++-- .kokoro/docker/docs/Dockerfile | 9 ++++----- .kokoro/publish-docs.sh | 20 ++++++++++---------- .kokoro/release.sh | 2 +- .kokoro/release/common.cfg | 2 +- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index f30cb3775..597e0c326 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:52210e0e0559f5ea8c52be148b33504022e1faef4e95fbe4b32d68022af2fa7e -# created: 2024-07-08T19:25:35.862283192Z + digest: sha256:e8dcfd7cbfd8beac3a3ff8d3f3185287ea0625d859168cc80faccfc9a7a00455 +# created: 2024-09-16T21:04:09.091105552Z diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index 5205308b3..e5410e296 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -72,19 +72,18 @@ RUN tar -xvf Python-3.10.14.tgz RUN ./Python-3.10.14/configure --enable-optimizations RUN make altinstall -RUN python3.10 -m venv /venv -ENV PATH /venv/bin:$PATH +ENV PATH /usr/local/bin/python3.10:$PATH ###################### Install pip RUN wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \ - && python3 /tmp/get-pip.py \ + && python3.10 /tmp/get-pip.py \ && rm /tmp/get-pip.py # Test pip -RUN python3 -m pip +RUN python3.10 -m pip # Install build requirements COPY requirements.txt /requirements.txt -RUN python3 -m pip install --require-hashes -r requirements.txt +RUN python3.10 -m pip install --require-hashes -r requirements.txt CMD ["python3.10"] diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh index 38f083f05..233205d58 100755 --- a/.kokoro/publish-docs.sh +++ b/.kokoro/publish-docs.sh @@ -21,18 +21,18 @@ export PYTHONUNBUFFERED=1 export PATH="${HOME}/.local/bin:${PATH}" # Install nox -python3 -m pip install --require-hashes -r .kokoro/requirements.txt -python3 -m nox --version +python3.10 -m pip install --require-hashes -r .kokoro/requirements.txt +python3.10 -m nox --version # build docs nox -s docs # create metadata -python3 -m docuploader create-metadata \ +python3.10 -m docuploader create-metadata \ --name=$(jq --raw-output '.name // empty' .repo-metadata.json) \ - --version=$(python3 setup.py --version) \ + --version=$(python3.10 setup.py --version) \ --language=$(jq --raw-output '.language // empty' .repo-metadata.json) \ - --distribution-name=$(python3 setup.py --name) \ + --distribution-name=$(python3.10 setup.py --name) \ --product-page=$(jq --raw-output '.product_documentation // empty' .repo-metadata.json) \ --github-repository=$(jq --raw-output '.repo // empty' .repo-metadata.json) \ --issue-tracker=$(jq --raw-output '.issue_tracker // empty' .repo-metadata.json) @@ -40,18 +40,18 @@ python3 -m docuploader create-metadata \ cat docs.metadata # upload docs -python3 -m docuploader upload docs/_build/html --metadata-file docs.metadata --staging-bucket "${STAGING_BUCKET}" +python3.10 -m docuploader upload docs/_build/html --metadata-file docs.metadata --staging-bucket "${STAGING_BUCKET}" # docfx yaml files nox -s docfx # create metadata. -python3 -m docuploader create-metadata \ +python3.10 -m docuploader create-metadata \ --name=$(jq --raw-output '.name // empty' .repo-metadata.json) \ - --version=$(python3 setup.py --version) \ + --version=$(python3.10 setup.py --version) \ --language=$(jq --raw-output '.language // empty' .repo-metadata.json) \ - --distribution-name=$(python3 setup.py --name) \ + --distribution-name=$(python3.10 setup.py --name) \ --product-page=$(jq --raw-output '.product_documentation // empty' .repo-metadata.json) \ --github-repository=$(jq --raw-output '.repo // empty' .repo-metadata.json) \ --issue-tracker=$(jq --raw-output '.issue_tracker // empty' .repo-metadata.json) @@ -59,4 +59,4 @@ python3 -m docuploader create-metadata \ cat docs.metadata # upload docs -python3 -m docuploader upload docs/_build/html/docfx_yaml --metadata-file docs.metadata --destination-prefix docfx --staging-bucket "${V2_STAGING_BUCKET}" +python3.10 -m docuploader upload docs/_build/html/docfx_yaml --metadata-file docs.metadata --destination-prefix docfx --staging-bucket "${V2_STAGING_BUCKET}" diff --git a/.kokoro/release.sh b/.kokoro/release.sh index c5fc555e1..a15b26b59 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -23,7 +23,7 @@ python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source / export PYTHONUNBUFFERED=1 # Move into the package, build the distribution and upload. -TWINE_PASSWORD=$(cat "${KOKORO_KEYSTORE_DIR}/73713_google-cloud-pypi-token-keystore-1") +TWINE_PASSWORD=$(cat "${KOKORO_KEYSTORE_DIR}/73713_google-cloud-pypi-token-keystore-2") cd github/python-storage python3 setup.py sdist bdist_wheel twine upload --username __token__ --password "${TWINE_PASSWORD}" dist/* diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg index 3464807cf..17918dc86 100644 --- a/.kokoro/release/common.cfg +++ b/.kokoro/release/common.cfg @@ -28,7 +28,7 @@ before_action { fetch_keystore { keystore_resource { keystore_config_id: 73713 - keyname: "google-cloud-pypi-token-keystore-1" + keyname: "google-cloud-pypi-token-keystore-2" } } } From 8edbec1b1d6e3165a196d3ff082fb65a2b697bd5 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 30 Sep 2024 18:13:30 +0200 Subject: [PATCH 286/509] chore(deps): update all dependencies (#1329) Co-authored-by: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Co-authored-by: cojenco --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 054670d8b..68fb21c1c 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,4 +1,4 @@ pytest===7.4.4; python_version == '3.7' -pytest==8.2.2; python_version >= '3.8' +pytest==8.3.2; python_version >= '3.8' mock==5.1.0 backoff==2.2.1 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index c5b45a4a2..54f6f7806 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-pubsub==2.22.0 -google-cloud-storage==2.17.0 +google-cloud-pubsub==2.23.0 +google-cloud-storage==2.18.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' pandas==2.2.2; python_version >= '3.9' From cea20e2362b463746344524eb70416044fe3b902 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 1 Oct 2024 01:59:47 +0200 Subject: [PATCH 287/509] chore(deps): update all dependencies (#1354) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- samples/snippets/requirements-test.txt | 2 +- samples/snippets/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 68fb21c1c..a1dda582f 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,4 +1,4 @@ pytest===7.4.4; python_version == '3.7' -pytest==8.3.2; python_version >= '3.8' +pytest==8.3.3; python_version >= '3.8' mock==5.1.0 backoff==2.2.1 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 54f6f7806..4eb727236 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-pubsub==2.23.0 -google-cloud-storage==2.18.0 +google-cloud-pubsub==2.25.1 +google-cloud-storage==2.18.2 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' -pandas==2.2.2; python_version >= '3.9' +pandas==2.2.3; python_version >= '3.9' From 8ec02c0e656a4e6786f256798f4b93b95b50acec Mon Sep 17 00:00:00 2001 From: cojenco Date: Fri, 4 Oct 2024 11:26:21 -0700 Subject: [PATCH 288/509] fix: allow signed post policy v4 with service account and token (#1356) --- google/cloud/storage/client.py | 7 +++-- tests/system/test__signing.py | 49 ++++++++++++++++++++++++++++++++++ tests/unit/test_client.py | 44 ++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index b21ef7cef..bc2d1147e 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1724,13 +1724,16 @@ def generate_signed_post_policy_v4( ) credentials = self._credentials if credentials is None else credentials - ensure_signed_credentials(credentials) + client_email = service_account_email + if not access_token or not service_account_email: + ensure_signed_credentials(credentials) + client_email = credentials.signer_email # prepare policy conditions and fields timestamp, datestamp = get_v4_now_dtstamps() x_goog_credential = "{email}/{datestamp}/auto/storage/goog4_request".format( - email=credentials.signer_email, datestamp=datestamp + email=client_email, datestamp=datestamp ) required_conditions = [ {"bucket": bucket_name}, diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index 94930739e..8bcc46abc 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -415,6 +415,55 @@ def test_generate_signed_post_policy_v4( assert blob.download_as_bytes() == payload +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Test does not yet support endpoint override", +) +def test_generate_signed_post_policy_v4_access_token_sa_email( + storage_client, signing_bucket, blobs_to_delete, service_account, no_mtls +): + client = iam_credentials_v1.IAMCredentialsClient() + service_account_email = service_account.service_account_email + name = path_template.expand( + "projects/{project}/serviceAccounts/{service_account}", + project="-", + service_account=service_account_email, + ) + scope = [ + "https://www.googleapis.com/auth/devstorage.read_write", + "https://www.googleapis.com/auth/iam", + ] + response = client.generate_access_token(name=name, scope=scope) + + now = _NOW(_UTC).replace(tzinfo=None) + blob_name = "post_policy_obj_email2.txt" + payload = b"DEADBEEF" + with open(blob_name, "wb") as f: + f.write(payload) + policy = storage_client.generate_signed_post_policy_v4( + signing_bucket.name, + blob_name, + conditions=[ + {"bucket": signing_bucket.name}, + ["starts-with", "$Content-Type", "text/pla"], + ], + expiration=now + datetime.timedelta(hours=1), + fields={"content-type": "text/plain"}, + service_account_email=service_account_email, + access_token=response.access_token, + ) + with open(blob_name, "r") as f: + files = {"file": (blob_name, f)} + response = requests.post(policy["url"], data=policy["fields"], files=files) + + os.remove(blob_name) + assert response.status_code == 204 + + blob = signing_bucket.get_blob(blob_name) + blobs_to_delete.append(blob) + assert blob.download_as_bytes() == payload + + def test_generate_signed_post_policy_v4_invalid_field( storage_client, buckets_to_delete, blobs_to_delete, service_account, no_mtls ): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index b664e701d..5eb339acb 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -2849,6 +2849,50 @@ def test_get_signed_policy_v4_with_access_token(self): self.assertEqual(fields["x-goog-signature"], EXPECTED_SIGN) self.assertEqual(fields["policy"], EXPECTED_POLICY) + def test_get_signed_policy_v4_with_access_token_sa_email(self): + import datetime + + BUCKET_NAME = "bucket-name" + BLOB_NAME = "object-name" + EXPECTED_SIGN = "0c4003044105" + EXPECTED_POLICY = "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJidWNrZXQtbmFtZSJ9LHsiYWNsIjoicHJpdmF0ZSJ9LFsic3RhcnRzLXdpdGgiLCIkQ29udGVudC1UeXBlIiwidGV4dC9wbGFpbiJdLHsiYnVja2V0IjoiYnVja2V0LW5hbWUifSx7ImtleSI6Im9iamVjdC1uYW1lIn0seyJ4LWdvb2ctZGF0ZSI6IjIwMjAwMzEyVDExNDcxNloifSx7IngtZ29vZy1jcmVkZW50aWFsIjoidGVzdEBtYWlsLmNvbS8yMDIwMDMxMi9hdXRvL3N0b3JhZ2UvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIwLTAzLTI2VDAwOjAwOjEwWiJ9" + + project = "PROJECT" + credentials = _make_credentials(project=project) + client = self._make_one(credentials=credentials) + + dtstamps_patch, now_patch, expire_secs_patch = _time_functions_patches() + with dtstamps_patch, now_patch, expire_secs_patch: + with mock.patch( + "google.cloud.storage.client._sign_message", return_value=b"DEADBEEF" + ): + policy = client.generate_signed_post_policy_v4( + BUCKET_NAME, + BLOB_NAME, + expiration=datetime.datetime(2020, 3, 12), + conditions=[ + {"bucket": BUCKET_NAME}, + {"acl": "private"}, + ["starts-with", "$Content-Type", "text/plain"], + ], + service_account_email="test@mail.com", + access_token="token", + ) + self.assertEqual( + policy["url"], "https://storage.googleapis.com/" + BUCKET_NAME + "/" + ) + fields = policy["fields"] + + self.assertEqual(fields["key"], BLOB_NAME) + self.assertEqual(fields["x-goog-algorithm"], "GOOG4-RSA-SHA256") + self.assertEqual(fields["x-goog-date"], "20200312T114716Z") + self.assertEqual( + fields["x-goog-credential"], + "test@mail.com/20200312/auto/storage/goog4_request", + ) + self.assertEqual(fields["x-goog-signature"], EXPECTED_SIGN) + self.assertEqual(fields["policy"], EXPECTED_POLICY) + class Test__item_to_bucket(unittest.TestCase): def _call_fut(self, iterator, item): From 42392ef8e38527ce4e50454cdd357425b3f57c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Harabie=C5=84?= Date: Wed, 9 Oct 2024 18:53:12 +0200 Subject: [PATCH 289/509] fix: do not spam the log with checksum related INFO messages when downloading using transfer_manager (#1357) * fix: do not spam the log with checksum related INFO messages when downloading using transfer_manager `download_chunks_concurrently` function does not allow to set `checksum` field in `download_kwargs`. It also does not set it on its own so it takes the default value of `"md5"` (see `Blob._prep_and_do_download`). Because ranged downloads do not return checksums it results in a lot of INFO messages (tens/hundreds): ``` INFO google.resumable_media._helpers - No MD5 checksum was returned from the service while downloading ... (which happens for composite objects), so client-side content integrity checking is not being performed. ``` To fix it set the `checksum` field to `None` which means no checksum checking for individual chunks. Note that `transfer_manager` has its own checksum checking logic (enabled by `crc32c_checksum` argument) * fix tests --- google/cloud/storage/transfer_manager.py | 2 ++ tests/unit/test_transfer_manager.py | 7 +------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 1b48cd9cf..15325df56 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -885,6 +885,8 @@ def download_chunks_concurrently( "'checksum' is in download_kwargs, but is not supported because sliced downloads have a different checksum mechanism from regular downloads. Use the 'crc32c_checksum' argument on download_chunks_concurrently instead." ) + download_kwargs = download_kwargs.copy() + download_kwargs["checksum"] = None download_kwargs["command"] = "tm.download_sharded" # We must know the size and the generation of the blob. diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index cee83ba54..09969b5eb 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -606,6 +606,7 @@ def test_download_chunks_concurrently(): expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() expected_download_kwargs["command"] = "tm.download_sharded" + expected_download_kwargs["checksum"] = None with mock.patch("google.cloud.storage.transfer_manager.open", mock.mock_open()): result = transfer_manager.download_chunks_concurrently( @@ -636,9 +637,6 @@ def test_download_chunks_concurrently_with_crc32c(): blob_mock.size = len(BLOB_CONTENTS) blob_mock.crc32c = "eOVVVw==" - expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() - expected_download_kwargs["command"] = "tm.download_sharded" - def write_to_file(f, *args, **kwargs): f.write(BLOB_CHUNK) @@ -664,9 +662,6 @@ def test_download_chunks_concurrently_with_crc32c_failure(): blob_mock.size = len(BLOB_CONTENTS) blob_mock.crc32c = "invalid" - expected_download_kwargs = EXPECTED_DOWNLOAD_KWARGS.copy() - expected_download_kwargs["command"] = "tm.download_sharded" - def write_to_file(f, *args, **kwargs): f.write(BLOB_CHUNK) From ab94efda83f68c974ec91d6b869b09047501031a Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Tue, 29 Oct 2024 12:40:32 -0700 Subject: [PATCH 290/509] Feat: Add restore_bucket and handling for soft-deleted buckets (#1365) --- google/cloud/storage/_helpers.py | 3 + google/cloud/storage/bucket.py | 66 +++++++++++++++- google/cloud/storage/client.py | 131 ++++++++++++++++++++++++++++--- tests/system/test_client.py | 44 +++++++++++ tests/unit/test_bucket.py | 69 +++++++++++++++- tests/unit/test_client.py | 117 ++++++++++++++++++++++++++- 6 files changed, 412 insertions(+), 18 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index b90bf4eb2..3793a95f2 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -293,6 +293,9 @@ def reload( ) if soft_deleted is not None: query_params["softDeleted"] = soft_deleted + # Soft delete reload requires a generation, even for targets + # that don't include them in default query params (buckets). + query_params["generation"] = self.generation headers = self._encryption_headers() _add_etag_match_headers( headers, if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index ad1d0de5d..7cea15f4e 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -626,6 +626,10 @@ class Bucket(_PropertyMixin): :type user_project: str :param user_project: (Optional) the project ID to be billed for API requests made via this instance. + + :type generation: int + :param generation: (Optional) If present, selects a specific revision of + this bucket. """ _MAX_OBJECTS_FOR_ITERATION = 256 @@ -659,7 +663,7 @@ class Bucket(_PropertyMixin): ) """Allowed values for :attr:`location_type`.""" - def __init__(self, client, name=None, user_project=None): + def __init__(self, client, name=None, user_project=None, generation=None): """ property :attr:`name` Get the bucket's name. @@ -672,6 +676,9 @@ def __init__(self, client, name=None, user_project=None): self._label_removals = set() self._user_project = user_project + if generation is not None: + self._properties["generation"] = generation + def __repr__(self): return f"" @@ -726,6 +733,50 @@ def user_project(self): """ return self._user_project + @property + def generation(self): + """Retrieve the generation for the bucket. + + :rtype: int or ``NoneType`` + :returns: The generation of the bucket or ``None`` if the bucket's + resource has not been loaded from the server. + """ + generation = self._properties.get("generation") + if generation is not None: + return int(generation) + + @property + def soft_delete_time(self): + """If this bucket has been soft-deleted, returns the time at which it became soft-deleted. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: + (readonly) The time that the bucket became soft-deleted. + Note this property is only set for soft-deleted buckets. + """ + soft_delete_time = self._properties.get("softDeleteTime") + if soft_delete_time is not None: + return _rfc3339_nanos_to_datetime(soft_delete_time) + + @property + def hard_delete_time(self): + """If this bucket has been soft-deleted, returns the time at which it will be permanently deleted. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: + (readonly) The time that the bucket will be permanently deleted. + Note this property is only set for soft-deleted buckets. + """ + hard_delete_time = self._properties.get("hardDeleteTime") + if hard_delete_time is not None: + return _rfc3339_nanos_to_datetime(hard_delete_time) + + @property + def _query_params(self): + """Default query parameters.""" + params = super()._query_params + return params + @classmethod def from_string(cls, uri, client=None): """Get a constructor for bucket object by URI. @@ -1045,6 +1096,7 @@ def reload( if_metageneration_match=None, if_metageneration_not_match=None, retry=DEFAULT_RETRY, + soft_deleted=None, ): """Reload properties from Cloud Storage. @@ -1084,6 +1136,13 @@ def reload( :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + + :type soft_deleted: bool + :param soft_deleted: (Optional) If True, looks for a soft-deleted + bucket. Will only return the bucket metadata if the bucket exists + and is in a soft-deleted state. The bucket ``generation`` must be + set if ``soft_deleted`` is set to True. + See: https://cloud.google.com/storage/docs/soft-delete """ super(Bucket, self).reload( client=client, @@ -1094,6 +1153,7 @@ def reload( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=retry, + soft_deleted=soft_deleted, ) @create_trace_span(name="Storage.Bucket.patch") @@ -2159,8 +2219,8 @@ def restore_blob( :param client: (Optional) The client to use. If not passed, falls back to the ``client`` stored on the current bucket. - :type generation: long - :param generation: (Optional) If present, selects a specific revision of this object. + :type generation: int + :param generation: Selects the specific revision of the object. :type copy_source_acl: bool :param copy_source_acl: (Optional) If true, copy the soft-deleted object's access controls. diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index bc2d1147e..b1f48f97e 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -30,6 +30,7 @@ from google.cloud.client import ClientWithProject from google.cloud.exceptions import NotFound +from google.cloud.storage._helpers import _add_generation_match_parameters from google.cloud.storage._helpers import _bucket_bound_hostname_url from google.cloud.storage._helpers import _get_api_endpoint_override from google.cloud.storage._helpers import _get_environ_project @@ -367,7 +368,7 @@ def get_service_account_email( api_response = self._get_resource(path, timeout=timeout, retry=retry) return api_response["email_address"] - def bucket(self, bucket_name, user_project=None): + def bucket(self, bucket_name, user_project=None, generation=None): """Factory constructor for bucket object. .. note:: @@ -381,10 +382,19 @@ def bucket(self, bucket_name, user_project=None): :param user_project: (Optional) The project ID to be billed for API requests made via the bucket. + :type generation: int + :param generation: (Optional) If present, selects a specific revision of + this bucket. + :rtype: :class:`google.cloud.storage.bucket.Bucket` :returns: The bucket object created. """ - return Bucket(client=self, name=bucket_name, user_project=user_project) + return Bucket( + client=self, + name=bucket_name, + user_project=user_project, + generation=generation, + ) def batch(self, raise_exception=True): """Factory constructor for batch object. @@ -789,7 +799,7 @@ def _delete_resource( _target_object=_target_object, ) - def _bucket_arg_to_bucket(self, bucket_or_name): + def _bucket_arg_to_bucket(self, bucket_or_name, generation=None): """Helper to return given bucket or create new by name. Args: @@ -798,17 +808,27 @@ def _bucket_arg_to_bucket(self, bucket_or_name): str, \ ]): The bucket resource to pass or name to create. + generation (Optional[int]): + The bucket generation. If generation is specified, + bucket_or_name must be a name (str). Returns: google.cloud.storage.bucket.Bucket The newly created bucket or the given one. """ if isinstance(bucket_or_name, Bucket): + if generation: + raise ValueError( + "The generation can only be specified if a " + "name is used to specify a bucket, not a Bucket object. " + "Create a new Bucket object with the correct generation " + "instead." + ) bucket = bucket_or_name if bucket.client is None: bucket._client = self else: - bucket = Bucket(self, name=bucket_or_name) + bucket = Bucket(self, name=bucket_or_name, generation=generation) return bucket @create_trace_span(name="Storage.Client.getBucket") @@ -819,6 +839,9 @@ def get_bucket( if_metageneration_match=None, if_metageneration_not_match=None, retry=DEFAULT_RETRY, + *, + generation=None, + soft_deleted=None, ): """Retrieve a bucket via a GET request. @@ -837,12 +860,12 @@ def get_bucket( Can also be passed as a tuple (connect_timeout, read_timeout). See :meth:`requests.Session.request` documentation for details. - if_metageneration_match (Optional[long]): + if_metageneration_match (Optional[int]): Make the operation conditional on whether the - blob's current metageneration matches the given value. + bucket's current metageneration matches the given value. - if_metageneration_not_match (Optional[long]): - Make the operation conditional on whether the blob's + if_metageneration_not_match (Optional[int]): + Make the operation conditional on whether the bucket's current metageneration does not match the given value. retry (Optional[Union[google.api_core.retry.Retry, google.cloud.storage.retry.ConditionalRetryPolicy]]): @@ -859,6 +882,19 @@ def get_bucket( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + generation (Optional[int]): + The generation of the bucket. The generation can be used to + specify a specific soft-deleted version of the bucket, in + conjunction with the ``soft_deleted`` argument below. If + ``soft_deleted`` is not True, the generation is unused. + + soft_deleted (Optional[bool]): + If True, looks for a soft-deleted bucket. Will only return + the bucket metadata if the bucket exists and is in a + soft-deleted state. The bucket ``generation`` is required if + ``soft_deleted`` is set to True. + See: https://cloud.google.com/storage/docs/soft-delete + Returns: google.cloud.storage.bucket.Bucket The bucket matching the name provided. @@ -867,13 +903,14 @@ def get_bucket( google.cloud.exceptions.NotFound If the bucket is not found. """ - bucket = self._bucket_arg_to_bucket(bucket_or_name) + bucket = self._bucket_arg_to_bucket(bucket_or_name, generation=generation) bucket.reload( client=self, timeout=timeout, if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=retry, + soft_deleted=soft_deleted, ) return bucket @@ -1386,6 +1423,8 @@ def list_buckets( page_size=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + *, + soft_deleted=None, ): """Get all buckets in the project associated to the client. @@ -1438,6 +1477,12 @@ def list_buckets( :param retry: (Optional) How to retry the RPC. See: :ref:`configuring_retries` + :type soft_deleted: bool + :param soft_deleted: + (Optional) If true, only soft-deleted buckets will be listed as distinct results in order of increasing + generation number. This parameter can only be used successfully if the bucket has a soft delete policy. + See: https://cloud.google.com/storage/docs/soft-delete + :rtype: :class:`~google.api_core.page_iterator.Iterator` :raises ValueError: if both ``project`` is ``None`` and the client's project is also ``None``. @@ -1469,6 +1514,9 @@ def list_buckets( if fields is not None: extra_params["fields"] = fields + if soft_deleted is not None: + extra_params["softDeleted"] = soft_deleted + return self._list_resource( "/b", _item_to_bucket, @@ -1480,6 +1528,71 @@ def list_buckets( retry=retry, ) + def restore_bucket( + self, + bucket_name, + generation, + projection="noAcl", + if_metageneration_match=None, + if_metageneration_not_match=None, + timeout=_DEFAULT_TIMEOUT, + retry=DEFAULT_RETRY, + ): + """Restores a soft-deleted bucket. + + :type bucket_name: str + :param bucket_name: The name of the bucket to be restored. + + :type generation: int + :param generation: Selects the specific revision of the bucket. + + :type projection: str + :param projection: + (Optional) Specifies the set of properties to return. If used, must + be 'full' or 'noAcl'. Defaults to 'noAcl'. + + if_metageneration_match (Optional[int]): + Make the operation conditional on whether the + blob's current metageneration matches the given value. + + if_metageneration_not_match (Optional[int]): + Make the operation conditional on whether the blob's + current metageneration does not match the given value. + + :type timeout: float or tuple + :param timeout: + (Optional) The amount of time, in seconds, to wait + for the server response. See: :ref:`configuring_timeouts` + + :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy + :param retry: + (Optional) How to retry the RPC. + + Users can configure non-default retry behavior. A ``None`` value will + disable retries. See [Configuring Retries](https://cloud.google.com/python/docs/reference/storage/latest/retry_timeout). + + :rtype: :class:`google.cloud.storage.bucket.Bucket` + :returns: The restored Bucket. + """ + query_params = {"generation": generation, "projection": projection} + + _add_generation_match_parameters( + query_params, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + ) + + bucket = self.bucket(bucket_name) + api_response = self._post_resource( + f"{bucket.path}/restore", + None, + query_params=query_params, + timeout=timeout, + retry=retry, + ) + bucket._set_properties(api_response) + return bucket + @create_trace_span(name="Storage.Client.createHmacKey") def create_hmac_key( self, diff --git a/tests/system/test_client.py b/tests/system/test_client.py index c1b3858f2..6b3798c83 100644 --- a/tests/system/test_client.py +++ b/tests/system/test_client.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import datetime import io import re import os @@ -215,3 +216,46 @@ def test_client_universe_domain( stored_contents = file_obj.read() assert stored_contents == payload + + +def test_restore_bucket( + storage_client, + buckets_to_delete, +): + from google.cloud.storage.bucket import SoftDeletePolicy + + # Create a bucket with soft delete policy. + duration_secs = 7 * 86400 + bucket = storage_client.bucket(_helpers.unique_name("w-soft-delete")) + bucket.soft_delete_policy.retention_duration_seconds = duration_secs + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket) + buckets_to_delete.append(bucket) + + policy = bucket.soft_delete_policy + assert isinstance(policy, SoftDeletePolicy) + assert policy.retention_duration_seconds == duration_secs + assert isinstance(policy.effective_time, datetime.datetime) + + # Record the bucket's name and generation + name = bucket.name + generation = bucket.generation + assert generation is not None + + # Delete the bucket, then use the generation to get a reference to it again. + _helpers.retry_429_503(bucket.delete)() + soft_deleted_bucket = _helpers.retry_429_503(storage_client.get_bucket)( + name, generation=generation, soft_deleted=True + ) + assert soft_deleted_bucket.name == name + assert soft_deleted_bucket.generation == generation + assert soft_deleted_bucket.soft_delete_time is not None + assert soft_deleted_bucket.hard_delete_time is not None + + # Restore the bucket. + restored_bucket = _helpers.retry_429_503(storage_client.restore_bucket)( + name, generation=generation + ) + assert restored_bucket.name == name + assert restored_bucket.generation == generation + assert restored_bucket.soft_delete_time is None + assert restored_bucket.hard_delete_time is None diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 030fba72b..e6072ce5f 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -603,16 +603,24 @@ def _make_client(**kw): kw["api_endpoint"] = kw.get("api_endpoint") or _get_default_storage_base_url() return mock.create_autospec(Client, instance=True, **kw) - def _make_one(self, client=None, name=None, properties=None, user_project=None): + def _make_one( + self, + client=None, + name=None, + properties=None, + user_project=None, + generation=None, + ): if client is None: client = self._make_client() if user_project is None: - bucket = self._get_target_class()(client, name=name) + bucket = self._get_target_class()(client, name=name, generation=generation) else: bucket = self._get_target_class()( - client, name=name, user_project=user_project + client, name=name, user_project=user_project, generation=generation ) - bucket._properties = properties or {} + if properties: + bucket._properties = {**bucket._properties, **properties} return bucket def test_ctor_w_invalid_name(self): @@ -633,6 +641,9 @@ def test_ctor(self): self.assertIs(bucket._default_object_acl.bucket, bucket) self.assertEqual(list(bucket._label_removals), []) self.assertIsNone(bucket.user_project) + self.assertEqual(bucket.generation, None) + self.assertEqual(bucket.soft_delete_time, None) + self.assertEqual(bucket.hard_delete_time, None) def test_ctor_w_user_project(self): NAME = "name" @@ -649,6 +660,31 @@ def test_ctor_w_user_project(self): self.assertEqual(list(bucket._label_removals), []) self.assertEqual(bucket.user_project, USER_PROJECT) + def test_ctor_w_generation_and_soft_delete_info(self): + from google.cloud._helpers import _RFC3339_MICROS + + NAME = "name" + generation = 12345 + + soft_timestamp = datetime.datetime(2024, 1, 5, 20, 34, 37, tzinfo=_UTC) + soft_delete = soft_timestamp.strftime(_RFC3339_MICROS) + hard_timestamp = datetime.datetime(2024, 1, 15, 20, 34, 37, tzinfo=_UTC) + hard_delete = hard_timestamp.strftime(_RFC3339_MICROS) + properties = {"softDeleteTime": soft_delete, "hardDeleteTime": hard_delete} + + bucket = self._make_one(name=NAME, generation=generation, properties=properties) + self.assertEqual(bucket.name, NAME) + self.assertEqual(list(bucket._changes), []) + self.assertFalse(bucket._acl.loaded) + self.assertIs(bucket._acl.bucket, bucket) + self.assertFalse(bucket._default_object_acl.loaded) + self.assertIs(bucket._default_object_acl.bucket, bucket) + self.assertEqual(list(bucket._label_removals), []) + self.assertIsNone(bucket.user_project) + self.assertEqual(bucket.generation, generation) + self.assertEqual(bucket.soft_delete_time, soft_timestamp) + self.assertEqual(bucket.hard_delete_time, hard_timestamp) + def test_blob_wo_keys(self): from google.cloud.storage.blob import Blob @@ -1994,6 +2030,31 @@ def test_reload_w_generation_match(self): with self.assertRaises(TypeError): bucket.reload(if_generation_match=6) + def test_reload_w_soft_deleted(self): + name = "name" + api_response = {"name": name} + client = mock.Mock(spec=["_get_resource"]) + client._get_resource.return_value = api_response + bucket = self._make_one(client, name=name, generation=12345) + + bucket.reload(soft_deleted=True) + + expected_path = f"/b/{name}" + expected_query_params = { + "projection": "noAcl", + "softDeleted": True, + "generation": 12345, + } + expected_headers = {} + client._get_resource.assert_called_once_with( + expected_path, + query_params=expected_query_params, + headers=expected_headers, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + _target_object=bucket, + ) + def test_update_w_metageneration_match(self): name = "name" metageneration_number = 9 diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 5eb339acb..df4578e09 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -532,13 +532,15 @@ def test_bucket(self): PROJECT = "PROJECT" CREDENTIALS = _make_credentials() BUCKET_NAME = "BUCKET_NAME" + GENERATION = 12345 client = self._make_one(project=PROJECT, credentials=CREDENTIALS) - bucket = client.bucket(BUCKET_NAME) + bucket = client.bucket(BUCKET_NAME, generation=GENERATION) self.assertIsInstance(bucket, Bucket) self.assertIs(bucket.client, client) self.assertEqual(bucket.name, BUCKET_NAME) self.assertIsNone(bucket.user_project) + self.assertEqual(bucket.generation, GENERATION) def test_bucket_w_user_project(self): from google.cloud.storage.bucket import Bucket @@ -958,6 +960,20 @@ def test__bucket_arg_to_bucket_w_bucket_w_client(self): self.assertIs(found, bucket) self.assertIs(found.client, other_client) + def test__bucket_arg_to_bucket_raises_on_generation(self): + from google.cloud.storage.bucket import Bucket + + project = "PROJECT" + credentials = _make_credentials() + client = self._make_one(project=project, credentials=credentials) + other_client = mock.Mock(spec=[]) + bucket_name = "w_client" + + bucket = Bucket(other_client, name=bucket_name) + + with self.assertRaises(ValueError): + client._bucket_arg_to_bucket(bucket, generation=12345) + def test__bucket_arg_to_bucket_w_bucket_wo_client(self): from google.cloud.storage.bucket import Bucket @@ -977,14 +993,16 @@ def test__bucket_arg_to_bucket_w_bucket_name(self): from google.cloud.storage.bucket import Bucket project = "PROJECT" + generation = 12345 credentials = _make_credentials() client = self._make_one(project=project, credentials=credentials) bucket_name = "string-name" - found = client._bucket_arg_to_bucket(bucket_name) + found = client._bucket_arg_to_bucket(bucket_name, generation) self.assertIsInstance(found, Bucket) self.assertEqual(found.name, bucket_name) + self.assertEqual(found.generation, generation) self.assertIs(found.client, client) def test_get_bucket_miss_w_string_w_defaults(self): @@ -1045,6 +1063,41 @@ def test_get_bucket_hit_w_string_w_timeout(self): _target_object=bucket, ) + def test_get_bucket_hit_w_string_w_soft_deleted(self): + from google.cloud.storage.bucket import Bucket + + project = "PROJECT" + bucket_name = "bucket-name" + generation = 12345 + api_response = {"name": bucket_name, "generation": generation} + credentials = _make_credentials() + client = self._make_one(project=project, credentials=credentials) + client._get_resource = mock.Mock(return_value=api_response) + + bucket = client.get_bucket( + bucket_name, generation=generation, soft_deleted=True + ) + + self.assertIsInstance(bucket, Bucket) + self.assertEqual(bucket.name, bucket_name) + self.assertEqual(bucket.generation, generation) + + expected_path = f"/b/{bucket_name}" + expected_query_params = { + "generation": generation, + "projection": "noAcl", + "softDeleted": True, + } + expected_headers = {} + client._get_resource.assert_called_once_with( + expected_path, + query_params=expected_query_params, + headers=expected_headers, + timeout=60, + retry=DEFAULT_RETRY, + _target_object=bucket, + ) + def test_get_bucket_hit_w_string_w_metageneration_match(self): from google.cloud.storage.bucket import Bucket @@ -2259,6 +2312,39 @@ def test_list_buckets_w_defaults(self): retry=DEFAULT_RETRY, ) + def test_list_buckets_w_soft_deleted(self): + from google.cloud.storage.client import _item_to_bucket + + project = "PROJECT" + credentials = _make_credentials() + client = self._make_one(project=project, credentials=credentials) + client._list_resource = mock.Mock(spec=[]) + + iterator = client.list_buckets(soft_deleted=True) + + self.assertIs(iterator, client._list_resource.return_value) + + expected_path = "/b" + expected_item_to_value = _item_to_bucket + expected_page_token = None + expected_max_results = None + expected_page_size = None + expected_extra_params = { + "project": project, + "projection": "noAcl", + "softDeleted": True, + } + client._list_resource.assert_called_once_with( + expected_path, + expected_item_to_value, + page_token=expected_page_token, + max_results=expected_max_results, + extra_params=expected_extra_params, + page_size=expected_page_size, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + ) + def test_list_buckets_w_explicit(self): from google.cloud.storage.client import _item_to_bucket @@ -2312,6 +2398,33 @@ def test_list_buckets_w_explicit(self): retry=retry, ) + def test_restore_bucket(self): + from google.cloud.storage.bucket import Bucket + + PROJECT = "PROJECT" + NAME = "my_deleted_bucket" + GENERATION = 12345 + + api_response = {"name": NAME} + credentials = _make_credentials() + client = self._make_one(project=PROJECT, credentials=credentials) + client._post_resource = mock.Mock(return_value=api_response) + + bucket = client.restore_bucket(NAME, GENERATION) + + self.assertIsInstance(bucket, Bucket) + self.assertEqual(bucket.name, NAME) + + expected_path = f"/b/{NAME}/restore" + expected_query_params = {"generation": 12345, "projection": "noAcl"} + client._post_resource.assert_called_once_with( + expected_path, + None, + query_params=expected_query_params, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + ) + def _create_hmac_key_helper( self, explicit_project=None, From 06ed15b33dc884da6dffbef5119e47f0fc4e1285 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 30 Oct 2024 14:17:43 -0700 Subject: [PATCH 291/509] feat: add support for restore token (#1369) * feat: add support for restore token * add unit tests coverage * update docstrings * fix docs --- google/cloud/storage/_helpers.py | 10 ++++++ google/cloud/storage/blob.py | 23 ++++++++++++++ google/cloud/storage/bucket.py | 19 +++++++++++ tests/system/test_bucket.py | 54 +++++++++++++++++++++++++++++++- tests/unit/test_blob.py | 18 +++++++++-- tests/unit/test_bucket.py | 19 +++++++++-- 6 files changed, 137 insertions(+), 6 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 3793a95f2..8af5fd96c 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -226,6 +226,7 @@ def reload( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, soft_deleted=None, + restore_token=None, ): """Reload properties from Cloud Storage. @@ -278,6 +279,13 @@ def reload( the object metadata if the object exists and is in a soft-deleted state. :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True. See: https://cloud.google.com/storage/docs/soft-delete + + :type restore_token: str + :param restore_token: + (Optional) The restore_token is required to retrieve a soft-deleted object only if + its name and generation value do not uniquely identify it, and hierarchical namespace + is enabled on the bucket. Otherwise, this parameter is optional. + See: https://cloud.google.com/storage/docs/json_api/v1/objects/get """ client = self._require_client(client) query_params = self._query_params @@ -296,6 +304,8 @@ def reload( # Soft delete reload requires a generation, even for targets # that don't include them in default query params (buckets). query_params["generation"] = self.generation + if restore_token is not None: + query_params["restoreToken"] = restore_token headers = self._encryption_headers() _add_etag_match_headers( headers, if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index e474f1681..6f2aab674 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -653,6 +653,7 @@ def exists( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, soft_deleted=None, + restore_token=None, ): """Determines whether or not this blob exists. @@ -704,6 +705,13 @@ def exists( :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True. See: https://cloud.google.com/storage/docs/soft-delete + :type restore_token: str + :param restore_token: + (Optional) The restore_token is required to retrieve a soft-deleted object only if + its name and generation value do not uniquely identify it, and hierarchical namespace + is enabled on the bucket. Otherwise, this parameter is optional. + See: https://cloud.google.com/storage/docs/json_api/v1/objects/get + :rtype: bool :returns: True if the blob exists in Cloud Storage. """ @@ -714,6 +722,8 @@ def exists( query_params["fields"] = "name" if soft_deleted is not None: query_params["softDeleted"] = soft_deleted + if restore_token is not None: + query_params["restoreToken"] = restore_token _add_generation_match_parameters( query_params, @@ -4794,6 +4804,19 @@ def hard_delete_time(self): if hard_delete_time is not None: return _rfc3339_nanos_to_datetime(hard_delete_time) + @property + def restore_token(self): + """The restore token, a universally unique identifier (UUID), along with the object's + name and generation value, uniquely identifies a soft-deleted object. + This field is only returned for soft-deleted objects in hierarchical namespace buckets. + + :rtype: string or ``NoneType`` + :returns: + (readonly) The restore token used to differentiate soft-deleted objects with the same name and generation. + This field is only returned for soft-deleted objects in hierarchical namespace buckets. + """ + return self._properties.get("restoreToken") + def _get_host_name(connection): """Returns the host name from the given connection. diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 7cea15f4e..a0018af91 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1256,6 +1256,7 @@ def get_blob( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, soft_deleted=None, + restore_token=None, **kwargs, ): """Get a blob object by name. @@ -1323,6 +1324,13 @@ def get_blob( Object ``generation`` is required if ``soft_deleted`` is set to True. See: https://cloud.google.com/storage/docs/soft-delete + :type restore_token: str + :param restore_token: + (Optional) The restore_token is required to retrieve a soft-deleted object only if + its name and generation value do not uniquely identify it, and hierarchical namespace + is enabled on the bucket. Otherwise, this parameter is optional. + See: https://cloud.google.com/storage/docs/json_api/v1/objects/get + :param kwargs: Keyword arguments to pass to the :class:`~google.cloud.storage.blob.Blob` constructor. @@ -1351,6 +1359,7 @@ def get_blob( if_metageneration_not_match=if_metageneration_not_match, retry=retry, soft_deleted=soft_deleted, + restore_token=restore_token, ) except NotFound: return None @@ -2199,6 +2208,7 @@ def restore_blob( generation=None, copy_source_acl=None, projection=None, + restore_token=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -2229,6 +2239,13 @@ def restore_blob( :param projection: (Optional) Specifies the set of properties to return. If used, must be 'full' or 'noAcl'. + :type restore_token: str + :param restore_token: + (Optional) The restore_token is required to restore a soft-deleted object + only if its name and generation value do not uniquely identify it, and hierarchical namespace + is enabled on the bucket. Otherwise, this parameter is optional. + See: https://cloud.google.com/storage/docs/json_api/v1/objects/restore + :type if_generation_match: long :param if_generation_match: (Optional) See :ref:`using-if-generation-match` @@ -2276,6 +2293,8 @@ def restore_blob( query_params["copySourceAcl"] = copy_source_acl if projection is not None: query_params["projection"] = projection + if restore_token is not None: + query_params["restoreToken"] = restore_token _add_generation_match_parameters( query_params, diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 270a77ad1..7635388a5 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1232,7 +1232,7 @@ def test_soft_delete_policy( assert restored_blob.generation != gen # Patch the soft delete policy on an existing bucket. - new_duration_secs = 10 * 86400 + new_duration_secs = 0 bucket.soft_delete_policy.retention_duration_seconds = new_duration_secs bucket.patch() assert bucket.soft_delete_policy.retention_duration_seconds == new_duration_secs @@ -1265,3 +1265,55 @@ def test_new_bucket_with_hierarchical_namespace( bucket = storage_client.create_bucket(bucket_obj) buckets_to_delete.append(bucket) assert bucket.hierarchical_namespace_enabled is True + + +def test_restore_token( + storage_client, + buckets_to_delete, + blobs_to_delete, +): + # Create HNS bucket with soft delete policy. + duration_secs = 7 * 86400 + bucket = storage_client.bucket(_helpers.unique_name("w-soft-delete")) + bucket.hierarchical_namespace_enabled = True + bucket.iam_configuration.uniform_bucket_level_access_enabled = True + bucket.soft_delete_policy.retention_duration_seconds = duration_secs + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket) + buckets_to_delete.append(bucket) + + # Insert an object and delete it to enter soft-deleted state. + payload = b"DEADBEEF" + blob_name = _helpers.unique_name("soft-delete") + blob = bucket.blob(blob_name) + blob.upload_from_string(payload) + # blob = bucket.get_blob(blob_name) + gen = blob.generation + blob.delete() + + # Get the soft-deleted object and restore token. + blob = bucket.get_blob(blob_name, generation=gen, soft_deleted=True) + restore_token = blob.restore_token + + # List and get soft-deleted object that includes restore token. + all_blobs = list(bucket.list_blobs(soft_deleted=True)) + assert all_blobs[0].restore_token is not None + blob_w_restore_token = bucket.get_blob( + blob_name, generation=gen, soft_deleted=True, restore_token=restore_token + ) + assert blob_w_restore_token.soft_delete_time is not None + assert blob_w_restore_token.hard_delete_time is not None + assert blob_w_restore_token.restore_token is not None + + # Restore the soft-deleted object using the restore token. + restored_blob = bucket.restore_blob( + blob_name, generation=gen, restore_token=restore_token + ) + blobs_to_delete.append(restored_blob) + assert restored_blob.exists() is True + assert restored_blob.generation != gen + + # Patch the soft delete policy on the bucket. + new_duration_secs = 0 + bucket.soft_delete_policy.retention_duration_seconds = new_duration_secs + bucket.patch() + assert bucket.soft_delete_policy.retention_duration_seconds == new_duration_secs diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index b0ff4f07b..fc472a30f 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -784,21 +784,25 @@ def test_exists_hit_w_generation_w_retry(self): _target_object=None, ) - def test_exists_hit_w_generation_w_soft_deleted(self): + def test_exists_hit_w_gen_soft_deleted_restore_token(self): blob_name = "blob-name" generation = 123456 + restore_token = "88ba0d97-639e-5902" api_response = {"name": blob_name} client = mock.Mock(spec=["_get_resource"]) client._get_resource.return_value = api_response bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket, generation=generation) - self.assertTrue(blob.exists(retry=None, soft_deleted=True)) + self.assertTrue( + blob.exists(retry=None, soft_deleted=True, restore_token=restore_token) + ) expected_query_params = { "fields": "name", "generation": generation, "softDeleted": True, + "restoreToken": restore_token, } expected_headers = {} client._get_resource.assert_called_once_with( @@ -5870,6 +5874,16 @@ def test_soft_hard_delete_time_getter(self): self.assertEqual(blob.soft_delete_time, soft_timstamp) self.assertEqual(blob.hard_delete_time, hard_timstamp) + def test_restore_token_getter(self): + BLOB_NAME = "blob-name" + bucket = _Bucket() + restore_token = "88ba0d97-639e-5902" + properties = { + "restoreToken": restore_token, + } + blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) + self.assertEqual(blob.restore_token, restore_token) + def test_soft_hard_delte_time_unset(self): BUCKET = object() blob = self._make_one("blob-name", bucket=BUCKET) diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index e6072ce5f..ac2bf44ee 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1018,18 +1018,24 @@ def test_get_blob_hit_w_user_project(self): _target_object=blob, ) - def test_get_blob_hit_w_generation_w_soft_deleted(self): + def test_get_blob_hit_w_gen_soft_deleted_restore_token(self): from google.cloud.storage.blob import Blob name = "name" blob_name = "blob-name" generation = 1512565576797178 + restore_token = "88ba0d97-639e-5902" api_response = {"name": blob_name, "generation": generation} client = mock.Mock(spec=["_get_resource"]) client._get_resource.return_value = api_response bucket = self._make_one(client, name=name) - blob = bucket.get_blob(blob_name, generation=generation, soft_deleted=True) + blob = bucket.get_blob( + blob_name, + generation=generation, + soft_deleted=True, + restore_token=restore_token, + ) self.assertIsInstance(blob, Blob) self.assertIs(blob.bucket, bucket) @@ -1041,6 +1047,7 @@ def test_get_blob_hit_w_generation_w_soft_deleted(self): "generation": generation, "projection": "noAcl", "softDeleted": True, + "restoreToken": restore_token, } expected_headers = {} client._get_resource.assert_called_once_with( @@ -4217,8 +4224,10 @@ def test_restore_blob_w_explicit(self): user_project = "user-project-123" bucket_name = "restore_bucket" blob_name = "restore_blob" + new_generation = 987655 generation = 123456 - api_response = {"name": blob_name, "generation": generation} + restore_token = "88ba0d97-639e-5902" + api_response = {"name": blob_name, "generation": new_generation} client = mock.Mock(spec=["_post_resource"]) client._post_resource.return_value = api_response bucket = self._make_one( @@ -4233,6 +4242,8 @@ def test_restore_blob_w_explicit(self): restored_blob = bucket.restore_blob( blob_name, client=client, + generation=generation, + restore_token=restore_token, if_generation_match=if_generation_match, if_generation_not_match=if_generation_not_match, if_metageneration_match=if_metageneration_match, @@ -4245,6 +4256,8 @@ def test_restore_blob_w_explicit(self): expected_path = f"/b/{bucket_name}/o/{blob_name}/restore" expected_data = None expected_query_params = { + "generation": generation, + "restoreToken": restore_token, "userProject": user_project, "projection": projection, "ifGenerationMatch": if_generation_match, From 012eab4563d740443fbc24271b6eb86d0f256b1b Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 7 Nov 2024 10:24:21 -0800 Subject: [PATCH 292/509] chore(revert): Revert "feat: add support for restore token (#1369)" (#1373) This reverts commit 06ed15b33dc884da6dffbef5119e47f0fc4e1285. --- google/cloud/storage/_helpers.py | 10 ------ google/cloud/storage/blob.py | 23 -------------- google/cloud/storage/bucket.py | 19 ----------- tests/system/test_bucket.py | 54 +------------------------------- tests/unit/test_blob.py | 18 ++--------- tests/unit/test_bucket.py | 19 ++--------- 6 files changed, 6 insertions(+), 137 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 8af5fd96c..3793a95f2 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -226,7 +226,6 @@ def reload( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, soft_deleted=None, - restore_token=None, ): """Reload properties from Cloud Storage. @@ -279,13 +278,6 @@ def reload( the object metadata if the object exists and is in a soft-deleted state. :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True. See: https://cloud.google.com/storage/docs/soft-delete - - :type restore_token: str - :param restore_token: - (Optional) The restore_token is required to retrieve a soft-deleted object only if - its name and generation value do not uniquely identify it, and hierarchical namespace - is enabled on the bucket. Otherwise, this parameter is optional. - See: https://cloud.google.com/storage/docs/json_api/v1/objects/get """ client = self._require_client(client) query_params = self._query_params @@ -304,8 +296,6 @@ def reload( # Soft delete reload requires a generation, even for targets # that don't include them in default query params (buckets). query_params["generation"] = self.generation - if restore_token is not None: - query_params["restoreToken"] = restore_token headers = self._encryption_headers() _add_etag_match_headers( headers, if_etag_match=if_etag_match, if_etag_not_match=if_etag_not_match diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 6f2aab674..e474f1681 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -653,7 +653,6 @@ def exists( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, soft_deleted=None, - restore_token=None, ): """Determines whether or not this blob exists. @@ -705,13 +704,6 @@ def exists( :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True. See: https://cloud.google.com/storage/docs/soft-delete - :type restore_token: str - :param restore_token: - (Optional) The restore_token is required to retrieve a soft-deleted object only if - its name and generation value do not uniquely identify it, and hierarchical namespace - is enabled on the bucket. Otherwise, this parameter is optional. - See: https://cloud.google.com/storage/docs/json_api/v1/objects/get - :rtype: bool :returns: True if the blob exists in Cloud Storage. """ @@ -722,8 +714,6 @@ def exists( query_params["fields"] = "name" if soft_deleted is not None: query_params["softDeleted"] = soft_deleted - if restore_token is not None: - query_params["restoreToken"] = restore_token _add_generation_match_parameters( query_params, @@ -4804,19 +4794,6 @@ def hard_delete_time(self): if hard_delete_time is not None: return _rfc3339_nanos_to_datetime(hard_delete_time) - @property - def restore_token(self): - """The restore token, a universally unique identifier (UUID), along with the object's - name and generation value, uniquely identifies a soft-deleted object. - This field is only returned for soft-deleted objects in hierarchical namespace buckets. - - :rtype: string or ``NoneType`` - :returns: - (readonly) The restore token used to differentiate soft-deleted objects with the same name and generation. - This field is only returned for soft-deleted objects in hierarchical namespace buckets. - """ - return self._properties.get("restoreToken") - def _get_host_name(connection): """Returns the host name from the given connection. diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index a0018af91..7cea15f4e 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -1256,7 +1256,6 @@ def get_blob( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, soft_deleted=None, - restore_token=None, **kwargs, ): """Get a blob object by name. @@ -1324,13 +1323,6 @@ def get_blob( Object ``generation`` is required if ``soft_deleted`` is set to True. See: https://cloud.google.com/storage/docs/soft-delete - :type restore_token: str - :param restore_token: - (Optional) The restore_token is required to retrieve a soft-deleted object only if - its name and generation value do not uniquely identify it, and hierarchical namespace - is enabled on the bucket. Otherwise, this parameter is optional. - See: https://cloud.google.com/storage/docs/json_api/v1/objects/get - :param kwargs: Keyword arguments to pass to the :class:`~google.cloud.storage.blob.Blob` constructor. @@ -1359,7 +1351,6 @@ def get_blob( if_metageneration_not_match=if_metageneration_not_match, retry=retry, soft_deleted=soft_deleted, - restore_token=restore_token, ) except NotFound: return None @@ -2208,7 +2199,6 @@ def restore_blob( generation=None, copy_source_acl=None, projection=None, - restore_token=None, if_generation_match=None, if_generation_not_match=None, if_metageneration_match=None, @@ -2239,13 +2229,6 @@ def restore_blob( :param projection: (Optional) Specifies the set of properties to return. If used, must be 'full' or 'noAcl'. - :type restore_token: str - :param restore_token: - (Optional) The restore_token is required to restore a soft-deleted object - only if its name and generation value do not uniquely identify it, and hierarchical namespace - is enabled on the bucket. Otherwise, this parameter is optional. - See: https://cloud.google.com/storage/docs/json_api/v1/objects/restore - :type if_generation_match: long :param if_generation_match: (Optional) See :ref:`using-if-generation-match` @@ -2293,8 +2276,6 @@ def restore_blob( query_params["copySourceAcl"] = copy_source_acl if projection is not None: query_params["projection"] = projection - if restore_token is not None: - query_params["restoreToken"] = restore_token _add_generation_match_parameters( query_params, diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 7635388a5..270a77ad1 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1232,7 +1232,7 @@ def test_soft_delete_policy( assert restored_blob.generation != gen # Patch the soft delete policy on an existing bucket. - new_duration_secs = 0 + new_duration_secs = 10 * 86400 bucket.soft_delete_policy.retention_duration_seconds = new_duration_secs bucket.patch() assert bucket.soft_delete_policy.retention_duration_seconds == new_duration_secs @@ -1265,55 +1265,3 @@ def test_new_bucket_with_hierarchical_namespace( bucket = storage_client.create_bucket(bucket_obj) buckets_to_delete.append(bucket) assert bucket.hierarchical_namespace_enabled is True - - -def test_restore_token( - storage_client, - buckets_to_delete, - blobs_to_delete, -): - # Create HNS bucket with soft delete policy. - duration_secs = 7 * 86400 - bucket = storage_client.bucket(_helpers.unique_name("w-soft-delete")) - bucket.hierarchical_namespace_enabled = True - bucket.iam_configuration.uniform_bucket_level_access_enabled = True - bucket.soft_delete_policy.retention_duration_seconds = duration_secs - bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket) - buckets_to_delete.append(bucket) - - # Insert an object and delete it to enter soft-deleted state. - payload = b"DEADBEEF" - blob_name = _helpers.unique_name("soft-delete") - blob = bucket.blob(blob_name) - blob.upload_from_string(payload) - # blob = bucket.get_blob(blob_name) - gen = blob.generation - blob.delete() - - # Get the soft-deleted object and restore token. - blob = bucket.get_blob(blob_name, generation=gen, soft_deleted=True) - restore_token = blob.restore_token - - # List and get soft-deleted object that includes restore token. - all_blobs = list(bucket.list_blobs(soft_deleted=True)) - assert all_blobs[0].restore_token is not None - blob_w_restore_token = bucket.get_blob( - blob_name, generation=gen, soft_deleted=True, restore_token=restore_token - ) - assert blob_w_restore_token.soft_delete_time is not None - assert blob_w_restore_token.hard_delete_time is not None - assert blob_w_restore_token.restore_token is not None - - # Restore the soft-deleted object using the restore token. - restored_blob = bucket.restore_blob( - blob_name, generation=gen, restore_token=restore_token - ) - blobs_to_delete.append(restored_blob) - assert restored_blob.exists() is True - assert restored_blob.generation != gen - - # Patch the soft delete policy on the bucket. - new_duration_secs = 0 - bucket.soft_delete_policy.retention_duration_seconds = new_duration_secs - bucket.patch() - assert bucket.soft_delete_policy.retention_duration_seconds == new_duration_secs diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index fc472a30f..b0ff4f07b 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -784,25 +784,21 @@ def test_exists_hit_w_generation_w_retry(self): _target_object=None, ) - def test_exists_hit_w_gen_soft_deleted_restore_token(self): + def test_exists_hit_w_generation_w_soft_deleted(self): blob_name = "blob-name" generation = 123456 - restore_token = "88ba0d97-639e-5902" api_response = {"name": blob_name} client = mock.Mock(spec=["_get_resource"]) client._get_resource.return_value = api_response bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket, generation=generation) - self.assertTrue( - blob.exists(retry=None, soft_deleted=True, restore_token=restore_token) - ) + self.assertTrue(blob.exists(retry=None, soft_deleted=True)) expected_query_params = { "fields": "name", "generation": generation, "softDeleted": True, - "restoreToken": restore_token, } expected_headers = {} client._get_resource.assert_called_once_with( @@ -5874,16 +5870,6 @@ def test_soft_hard_delete_time_getter(self): self.assertEqual(blob.soft_delete_time, soft_timstamp) self.assertEqual(blob.hard_delete_time, hard_timstamp) - def test_restore_token_getter(self): - BLOB_NAME = "blob-name" - bucket = _Bucket() - restore_token = "88ba0d97-639e-5902" - properties = { - "restoreToken": restore_token, - } - blob = self._make_one(BLOB_NAME, bucket=bucket, properties=properties) - self.assertEqual(blob.restore_token, restore_token) - def test_soft_hard_delte_time_unset(self): BUCKET = object() blob = self._make_one("blob-name", bucket=BUCKET) diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index ac2bf44ee..e6072ce5f 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -1018,24 +1018,18 @@ def test_get_blob_hit_w_user_project(self): _target_object=blob, ) - def test_get_blob_hit_w_gen_soft_deleted_restore_token(self): + def test_get_blob_hit_w_generation_w_soft_deleted(self): from google.cloud.storage.blob import Blob name = "name" blob_name = "blob-name" generation = 1512565576797178 - restore_token = "88ba0d97-639e-5902" api_response = {"name": blob_name, "generation": generation} client = mock.Mock(spec=["_get_resource"]) client._get_resource.return_value = api_response bucket = self._make_one(client, name=name) - blob = bucket.get_blob( - blob_name, - generation=generation, - soft_deleted=True, - restore_token=restore_token, - ) + blob = bucket.get_blob(blob_name, generation=generation, soft_deleted=True) self.assertIsInstance(blob, Blob) self.assertIs(blob.bucket, bucket) @@ -1047,7 +1041,6 @@ def test_get_blob_hit_w_gen_soft_deleted_restore_token(self): "generation": generation, "projection": "noAcl", "softDeleted": True, - "restoreToken": restore_token, } expected_headers = {} client._get_resource.assert_called_once_with( @@ -4224,10 +4217,8 @@ def test_restore_blob_w_explicit(self): user_project = "user-project-123" bucket_name = "restore_bucket" blob_name = "restore_blob" - new_generation = 987655 generation = 123456 - restore_token = "88ba0d97-639e-5902" - api_response = {"name": blob_name, "generation": new_generation} + api_response = {"name": blob_name, "generation": generation} client = mock.Mock(spec=["_post_resource"]) client._post_resource.return_value = api_response bucket = self._make_one( @@ -4242,8 +4233,6 @@ def test_restore_blob_w_explicit(self): restored_blob = bucket.restore_blob( blob_name, client=client, - generation=generation, - restore_token=restore_token, if_generation_match=if_generation_match, if_generation_not_match=if_generation_not_match, if_metageneration_match=if_metageneration_match, @@ -4256,8 +4245,6 @@ def test_restore_blob_w_explicit(self): expected_path = f"/b/{bucket_name}/o/{blob_name}/restore" expected_data = None expected_query_params = { - "generation": generation, - "restoreToken": restore_token, "userProject": user_project, "projection": projection, "ifGenerationMatch": if_generation_match, From 63cff046f0d82d3261fac654e206c7f77dca48b3 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 7 Nov 2024 11:17:29 -0800 Subject: [PATCH 293/509] chore: add Cloud Trace adoption attributes (#1374) --- .../cloud/storage/_opentelemetry_tracing.py | 7 ++++++ tests/unit/test__opentelemetry_tracing.py | 23 ++++++++----------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/google/cloud/storage/_opentelemetry_tracing.py b/google/cloud/storage/_opentelemetry_tracing.py index ac4c43e07..3416081cd 100644 --- a/google/cloud/storage/_opentelemetry_tracing.py +++ b/google/cloud/storage/_opentelemetry_tracing.py @@ -54,6 +54,12 @@ "user_agent.original": f"gcloud-python/{__version__}", } +_cloud_trace_adoption_attrs = { + "gcp.client.service": "storage", + "gcp.client.version": __version__, + "gcp.client.repo": "googleapis/python-storage", +} + @contextmanager def create_trace_span(name, attributes=None, client=None, api_request=None, retry=None): @@ -79,6 +85,7 @@ def create_trace_span(name, attributes=None, client=None, api_request=None, retr def _get_final_attributes(attributes=None, client=None, api_request=None, retry=None): collected_attr = _default_attributes.copy() + collected_attr.update(_cloud_trace_adoption_attrs) if api_request: collected_attr.update(_set_api_request_attr(api_request, client)) if isinstance(retry, api_retry.Retry): diff --git a/tests/unit/test__opentelemetry_tracing.py b/tests/unit/test__opentelemetry_tracing.py index 631ac9f82..bdbb40fd2 100644 --- a/tests/unit/test__opentelemetry_tracing.py +++ b/tests/unit/test__opentelemetry_tracing.py @@ -89,11 +89,8 @@ def test_enable_trace_call(setup, setup_optin): extra_attributes = { "attribute1": "value1", } - expected_attributes = { - "rpc.service": "CloudStorage", - "rpc.system": "http", - "user_agent.original": f"gcloud-python/{__version__}", - } + expected_attributes = _opentelemetry_tracing._default_attributes.copy() + expected_attributes.update(_opentelemetry_tracing._cloud_trace_adoption_attrs) expected_attributes.update(extra_attributes) with _opentelemetry_tracing.create_trace_span( @@ -114,11 +111,8 @@ def test_enable_trace_error(setup, setup_optin): extra_attributes = { "attribute1": "value1", } - expected_attributes = { - "rpc.service": "CloudStorage", - "rpc.system": "http", - "user_agent.original": f"gcloud-python/{__version__}", - } + expected_attributes = _opentelemetry_tracing._default_attributes.copy() + expected_attributes.update(_opentelemetry_tracing._cloud_trace_adoption_attrs) expected_attributes.update(extra_attributes) with pytest.raises(GoogleAPICallError): @@ -157,6 +151,7 @@ def test_get_final_attributes(setup, setup_optin): "connect_timeout,read_timeout": (100, 100), "retry": f"multiplier{retry_obj._multiplier}/deadline{retry_obj._deadline}/max{retry_obj._maximum}/initial{retry_obj._initial}/predicate{retry_obj._predicate}", } + expected_attributes.update(_opentelemetry_tracing._cloud_trace_adoption_attrs) with mock.patch("google.cloud.storage.client.Client") as test_client: test_client.project = "test_project" @@ -185,12 +180,12 @@ def test_set_conditional_retry_attr(setup, setup_optin): retry_policy, conditional_predicate, required_kwargs ) - expected_attributes = { - "rpc.service": "CloudStorage", - "rpc.system": "http", - "user_agent.original": f"gcloud-python/{__version__}", + retry_attrs = { "retry": f"multiplier{retry_policy._multiplier}/deadline{retry_policy._deadline}/max{retry_policy._maximum}/initial{retry_policy._initial}/predicate{conditional_predicate}", } + expected_attributes = _opentelemetry_tracing._default_attributes.copy() + expected_attributes.update(_opentelemetry_tracing._cloud_trace_adoption_attrs) + expected_attributes.update(retry_attrs) with _opentelemetry_tracing.create_trace_span( test_span_name, From 0cfddf4ba101ebbcd6a026687a4f1b67f98bdf96 Mon Sep 17 00:00:00 2001 From: cojenco Date: Tue, 12 Nov 2024 15:50:15 -0800 Subject: [PATCH 294/509] chore: remove debugger comment (#1381) --- google/cloud/storage/blob.py | 1 - 1 file changed, 1 deletion(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index e474f1681..42b044824 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -2344,7 +2344,6 @@ def _do_resumable_upload( "upload.checksum": f"{checksum}", } args = {"timeout": timeout} - # import pdb; pdb.set_trace() with create_trace_span( name="Storage.ResumableUpload/transmitNextChunk", attributes=extra_attributes, From abc80615ee00a14bc0e6b095252f6d1eb09c4b45 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 20 Nov 2024 14:50:42 -0800 Subject: [PATCH 295/509] feat: IAM signBlob retry and universe domain support (#1380) * feat: IAM signBlob retries * support universe domain and update tests * update test credentials * use ud signing bucket fixture --- google/cloud/storage/_signing.py | 34 ++++++++++++++++++++++++-------- google/cloud/storage/blob.py | 4 ++++ tests/system/conftest.py | 30 ++++++++++++++++++++++++++++ tests/system/test__signing.py | 29 +++++++++++++++++++++++++++ tests/unit/test_blob.py | 3 +++ 5 files changed, 92 insertions(+), 8 deletions(-) diff --git a/google/cloud/storage/_signing.py b/google/cloud/storage/_signing.py index ecf110769..9f47e1a6e 100644 --- a/google/cloud/storage/_signing.py +++ b/google/cloud/storage/_signing.py @@ -28,8 +28,10 @@ from google.auth import exceptions from google.auth.transport import requests from google.cloud import _helpers +from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN from google.cloud.storage._helpers import _NOW from google.cloud.storage._helpers import _UTC +from google.cloud.storage.retry import DEFAULT_RETRY # `google.cloud.storage._signing.NOW` is deprecated. @@ -271,6 +273,7 @@ def generate_signed_url_v2( query_parameters=None, service_account_email=None, access_token=None, + universe_domain=None, ): """Generate a V2 signed URL to provide query-string auth'n to a resource. @@ -384,7 +387,9 @@ def generate_signed_url_v2( # See https://github.com/googleapis/google-cloud-python/issues/922 # Set the right query parameters. if access_token and service_account_email: - signature = _sign_message(string_to_sign, access_token, service_account_email) + signature = _sign_message( + string_to_sign, access_token, service_account_email, universe_domain + ) signed_query_params = { "GoogleAccessId": service_account_email, "Expires": expiration_stamp, @@ -432,6 +437,7 @@ def generate_signed_url_v4( query_parameters=None, service_account_email=None, access_token=None, + universe_domain=None, _request_timestamp=None, # for testing only ): """Generate a V4 signed URL to provide query-string auth'n to a resource. @@ -623,7 +629,9 @@ def generate_signed_url_v4( string_to_sign = "\n".join(string_elements) if access_token and service_account_email: - signature = _sign_message(string_to_sign, access_token, service_account_email) + signature = _sign_message( + string_to_sign, access_token, service_account_email, universe_domain + ) signature_bytes = base64.b64decode(signature) signature = binascii.hexlify(signature_bytes).decode("ascii") else: @@ -647,7 +655,12 @@ def get_v4_now_dtstamps(): return timestamp, datestamp -def _sign_message(message, access_token, service_account_email): +def _sign_message( + message, + access_token, + service_account_email, + universe_domain=_DEFAULT_UNIVERSE_DOMAIN, +): """Signs a message. :type message: str @@ -669,17 +682,22 @@ def _sign_message(message, access_token, service_account_email): message = _helpers._to_bytes(message) method = "POST" - url = "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{}:signBlob?alt=json".format( - service_account_email - ) + url = f"https://iamcredentials.{universe_domain}/v1/projects/-/serviceAccounts/{service_account_email}:signBlob?alt=json" headers = { "Authorization": "Bearer " + access_token, "Content-type": "application/json", } body = json.dumps({"payload": base64.b64encode(message).decode("utf-8")}) - request = requests.Request() - response = request(url=url, method=method, body=body, headers=headers) + + def retriable_request(): + response = request(url=url, method=method, body=body, headers=headers) + return response + + # Apply the default retry object to the signBlob call. + retry = DEFAULT_RETRY + call = retry(retriable_request) + response = call() if response.status != http.client.OK: raise exceptions.TransportError( diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 42b044824..1cd71bdb7 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -607,6 +607,9 @@ def generate_signed_url( client = self._require_client(client) # May be redundant, but that's ok. credentials = client._credentials + client = self._require_client(client) + universe_domain = client.universe_domain + if version == "v2": helper = generate_signed_url_v2 else: @@ -638,6 +641,7 @@ def generate_signed_url( query_parameters=query_parameters, service_account_email=service_account_email, access_token=access_token, + universe_domain=universe_domain, ) @create_trace_span(name="Storage.Blob.exists") diff --git a/tests/system/conftest.py b/tests/system/conftest.py index 4ec56176d..588f66f79 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -384,3 +384,33 @@ def universe_domain_client( ) with contextlib.closing(ud_storage_client): yield ud_storage_client + + +@pytest.fixture(scope="function") +def universe_domain_bucket(universe_domain_client, test_universe_location): + bucket_name = _helpers.unique_name("gcp-systest-ud") + bucket = universe_domain_client.create_bucket( + bucket_name, location=test_universe_location + ) + + blob = bucket.blob("README.txt") + blob.upload_from_string(_helpers.signing_blob_content) + + yield bucket + + _helpers.delete_bucket(bucket) + + +@pytest.fixture(scope="function") +def universe_domain_iam_client( + test_universe_domain, test_universe_project_id, universe_domain_credential +): + from google.cloud import iam_credentials_v1 + + client_options = {"universe_domain": test_universe_domain} + iam_client = iam_credentials_v1.IAMCredentialsClient( + credentials=universe_domain_credential, + client_options=client_options, + ) + + return iam_client diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index 8bcc46abc..ee7a85fb7 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -287,6 +287,35 @@ def test_create_signed_read_url_v4_w_access_token( ) +def test_create_signed_read_url_v4_w_access_token_universe_domain( + universe_domain_iam_client, + universe_domain_client, + test_universe_location, + universe_domain_credential, + universe_domain_bucket, + no_mtls, +): + service_account_email = universe_domain_credential.service_account_email + name = path_template.expand( + "projects/{project}/serviceAccounts/{service_account}", + project="-", + service_account=service_account_email, + ) + scope = [ + "https://www.googleapis.com/auth/devstorage.read_write", + "https://www.googleapis.com/auth/iam", + ] + response = universe_domain_iam_client.generate_access_token(name=name, scope=scope) + + _create_signed_read_url_helper( + universe_domain_client, + universe_domain_bucket, + version="v4", + service_account_email=service_account_email, + access_token=response.access_token, + ) + + def _create_signed_delete_url_helper(client, bucket, version="v2", expiration=None): expiration = _morph_expiration(version, expiration) diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index b0ff4f07b..d805017b9 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -487,6 +487,8 @@ def _generate_signed_url_helper( expected_creds = credentials client = self._make_client(_credentials=object()) + expected_universe_domain = client.universe_domain + bucket = _Bucket(client) blob = self._make_one(blob_name, bucket=bucket, encryption_key=encryption_key) @@ -564,6 +566,7 @@ def _generate_signed_url_helper( "query_parameters": query_parameters, "access_token": access_token, "service_account_email": service_account_email, + "universe_domain": expected_universe_domain, } signer.assert_called_once_with(expected_creds, **expected_kwargs) From a92542715a2969e04c944acf180c468504a772b2 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 21 Nov 2024 15:56:03 -0800 Subject: [PATCH 296/509] tests: skip universe domain test in preprod (#1386) --- tests/system/test__signing.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index ee7a85fb7..cdf718d90 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -287,6 +287,10 @@ def test_create_signed_read_url_v4_w_access_token( ) +@pytest.mark.skipif( + _helpers.is_api_endpoint_override, + reason="Credentials not yet supported in preprod testing.", +) def test_create_signed_read_url_v4_w_access_token_universe_domain( universe_domain_iam_client, universe_domain_client, From 309bad16072c1d660799c2eed8f46434bc0a2f1d Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 17:28:24 -0800 Subject: [PATCH 297/509] chore(main): release 2.19.0 (#1348) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06c80ebae..9f3883ec3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,22 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [2.19.0](https://github.com/googleapis/python-storage/compare/v2.18.2...v2.19.0) (2024-11-21) + + +### Features + +* Add integration test for universe domain ([#1346](https://github.com/googleapis/python-storage/issues/1346)) ([02a972d](https://github.com/googleapis/python-storage/commit/02a972d35fae6d05edfb26381f6a71e3b8f59d6d)) +* Add restore_bucket and handling for soft-deleted buckets ([#1365](https://github.com/googleapis/python-storage/issues/1365)) ([ab94efd](https://github.com/googleapis/python-storage/commit/ab94efda83f68c974ec91d6b869b09047501031a)) +* Add support for restore token ([#1369](https://github.com/googleapis/python-storage/issues/1369)) ([06ed15b](https://github.com/googleapis/python-storage/commit/06ed15b33dc884da6dffbef5119e47f0fc4e1285)) +* IAM signBlob retry and universe domain support ([#1380](https://github.com/googleapis/python-storage/issues/1380)) ([abc8061](https://github.com/googleapis/python-storage/commit/abc80615ee00a14bc0e6b095252f6d1eb09c4b45)) + + +### Bug Fixes + +* Allow signed post policy v4 with service account and token ([#1356](https://github.com/googleapis/python-storage/issues/1356)) ([8ec02c0](https://github.com/googleapis/python-storage/commit/8ec02c0e656a4e6786f256798f4b93b95b50acec)) +* Do not spam the log with checksum related INFO messages when downloading using transfer_manager ([#1357](https://github.com/googleapis/python-storage/issues/1357)) ([42392ef](https://github.com/googleapis/python-storage/commit/42392ef8e38527ce4e50454cdd357425b3f57c87)) + ## [2.18.2](https://github.com/googleapis/python-storage/compare/v2.18.1...v2.18.2) (2024-08-08) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index bbe5b63fe..2605c08a3 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.18.2" +__version__ = "2.19.0" From 41e401689445e8abedee6334df3653f8dd6392a8 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Mon, 24 Jun 2024 13:02:59 -0700 Subject: [PATCH 298/509] chore: include google-resumable-media package as _media --- google/cloud/storage/_media/__init__.py | 61 + google/cloud/storage/_media/_download.py | 559 ++++++ google/cloud/storage/_media/_helpers.py | 434 +++++ google/cloud/storage/_media/_upload.py | 1532 ++++++++++++++++ google/cloud/storage/_media/common.py | 179 ++ google/cloud/storage/_media/py.typed | 2 + .../cloud/storage/_media/requests/__init__.py | 685 ++++++++ .../_media/requests/_request_helpers.py | 180 ++ .../cloud/storage/_media/requests/download.py | 679 ++++++++ .../cloud/storage/_media/requests/upload.py | 762 ++++++++ tests/resumable_media/__init__.py | 13 + tests/resumable_media/data/brotli.txt | 64 + tests/resumable_media/data/brotli.txt.br | Bin 0 -> 45 bytes tests/resumable_media/data/favicon.ico | Bin 0 -> 905 bytes tests/resumable_media/data/file.txt | 64 + tests/resumable_media/data/gzipped.txt | 64 + tests/resumable_media/data/gzipped.txt.gz | Bin 0 -> 89 bytes tests/resumable_media/data/image1.jpg | Bin 0 -> 1364156 bytes tests/resumable_media/data/image2.jpg | Bin 0 -> 697286 bytes tests/resumable_media/system/__init__.py | 13 + .../system/credentials.json.enc | 52 + .../system/requests/__init__.py | 13 + .../system/requests/conftest.py | 58 + .../system/requests/test_download.py | 634 +++++++ .../system/requests/test_upload.py | 776 +++++++++ tests/resumable_media/system/utils.py | 88 + tests/resumable_media/unit/__init__.py | 13 + .../resumable_media/unit/requests/__init__.py | 13 + .../unit/requests/test__helpers.py | 406 +++++ .../unit/requests/test_download.py | 1212 +++++++++++++ .../unit/requests/test_upload.py | 406 +++++ tests/resumable_media/unit/test__download.py | 754 ++++++++ tests/resumable_media/unit/test__helpers.py | 509 ++++++ tests/resumable_media/unit/test__upload.py | 1539 +++++++++++++++++ tests/resumable_media/unit/test_common.py | 85 + 35 files changed, 11849 insertions(+) create mode 100644 google/cloud/storage/_media/__init__.py create mode 100644 google/cloud/storage/_media/_download.py create mode 100644 google/cloud/storage/_media/_helpers.py create mode 100644 google/cloud/storage/_media/_upload.py create mode 100644 google/cloud/storage/_media/common.py create mode 100644 google/cloud/storage/_media/py.typed create mode 100644 google/cloud/storage/_media/requests/__init__.py create mode 100644 google/cloud/storage/_media/requests/_request_helpers.py create mode 100644 google/cloud/storage/_media/requests/download.py create mode 100644 google/cloud/storage/_media/requests/upload.py create mode 100644 tests/resumable_media/__init__.py create mode 100644 tests/resumable_media/data/brotli.txt create mode 100644 tests/resumable_media/data/brotli.txt.br create mode 100644 tests/resumable_media/data/favicon.ico create mode 100644 tests/resumable_media/data/file.txt create mode 100644 tests/resumable_media/data/gzipped.txt create mode 100644 tests/resumable_media/data/gzipped.txt.gz create mode 100644 tests/resumable_media/data/image1.jpg create mode 100644 tests/resumable_media/data/image2.jpg create mode 100644 tests/resumable_media/system/__init__.py create mode 100644 tests/resumable_media/system/credentials.json.enc create mode 100644 tests/resumable_media/system/requests/__init__.py create mode 100644 tests/resumable_media/system/requests/conftest.py create mode 100644 tests/resumable_media/system/requests/test_download.py create mode 100644 tests/resumable_media/system/requests/test_upload.py create mode 100644 tests/resumable_media/system/utils.py create mode 100644 tests/resumable_media/unit/__init__.py create mode 100644 tests/resumable_media/unit/requests/__init__.py create mode 100644 tests/resumable_media/unit/requests/test__helpers.py create mode 100644 tests/resumable_media/unit/requests/test_download.py create mode 100644 tests/resumable_media/unit/requests/test_upload.py create mode 100644 tests/resumable_media/unit/test__download.py create mode 100644 tests/resumable_media/unit/test__helpers.py create mode 100644 tests/resumable_media/unit/test__upload.py create mode 100644 tests/resumable_media/unit/test_common.py diff --git a/google/cloud/storage/_media/__init__.py b/google/cloud/storage/_media/__init__.py new file mode 100644 index 000000000..41a2064ac --- /dev/null +++ b/google/cloud/storage/_media/__init__.py @@ -0,0 +1,61 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for Google Media Downloads and Resumable Uploads. + +This package has some general purposes modules, e.g. +:mod:`~google.resumable_media.common`, but the majority of the +public interface will be contained in subpackages. + +=========== +Subpackages +=========== + +Each subpackage is tailored to a specific transport library: + +* the :mod:`~google.resumable_media.requests` subpackage uses the ``requests`` + transport library. + +.. _requests: http://docs.python-requests.org/ + +========== +Installing +========== + +To install with `pip`_: + +.. code-block:: console + + $ pip install --upgrade google-resumable-media + +.. _pip: https://pip.pypa.io/ +""" + + +from google.resumable_media.common import DataCorruption +from google.resumable_media.common import InvalidResponse +from google.resumable_media.common import PERMANENT_REDIRECT +from google.resumable_media.common import RetryStrategy +from google.resumable_media.common import TOO_MANY_REQUESTS +from google.resumable_media.common import UPLOAD_CHUNK_SIZE + + +__all__ = [ + "DataCorruption", + "InvalidResponse", + "PERMANENT_REDIRECT", + "RetryStrategy", + "TOO_MANY_REQUESTS", + "UPLOAD_CHUNK_SIZE", +] diff --git a/google/cloud/storage/_media/_download.py b/google/cloud/storage/_media/_download.py new file mode 100644 index 000000000..7958e3c0a --- /dev/null +++ b/google/cloud/storage/_media/_download.py @@ -0,0 +1,559 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Virtual bases classes for downloading media from Google APIs.""" + + +import http.client +import re + +from google.resumable_media import _helpers +from google.resumable_media import common + + +_CONTENT_RANGE_RE = re.compile( + r"bytes (?P\d+)-(?P\d+)/(?P\d+)", + flags=re.IGNORECASE, +) +_ACCEPTABLE_STATUS_CODES = (http.client.OK, http.client.PARTIAL_CONTENT) +_GET = "GET" +_ZERO_CONTENT_RANGE_HEADER = "bytes */0" + + +class DownloadBase(object): + """Base class for download helpers. + + Defines core shared behavior across different download types. + + Args: + media_url (str): The URL containing the media to be downloaded. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + the downloaded resource can be written to. + start (int): The first byte in a range to be downloaded. + end (int): The last byte in a range to be downloaded. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + + Attributes: + media_url (str): The URL containing the media to be downloaded. + start (Optional[int]): The first byte in a range to be downloaded. + end (Optional[int]): The last byte in a range to be downloaded. + """ + + def __init__(self, media_url, stream=None, start=None, end=None, headers=None): + self.media_url = media_url + self._stream = stream + self.start = start + self.end = end + if headers is None: + headers = {} + self._headers = headers + self._finished = False + self._retry_strategy = common.RetryStrategy() + + @property + def finished(self): + """bool: Flag indicating if the download has completed.""" + return self._finished + + @staticmethod + def _get_status_code(response): + """Access the status code from an HTTP response. + + Args: + response (object): The HTTP response object. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + @staticmethod + def _get_headers(response): + """Access the headers from an HTTP response. + + Args: + response (object): The HTTP response object. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + @staticmethod + def _get_body(response): + """Access the response body from an HTTP response. + + Args: + response (object): The HTTP response object. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class Download(DownloadBase): + """Helper to manage downloading a resource from a Google API. + + "Slices" of the resource can be retrieved by specifying a range + with ``start`` and / or ``end``. However, in typical usage, neither + ``start`` nor ``end`` is expected to be provided. + + Args: + media_url (str): The URL containing the media to be downloaded. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + the downloaded resource can be written to. + start (int): The first byte in a range to be downloaded. If not + provided, but ``end`` is provided, will download from the + beginning to ``end`` of the media. + end (int): The last byte in a range to be downloaded. If not + provided, but ``start`` is provided, will download from the + ``start`` to the end of the media. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + checksum Optional([str]): The type of checksum to compute to verify + the integrity of the object. The response headers must contain + a checksum of the requested type. If the headers lack an + appropriate checksum (for instance in the case of transcoded or + ranged downloads where the remote service does not know the + correct checksum) an INFO-level log will be emitted. Supported + values are "md5", "crc32c" and None. + """ + + def __init__( + self, media_url, stream=None, start=None, end=None, headers=None, checksum="md5" + ): + super(Download, self).__init__( + media_url, stream=stream, start=start, end=end, headers=headers + ) + self.checksum = checksum + self._bytes_downloaded = 0 + self._expected_checksum = None + self._checksum_object = None + self._object_generation = None + + def _prepare_request(self): + """Prepare the contents of an HTTP request. + + This is everything that must be done before a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Returns: + Tuple[str, str, NoneType, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always GET) + * the URL for the request + * the body of the request (always :data:`None`) + * headers for the request + + Raises: + ValueError: If the current :class:`Download` has already + finished. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.finished: + raise ValueError("A download can only be used once.") + + add_bytes_range(self.start, self.end, self._headers) + return _GET, self.media_url, None, self._headers + + def _process_response(self, response): + """Process the response from an HTTP request. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + # Tombstone the current Download so it cannot be used again. + self._finished = True + _helpers.require_status_code( + response, _ACCEPTABLE_STATUS_CODES, self._get_status_code + ) + + def consume(self, transport, timeout=None): + """Consume the resource to be downloaded. + + If a ``stream`` is attached to this download, then the downloaded + resource will be written to the stream. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class ChunkedDownload(DownloadBase): + """Download a resource in chunks from a Google API. + + Args: + media_url (str): The URL containing the media to be downloaded. + chunk_size (int): The number of bytes to be retrieved in each + request. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + will be used to concatenate chunks of the resource as they are + downloaded. + start (int): The first byte in a range to be downloaded. If not + provided, defaults to ``0``. + end (int): The last byte in a range to be downloaded. If not + provided, will download to the end of the media. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with each request, e.g. headers for data encryption + key headers. + + Attributes: + media_url (str): The URL containing the media to be downloaded. + start (Optional[int]): The first byte in a range to be downloaded. + end (Optional[int]): The last byte in a range to be downloaded. + chunk_size (int): The number of bytes to be retrieved in each request. + + Raises: + ValueError: If ``start`` is negative. + """ + + def __init__(self, media_url, chunk_size, stream, start=0, end=None, headers=None): + if start < 0: + raise ValueError( + "On a chunked download the starting " "value cannot be negative." + ) + super(ChunkedDownload, self).__init__( + media_url, stream=stream, start=start, end=end, headers=headers + ) + self.chunk_size = chunk_size + self._bytes_downloaded = 0 + self._total_bytes = None + self._invalid = False + + @property + def bytes_downloaded(self): + """int: Number of bytes that have been downloaded.""" + return self._bytes_downloaded + + @property + def total_bytes(self): + """Optional[int]: The total number of bytes to be downloaded.""" + return self._total_bytes + + @property + def invalid(self): + """bool: Indicates if the download is in an invalid state. + + This will occur if a call to :meth:`consume_next_chunk` fails. + """ + return self._invalid + + def _get_byte_range(self): + """Determines the byte range for the next request. + + Returns: + Tuple[int, int]: The pair of begin and end byte for the next + chunked request. + """ + curr_start = self.start + self.bytes_downloaded + curr_end = curr_start + self.chunk_size - 1 + # Make sure ``curr_end`` does not exceed ``end``. + if self.end is not None: + curr_end = min(curr_end, self.end) + # Make sure ``curr_end`` does not exceed ``total_bytes - 1``. + if self.total_bytes is not None: + curr_end = min(curr_end, self.total_bytes - 1) + return curr_start, curr_end + + def _prepare_request(self): + """Prepare the contents of an HTTP request. + + This is everything that must be done before a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + .. note: + + This method will be used multiple times, so ``headers`` will + be mutated in between requests. However, we don't make a copy + since the same keys are being updated. + + Returns: + Tuple[str, str, NoneType, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always GET) + * the URL for the request + * the body of the request (always :data:`None`) + * headers for the request + + Raises: + ValueError: If the current download has finished. + ValueError: If the current download is invalid. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.finished: + raise ValueError("Download has finished.") + if self.invalid: + raise ValueError("Download is invalid and cannot be re-used.") + + curr_start, curr_end = self._get_byte_range() + add_bytes_range(curr_start, curr_end, self._headers) + return _GET, self.media_url, None, self._headers + + def _make_invalid(self): + """Simple setter for ``invalid``. + + This is intended to be passed along as a callback to helpers that + raise an exception so they can mark this instance as invalid before + raising. + """ + self._invalid = True + + def _process_response(self, response): + """Process the response from an HTTP request. + + This is everything that must be done after a request that doesn't + require network I/O. This is based on the `sans-I/O`_ philosophy. + + For the time being, this **does require** some form of I/O to write + a chunk to ``stream``. However, this will (almost) certainly not be + network I/O. + + Updates the current state after consuming a chunk. First, + increments ``bytes_downloaded`` by the number of bytes in the + ``content-length`` header. + + If ``total_bytes`` is already set, this assumes (but does not check) + that we already have the correct value and doesn't bother to check + that it agrees with the headers. + + We expect the **total** length to be in the ``content-range`` header, + but this header is only present on requests which sent the ``range`` + header. This response header should be of the form + ``bytes {start}-{end}/{total}`` and ``{end} - {start} + 1`` + should be the same as the ``Content-Length``. + + Args: + response (object): The HTTP response object (need headers). + + Raises: + ~google.resumable_media.common.InvalidResponse: If the number + of bytes in the body doesn't match the content length header. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + # Verify the response before updating the current instance. + if _check_for_zero_content_range( + response, self._get_status_code, self._get_headers + ): + self._finished = True + return + + _helpers.require_status_code( + response, + _ACCEPTABLE_STATUS_CODES, + self._get_status_code, + callback=self._make_invalid, + ) + headers = self._get_headers(response) + response_body = self._get_body(response) + + start_byte, end_byte, total_bytes = get_range_info( + response, self._get_headers, callback=self._make_invalid + ) + + transfer_encoding = headers.get("transfer-encoding") + + if transfer_encoding is None: + content_length = _helpers.header_required( + response, + "content-length", + self._get_headers, + callback=self._make_invalid, + ) + num_bytes = int(content_length) + if len(response_body) != num_bytes: + self._make_invalid() + raise common.InvalidResponse( + response, + "Response is different size than content-length", + "Expected", + num_bytes, + "Received", + len(response_body), + ) + else: + # 'content-length' header not allowed with chunked encoding. + num_bytes = end_byte - start_byte + 1 + + # First update ``bytes_downloaded``. + self._bytes_downloaded += num_bytes + # If the end byte is past ``end`` or ``total_bytes - 1`` we are done. + if self.end is not None and end_byte >= self.end: + self._finished = True + elif end_byte >= total_bytes - 1: + self._finished = True + # NOTE: We only use ``total_bytes`` if not already known. + if self.total_bytes is None: + self._total_bytes = total_bytes + # Write the response body to the stream. + self._stream.write(response_body) + + def consume_next_chunk(self, transport, timeout=None): + """Consume the next chunk of the resource to be downloaded. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +def add_bytes_range(start, end, headers): + """Add a bytes range to a header dictionary. + + Some possible inputs and the corresponding bytes ranges:: + + >>> headers = {} + >>> add_bytes_range(None, None, headers) + >>> headers + {} + >>> add_bytes_range(500, 999, headers) + >>> headers['range'] + 'bytes=500-999' + >>> add_bytes_range(None, 499, headers) + >>> headers['range'] + 'bytes=0-499' + >>> add_bytes_range(-500, None, headers) + >>> headers['range'] + 'bytes=-500' + >>> add_bytes_range(9500, None, headers) + >>> headers['range'] + 'bytes=9500-' + + Args: + start (Optional[int]): The first byte in a range. Can be zero, + positive, negative or :data:`None`. + end (Optional[int]): The last byte in a range. Assumed to be + positive. + headers (Mapping[str, str]): A headers mapping which can have the + bytes range added if at least one of ``start`` or ``end`` + is not :data:`None`. + """ + if start is None: + if end is None: + # No range to add. + return + else: + # NOTE: This assumes ``end`` is non-negative. + bytes_range = "0-{:d}".format(end) + else: + if end is None: + if start < 0: + bytes_range = "{:d}".format(start) + else: + bytes_range = "{:d}-".format(start) + else: + # NOTE: This is invalid if ``start < 0``. + bytes_range = "{:d}-{:d}".format(start, end) + + headers[_helpers.RANGE_HEADER] = "bytes=" + bytes_range + + +def get_range_info(response, get_headers, callback=_helpers.do_nothing): + """Get the start, end and total bytes from a content range header. + + Args: + response (object): An HTTP response object. + get_headers (Callable[Any, Mapping[str, str]]): Helper to get headers + from an HTTP response. + callback (Optional[Callable]): A callback that takes no arguments, + to be executed when an exception is being raised. + + Returns: + Tuple[int, int, int]: The start byte, end byte and total bytes. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the + ``Content-Range`` header is not of the form + ``bytes {start}-{end}/{total}``. + """ + content_range = _helpers.header_required( + response, _helpers.CONTENT_RANGE_HEADER, get_headers, callback=callback + ) + match = _CONTENT_RANGE_RE.match(content_range) + if match is None: + callback() + raise common.InvalidResponse( + response, + "Unexpected content-range header", + content_range, + 'Expected to be of the form "bytes {start}-{end}/{total}"', + ) + + return ( + int(match.group("start_byte")), + int(match.group("end_byte")), + int(match.group("total_bytes")), + ) + + +def _check_for_zero_content_range(response, get_status_code, get_headers): + """Validate if response status code is 416 and content range is zero. + + This is the special case for handling zero bytes files. + + Args: + response (object): An HTTP response object. + get_status_code (Callable[Any, int]): Helper to get a status code + from a response. + get_headers (Callable[Any, Mapping[str, str]]): Helper to get headers + from an HTTP response. + + Returns: + bool: True if content range total bytes is zero, false otherwise. + """ + if get_status_code(response) == http.client.REQUESTED_RANGE_NOT_SATISFIABLE: + content_range = _helpers.header_required( + response, + _helpers.CONTENT_RANGE_HEADER, + get_headers, + callback=_helpers.do_nothing, + ) + if content_range == _ZERO_CONTENT_RANGE_HEADER: + return True + return False diff --git a/google/cloud/storage/_media/_helpers.py b/google/cloud/storage/_media/_helpers.py new file mode 100644 index 000000000..1eb4711a2 --- /dev/null +++ b/google/cloud/storage/_media/_helpers.py @@ -0,0 +1,434 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Shared utilities used by both downloads and uploads.""" + +from __future__ import absolute_import + +import base64 +import hashlib +import logging +import random +import warnings + +from urllib.parse import parse_qs +from urllib.parse import urlencode +from urllib.parse import urlsplit +from urllib.parse import urlunsplit + +from google.resumable_media import common + + +RANGE_HEADER = "range" +CONTENT_RANGE_HEADER = "content-range" +CONTENT_ENCODING_HEADER = "content-encoding" + +_SLOW_CRC32C_WARNING = ( + "Currently using crcmod in pure python form. This is a slow " + "implementation. Python 3 has a faster implementation, `google-crc32c`, " + "which will be used if it is installed." +) +_GENERATION_HEADER = "x-goog-generation" +_HASH_HEADER = "x-goog-hash" +_STORED_CONTENT_ENCODING_HEADER = "x-goog-stored-content-encoding" + +_MISSING_CHECKSUM = """\ +No {checksum_type} checksum was returned from the service while downloading {} +(which happens for composite objects), so client-side content integrity +checking is not being performed.""" +_LOGGER = logging.getLogger(__name__) + + +def do_nothing(): + """Simple default callback.""" + + +def header_required(response, name, get_headers, callback=do_nothing): + """Checks that a specific header is in a headers dictionary. + + Args: + response (object): An HTTP response object, expected to have a + ``headers`` attribute that is a ``Mapping[str, str]``. + name (str): The name of a required header. + get_headers (Callable[Any, Mapping[str, str]]): Helper to get headers + from an HTTP response. + callback (Optional[Callable]): A callback that takes no arguments, + to be executed when an exception is being raised. + + Returns: + str: The desired header. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the header + is missing. + """ + headers = get_headers(response) + if name not in headers: + callback() + raise common.InvalidResponse( + response, "Response headers must contain header", name + ) + + return headers[name] + + +def require_status_code(response, status_codes, get_status_code, callback=do_nothing): + """Require a response has a status code among a list. + + Args: + response (object): The HTTP response object. + status_codes (tuple): The acceptable status codes. + get_status_code (Callable[Any, int]): Helper to get a status code + from a response. + callback (Optional[Callable]): A callback that takes no arguments, + to be executed when an exception is being raised. + + Returns: + int: The status code. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status code + is not one of the values in ``status_codes``. + """ + status_code = get_status_code(response) + if status_code not in status_codes: + if status_code not in common.RETRYABLE: + callback() + raise common.InvalidResponse( + response, + "Request failed with status code", + status_code, + "Expected one of", + *status_codes + ) + return status_code + + +def calculate_retry_wait(base_wait, max_sleep, multiplier=2.0): + """Calculate the amount of time to wait before a retry attempt. + + Wait time grows exponentially with the number of attempts, until + ``max_sleep``. + + A random amount of jitter (between 0 and 1 seconds) is added to spread out + retry attempts from different clients. + + Args: + base_wait (float): The "base" wait time (i.e. without any jitter) + that will be multiplied until it reaches the maximum sleep. + max_sleep (float): Maximum value that a sleep time is allowed to be. + multiplier (float): Multiplier to apply to the base wait. + + Returns: + Tuple[float, float]: The new base wait time as well as the wait time + to be applied (with a random amount of jitter between 0 and 1 seconds + added). + """ + new_base_wait = multiplier * base_wait + if new_base_wait > max_sleep: + new_base_wait = max_sleep + + jitter_ms = random.randint(0, 1000) + return new_base_wait, new_base_wait + 0.001 * jitter_ms + + +def _get_crc32c_object(): + """Get crc32c object + Attempt to use the Google-CRC32c package. If it isn't available, try + to use CRCMod. CRCMod might be using a 'slow' varietal. If so, warn... + """ + try: + import google_crc32c # type: ignore + + crc_obj = google_crc32c.Checksum() + except ImportError: + try: + import crcmod # type: ignore + + crc_obj = crcmod.predefined.Crc("crc-32c") + _is_fast_crcmod() + + except ImportError: + raise ImportError("Failed to import either `google-crc32c` or `crcmod`") + + return crc_obj + + +def _is_fast_crcmod(): + # Determine if this is using the slow form of crcmod. + nested_crcmod = __import__( + "crcmod.crcmod", + globals(), + locals(), + ["_usingExtension"], + 0, + ) + fast_crc = getattr(nested_crcmod, "_usingExtension", False) + if not fast_crc: + warnings.warn(_SLOW_CRC32C_WARNING, RuntimeWarning, stacklevel=2) + return fast_crc + + +def _get_metadata_key(checksum_type): + if checksum_type == "md5": + return "md5Hash" + else: + return checksum_type + + +def prepare_checksum_digest(digest_bytestring): + """Convert a checksum object into a digest encoded for an HTTP header. + + Args: + bytes: A checksum digest bytestring. + + Returns: + str: A base64 string representation of the input. + """ + encoded_digest = base64.b64encode(digest_bytestring) + # NOTE: ``b64encode`` returns ``bytes``, but HTTP headers expect ``str``. + return encoded_digest.decode("utf-8") + + +def _get_expected_checksum(response, get_headers, media_url, checksum_type): + """Get the expected checksum and checksum object for the download response. + + Args: + response (~requests.Response): The HTTP response object. + get_headers (callable: response->dict): returns response headers. + media_url (str): The URL containing the media to be downloaded. + checksum_type Optional(str): The checksum type to read from the headers, + exactly as it will appear in the headers (case-sensitive). Must be + "md5", "crc32c" or None. + + Returns: + Tuple (Optional[str], object): The expected checksum of the response, + if it can be detected from the ``X-Goog-Hash`` header, and the + appropriate checksum object for the expected checksum. + """ + if checksum_type not in ["md5", "crc32c", None]: + raise ValueError("checksum must be ``'md5'``, ``'crc32c'`` or ``None``") + elif checksum_type in ["md5", "crc32c"]: + headers = get_headers(response) + expected_checksum = _parse_checksum_header( + headers.get(_HASH_HEADER), response, checksum_label=checksum_type + ) + + if expected_checksum is None: + msg = _MISSING_CHECKSUM.format( + media_url, checksum_type=checksum_type.upper() + ) + _LOGGER.info(msg) + checksum_object = _DoNothingHash() + else: + if checksum_type == "md5": + checksum_object = hashlib.md5() + else: + checksum_object = _get_crc32c_object() + else: + expected_checksum = None + checksum_object = _DoNothingHash() + + return (expected_checksum, checksum_object) + + +def _get_uploaded_checksum_from_headers(response, get_headers, checksum_type): + """Get the computed checksum and checksum object from the response headers. + + Args: + response (~requests.Response): The HTTP response object. + get_headers (callable: response->dict): returns response headers. + checksum_type Optional(str): The checksum type to read from the headers, + exactly as it will appear in the headers (case-sensitive). Must be + "md5", "crc32c" or None. + + Returns: + Tuple (Optional[str], object): The checksum of the response, + if it can be detected from the ``X-Goog-Hash`` header, and the + appropriate checksum object for the expected checksum. + """ + if checksum_type not in ["md5", "crc32c", None]: + raise ValueError("checksum must be ``'md5'``, ``'crc32c'`` or ``None``") + elif checksum_type in ["md5", "crc32c"]: + headers = get_headers(response) + remote_checksum = _parse_checksum_header( + headers.get(_HASH_HEADER), response, checksum_label=checksum_type + ) + else: + remote_checksum = None + + return remote_checksum + + +def _parse_checksum_header(header_value, response, checksum_label): + """Parses the checksum header from an ``X-Goog-Hash`` value. + + .. _header reference: https://cloud.google.com/storage/docs/\ + xml-api/reference-headers#xgooghash + + Expects ``header_value`` (if not :data:`None`) to be in one of the three + following formats: + + * ``crc32c=n03x6A==`` + * ``md5=Ojk9c3dhfxgoKVVHYwFbHQ==`` + * ``crc32c=n03x6A==,md5=Ojk9c3dhfxgoKVVHYwFbHQ==`` + + See the `header reference`_ for more information. + + Args: + header_value (Optional[str]): The ``X-Goog-Hash`` header from + a download response. + response (~requests.Response): The HTTP response object. + checksum_label (str): The label of the header value to read, as in the + examples above. Typically "md5" or "crc32c" + + Returns: + Optional[str]: The expected checksum of the response, if it + can be detected from the ``X-Goog-Hash`` header; otherwise, None. + + Raises: + ~google.resumable_media.common.InvalidResponse: If there are + multiple checksums of the requested type in ``header_value``. + """ + if header_value is None: + return None + + matches = [] + for checksum in header_value.split(","): + name, value = checksum.split("=", 1) + # Official docs say "," is the separator, but real-world responses have encountered ", " + if name.lstrip() == checksum_label: + matches.append(value) + + if len(matches) == 0: + return None + elif len(matches) == 1: + return matches[0] + else: + raise common.InvalidResponse( + response, + "X-Goog-Hash header had multiple ``{}`` values.".format(checksum_label), + header_value, + matches, + ) + + +def _get_checksum_object(checksum_type): + """Respond with a checksum object for a supported type, if not None. + + Raises ValueError if checksum_type is unsupported. + """ + if checksum_type == "md5": + return hashlib.md5() + elif checksum_type == "crc32c": + return _get_crc32c_object() + elif checksum_type is None: + return None + else: + raise ValueError("checksum must be ``'md5'``, ``'crc32c'`` or ``None``") + + +def _parse_generation_header(response, get_headers): + """Parses the generation header from an ``X-Goog-Generation`` value. + + Args: + response (~requests.Response): The HTTP response object. + get_headers (callable: response->dict): returns response headers. + + Returns: + Optional[long]: The object generation from the response, if it + can be detected from the ``X-Goog-Generation`` header; otherwise, None. + """ + headers = get_headers(response) + object_generation = headers.get(_GENERATION_HEADER, None) + + if object_generation is None: + return None + else: + return int(object_generation) + + +def _get_generation_from_url(media_url): + """Retrieve the object generation query param specified in the media url. + + Args: + media_url (str): The URL containing the media to be downloaded. + + Returns: + long: The object generation from the media url if exists; otherwise, None. + """ + + _, _, _, query, _ = urlsplit(media_url) + query_params = parse_qs(query) + object_generation = query_params.get("generation", None) + + if object_generation is None: + return None + else: + return int(object_generation[0]) + + +def add_query_parameters(media_url, query_params): + """Add query parameters to a base url. + + Args: + media_url (str): The URL containing the media to be downloaded. + query_params (dict): Names and values of the query parameters to add. + + Returns: + str: URL with additional query strings appended. + """ + + if len(query_params) == 0: + return media_url + + scheme, netloc, path, query, frag = urlsplit(media_url) + params = parse_qs(query) + new_params = {**params, **query_params} + query = urlencode(new_params, doseq=True) + return urlunsplit((scheme, netloc, path, query, frag)) + + +def _is_decompressive_transcoding(response, get_headers): + """Returns True if the object was served decompressed. This happens when the + "x-goog-stored-content-encoding" header is "gzip" and "content-encoding" header + is not "gzip". See more at: https://cloud.google.com/storage/docs/transcoding#transcoding_and_gzip + Args: + response (~requests.Response): The HTTP response object. + get_headers (callable: response->dict): returns response headers. + Returns: + bool: Returns True if decompressive transcoding has occurred; otherwise, False. + """ + headers = get_headers(response) + return ( + headers.get(_STORED_CONTENT_ENCODING_HEADER) == "gzip" + and headers.get(CONTENT_ENCODING_HEADER) != "gzip" + ) + + +class _DoNothingHash(object): + """Do-nothing hash object. + + Intended as a stand-in for ``hashlib.md5`` or a crc32c checksum + implementation in cases where it isn't necessary to compute the hash. + """ + + def update(self, unused_chunk): + """Do-nothing ``update`` method. + + Intended to match the interface of ``hashlib.md5`` and other checksums. + + Args: + unused_chunk (bytes): A chunk of data. + """ diff --git a/google/cloud/storage/_media/_upload.py b/google/cloud/storage/_media/_upload.py new file mode 100644 index 000000000..2867bf550 --- /dev/null +++ b/google/cloud/storage/_media/_upload.py @@ -0,0 +1,1532 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Virtual bases classes for uploading media via Google APIs. + +Supported here are: + +* simple (media) uploads +* multipart uploads that contain both metadata and a small file as payload +* resumable uploads (with metadata as well) +""" + +import http.client +import json +import os +import random +import re +import sys +import urllib.parse + +from google import resumable_media +from google.resumable_media import _helpers +from google.resumable_media import common + +from xml.etree import ElementTree + + +_CONTENT_TYPE_HEADER = "content-type" +_CONTENT_RANGE_TEMPLATE = "bytes {:d}-{:d}/{:d}" +_RANGE_UNKNOWN_TEMPLATE = "bytes {:d}-{:d}/*" +_EMPTY_RANGE_TEMPLATE = "bytes */{:d}" +_BOUNDARY_WIDTH = len(str(sys.maxsize - 1)) +_BOUNDARY_FORMAT = "==============={{:0{:d}d}}==".format(_BOUNDARY_WIDTH) +_MULTIPART_SEP = b"--" +_CRLF = b"\r\n" +_MULTIPART_BEGIN = b"\r\ncontent-type: application/json; charset=UTF-8\r\n\r\n" +_RELATED_HEADER = b'multipart/related; boundary="' +_BYTES_RANGE_RE = re.compile(r"bytes=0-(?P\d+)", flags=re.IGNORECASE) +_STREAM_ERROR_TEMPLATE = ( + "Bytes stream is in unexpected state. " + "The local stream has had {:d} bytes read from it while " + "{:d} bytes have already been updated (they should match)." +) +_STREAM_READ_PAST_TEMPLATE = ( + "{:d} bytes have been read from the stream, which exceeds " + "the expected total {:d}." +) +_DELETE = "DELETE" +_POST = "POST" +_PUT = "PUT" +_UPLOAD_CHECKSUM_MISMATCH_MESSAGE = ( + "The computed ``{}`` checksum, ``{}``, and the checksum reported by the " + "remote host, ``{}``, did not match." +) +_UPLOAD_METADATA_NO_APPROPRIATE_CHECKSUM_MESSAGE = ( + "Response metadata had no ``{}`` value; checksum could not be validated." +) +_UPLOAD_HEADER_NO_APPROPRIATE_CHECKSUM_MESSAGE = ( + "Response headers had no ``{}`` value; checksum could not be validated." +) +_MPU_INITIATE_QUERY = "?uploads" +_MPU_PART_QUERY_TEMPLATE = "?partNumber={part}&uploadId={upload_id}" +_S3_COMPAT_XML_NAMESPACE = "{http://s3.amazonaws.com/doc/2006-03-01/}" +_UPLOAD_ID_NODE = "UploadId" +_MPU_FINAL_QUERY_TEMPLATE = "?uploadId={upload_id}" + + +class UploadBase(object): + """Base class for upload helpers. + + Defines core shared behavior across different upload types. + + Args: + upload_url (str): The URL where the content will be uploaded. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + """ + + def __init__(self, upload_url, headers=None): + self.upload_url = upload_url + if headers is None: + headers = {} + self._headers = headers + self._finished = False + self._retry_strategy = common.RetryStrategy() + + @property + def finished(self): + """bool: Flag indicating if the upload has completed.""" + return self._finished + + def _process_response(self, response): + """Process the response from an HTTP request. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 200. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + # Tombstone the current upload so it cannot be used again (in either + # failure or success). + self._finished = True + _helpers.require_status_code(response, (http.client.OK,), self._get_status_code) + + @staticmethod + def _get_status_code(response): + """Access the status code from an HTTP response. + + Args: + response (object): The HTTP response object. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + @staticmethod + def _get_headers(response): + """Access the headers from an HTTP response. + + Args: + response (object): The HTTP response object. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + @staticmethod + def _get_body(response): + """Access the response body from an HTTP response. + + Args: + response (object): The HTTP response object. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class SimpleUpload(UploadBase): + """Upload a resource to a Google API. + + A **simple** media upload sends no metadata and completes the upload + in a single request. + + Args: + upload_url (str): The URL where the content will be uploaded. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + """ + + def _prepare_request(self, data, content_type): + """Prepare the contents of an HTTP request. + + This is everything that must be done before a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + .. note: + + This method will be used only once, so ``headers`` will be + mutated by having a new key added to it. + + Args: + data (bytes): The resource content to be uploaded. + content_type (str): The content type for the request. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always POST) + * the URL for the request + * the body of the request + * headers for the request + + Raises: + ValueError: If the current upload has already finished. + TypeError: If ``data`` isn't bytes. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.finished: + raise ValueError("An upload can only be used once.") + + if not isinstance(data, bytes): + raise TypeError("`data` must be bytes, received", type(data)) + self._headers[_CONTENT_TYPE_HEADER] = content_type + return _POST, self.upload_url, data, self._headers + + def transmit(self, transport, data, content_type, timeout=None): + """Transmit the resource to be uploaded. + + Args: + transport (object): An object which can make authenticated + requests. + data (bytes): The resource content to be uploaded. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class MultipartUpload(UploadBase): + """Upload a resource with metadata to a Google API. + + A **multipart** upload sends both metadata and the resource in a single + (multipart) request. + + Args: + upload_url (str): The URL where the content will be uploaded. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + checksum (Optional([str])): The type of checksum to compute to verify + the integrity of the object. The request metadata will be amended + to include the computed value. Using this option will override a + manually-set checksum value. Supported values are "md5", "crc32c" + and None. The default is None. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + """ + + def __init__(self, upload_url, headers=None, checksum=None): + super(MultipartUpload, self).__init__(upload_url, headers=headers) + self._checksum_type = checksum + + def _prepare_request(self, data, metadata, content_type): + """Prepare the contents of an HTTP request. + + This is everything that must be done before a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + .. note: + + This method will be used only once, so ``headers`` will be + mutated by having a new key added to it. + + Args: + data (bytes): The resource content to be uploaded. + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always POST) + * the URL for the request + * the body of the request + * headers for the request + + Raises: + ValueError: If the current upload has already finished. + TypeError: If ``data`` isn't bytes. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.finished: + raise ValueError("An upload can only be used once.") + + if not isinstance(data, bytes): + raise TypeError("`data` must be bytes, received", type(data)) + + checksum_object = _helpers._get_checksum_object(self._checksum_type) + if checksum_object is not None: + checksum_object.update(data) + actual_checksum = _helpers.prepare_checksum_digest(checksum_object.digest()) + metadata_key = _helpers._get_metadata_key(self._checksum_type) + metadata[metadata_key] = actual_checksum + + content, multipart_boundary = construct_multipart_request( + data, metadata, content_type + ) + multipart_content_type = _RELATED_HEADER + multipart_boundary + b'"' + self._headers[_CONTENT_TYPE_HEADER] = multipart_content_type + + return _POST, self.upload_url, content, self._headers + + def transmit(self, transport, data, metadata, content_type, timeout=None): + """Transmit the resource to be uploaded. + + Args: + transport (object): An object which can make authenticated + requests. + data (bytes): The resource content to be uploaded. + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class ResumableUpload(UploadBase): + """Initiate and fulfill a resumable upload to a Google API. + + A **resumable** upload sends an initial request with the resource metadata + and then gets assigned an upload ID / upload URL to send bytes to. + Using the upload URL, the upload is then done in chunks (determined by + the user) until all bytes have been uploaded. + + Args: + upload_url (str): The URL where the resumable upload will be initiated. + chunk_size (int): The size of each chunk used to upload the resource. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with every request. + checksum (Optional([str])): The type of checksum to compute to verify + the integrity of the object. After the upload is complete, the + server-computed checksum of the resulting object will be read + and google.resumable_media.common.DataCorruption will be raised on + a mismatch. The corrupted file will not be deleted from the remote + host automatically. Supported values are "md5", "crc32c" and None. + The default is None. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + + Raises: + ValueError: If ``chunk_size`` is not a multiple of + :data:`.UPLOAD_CHUNK_SIZE`. + """ + + def __init__(self, upload_url, chunk_size, checksum=None, headers=None): + super(ResumableUpload, self).__init__(upload_url, headers=headers) + if chunk_size % resumable_media.UPLOAD_CHUNK_SIZE != 0: + raise ValueError( + "{} KB must divide chunk size".format( + resumable_media.UPLOAD_CHUNK_SIZE / 1024 + ) + ) + self._chunk_size = chunk_size + self._stream = None + self._content_type = None + self._bytes_uploaded = 0 + self._bytes_checksummed = 0 + self._checksum_type = checksum + self._checksum_object = None + self._total_bytes = None + self._resumable_url = None + self._invalid = False + + @property + def invalid(self): + """bool: Indicates if the upload is in an invalid state. + + This will occur if a call to :meth:`transmit_next_chunk` fails. + To recover from such a failure, call :meth:`recover`. + """ + return self._invalid + + @property + def chunk_size(self): + """int: The size of each chunk used to upload the resource.""" + return self._chunk_size + + @property + def resumable_url(self): + """Optional[str]: The URL of the in-progress resumable upload.""" + return self._resumable_url + + @property + def bytes_uploaded(self): + """int: Number of bytes that have been uploaded.""" + return self._bytes_uploaded + + @property + def total_bytes(self): + """Optional[int]: The total number of bytes to be uploaded. + + If this upload is initiated (via :meth:`initiate`) with + ``stream_final=True``, this value will be populated based on the size + of the ``stream`` being uploaded. (By default ``stream_final=True``.) + + If this upload is initiated with ``stream_final=False``, + :attr:`total_bytes` will be :data:`None` since it cannot be + determined from the stream. + """ + return self._total_bytes + + def _prepare_initiate_request( + self, stream, metadata, content_type, total_bytes=None, stream_final=True + ): + """Prepare the contents of HTTP request to initiate upload. + + This is everything that must be done before a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + stream (IO[bytes]): The stream (i.e. file-like object) that will + be uploaded. The stream **must** be at the beginning (i.e. + ``stream.tell() == 0``). + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + total_bytes (Optional[int]): The total number of bytes to be + uploaded. If specified, the upload size **will not** be + determined from the stream (even if ``stream_final=True``). + stream_final (Optional[bool]): Indicates if the ``stream`` is + "final" (i.e. no more bytes will be added to it). In this case + we determine the upload size from the size of the stream. If + ``total_bytes`` is passed, this argument will be ignored. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always POST) + * the URL for the request + * the body of the request + * headers for the request + + Raises: + ValueError: If the current upload has already been initiated. + ValueError: If ``stream`` is not at the beginning. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.resumable_url is not None: + raise ValueError("This upload has already been initiated.") + if stream.tell() != 0: + raise ValueError("Stream must be at beginning.") + + self._stream = stream + self._content_type = content_type + + # Signed URL requires content type set directly - not through x-upload-content-type + parse_result = urllib.parse.urlparse(self.upload_url) + parsed_query = urllib.parse.parse_qs(parse_result.query) + if "x-goog-signature" in parsed_query or "X-Goog-Signature" in parsed_query: + # Deconstruct **self._headers first so that content type defined here takes priority + headers = {**self._headers, _CONTENT_TYPE_HEADER: content_type} + else: + # Deconstruct **self._headers first so that content type defined here takes priority + headers = { + **self._headers, + _CONTENT_TYPE_HEADER: "application/json; charset=UTF-8", + "x-upload-content-type": content_type, + } + # Set the total bytes if possible. + if total_bytes is not None: + self._total_bytes = total_bytes + elif stream_final: + self._total_bytes = get_total_bytes(stream) + # Add the total bytes to the headers if set. + if self._total_bytes is not None: + content_length = "{:d}".format(self._total_bytes) + headers["x-upload-content-length"] = content_length + + payload = json.dumps(metadata).encode("utf-8") + return _POST, self.upload_url, payload, headers + + def _process_initiate_response(self, response): + """Process the response from an HTTP request that initiated upload. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + This method takes the URL from the ``Location`` header and stores it + for future use. Within that URL, we assume the ``upload_id`` query + parameter has been included, but we do not check. + + Args: + response (object): The HTTP response object (need headers). + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + _helpers.require_status_code( + response, + (http.client.OK, http.client.CREATED), + self._get_status_code, + callback=self._make_invalid, + ) + self._resumable_url = _helpers.header_required( + response, "location", self._get_headers + ) + + def initiate( + self, + transport, + stream, + metadata, + content_type, + total_bytes=None, + stream_final=True, + timeout=None, + ): + """Initiate a resumable upload. + + By default, this method assumes your ``stream`` is in a "final" + state ready to transmit. However, ``stream_final=False`` can be used + to indicate that the size of the resource is not known. This can happen + if bytes are being dynamically fed into ``stream``, e.g. if the stream + is attached to application logs. + + If ``stream_final=False`` is used, :attr:`chunk_size` bytes will be + read from the stream every time :meth:`transmit_next_chunk` is called. + If one of those reads produces strictly fewer bites than the chunk + size, the upload will be concluded. + + Args: + transport (object): An object which can make authenticated + requests. + stream (IO[bytes]): The stream (i.e. file-like object) that will + be uploaded. The stream **must** be at the beginning (i.e. + ``stream.tell() == 0``). + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + total_bytes (Optional[int]): The total number of bytes to be + uploaded. If specified, the upload size **will not** be + determined from the stream (even if ``stream_final=True``). + stream_final (Optional[bool]): Indicates if the ``stream`` is + "final" (i.e. no more bytes will be added to it). In this case + we determine the upload size from the size of the stream. If + ``total_bytes`` is passed, this argument will be ignored. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + def _prepare_request(self): + """Prepare the contents of HTTP request to upload a chunk. + + This is everything that must be done before a request that doesn't + require network I/O. This is based on the `sans-I/O`_ philosophy. + + For the time being, this **does require** some form of I/O to read + a chunk from ``stream`` (via :func:`get_next_chunk`). However, this + will (almost) certainly not be network I/O. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always PUT) + * the URL for the request + * the body of the request + * headers for the request + + The headers incorporate the ``_headers`` on the current instance. + + Raises: + ValueError: If the current upload has finished. + ValueError: If the current upload is in an invalid state. + ValueError: If the current upload has not been initiated. + ValueError: If the location in the stream (i.e. ``stream.tell()``) + does not agree with ``bytes_uploaded``. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.finished: + raise ValueError("Upload has finished.") + if self.invalid: + raise ValueError( + "Upload is in an invalid state. To recover call `recover()`." + ) + if self.resumable_url is None: + raise ValueError( + "This upload has not been initiated. Please call " + "initiate() before beginning to transmit chunks." + ) + + start_byte, payload, content_range = get_next_chunk( + self._stream, self._chunk_size, self._total_bytes + ) + if start_byte != self.bytes_uploaded: + msg = _STREAM_ERROR_TEMPLATE.format(start_byte, self.bytes_uploaded) + raise ValueError(msg) + + self._update_checksum(start_byte, payload) + + headers = { + **self._headers, + _CONTENT_TYPE_HEADER: self._content_type, + _helpers.CONTENT_RANGE_HEADER: content_range, + } + return _PUT, self.resumable_url, payload, headers + + def _update_checksum(self, start_byte, payload): + """Update the checksum with the payload if not already updated. + + Because error recovery can result in bytes being transmitted more than + once, the checksum tracks the number of bytes checked in + self._bytes_checksummed and skips bytes that have already been summed. + """ + if not self._checksum_type: + return + + if not self._checksum_object: + self._checksum_object = _helpers._get_checksum_object(self._checksum_type) + + if start_byte < self._bytes_checksummed: + offset = self._bytes_checksummed - start_byte + data = payload[offset:] + else: + data = payload + + self._checksum_object.update(data) + self._bytes_checksummed += len(data) + + def _make_invalid(self): + """Simple setter for ``invalid``. + + This is intended to be passed along as a callback to helpers that + raise an exception so they can mark this instance as invalid before + raising. + """ + self._invalid = True + + def _process_resumable_response(self, response, bytes_sent): + """Process the response from an HTTP request. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + bytes_sent (int): The number of bytes sent in the request that + ``response`` was returned for. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is 308 and the ``range`` header is not of the form + ``bytes 0-{end}``. + ~google.resumable_media.common.InvalidResponse: If the status + code is not 200 or 308. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + status_code = _helpers.require_status_code( + response, + (http.client.OK, http.client.PERMANENT_REDIRECT), + self._get_status_code, + callback=self._make_invalid, + ) + if status_code == http.client.OK: + # NOTE: We use the "local" information of ``bytes_sent`` to update + # ``bytes_uploaded``, but do not verify this against other + # state. However, there may be some other information: + # + # * a ``size`` key in JSON response body + # * the ``total_bytes`` attribute (if set) + # * ``stream.tell()`` (relying on fact that ``initiate()`` + # requires stream to be at the beginning) + self._bytes_uploaded = self._bytes_uploaded + bytes_sent + # Tombstone the current upload so it cannot be used again. + self._finished = True + # Validate the checksum. This can raise an exception on failure. + self._validate_checksum(response) + else: + bytes_range = _helpers.header_required( + response, + _helpers.RANGE_HEADER, + self._get_headers, + callback=self._make_invalid, + ) + match = _BYTES_RANGE_RE.match(bytes_range) + if match is None: + self._make_invalid() + raise common.InvalidResponse( + response, + 'Unexpected "range" header', + bytes_range, + 'Expected to be of the form "bytes=0-{end}"', + ) + self._bytes_uploaded = int(match.group("end_byte")) + 1 + + def _validate_checksum(self, response): + """Check the computed checksum, if any, against the recieved metadata. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.DataCorruption: If the checksum + computed locally and the checksum reported by the remote host do + not match. + """ + if self._checksum_type is None: + return + metadata_key = _helpers._get_metadata_key(self._checksum_type) + metadata = response.json() + remote_checksum = metadata.get(metadata_key) + if remote_checksum is None: + raise common.InvalidResponse( + response, + _UPLOAD_METADATA_NO_APPROPRIATE_CHECKSUM_MESSAGE.format(metadata_key), + self._get_headers(response), + ) + local_checksum = _helpers.prepare_checksum_digest( + self._checksum_object.digest() + ) + if local_checksum != remote_checksum: + raise common.DataCorruption( + response, + _UPLOAD_CHECKSUM_MISMATCH_MESSAGE.format( + self._checksum_type.upper(), local_checksum, remote_checksum + ), + ) + + def transmit_next_chunk(self, transport, timeout=None): + """Transmit the next chunk of the resource to be uploaded. + + If the current upload was initiated with ``stream_final=False``, + this method will dynamically determine if the upload has completed. + The upload will be considered complete if the stream produces + fewer than :attr:`chunk_size` bytes when a chunk is read from it. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + def _prepare_recover_request(self): + """Prepare the contents of HTTP request to recover from failure. + + This is everything that must be done before a request that doesn't + require network I/O. This is based on the `sans-I/O`_ philosophy. + + We assume that the :attr:`resumable_url` is set (i.e. the only way + the upload can end up :attr:`invalid` is if it has been initiated. + + Returns: + Tuple[str, str, NoneType, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always PUT) + * the URL for the request + * the body of the request (always :data:`None`) + * headers for the request + + The headers **do not** incorporate the ``_headers`` on the + current instance. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + headers = {_helpers.CONTENT_RANGE_HEADER: "bytes */*"} + return _PUT, self.resumable_url, None, headers + + def _process_recover_response(self, response): + """Process the response from an HTTP request to recover from failure. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 308. + ~google.resumable_media.common.InvalidResponse: If the status + code is 308 and the ``range`` header is not of the form + ``bytes 0-{end}``. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + _helpers.require_status_code( + response, (http.client.PERMANENT_REDIRECT,), self._get_status_code + ) + headers = self._get_headers(response) + if _helpers.RANGE_HEADER in headers: + bytes_range = headers[_helpers.RANGE_HEADER] + match = _BYTES_RANGE_RE.match(bytes_range) + if match is None: + raise common.InvalidResponse( + response, + 'Unexpected "range" header', + bytes_range, + 'Expected to be of the form "bytes=0-{end}"', + ) + self._bytes_uploaded = int(match.group("end_byte")) + 1 + else: + # In this case, the upload has not "begun". + self._bytes_uploaded = 0 + + self._stream.seek(self._bytes_uploaded) + self._invalid = False + + def recover(self, transport): + """Recover from a failure. + + This method should be used when a :class:`ResumableUpload` is in an + :attr:`~ResumableUpload.invalid` state due to a request failure. + + This will verify the progress with the server and make sure the + current upload is in a valid state before :meth:`transmit_next_chunk` + can be used again. + + Args: + transport (object): An object which can make authenticated + requests. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class XMLMPUContainer(UploadBase): + """Initiate and close an upload using the XML MPU API. + + An XML MPU sends an initial request and then receives an upload ID. + Using the upload ID, the upload is then done in numbered parts and the + parts can be uploaded concurrently. + + In order to avoid concurrency issues with this container object, the + uploading of individual parts is handled separately, by XMLMPUPart objects + spawned from this container class. The XMLMPUPart objects are not + necessarily in the same process as the container, so they do not update the + container automatically. + + MPUs are sometimes referred to as "Multipart Uploads", which is ambiguous + given the JSON multipart upload, so the abbreviation "MPU" will be used + throughout. + + See: https://cloud.google.com/storage/docs/multipart-uploads + + Args: + upload_url (str): The URL of the object (without query parameters). The + initiate, PUT, and finalization requests will all use this URL, with + varying query parameters. + filename (str): The name (path) of the file to upload. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with every request. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + upload_id (Optional(str)): The ID of the upload from the initialization + response. + """ + + def __init__(self, upload_url, filename, headers=None, upload_id=None): + super().__init__(upload_url, headers=headers) + self._filename = filename + self._upload_id = upload_id + self._parts = {} + + @property + def upload_id(self): + return self._upload_id + + def register_part(self, part_number, etag): + """Register an uploaded part by part number and corresponding etag. + + XMLMPUPart objects represent individual parts, and their part number + and etag can be registered to the container object with this method + and therefore incorporated in the finalize() call to finish the upload. + + This method accepts part_number and etag, but not XMLMPUPart objects + themselves, to reduce the complexity involved in running XMLMPUPart + uploads in separate processes. + + Args: + part_number (int): The part number. Parts are assembled into the + final uploaded object with finalize() in order of their part + numbers. + etag (str): The etag included in the server response after upload. + """ + self._parts[part_number] = etag + + def _prepare_initiate_request(self, content_type): + """Prepare the contents of HTTP request to initiate upload. + + This is everything that must be done before a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always POST) + * the URL for the request + * the body of the request + * headers for the request + + Raises: + ValueError: If the current upload has already been initiated. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.upload_id is not None: + raise ValueError("This upload has already been initiated.") + + initiate_url = self.upload_url + _MPU_INITIATE_QUERY + + headers = { + **self._headers, + _CONTENT_TYPE_HEADER: content_type, + } + return _POST, initiate_url, None, headers + + def _process_initiate_response(self, response): + """Process the response from an HTTP request that initiated the upload. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + This method takes the URL from the ``Location`` header and stores it + for future use. Within that URL, we assume the ``upload_id`` query + parameter has been included, but we do not check. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 200. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + _helpers.require_status_code(response, (http.client.OK,), self._get_status_code) + root = ElementTree.fromstring(response.text) + self._upload_id = root.find(_S3_COMPAT_XML_NAMESPACE + _UPLOAD_ID_NODE).text + + def initiate( + self, + transport, + content_type, + timeout=None, + ): + """Initiate an MPU and record the upload ID. + + Args: + transport (object): An object which can make authenticated + requests. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + def _prepare_finalize_request(self): + """Prepare the contents of an HTTP request to finalize the upload. + + All of the parts must be registered before calling this method. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always POST) + * the URL for the request + * the body of the request + * headers for the request + + Raises: + ValueError: If the upload has not been initiated. + """ + if self.upload_id is None: + raise ValueError("This upload has not yet been initiated.") + + final_query = _MPU_FINAL_QUERY_TEMPLATE.format(upload_id=self._upload_id) + finalize_url = self.upload_url + final_query + final_xml_root = ElementTree.Element("CompleteMultipartUpload") + for part_number, etag in self._parts.items(): + part = ElementTree.SubElement(final_xml_root, "Part") # put in a loop + ElementTree.SubElement(part, "PartNumber").text = str(part_number) + ElementTree.SubElement(part, "ETag").text = etag + payload = ElementTree.tostring(final_xml_root) + return _POST, finalize_url, payload, self._headers + + def _process_finalize_response(self, response): + """Process the response from an HTTP request that finalized the upload. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 200. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + + _helpers.require_status_code(response, (http.client.OK,), self._get_status_code) + self._finished = True + + def finalize( + self, + transport, + timeout=None, + ): + """Finalize an MPU request with all the parts. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + def _prepare_cancel_request(self): + """Prepare the contents of an HTTP request to cancel the upload. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always DELETE) + * the URL for the request + * the body of the request + * headers for the request + + Raises: + ValueError: If the upload has not been initiated. + """ + if self.upload_id is None: + raise ValueError("This upload has not yet been initiated.") + + cancel_query = _MPU_FINAL_QUERY_TEMPLATE.format(upload_id=self._upload_id) + cancel_url = self.upload_url + cancel_query + return _DELETE, cancel_url, None, self._headers + + def _process_cancel_response(self, response): + """Process the response from an HTTP request that canceled the upload. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 204. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + + _helpers.require_status_code( + response, (http.client.NO_CONTENT,), self._get_status_code + ) + + def cancel( + self, + transport, + timeout=None, + ): + """Cancel an MPU request and permanently delete any uploaded parts. + + This cannot be undone. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + +class XMLMPUPart(UploadBase): + """Upload a single part of an existing XML MPU container. + + An XML MPU sends an initial request and then receives an upload ID. + Using the upload ID, the upload is then done in numbered parts and the + parts can be uploaded concurrently. + + In order to avoid concurrency issues with the container object, the + uploading of individual parts is handled separately by multiple objects + of this class. Once a part is uploaded, it can be registered with the + container with `container.register_part(part.part_number, part.etag)`. + + MPUs are sometimes referred to as "Multipart Uploads", which is ambiguous + given the JSON multipart upload, so the abbreviation "MPU" will be used + throughout. + + See: https://cloud.google.com/storage/docs/multipart-uploads + + Args: + upload_url (str): The URL of the object (without query parameters). + upload_id (str): The ID of the upload from the initialization response. + filename (str): The name (path) of the file to upload. + start (int): The byte index of the beginning of the part. + end (int): The byte index of the end of the part. + part_number (int): The part number. Part numbers will be assembled in + sequential order when the container is finalized. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with every request. + checksum (Optional([str])): The type of checksum to compute to verify + the integrity of the object. The request headers will be amended + to include the computed value. Supported values are "md5", "crc32c" + and None. The default is None. + + Attributes: + upload_url (str): The URL of the object (without query parameters). + upload_id (str): The ID of the upload from the initialization response. + filename (str): The name (path) of the file to upload. + start (int): The byte index of the beginning of the part. + end (int): The byte index of the end of the part. + part_number (int): The part number. Part numbers will be assembled in + sequential order when the container is finalized. + etag (Optional(str)): The etag returned by the service after upload. + """ + + def __init__( + self, + upload_url, + upload_id, + filename, + start, + end, + part_number, + headers=None, + checksum=None, + ): + super().__init__(upload_url, headers=headers) + self._filename = filename + self._start = start + self._end = end + self._upload_id = upload_id + self._part_number = part_number + self._etag = None + self._checksum_type = checksum + self._checksum_object = None + + @property + def part_number(self): + return self._part_number + + @property + def upload_id(self): + return self._upload_id + + @property + def filename(self): + return self._filename + + @property + def etag(self): + return self._etag + + @property + def start(self): + return self._start + + @property + def end(self): + return self._end + + def _prepare_upload_request(self): + """Prepare the contents of HTTP request to upload a part. + + This is everything that must be done before a request that doesn't + require network I/O. This is based on the `sans-I/O`_ philosophy. + + For the time being, this **does require** some form of I/O to read + a part from ``stream`` (via :func:`get_part_payload`). However, this + will (almost) certainly not be network I/O. + + Returns: + Tuple[str, str, bytes, Mapping[str, str]]: The quadruple + + * HTTP verb for the request (always PUT) + * the URL for the request + * the body of the request + * headers for the request + + The headers incorporate the ``_headers`` on the current instance. + + Raises: + ValueError: If the current upload has finished. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + if self.finished: + raise ValueError("This part has already been uploaded.") + + with open(self._filename, "br") as f: + f.seek(self._start) + payload = f.read(self._end - self._start) + + self._checksum_object = _helpers._get_checksum_object(self._checksum_type) + if self._checksum_object is not None: + self._checksum_object.update(payload) + + part_query = _MPU_PART_QUERY_TEMPLATE.format( + part=self._part_number, upload_id=self._upload_id + ) + upload_url = self.upload_url + part_query + return _PUT, upload_url, payload, self._headers + + def _process_upload_response(self, response): + """Process the response from an HTTP request. + + This is everything that must be done after a request that doesn't + require network I/O (or other I/O). This is based on the `sans-I/O`_ + philosophy. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 200 or the response is missing data. + + .. _sans-I/O: https://sans-io.readthedocs.io/ + """ + _helpers.require_status_code( + response, + (http.client.OK,), + self._get_status_code, + ) + + self._validate_checksum(response) + + etag = _helpers.header_required(response, "etag", self._get_headers) + self._etag = etag + self._finished = True + + def upload( + self, + transport, + timeout=None, + ): + """Upload the part. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Raises: + NotImplementedError: Always, since virtual. + """ + raise NotImplementedError("This implementation is virtual.") + + def _validate_checksum(self, response): + """Check the computed checksum, if any, against the response headers. + + Args: + response (object): The HTTP response object. + + Raises: + ~google.resumable_media.common.DataCorruption: If the checksum + computed locally and the checksum reported by the remote host do + not match. + """ + if self._checksum_type is None: + return + + remote_checksum = _helpers._get_uploaded_checksum_from_headers( + response, self._get_headers, self._checksum_type + ) + + if remote_checksum is None: + metadata_key = _helpers._get_metadata_key(self._checksum_type) + raise common.InvalidResponse( + response, + _UPLOAD_METADATA_NO_APPROPRIATE_CHECKSUM_MESSAGE.format(metadata_key), + self._get_headers(response), + ) + local_checksum = _helpers.prepare_checksum_digest( + self._checksum_object.digest() + ) + if local_checksum != remote_checksum: + raise common.DataCorruption( + response, + _UPLOAD_CHECKSUM_MISMATCH_MESSAGE.format( + self._checksum_type.upper(), local_checksum, remote_checksum + ), + ) + + +def get_boundary(): + """Get a random boundary for a multipart request. + + Returns: + bytes: The boundary used to separate parts of a multipart request. + """ + random_int = random.randrange(sys.maxsize) + boundary = _BOUNDARY_FORMAT.format(random_int) + # NOTE: Neither % formatting nor .format() are available for byte strings + # in Python 3.4, so we must use unicode strings as templates. + return boundary.encode("utf-8") + + +def construct_multipart_request(data, metadata, content_type): + """Construct a multipart request body. + + Args: + data (bytes): The resource content (UTF-8 encoded as bytes) + to be uploaded. + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + + Returns: + Tuple[bytes, bytes]: The multipart request body and the boundary used + between each part. + """ + multipart_boundary = get_boundary() + json_bytes = json.dumps(metadata).encode("utf-8") + content_type = content_type.encode("utf-8") + # Combine the two parts into a multipart payload. + # NOTE: We'd prefer a bytes template but are restricted by Python 3.4. + boundary_sep = _MULTIPART_SEP + multipart_boundary + content = ( + boundary_sep + + _MULTIPART_BEGIN + + json_bytes + + _CRLF + + boundary_sep + + _CRLF + + b"content-type: " + + content_type + + _CRLF + + _CRLF + + data # Empty line between headers and body. + + _CRLF + + boundary_sep + + _MULTIPART_SEP + ) + + return content, multipart_boundary + + +def get_total_bytes(stream): + """Determine the total number of bytes in a stream. + + Args: + stream (IO[bytes]): The stream (i.e. file-like object). + + Returns: + int: The number of bytes. + """ + current_position = stream.tell() + # NOTE: ``.seek()`` **should** return the same value that ``.tell()`` + # returns, but in Python 2, ``file`` objects do not. + stream.seek(0, os.SEEK_END) + end_position = stream.tell() + # Go back to the initial position. + stream.seek(current_position) + + return end_position + + +def get_next_chunk(stream, chunk_size, total_bytes): + """Get a chunk from an I/O stream. + + The ``stream`` may have fewer bytes remaining than ``chunk_size`` + so it may not always be the case that + ``end_byte == start_byte + chunk_size - 1``. + + Args: + stream (IO[bytes]): The stream (i.e. file-like object). + chunk_size (int): The size of the chunk to be read from the ``stream``. + total_bytes (Optional[int]): The (expected) total number of bytes + in the ``stream``. + + Returns: + Tuple[int, bytes, str]: Triple of: + + * the start byte index + * the content in between the start and end bytes (inclusive) + * content range header for the chunk (slice) that has been read + + Raises: + ValueError: If ``total_bytes == 0`` but ``stream.read()`` yields + non-empty content. + ValueError: If there is no data left to consume. This corresponds + exactly to the case ``end_byte < start_byte``, which can only + occur if ``end_byte == start_byte - 1``. + """ + start_byte = stream.tell() + if total_bytes is not None and start_byte + chunk_size >= total_bytes > 0: + payload = stream.read(total_bytes - start_byte) + else: + payload = stream.read(chunk_size) + end_byte = stream.tell() - 1 + + num_bytes_read = len(payload) + if total_bytes is None: + if num_bytes_read < chunk_size: + # We now **KNOW** the total number of bytes. + total_bytes = end_byte + 1 + elif total_bytes == 0: + # NOTE: We also expect ``start_byte == 0`` here but don't check + # because ``_prepare_initiate_request()`` requires the + # stream to be at the beginning. + if num_bytes_read != 0: + raise ValueError( + "Stream specified as empty, but produced non-empty content." + ) + else: + if num_bytes_read == 0: + raise ValueError( + "Stream is already exhausted. There is no content remaining." + ) + + content_range = get_content_range(start_byte, end_byte, total_bytes) + return start_byte, payload, content_range + + +def get_content_range(start_byte, end_byte, total_bytes): + """Convert start, end and total into content range header. + + If ``total_bytes`` is not known, uses "bytes {start}-{end}/*". + If we are dealing with an empty range (i.e. ``end_byte < start_byte``) + then "bytes */{total}" is used. + + This function **ASSUMES** that if the size is not known, the caller will + not also pass an empty range. + + Args: + start_byte (int): The start (inclusive) of the byte range. + end_byte (int): The end (inclusive) of the byte range. + total_bytes (Optional[int]): The number of bytes in the byte + range (if known). + + Returns: + str: The content range header. + """ + if total_bytes is None: + return _RANGE_UNKNOWN_TEMPLATE.format(start_byte, end_byte) + elif end_byte < start_byte: + return _EMPTY_RANGE_TEMPLATE.format(total_bytes) + else: + return _CONTENT_RANGE_TEMPLATE.format(start_byte, end_byte, total_bytes) diff --git a/google/cloud/storage/_media/common.py b/google/cloud/storage/_media/common.py new file mode 100644 index 000000000..25555ea52 --- /dev/null +++ b/google/cloud/storage/_media/common.py @@ -0,0 +1,179 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Common utilities for Google Media Downloads and Resumable Uploads. + +Includes custom exception types, useful constants and shared helpers. +""" + +import http.client + +_SLEEP_RETRY_ERROR_MSG = ( + "At most one of `max_cumulative_retry` and `max_retries` " "can be specified." +) + +UPLOAD_CHUNK_SIZE = 262144 # 256 * 1024 +"""int: Chunks in a resumable upload must come in multiples of 256 KB.""" + +PERMANENT_REDIRECT = http.client.PERMANENT_REDIRECT # type: ignore +"""int: Permanent redirect status code. + +.. note:: + This is a backward-compatibility alias. + +It is used by Google services to indicate some (but not all) of +a resumable upload has been completed. + +For more information, see `RFC 7238`_. + +.. _RFC 7238: https://tools.ietf.org/html/rfc7238 +""" + +TOO_MANY_REQUESTS = http.client.TOO_MANY_REQUESTS +"""int: Status code indicating rate-limiting. + +.. note:: + This is a backward-compatibility alias. + +For more information, see `RFC 6585`_. + +.. _RFC 6585: https://tools.ietf.org/html/rfc6585#section-4 +""" + +MAX_SLEEP = 64.0 +"""float: Maximum amount of time allowed between requests. + +Used during the retry process for sleep after a failed request. +Chosen since it is the power of two nearest to one minute. +""" + +MAX_CUMULATIVE_RETRY = 600.0 +"""float: Maximum total sleep time allowed during retry process. + +This is provided (10 minutes) as a default. When the cumulative sleep +exceeds this limit, no more retries will occur. +""" + +RETRYABLE = ( + http.client.TOO_MANY_REQUESTS, # 429 + http.client.REQUEST_TIMEOUT, # 408 + http.client.INTERNAL_SERVER_ERROR, # 500 + http.client.BAD_GATEWAY, # 502 + http.client.SERVICE_UNAVAILABLE, # 503 + http.client.GATEWAY_TIMEOUT, # 504 +) +"""iterable: HTTP status codes that indicate a retryable error. + +Connection errors are also retried, but are not listed as they are +exceptions, not status codes. +""" + + +class InvalidResponse(Exception): + """Error class for responses which are not in the correct state. + + Args: + response (object): The HTTP response which caused the failure. + args (tuple): The positional arguments typically passed to an + exception class. + """ + + def __init__(self, response, *args): + super(InvalidResponse, self).__init__(*args) + self.response = response + """object: The HTTP response object that caused the failure.""" + + +class DataCorruption(Exception): + """Error class for corrupt media transfers. + + Args: + response (object): The HTTP response which caused the failure. + args (tuple): The positional arguments typically passed to an + exception class. + """ + + def __init__(self, response, *args): + super(DataCorruption, self).__init__(*args) + self.response = response + """object: The HTTP response object that caused the failure.""" + + +class RetryStrategy(object): + """Configuration class for retrying failed requests. + + At most one of ``max_cumulative_retry`` and ``max_retries`` can be + specified (they are both caps on the total number of retries). If + neither are specified, then ``max_cumulative_retry`` is set as + :data:`MAX_CUMULATIVE_RETRY`. + + Args: + max_sleep (Optional[float]): The maximum amount of time to sleep after + a failed request. Default is :attr:`MAX_SLEEP`. + max_cumulative_retry (Optional[float]): The maximum **total** amount of + time to sleep during retry process. + max_retries (Optional[int]): The number of retries to attempt. + initial_delay (Optional[float]): The initial delay. Default 1.0 second. + muiltiplier (Optional[float]): Exponent of the backoff. Default is 2.0. + + Attributes: + max_sleep (float): Maximum amount of time allowed between requests. + max_cumulative_retry (Optional[float]): Maximum total sleep time + allowed during retry process. + max_retries (Optional[int]): The number retries to attempt. + initial_delay (Optional[float]): The initial delay. Default 1.0 second. + muiltiplier (Optional[float]): Exponent of the backoff. Default is 2.0. + + Raises: + ValueError: If both of ``max_cumulative_retry`` and ``max_retries`` + are passed. + """ + + def __init__( + self, + max_sleep=MAX_SLEEP, + max_cumulative_retry=None, + max_retries=None, + initial_delay=1.0, + multiplier=2.0, + ): + if max_cumulative_retry is not None and max_retries is not None: + raise ValueError(_SLEEP_RETRY_ERROR_MSG) + if max_cumulative_retry is None and max_retries is None: + max_cumulative_retry = MAX_CUMULATIVE_RETRY + + self.max_sleep = max_sleep + self.max_cumulative_retry = max_cumulative_retry + self.max_retries = max_retries + self.initial_delay = initial_delay + self.multiplier = multiplier + + def retry_allowed(self, total_sleep, num_retries): + """Check if another retry is allowed. + + Args: + total_sleep (float): With another retry, the amount of sleep that + will be accumulated by the caller. + num_retries (int): With another retry, the number of retries that + will be attempted by the caller. + + Returns: + bool: Indicating if another retry is allowed (depending on either + the cumulative sleep allowed or the maximum number of retries + allowed. + """ + if self.max_cumulative_retry is None: + return num_retries <= self.max_retries + else: + return total_sleep <= self.max_cumulative_retry diff --git a/google/cloud/storage/_media/py.typed b/google/cloud/storage/_media/py.typed new file mode 100644 index 000000000..7705b065b --- /dev/null +++ b/google/cloud/storage/_media/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-resumable_media package uses inline types. diff --git a/google/cloud/storage/_media/requests/__init__.py b/google/cloud/storage/_media/requests/__init__.py new file mode 100644 index 000000000..cc8289f04 --- /dev/null +++ b/google/cloud/storage/_media/requests/__init__.py @@ -0,0 +1,685 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""``requests`` utilities for Google Media Downloads and Resumable Uploads. + +This sub-package assumes callers will use the `requests`_ library +as transport and `google-auth`_ for sending authenticated HTTP traffic +with ``requests``. + +.. _requests: http://docs.python-requests.org/ +.. _google-auth: https://google-auth.readthedocs.io/ + +==================== +Authorized Transport +==================== + +To use ``google-auth`` and ``requests`` to create an authorized transport +that has read-only access to Google Cloud Storage (GCS): + +.. testsetup:: get-credentials + + import google.auth + import google.auth.credentials as creds_mod + import mock + + def mock_default(scopes=None): + credentials = mock.Mock(spec=creds_mod.Credentials) + return credentials, 'mock-project' + + # Patch the ``default`` function on the module. + original_default = google.auth.default + google.auth.default = mock_default + +.. doctest:: get-credentials + + >>> import google.auth + >>> import google.auth.transport.requests as tr_requests + >>> + >>> ro_scope = 'https://www.googleapis.com/auth/devstorage.read_only' + >>> credentials, _ = google.auth.default(scopes=(ro_scope,)) + >>> transport = tr_requests.AuthorizedSession(credentials) + >>> transport + + +.. testcleanup:: get-credentials + + # Put back the correct ``default`` function on the module. + google.auth.default = original_default + +================ +Simple Downloads +================ + +To download an object from Google Cloud Storage, construct the media URL +for the GCS object and download it with an authorized transport that has +access to the resource: + +.. testsetup:: basic-download + + import mock + import requests + import http.client + + bucket = 'bucket-foo' + blob_name = 'file.txt' + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + fake_response.headers['Content-Length'] = '1364156' + fake_content = mock.MagicMock(spec=['__len__']) + fake_content.__len__.return_value = 1364156 + fake_response._content = fake_content + + get_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=get_method, spec=['request']) + +.. doctest:: basic-download + + >>> from google.resumable_media.requests import Download + >>> + >>> url_template = ( + ... 'https://www.googleapis.com/download/storage/v1/b/' + ... '{bucket}/o/{blob_name}?alt=media') + >>> media_url = url_template.format( + ... bucket=bucket, blob_name=blob_name) + >>> + >>> download = Download(media_url) + >>> response = download.consume(transport) + >>> download.finished + True + >>> response + + >>> response.headers['Content-Length'] + '1364156' + >>> len(response.content) + 1364156 + +To download only a portion of the bytes in the object, +specify ``start`` and ``end`` byte positions (both optional): + +.. testsetup:: basic-download-with-slice + + import mock + import requests + import http.client + + from google.resumable_media.requests import Download + + media_url = 'http://test.invalid' + start = 4096 + end = 8191 + slice_size = end - start + 1 + + fake_response = requests.Response() + fake_response.status_code = int(http.client.PARTIAL_CONTENT) + fake_response.headers['Content-Length'] = '{:d}'.format(slice_size) + content_range = 'bytes {:d}-{:d}/1364156'.format(start, end) + fake_response.headers['Content-Range'] = content_range + fake_content = mock.MagicMock(spec=['__len__']) + fake_content.__len__.return_value = slice_size + fake_response._content = fake_content + + get_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=get_method, spec=['request']) + +.. doctest:: basic-download-with-slice + + >>> download = Download(media_url, start=4096, end=8191) + >>> response = download.consume(transport) + >>> download.finished + True + >>> response + + >>> response.headers['Content-Length'] + '4096' + >>> response.headers['Content-Range'] + 'bytes 4096-8191/1364156' + >>> len(response.content) + 4096 + +================= +Chunked Downloads +================= + +For very large objects or objects of unknown size, it may make more sense +to download the object in chunks rather than all at once. This can be done +to avoid dropped connections with a poor internet connection or can allow +multiple chunks to be downloaded in parallel to speed up the total +download. + +A :class:`.ChunkedDownload` uses the same media URL and authorized +transport that a basic :class:`.Download` would use, but also +requires a chunk size and a write-able byte ``stream``. The chunk size is used +to determine how much of the resouce to consume with each request and the +stream is to allow the resource to be written out (e.g. to disk) without +having to fit in memory all at once. + +.. testsetup:: chunked-download + + import io + + import mock + import requests + import http.client + + media_url = 'http://test.invalid' + + fifty_mb = 50 * 1024 * 1024 + one_gb = 1024 * 1024 * 1024 + fake_response = requests.Response() + fake_response.status_code = int(http.client.PARTIAL_CONTENT) + fake_response.headers['Content-Length'] = '{:d}'.format(fifty_mb) + content_range = 'bytes 0-{:d}/{:d}'.format(fifty_mb - 1, one_gb) + fake_response.headers['Content-Range'] = content_range + fake_content_begin = b'The beginning of the chunk...' + fake_content = fake_content_begin + b'1' * (fifty_mb - 29) + fake_response._content = fake_content + + get_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=get_method, spec=['request']) + +.. doctest:: chunked-download + + >>> from google.resumable_media.requests import ChunkedDownload + >>> + >>> chunk_size = 50 * 1024 * 1024 # 50MB + >>> stream = io.BytesIO() + >>> download = ChunkedDownload( + ... media_url, chunk_size, stream) + >>> # Check the state of the download before starting. + >>> download.bytes_downloaded + 0 + >>> download.total_bytes is None + True + >>> response = download.consume_next_chunk(transport) + >>> # Check the state of the download after consuming one chunk. + >>> download.finished + False + >>> download.bytes_downloaded # chunk_size + 52428800 + >>> download.total_bytes # 1GB + 1073741824 + >>> response + + >>> response.headers['Content-Length'] + '52428800' + >>> response.headers['Content-Range'] + 'bytes 0-52428799/1073741824' + >>> len(response.content) == chunk_size + True + >>> stream.seek(0) + 0 + >>> stream.read(29) + b'The beginning of the chunk...' + +The download will change it's ``finished`` status to :data:`True` +once the final chunk is consumed. In some cases, the final chunk may +not be the same size as the other chunks: + +.. testsetup:: chunked-download-end + + import mock + import requests + import http.client + + from google.resumable_media.requests import ChunkedDownload + + media_url = 'http://test.invalid' + + fifty_mb = 50 * 1024 * 1024 + one_gb = 1024 * 1024 * 1024 + stream = mock.Mock(spec=['write']) + download = ChunkedDownload(media_url, fifty_mb, stream) + download._bytes_downloaded = 20 * fifty_mb + download._total_bytes = one_gb + + fake_response = requests.Response() + fake_response.status_code = int(http.client.PARTIAL_CONTENT) + slice_size = one_gb - 20 * fifty_mb + fake_response.headers['Content-Length'] = '{:d}'.format(slice_size) + content_range = 'bytes {:d}-{:d}/{:d}'.format( + 20 * fifty_mb, one_gb - 1, one_gb) + fake_response.headers['Content-Range'] = content_range + fake_content = mock.MagicMock(spec=['__len__']) + fake_content.__len__.return_value = slice_size + fake_response._content = fake_content + + get_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=get_method, spec=['request']) + +.. doctest:: chunked-download-end + + >>> # The state of the download in progress. + >>> download.finished + False + >>> download.bytes_downloaded # 20 chunks at 50MB + 1048576000 + >>> download.total_bytes # 1GB + 1073741824 + >>> response = download.consume_next_chunk(transport) + >>> # The state of the download after consuming the final chunk. + >>> download.finished + True + >>> download.bytes_downloaded == download.total_bytes + True + >>> response + + >>> response.headers['Content-Length'] + '25165824' + >>> response.headers['Content-Range'] + 'bytes 1048576000-1073741823/1073741824' + >>> len(response.content) < download.chunk_size + True + +In addition, a :class:`.ChunkedDownload` can also take optional +``start`` and ``end`` byte positions. + +Usually, no checksum is returned with a chunked download. Even if one is returned, +it is not validated. If you need to validate the checksum, you can do so +by buffering the chunks and validating the checksum against the completed download. + +============== +Simple Uploads +============== + +Among the three supported upload classes, the simplest is +:class:`.SimpleUpload`. A simple upload should be used when the resource +being uploaded is small and when there is no metadata (other than the name) +associated with the resource. + +.. testsetup:: simple-upload + + import json + + import mock + import requests + import http.client + + bucket = 'some-bucket' + blob_name = 'file.txt' + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + payload = { + 'bucket': bucket, + 'contentType': 'text/plain', + 'md5Hash': 'M0XLEsX9/sMdiI+4pB4CAQ==', + 'name': blob_name, + 'size': '27', + } + fake_response._content = json.dumps(payload).encode('utf-8') + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + +.. doctest:: simple-upload + :options: +NORMALIZE_WHITESPACE + + >>> from google.resumable_media.requests import SimpleUpload + >>> + >>> url_template = ( + ... 'https://www.googleapis.com/upload/storage/v1/b/{bucket}/o?' + ... 'uploadType=media&' + ... 'name={blob_name}') + >>> upload_url = url_template.format( + ... bucket=bucket, blob_name=blob_name) + >>> + >>> upload = SimpleUpload(upload_url) + >>> data = b'Some not too large content.' + >>> content_type = 'text/plain' + >>> response = upload.transmit(transport, data, content_type) + >>> upload.finished + True + >>> response + + >>> json_response = response.json() + >>> json_response['bucket'] == bucket + True + >>> json_response['name'] == blob_name + True + >>> json_response['contentType'] == content_type + True + >>> json_response['md5Hash'] + 'M0XLEsX9/sMdiI+4pB4CAQ==' + >>> int(json_response['size']) == len(data) + True + +In the rare case that an upload fails, an :exc:`.InvalidResponse` +will be raised: + +.. testsetup:: simple-upload-fail + + import time + + import mock + import requests + import http.client + + from google import resumable_media + from google.resumable_media import _helpers + from google.resumable_media.requests import SimpleUpload as constructor + + upload_url = 'http://test.invalid' + data = b'Some not too large content.' + content_type = 'text/plain' + + fake_response = requests.Response() + fake_response.status_code = int(http.client.SERVICE_UNAVAILABLE) + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + + time_sleep = time.sleep + def dont_sleep(seconds): + raise RuntimeError('No sleep', seconds) + + def SimpleUpload(*args, **kwargs): + upload = constructor(*args, **kwargs) + # Mock the cumulative sleep to avoid retries (and `time.sleep()`). + upload._retry_strategy = resumable_media.RetryStrategy( + max_cumulative_retry=-1.0) + return upload + + time.sleep = dont_sleep + +.. doctest:: simple-upload-fail + :options: +NORMALIZE_WHITESPACE + + >>> upload = SimpleUpload(upload_url) + >>> error = None + >>> try: + ... upload.transmit(transport, data, content_type) + ... except resumable_media.InvalidResponse as caught_exc: + ... error = caught_exc + ... + >>> error + InvalidResponse('Request failed with status code', 503, + 'Expected one of', ) + >>> error.response + + >>> + >>> upload.finished + True + +.. testcleanup:: simple-upload-fail + + # Put back the correct ``sleep`` function on the ``time`` module. + time.sleep = time_sleep + +Even in the case of failure, we see that the upload is +:attr:`~.SimpleUpload.finished`, i.e. it cannot be re-used. + +================= +Multipart Uploads +================= + +After the simple upload, the :class:`.MultipartUpload` can be used to +achieve essentially the same task. However, a multipart upload allows some +metadata about the resource to be sent along as well. (This is the "multi": +we send a first part with the metadata and a second part with the actual +bytes in the resource.) + +Usage is similar to the simple upload, but :meth:`~.MultipartUpload.transmit` +accepts an extra required argument: ``metadata``. + +.. testsetup:: multipart-upload + + import json + + import mock + import requests + import http.client + + bucket = 'some-bucket' + blob_name = 'file.txt' + data = b'Some not too large content.' + content_type = 'text/plain' + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + payload = { + 'bucket': bucket, + 'name': blob_name, + 'metadata': {'color': 'grurple'}, + } + fake_response._content = json.dumps(payload).encode('utf-8') + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + +.. doctest:: multipart-upload + + >>> from google.resumable_media.requests import MultipartUpload + >>> + >>> url_template = ( + ... 'https://www.googleapis.com/upload/storage/v1/b/{bucket}/o?' + ... 'uploadType=multipart') + >>> upload_url = url_template.format(bucket=bucket) + >>> + >>> upload = MultipartUpload(upload_url) + >>> metadata = { + ... 'name': blob_name, + ... 'metadata': { + ... 'color': 'grurple', + ... }, + ... } + >>> response = upload.transmit(transport, data, metadata, content_type) + >>> upload.finished + True + >>> response + + >>> json_response = response.json() + >>> json_response['bucket'] == bucket + True + >>> json_response['name'] == blob_name + True + >>> json_response['metadata'] == metadata['metadata'] + True + +As with the simple upload, in the case of failure an :exc:`.InvalidResponse` +is raised, enclosing the :attr:`~.InvalidResponse.response` that caused +the failure and the ``upload`` object cannot be re-used after a failure. + +================= +Resumable Uploads +================= + +A :class:`.ResumableUpload` deviates from the other two upload classes: +it transmits a resource over the course of multiple requests. This +is intended to be used in cases where: + +* the size of the resource is not known (i.e. it is generated on the fly) +* requests must be short-lived +* the client has request **size** limitations +* the resource is too large to fit into memory + +In general, a resource should be sent in a **single** request to avoid +latency and reduce QPS. See `GCS best practices`_ for more things to +consider when using a resumable upload. + +.. _GCS best practices: https://cloud.google.com/storage/docs/\ + best-practices#uploading + +After creating a :class:`.ResumableUpload` instance, a +**resumable upload session** must be initiated to let the server know that +a series of chunked upload requests will be coming and to obtain an +``upload_id`` for the session. In contrast to the other two upload classes, +:meth:`~.ResumableUpload.initiate` takes a byte ``stream`` as input rather +than raw bytes as ``data``. This can be a file object, a :class:`~io.BytesIO` +object or any other stream implementing the same interface. + +.. testsetup:: resumable-initiate + + import io + + import mock + import requests + import http.client + + bucket = 'some-bucket' + blob_name = 'file.txt' + data = b'Some resumable bytes.' + content_type = 'text/plain' + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + fake_response._content = b'' + upload_id = 'ABCdef189XY_super_serious' + resumable_url_template = ( + 'https://www.googleapis.com/upload/storage/v1/b/{bucket}' + '/o?uploadType=resumable&upload_id={upload_id}') + resumable_url = resumable_url_template.format( + bucket=bucket, upload_id=upload_id) + fake_response.headers['location'] = resumable_url + fake_response.headers['x-guploader-uploadid'] = upload_id + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + +.. doctest:: resumable-initiate + + >>> from google.resumable_media.requests import ResumableUpload + >>> + >>> url_template = ( + ... 'https://www.googleapis.com/upload/storage/v1/b/{bucket}/o?' + ... 'uploadType=resumable') + >>> upload_url = url_template.format(bucket=bucket) + >>> + >>> chunk_size = 1024 * 1024 # 1MB + >>> upload = ResumableUpload(upload_url, chunk_size) + >>> stream = io.BytesIO(data) + >>> # The upload doesn't know how "big" it is until seeing a stream. + >>> upload.total_bytes is None + True + >>> metadata = {'name': blob_name} + >>> response = upload.initiate(transport, stream, metadata, content_type) + >>> response + + >>> upload.resumable_url == response.headers['Location'] + True + >>> upload.total_bytes == len(data) + True + >>> upload_id = response.headers['X-GUploader-UploadID'] + >>> upload_id + 'ABCdef189XY_super_serious' + >>> upload.resumable_url == upload_url + '&upload_id=' + upload_id + True + +Once a :class:`.ResumableUpload` has been initiated, the resource is +transmitted in chunks until completion: + +.. testsetup:: resumable-transmit + + import io + import json + + import mock + import requests + import http.client + + from google import resumable_media + import google.resumable_media.requests.upload as upload_mod + + data = b'01234567891' + stream = io.BytesIO(data) + # Create an "already initiated" upload. + upload_url = 'http://test.invalid' + chunk_size = 256 * 1024 # 256KB + upload = upload_mod.ResumableUpload(upload_url, chunk_size) + upload._resumable_url = 'http://test.invalid?upload_id=mocked' + upload._stream = stream + upload._content_type = 'text/plain' + upload._total_bytes = len(data) + + # After-the-fact update the chunk size so that len(data) + # is split into three. + upload._chunk_size = 4 + # Make three fake responses. + fake_response0 = requests.Response() + fake_response0.status_code = http.client.PERMANENT_REDIRECT + fake_response0.headers['range'] = 'bytes=0-3' + + fake_response1 = requests.Response() + fake_response1.status_code = http.client.PERMANENT_REDIRECT + fake_response1.headers['range'] = 'bytes=0-7' + + fake_response2 = requests.Response() + fake_response2.status_code = int(http.client.OK) + bucket = 'some-bucket' + blob_name = 'file.txt' + payload = { + 'bucket': bucket, + 'name': blob_name, + 'size': '{:d}'.format(len(data)), + } + fake_response2._content = json.dumps(payload).encode('utf-8') + + # Use the fake responses to mock a transport. + responses = [fake_response0, fake_response1, fake_response2] + put_method = mock.Mock(side_effect=responses, spec=[]) + transport = mock.Mock(request=put_method, spec=['request']) + +.. doctest:: resumable-transmit + + >>> response0 = upload.transmit_next_chunk(transport) + >>> response0 + + >>> upload.finished + False + >>> upload.bytes_uploaded == upload.chunk_size + True + >>> + >>> response1 = upload.transmit_next_chunk(transport) + >>> response1 + + >>> upload.finished + False + >>> upload.bytes_uploaded == 2 * upload.chunk_size + True + >>> + >>> response2 = upload.transmit_next_chunk(transport) + >>> response2 + + >>> upload.finished + True + >>> upload.bytes_uploaded == upload.total_bytes + True + >>> json_response = response2.json() + >>> json_response['bucket'] == bucket + True + >>> json_response['name'] == blob_name + True +""" +from google.resumable_media.requests.download import ChunkedDownload +from google.resumable_media.requests.download import Download +from google.resumable_media.requests.upload import MultipartUpload +from google.resumable_media.requests.download import RawChunkedDownload +from google.resumable_media.requests.download import RawDownload +from google.resumable_media.requests.upload import ResumableUpload +from google.resumable_media.requests.upload import SimpleUpload +from google.resumable_media.requests.upload import XMLMPUContainer +from google.resumable_media.requests.upload import XMLMPUPart + +__all__ = [ + "ChunkedDownload", + "Download", + "MultipartUpload", + "RawChunkedDownload", + "RawDownload", + "ResumableUpload", + "SimpleUpload", + "XMLMPUContainer", + "XMLMPUPart", +] diff --git a/google/cloud/storage/_media/requests/_request_helpers.py b/google/cloud/storage/_media/requests/_request_helpers.py new file mode 100644 index 000000000..051f0bae0 --- /dev/null +++ b/google/cloud/storage/_media/requests/_request_helpers.py @@ -0,0 +1,180 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Shared utilities used by both downloads and uploads. + +This utilities are explicitly catered to ``requests``-like transports. +""" + +import http.client +import requests.exceptions +import urllib3.exceptions # type: ignore + +import time + +from google.resumable_media import common +from google.resumable_media import _helpers + +_DEFAULT_RETRY_STRATEGY = common.RetryStrategy() +_SINGLE_GET_CHUNK_SIZE = 8192 +# The number of seconds to wait to establish a connection +# (connect() call on socket). Avoid setting this to a multiple of 3 to not +# Align with TCP Retransmission timing. (typically 2.5-3s) +_DEFAULT_CONNECT_TIMEOUT = 61 +# The number of seconds to wait between bytes sent from the server. +_DEFAULT_READ_TIMEOUT = 60 + +_CONNECTION_ERROR_CLASSES = ( + http.client.BadStatusLine, + http.client.IncompleteRead, + http.client.ResponseNotReady, + requests.exceptions.ConnectionError, + requests.exceptions.ChunkedEncodingError, + requests.exceptions.Timeout, + urllib3.exceptions.PoolError, + urllib3.exceptions.ProtocolError, + urllib3.exceptions.SSLError, + urllib3.exceptions.TimeoutError, + ConnectionError, # Python 3.x only, superclass of ConnectionResetError. +) + + +class RequestsMixin(object): + """Mix-in class implementing ``requests``-specific behavior. + + These are methods that are more general purpose, with implementations + specific to the types defined in ``requests``. + """ + + @staticmethod + def _get_status_code(response): + """Access the status code from an HTTP response. + + Args: + response (~requests.Response): The HTTP response object. + + Returns: + int: The status code. + """ + return response.status_code + + @staticmethod + def _get_headers(response): + """Access the headers from an HTTP response. + + Args: + response (~requests.Response): The HTTP response object. + + Returns: + ~requests.structures.CaseInsensitiveDict: The header mapping (keys + are case-insensitive). + """ + return response.headers + + @staticmethod + def _get_body(response): + """Access the response body from an HTTP response. + + Args: + response (~requests.Response): The HTTP response object. + + Returns: + bytes: The body of the ``response``. + """ + return response.content + + +class RawRequestsMixin(RequestsMixin): + @staticmethod + def _get_body(response): + """Access the response body from an HTTP response. + + Args: + response (~requests.Response): The HTTP response object. + + Returns: + bytes: The body of the ``response``. + """ + if response._content is False: + response._content = b"".join( + response.raw.stream(_SINGLE_GET_CHUNK_SIZE, decode_content=False) + ) + response._content_consumed = True + return response._content + + +def wait_and_retry(func, get_status_code, retry_strategy): + """Attempts to retry a call to ``func`` until success. + + Expects ``func`` to return an HTTP response and uses ``get_status_code`` + to check if the response is retry-able. + + ``func`` is expected to raise a failure status code as a + common.InvalidResponse, at which point this method will check the code + against the common.RETRIABLE list of retriable status codes. + + Will retry until :meth:`~.RetryStrategy.retry_allowed` (on the current + ``retry_strategy``) returns :data:`False`. Uses + :func:`_helpers.calculate_retry_wait` to double the wait time (with jitter) + after each attempt. + + Args: + func (Callable): A callable that takes no arguments and produces + an HTTP response which will be checked as retry-able. + get_status_code (Callable[Any, int]): Helper to get a status code + from a response. + retry_strategy (~google.resumable_media.common.RetryStrategy): The + strategy to use if the request fails and must be retried. + + Returns: + object: The return value of ``func``. + """ + total_sleep = 0.0 + num_retries = 0 + # base_wait will be multiplied by the multiplier on the first retry. + base_wait = float(retry_strategy.initial_delay) / retry_strategy.multiplier + + # Set the retriable_exception_type if possible. We expect requests to be + # present here and the transport to be using requests.exceptions errors, + # but due to loose coupling with the transport layer we can't guarantee it. + + while True: # return on success or when retries exhausted. + error = None + try: + response = func() + except _CONNECTION_ERROR_CLASSES as e: + error = e # Fall through to retry, if there are retries left. + except common.InvalidResponse as e: + # An InvalidResponse is only retriable if its status code matches. + # The `process_response()` method on a Download or Upload method + # will convert the status code into an exception. + if get_status_code(e.response) in common.RETRYABLE: + error = e # Fall through to retry, if there are retries left. + else: + raise # If the status code is not retriable, raise w/o retry. + else: + return response + + base_wait, wait_time = _helpers.calculate_retry_wait( + base_wait, retry_strategy.max_sleep, retry_strategy.multiplier + ) + num_retries += 1 + total_sleep += wait_time + + # Check if (another) retry is allowed. If retries are exhausted and + # no acceptable response was received, raise the retriable error. + if not retry_strategy.retry_allowed(total_sleep, num_retries): + raise error + + time.sleep(wait_time) diff --git a/google/cloud/storage/_media/requests/download.py b/google/cloud/storage/_media/requests/download.py new file mode 100644 index 000000000..1719cb010 --- /dev/null +++ b/google/cloud/storage/_media/requests/download.py @@ -0,0 +1,679 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Support for downloading media from Google APIs.""" + +import urllib3.response # type: ignore +import http + +from google.resumable_media import _download +from google.resumable_media import common +from google.resumable_media import _helpers +from google.resumable_media.requests import _request_helpers + + +_CHECKSUM_MISMATCH = """\ +Checksum mismatch while downloading: + + {} + +The X-Goog-Hash header indicated an {checksum_type} checksum of: + + {} + +but the actual {checksum_type} checksum of the downloaded contents was: + + {} +""" + +_STREAM_SEEK_ERROR = """\ +Incomplete download for: +{} +Error writing to stream while handling a gzip-compressed file download. +Please restart the download. +""" + + +class Download(_request_helpers.RequestsMixin, _download.Download): + """Helper to manage downloading a resource from a Google API. + + "Slices" of the resource can be retrieved by specifying a range + with ``start`` and / or ``end``. However, in typical usage, neither + ``start`` nor ``end`` is expected to be provided. + + Args: + media_url (str): The URL containing the media to be downloaded. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + the downloaded resource can be written to. + start (int): The first byte in a range to be downloaded. If not + provided, but ``end`` is provided, will download from the + beginning to ``end`` of the media. + end (int): The last byte in a range to be downloaded. If not + provided, but ``start`` is provided, will download from the + ``start`` to the end of the media. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + checksum Optional([str]): The type of checksum to compute to verify + the integrity of the object. The response headers must contain + a checksum of the requested type. If the headers lack an + appropriate checksum (for instance in the case of transcoded or + ranged downloads where the remote service does not know the + correct checksum) an INFO-level log will be emitted. Supported + values are "md5", "crc32c" and None. The default is "md5". + + Attributes: + media_url (str): The URL containing the media to be downloaded. + start (Optional[int]): The first byte in a range to be downloaded. + end (Optional[int]): The last byte in a range to be downloaded. + """ + + def _write_to_stream(self, response): + """Write response body to a write-able stream. + + .. note: + + This method assumes that the ``_stream`` attribute is set on the + current download. + + Args: + response (~requests.Response): The HTTP response object. + + Raises: + ~google.resumable_media.common.DataCorruption: If the download's + checksum doesn't agree with server-computed checksum. + """ + + # Retrieve the expected checksum only once for the download request, + # then compute and validate the checksum when the full download completes. + # Retried requests are range requests, and there's no way to detect + # data corruption for that byte range alone. + if self._expected_checksum is None and self._checksum_object is None: + # `_get_expected_checksum()` may return None even if a checksum was + # requested, in which case it will emit an info log _MISSING_CHECKSUM. + # If an invalid checksum type is specified, this will raise ValueError. + expected_checksum, checksum_object = _helpers._get_expected_checksum( + response, self._get_headers, self.media_url, checksum_type=self.checksum + ) + self._expected_checksum = expected_checksum + self._checksum_object = checksum_object + else: + expected_checksum = self._expected_checksum + checksum_object = self._checksum_object + + with response: + # NOTE: In order to handle compressed streams gracefully, we try + # to insert our checksum object into the decompression stream. If + # the stream is indeed compressed, this will delegate the checksum + # object to the decoder and return a _DoNothingHash here. + local_checksum_object = _add_decoder(response.raw, checksum_object) + body_iter = response.iter_content( + chunk_size=_request_helpers._SINGLE_GET_CHUNK_SIZE, decode_unicode=False + ) + for chunk in body_iter: + self._stream.write(chunk) + self._bytes_downloaded += len(chunk) + local_checksum_object.update(chunk) + + # Don't validate the checksum for partial responses. + if ( + expected_checksum is not None + and response.status_code != http.client.PARTIAL_CONTENT + ): + actual_checksum = _helpers.prepare_checksum_digest(checksum_object.digest()) + if actual_checksum != expected_checksum: + msg = _CHECKSUM_MISMATCH.format( + self.media_url, + expected_checksum, + actual_checksum, + checksum_type=self.checksum.upper(), + ) + raise common.DataCorruption(response, msg) + + def consume( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Consume the resource to be downloaded. + + If a ``stream`` is attached to this download, then the downloaded + resource will be written to the stream. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + + Raises: + ~google.resumable_media.common.DataCorruption: If the download's + checksum doesn't agree with server-computed checksum. + ValueError: If the current :class:`Download` has already + finished. + """ + method, _, payload, headers = self._prepare_request() + # NOTE: We assume "payload is None" but pass it along anyway. + request_kwargs = { + "data": payload, + "headers": headers, + "timeout": timeout, + } + if self._stream is not None: + request_kwargs["stream"] = True + + # Assign object generation if generation is specified in the media url. + if self._object_generation is None: + self._object_generation = _helpers._get_generation_from_url(self.media_url) + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + url = self.media_url + + # To restart an interrupted download, read from the offset of last byte + # received using a range request, and set object generation query param. + if self._bytes_downloaded > 0: + _download.add_bytes_range( + self._bytes_downloaded, self.end, self._headers + ) + request_kwargs["headers"] = self._headers + + # Set object generation query param to ensure the same object content is requested. + if ( + self._object_generation is not None + and _helpers._get_generation_from_url(self.media_url) is None + ): + query_param = {"generation": self._object_generation} + url = _helpers.add_query_parameters(self.media_url, query_param) + + result = transport.request(method, url, **request_kwargs) + + # If a generation hasn't been specified, and this is the first response we get, let's record the + # generation. In future requests we'll specify the generation query param to avoid data races. + if self._object_generation is None: + self._object_generation = _helpers._parse_generation_header( + result, self._get_headers + ) + + self._process_response(result) + + # With decompressive transcoding, GCS serves back the whole file regardless of the range request, + # thus we reset the stream position to the start of the stream. + # See: https://cloud.google.com/storage/docs/transcoding#range + if self._stream is not None: + if _helpers._is_decompressive_transcoding(result, self._get_headers): + try: + self._stream.seek(0) + except Exception as exc: + msg = _STREAM_SEEK_ERROR.format(url) + raise Exception(msg) from exc + self._bytes_downloaded = 0 + + self._write_to_stream(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class RawDownload(_request_helpers.RawRequestsMixin, _download.Download): + """Helper to manage downloading a raw resource from a Google API. + + "Slices" of the resource can be retrieved by specifying a range + with ``start`` and / or ``end``. However, in typical usage, neither + ``start`` nor ``end`` is expected to be provided. + + Args: + media_url (str): The URL containing the media to be downloaded. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + the downloaded resource can be written to. + start (int): The first byte in a range to be downloaded. If not + provided, but ``end`` is provided, will download from the + beginning to ``end`` of the media. + end (int): The last byte in a range to be downloaded. If not + provided, but ``start`` is provided, will download from the + ``start`` to the end of the media. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + checksum Optional([str]): The type of checksum to compute to verify + the integrity of the object. The response headers must contain + a checksum of the requested type. If the headers lack an + appropriate checksum (for instance in the case of transcoded or + ranged downloads where the remote service does not know the + correct checksum) an INFO-level log will be emitted. Supported + values are "md5", "crc32c" and None. The default is "md5". + Attributes: + media_url (str): The URL containing the media to be downloaded. + start (Optional[int]): The first byte in a range to be downloaded. + end (Optional[int]): The last byte in a range to be downloaded. + """ + + def _write_to_stream(self, response): + """Write response body to a write-able stream. + + .. note: + + This method assumes that the ``_stream`` attribute is set on the + current download. + + Args: + response (~requests.Response): The HTTP response object. + + Raises: + ~google.resumable_media.common.DataCorruption: If the download's + checksum doesn't agree with server-computed checksum. + """ + # Retrieve the expected checksum only once for the download request, + # then compute and validate the checksum when the full download completes. + # Retried requests are range requests, and there's no way to detect + # data corruption for that byte range alone. + if self._expected_checksum is None and self._checksum_object is None: + # `_get_expected_checksum()` may return None even if a checksum was + # requested, in which case it will emit an info log _MISSING_CHECKSUM. + # If an invalid checksum type is specified, this will raise ValueError. + expected_checksum, checksum_object = _helpers._get_expected_checksum( + response, self._get_headers, self.media_url, checksum_type=self.checksum + ) + self._expected_checksum = expected_checksum + self._checksum_object = checksum_object + else: + expected_checksum = self._expected_checksum + checksum_object = self._checksum_object + + with response: + body_iter = response.raw.stream( + _request_helpers._SINGLE_GET_CHUNK_SIZE, decode_content=False + ) + for chunk in body_iter: + self._stream.write(chunk) + self._bytes_downloaded += len(chunk) + checksum_object.update(chunk) + response._content_consumed = True + + # Don't validate the checksum for partial responses. + if ( + expected_checksum is not None + and response.status_code != http.client.PARTIAL_CONTENT + ): + actual_checksum = _helpers.prepare_checksum_digest(checksum_object.digest()) + + if actual_checksum != expected_checksum: + msg = _CHECKSUM_MISMATCH.format( + self.media_url, + expected_checksum, + actual_checksum, + checksum_type=self.checksum.upper(), + ) + raise common.DataCorruption(response, msg) + + def consume( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Consume the resource to be downloaded. + + If a ``stream`` is attached to this download, then the downloaded + resource will be written to the stream. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + + Raises: + ~google.resumable_media.common.DataCorruption: If the download's + checksum doesn't agree with server-computed checksum. + ValueError: If the current :class:`Download` has already + finished. + """ + method, _, payload, headers = self._prepare_request() + # NOTE: We assume "payload is None" but pass it along anyway. + request_kwargs = { + "data": payload, + "headers": headers, + "timeout": timeout, + "stream": True, + } + + # Assign object generation if generation is specified in the media url. + if self._object_generation is None: + self._object_generation = _helpers._get_generation_from_url(self.media_url) + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + url = self.media_url + + # To restart an interrupted download, read from the offset of last byte + # received using a range request, and set object generation query param. + if self._bytes_downloaded > 0: + _download.add_bytes_range( + self._bytes_downloaded, self.end, self._headers + ) + request_kwargs["headers"] = self._headers + + # Set object generation query param to ensure the same object content is requested. + if ( + self._object_generation is not None + and _helpers._get_generation_from_url(self.media_url) is None + ): + query_param = {"generation": self._object_generation} + url = _helpers.add_query_parameters(self.media_url, query_param) + + result = transport.request(method, url, **request_kwargs) + + # If a generation hasn't been specified, and this is the first response we get, let's record the + # generation. In future requests we'll specify the generation query param to avoid data races. + if self._object_generation is None: + self._object_generation = _helpers._parse_generation_header( + result, self._get_headers + ) + + self._process_response(result) + + # With decompressive transcoding, GCS serves back the whole file regardless of the range request, + # thus we reset the stream position to the start of the stream. + # See: https://cloud.google.com/storage/docs/transcoding#range + if self._stream is not None: + if _helpers._is_decompressive_transcoding(result, self._get_headers): + try: + self._stream.seek(0) + except Exception as exc: + msg = _STREAM_SEEK_ERROR.format(url) + raise Exception(msg) from exc + self._bytes_downloaded = 0 + + self._write_to_stream(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class ChunkedDownload(_request_helpers.RequestsMixin, _download.ChunkedDownload): + """Download a resource in chunks from a Google API. + + Args: + media_url (str): The URL containing the media to be downloaded. + chunk_size (int): The number of bytes to be retrieved in each + request. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + will be used to concatenate chunks of the resource as they are + downloaded. + start (int): The first byte in a range to be downloaded. If not + provided, defaults to ``0``. + end (int): The last byte in a range to be downloaded. If not + provided, will download to the end of the media. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with each request, e.g. headers for data encryption + key headers. + + Attributes: + media_url (str): The URL containing the media to be downloaded. + start (Optional[int]): The first byte in a range to be downloaded. + end (Optional[int]): The last byte in a range to be downloaded. + chunk_size (int): The number of bytes to be retrieved in each request. + + Raises: + ValueError: If ``start`` is negative. + """ + + def consume_next_chunk( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Consume the next chunk of the resource to be downloaded. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + + Raises: + ValueError: If the current download has finished. + """ + method, url, payload, headers = self._prepare_request() + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + # NOTE: We assume "payload is None" but pass it along anyway. + result = transport.request( + method, + url, + data=payload, + headers=headers, + timeout=timeout, + ) + self._process_response(result) + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class RawChunkedDownload(_request_helpers.RawRequestsMixin, _download.ChunkedDownload): + """Download a raw resource in chunks from a Google API. + + Args: + media_url (str): The URL containing the media to be downloaded. + chunk_size (int): The number of bytes to be retrieved in each + request. + stream (IO[bytes]): A write-able stream (i.e. file-like object) that + will be used to concatenate chunks of the resource as they are + downloaded. + start (int): The first byte in a range to be downloaded. If not + provided, defaults to ``0``. + end (int): The last byte in a range to be downloaded. If not + provided, will download to the end of the media. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with each request, e.g. headers for data encryption + key headers. + + Attributes: + media_url (str): The URL containing the media to be downloaded. + start (Optional[int]): The first byte in a range to be downloaded. + end (Optional[int]): The last byte in a range to be downloaded. + chunk_size (int): The number of bytes to be retrieved in each request. + + Raises: + ValueError: If ``start`` is negative. + """ + + def consume_next_chunk( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Consume the next chunk of the resource to be downloaded. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + + Raises: + ValueError: If the current download has finished. + """ + method, url, payload, headers = self._prepare_request() + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + # NOTE: We assume "payload is None" but pass it along anyway. + result = transport.request( + method, + url, + data=payload, + headers=headers, + stream=True, + timeout=timeout, + ) + self._process_response(result) + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +def _add_decoder(response_raw, checksum): + """Patch the ``_decoder`` on a ``urllib3`` response. + + This is so that we can intercept the compressed bytes before they are + decoded. + + Only patches if the content encoding is ``gzip`` or ``br``. + + Args: + response_raw (urllib3.response.HTTPResponse): The raw response for + an HTTP request. + checksum (object): + A checksum which will be updated with compressed bytes. + + Returns: + object: Either the original ``checksum`` if ``_decoder`` is not + patched, or a ``_DoNothingHash`` if the decoder is patched, since the + caller will no longer need to hash to decoded bytes. + """ + encoding = response_raw.headers.get("content-encoding", "").lower() + if encoding == "gzip": + response_raw._decoder = _GzipDecoder(checksum) + return _helpers._DoNothingHash() + # Only activate if brotli is installed + elif encoding == "br" and _BrotliDecoder: # type: ignore + response_raw._decoder = _BrotliDecoder(checksum) + return _helpers._DoNothingHash() + else: + return checksum + + +class _GzipDecoder(urllib3.response.GzipDecoder): + """Custom subclass of ``urllib3`` decoder for ``gzip``-ed bytes. + + Allows a checksum function to see the compressed bytes before they are + decoded. This way the checksum of the compressed value can be computed. + + Args: + checksum (object): + A checksum which will be updated with compressed bytes. + """ + + def __init__(self, checksum): + super().__init__() + self._checksum = checksum + + def decompress(self, data): + """Decompress the bytes. + + Args: + data (bytes): The compressed bytes to be decompressed. + + Returns: + bytes: The decompressed bytes from ``data``. + """ + self._checksum.update(data) + return super().decompress(data) + + +# urllib3.response.BrotliDecoder might not exist depending on whether brotli is +# installed. +if hasattr(urllib3.response, "BrotliDecoder"): + + class _BrotliDecoder: + """Handler for ``brotli`` encoded bytes. + + Allows a checksum function to see the compressed bytes before they are + decoded. This way the checksum of the compressed value can be computed. + + Because BrotliDecoder's decompress method is dynamically created in + urllib3, a subclass is not practical. Instead, this class creates a + captive urllib3.requests.BrotliDecoder instance and acts as a proxy. + + Args: + checksum (object): + A checksum which will be updated with compressed bytes. + """ + + def __init__(self, checksum): + self._decoder = urllib3.response.BrotliDecoder() + self._checksum = checksum + + def decompress(self, data): + """Decompress the bytes. + + Args: + data (bytes): The compressed bytes to be decompressed. + + Returns: + bytes: The decompressed bytes from ``data``. + """ + self._checksum.update(data) + return self._decoder.decompress(data) + + def flush(self): + return self._decoder.flush() + +else: # pragma: NO COVER + _BrotliDecoder = None # type: ignore # pragma: NO COVER diff --git a/google/cloud/storage/_media/requests/upload.py b/google/cloud/storage/_media/requests/upload.py new file mode 100644 index 000000000..00873f30d --- /dev/null +++ b/google/cloud/storage/_media/requests/upload.py @@ -0,0 +1,762 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Support for resumable uploads. + +Also supported here are simple (media) uploads and multipart +uploads that contain both metadata and a small file as payload. +""" + + +from google.resumable_media import _upload +from google.resumable_media.requests import _request_helpers + + +class SimpleUpload(_request_helpers.RequestsMixin, _upload.SimpleUpload): + """Upload a resource to a Google API. + + A **simple** media upload sends no metadata and completes the upload + in a single request. + + Args: + upload_url (str): The URL where the content will be uploaded. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + """ + + def transmit( + self, + transport, + data, + content_type, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Transmit the resource to be uploaded. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + data (bytes): The resource content to be uploaded. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + method, url, payload, headers = self._prepare_request(data, content_type) + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class MultipartUpload(_request_helpers.RequestsMixin, _upload.MultipartUpload): + """Upload a resource with metadata to a Google API. + + A **multipart** upload sends both metadata and the resource in a single + (multipart) request. + + Args: + upload_url (str): The URL where the content will be uploaded. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the request, e.g. headers for encrypted data. + checksum Optional([str]): The type of checksum to compute to verify + the integrity of the object. The request metadata will be amended + to include the computed value. Using this option will override a + manually-set checksum value. Supported values are "md5", + "crc32c" and None. The default is None. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + """ + + def transmit( + self, + transport, + data, + metadata, + content_type, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Transmit the resource to be uploaded. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + data (bytes): The resource content to be uploaded. + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + method, url, payload, headers = self._prepare_request( + data, metadata, content_type + ) + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class ResumableUpload(_request_helpers.RequestsMixin, _upload.ResumableUpload): + """Initiate and fulfill a resumable upload to a Google API. + + A **resumable** upload sends an initial request with the resource metadata + and then gets assigned an upload ID / upload URL to send bytes to. + Using the upload URL, the upload is then done in chunks (determined by + the user) until all bytes have been uploaded. + + When constructing a resumable upload, only the resumable upload URL and + the chunk size are required: + + .. testsetup:: resumable-constructor + + bucket = 'bucket-foo' + + .. doctest:: resumable-constructor + + >>> from google.resumable_media.requests import ResumableUpload + >>> + >>> url_template = ( + ... 'https://www.googleapis.com/upload/storage/v1/b/{bucket}/o?' + ... 'uploadType=resumable') + >>> upload_url = url_template.format(bucket=bucket) + >>> + >>> chunk_size = 3 * 1024 * 1024 # 3MB + >>> upload = ResumableUpload(upload_url, chunk_size) + + When initiating an upload (via :meth:`initiate`), the caller is expected + to pass the resource being uploaded as a file-like ``stream``. If the size + of the resource is explicitly known, it can be passed in directly: + + .. testsetup:: resumable-explicit-size + + import os + import tempfile + + import mock + import requests + import http.client + + from google.resumable_media.requests import ResumableUpload + + upload_url = 'http://test.invalid' + chunk_size = 3 * 1024 * 1024 # 3MB + upload = ResumableUpload(upload_url, chunk_size) + + file_desc, filename = tempfile.mkstemp() + os.close(file_desc) + + data = b'some bytes!' + with open(filename, 'wb') as file_obj: + file_obj.write(data) + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + fake_response._content = b'' + resumable_url = 'http://test.invalid?upload_id=7up' + fake_response.headers['location'] = resumable_url + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + + .. doctest:: resumable-explicit-size + + >>> import os + >>> + >>> upload.total_bytes is None + True + >>> + >>> stream = open(filename, 'rb') + >>> total_bytes = os.path.getsize(filename) + >>> metadata = {'name': filename} + >>> response = upload.initiate( + ... transport, stream, metadata, 'text/plain', + ... total_bytes=total_bytes) + >>> response + + >>> + >>> upload.total_bytes == total_bytes + True + + .. testcleanup:: resumable-explicit-size + + os.remove(filename) + + If the stream is in a "final" state (i.e. it won't have any more bytes + written to it), the total number of bytes can be determined implicitly + from the ``stream`` itself: + + .. testsetup:: resumable-implicit-size + + import io + + import mock + import requests + import http.client + + from google.resumable_media.requests import ResumableUpload + + upload_url = 'http://test.invalid' + chunk_size = 3 * 1024 * 1024 # 3MB + upload = ResumableUpload(upload_url, chunk_size) + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + fake_response._content = b'' + resumable_url = 'http://test.invalid?upload_id=7up' + fake_response.headers['location'] = resumable_url + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + + data = b'some MOAR bytes!' + metadata = {'name': 'some-file.jpg'} + content_type = 'image/jpeg' + + .. doctest:: resumable-implicit-size + + >>> stream = io.BytesIO(data) + >>> response = upload.initiate( + ... transport, stream, metadata, content_type) + >>> + >>> upload.total_bytes == len(data) + True + + If the size of the resource is **unknown** when the upload is initiated, + the ``stream_final`` argument can be used. This might occur if the + resource is being dynamically created on the client (e.g. application + logs). To use this argument: + + .. testsetup:: resumable-unknown-size + + import io + + import mock + import requests + import http.client + + from google.resumable_media.requests import ResumableUpload + + upload_url = 'http://test.invalid' + chunk_size = 3 * 1024 * 1024 # 3MB + upload = ResumableUpload(upload_url, chunk_size) + + fake_response = requests.Response() + fake_response.status_code = int(http.client.OK) + fake_response._content = b'' + resumable_url = 'http://test.invalid?upload_id=7up' + fake_response.headers['location'] = resumable_url + + post_method = mock.Mock(return_value=fake_response, spec=[]) + transport = mock.Mock(request=post_method, spec=['request']) + + metadata = {'name': 'some-file.jpg'} + content_type = 'application/octet-stream' + + stream = io.BytesIO(b'data') + + .. doctest:: resumable-unknown-size + + >>> response = upload.initiate( + ... transport, stream, metadata, content_type, + ... stream_final=False) + >>> + >>> upload.total_bytes is None + True + + Args: + upload_url (str): The URL where the resumable upload will be initiated. + chunk_size (int): The size of each chunk used to upload the resource. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the :meth:`initiate` request, e.g. headers for + encrypted data. These **will not** be sent with + :meth:`transmit_next_chunk` or :meth:`recover` requests. + checksum Optional([str]): The type of checksum to compute to verify + the integrity of the object. After the upload is complete, the + server-computed checksum of the resulting object will be checked + and google.resumable_media.common.DataCorruption will be raised on + a mismatch. The corrupted file will not be deleted from the remote + host automatically. Supported values are "md5", "crc32c" and None. + The default is None. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + + Raises: + ValueError: If ``chunk_size`` is not a multiple of + :data:`.UPLOAD_CHUNK_SIZE`. + """ + + def initiate( + self, + transport, + stream, + metadata, + content_type, + total_bytes=None, + stream_final=True, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Initiate a resumable upload. + + By default, this method assumes your ``stream`` is in a "final" + state ready to transmit. However, ``stream_final=False`` can be used + to indicate that the size of the resource is not known. This can happen + if bytes are being dynamically fed into ``stream``, e.g. if the stream + is attached to application logs. + + If ``stream_final=False`` is used, :attr:`chunk_size` bytes will be + read from the stream every time :meth:`transmit_next_chunk` is called. + If one of those reads produces strictly fewer bites than the chunk + size, the upload will be concluded. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + stream (IO[bytes]): The stream (i.e. file-like object) that will + be uploaded. The stream **must** be at the beginning (i.e. + ``stream.tell() == 0``). + metadata (Mapping[str, str]): The resource metadata, such as an + ACL list. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + total_bytes (Optional[int]): The total number of bytes to be + uploaded. If specified, the upload size **will not** be + determined from the stream (even if ``stream_final=True``). + stream_final (Optional[bool]): Indicates if the ``stream`` is + "final" (i.e. no more bytes will be added to it). In this case + we determine the upload size from the size of the stream. If + ``total_bytes`` is passed, this argument will be ignored. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + method, url, payload, headers = self._prepare_initiate_request( + stream, + metadata, + content_type, + total_bytes=total_bytes, + stream_final=stream_final, + ) + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_initiate_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + def transmit_next_chunk( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Transmit the next chunk of the resource to be uploaded. + + If the current upload was initiated with ``stream_final=False``, + this method will dynamically determine if the upload has completed. + The upload will be considered complete if the stream produces + fewer than :attr:`chunk_size` bytes when a chunk is read from it. + + In the case of failure, an exception is thrown that preserves the + failed response: + + .. testsetup:: bad-response + + import io + + import mock + import requests + import http.client + + from google import resumable_media + import google.resumable_media.requests.upload as upload_mod + + transport = mock.Mock(spec=['request']) + fake_response = requests.Response() + fake_response.status_code = int(http.client.BAD_REQUEST) + transport.request.return_value = fake_response + + upload_url = 'http://test.invalid' + upload = upload_mod.ResumableUpload( + upload_url, resumable_media.UPLOAD_CHUNK_SIZE) + # Fake that the upload has been initiate()-d + data = b'data is here' + upload._stream = io.BytesIO(data) + upload._total_bytes = len(data) + upload._resumable_url = 'http://test.invalid?upload_id=nope' + + .. doctest:: bad-response + :options: +NORMALIZE_WHITESPACE + + >>> error = None + >>> try: + ... upload.transmit_next_chunk(transport) + ... except resumable_media.InvalidResponse as caught_exc: + ... error = caught_exc + ... + >>> error + InvalidResponse('Request failed with status code', 400, + 'Expected one of', , ) + >>> error.response + + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + + Raises: + ~google.resumable_media.common.InvalidResponse: If the status + code is not 200 or http.client.PERMANENT_REDIRECT. + ~google.resumable_media.common.DataCorruption: If this is the final + chunk, a checksum validation was requested, and the checksum + does not match or is not available. + """ + method, url, payload, headers = self._prepare_request() + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_resumable_response(result, len(payload)) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + def recover(self, transport): + """Recover from a failure and check the status of the current upload. + + This will verify the progress with the server and make sure the + current upload is in a valid state before :meth:`transmit_next_chunk` + can be used again. See https://cloud.google.com/storage/docs/performing-resumable-uploads#status-check + for more information. + + This method can be used when a :class:`ResumableUpload` is in an + :attr:`~ResumableUpload.invalid` state due to a request failure. + + Args: + transport (~requests.Session): A ``requests`` object which can + make authenticated requests. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + timeout = ( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ) + + method, url, payload, headers = self._prepare_recover_request() + # NOTE: We assume "payload is None" but pass it along anyway. + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_recover_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class XMLMPUContainer(_request_helpers.RequestsMixin, _upload.XMLMPUContainer): + """Initiate and close an upload using the XML MPU API. + + An XML MPU sends an initial request and then receives an upload ID. + Using the upload ID, the upload is then done in numbered parts and the + parts can be uploaded concurrently. + + In order to avoid concurrency issues with this container object, the + uploading of individual parts is handled separately, by XMLMPUPart objects + spawned from this container class. The XMLMPUPart objects are not + necessarily in the same process as the container, so they do not update the + container automatically. + + MPUs are sometimes referred to as "Multipart Uploads", which is ambiguous + given the JSON multipart upload, so the abbreviation "MPU" will be used + throughout. + + See: https://cloud.google.com/storage/docs/multipart-uploads + + Args: + upload_url (str): The URL of the object (without query parameters). The + initiate, PUT, and finalization requests will all use this URL, with + varying query parameters. + headers (Optional[Mapping[str, str]]): Extra headers that should + be sent with the :meth:`initiate` request, e.g. headers for + encrypted data. These headers will be propagated to individual + XMLMPUPart objects spawned from this container as well. + + Attributes: + upload_url (str): The URL where the content will be uploaded. + upload_id (Optional(int)): The ID of the upload from the initialization + response. + """ + + def initiate( + self, + transport, + content_type, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Initiate an MPU and record the upload ID. + + Args: + transport (object): An object which can make authenticated + requests. + content_type (str): The content type of the resource, e.g. a JPEG + image has content type ``image/jpeg``. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + + method, url, payload, headers = self._prepare_initiate_request( + content_type, + ) + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_initiate_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + def finalize( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Finalize an MPU request with all the parts. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + method, url, payload, headers = self._prepare_finalize_request() + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_finalize_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + def cancel( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Cancel an MPU request and permanently delete any uploaded parts. + + This cannot be undone. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + method, url, payload, headers = self._prepare_cancel_request() + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_cancel_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) + + +class XMLMPUPart(_request_helpers.RequestsMixin, _upload.XMLMPUPart): + def upload( + self, + transport, + timeout=( + _request_helpers._DEFAULT_CONNECT_TIMEOUT, + _request_helpers._DEFAULT_READ_TIMEOUT, + ), + ): + """Upload the part. + + Args: + transport (object): An object which can make authenticated + requests. + timeout (Optional[Union[float, Tuple[float, float]]]): + The number of seconds to wait for the server response. + Depending on the retry strategy, a request may be repeated + several times using the same timeout each time. + + Can also be passed as a tuple (connect_timeout, read_timeout). + See :meth:`requests.Session.request` documentation for details. + + Returns: + ~requests.Response: The HTTP response returned by ``transport``. + """ + method, url, payload, headers = self._prepare_upload_request() + + # Wrap the request business logic in a function to be retried. + def retriable_request(): + result = transport.request( + method, url, data=payload, headers=headers, timeout=timeout + ) + + self._process_upload_response(result) + + return result + + return _request_helpers.wait_and_retry( + retriable_request, self._get_status_code, self._retry_strategy + ) diff --git a/tests/resumable_media/__init__.py b/tests/resumable_media/__init__.py new file mode 100644 index 000000000..7c07b241f --- /dev/null +++ b/tests/resumable_media/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/resumable_media/data/brotli.txt b/tests/resumable_media/data/brotli.txt new file mode 100644 index 000000000..da07c5107 --- /dev/null +++ b/tests/resumable_media/data/brotli.txt @@ -0,0 +1,64 @@ +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 diff --git a/tests/resumable_media/data/brotli.txt.br b/tests/resumable_media/data/brotli.txt.br new file mode 100644 index 0000000000000000000000000000000000000000..84828432cc5ca79230cb35b9f22d6a188a87b8dc GIT binary patch literal 45 zcmV+|0Mh@#_({MogY)`Yf?K2x#)(10R09BLW1SB%N#)VV> D1|St` literal 0 HcmV?d00001 diff --git a/tests/resumable_media/data/favicon.ico b/tests/resumable_media/data/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e9c59160aa3c0472ba6c146641c40c53acb88339 GIT binary patch literal 905 zcmV;419tq0P)|IR_k)ZW`jI@?D%+eteA&O+QrI#G}I+(|tD%thiy zJO9&0Q%KC)1cX_mD+P<)6J#k&3oIJh4{-!o}$dx zw55fizVxF%P>=TK#9H83JKIP(lx>~sggwW)d{B<{|IR`G&O=a+_1i`||IS0&NIKg` zJ5i1I|IR{Bj`rF}IseT;+ebS8&q3QpI{(i?+ekc7jP(D^L;uf1*Gf6uPC!$S_~A=D z|IR|AW`)>JJI~nMPmT5e%|Y5mIsgCv=F^kY+uu@;_2}&G;N|Gn-r@B2_w4ZTiM zh5!HoZ%IT!R5;76l2=2*FcgJTL_k3i0r%c}@4ffl+7@I9xcB(?_MWa3eDHzqrO7>C zZ_+d@X9VUY3rhiOF0@J+^avKgD`ny3^PrSXG{`NmF8#r#DV(XVjO6LeofAphHOTOH|ZpM(W<}n%%sSO0iE+9B7m0}u3lJaT? zgi@xk0b@`k5~+9ugMQ>&jIcRjG>II|$Q^bD_91j|d07jD1O0b*!ss@IKI9(bS{_5F z>Alvdt%7i3UbzL?!W8ml?q2&X`8aZXqQN$oJ3YvE7>~_m3bV)y?aYGDFdE&+&she7 fO~VcZ_FsMhDthOL3xKsS00000NkvXXu0mjfmTc(@ literal 0 HcmV?d00001 diff --git a/tests/resumable_media/data/file.txt b/tests/resumable_media/data/file.txt new file mode 100644 index 000000000..da07c5107 --- /dev/null +++ b/tests/resumable_media/data/file.txt @@ -0,0 +1,64 @@ +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 diff --git a/tests/resumable_media/data/gzipped.txt b/tests/resumable_media/data/gzipped.txt new file mode 100644 index 000000000..da07c5107 --- /dev/null +++ b/tests/resumable_media/data/gzipped.txt @@ -0,0 +1,64 @@ +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 +abcdefghijklmnopqrstuvwxyz0123456789 diff --git a/tests/resumable_media/data/gzipped.txt.gz b/tests/resumable_media/data/gzipped.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..83e9f396c3c2937a0f016fd77e7ff4898ffd1dc2 GIT binary patch literal 89 zcmV-f0H*&RiwFomBI;QJ|8#9|LScGYR#^Z`OiE5kO-s+n%*xKm&C4$+EGjN3Ei136 vtTHe(GBz1b?f19T-a0a{qu^OIb*casoV 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ËB~1YrDKj(MD0E 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 z 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%0D)WV5g5(SG7H8rkhsv2H);h!Z7MzoO4T&F^EIh( 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 z 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

RS!rWrn&}T38VoUh5|A*w;$OA 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 z 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

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv&package-manager=pip&previous-version=20.26.3&new-version=20.26.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://togithub.com/googleapis/python-storage/network/alerts).
--- .kokoro/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 9622baf0b..14466eb39 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -517,9 +517,9 @@ urllib3==2.2.2 \ # via # requests # twine -virtualenv==20.26.3 \ - --hash=sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a \ - --hash=sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589 +virtualenv==20.26.6 \ + --hash=sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48 \ + --hash=sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2 # via nox wheel==0.43.0 \ --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ From c869e15ec535a0aa50029d30b6a3ce64ff119b5f Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Thu, 27 Feb 2025 15:56:22 -0800 Subject: [PATCH 325/509] Feat: Add api_key argument to Client constructor (#1441) --- google/cloud/storage/client.py | 19 ++++++++++++++ setup.py | 2 +- tests/unit/test_client.py | 47 ++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 4a9d606a0..ba94b26fc 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -108,6 +108,12 @@ class Client(ClientWithProject): :param extra_headers: (Optional) Custom headers to be sent with the requests attached to the client. For example, you can add custom audit logging headers. + + :type api_key: string + :param api_key: + (Optional) An API key. Mutually exclusive with any other credentials. + This parameter is an alias for setting `client_options.api_key` and + will supercede any api key set in the `client_options` parameter. """ SCOPE = ( @@ -126,6 +132,8 @@ def __init__( client_options=None, use_auth_w_custom_endpoint=True, extra_headers={}, + *, + api_key=None, ): self._base_connection = None @@ -146,6 +154,17 @@ def __init__( connection_kw_args = {"client_info": client_info} + # api_key should set client_options.api_key. Set it here whether + # client_options was specified as a dict, as a ClientOptions object, or + # None. + if api_key: + if client_options and not isinstance(client_options, dict): + client_options.api_key = api_key + else: + if not client_options: + client_options = {} + client_options["api_key"] = api_key + if client_options: if isinstance(client_options, dict): client_options = google.api_core.client_options.from_dict( diff --git a/setup.py b/setup.py index 84eedd4f2..31c360f40 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ dependencies = [ "google-auth >= 2.26.1, < 3.0dev", "google-api-core >= 2.15.0, <3.0.0dev", - "google-cloud-core >= 2.3.0, < 3.0dev", + "google-cloud-core >= 2.4.2, < 3.0dev", # The dependency "google-resumable-media" is no longer used. However, the # dependency is still included here to accommodate users who may be # importing exception classes from the google-resumable-media without diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 0bef1ea91..b671cc092 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -191,6 +191,53 @@ def test_ctor_w_client_options_object(self): self.assertEqual(client._connection.API_BASE_URL, api_endpoint) self.assertEqual(client.api_endpoint, api_endpoint) + def test_ctor_w_api_key(self): + from google.auth.api_key import Credentials + + PROJECT = "PROJECT" + api_key = "my_api_key" + + client = self._make_one(project=PROJECT, api_key=api_key) + + self.assertEqual( + client._connection.API_BASE_URL, client._connection.DEFAULT_API_ENDPOINT + ) + self.assertIsInstance(client._credentials, Credentials) + self.assertEqual(client._credentials.token, api_key) + + def test_ctor_w_api_key_and_client_options(self): + from google.auth.api_key import Credentials + from google.api_core.client_options import ClientOptions + + PROJECT = "PROJECT" + api_key = "my_api_key" + api_endpoint = "https://www.foo-googleapis.com" + client_options = ClientOptions(api_endpoint=api_endpoint) + + client = self._make_one( + project=PROJECT, client_options=client_options, api_key=api_key + ) + + self.assertEqual(client._connection.API_BASE_URL, api_endpoint) + self.assertIsInstance(client._credentials, Credentials) + self.assertEqual(client._credentials.token, api_key) + + def test_ctor_w_api_key_and_client_dict(self): + from google.auth.api_key import Credentials + + PROJECT = "PROJECT" + api_key = "my_api_key" + api_endpoint = "https://www.foo-googleapis.com" + client_options = {"api_endpoint": api_endpoint} + + client = self._make_one( + project=PROJECT, client_options=client_options, api_key=api_key + ) + + self.assertEqual(client._connection.API_BASE_URL, api_endpoint) + self.assertIsInstance(client._credentials, Credentials) + self.assertEqual(client._credentials.token, api_key) + def test_ctor_w_universe_domain_and_matched_credentials(self): PROJECT = "PROJECT" universe_domain = "example.com" From aa7afdff7eb92ee0c460e508b65f3b2917288268 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:12:25 +0000 Subject: [PATCH 326/509] chore(main): release 3.1.0 (#1435) :robot: I have created a release *beep* *boop* --- ## [3.1.0](https://togithub.com/googleapis/python-storage/compare/v3.0.0...v3.1.0) (2025-02-27) ### Features * Add api_key argument to Client constructor ([#1441](https://togithub.com/googleapis/python-storage/issues/1441)) ([c869e15](https://togithub.com/googleapis/python-storage/commit/c869e15ec535a0aa50029d30b6a3ce64ff119b5f)) * Add Bucket.move_blob() for HNS-enabled buckets ([#1431](https://togithub.com/googleapis/python-storage/issues/1431)) ([24c000f](https://togithub.com/googleapis/python-storage/commit/24c000fb7b9f576e6d6c6ec5733f3971fe133655)) --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). --- CHANGELOG.md | 8 ++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcf58ac2a..fefb84f50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.1.0](https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0) (2025-02-27) + + +### Features + +* Add api_key argument to Client constructor ([#1441](https://github.com/googleapis/python-storage/issues/1441)) ([c869e15](https://github.com/googleapis/python-storage/commit/c869e15ec535a0aa50029d30b6a3ce64ff119b5f)) +* Add Bucket.move_blob() for HNS-enabled buckets ([#1431](https://github.com/googleapis/python-storage/issues/1431)) ([24c000f](https://github.com/googleapis/python-storage/commit/24c000fb7b9f576e6d6c6ec5733f3971fe133655)) + ## [3.0.0](https://github.com/googleapis/python-storage/compare/v2.19.0...v3.0.0) (2025-01-28) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index d6f7def8c..6ce498ba5 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.0.0" +__version__ = "3.1.0" From 4110408b97d84bb7fda0c2f5e4eafd008871348f Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Mon, 10 Mar 2025 10:27:20 -0400 Subject: [PATCH 327/509] chore: remove unused files (#1444) --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/docker/docs/Dockerfile | 89 ----- .kokoro/docker/docs/fetch_gpg_keys.sh | 45 --- .kokoro/docker/docs/requirements.in | 2 - .kokoro/docker/docs/requirements.txt | 297 -------------- .kokoro/docs/common.cfg | 66 ---- .kokoro/docs/docs-presubmit.cfg | 28 -- .kokoro/docs/docs.cfg | 1 - .kokoro/publish-docs.sh | 58 --- .kokoro/release.sh | 29 -- .kokoro/release/common.cfg | 49 --- .kokoro/release/release.cfg | 1 - .kokoro/requirements.in | 11 - .kokoro/requirements.txt | 537 -------------------------- 14 files changed, 2 insertions(+), 1215 deletions(-) delete mode 100644 .kokoro/docker/docs/Dockerfile delete mode 100755 .kokoro/docker/docs/fetch_gpg_keys.sh delete mode 100644 .kokoro/docker/docs/requirements.in delete mode 100644 .kokoro/docker/docs/requirements.txt delete mode 100644 .kokoro/docs/common.cfg delete mode 100644 .kokoro/docs/docs-presubmit.cfg delete mode 100644 .kokoro/docs/docs.cfg delete mode 100755 .kokoro/publish-docs.sh delete mode 100755 .kokoro/release.sh delete mode 100644 .kokoro/release/common.cfg delete mode 100644 .kokoro/release/release.cfg delete mode 100644 .kokoro/requirements.in delete mode 100644 .kokoro/requirements.txt diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 3f7634f25..c631e1f7d 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:f016446d6e520e5fb552c45b110cba3f217bffdd3d06bdddd076e9e6d13266cf -# created: 2025-02-21T19:32:52.01306189Z + digest: sha256:5581906b957284864632cde4e9c51d1cc66b0094990b27e689132fe5cd036046 +# created: 2025-03-05 diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile deleted file mode 100644 index e5410e296..000000000 --- a/.kokoro/docker/docs/Dockerfile +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ubuntu:24.04 - -ENV DEBIAN_FRONTEND noninteractive - -# Ensure local Python is preferred over distribution Python. -ENV PATH /usr/local/bin:$PATH - -# Install dependencies. -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - apt-transport-https \ - build-essential \ - ca-certificates \ - curl \ - dirmngr \ - git \ - gpg-agent \ - graphviz \ - libbz2-dev \ - libdb5.3-dev \ - libexpat1-dev \ - libffi-dev \ - liblzma-dev \ - libreadline-dev \ - libsnappy-dev \ - libssl-dev \ - libsqlite3-dev \ - portaudio19-dev \ - redis-server \ - software-properties-common \ - ssh \ - sudo \ - tcl \ - tcl-dev \ - tk \ - tk-dev \ - uuid-dev \ - wget \ - zlib1g-dev \ - && add-apt-repository universe \ - && apt-get update \ - && apt-get -y install jq \ - && apt-get clean autoclean \ - && apt-get autoremove -y \ - && rm -rf /var/lib/apt/lists/* \ - && rm -f /var/cache/apt/archives/*.deb - - -###################### Install python 3.10.14 for docs/docfx session - -# Download python 3.10.14 -RUN wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz - -# Extract files -RUN tar -xvf Python-3.10.14.tgz - -# Install python 3.10.14 -RUN ./Python-3.10.14/configure --enable-optimizations -RUN make altinstall - -ENV PATH /usr/local/bin/python3.10:$PATH - -###################### Install pip -RUN wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \ - && python3.10 /tmp/get-pip.py \ - && rm /tmp/get-pip.py - -# Test pip -RUN python3.10 -m pip - -# Install build requirements -COPY requirements.txt /requirements.txt -RUN python3.10 -m pip install --require-hashes -r requirements.txt - -CMD ["python3.10"] diff --git a/.kokoro/docker/docs/fetch_gpg_keys.sh b/.kokoro/docker/docs/fetch_gpg_keys.sh deleted file mode 100755 index d653dd868..000000000 --- a/.kokoro/docker/docs/fetch_gpg_keys.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# A script to fetch gpg keys with retry. -# Avoid jinja parsing the file. -# - -function retry { - if [[ "${#}" -le 1 ]]; then - echo "Usage: ${0} retry_count commands.." - exit 1 - fi - local retries=${1} - local command="${@:2}" - until [[ "${retries}" -le 0 ]]; do - $command && return 0 - if [[ $? -ne 0 ]]; then - echo "command failed, retrying" - ((retries--)) - fi - done - return 1 -} - -# 3.6.9, 3.7.5 (Ned Deily) -retry 3 gpg --keyserver ha.pool.sks-keyservers.net --recv-keys \ - 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D - -# 3.8.0 (Łukasz Langa) -retry 3 gpg --keyserver ha.pool.sks-keyservers.net --recv-keys \ - E3FF2839C048B25C084DEBE9B26995E310250568 - -# diff --git a/.kokoro/docker/docs/requirements.in b/.kokoro/docker/docs/requirements.in deleted file mode 100644 index 586bd0703..000000000 --- a/.kokoro/docker/docs/requirements.in +++ /dev/null @@ -1,2 +0,0 @@ -nox -gcp-docuploader diff --git a/.kokoro/docker/docs/requirements.txt b/.kokoro/docker/docs/requirements.txt deleted file mode 100644 index a9360a25b..000000000 --- a/.kokoro/docker/docs/requirements.txt +++ /dev/null @@ -1,297 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --allow-unsafe --generate-hashes requirements.in -# -argcomplete==3.5.3 \ - --hash=sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61 \ - --hash=sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392 - # via nox -cachetools==5.5.0 \ - --hash=sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292 \ - --hash=sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a - # via google-auth -certifi==2024.12.14 \ - --hash=sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56 \ - --hash=sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db - # via requests -charset-normalizer==3.4.1 \ - --hash=sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537 \ - --hash=sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa \ - --hash=sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a \ - --hash=sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294 \ - --hash=sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b \ - --hash=sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd \ - --hash=sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601 \ - --hash=sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd \ - --hash=sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4 \ - --hash=sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d \ - --hash=sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2 \ - --hash=sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313 \ - --hash=sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd \ - --hash=sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa \ - --hash=sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8 \ - --hash=sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1 \ - --hash=sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2 \ - --hash=sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496 \ - --hash=sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d \ - --hash=sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b \ - --hash=sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e \ - --hash=sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a \ - --hash=sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4 \ - --hash=sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca \ - --hash=sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78 \ - --hash=sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408 \ - --hash=sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5 \ - --hash=sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3 \ - --hash=sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f \ - --hash=sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a \ - --hash=sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765 \ - --hash=sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6 \ - --hash=sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146 \ - --hash=sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6 \ - --hash=sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9 \ - --hash=sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd \ - --hash=sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c \ - --hash=sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f \ - --hash=sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545 \ - --hash=sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176 \ - --hash=sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770 \ - --hash=sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824 \ - --hash=sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f \ - --hash=sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf \ - --hash=sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487 \ - --hash=sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d \ - --hash=sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd \ - --hash=sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b \ - --hash=sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534 \ - --hash=sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f \ - --hash=sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b \ - --hash=sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9 \ - --hash=sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd \ - --hash=sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125 \ - --hash=sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9 \ - --hash=sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de \ - --hash=sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 \ - --hash=sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d \ - --hash=sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35 \ - --hash=sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f \ - --hash=sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda \ - --hash=sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7 \ - --hash=sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a \ - --hash=sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971 \ - --hash=sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8 \ - --hash=sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41 \ - --hash=sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d \ - --hash=sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f \ - --hash=sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757 \ - --hash=sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a \ - --hash=sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886 \ - --hash=sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77 \ - --hash=sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76 \ - --hash=sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247 \ - --hash=sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85 \ - --hash=sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb \ - --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \ - --hash=sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e \ - --hash=sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6 \ - --hash=sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037 \ - --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \ - --hash=sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e \ - --hash=sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807 \ - --hash=sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407 \ - --hash=sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c \ - --hash=sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12 \ - --hash=sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3 \ - --hash=sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089 \ - --hash=sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd \ - --hash=sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e \ - --hash=sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00 \ - --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616 - # via requests -click==8.1.8 \ - --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 \ - --hash=sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a - # via gcp-docuploader -colorlog==6.9.0 \ - --hash=sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff \ - --hash=sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2 - # via - # gcp-docuploader - # nox -distlib==0.3.9 \ - --hash=sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87 \ - --hash=sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403 - # via virtualenv -filelock==3.16.1 \ - --hash=sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0 \ - --hash=sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435 - # via virtualenv -gcp-docuploader==0.6.5 \ - --hash=sha256:30221d4ac3e5a2b9c69aa52fdbef68cc3f27d0e6d0d90e220fc024584b8d2318 \ - --hash=sha256:b7458ef93f605b9d46a4bf3a8dc1755dad1f31d030c8679edf304e343b347eea - # via -r requirements.in -google-api-core==2.24.0 \ - --hash=sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9 \ - --hash=sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf - # via - # google-cloud-core - # google-cloud-storage -google-auth==2.37.0 \ - --hash=sha256:0054623abf1f9c83492c63d3f47e77f0a544caa3d40b2d98e099a611c2dd5d00 \ - --hash=sha256:42664f18290a6be591be5329a96fe30184be1a1badb7292a7f686a9659de9ca0 - # via - # google-api-core - # google-cloud-core - # google-cloud-storage -google-cloud-core==2.4.1 \ - --hash=sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073 \ - --hash=sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61 - # via google-cloud-storage -google-cloud-storage==2.19.0 \ - --hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \ - --hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2 - # via gcp-docuploader -google-crc32c==1.6.0 \ - --hash=sha256:05e2d8c9a2f853ff116db9706b4a27350587f341eda835f46db3c0a8c8ce2f24 \ - --hash=sha256:18e311c64008f1f1379158158bb3f0c8d72635b9eb4f9545f8cf990c5668e59d \ - --hash=sha256:236c87a46cdf06384f614e9092b82c05f81bd34b80248021f729396a78e55d7e \ - --hash=sha256:35834855408429cecf495cac67ccbab802de269e948e27478b1e47dfb6465e57 \ - --hash=sha256:386122eeaaa76951a8196310432c5b0ef3b53590ef4c317ec7588ec554fec5d2 \ - --hash=sha256:40b05ab32a5067525670880eb5d169529089a26fe35dce8891127aeddc1950e8 \ - --hash=sha256:48abd62ca76a2cbe034542ed1b6aee851b6f28aaca4e6551b5599b6f3ef175cc \ - --hash=sha256:50cf2a96da226dcbff8671233ecf37bf6e95de98b2a2ebadbfdf455e6d05df42 \ - --hash=sha256:51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f \ - --hash=sha256:5bcc90b34df28a4b38653c36bb5ada35671ad105c99cfe915fb5bed7ad6924aa \ - --hash=sha256:62f6d4a29fea082ac4a3c9be5e415218255cf11684ac6ef5488eea0c9132689b \ - --hash=sha256:6eceb6ad197656a1ff49ebfbbfa870678c75be4344feb35ac1edf694309413dc \ - --hash=sha256:7aec8e88a3583515f9e0957fe4f5f6d8d4997e36d0f61624e70469771584c760 \ - --hash=sha256:91ca8145b060679ec9176e6de4f89b07363d6805bd4760631ef254905503598d \ - --hash=sha256:a184243544811e4a50d345838a883733461e67578959ac59964e43cca2c791e7 \ - --hash=sha256:a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d \ - --hash=sha256:bb0966e1c50d0ef5bc743312cc730b533491d60585a9a08f897274e57c3f70e0 \ - --hash=sha256:bb8b3c75bd157010459b15222c3fd30577042a7060e29d42dabce449c087f2b3 \ - --hash=sha256:bd5e7d2445d1a958c266bfa5d04c39932dc54093fa391736dbfdb0f1929c1fb3 \ - --hash=sha256:c87d98c7c4a69066fd31701c4e10d178a648c2cac3452e62c6b24dc51f9fcc00 \ - --hash=sha256:d2952396dc604544ea7476b33fe87faedc24d666fb0c2d5ac971a2b9576ab871 \ - --hash=sha256:d8797406499f28b5ef791f339594b0b5fdedf54e203b5066675c406ba69d705c \ - --hash=sha256:d9e9913f7bd69e093b81da4535ce27af842e7bf371cde42d1ae9e9bd382dc0e9 \ - --hash=sha256:e2806553238cd076f0a55bddab37a532b53580e699ed8e5606d0de1f856b5205 \ - --hash=sha256:ebab974b1687509e5c973b5c4b8b146683e101e102e17a86bd196ecaa4d099fc \ - --hash=sha256:ed767bf4ba90104c1216b68111613f0d5926fb3780660ea1198fc469af410e9d \ - --hash=sha256:f7a1fc29803712f80879b0806cb83ab24ce62fc8daf0569f2204a0cfd7f68ed4 - # via - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.7.2 \ - --hash=sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa \ - --hash=sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0 - # via google-cloud-storage -googleapis-common-protos==1.66.0 \ - --hash=sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c \ - --hash=sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed - # via google-api-core -idna==3.10 \ - --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ - --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 - # via requests -nox==2024.10.9 \ - --hash=sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab \ - --hash=sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95 - # via -r requirements.in -packaging==24.2 \ - --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 \ - --hash=sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f - # via nox -platformdirs==4.3.6 \ - --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ - --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb - # via virtualenv -proto-plus==1.25.0 \ - --hash=sha256:c91fc4a65074ade8e458e95ef8bac34d4008daa7cce4a12d6707066fca648961 \ - --hash=sha256:fbb17f57f7bd05a68b7707e745e26528b0b3c34e378db91eef93912c54982d91 - # via google-api-core -protobuf==5.29.3 \ - --hash=sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f \ - --hash=sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7 \ - --hash=sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888 \ - --hash=sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620 \ - --hash=sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da \ - --hash=sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252 \ - --hash=sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a \ - --hash=sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e \ - --hash=sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107 \ - --hash=sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f \ - --hash=sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84 - # via - # gcp-docuploader - # google-api-core - # googleapis-common-protos - # proto-plus -pyasn1==0.6.1 \ - --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 \ - --hash=sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034 - # via - # pyasn1-modules - # rsa -pyasn1-modules==0.4.1 \ - --hash=sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd \ - --hash=sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c - # via google-auth -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 - # via - # google-api-core - # google-cloud-storage -rsa==4.9 \ - --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ - --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 - # via google-auth -six==1.17.0 \ - --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ - --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 - # via gcp-docuploader -tomli==2.2.1 \ - --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \ - --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \ - --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \ - --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \ - --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \ - --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \ - --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \ - --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \ - --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \ - --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \ - --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \ - --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \ - --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \ - --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \ - --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \ - --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \ - --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \ - --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \ - --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \ - --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \ - --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \ - --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \ - --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \ - --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \ - --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \ - --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \ - --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \ - --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \ - --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \ - --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \ - --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \ - --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7 - # via nox -urllib3==2.3.0 \ - --hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \ - --hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d - # via requests -virtualenv==20.28.1 \ - --hash=sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb \ - --hash=sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329 - # via nox diff --git a/.kokoro/docs/common.cfg b/.kokoro/docs/common.cfg deleted file mode 100644 index 73480a2ff..000000000 --- a/.kokoro/docs/common.cfg +++ /dev/null @@ -1,66 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - } -} - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "python-storage/.kokoro/trampoline_v2.sh" - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/python-lib-docs" -} -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/python-storage/.kokoro/publish-docs.sh" -} - -env_vars: { - key: "STAGING_BUCKET" - value: "docs-staging" -} - -env_vars: { - key: "V2_STAGING_BUCKET" - # Push google cloud library docs to the Cloud RAD bucket `docs-staging-v2` - value: "docs-staging-v2" -} - -# It will upload the docker image after successful builds. -env_vars: { - key: "TRAMPOLINE_IMAGE_UPLOAD" - value: "true" -} - -# It will always build the docker image. -env_vars: { - key: "TRAMPOLINE_DOCKERFILE" - value: ".kokoro/docker/docs/Dockerfile" -} - -# Fetch the token needed for reporting release status to GitHub -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "yoshi-automation-github-key" - } - } -} - -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "docuploader_service_account" - } - } -} diff --git a/.kokoro/docs/docs-presubmit.cfg b/.kokoro/docs/docs-presubmit.cfg deleted file mode 100644 index a5a723164..000000000 --- a/.kokoro/docs/docs-presubmit.cfg +++ /dev/null @@ -1,28 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "STAGING_BUCKET" - value: "gcloud-python-test" -} - -env_vars: { - key: "V2_STAGING_BUCKET" - value: "gcloud-python-test" -} - -# We only upload the image in the main `docs` build. -env_vars: { - key: "TRAMPOLINE_IMAGE_UPLOAD" - value: "false" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/python-storage/.kokoro/build.sh" -} - -# Only run this nox session. -env_vars: { - key: "NOX_SESSION" - value: "docs docfx" -} diff --git a/.kokoro/docs/docs.cfg b/.kokoro/docs/docs.cfg deleted file mode 100644 index 8f43917d9..000000000 --- a/.kokoro/docs/docs.cfg +++ /dev/null @@ -1 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh deleted file mode 100755 index 4ed4aaf13..000000000 --- a/.kokoro/publish-docs.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -# Disable buffering, so that the logs stream through. -export PYTHONUNBUFFERED=1 - -export PATH="${HOME}/.local/bin:${PATH}" - -# build docs -nox -s docs - -# create metadata -python3.10 -m docuploader create-metadata \ - --name=$(jq --raw-output '.name // empty' .repo-metadata.json) \ - --version=$(python3.10 setup.py --version) \ - --language=$(jq --raw-output '.language // empty' .repo-metadata.json) \ - --distribution-name=$(python3.10 setup.py --name) \ - --product-page=$(jq --raw-output '.product_documentation // empty' .repo-metadata.json) \ - --github-repository=$(jq --raw-output '.repo // empty' .repo-metadata.json) \ - --issue-tracker=$(jq --raw-output '.issue_tracker // empty' .repo-metadata.json) - -cat docs.metadata - -# upload docs -python3.10 -m docuploader upload docs/_build/html --metadata-file docs.metadata --staging-bucket "${STAGING_BUCKET}" - - -# docfx yaml files -nox -s docfx - -# create metadata. -python3.10 -m docuploader create-metadata \ - --name=$(jq --raw-output '.name // empty' .repo-metadata.json) \ - --version=$(python3.10 setup.py --version) \ - --language=$(jq --raw-output '.language // empty' .repo-metadata.json) \ - --distribution-name=$(python3.10 setup.py --name) \ - --product-page=$(jq --raw-output '.product_documentation // empty' .repo-metadata.json) \ - --github-repository=$(jq --raw-output '.repo // empty' .repo-metadata.json) \ - --issue-tracker=$(jq --raw-output '.issue_tracker // empty' .repo-metadata.json) - -cat docs.metadata - -# upload docs -python3.10 -m docuploader upload docs/_build/html/docfx_yaml --metadata-file docs.metadata --destination-prefix docfx --staging-bucket "${V2_STAGING_BUCKET}" diff --git a/.kokoro/release.sh b/.kokoro/release.sh deleted file mode 100755 index a15b26b59..000000000 --- a/.kokoro/release.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eo pipefail - -# Start the releasetool reporter -python3 -m pip install --require-hashes -r github/python-storage/.kokoro/requirements.txt -python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script - -# Disable buffering, so that the logs stream through. -export PYTHONUNBUFFERED=1 - -# Move into the package, build the distribution and upload. -TWINE_PASSWORD=$(cat "${KOKORO_KEYSTORE_DIR}/73713_google-cloud-pypi-token-keystore-2") -cd github/python-storage -python3 setup.py sdist bdist_wheel -twine upload --username __token__ --password "${TWINE_PASSWORD}" dist/* diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg deleted file mode 100644 index 17918dc86..000000000 --- a/.kokoro/release/common.cfg +++ /dev/null @@ -1,49 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - } -} - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "python-storage/.kokoro/trampoline.sh" - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" -} -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/python-storage/.kokoro/release.sh" -} - -# Fetch PyPI password -before_action { - fetch_keystore { - keystore_resource { - keystore_config_id: 73713 - keyname: "google-cloud-pypi-token-keystore-2" - } - } -} - -# Tokens needed to report release status back to GitHub -env_vars: { - key: "SECRET_MANAGER_KEYS" - value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem, client-library-test-universe-domain-credential" -} - -# Store the packages we uploaded to PyPI. That way, we have a record of exactly -# what we published, which we can use to generate SBOMs and attestations. -action { - define_artifacts { - regex: "github/python-storage/**/*.tar.gz" - strip_prefix: "github/python-storage" - } -} diff --git a/.kokoro/release/release.cfg b/.kokoro/release/release.cfg deleted file mode 100644 index 8f43917d9..000000000 --- a/.kokoro/release/release.cfg +++ /dev/null @@ -1 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in deleted file mode 100644 index fff4d9ce0..000000000 --- a/.kokoro/requirements.in +++ /dev/null @@ -1,11 +0,0 @@ -gcp-docuploader -gcp-releasetool>=2 # required for compatibility with cryptography>=42.x -importlib-metadata -typing-extensions -twine -wheel -setuptools -nox>=2022.11.21 # required to remove dependency on py -charset-normalizer<3 -click<8.1.0 -cryptography>=42.0.5 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt deleted file mode 100644 index 14466eb39..000000000 --- a/.kokoro/requirements.txt +++ /dev/null @@ -1,537 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --allow-unsafe --generate-hashes requirements.in -# -argcomplete==3.4.0 \ - --hash=sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5 \ - --hash=sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f - # via nox -attrs==23.2.0 \ - --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ - --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 - # via gcp-releasetool -backports-tarfile==1.2.0 \ - --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ - --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 - # via jaraco-context -cachetools==5.3.3 \ - --hash=sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945 \ - --hash=sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105 - # via google-auth -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 - # via requests -cffi==1.16.0 \ - --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ - --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ - --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ - --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ - --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ - --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ - --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ - --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ - --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ - --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ - --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ - --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ - --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ - --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ - --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ - --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ - --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ - --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ - --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ - --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ - --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ - --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ - --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ - --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ - --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ - --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ - --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ - --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ - --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ - --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ - --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ - --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ - --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ - --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ - --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ - --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ - --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ - --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ - --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ - --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ - --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ - --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ - --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ - --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ - --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ - --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ - --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ - --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ - --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ - --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ - --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ - --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 - # via cryptography -charset-normalizer==2.1.1 \ - --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ - --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f - # via - # -r requirements.in - # requests -click==8.0.4 \ - --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \ - --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb - # via - # -r requirements.in - # gcp-docuploader - # gcp-releasetool -colorlog==6.8.2 \ - --hash=sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44 \ - --hash=sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33 - # via - # gcp-docuploader - # nox -cryptography==42.0.8 \ - --hash=sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad \ - --hash=sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583 \ - --hash=sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b \ - --hash=sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c \ - --hash=sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1 \ - --hash=sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648 \ - --hash=sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949 \ - --hash=sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba \ - --hash=sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c \ - --hash=sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9 \ - --hash=sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d \ - --hash=sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c \ - --hash=sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e \ - --hash=sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2 \ - --hash=sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d \ - --hash=sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7 \ - --hash=sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70 \ - --hash=sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2 \ - --hash=sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7 \ - --hash=sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14 \ - --hash=sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe \ - --hash=sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e \ - --hash=sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71 \ - --hash=sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961 \ - --hash=sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7 \ - --hash=sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c \ - --hash=sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28 \ - --hash=sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842 \ - --hash=sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902 \ - --hash=sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801 \ - --hash=sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a \ - --hash=sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e - # via - # -r requirements.in - # gcp-releasetool - # secretstorage -distlib==0.3.8 \ - --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ - --hash=sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64 - # via virtualenv -docutils==0.21.2 \ - --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ - --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 - # via readme-renderer -filelock==3.15.4 \ - --hash=sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb \ - --hash=sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7 - # via virtualenv -gcp-docuploader==0.6.5 \ - --hash=sha256:30221d4ac3e5a2b9c69aa52fdbef68cc3f27d0e6d0d90e220fc024584b8d2318 \ - --hash=sha256:b7458ef93f605b9d46a4bf3a8dc1755dad1f31d030c8679edf304e343b347eea - # via -r requirements.in -gcp-releasetool==2.0.1 \ - --hash=sha256:34314a910c08e8911d9c965bd44f8f2185c4f556e737d719c33a41f6a610de96 \ - --hash=sha256:b0d5863c6a070702b10883d37c4bdfd74bf930fe417f36c0c965d3b7c779ae62 - # via -r requirements.in -google-api-core==2.19.1 \ - --hash=sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125 \ - --hash=sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd - # via - # google-cloud-core - # google-cloud-storage -google-auth==2.31.0 \ - --hash=sha256:042c4702efa9f7d3c48d3a69341c209381b125faa6dbf3ebe56bc7e40ae05c23 \ - --hash=sha256:87805c36970047247c8afe614d4e3af8eceafc1ebba0c679fe75ddd1d575e871 - # via - # gcp-releasetool - # google-api-core - # google-cloud-core - # google-cloud-storage -google-cloud-core==2.4.1 \ - --hash=sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073 \ - --hash=sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61 - # via google-cloud-storage -google-cloud-storage==2.17.0 \ - --hash=sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388 \ - --hash=sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1 - # via gcp-docuploader -google-crc32c==1.5.0 \ - --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ - --hash=sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876 \ - --hash=sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c \ - --hash=sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289 \ - --hash=sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 \ - --hash=sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02 \ - --hash=sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f \ - --hash=sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2 \ - --hash=sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a \ - --hash=sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb \ - --hash=sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210 \ - --hash=sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5 \ - --hash=sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee \ - --hash=sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c \ - --hash=sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a \ - --hash=sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314 \ - --hash=sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd \ - --hash=sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65 \ - --hash=sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37 \ - --hash=sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4 \ - --hash=sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13 \ - --hash=sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894 \ - --hash=sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31 \ - --hash=sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e \ - --hash=sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709 \ - --hash=sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740 \ - --hash=sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc \ - --hash=sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d \ - --hash=sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c \ - --hash=sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c \ - --hash=sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d \ - --hash=sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 \ - --hash=sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61 \ - --hash=sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 \ - --hash=sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c \ - --hash=sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a \ - --hash=sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438 \ - --hash=sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946 \ - --hash=sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7 \ - --hash=sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96 \ - --hash=sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091 \ - --hash=sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae \ - --hash=sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d \ - --hash=sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88 \ - --hash=sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2 \ - --hash=sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd \ - --hash=sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541 \ - --hash=sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728 \ - --hash=sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178 \ - --hash=sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 \ - --hash=sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346 \ - --hash=sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8 \ - --hash=sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93 \ - --hash=sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7 \ - --hash=sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 \ - --hash=sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462 \ - --hash=sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94 \ - --hash=sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd \ - --hash=sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e \ - --hash=sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57 \ - --hash=sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b \ - --hash=sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9 \ - --hash=sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a \ - --hash=sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100 \ - --hash=sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325 \ - --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ - --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ - --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 - # via - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.7.1 \ - --hash=sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c \ - --hash=sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33 - # via google-cloud-storage -googleapis-common-protos==1.63.2 \ - --hash=sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945 \ - --hash=sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87 - # via google-api-core -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 - # via requests -importlib-metadata==8.0.0 \ - --hash=sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f \ - --hash=sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812 - # via - # -r requirements.in - # keyring - # twine -jaraco-classes==3.4.0 \ - --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \ - --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 - # via keyring -jaraco-context==5.3.0 \ - --hash=sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266 \ - --hash=sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2 - # via keyring -jaraco-functools==4.0.1 \ - --hash=sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664 \ - --hash=sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8 - # via keyring -jeepney==0.8.0 \ - --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ - --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 - # via - # keyring - # secretstorage -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - # via gcp-releasetool -keyring==25.2.1 \ - --hash=sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50 \ - --hash=sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b - # via - # gcp-releasetool - # twine -markdown-it-py==3.0.0 \ - --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ - --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via rich -markupsafe==2.1.5 \ - --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ - --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ - --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ - --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ - --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ - --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ - --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ - --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ - --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ - --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ - --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ - --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ - --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ - --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ - --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ - --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ - --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ - --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ - --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ - --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ - --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ - --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ - --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ - --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ - --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ - --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ - --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ - --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ - --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ - --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ - --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ - --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ - --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ - --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ - --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ - --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ - --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ - --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ - --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ - --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ - --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ - --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ - --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ - --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ - --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ - --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ - --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ - --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ - --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ - --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ - --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ - --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ - --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ - --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ - --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ - --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ - --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ - --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ - --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ - --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 - # via jinja2 -mdurl==0.1.2 \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via markdown-it-py -more-itertools==10.3.0 \ - --hash=sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463 \ - --hash=sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320 - # via - # jaraco-classes - # jaraco-functools -nh3==0.2.18 \ - --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \ - --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \ - --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \ - --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \ - --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \ - --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \ - --hash=sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200 \ - --hash=sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189 \ - --hash=sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f \ - --hash=sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811 \ - --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 \ - --hash=sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4 \ - --hash=sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be \ - --hash=sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50 \ - --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \ - --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe - # via readme-renderer -nox==2024.4.15 \ - --hash=sha256:6492236efa15a460ecb98e7b67562a28b70da006ab0be164e8821177577c0565 \ - --hash=sha256:ecf6700199cdfa9e5ea0a41ff5e6ef4641d09508eda6edb89d9987864115817f - # via -r requirements.in -packaging==24.1 \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 - # via - # gcp-releasetool - # nox -pkginfo==1.10.0 \ - --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \ - --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097 - # via twine -platformdirs==4.2.2 \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 - # via virtualenv -proto-plus==1.24.0 \ - --hash=sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445 \ - --hash=sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12 - # via google-api-core -protobuf==5.27.2 \ - --hash=sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505 \ - --hash=sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b \ - --hash=sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38 \ - --hash=sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863 \ - --hash=sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470 \ - --hash=sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6 \ - --hash=sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce \ - --hash=sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca \ - --hash=sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5 \ - --hash=sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e \ - --hash=sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714 - # via - # gcp-docuploader - # gcp-releasetool - # google-api-core - # googleapis-common-protos - # proto-plus -pyasn1==0.6.0 \ - --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ - --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 - # via - # pyasn1-modules - # rsa -pyasn1-modules==0.4.0 \ - --hash=sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6 \ - --hash=sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b - # via google-auth -pycparser==2.22 \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc - # via cffi -pygments==2.18.0 \ - --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ - --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a - # via - # readme-renderer - # rich -pyjwt==2.8.0 \ - --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ - --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 - # via gcp-releasetool -pyperclip==1.9.0 \ - --hash=sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310 - # via gcp-releasetool -python-dateutil==2.9.0.post0 \ - --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ - --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 - # via gcp-releasetool -readme-renderer==44.0 \ - --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \ - --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1 - # via twine -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 - # via - # gcp-releasetool - # google-api-core - # google-cloud-storage - # requests-toolbelt - # twine -requests-toolbelt==1.0.0 \ - --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ - --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 - # via twine -rfc3986==2.0.0 \ - --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ - --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c - # via twine -rich==13.7.1 \ - --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ - --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 - # via twine -rsa==4.9 \ - --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ - --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 - # via google-auth -secretstorage==3.3.3 \ - --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ - --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 - # via keyring -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via - # gcp-docuploader - # python-dateutil -tomli==2.0.1 \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - # via nox -twine==5.1.1 \ - --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \ - --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db - # via -r requirements.in -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via -r requirements.in -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 - # via - # requests - # twine -virtualenv==20.26.6 \ - --hash=sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48 \ - --hash=sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2 - # via nox -wheel==0.43.0 \ - --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ - --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 - # via -r requirements.in -zipp==3.19.2 \ - --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ - --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -setuptools==70.2.0 \ - --hash=sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05 \ - --hash=sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1 - # via -r requirements.in From 05ffb1ea513871ecf10e9d30f0ead8521398beda Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 10 Mar 2025 16:01:04 +0100 Subject: [PATCH 328/509] chore(deps): update all dependencies (#1413) --- samples/snippets/requirements-test.txt | 4 ++-- samples/snippets/requirements.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 7f13e54c9..5644295d0 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,4 +1,4 @@ pytest===7.4.4; python_version == '3.7' -pytest==8.3.4; python_version >= '3.8' -mock==5.1.0 +pytest==8.3.5; python_version >= '3.8' +mock==5.2.0 backoff==2.2.1 diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index a5a006ab2..b5201ffa9 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-pubsub==2.27.2 -google-cloud-storage==2.19.0 +google-cloud-pubsub==2.28.0 +google-cloud-storage==3.1.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' pandas==2.2.3; python_version >= '3.9' From 01009164beaab8931a1e1684966e3060edcf77b7 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 18 Mar 2025 19:02:23 -0400 Subject: [PATCH 329/509] fix: allow Protobuf 6.x (#1445) * fix: allow Protobuf 6.x * add prerelease nox session * add python 3.13 * lint * add test dependencies * add test dependencies * fix(deps): require google-crc32c >= 1.1.3 * fix(deps): require requests >= 2.22.0 * add dependencies for system tests * clean up * clean up * clean up * clean up * clean up * fix cover * clean up * Install dependencies needed for system tests * add dependencies for system test * update noxfile config * add credentials * exclude .kokoro/presubmit/prerelease-deps.cfg template * remove obsolete excludes * clean up * clean up * exclude .kokoro/continuous/prerelease-deps.cfg from templates; remove obsolete replacement * migrate prerelease test from presubmit to continuous build --- .kokoro/continuous/prerelease-deps.cfg | 6 ++ .kokoro/presubmit/prerelease-deps.cfg | 7 -- CONTRIBUTING.rst | 2 +- noxfile.py | 102 +++++++++++++++++++++++-- owlbot.py | 15 +--- samples/snippets/noxfile_config.py | 5 +- setup.py | 17 +++-- testing/constraints-3.13.txt | 0 testing/constraints-3.7.txt | 15 ++++ tests/system/test_notification.py | 6 +- 10 files changed, 135 insertions(+), 40 deletions(-) delete mode 100644 .kokoro/presubmit/prerelease-deps.cfg create mode 100644 testing/constraints-3.13.txt diff --git a/.kokoro/continuous/prerelease-deps.cfg b/.kokoro/continuous/prerelease-deps.cfg index 3595fb43f..07db02426 100644 --- a/.kokoro/continuous/prerelease-deps.cfg +++ b/.kokoro/continuous/prerelease-deps.cfg @@ -5,3 +5,9 @@ env_vars: { key: "NOX_SESSION" value: "prerelease_deps" } + +# Credentials needed to test universe domain. +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "client-library-test-universe-domain-credential" +} diff --git a/.kokoro/presubmit/prerelease-deps.cfg b/.kokoro/presubmit/prerelease-deps.cfg deleted file mode 100644 index 3595fb43f..000000000 --- a/.kokoro/presubmit/prerelease-deps.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Only run this nox session. -env_vars: { - key: "NOX_SESSION" - value: "prerelease_deps" -} diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index d53ad8707..316d8b266 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.7, 3.8, 3.9, 3.10, 3.11 and 3.12 on both UNIX and Windows. + 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 and 3.13 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should diff --git a/noxfile.py b/noxfile.py index 384880848..2a7614331 100644 --- a/noxfile.py +++ b/noxfile.py @@ -14,11 +14,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Generated by synthtool. DO NOT EDIT! - from __future__ import absolute_import import os import pathlib +import re import shutil import nox @@ -29,16 +28,27 @@ DEFAULT_PYTHON_VERSION = "3.8" SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"] -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] +UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.8"] -_DEFAULT_STORAGE_HOST = "https://storage.googleapis.com" - CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() # Error if a python version is missing nox.options.error_on_missing_interpreters = True +nox.options.sessions = [ + "blacken", + "conftest_retry", + "docfx", + "docs", + "lint", + "lint_setup_py", + "system", + "unit", + # cover must be last to avoid error `No data to report` + "cover", +] + @nox.session(python=DEFAULT_PYTHON_VERSION) def lint(session): @@ -159,8 +169,8 @@ def system(session): session.install( "google-cloud-testutils", "google-cloud-iam", - "google-cloud-pubsub < 2.0.0", - "google-cloud-kms < 2.0dev", + "google-cloud-pubsub", + "google-cloud-kms", "brotli", "-c", constraints_path, @@ -300,3 +310,81 @@ def docfx(session): os.path.join("docs", ""), os.path.join("docs", "_build", "html", ""), ) + + +@nox.session(python=UNIT_TEST_PYTHON_VERSIONS[-1]) +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def prerelease_deps(session, protobuf_implementation): + """Run all tests with prerelease versions of dependencies installed.""" + + # Install all test dependencies + session.install("mock", "pytest", "pytest-cov", "brotli") + + # Install dependencies needed for system tests + session.install( + "google-cloud-pubsub", + "google-cloud-kms", + "google-cloud-testutils", + "google-cloud-iam", + ) + + # Install all dependencies + session.install("-e", ".[protobuf, tracing]") + + prerel_deps = [ + "google-api-core", + "google-auth", + "google-cloud-core", + "google-crc32c", + "google-resumable-media", + "opentelemetry-api", + "protobuf", + ] + + package_namespaces = { + "google-api-core": "google.api_core", + "google-auth": "google.auth", + "google-cloud-core": "google.cloud.version", + "opentelemetry-api": "opentelemetry.version", + "protobuf": "google.protobuf", + } + + for dep in prerel_deps: + session.install("--pre", "--no-deps", "--upgrade", dep) + print(f"Installed {dep}") + + version_namespace = package_namespaces.get(dep) + + if version_namespace: + session.run( + "python", + "-c", + f"import {version_namespace}; print({version_namespace}.__version__)", + ) + # Remaining dependencies + other_deps = [ + "requests", + ] + session.install(*other_deps) + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) + + session.run( + "py.test", + "--verbose", + f"--junitxml=system_{session.python}_sponge_log.xml", + os.path.join("tests", "system"), + *session.posargs, + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/owlbot.py b/owlbot.py index 8bd9de751..08ddbb8fc 100644 --- a/owlbot.py +++ b/owlbot.py @@ -26,12 +26,6 @@ templated_files = common.py_library( cov_level=100, split_system_tests=True, - system_test_external_dependencies=[ - "google-cloud-iam", - "google-cloud-pubsub < 2.0.0", - # See: https://github.com/googleapis/python-storage/issues/226 - "google-cloud-kms < 2.0dev", - ], intersphinx_dependencies={ # python-requests url temporary change related to # https://github.com/psf/requests/issues/6140#issuecomment-1135071992 @@ -48,7 +42,8 @@ "README.rst", ".kokoro/continuous/continuous.cfg", ".kokoro/presubmit/system-3.8.cfg", - ".kokoro/samples/python3.6", # remove python 3.6 support + ".kokoro/presubmit/prerelease-deps.cfg", + ".kokoro/continuous/prerelease-deps.cfg", ".github/blunderbuss.yml", # blunderbuss assignment to python squad ".github/workflows", # exclude gh actions as credentials are needed for tests ".github/release-please.yml", # special support for a python2 branch in this repo @@ -84,12 +79,6 @@ """omit = .nox/*""") -s.replace( - ".kokoro/release/common.cfg", - 'value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem"', - 'value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem, client-library-test-universe-domain-credential"' -) - python.py_samples(skip_readmes=True) s.shell.run(["nox", "-s", "blacken"], hide_output=False) diff --git a/samples/snippets/noxfile_config.py b/samples/snippets/noxfile_config.py index 17a05b9f2..7eba203a4 100644 --- a/samples/snippets/noxfile_config.py +++ b/samples/snippets/noxfile_config.py @@ -73,12 +73,15 @@ def get_cloud_kms_key(): if session == 'py-3.12': return ('projects/python-docs-samples-tests-312/locations/us/' 'keyRings/gcs-kms-key-ring/cryptoKeys/gcs-kms-key') + if session == 'py-3.13': + return ('projects/python-docs-samples-tests-313/locations/us/' + 'keyRings/gcs-kms-key-ring/cryptoKeys/gcs-kms-key') return os.environ['CLOUD_KMS_KEY'] TEST_CONFIG_OVERRIDE = { # You can opt out from the test for specific Python versions. - 'ignored_versions': ["2.7", "3.6", "3.7", "3.11", "3.12"], + 'ignored_versions': ["2.7", "3.6", "3.7", "3.11", "3.12", "3.13"], # An envvar key for determining the project id to use. Change it # to 'BUILD_SPECIFIC_GCLOUD_PROJECT' if you want to opt in using a diff --git a/setup.py b/setup.py index 31c360f40..43e3404f6 100644 --- a/setup.py +++ b/setup.py @@ -28,9 +28,9 @@ # 'Development Status :: 5 - Production/Stable' release_status = "Development Status :: 5 - Production/Stable" dependencies = [ - "google-auth >= 2.26.1, < 3.0dev", - "google-api-core >= 2.15.0, <3.0.0dev", - "google-cloud-core >= 2.4.2, < 3.0dev", + "google-auth >= 2.26.1, < 3.0.0", + "google-api-core >= 2.15.0, < 3.0.0", + "google-cloud-core >= 2.4.2, < 3.0.0", # The dependency "google-resumable-media" is no longer used. However, the # dependency is still included here to accommodate users who may be # importing exception classes from the google-resumable-media without @@ -38,14 +38,14 @@ # exceptions and importing. Users who are not importing # google-resumable-media classes in their application can safely disregard # this dependency. - "google-resumable-media >= 2.7.2", - "requests >= 2.18.0, < 3.0.0dev", - "google-crc32c >= 1.0, < 2.0dev", + "google-resumable-media >= 2.7.2, < 3.0.0", + "requests >= 2.22.0, < 3.0.0", + "google-crc32c >= 1.1.3, < 2.0.0", ] extras = { - "protobuf": ["protobuf<6.0.0dev"], + "protobuf": ["protobuf >= 3.20.2, < 7.0.0"], "tracing": [ - "opentelemetry-api >= 1.1.0", + "opentelemetry-api >= 1.1.0, < 2.0.0", ], } @@ -93,6 +93,7 @@ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/testing/constraints-3.13.txt b/testing/constraints-3.13.txt new file mode 100644 index 000000000..e69de29bb diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index e69de29bb..9c17b387b 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -0,0 +1,15 @@ +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List all library dependencies and extras in this file. +# Pin the version to the lower bound. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", +# Then this file should have google-cloud-foo==1.14.0 +google-auth==2.26.1 +google-api-core==2.15.0 +google-cloud-core==2.4.2 +google-resumable-media==2.7.2 +requests==2.22.0 +google-crc32c==1.1.3 +protobuf==3.20.2 +opentelemetry-api==1.1.0 + diff --git a/tests/system/test_notification.py b/tests/system/test_notification.py index f52ae3219..9b631c29b 100644 --- a/tests/system/test_notification.py +++ b/tests/system/test_notification.py @@ -59,14 +59,14 @@ def topic_path(storage_client, topic_name): @pytest.fixture(scope="session") def notification_topic(storage_client, publisher_client, topic_path, no_mtls): - _helpers.retry_429(publisher_client.create_topic)(topic_path) - policy = publisher_client.get_iam_policy(topic_path) + _helpers.retry_429(publisher_client.create_topic)(request={"name": topic_path}) + policy = publisher_client.get_iam_policy(request={"resource": topic_path}) binding = policy.bindings.add() binding.role = "roles/pubsub.publisher" binding.members.append( f"serviceAccount:{storage_client.get_service_account_email()}" ) - publisher_client.set_iam_policy(topic_path, policy) + publisher_client.set_iam_policy(request={"resource": topic_path, "policy": policy}) def test_notification_create_minimal( From 3d89f3eaae772674ce6bcd1944a56d6b64b54047 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 19 Mar 2025 09:31:08 -0700 Subject: [PATCH 330/509] chore: update CHANGELOG.md to add detail and credit on a security-related bugfix in a past version (#1447) Co-authored-by: Anthonios Partheniou --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fefb84f50..2d819e0ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,7 +79,7 @@ Please consult the README for details on this major version release. ### Bug Fixes -* Properly escape URL construction for XML MPU API ([#1333](https://github.com/googleapis/python-storage/issues/1333)) ([bf4d0e0](https://github.com/googleapis/python-storage/commit/bf4d0e0a2ef1d608d679c22b13d8f5d90b39c7b2)) +* Properly escape URL construction for XML MPU API, fixing a path traversal issue that allowed uploads to unintended buckets. Reported by @jdomeracki. ([#1333](https://github.com/googleapis/python-storage/issues/1333)) ([bf4d0e0](https://github.com/googleapis/python-storage/commit/bf4d0e0a2ef1d608d679c22b13d8f5d90b39c7b2)) ## [2.18.0](https://github.com/googleapis/python-storage/compare/v2.17.0...v2.18.0) (2024-07-09) From 03f1594eb90ea1298a3a23927537c86ac35d33d5 Mon Sep 17 00:00:00 2001 From: Dan Lee <71398022+dandhlee@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:45:00 -0400 Subject: [PATCH 331/509] docs: update README to break infinite redirect loop (#1450) --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 4a94b178f..da61b75f4 100644 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ Google APIs Client Libraries, in `Client Libraries Explained`_. .. |versions| image:: https://img.shields.io/pypi/pyversions/google-cloud-storage.svg :target: https://pypi.org/project/google-cloud-storage/ .. _Google Cloud Storage: https://cloud.google.com/storage -.. _Client Library Documentation: https://cloud.google.com/python/docs/reference/storage/latest +.. _Client Library Documentation: https://cloud.google.com/python/docs/reference/storage/latest/summary_overview .. _Product Documentation: https://cloud.google.com/storage .. _CHANGELOG: https://github.com/googleapis/python-storage/blob/main/CHANGELOG.md .. _github.com/googleapis/python-storage: https://github.com/googleapis/python-storage From d3b6b3f96a6f94aa7c371902f48d1363ae6bfb5c Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Wed, 19 Mar 2025 16:00:21 -0400 Subject: [PATCH 332/509] fix: remove setup.cfg configuration for creating universal wheels (#1448) Co-authored-by: Andrew Gorcester Co-authored-by: cojenco --- setup.cfg | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 052350089..000000000 --- a/setup.cfg +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Generated by synthtool. DO NOT EDIT! -[bdist_wheel] -universal = 1 From 53257cf20a4de3810156ae9576a7092f5527df98 Mon Sep 17 00:00:00 2001 From: cojenco Date: Thu, 20 Mar 2025 11:12:55 -0700 Subject: [PATCH 333/509] docs: move quickstart to top of readme (#1451) * docs: move quickstart to top of readme * update note and link --- README.rst | 162 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 69 deletions(-) diff --git a/README.rst b/README.rst index da61b75f4..a7db13a25 100644 --- a/README.rst +++ b/README.rst @@ -8,6 +8,8 @@ allows world-wide storage and retrieval of any amount of data at any time. You c Cloud Storage for a range of scenarios including serving website content, storing data for archival and disaster recovery, or distributing large data objects to users via direct download. +**NOTE**: `3.0 Major Version Notes`_ are available. Feedback welcome. + A comprehensive list of changes in each version may be found in the `CHANGELOG`_. - `Product Documentation`_ @@ -37,75 +39,6 @@ Google APIs Client Libraries, in `Client Libraries Explained`_. .. _Storage Control API: https://cloud.google.com/storage/docs/reference/rpc/google.storage.control.v2 .. _Client Libraries Explained: https://cloud.google.com/apis/docs/client-libraries-explained -3.0 Major Version Notes ------------------------ - -Feedback Welcome -~~~~~~~~~~~~~~~~ - -If you experience that backwards compatibility for your application is broken -with this major version release, please let us know through the Github issues -system. While some breaks of backwards compatibility may be unavoidable due to -new features in the major version release, we will do our best to minimize -them. Thank you. - -Exception Handling -~~~~~~~~~~~~~~~~~~ - -In Python Storage 3.0, the dependency ``google-resumable-media`` was integrated. -The ``google-resumable-media`` dependency included exceptions -``google.resumable_media.common.InvalidResponse`` and -``google.resumable_media.common.DataCorruption``, which were often imported -directly in user application code. The replacements for these exceptions are -``google.cloud.storage.exceptions.InvalidResponse`` and -``google.cloud.storage.exceptions.DataCorruption``. Please update application code -to import and use these exceptions instead. - -For backwards compatibility, if ``google-resumable-media`` is installed, the new -exceptions will be defined as subclasses of the old exceptions, so applications -should continue to work without modification. This backwards compatibility -feature may be removed in a future major version update. - -Some users may be using the original exception classes from the -``google-resumable-media`` library without explicitly installing that library. So -as not to break user applications following this pattern, -``google-resumable-media`` is still in the list of dependencies in this package's -setup.py file. Applications which do not import directly from -``google-resumable-media`` can safely disregard this dependency. -This backwards compatibility feature **will be removed** in a future major -version update. Please migrate to using the ``google.cloud.storage.exceptions`` -classes as above. - -Checksum Defaults -~~~~~~~~~~~~~~~~~ - -In Python Storage 3.0, uploads and downloads now have a default of "auto" where -applicable. "Auto" will use crc32c checksums, except for unusual cases where the -fast (C extension) crc32c implementation is not available, in which case it will -use md5 instead. Before Python Storage 3.0, the default was md5 for most -downloads and None for most uploads. Note that ranged downloads ("start" or -"end" set) still do not support any checksumming, and some features in -``transfer_manager.py`` still support crc32c only. - -Note: The method ``Blob.upload_from_file()`` requires a file in bytes mode, but -when checksum is set to None, as was the previous default, would not throw an -error if passed a file in string mode under some circumstances. With the new -defaults, it will now raise a TypeError. Please use a file opened in bytes -reading mode as required. - -Miscellaneous -~~~~~~~~~~~~~ - -- The ``BlobWriter`` class now attempts to terminate an ongoing resumable upload if - the writer exits with an exception. -- Retry behavior is now identical between media operations (uploads and - downloads) and other operations, and custom predicates are now supported for - media operations as well. -- ``Blob.download_as_filename()`` will now delete the empty file if it results in a - google.cloud.exceptions.NotFound exception (HTTP 404). -- Previously, object upload, metadata update, and delete methods had retries - disabled by default unless the generation or metageneration was specified in - the request. This has now changed so that retries are enabled by default. Quick Start ----------- @@ -186,6 +119,26 @@ Windows pip install google-cloud-storage +Example Usage +~~~~~~~~~~~~~ + +.. code-block:: python + + # Imports the Google Cloud client library + from google.cloud import storage + + # Instantiates a client + storage_client = storage.Client() + + # The name for the new bucket + bucket_name = "my-new-bucket" + + # Creates the new bucket + bucket = storage_client.create_bucket(bucket_name) + + print(f"Bucket {bucket.name} created.") + + Tracing With OpenTelemetry ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -240,6 +193,77 @@ For a list of libraries that can be instrumented, refer to the `OpenTelemetry Re .. _Google Cloud Trace: https://cloud.google.com/trace +3.0 Major Version Notes +----------------------- + +Feedback Welcome +~~~~~~~~~~~~~~~~ + +If you experience that backwards compatibility for your application is broken +with this major version release, please let us know through the Github issues +system. While some breaks of backwards compatibility may be unavoidable due to +new features in the major version release, we will do our best to minimize +them. Thank you. + +Exception Handling +~~~~~~~~~~~~~~~~~~ + +In Python Storage 3.0, the dependency ``google-resumable-media`` was integrated. +The ``google-resumable-media`` dependency included exceptions +``google.resumable_media.common.InvalidResponse`` and +``google.resumable_media.common.DataCorruption``, which were often imported +directly in user application code. The replacements for these exceptions are +``google.cloud.storage.exceptions.InvalidResponse`` and +``google.cloud.storage.exceptions.DataCorruption``. Please update application code +to import and use these exceptions instead. + +For backwards compatibility, if ``google-resumable-media`` is installed, the new +exceptions will be defined as subclasses of the old exceptions, so applications +should continue to work without modification. This backwards compatibility +feature may be removed in a future major version update. + +Some users may be using the original exception classes from the +``google-resumable-media`` library without explicitly installing that library. So +as not to break user applications following this pattern, +``google-resumable-media`` is still in the list of dependencies in this package's +setup.py file. Applications which do not import directly from +``google-resumable-media`` can safely disregard this dependency. +This backwards compatibility feature **will be removed** in a future major +version update. Please migrate to using the ``google.cloud.storage.exceptions`` +classes as above. + +Checksum Defaults +~~~~~~~~~~~~~~~~~ + +In Python Storage 3.0, uploads and downloads now have a default of "auto" where +applicable. "Auto" will use crc32c checksums, except for unusual cases where the +fast (C extension) crc32c implementation is not available, in which case it will +use md5 instead. Before Python Storage 3.0, the default was md5 for most +downloads and None for most uploads. Note that ranged downloads ("start" or +"end" set) still do not support any checksumming, and some features in +``transfer_manager.py`` still support crc32c only. + +Note: The method ``Blob.upload_from_file()`` requires a file in bytes mode, but +when checksum is set to None, as was the previous default, would not throw an +error if passed a file in string mode under some circumstances. With the new +defaults, it will now raise a TypeError. Please use a file opened in bytes +reading mode as required. + +Miscellaneous +~~~~~~~~~~~~~ + +- The ``BlobWriter`` class now attempts to terminate an ongoing resumable upload if + the writer exits with an exception. +- Retry behavior is now identical between media operations (uploads and + downloads) and other operations, and custom predicates are now supported for + media operations as well. +- ``Blob.download_as_filename()`` will now delete the empty file if it results in a + google.cloud.exceptions.NotFound exception (HTTP 404). +- Previously, object upload, metadata update, and delete methods had retries + disabled by default unless the generation or metageneration was specified in + the request. This has now changed so that retries are enabled by default. + + Next Steps ~~~~~~~~~~ From 3f341fff726be4b4f8c9a9ce138d7f15b21e1173 Mon Sep 17 00:00:00 2001 From: Andrew Gorcester Date: Wed, 26 Mar 2025 09:48:20 -0700 Subject: [PATCH 334/509] chore: remove andrewsg from blunderbuss (#1454) --- .github/blunderbuss.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml index 8f2aae9b2..ba6190daf 100644 --- a/.github/blunderbuss.yml +++ b/.github/blunderbuss.yml @@ -4,9 +4,7 @@ # Note: This file is autogenerated. To make changes to the assignee # team, please update `codeowner_team` in `.repo-metadata.json`. assign_issues: - - andrewsg - cojenco assign_prs: - - andrewsg - cojenco From 63c1139765caa788c0502d6f2962d8030219f751 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 7 Apr 2025 19:56:54 +0200 Subject: [PATCH 335/509] chore(deps): update dependency google-cloud-pubsub to v2.29.0 (#1453) Co-authored-by: cojenco --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index b5201ffa9..751f8cfbe 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub==2.28.0 +google-cloud-pubsub==2.29.0 google-cloud-storage==3.1.0 pandas===1.3.5; python_version == '3.7' pandas===2.0.3; python_version == '3.8' From 8f56cc812bfb81e7b483eb205bddc1cb1d42cc2f Mon Sep 17 00:00:00 2001 From: Chandrashekhar Sirimala Date: Mon, 5 May 2025 21:39:37 +0530 Subject: [PATCH 336/509] samples: Add samples for async download files #1470 (#1471) * samples: Add samples for async download files #1470 * Add argument description for `async_download_blobs` function. Co-authored-by: cojenco * Addressed comments from cojenco@ * change download_as_string to bytes * Don't print blob contents after downloading * remove Google Inc , add Google LLC * pass list of file_names as one of the params. * fix lint issues * fix whitespace lints * remove unused variable i --------- Co-authored-by: cojenco --- samples/snippets/snippets_test.py | 14 +++++ samples/snippets/storage_async_download.py | 70 ++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100755 samples/snippets/storage_async_download.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 339693dd8..6d9cfc317 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -26,6 +26,7 @@ import storage_add_bucket_label import storage_async_upload +import storage_async_download import storage_batch_request import storage_bucket_delete_default_kms_key import storage_change_default_storage_class @@ -267,6 +268,19 @@ def test_async_upload(bucket, capsys): assert f"Uploaded 3 files to bucket {bucket.name}" in out +def test_async_download(test_bucket, capsys): + object_count = 3 + source_files = [f"async_sample_blob_{x}" for x in range(object_count)] + for source in source_files: + blob = test_bucket.blob(source) + blob.upload_from_string(source) + + asyncio.run(storage_async_download.async_download_blobs(test_bucket.name, *source_files)) + out, _ = capsys.readouterr() + for x in range(object_count): + assert f"Downloaded storage object async_sample_blob_{x}" in out + + def test_download_byte_range(test_blob): with tempfile.NamedTemporaryFile() as dest_file: storage_download_byte_range.download_byte_range( diff --git a/samples/snippets/storage_async_download.py b/samples/snippets/storage_async_download.py new file mode 100755 index 000000000..ed8f3f304 --- /dev/null +++ b/samples/snippets/storage_async_download.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import argparse + +"""Sample that asynchronously downloads multiple files from GCS to application's memory. +""" + + +# [START storage_async_download] +# This sample can be run by calling `async.run(async_download_blobs('bucket_name', ['file1', 'file2']))` +async def async_download_blobs(bucket_name, *file_names): + """Downloads a number of files in parallel from the bucket. + """ + # The ID of your GCS bucket. + # bucket_name = "your-bucket-name" + + # The list of files names to download, these files should be present in bucket. + # file_names = ["myfile1", "myfile2"] + + import asyncio + from google.cloud import storage + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + + loop = asyncio.get_running_loop() + + tasks = [] + for file_name in file_names: + blob = bucket.blob(file_name) + # The first arg, None, tells it to use the default loops executor + tasks.append(loop.run_in_executor(None, blob.download_as_bytes)) + + # If the method returns a value (such as download_as_bytes), gather will return the values + _ = await asyncio.gather(*tasks) + for file_name in file_names: + print(f"Downloaded storage object {file_name}") + + +# [END storage_async_download] + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-b', '--bucket_name', type=str, dest='bucket_name', help='provide the name of the GCS bucket') + parser.add_argument( + '-f', '--file_name', + action='append', + type=str, + dest='file_names', + help='Example: -f file1.txt or --file_name my_fav.mp4 . It can be used multiple times.' + ) + args = parser.parse_args() + + asyncio.run(async_download_blobs(args.bucket_name, *args.file_names)) From 5cfb7a599d4280d081d3983f5b22427b56321165 Mon Sep 17 00:00:00 2001 From: Chandrashekhar Sirimala Date: Tue, 6 May 2025 21:20:30 +0530 Subject: [PATCH 337/509] samples: Add samples for soft_deleted_buckets (#1463) * samples: Add samples for soft_deleted_buckets * fix: fix linting errors * fix: fix linting errors on #1455 - attempt2 * fix: fix linting errors on #1455 - attempt3 * fix: test_list_buckets errors * fix: address comments by @JesseLovelace * samples: Add storage_list_soft_deleted_buckets.py sample and test cases for all * fix: lint errors space b/w methods. * fix: lint issues. * fix: undo changes in storage_list_buckets.py * fix: lint errors * Change copyright statement. * fix minor typos in doc strings as per code comment --- samples/snippets/snippets_test.py | 34 +++++++++++++ .../storage_get_soft_deleted_bucket.py | 48 +++++++++++++++++++ .../storage_list_soft_deleted_buckets.py | 36 ++++++++++++++ .../storage_restore_soft_deleted_bucket.py | 38 +++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 samples/snippets/storage_get_soft_deleted_bucket.py create mode 100644 samples/snippets/storage_list_soft_deleted_buckets.py create mode 100644 samples/snippets/storage_restore_soft_deleted_bucket.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 6d9cfc317..4f98884b5 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -59,9 +59,12 @@ import storage_get_autoclass import storage_get_bucket_labels import storage_get_bucket_metadata +import storage_get_soft_deleted_bucket import storage_get_metadata import storage_get_service_account import storage_list_buckets +import storage_list_soft_deleted_buckets +import storage_restore_soft_deleted_bucket import storage_list_file_archived_generations import storage_list_files import storage_list_files_with_prefix @@ -131,6 +134,19 @@ def test_bucket(): bucket.delete(force=True) +@pytest.fixture(scope="module") +def test_soft_deleted_bucket(): + """Yields a soft-deleted bucket.""" + bucket = None + while bucket is None or bucket.exists(): + bucket_name = f"storage-snippets-test-{uuid.uuid4()}" + bucket = storage.Client().bucket(bucket_name) + bucket.create() + # [Assumption] Bucket is created with default policy , ie soft delete on. + bucket.delete() + yield bucket + + @pytest.fixture(scope="function") def test_public_bucket(): # The new projects don't allow to make a bucket available to public, so @@ -195,6 +211,12 @@ def test_list_buckets(test_bucket, capsys): assert test_bucket.name in out +def test_list_soft_deleted_buckets(test_soft_deleted_bucket, capsys): + storage_list_soft_deleted_buckets.list_soft_deleted_buckets() + out, _ = capsys.readouterr() + assert test_soft_deleted_bucket.name in out + + def test_list_blobs(test_blob, capsys): storage_list_files.list_blobs(test_blob.bucket.name) out, _ = capsys.readouterr() @@ -207,6 +229,18 @@ def test_bucket_metadata(test_bucket, capsys): assert test_bucket.name in out +def test_get_soft_deleted_bucket(test_soft_deleted_bucket, capsys): + storage_get_soft_deleted_bucket.get_soft_deleted_bucket(test_soft_deleted_bucket.name, test_soft_deleted_bucket.generation) + out, _ = capsys.readouterr() + assert test_soft_deleted_bucket.name in out + + +def test_restore_soft_deleted_bucket(test_soft_deleted_bucket, capsys): + storage_restore_soft_deleted_bucket.restore_bucket(test_soft_deleted_bucket.name, test_soft_deleted_bucket.generation) + out, _ = capsys.readouterr() + assert test_soft_deleted_bucket.name in out + + def test_list_blobs_with_prefix(test_blob, capsys): storage_list_files_with_prefix.list_blobs_with_prefix( test_blob.bucket.name, prefix="storage_snippets" diff --git a/samples/snippets/storage_get_soft_deleted_bucket.py b/samples/snippets/storage_get_soft_deleted_bucket.py new file mode 100644 index 000000000..2b7955046 --- /dev/null +++ b/samples/snippets/storage_get_soft_deleted_bucket.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys + +# [START storage_get_soft_deleted_bucket] + +from google.cloud import storage + + +def get_soft_deleted_bucket(bucket_name, generation): + """Prints out a soft-deleted bucket's metadata. + + Args: + bucket_name: str + The name of the bucket to get. + + generation: + The generation of the bucket. + + """ + storage_client = storage.Client() + bucket = storage_client.get_bucket(bucket_name, soft_deleted=True, generation=generation) + + print(f"ID: {bucket.id}") + print(f"Name: {bucket.name}") + print(f"Soft Delete time: {bucket.soft_delete_time}") + print(f"Hard Delete Time : {bucket.hard_delete_time}") + + +# [END storage_get_soft_deleted_bucket] + +if __name__ == "__main__": + get_soft_deleted_bucket(bucket_name=sys.argv[1], generation=sys.argv[2]) diff --git a/samples/snippets/storage_list_soft_deleted_buckets.py b/samples/snippets/storage_list_soft_deleted_buckets.py new file mode 100644 index 000000000..16abd90f0 --- /dev/null +++ b/samples/snippets/storage_list_soft_deleted_buckets.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_list_soft_deleted_buckets] + +from google.cloud import storage + + +def list_soft_deleted_buckets(): + """Lists all soft-deleted buckets.""" + + storage_client = storage.Client() + buckets = storage_client.list_buckets(soft_deleted=True) + + for bucket in buckets: + print(bucket.name) + + +# [END storage_list_soft_deleted_buckets] + + +if __name__ == "__main__": + list_soft_deleted_buckets() diff --git a/samples/snippets/storage_restore_soft_deleted_bucket.py b/samples/snippets/storage_restore_soft_deleted_bucket.py new file mode 100644 index 000000000..fb6291997 --- /dev/null +++ b/samples/snippets/storage_restore_soft_deleted_bucket.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys + +# [START storage_restore_soft_deleted_bucket] + +from google.cloud import storage + + +def restore_bucket(bucket_name, bucket_generation): + storage_client = storage.Client() + bucket = storage_client.restore_bucket(bucket_name=bucket_name, generation=bucket_generation) + print(f"Soft-deleted bucket {bucket.name} with ID: {bucket.id} was restored.") + print(f"Bucket Generation: {bucket.generation}") + + +# [END storage_restore_soft_deleted_bucket] + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Wrong inputs!! Usage of script - \"python storage_restore_soft_deleted_bucket.py \" ") + sys.exit(1) + restore_bucket(bucket_name=sys.argv[1], bucket_generation=sys.argv[2]) From 29d823dec5f08a451fd370ff1da0b28663513307 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Thu, 8 May 2025 16:57:59 -0700 Subject: [PATCH 338/509] chore: update retry docs (#1481) Co-authored-by: cojenco --- docs/retry_timeout.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/retry_timeout.rst b/docs/retry_timeout.rst index c9911a3f2..44d3d8a58 100644 --- a/docs/retry_timeout.rst +++ b/docs/retry_timeout.rst @@ -112,8 +112,8 @@ explicit policy in your code. from google.cloud.storage.retry import DEFAULT_RETRY - # Customize retry with a deadline of 500 seconds (default=120 seconds). - modified_retry = DEFAULT_RETRY.with_deadline(500.0) + # Customize retry with a timeout of 500 seconds (default=120 seconds). + modified_retry = DEFAULT_RETRY.with_timeout(500.0) # Customize retry with an initial wait time of 1.5 (default=1.0). # Customize retry with a wait time multiplier per iteration of 1.2 (default=2.0). # Customize retry with a maximum wait time of 45.0 (default=60.0). From 93138797981f722e3d296a92c5c4f5908b66cbb3 Mon Sep 17 00:00:00 2001 From: cojenco Date: Mon, 19 May 2025 13:08:32 -0700 Subject: [PATCH 339/509] samples: update retry sample and comments (#1485) --- samples/snippets/storage_configure_retries.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/samples/snippets/storage_configure_retries.py b/samples/snippets/storage_configure_retries.py index ef1e422b6..25c2529a4 100644 --- a/samples/snippets/storage_configure_retries.py +++ b/samples/snippets/storage_configure_retries.py @@ -38,16 +38,15 @@ def configure_retries(bucket_name, blob_name): bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) - # Customize retry with a deadline of 500 seconds (default=120 seconds). - modified_retry = DEFAULT_RETRY.with_deadline(500.0) + # Customize retry with a timeout of 500 seconds (default=120 seconds). + modified_retry = DEFAULT_RETRY.with_timeout(500.0) # Customize retry with an initial wait time of 1.5 (default=1.0). # Customize retry with a wait time multiplier per iteration of 1.2 (default=2.0). # Customize retry with a maximum wait time of 45.0 (default=60.0). modified_retry = modified_retry.with_delay(initial=1.5, multiplier=1.2, maximum=45.0) - # blob.delete() uses DEFAULT_RETRY_IF_GENERATION_SPECIFIED by default. - # Override with modified_retry so the function retries even if the generation - # number is not specified. + # blob.delete() uses DEFAULT_RETRY by default. + # Pass in modified_retry to override the default retry behavior. print( f"The following library method is customized to be retried according to the following configurations: {modified_retry}" ) From 609b3e08ac49f18268d6b59077344e5a99b50918 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 21 May 2025 18:11:54 -0700 Subject: [PATCH 340/509] chore: update blunderbuss.yml (#1484) Co-authored-by: Chandrashekhar Sirimala --- .github/blunderbuss.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml index ba6190daf..6c430b00d 100644 --- a/.github/blunderbuss.yml +++ b/.github/blunderbuss.yml @@ -4,7 +4,7 @@ # Note: This file is autogenerated. To make changes to the assignee # team, please update `codeowner_team` in `.repo-metadata.json`. assign_issues: - - cojenco + - chandra-siri assign_prs: - - cojenco + - chandra-siri From 7e0412a4fdfedcaa4683d5ef7d9155d5d58efa11 Mon Sep 17 00:00:00 2001 From: cojenco Date: Wed, 28 May 2025 14:17:19 -0700 Subject: [PATCH 341/509] fix: add a check for partial response data (#1487) * fix: import https://github.com/googleapis/google-resumable-media-python/pull/435 * update expections as per https://github.com/googleapis/python-storage/pull/1283 --- .../cloud/storage/_media/requests/download.py | 65 +++++++++++++---- .../system/requests/test_download.py | 2 +- .../unit/requests/test_download.py | 72 +++++++++++++++++-- 3 files changed, 122 insertions(+), 17 deletions(-) diff --git a/google/cloud/storage/_media/requests/download.py b/google/cloud/storage/_media/requests/download.py index 2c1b9392c..6222148b3 100644 --- a/google/cloud/storage/_media/requests/download.py +++ b/google/cloud/storage/_media/requests/download.py @@ -43,6 +43,12 @@ Please restart the download. """ +_RESPONSE_HEADERS_INFO = """\ +The X-Goog-Stored-Content-Length is {}. The X-Goog-Stored-Content-Encoding is {}. +The download request read {} bytes of data. +If the download was incomplete, please check the network connection and restart the download. +""" + class Download(_request_helpers.RequestsMixin, _download.Download): """Helper to manage downloading a resource from a Google API. @@ -141,13 +147,30 @@ def _write_to_stream(self, response): ): actual_checksum = _helpers.prepare_checksum_digest(checksum_object.digest()) if actual_checksum != expected_checksum: - msg = _CHECKSUM_MISMATCH.format( - self.media_url, - expected_checksum, - actual_checksum, - checksum_type=self.checksum.upper(), + headers = self._get_headers(response) + x_goog_encoding = headers.get("x-goog-stored-content-encoding") + x_goog_length = headers.get("x-goog-stored-content-length") + content_length_msg = _RESPONSE_HEADERS_INFO.format( + x_goog_length, x_goog_encoding, self._bytes_downloaded ) - raise DataCorruption(response, msg) + if ( + x_goog_length + and self._bytes_downloaded < int(x_goog_length) + and x_goog_encoding != "gzip" + ): + # The library will attempt to trigger a retry by raising a ConnectionError, if + # (a) bytes_downloaded is less than response header x-goog-stored-content-length, and + # (b) the object is not gzip-compressed when stored in Cloud Storage. + raise ConnectionError(content_length_msg) + else: + msg = _CHECKSUM_MISMATCH.format( + self.media_url, + expected_checksum, + actual_checksum, + checksum_type=self.checksum.upper(), + ) + msg += content_length_msg + raise DataCorruption(response, msg) def consume( self, @@ -339,13 +362,31 @@ def _write_to_stream(self, response): actual_checksum = _helpers.prepare_checksum_digest(checksum_object.digest()) if actual_checksum != expected_checksum: - msg = _CHECKSUM_MISMATCH.format( - self.media_url, - expected_checksum, - actual_checksum, - checksum_type=self.checksum.upper(), + headers = self._get_headers(response) + x_goog_encoding = headers.get("x-goog-stored-content-encoding") + x_goog_length = headers.get("x-goog-stored-content-length") + content_length_msg = _RESPONSE_HEADERS_INFO.format( + x_goog_length, x_goog_encoding, self._bytes_downloaded ) - raise DataCorruption(response, msg) + if ( + x_goog_length + and self._bytes_downloaded < int(x_goog_length) + and x_goog_encoding != "gzip" + ): + # The library will attempt to trigger a retry by raising a ConnectionError, if + # (a) bytes_downloaded is less than response header x-goog-stored-content-length, and + # (b) the object is not gzip-compressed when stored in Cloud Storage. + raise ConnectionError(content_length_msg) + else: + msg = _CHECKSUM_MISMATCH.format( + self.media_url, + expected_checksum, + actual_checksum, + checksum_type=self.checksum.upper(), + ) + msg += content_length_msg + raise DataCorruption(response, msg) + def consume( self, diff --git a/tests/resumable_media/system/requests/test_download.py b/tests/resumable_media/system/requests/test_download.py index 15fe7d2c0..04c7246f6 100644 --- a/tests/resumable_media/system/requests/test_download.py +++ b/tests/resumable_media/system/requests/test_download.py @@ -463,7 +463,7 @@ def test_corrupt_download(self, add_files, corrupting_transport, checksum): info[checksum], checksum_type=checksum.upper(), ) - assert exc_info.value.args == (msg,) + assert msg in exc_info.value.args[0] def test_corrupt_download_no_check(self, add_files, corrupting_transport): for info in ALL_FILES: diff --git a/tests/resumable_media/unit/requests/test_download.py b/tests/resumable_media/unit/requests/test_download.py index 3da234a29..568d3238c 100644 --- a/tests/resumable_media/unit/requests/test_download.py +++ b/tests/resumable_media/unit/requests/test_download.py @@ -124,7 +124,11 @@ def test__write_to_stream_with_hash_check_fail(self, checksum): msg = download_mod._CHECKSUM_MISMATCH.format( EXAMPLE_URL, bad_checksum, good_checksum, checksum_type=checksum.upper() ) - assert error.args[0] == msg + assert msg in error.args[0] + assert ( + f"The download request read {download._bytes_downloaded} bytes of data." + in error.args[0] + ) # Check mocks. response.__enter__.assert_called_once_with() @@ -186,6 +190,29 @@ def test__write_to_stream_with_invalid_checksum_type(self): error = exc_info.value assert error.args[0] == "checksum must be ``'md5'``, ``'crc32c'`` or ``None``" + @pytest.mark.parametrize("checksum", ["md5", "crc32c"]) + def test__write_to_stream_incomplete_read(self, checksum): + stream = io.BytesIO() + download = download_mod.Download(EXAMPLE_URL, stream=stream, checksum=checksum) + + chunk1 = b"first chunk" + mock_full_content_length = len(chunk1) + 123 + headers = {"x-goog-stored-content-length": mock_full_content_length} + bad_checksum = "d3JvbmcgbiBtYWRlIHVwIQ==" + header_value = "crc32c={bad},md5={bad}".format(bad=bad_checksum) + headers[_helpers._HASH_HEADER] = header_value + response = _mock_response(chunks=[chunk1], headers=headers) + + with pytest.raises(ConnectionError) as exc_info: + download._write_to_stream(response) + + assert not download.finished + error = exc_info.value + assert ( + f"The download request read {download._bytes_downloaded} bytes of data." + in error.args[0] + ) + def _consume_helper( self, stream=None, @@ -304,7 +331,11 @@ def test_consume_with_stream_hash_check_fail(self, checksum): msg = download_mod._CHECKSUM_MISMATCH.format( EXAMPLE_URL, bad_checksum, good_checksum, checksum_type=checksum.upper() ) - assert error.args[0] == msg + assert msg in error.args[0] + assert ( + f"The download request read {download._bytes_downloaded} bytes of data." + in error.args[0] + ) # Check mocks. transport.request.assert_called_once_with( @@ -599,7 +630,11 @@ def test__write_to_stream_with_hash_check_fail(self, checksum): msg = download_mod._CHECKSUM_MISMATCH.format( EXAMPLE_URL, bad_checksum, good_checksum, checksum_type=checksum.upper() ) - assert error.args[0] == msg + assert msg in error.args[0] + assert ( + f"The download request read {download._bytes_downloaded} bytes of data." + in error.args[0] + ) # Check mocks. response.__enter__.assert_called_once_with() @@ -632,6 +667,31 @@ def test__write_to_stream_with_invalid_checksum_type(self): error = exc_info.value assert error.args[0] == "checksum must be ``'md5'``, ``'crc32c'`` or ``None``" + @pytest.mark.parametrize("checksum", ["md5", "crc32c"]) + def test__write_to_stream_incomplete_read(self, checksum): + stream = io.BytesIO() + download = download_mod.RawDownload( + EXAMPLE_URL, stream=stream, checksum=checksum + ) + + chunk1 = b"first chunk" + mock_full_content_length = len(chunk1) + 123 + headers = {"x-goog-stored-content-length": mock_full_content_length} + bad_checksum = "d3JvbmcgbiBtYWRlIHVwIQ==" + header_value = "crc32c={bad},md5={bad}".format(bad=bad_checksum) + headers[_helpers._HASH_HEADER] = header_value + response = _mock_raw_response(chunks=[chunk1], headers=headers) + + with pytest.raises(ConnectionError) as exc_info: + download._write_to_stream(response) + + assert not download.finished + error = exc_info.value + assert ( + f"The download request read {download._bytes_downloaded} bytes of data." + in error.args[0] + ) + def _consume_helper( self, stream=None, @@ -754,7 +814,11 @@ def test_consume_with_stream_hash_check_fail(self, checksum): msg = download_mod._CHECKSUM_MISMATCH.format( EXAMPLE_URL, bad_checksum, good_checksum, checksum_type=checksum.upper() ) - assert error.args[0] == msg + assert msg in error.args[0] + assert ( + f"The download request read {download._bytes_downloaded} bytes of data." + in error.args[0] + ) # Check mocks. transport.request.assert_called_once_with( From 4e9b714afccc8d7cd27cf8d66b31392c2dd8a070 Mon Sep 17 00:00:00 2001 From: shubham-up-47 Date: Sat, 7 Jun 2025 08:51:59 +0000 Subject: [PATCH 342/509] samples(storage): add samples for soft delete objects (#1486) --- samples/snippets/snippets_test.py | 146 ++++++++++++++++-- .../snippets/storage_disable_soft_delete.py | 40 +++++ .../storage_get_soft_delete_policy.py | 47 ++++++ ...orage_list_soft_deleted_object_versions.py | 41 +++++ .../storage_list_soft_deleted_objects.py | 40 +++++ samples/snippets/storage_restore_object.py | 47 ++++++ .../storage_set_soft_delete_policy.py | 42 +++++ 7 files changed, 393 insertions(+), 10 deletions(-) create mode 100644 samples/snippets/storage_disable_soft_delete.py create mode 100644 samples/snippets/storage_get_soft_delete_policy.py create mode 100644 samples/snippets/storage_list_soft_deleted_object_versions.py create mode 100644 samples/snippets/storage_list_soft_deleted_objects.py create mode 100644 samples/snippets/storage_restore_object.py create mode 100644 samples/snippets/storage_set_soft_delete_policy.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 4f98884b5..3fe377b6b 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -25,8 +25,8 @@ import requests import storage_add_bucket_label -import storage_async_upload import storage_async_download +import storage_async_upload import storage_batch_request import storage_bucket_delete_default_kms_key import storage_change_default_storage_class @@ -44,6 +44,7 @@ import storage_delete_file import storage_delete_file_archived_generation import storage_disable_bucket_lifecycle_management +import storage_disable_soft_delete import storage_disable_versioning import storage_download_byte_range import storage_download_file @@ -59,26 +60,31 @@ import storage_get_autoclass import storage_get_bucket_labels import storage_get_bucket_metadata -import storage_get_soft_deleted_bucket import storage_get_metadata import storage_get_service_account +import storage_get_soft_delete_policy +import storage_get_soft_deleted_bucket import storage_list_buckets -import storage_list_soft_deleted_buckets -import storage_restore_soft_deleted_bucket import storage_list_file_archived_generations import storage_list_files import storage_list_files_with_prefix +import storage_list_soft_deleted_buckets +import storage_list_soft_deleted_object_versions +import storage_list_soft_deleted_objects import storage_make_public import storage_move_file import storage_object_get_kms_key import storage_remove_bucket_label import storage_remove_cors_configuration import storage_rename_file +import storage_restore_object +import storage_restore_soft_deleted_bucket import storage_set_autoclass import storage_set_bucket_default_kms_key import storage_set_client_endpoint -import storage_set_object_retention_policy import storage_set_metadata +import storage_set_object_retention_policy +import storage_set_soft_delete_policy import storage_trace_quickstart import storage_transfer_manager_download_bucket import storage_transfer_manager_download_chunks_concurrently @@ -147,6 +153,21 @@ def test_soft_deleted_bucket(): yield bucket +@pytest.fixture(scope="function") +def test_soft_delete_enabled_bucket(): + """Yields a bucket with soft-delete enabled that is deleted after the test completes.""" + bucket = None + while bucket is None or bucket.exists(): + bucket_name = f"storage-snippets-test-{uuid.uuid4()}" + bucket = storage.Client().bucket(bucket_name) + # Soft-delete retention for 7 days (minimum allowed by API) + bucket.soft_delete_policy.retention_duration_seconds = 7 * 24 * 60 * 60 + # Soft-delete requires a region + bucket.create(location="US-CENTRAL1") + yield bucket + bucket.delete(force=True) + + @pytest.fixture(scope="function") def test_public_bucket(): # The new projects don't allow to make a bucket available to public, so @@ -230,13 +251,17 @@ def test_bucket_metadata(test_bucket, capsys): def test_get_soft_deleted_bucket(test_soft_deleted_bucket, capsys): - storage_get_soft_deleted_bucket.get_soft_deleted_bucket(test_soft_deleted_bucket.name, test_soft_deleted_bucket.generation) + storage_get_soft_deleted_bucket.get_soft_deleted_bucket( + test_soft_deleted_bucket.name, test_soft_deleted_bucket.generation + ) out, _ = capsys.readouterr() assert test_soft_deleted_bucket.name in out def test_restore_soft_deleted_bucket(test_soft_deleted_bucket, capsys): - storage_restore_soft_deleted_bucket.restore_bucket(test_soft_deleted_bucket.name, test_soft_deleted_bucket.generation) + storage_restore_soft_deleted_bucket.restore_bucket( + test_soft_deleted_bucket.name, test_soft_deleted_bucket.generation + ) out, _ = capsys.readouterr() assert test_soft_deleted_bucket.name in out @@ -309,7 +334,9 @@ def test_async_download(test_bucket, capsys): blob = test_bucket.blob(source) blob.upload_from_string(source) - asyncio.run(storage_async_download.async_download_blobs(test_bucket.name, *source_files)) + asyncio.run( + storage_async_download.async_download_blobs(test_bucket.name, *source_files) + ) out, _ = capsys.readouterr() for x in range(object_count): assert f"Downloaded storage object async_sample_blob_{x}" in out @@ -877,7 +904,10 @@ def test_object_retention_policy(test_bucket_create, capsys): test_bucket_create.name ) out, _ = capsys.readouterr() - assert f"Created bucket {test_bucket_create.name} with object retention enabled setting" in out + assert ( + f"Created bucket {test_bucket_create.name} with object retention enabled setting" + in out + ) blob_name = "test_object_retention" storage_set_object_retention_policy.set_object_retention_policy( @@ -898,7 +928,10 @@ def test_create_bucket_hierarchical_namespace(test_bucket_create, capsys): test_bucket_create.name ) out, _ = capsys.readouterr() - assert f"Created bucket {test_bucket_create.name} with hierarchical namespace enabled" in out + assert ( + f"Created bucket {test_bucket_create.name} with hierarchical namespace enabled" + in out + ) def test_storage_trace_quickstart(test_bucket, capsys): @@ -911,3 +944,96 @@ def test_storage_trace_quickstart(test_bucket, capsys): assert ( f"Downloaded storage object {blob_name} from bucket {test_bucket.name}" in out ) + + +def test_storage_disable_soft_delete(test_soft_delete_enabled_bucket, capsys): + bucket_name = test_soft_delete_enabled_bucket.name + storage_disable_soft_delete.disable_soft_delete(bucket_name) + out, _ = capsys.readouterr() + assert f"Soft-delete policy is disabled for bucket {bucket_name}" in out + + +def test_storage_get_soft_delete_policy(test_soft_delete_enabled_bucket, capsys): + bucket_name = test_soft_delete_enabled_bucket.name + storage_get_soft_delete_policy.get_soft_delete_policy(bucket_name) + out, _ = capsys.readouterr() + assert f"Soft-delete policy for {bucket_name}" in out + assert "Object soft-delete policy is enabled" in out + assert "Object retention duration: " in out + assert "Policy effective time: " in out + + # Disable the soft-delete policy + test_soft_delete_enabled_bucket.soft_delete_policy.retention_duration_seconds = 0 + test_soft_delete_enabled_bucket.patch() + storage_get_soft_delete_policy.get_soft_delete_policy(bucket_name) + out, _ = capsys.readouterr() + assert f"Soft-delete policy for {bucket_name}" in out + assert "Object soft-delete policy is disabled" in out + + +def test_storage_set_soft_delete_policy(test_soft_delete_enabled_bucket, capsys): + bucket_name = test_soft_delete_enabled_bucket.name + retention_duration_seconds = 10 * 24 * 60 * 60 # 10 days + storage_set_soft_delete_policy.set_soft_delete_policy( + bucket_name, retention_duration_seconds + ) + out, _ = capsys.readouterr() + assert ( + f"Soft delete policy for bucket {bucket_name} was set to {retention_duration_seconds} seconds retention period" + in out + ) + + +def test_storage_list_soft_deleted_objects(test_soft_delete_enabled_bucket, capsys): + bucket_name = test_soft_delete_enabled_bucket.name + blob_name = f"test_object_{uuid.uuid4().hex}.txt" + blob_content = "This object will be soft-deleted for listing." + blob = test_soft_delete_enabled_bucket.blob(blob_name) + blob.upload_from_string(blob_content) + blob_generation = blob.generation + + blob.delete() # Soft-delete the object + storage_list_soft_deleted_objects.list_soft_deleted_objects(bucket_name) + out, _ = capsys.readouterr() + assert f"Name: {blob_name}, Generation: {blob_generation}" in out + + +def test_storage_list_soft_deleted_object_versions( + test_soft_delete_enabled_bucket, capsys +): + bucket_name = test_soft_delete_enabled_bucket.name + blob_name = f"test_object_{uuid.uuid4().hex}.txt" + blob_content = "This object will be soft-deleted for version listing." + blob = test_soft_delete_enabled_bucket.blob(blob_name) + blob.upload_from_string(blob_content) + blob_generation = blob.generation + + blob.delete() # Soft-delete the object + storage_list_soft_deleted_object_versions.list_soft_deleted_object_versions( + bucket_name, blob_name + ) + out, _ = capsys.readouterr() + assert f"Version ID: {blob_generation}" in out + + +def test_storage_restore_soft_deleted_object(test_soft_delete_enabled_bucket, capsys): + bucket_name = test_soft_delete_enabled_bucket.name + blob_name = f"test-restore-sd-obj-{uuid.uuid4().hex}.txt" + blob_content = "This object will be soft-deleted and restored." + blob = test_soft_delete_enabled_bucket.blob(blob_name) + blob.upload_from_string(blob_content) + blob_generation = blob.generation + + blob.delete() # Soft-delete the object + storage_restore_object.restore_soft_deleted_object( + bucket_name, blob_name, blob_generation + ) + out, _ = capsys.readouterr() + assert ( + f"Soft-deleted object {blob_name} is restored in the bucket {bucket_name}" + in out + ) + + # Verify the restoration + blob = test_soft_delete_enabled_bucket.get_blob(blob_name) + assert blob is not None diff --git a/samples/snippets/storage_disable_soft_delete.py b/samples/snippets/storage_disable_soft_delete.py new file mode 100644 index 000000000..dc2447ae8 --- /dev/null +++ b/samples/snippets/storage_disable_soft_delete.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_disable_soft_delete] +from google.cloud import storage + + +def disable_soft_delete(bucket_name): + """Disable soft-delete policy for the bucket.""" + # bucket_name = "your-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.get_bucket(bucket_name) + + # Setting the retention duration to 0 disables soft-delete. + bucket.soft_delete_policy.retention_duration_seconds = 0 + bucket.patch() + + print(f"Soft-delete policy is disabled for bucket {bucket_name}") + + +# [END storage_disable_soft_delete] + +if __name__ == "__main__": + disable_soft_delete(bucket_name=sys.argv[1]) diff --git a/samples/snippets/storage_get_soft_delete_policy.py b/samples/snippets/storage_get_soft_delete_policy.py new file mode 100644 index 000000000..99c4e572a --- /dev/null +++ b/samples/snippets/storage_get_soft_delete_policy.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_get_soft_delete_policy] +from google.cloud import storage + + +def get_soft_delete_policy(bucket_name): + """Gets the soft-delete policy of the bucket""" + # bucket_name = "your-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.get_bucket(bucket_name) + + print(f"Soft-delete policy for {bucket_name}") + if ( + bucket.soft_delete_policy + and bucket.soft_delete_policy.retention_duration_seconds + ): + print("Object soft-delete policy is enabled") + print( + f"Object retention duration: {bucket.soft_delete_policy.retention_duration_seconds} seconds" + ) + print(f"Policy effective time: {bucket.soft_delete_policy.effective_time}") + else: + print("Object soft-delete policy is disabled") + + +# [END storage_get_soft_delete_policy] + +if __name__ == "__main__": + get_soft_delete_policy(bucket_name=sys.argv[1]) diff --git a/samples/snippets/storage_list_soft_deleted_object_versions.py b/samples/snippets/storage_list_soft_deleted_object_versions.py new file mode 100644 index 000000000..ecb9851c4 --- /dev/null +++ b/samples/snippets/storage_list_soft_deleted_object_versions.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_list_soft_deleted_object_versions] +from google.cloud import storage + + +def list_soft_deleted_object_versions(bucket_name, blob_name): + """Lists all versions of a soft-deleted object in the bucket.""" + # bucket_name = "your-bucket-name" + # blob_name = "your-object-name" + + storage_client = storage.Client() + blobs = storage_client.list_blobs(bucket_name, prefix=blob_name, soft_deleted=True) + + # Note: The call returns a response only when the iterator is consumed. + for blob in blobs: + print( + f"Version ID: {blob.generation}, Soft Delete Time: {blob.soft_delete_time}" + ) + + +# [END storage_list_soft_deleted_object_versions] + +if __name__ == "__main__": + list_soft_deleted_object_versions(bucket_name=sys.argv[1], blob_name=sys.argv[2]) diff --git a/samples/snippets/storage_list_soft_deleted_objects.py b/samples/snippets/storage_list_soft_deleted_objects.py new file mode 100644 index 000000000..764cac56a --- /dev/null +++ b/samples/snippets/storage_list_soft_deleted_objects.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_list_soft_deleted_objects] +from google.cloud import storage + + +def list_soft_deleted_objects(bucket_name): + """Lists all soft-deleted objects in the bucket.""" + # bucket_name = "your-bucket-name" + + storage_client = storage.Client() + blobs = storage_client.list_blobs(bucket_name, soft_deleted=True) + + # Note: The call returns a response only when the iterator is consumed. + for blob in blobs: + print( + f"Name: {blob.name}, Generation: {blob.generation}, Soft Delete Time: {blob.soft_delete_time}" + ) + + +# [END storage_list_soft_deleted_objects] + +if __name__ == "__main__": + list_soft_deleted_objects(bucket_name=sys.argv[1]) diff --git a/samples/snippets/storage_restore_object.py b/samples/snippets/storage_restore_object.py new file mode 100644 index 000000000..d1e3f2937 --- /dev/null +++ b/samples/snippets/storage_restore_object.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys + +# [START storage_restore_object] +from google.cloud import storage + + +def restore_soft_deleted_object(bucket_name, blob_name, blob_generation): + """Restores a soft-deleted object in the bucket.""" + # bucket_name = "your-bucket-name" + # blob_name = "your-object-name" + # blob_generation = "your-object-version-id" + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + + # Restore function will override if a live object already + # exists with the same name. + bucket.restore_blob(blob_name, generation=blob_generation) + + print( + f"Soft-deleted object {blob_name} is restored in the bucket {bucket_name}" + ) + + +# [END storage_restore_object] + +if __name__ == "__main__": + restore_soft_deleted_object( + bucket_name=sys.argv[1], blob_name=sys.argv[2], blob_generation=sys.argv[3] + ) diff --git a/samples/snippets/storage_set_soft_delete_policy.py b/samples/snippets/storage_set_soft_delete_policy.py new file mode 100644 index 000000000..26bc59436 --- /dev/null +++ b/samples/snippets/storage_set_soft_delete_policy.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_set_soft_delete_policy] +from google.cloud import storage + + +def set_soft_delete_policy(bucket_name, duration_in_seconds): + """Sets a soft-delete policy on the bucket""" + # bucket_name = "your-bucket-name" + # duration_in_seconds = "your-soft-delete-retention-duration-in-seconds" + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + + bucket.soft_delete_policy.retention_duration_seconds = duration_in_seconds + bucket.patch() + + print( + f"Soft delete policy for bucket {bucket_name} was set to {duration_in_seconds} seconds retention period" + ) + + +# [END storage_set_soft_delete_policy] + +if __name__ == "__main__": + set_soft_delete_policy(bucket_name=sys.argv[1], duration_in_seconds=sys.argv[2]) From 2a46c0b9e6ec561ae3151d2a9a80c7452634487e Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:58:30 +0530 Subject: [PATCH 343/509] fix: Segmentation fault in tink while writing data (#1490) * fix: Segmentation fault in tink while writing data * add unit tests --- google/cloud/storage/_media/requests/download.py | 1 - google/cloud/storage/fileio.py | 2 +- tests/unit/test_fileio.py | 6 ++++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/google/cloud/storage/_media/requests/download.py b/google/cloud/storage/_media/requests/download.py index 6222148b3..67535f923 100644 --- a/google/cloud/storage/_media/requests/download.py +++ b/google/cloud/storage/_media/requests/download.py @@ -387,7 +387,6 @@ def _write_to_stream(self, response): msg += content_length_msg raise DataCorruption(response, msg) - def consume( self, transport, diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index 2b4754648..289a09cee 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -477,7 +477,7 @@ def write(self, b): self._buffer.seek(0, io.SEEK_END) pos = self._buffer.write(b) self._buffer.seek(bookmark) - return self._cursor + pos + return pos def read(self, size=-1): """Read and move the cursor.""" diff --git a/tests/unit/test_fileio.py b/tests/unit/test_fileio.py index 8da25d9e3..920a3c4c2 100644 --- a/tests/unit/test_fileio.py +++ b/tests/unit/test_fileio.py @@ -367,12 +367,14 @@ def test_write(self, mock_warn): # Write under chunk_size. This should be buffered and the upload not # initiated. - writer.write(TEST_BINARY_DATA[0:4]) + w1 = writer.write(TEST_BINARY_DATA[0:4]) + self.assertEqual(w1, 4) blob._initiate_resumable_upload.assert_not_called() # Write over chunk_size. This should result in upload initialization # and multiple chunks uploaded. - writer.write(TEST_BINARY_DATA[4:32]) + w2 = writer.write(TEST_BINARY_DATA[4:32]) + self.assertEqual(w2, 28) blob._initiate_resumable_upload.assert_called_once_with( blob.bucket.client, writer._buffer, From 793d34048d318f0e01046db6b3e648de038917c5 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:07:08 +0530 Subject: [PATCH 344/509] chore(main): release 3.1.1 (#1449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(main): release 3.1.1 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Update CHANGELOG.md --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot Co-authored-by: cojenco --- CHANGELOG.md | 20 ++++++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d819e0ae..8e66795a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.1.1](https://github.com/googleapis/python-storage/compare/v3.1.0...v3.1.1) (2025-06-13) + + +### Bug Fixes + +* Add a check for partial response data ([#1487](https://github.com/googleapis/python-storage/issues/1487)) ([7e0412a](https://github.com/googleapis/python-storage/commit/7e0412a4fdfedcaa4683d5ef7d9155d5d58efa11)) +* Add trove classifier for Python 3.13 ([0100916](https://github.com/googleapis/python-storage/commit/01009164beaab8931a1e1684966e3060edcf77b7)) +* **deps:** Require google-crc32c >= 1.1.3 ([0100916](https://github.com/googleapis/python-storage/commit/01009164beaab8931a1e1684966e3060edcf77b7)) +* **deps:** Require protobuf >= 3.20.2, < 7.0.0 ([0100916](https://github.com/googleapis/python-storage/commit/01009164beaab8931a1e1684966e3060edcf77b7)) +* **deps:** Require requests >= 2.22.0 ([0100916](https://github.com/googleapis/python-storage/commit/01009164beaab8931a1e1684966e3060edcf77b7)) +* Remove setup.cfg configuration for creating universal wheels ([#1448](https://github.com/googleapis/python-storage/issues/1448)) ([d3b6b3f](https://github.com/googleapis/python-storage/commit/d3b6b3f96a6f94aa7c371902f48d1363ae6bfb5c)) +* Resolve issue where pre-release versions of dependencies are installed ([0100916](https://github.com/googleapis/python-storage/commit/01009164beaab8931a1e1684966e3060edcf77b7)) +* Segmentation fault in tink while writing data ([#1490](https://github.com/googleapis/python-storage/issues/1490)) ([2a46c0b](https://github.com/googleapis/python-storage/commit/2a46c0b9e6ec561ae3151d2a9a80c7452634487e)) + + +### Documentation + +* Move quickstart to top of readme ([#1451](https://github.com/googleapis/python-storage/issues/1451)) ([53257cf](https://github.com/googleapis/python-storage/commit/53257cf20a4de3810156ae9576a7092f5527df98)) +* Update README to break infinite redirect loop ([#1450](https://github.com/googleapis/python-storage/issues/1450)) ([03f1594](https://github.com/googleapis/python-storage/commit/03f1594eb90ea1298a3a23927537c86ac35d33d5)) + ## [3.1.0](https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0) (2025-02-27) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 6ce498ba5..fa35f1da3 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.1.0" +__version__ = "3.1.1" From 129455b4290dfc75349f5529d167809df40be783 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 23 Jun 2025 15:55:50 +0530 Subject: [PATCH 345/509] chore: add owlbot for gapic generation (#1492) * chore: add owlbot for gapic generation * use only v2 for copying * use complete path for storage-v2-py --- .github/.OwlBot.yaml | 7 +++++++ .repo-metadata.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/.OwlBot.yaml b/.github/.OwlBot.yaml index 27096f674..837bf4fd6 100644 --- a/.github/.OwlBot.yaml +++ b/.github/.OwlBot.yaml @@ -15,5 +15,12 @@ docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest +deep-remove-regex: + - /owl-bot-staging + +deep-copy-regex: + - source: /google/storage/v2/storage-v2-py/(.*) + dest: /owl-bot-staging/$1/$2 + begin-after-commit-hash: 6acf4a0a797f1082027985c55c4b14b60f673dd7 diff --git a/.repo-metadata.json b/.repo-metadata.json index 5d5e49c84..f644429bc 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -11,7 +11,7 @@ "distribution_name": "google-cloud-storage", "api_id": "storage.googleapis.com", "requires_billing": true, - "default_version": "", + "default_version": "v2", "codeowner_team": "@googleapis/gcs-sdk-team", "api_shortname": "storage", "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." From 5821134d6cb86cdd73f4dcf4cdb4f3c0a9e5ddd2 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Fri, 27 Jun 2025 11:23:16 +0530 Subject: [PATCH 346/509] chore: add configurations in owlbot.py to copy gapic code (#1494) --- .gitignore | 3 +++ owlbot.py | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/.gitignore b/.gitignore index d083ea1dd..6f2ab1aff 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,6 @@ system_tests/local_test_setup # Make sure a generated file isn't accidentally committed. pylintrc pylintrc.test + +# Docker files +get-docker.sh diff --git a/owlbot.py b/owlbot.py index 08ddbb8fc..ba3f32df3 100644 --- a/owlbot.py +++ b/owlbot.py @@ -14,10 +14,33 @@ """This script is used to synthesize generated parts of this library.""" +import json + import synthtool as s from synthtool import gcp from synthtool.languages import python +# ---------------------------------------------------------------------------- +# Copy the generated client from the owl-bot staging directory +# ---------------------------------------------------------------------------- + +# Load the default version defined in .repo-metadata.json. +default_version = json.load(open(".repo-metadata.json", "rt")).get("default_version") + +for library in s.get_staging_dirs(default_version): + s.move( + [library], + excludes=[ + "**/gapic_version.py", + "docs/**/*", + "scripts/fixup*.py", + "setup.py", + "noxfile.py", + "README.rst", + ], + ) +s.remove_staging_dirs() + common = gcp.CommonTemplates() # ---------------------------------------------------------------------------- From 61c5d5f62c88506f200bc6d86b399a2c28715bc4 Mon Sep 17 00:00:00 2001 From: shubham-up-47 Date: Tue, 1 Jul 2025 04:26:52 +0000 Subject: [PATCH 347/509] feat: Adding support of single shot download (#1493) --- google/cloud/storage/_media/_download.py | 7 +- .../cloud/storage/_media/requests/download.py | 47 +++++++---- google/cloud/storage/blob.py | 61 ++++++++++++++ google/cloud/storage/client.py | 5 ++ google/cloud/storage/fileio.py | 8 +- .../system/requests/test_download.py | 40 ++++++++++ .../unit/requests/test_download.py | 39 +++++++++ tests/system/test_blob.py | 19 +++++ tests/unit/test_blob.py | 79 +++++++++++++++++-- tests/unit/test_client.py | 3 + 10 files changed, 285 insertions(+), 23 deletions(-) diff --git a/google/cloud/storage/_media/_download.py b/google/cloud/storage/_media/_download.py index 349ddf30c..422b98041 100644 --- a/google/cloud/storage/_media/_download.py +++ b/google/cloud/storage/_media/_download.py @@ -140,7 +140,7 @@ class Download(DownloadBase): ``start`` to the end of the media. headers (Optional[Mapping[str, str]]): Extra headers that should be sent with the request, e.g. headers for encrypted data. - checksum Optional([str]): The type of checksum to compute to verify + checksum (Optional[str]): The type of checksum to compute to verify the integrity of the object. The response headers must contain a checksum of the requested type. If the headers lack an appropriate checksum (for instance in the case of transcoded or @@ -157,6 +157,9 @@ class Download(DownloadBase): See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + single_shot_download (Optional[bool]): If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. """ @@ -169,6 +172,7 @@ def __init__( headers=None, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ): super(Download, self).__init__( media_url, stream=stream, start=start, end=end, headers=headers, retry=retry @@ -178,6 +182,7 @@ def __init__( self.checksum = ( "crc32c" if _helpers._is_crc32c_available_and_fast() else "md5" ) + self.single_shot_download = single_shot_download self._bytes_downloaded = 0 self._expected_checksum = None self._checksum_object = None diff --git a/google/cloud/storage/_media/requests/download.py b/google/cloud/storage/_media/requests/download.py index 67535f923..b8e2758e1 100644 --- a/google/cloud/storage/_media/requests/download.py +++ b/google/cloud/storage/_media/requests/download.py @@ -132,13 +132,24 @@ def _write_to_stream(self, response): # the stream is indeed compressed, this will delegate the checksum # object to the decoder and return a _DoNothingHash here. local_checksum_object = _add_decoder(response.raw, checksum_object) - body_iter = response.iter_content( - chunk_size=_request_helpers._SINGLE_GET_CHUNK_SIZE, decode_unicode=False - ) - for chunk in body_iter: - self._stream.write(chunk) - self._bytes_downloaded += len(chunk) - local_checksum_object.update(chunk) + + # This is useful for smaller files, or when the user wants to + # download the entire file in one go. + if self.single_shot_download: + content = response.raw.read(decode_content=True) + self._stream.write(content) + self._bytes_downloaded += len(content) + local_checksum_object.update(content) + response._content_consumed = True + else: + body_iter = response.iter_content( + chunk_size=_request_helpers._SINGLE_GET_CHUNK_SIZE, + decode_unicode=False, + ) + for chunk in body_iter: + self._stream.write(chunk) + self._bytes_downloaded += len(chunk) + local_checksum_object.update(chunk) # Don't validate the checksum for partial responses. if ( @@ -345,13 +356,21 @@ def _write_to_stream(self, response): checksum_object = self._checksum_object with response: - body_iter = response.raw.stream( - _request_helpers._SINGLE_GET_CHUNK_SIZE, decode_content=False - ) - for chunk in body_iter: - self._stream.write(chunk) - self._bytes_downloaded += len(chunk) - checksum_object.update(chunk) + # This is useful for smaller files, or when the user wants to + # download the entire file in one go. + if self.single_shot_download: + content = response.raw.read() + self._stream.write(content) + self._bytes_downloaded += len(content) + checksum_object.update(content) + else: + body_iter = response.raw.stream( + _request_helpers._SINGLE_GET_CHUNK_SIZE, decode_content=False + ) + for chunk in body_iter: + self._stream.write(chunk) + self._bytes_downloaded += len(chunk) + checksum_object.update(chunk) response._content_consumed = True # Don't validate the checksum for partial responses. diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 0d0e8ee80..0eb94fd47 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -987,6 +987,7 @@ def _do_download( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ): """Perform a download without any error handling. @@ -1047,6 +1048,12 @@ def _do_download( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. """ extra_attributes = { @@ -1054,6 +1061,7 @@ def _do_download( "download.chunk_size": f"{self.chunk_size}", "download.raw_download": raw_download, "upload.checksum": f"{checksum}", + "download.single_shot_download": single_shot_download, } args = {"timeout": timeout} @@ -1073,6 +1081,10 @@ def _do_download( end=end, checksum=checksum, retry=retry, + # NOTE: single_shot_download is only supported in Download and RawDownload + # classes, i.e., when chunk_size is set to None (the default value). It is + # not supported for chunked downloads. + single_shot_download=single_shot_download, ) with create_trace_span( name=f"Storage.{download_class}/consume", @@ -1127,6 +1139,7 @@ def download_to_file( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ): """Download the contents of this blob into a file-like object. @@ -1222,6 +1235,12 @@ def download_to_file( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. + :raises: :class:`google.cloud.exceptions.NotFound` """ with create_trace_span(name="Storage.Blob.downloadToFile"): @@ -1240,6 +1259,7 @@ def download_to_file( timeout=timeout, checksum=checksum, retry=retry, + single_shot_download=single_shot_download, ) def _handle_filename_and_download(self, filename, *args, **kwargs): @@ -1285,6 +1305,7 @@ def download_to_filename( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ): """Download the contents of this blob into a named file. @@ -1370,6 +1391,12 @@ def download_to_filename( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. + :raises: :class:`google.cloud.exceptions.NotFound` """ with create_trace_span(name="Storage.Blob.downloadToFilename"): @@ -1388,6 +1415,7 @@ def download_to_filename( timeout=timeout, checksum=checksum, retry=retry, + single_shot_download=single_shot_download, ) def download_as_bytes( @@ -1405,6 +1433,7 @@ def download_as_bytes( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ): """Download the contents of this blob as a bytes object. @@ -1484,6 +1513,12 @@ def download_as_bytes( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. + :rtype: bytes :returns: The data stored in this blob. @@ -1507,6 +1542,7 @@ def download_as_bytes( timeout=timeout, checksum=checksum, retry=retry, + single_shot_download=single_shot_download, ) return string_buffer.getvalue() @@ -1524,6 +1560,7 @@ def download_as_string( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + single_shot_download=False, ): """(Deprecated) Download the contents of this blob as a bytes object. @@ -1594,6 +1631,12 @@ def download_as_string( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. + :rtype: bytes :returns: The data stored in this blob. @@ -1616,6 +1659,7 @@ def download_as_string( if_metageneration_not_match=if_metageneration_not_match, timeout=timeout, retry=retry, + single_shot_download=single_shot_download, ) def download_as_text( @@ -1633,6 +1677,7 @@ def download_as_text( if_metageneration_not_match=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + single_shot_download=False, ): """Download the contents of this blob as text (*not* bytes). @@ -1705,6 +1750,12 @@ def download_as_text( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. + :rtype: text :returns: The data stored in this blob, decoded to text. """ @@ -1722,6 +1773,7 @@ def download_as_text( if_metageneration_not_match=if_metageneration_not_match, timeout=timeout, retry=retry, + single_shot_download=single_shot_download, ) if encoding is not None: @@ -4019,6 +4071,7 @@ def open( For downloads only, the following additional arguments are supported: - ``raw_download`` + - ``single_shot_download`` For uploads only, the following additional arguments are supported: @@ -4209,6 +4262,7 @@ def _prep_and_do_download( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, command=None, ): """Download the contents of a blob object into a file-like object. @@ -4294,6 +4348,12 @@ def _prep_and_do_download( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type single_shot_download: bool + :param single_shot_download: + (Optional) If true, download the object in a single request. + Caution: Enabling this will increase the memory overload for your application. + Please enable this as per your use case. + :type command: str :param command: (Optional) Information about which interface for download was used, @@ -4349,6 +4409,7 @@ def _prep_and_do_download( timeout=timeout, checksum=checksum, retry=retry, + single_shot_download=single_shot_download, ) except InvalidResponse as exc: _raise_from_invalid_response(exc) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index ba94b26fc..2f56d8719 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -1143,6 +1143,7 @@ def download_blob_to_file( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ): """Download the contents of a blob object or blob URI into a file-like object. @@ -1216,6 +1217,9 @@ def download_blob_to_file( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + + single_shot_download (bool): + (Optional) If true, download the object in a single request. """ with create_trace_span(name="Storage.Client.downloadBlobToFile"): if not isinstance(blob_or_uri, Blob): @@ -1236,6 +1240,7 @@ def download_blob_to_file( timeout=timeout, checksum=checksum, retry=retry, + single_shot_download=single_shot_download, ) def list_blobs( diff --git a/google/cloud/storage/fileio.py b/google/cloud/storage/fileio.py index 289a09cee..7c30f39be 100644 --- a/google/cloud/storage/fileio.py +++ b/google/cloud/storage/fileio.py @@ -35,6 +35,7 @@ "timeout", "retry", "raw_download", + "single_shot_download", } # Valid keyword arguments for upload methods. @@ -99,8 +100,9 @@ class BlobReader(io.BufferedIOBase): - ``if_metageneration_not_match`` - ``timeout`` - ``raw_download`` + - ``single_shot_download`` - Note that download_kwargs (excluding ``raw_download``) are also applied to blob.reload(), + Note that download_kwargs (excluding ``raw_download`` and ``single_shot_download``) are also applied to blob.reload(), if a reload is needed during seek(). """ @@ -177,7 +179,9 @@ def seek(self, pos, whence=0): if self._blob.size is None: reload_kwargs = { - k: v for k, v in self._download_kwargs.items() if k != "raw_download" + k: v + for k, v in self._download_kwargs.items() + if (k != "raw_download" and k != "single_shot_download") } self._blob.reload(**reload_kwargs) diff --git a/tests/resumable_media/system/requests/test_download.py b/tests/resumable_media/system/requests/test_download.py index 04c7246f6..84c44c94c 100644 --- a/tests/resumable_media/system/requests/test_download.py +++ b/tests/resumable_media/system/requests/test_download.py @@ -286,6 +286,23 @@ def test_download_full(self, add_files, authorized_transport, checksum): assert self._read_response_content(response) == actual_contents check_tombstoned(download, authorized_transport) + @pytest.mark.parametrize("checksum", ["auto", "md5", "crc32c", None]) + def test_single_shot_download_full(self, add_files, authorized_transport, checksum): + for info in ALL_FILES: + actual_contents = self._get_contents(info) + blob_name = get_blob_name(info) + + # Create the actual download object. + media_url = utils.DOWNLOAD_URL_TEMPLATE.format(blob_name=blob_name) + download = self._make_one( + media_url, checksum=checksum, single_shot_download=True + ) + # Consume the resource with single_shot_download enabled. + response = download.consume(authorized_transport) + assert response.status_code == http.client.OK + assert self._read_response_content(response) == actual_contents + check_tombstoned(download, authorized_transport) + def test_download_to_stream(self, add_files, authorized_transport): for info in ALL_FILES: actual_contents = self._get_contents(info) @@ -306,6 +323,29 @@ def test_download_to_stream(self, add_files, authorized_transport): assert stream.getvalue() == actual_contents check_tombstoned(download, authorized_transport) + @pytest.mark.parametrize("checksum", ["auto", "md5", "crc32c", None]) + def test_single_shot_download_to_stream(self, add_files, authorized_transport, checksum): + for info in ALL_FILES: + actual_contents = self._get_contents(info) + blob_name = get_blob_name(info) + + # Create the actual download object. + media_url = utils.DOWNLOAD_URL_TEMPLATE.format(blob_name=blob_name) + stream = io.BytesIO() + download = self._make_one( + media_url, checksum=checksum, stream=stream, single_shot_download=True + ) + # Consume the resource with single_shot_download enabled. + response = download.consume(authorized_transport) + assert response.status_code == http.client.OK + with pytest.raises(RuntimeError) as exc_info: + getattr(response, "content") + assert exc_info.value.args == (NO_BODY_ERR,) + assert response._content is False + assert response._content_consumed is True + assert stream.getvalue() == actual_contents + check_tombstoned(download, authorized_transport) + def test_download_gzip_w_stored_content_headers( self, add_files, authorized_transport ): diff --git a/tests/resumable_media/unit/requests/test_download.py b/tests/resumable_media/unit/requests/test_download.py index 568d3238c..b17fbb905 100644 --- a/tests/resumable_media/unit/requests/test_download.py +++ b/tests/resumable_media/unit/requests/test_download.py @@ -213,6 +213,25 @@ def test__write_to_stream_incomplete_read(self, checksum): in error.args[0] ) + @pytest.mark.parametrize("checksum", ["auto", "md5", "crc32c", None]) + def test__write_to_stream_single_shot_download(self, checksum): + stream = io.BytesIO() + download = download_mod.Download( + EXAMPLE_URL, stream=stream, checksum=checksum, single_shot_download=True + ) + + chunk1 = b"all at once!" + response = _mock_response(chunks=[chunk1], headers={}) + ret_val = download._write_to_stream(response) + + assert ret_val is None + assert stream.getvalue() == chunk1 + assert download._bytes_downloaded == len(chunk1) + + response.__enter__.assert_called_once_with() + response.__exit__.assert_called_once_with(None, None, None) + response.raw.read.assert_called_once_with(decode_content=True) + def _consume_helper( self, stream=None, @@ -692,6 +711,24 @@ def test__write_to_stream_incomplete_read(self, checksum): in error.args[0] ) + def test__write_to_stream_single_shot_download(self): + stream = io.BytesIO() + download = download_mod.RawDownload( + EXAMPLE_URL, stream=stream, single_shot_download=True + ) + + chunk1 = b"all at once, raw!" + response = _mock_raw_response(chunks=[chunk1], headers={}) + ret_val = download._write_to_stream(response) + + assert ret_val is None + assert stream.getvalue() == chunk1 + assert download._bytes_downloaded == len(chunk1) + + response.__enter__.assert_called_once_with() + response.__exit__.assert_called_once_with(None, None, None) + response.raw.read.assert_called_once_with() + def _consume_helper( self, stream=None, @@ -1333,6 +1370,7 @@ def _mock_response(status_code=http.client.OK, chunks=None, headers=None): response.__enter__.return_value = response response.__exit__.return_value = None response.iter_content.return_value = iter(chunks) + response.raw.read = mock.Mock(side_effect=lambda *args, **kwargs: b"".join(chunks)) return response else: return mock.Mock( @@ -1348,6 +1386,7 @@ def _mock_raw_response(status_code=http.client.OK, chunks=(), headers=None): mock_raw = mock.Mock(headers=headers, spec=["stream"]) mock_raw.stream.return_value = iter(chunks) + mock_raw.read = mock.Mock(return_value=b"".join(chunks)) response = mock.MagicMock( headers=headers, status_code=int(status_code), diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 00f218534..8b50322ba 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -1149,3 +1149,22 @@ def test_object_retention_lock(storage_client, buckets_to_delete, blobs_to_delet blob.retention.retain_until_time = None blob.patch(override_unlocked_retention=True) assert blob.retention.mode is None + + +def test_blob_download_as_bytes_single_shot_download( + shared_bucket, blobs_to_delete, file_data, service_account +): + blob_name = f"download-single-shot-{uuid.uuid4().hex}" + info = file_data["simple"] + with open(info["path"], "rb") as f: + payload = f.read() + + blob = shared_bucket.blob(blob_name) + blob.upload_from_string(payload) + blobs_to_delete.append(blob) + + result_regular_download = blob.download_as_bytes(single_shot_download=False) + assert result_regular_download == payload + + result_single_shot_download = blob.download_as_bytes(single_shot_download=True) + assert result_single_shot_download == payload diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 06ba62220..937bebaf5 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -1282,6 +1282,7 @@ def _do_download_helper_wo_chunks( end=3, checksum="auto", retry=retry, + single_shot_download=False, ) else: patched.assert_called_once_with( @@ -1292,6 +1293,7 @@ def _do_download_helper_wo_chunks( end=None, checksum="auto", retry=retry, + single_shot_download=False, ) patched.return_value.consume.assert_called_once_with( @@ -1499,6 +1501,7 @@ def test_download_to_file_with_failure(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_to_file_wo_media_link(self): @@ -1530,6 +1533,7 @@ def test_download_to_file_wo_media_link(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_to_file_w_etag_match(self): @@ -1557,6 +1561,7 @@ def test_download_to_file_w_etag_match(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_to_file_w_generation_match(self): @@ -1584,10 +1589,16 @@ def test_download_to_file_w_generation_match(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) def _download_to_file_helper( - self, use_chunks, raw_download, timeout=None, **extra_kwargs + self, + use_chunks, + raw_download, + timeout=None, + single_shot_download=False, + **extra_kwargs, ): blob_name = "blob-name" client = self._make_client() @@ -1612,9 +1623,16 @@ def _download_to_file_helper( with mock.patch.object(blob, "_prep_and_do_download"): if raw_download: - blob.download_to_file(file_obj, raw_download=True, **extra_kwargs) + blob.download_to_file( + file_obj, + raw_download=True, + single_shot_download=single_shot_download, + **extra_kwargs, + ) else: - blob.download_to_file(file_obj, **extra_kwargs) + blob.download_to_file( + file_obj, single_shot_download=single_shot_download, **extra_kwargs + ) expected_retry = extra_kwargs.get("retry", DEFAULT_RETRY) blob._prep_and_do_download.assert_called_once_with( @@ -1632,6 +1650,7 @@ def _download_to_file_helper( timeout=expected_timeout, checksum="auto", retry=expected_retry, + single_shot_download=single_shot_download, ) def test_download_to_file_wo_chunks_wo_raw(self): @@ -1643,6 +1662,26 @@ def test_download_to_file_wo_chunks_no_retry(self): def test_download_to_file_w_chunks_wo_raw(self): self._download_to_file_helper(use_chunks=True, raw_download=False) + def test_download_to_file_wo_single_shot_download_wo_raw(self): + self._download_to_file_helper( + use_chunks=False, raw_download=False, single_shot_download=False + ) + + def test_download_to_file_w_single_shot_download_wo_raw(self): + self._download_to_file_helper( + use_chunks=False, raw_download=False, single_shot_download=True + ) + + def test_download_to_file_wo_single_shot_download_w_raw(self): + self._download_to_file_helper( + use_chunks=False, raw_download=True, single_shot_download=False + ) + + def test_download_to_file_w_single_shot_download_w_raw(self): + self._download_to_file_helper( + use_chunks=False, raw_download=True, single_shot_download=True + ) + def test_download_to_file_wo_chunks_w_raw(self): self._download_to_file_helper(use_chunks=False, raw_download=True) @@ -1711,6 +1750,7 @@ def _download_to_filename_helper( timeout=expected_timeout, checksum="auto", retry=expected_retry, + single_shot_download=False, ) stream = blob._prep_and_do_download.mock_calls[0].args[0] self.assertEqual(stream.name, temp.name) @@ -1767,6 +1807,7 @@ def test_download_to_filename_w_etag_match(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) stream = blob._prep_and_do_download.mock_calls[0].args[0] self.assertEqual(stream.name, temp.name) @@ -1800,6 +1841,7 @@ def test_download_to_filename_w_generation_match(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) stream = blob._prep_and_do_download.mock_calls[0].args[0] self.assertEqual(stream.name, temp.name) @@ -1842,6 +1884,7 @@ def test_download_to_filename_corrupted(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) stream = blob._prep_and_do_download.mock_calls[0].args[0] self.assertEqual(stream.name, filename) @@ -1884,11 +1927,14 @@ def test_download_to_filename_notfound(self): timeout=expected_timeout, checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) stream = blob._prep_and_do_download.mock_calls[0].args[0] self.assertEqual(stream.name, filename) - def _download_as_bytes_helper(self, raw_download, timeout=None, **extra_kwargs): + def _download_as_bytes_helper( + self, raw_download, timeout=None, single_shot_download=False, **extra_kwargs + ): blob_name = "blob-name" client = self._make_client() bucket = _Bucket(client) @@ -1898,12 +1944,17 @@ def _download_as_bytes_helper(self, raw_download, timeout=None, **extra_kwargs): if timeout is None: expected_timeout = self._get_default_timeout() fetched = blob.download_as_bytes( - raw_download=raw_download, **extra_kwargs + raw_download=raw_download, + single_shot_download=single_shot_download, + **extra_kwargs, ) else: expected_timeout = timeout fetched = blob.download_as_bytes( - raw_download=raw_download, timeout=timeout, **extra_kwargs + raw_download=raw_download, + timeout=timeout, + single_shot_download=single_shot_download, + **extra_kwargs, ) self.assertEqual(fetched, b"") @@ -1924,6 +1975,7 @@ def _download_as_bytes_helper(self, raw_download, timeout=None, **extra_kwargs): timeout=expected_timeout, checksum="auto", retry=expected_retry, + single_shot_download=single_shot_download, ) stream = blob._prep_and_do_download.mock_calls[0].args[0] self.assertIsInstance(stream, io.BytesIO) @@ -1959,6 +2011,7 @@ def test_download_as_bytes_w_etag_match(self): timeout=self._get_default_timeout(), checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_as_bytes_w_generation_match(self): @@ -1989,6 +2042,7 @@ def test_download_as_bytes_w_generation_match(self): timeout=self._get_default_timeout(), checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_as_bytes_wo_raw(self): @@ -2003,6 +2057,16 @@ def test_download_as_bytes_w_raw(self): def test_download_as_byte_w_custom_timeout(self): self._download_as_bytes_helper(raw_download=False, timeout=9.58) + def test_download_as_bytes_wo_single_shot_download(self): + self._download_as_bytes_helper( + raw_download=False, retry=None, single_shot_download=False + ) + + def test_download_as_bytes_w_single_shot_download(self): + self._download_as_bytes_helper( + raw_download=False, retry=None, single_shot_download=True + ) + def _download_as_text_helper( self, raw_download, @@ -2100,6 +2164,7 @@ def _download_as_text_helper( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=expected_retry, + single_shot_download=False, ) def test_download_as_text_wo_raw(self): @@ -2226,6 +2291,7 @@ def test_download_as_string(self, mock_warn): timeout=self._get_default_timeout(), checksum="auto", retry=DEFAULT_RETRY, + single_shot_download=False, ) mock_warn.assert_any_call( @@ -2264,6 +2330,7 @@ def test_download_as_string_no_retry(self, mock_warn): timeout=self._get_default_timeout(), checksum="auto", retry=None, + single_shot_download=False, ) mock_warn.assert_any_call( diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index b671cc092..db8094a95 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1866,6 +1866,7 @@ def test_download_blob_to_file_with_failure(self): checksum="auto", timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_blob_to_file_with_uri(self): @@ -1905,6 +1906,7 @@ def test_download_blob_to_file_with_uri(self): checksum="auto", timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, + single_shot_download=False, ) def test_download_blob_to_file_with_invalid_uri(self): @@ -2032,6 +2034,7 @@ def _download_blob_to_file_helper( checksum="auto", timeout=_DEFAULT_TIMEOUT, retry=expected_retry, + single_shot_download=False, ) def test_download_blob_to_file_wo_chunks_wo_raw(self): From f02739f5f4f21083382f75169de719c6d5926a4e Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Thu, 3 Jul 2025 06:36:00 -0400 Subject: [PATCH 348/509] tests: update default runtime used for tests (#1498) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * tests: update default runtime used for tests * update system presubmits * update conformance presubmit * install setuptools for lint_setup_py * lint * use venv instead of virtualenv for nox backend * Revert "use venv instead of virtualenv for nox backend" This reverts commit 7fc0fe8ace1f85b33b316b70fa1bb3955365f1a6. * remove unit 3.7/3.8 in default nox session * update comment * ignore lint false positive * Use python 3.10 for blacken nox session, which is the latest version available in the python post processor * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .github/sync-repo-settings.yaml | 2 +- .gitignore | 3 --- .../{system-3.8.cfg => system-3.12.cfg} | 2 +- google/cloud/storage/notification.py | 2 +- noxfile.py | 20 +++++++++++++------ owlbot.py | 4 +++- .../system/requests/test_download.py | 4 +++- .../unit/requests/test_download.py | 4 +++- tests/unit/test_blob.py | 2 +- tests/unit/test_bucket.py | 2 +- 10 files changed, 28 insertions(+), 17 deletions(-) rename .kokoro/presubmit/{system-3.8.cfg => system-3.12.cfg} (91%) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index cc1eb10e1..0d304cfe2 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -9,7 +9,7 @@ branchProtectionRules: requiredStatusCheckContexts: - 'Kokoro' - 'cla/google' - - 'Kokoro system-3.8' + - 'Kokoro system-3.12' - 'OwlBot Post Processor' - pattern: python2 requiresCodeOwnerReviews: true diff --git a/.gitignore b/.gitignore index 6f2ab1aff..d083ea1dd 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,3 @@ system_tests/local_test_setup # Make sure a generated file isn't accidentally committed. pylintrc pylintrc.test - -# Docker files -get-docker.sh diff --git a/.kokoro/presubmit/system-3.8.cfg b/.kokoro/presubmit/system-3.12.cfg similarity index 91% rename from .kokoro/presubmit/system-3.8.cfg rename to .kokoro/presubmit/system-3.12.cfg index 6d3603eed..d4cca031b 100644 --- a/.kokoro/presubmit/system-3.8.cfg +++ b/.kokoro/presubmit/system-3.12.cfg @@ -3,7 +3,7 @@ # Only run this nox session. env_vars: { key: "NOX_SESSION" - value: "system-3.8" + value: "system-3.12" } # Credentials needed to test universe domain. diff --git a/google/cloud/storage/notification.py b/google/cloud/storage/notification.py index d13b80fc4..2dddbcee4 100644 --- a/google/cloud/storage/notification.py +++ b/google/cloud/storage/notification.py @@ -257,7 +257,7 @@ def create(self, client=None, timeout=_DEFAULT_TIMEOUT, retry=None): with create_trace_span(name="Storage.BucketNotification.create"): if self.notification_id is not None: raise ValueError( - f"notification_id already set to {self.notification_id}; must be None to create a Notification." + f"notification_id already set to {self.notification_id}; must be None to create a Notification." # noqa: E702 ) client = self._require_client(client) diff --git a/noxfile.py b/noxfile.py index 2a7614331..b62092e97 100644 --- a/noxfile.py +++ b/noxfile.py @@ -26,10 +26,10 @@ BLACK_VERSION = "black==23.7.0" BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] -DEFAULT_PYTHON_VERSION = "3.8" -SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"] +DEFAULT_PYTHON_VERSION = "3.12" +SYSTEM_TEST_PYTHON_VERSIONS = ["3.12"] UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] -CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.8"] +CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.12"] CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -44,7 +44,13 @@ "lint", "lint_setup_py", "system", - "unit", + # TODO(https://github.com/googleapis/python-storage/issues/1499): + # Remove or restore testing for Python 3.7/3.8 + "unit-3.9", + "unit-3.10", + "unit-3.11", + "unit-3.12", + "unit-3.13", # cover must be last to avoid error `No data to report` "cover", ] @@ -68,7 +74,9 @@ def lint(session): session.run("flake8", "google", "tests") -@nox.session(python=DEFAULT_PYTHON_VERSION) +# Use a python runtime which is available in the owlbot post processor here +# https://github.com/googleapis/synthtool/blob/master/docker/owlbot/python/Dockerfile +@nox.session(python=["3.10", DEFAULT_PYTHON_VERSION]) def blacken(session): """Run black. @@ -84,7 +92,7 @@ def blacken(session): @nox.session(python=DEFAULT_PYTHON_VERSION) def lint_setup_py(session): """Verify that setup.py is valid (including RST check).""" - session.install("docutils", "pygments") + session.install("docutils", "pygments", "setuptools>=79.0.1") session.run("python", "setup.py", "check", "--restructuredtext", "--strict") diff --git a/owlbot.py b/owlbot.py index ba3f32df3..5292db5fd 100644 --- a/owlbot.py +++ b/owlbot.py @@ -104,4 +104,6 @@ python.py_samples(skip_readmes=True) -s.shell.run(["nox", "-s", "blacken"], hide_output=False) +# Use a python runtime which is available in the owlbot post processor here +# https://github.com/googleapis/synthtool/blob/master/docker/owlbot/python/Dockerfile +s.shell.run(["nox", "-s", "blacken-3.10"], hide_output=False) diff --git a/tests/resumable_media/system/requests/test_download.py b/tests/resumable_media/system/requests/test_download.py index 84c44c94c..5417dd7bc 100644 --- a/tests/resumable_media/system/requests/test_download.py +++ b/tests/resumable_media/system/requests/test_download.py @@ -324,7 +324,9 @@ def test_download_to_stream(self, add_files, authorized_transport): check_tombstoned(download, authorized_transport) @pytest.mark.parametrize("checksum", ["auto", "md5", "crc32c", None]) - def test_single_shot_download_to_stream(self, add_files, authorized_transport, checksum): + def test_single_shot_download_to_stream( + self, add_files, authorized_transport, checksum + ): for info in ALL_FILES: actual_contents = self._get_contents(info) blob_name = get_blob_name(info) diff --git a/tests/resumable_media/unit/requests/test_download.py b/tests/resumable_media/unit/requests/test_download.py index b17fbb905..25dba6e05 100644 --- a/tests/resumable_media/unit/requests/test_download.py +++ b/tests/resumable_media/unit/requests/test_download.py @@ -1370,7 +1370,9 @@ def _mock_response(status_code=http.client.OK, chunks=None, headers=None): response.__enter__.return_value = response response.__exit__.return_value = None response.iter_content.return_value = iter(chunks) - response.raw.read = mock.Mock(side_effect=lambda *args, **kwargs: b"".join(chunks)) + response.raw.read = mock.Mock( + side_effect=lambda *args, **kwargs: b"".join(chunks) + ) return response else: return mock.Mock( diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 937bebaf5..b3e7ec649 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -2099,7 +2099,7 @@ def _download_as_text_helper( properties = {} if charset is not None: - properties["contentType"] = f"text/plain; charset={charset}" + properties["contentType"] = f"text/plain; charset={charset}" # noqa: E702 elif no_charset: properties = {"contentType": "text/plain"} diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index ac9a5ede6..e494cc18a 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -4094,7 +4094,7 @@ def _generate_upload_policy_helper(self, **kwargs): break else: # pragma: NO COVER self.fail( - f"Condition {expected_condition} not found in {policy_conditions}" + f"Condition {expected_condition} not found in {policy_conditions}" # noqa: E713 ) return policy_fields, policy From c7357305495443348c0a432db649b27e6a5d8c5b Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Fri, 4 Jul 2025 13:55:46 +0530 Subject: [PATCH 349/509] chore: update the source path in owlbot.yaml (#1497) * chore: update the source path in owlbot.yaml * add comments * Trigger CI --- .github/.OwlBot.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/.OwlBot.yaml b/.github/.OwlBot.yaml index 837bf4fd6..67768efb5 100644 --- a/.github/.OwlBot.yaml +++ b/.github/.OwlBot.yaml @@ -18,9 +18,12 @@ docker: deep-remove-regex: - /owl-bot-staging +# In source, we've used two capturing groups (v2) and (.*) to match the version +# and the directory path. +# In dest, we use $1 to refer to the first capturing group (v2) and $2 to refer +# to the second capturing group (directory path). deep-copy-regex: - - source: /google/storage/v2/storage-v2-py/(.*) + - source: /google/storage/(v2)/storage-v2-py/(.*) dest: /owl-bot-staging/$1/$2 begin-after-commit-hash: 6acf4a0a797f1082027985c55c4b14b60f673dd7 - From 652cee3e351203796461d45e1c5bb6df34d170d1 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Fri, 4 Jul 2025 11:06:23 -0400 Subject: [PATCH 350/509] test: update constraints for python 3.9 testing (#1500) --- testing/constraints-3.9.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index e69de29bb..2a588ced6 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -0,0 +1,14 @@ +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List all library dependencies and extras in this file. +# Pin the version to the lower bound. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", +# Then this file should have google-cloud-foo==1.14.0 +google-auth==2.26.1 +google-api-core==2.15.0 +google-cloud-core==2.4.2 +google-resumable-media==2.7.2 +requests==2.22.0 +google-crc32c==1.1.3 +protobuf==3.20.2 +opentelemetry-api==1.1.0 From 93d58d0f7e7467d99a206725f5701da29f6f3595 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Fri, 4 Jul 2025 11:25:21 -0400 Subject: [PATCH 351/509] build: exclude certain autogenerated files (#1501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build: exclude certain autogenerated files * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update exclude * typo --------- Co-authored-by: Owl Bot --- owlbot.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/owlbot.py b/owlbot.py index 5292db5fd..055b4db9c 100644 --- a/owlbot.py +++ b/owlbot.py @@ -37,6 +37,11 @@ "setup.py", "noxfile.py", "README.rst", + # Exclude autogenerated default import `google.cloud.storage` + "google/cloud/storage/*", + # Exclude autogenerated constraints files for Python 3.7/3.9 + "testing/constraints-3.7.txt", + "testing/constraints-3.9.txt", ], ) s.remove_staging_dirs() From 7d97a384406258e0bfce3fbb715b84e5220d6783 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 10:34:07 +0530 Subject: [PATCH 352/509] chore(main): release 3.2.0 (#1496) --- CHANGELOG.md | 7 +++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e66795a8..52b077ea5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.2.0](https://github.com/googleapis/python-storage/compare/v3.1.1...v3.2.0) (2025-07-04) + + +### Features + +* Adding support of single shot download ([#1493](https://github.com/googleapis/python-storage/issues/1493)) ([61c5d5f](https://github.com/googleapis/python-storage/commit/61c5d5f62c88506f200bc6d86b399a2c28715bc4)) + ## [3.1.1](https://github.com/googleapis/python-storage/compare/v3.1.0...v3.1.1) (2025-06-13) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index fa35f1da3..c24ca23d6 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.1.1" +__version__ = "3.2.0" From 48c0dc0484d1661cc432f32e3ba3476ea4129f2d Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 9 Jul 2025 12:57:36 +0530 Subject: [PATCH 353/509] chore: fix the errors while generating gapic (#1503) * chore: fix the errors while generating gapic * add missing comma --- noxfile.py | 2 +- owlbot.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index b62092e97..f47f2a055 100644 --- a/noxfile.py +++ b/noxfile.py @@ -101,7 +101,7 @@ def default(session, install_extras=True): CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) # Install all test dependencies, then install this package in-place. - session.install("mock", "pytest", "pytest-cov", "brotli", "-c", constraints_path) + session.install("mock", "pytest", "pytest-cov", "brotli", "grpcio", "grpcio-status", "-c", constraints_path) if install_extras: session.install("opentelemetry-api", "opentelemetry-sdk") diff --git a/owlbot.py b/owlbot.py index 055b4db9c..77acf42e6 100644 --- a/owlbot.py +++ b/owlbot.py @@ -42,6 +42,7 @@ # Exclude autogenerated constraints files for Python 3.7/3.9 "testing/constraints-3.7.txt", "testing/constraints-3.9.txt", + "tests/unit/__init__.py", ], ) s.remove_staging_dirs() From 314071c8ade16c6d18868a18c608fea3fd15a2ae Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:31:17 +0530 Subject: [PATCH 354/509] chore: fix the module imports error for gapic (#1504) --- noxfile.py | 2 +- owlbot.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index f47f2a055..c38d9caae 100644 --- a/noxfile.py +++ b/noxfile.py @@ -101,7 +101,7 @@ def default(session, install_extras=True): CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) # Install all test dependencies, then install this package in-place. - session.install("mock", "pytest", "pytest-cov", "brotli", "grpcio", "grpcio-status", "-c", constraints_path) + session.install("mock", "pytest", "pytest-cov", "brotli", "grpcio", "grpcio-status", "proto-plus", "-c", constraints_path) if install_extras: session.install("opentelemetry-api", "opentelemetry-sdk") diff --git a/owlbot.py b/owlbot.py index 77acf42e6..ae9ee2de0 100644 --- a/owlbot.py +++ b/owlbot.py @@ -28,6 +28,12 @@ default_version = json.load(open(".repo-metadata.json", "rt")).get("default_version") for library in s.get_staging_dirs(default_version): + s.replace( + "google/cloud/storage_v2/__init__.py", + "from google.cloud.storage_v2 import gapic_version as package_version", + "from . import gapic_version as package_version" + ) + s.move( [library], excludes=[ From 72252e940909ce2e3da9cfd80f5b7b43a026f45c Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:58:56 +0530 Subject: [PATCH 355/509] docs: update the documentation of move_blob function (#1507) --- google/cloud/storage/bucket.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index fc5733bd0..c8df6c600 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -2255,10 +2255,7 @@ def move_blob( timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY_IF_GENERATION_SPECIFIED, ): - """Move a blob to a new name within a single HNS bucket. - - *This feature is currently only supported for HNS (Heirarchical - Namespace) buckets.* + """Move a blob to a new name atomically. If :attr:`user_project` is set on the bucket, bills the API request to that project. From 500c0d07d3a239c3b52c9aa6ce434f5bb3202823 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:40:24 +0530 Subject: [PATCH 356/509] chore: fix the errors for GAPIC (#1509) * chore: fix the errors for GAPIC * minor changes in owlbot.py --- .coveragerc | 4 +++- noxfile.py | 4 ++-- owlbot.py | 8 ++++---- testing/constraints-3.9.txt | 1 + 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.coveragerc b/.coveragerc index e019a358a..8eebf6dc3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -21,9 +21,11 @@ omit = .nox/* google/__init__.py google/cloud/__init__.py + google/cloud/storage_v2/__init__.py + google/cloud/storage_v2/gapic_version.py [report] -fail_under = 100 +fail_under = 99 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/noxfile.py b/noxfile.py index c38d9caae..693fcb1b4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -101,7 +101,7 @@ def default(session, install_extras=True): CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) # Install all test dependencies, then install this package in-place. - session.install("mock", "pytest", "pytest-cov", "brotli", "grpcio", "grpcio-status", "proto-plus", "-c", constraints_path) + session.install("mock", "pytest", "pytest-cov", "pytest-asyncio", "brotli", "grpcio", "grpcio-status", "proto-plus", "grpc-google-iam-v1", "-c", constraints_path) if install_extras: session.install("opentelemetry-api", "opentelemetry-sdk") @@ -233,7 +233,7 @@ def cover(session): test runs (not system test runs), and then erases coverage data. """ session.install("coverage", "pytest-cov") - session.run("coverage", "report", "--show-missing", "--fail-under=100") + session.run("coverage", "report", "--show-missing", "--fail-under=99") session.run("coverage", "erase") diff --git a/owlbot.py b/owlbot.py index ae9ee2de0..2cc8e4259 100644 --- a/owlbot.py +++ b/owlbot.py @@ -29,15 +29,14 @@ for library in s.get_staging_dirs(default_version): s.replace( - "google/cloud/storage_v2/__init__.py", + library / "google/cloud/storage_v2/__init__.py", + "from google.cloud.storage import gapic_version as package_version", "from google.cloud.storage_v2 import gapic_version as package_version", - "from . import gapic_version as package_version" ) s.move( [library], excludes=[ - "**/gapic_version.py", "docs/**/*", "scripts/fixup*.py", "setup.py", @@ -59,7 +58,7 @@ # Add templated files # ---------------------------------------------------------------------------- templated_files = common.py_library( - cov_level=100, + cov_level=99, split_system_tests=True, intersphinx_dependencies={ # python-requests url temporary change related to @@ -71,6 +70,7 @@ s.move( templated_files, excludes=[ + ".coveragerc", "docs/multiprocessing.rst", "noxfile.py", "CONTRIBUTING.rst", diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index 2a588ced6..251ae699b 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -12,3 +12,4 @@ requests==2.22.0 google-crc32c==1.1.3 protobuf==3.20.2 opentelemetry-api==1.1.0 +grpc-google-iam-v1==0.12.6 From edde9506af9c313036573e4e51d7b94d03c3118f Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:55:55 +0530 Subject: [PATCH 357/509] samples: add samples for move api to rename an object (#1505) * docs: add samples for move api to rename an object * minor change * fix lint errors * minor fix * resolving comments --- samples/snippets/snippets_test.py | 18 +++++++ .../snippets/storage_move_file_atomically.py | 54 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 samples/snippets/storage_move_file_atomically.py diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 3fe377b6b..91018f3dd 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -73,6 +73,7 @@ import storage_list_soft_deleted_objects import storage_make_public import storage_move_file +import storage_move_file_atomically import storage_object_get_kms_key import storage_remove_bucket_label import storage_remove_cors_configuration @@ -1037,3 +1038,20 @@ def test_storage_restore_soft_deleted_object(test_soft_delete_enabled_bucket, ca # Verify the restoration blob = test_soft_delete_enabled_bucket.get_blob(blob_name) assert blob is not None + + +def test_move_object(test_blob): + bucket = test_blob.bucket + try: + bucket.delete_blob("test_move_blob_atomic") + except google.cloud.exceptions.NotFound: + print(f"test_move_blob_atomic not found in bucket {bucket.name}") + + storage_move_file_atomically.move_object( + bucket.name, + test_blob.name, + "test_move_blob_atomic", + ) + + assert bucket.get_blob("test_move_blob_atomic") is not None + assert bucket.get_blob(test_blob.name) is None diff --git a/samples/snippets/storage_move_file_atomically.py b/samples/snippets/storage_move_file_atomically.py new file mode 100644 index 000000000..d659cf366 --- /dev/null +++ b/samples/snippets/storage_move_file_atomically.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_move_object] +from google.cloud import storage + + +def move_object(bucket_name: str, blob_name: str, new_blob_name: str) -> None: + """Moves a blob to a new name within the same bucket using the move API.""" + # The name of your GCS bucket + # bucket_name = "your-bucket-name" + + # The name of your GCS object to move + # blob_name = "your-file-name" + + # The new name of the GCS object + # new_blob_name = "new-file-name" + + storage_client = storage.Client() + + bucket = storage_client.bucket(bucket_name) + blob_to_move = bucket.blob(blob_name) + + # Use move_blob to perform an efficient, server-side move. + moved_blob = bucket.move_blob( + blob=blob_to_move, new_name=new_blob_name + ) + + print(f"Blob {blob_to_move.name} has been moved to {moved_blob.name}.") + + +# [END storage_move_object] + +if __name__ == "__main__": + move_object( + bucket_name=sys.argv[1], + blob_name=sys.argv[2], + new_blob_name=sys.argv[3], + ) From 0eb45b5a808ad149c1c85d1ab9ea693d7365d5c1 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 12:56:24 +0530 Subject: [PATCH 358/509] feat: Add new field `contexts` for Object Contexts in message `Object` (#1502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add new field `contexts` for Object Contexts in message `Object` feat: Add new field `filter` for Object Contexts in message `ListObjectsRequest` PiperOrigin-RevId: 781971065 Source-Link: https://github.com/googleapis/googleapis/commit/f2a87ff9836e96a7d37501128134ff34eb486d2d Source-Link: https://github.com/googleapis/googleapis-gen/commit/9cab897f4a01d3a2e970d289f4c3988d44af8c64 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiOWNhYjg5N2Y0YTAxZDNhMmU5NzBkMjg5ZjRjMzk4OGQ0NGFmOGM2NCJ9 chore: update the GAPIC generator version for C# PiperOrigin-RevId: 778777226 docs: Various documentation and comment improvements, Enable organization-level support for VPC Flow Logs feat: Enable organization-level support for VPC Flow Logs feat: add field `service_uri` to message `Endpoint.CloudRunRevisionEndpoint` feat: add message `Endpoint.SingleEdgeResponse` feat: add http additional_bindings feat: add enum `Status` to message `InstanceInfo` feat: add field `running` to message `InstanceInfo` feat: add field `policy_priority` to message `NetworkInfo` feat: add enum value `RouteInfo.NextHopType.SECURE_WEB_PROXY_GATEWAY` feat: add enum `DeliverInfo.GoogleServiceType` feat: add field `google_service_type` to message `DeliverInfo` feat: add enum value `AbortInfo.Cause.GOOGLE_MANAGED_SERVICE_AMBIGUOUS_ENDPOINT` feat: add enum values `NO_ROUTE_FROM_EXTERNAL_IPV6_SOURCE_TO_PRIVATE_IPV6_ADDRESS`, `TRAFFIC_FROM_HYBRID_ENDPOINT_TO_INTERNET_DISALLOWED`, `NO_MATCHING_NAT64_GATEWAY`, `LOAD_BALANCER_BACKEND_IP_VERSION_MISMATCH`, and `NO_KNOWN_ROUTE_FROM_NCC_NETWORK_TO_DESTINATION` to `DropInfo.Cause` feat: add rpc `VpcFlowLogsService.QueryOrgVpcFlowLogsConfigs` feat: add service `OrganizationVpcFlowLogsService` feat: add enum `VpcFlowLogsConfig.CrossProjectMetadata` feat: add enum `VpcFlowLogsConfig.TargetResourceState` feat: add fields `cross_project_metadata`, `target_resource_state`, `network`, and `subnet` to message `VpcFlowLogsConfig` PiperOrigin-RevId: 778807926 feat: A new field `semantic_search` is added to `message.google.cloud.dataplex.v1.SearchEntriesRequest` PiperOrigin-RevId: 778817135 fix: pagination response for Compute Subnetworks.ListUsable (39952d9) PiperOrigin-RevId: 778931614 fix!: Correct resource reference type for `parent` field in `data_chat_service.proto` PiperOrigin-RevId: 780026729 feat: update libraries and clients for Managed Kafka PiperOrigin-RevId: 780098649 chore: regenerate gapic yaml and service yaml for cloudtrace v2 by augmentation configs PiperOrigin-RevId: 780150418 chore: regenerate gapic yaml and service yaml for iam by augmentation configs PiperOrigin-RevId: 780151180 chore: regenerate gapic yaml and service yaml for cloudtrace v1 by augmentation configs PiperOrigin-RevId: 780152154 feat: Update Compute Engine v1 API to revision 20250626 feat: Update Compute Engine v1beta API to revision 20250626 docs: Add more details for BidiReadObjectRedirectedError and BidiWriteObjectRedirectedError docs: Add more information for AppendObjectSpec fields fix!: Remove field `restricted` within encryption enforcement config. feat: Add new field `restriction_mode` for encryption enforcement config in message Bucket PiperOrigin-RevId: 780246504 feat: Add isolation support to prevent cross-region overflow by adding a new field "isolation_config" to message "ServiceLbPolicy" PiperOrigin-RevId: 780262024 feat: Add safebrowsing proto defs PiperOrigin-RevId: 780289284 feat: add RDN sequence feat: add User Defined Access URLs feat: add backdate duration feat: adds tbs_certificate_digest to CertificateDescription PiperOrigin-RevId: 780300269 chore: update the GAPIC generator version for C# PiperOrigin-RevId: 780414513 Source-Link: https://github.com/googleapis/googleapis/commit/f1decb86b974a833be57b92ac6f718499bb4bc37 Source-Link: https://github.com/googleapis/googleapis-gen/commit/96e33aab25512b39810f15971af63a34fca5cf5f Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiOTZlMzNhYWIyNTUxMmIzOTgxMGYxNTk3MWFmNjNhMzRmY2E1Y2Y1ZiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .coveragerc | 41 +- google/cloud/storage_v2/__init__.py | 140 + google/cloud/storage_v2/gapic_metadata.json | 263 + google/cloud/storage_v2/gapic_version.py | 16 + google/cloud/storage_v2/py.typed | 2 + google/cloud/storage_v2/services/__init__.py | 15 + .../storage_v2/services/storage/__init__.py | 22 + .../services/storage/async_client.py | 3443 +++++ .../storage_v2/services/storage/client.py | 3836 +++++ .../storage_v2/services/storage/pagers.py | 352 + .../services/storage/transports/README.rst | 9 + .../services/storage/transports/__init__.py | 33 + .../services/storage/transports/base.py | 506 + .../services/storage/transports/grpc.py | 1185 ++ .../storage/transports/grpc_asyncio.py | 1349 ++ google/cloud/storage_v2/types/__init__.py | 132 + google/cloud/storage_v2/types/storage.py | 4964 +++++++ mypy.ini | 3 + noxfile.py | 14 +- .../snippet_metadata_google.storage.v2.json | 3939 ++++++ ...enerated_storage_bidi_read_object_async.py | 62 + ...generated_storage_bidi_read_object_sync.py | 62 + ...nerated_storage_bidi_write_object_async.py | 64 + ...enerated_storage_bidi_write_object_sync.py | 64 + ...ed_storage_cancel_resumable_write_async.py | 52 + ...ted_storage_cancel_resumable_write_sync.py | 52 + ..._generated_storage_compose_object_async.py | 51 + ...2_generated_storage_compose_object_sync.py | 51 + ...2_generated_storage_create_bucket_async.py | 53 + ...v2_generated_storage_create_bucket_sync.py | 53 + ...2_generated_storage_delete_bucket_async.py | 50 + ...v2_generated_storage_delete_bucket_sync.py | 50 + ...2_generated_storage_delete_object_async.py | 51 + ...v2_generated_storage_delete_object_sync.py | 51 + ...e_v2_generated_storage_get_bucket_async.py | 52 + ...ge_v2_generated_storage_get_bucket_sync.py | 52 + ..._generated_storage_get_iam_policy_async.py | 53 + ...2_generated_storage_get_iam_policy_sync.py | 53 + ...e_v2_generated_storage_get_object_async.py | 53 + ...ge_v2_generated_storage_get_object_sync.py | 53 + ...v2_generated_storage_list_buckets_async.py | 53 + ..._v2_generated_storage_list_buckets_sync.py | 53 + ...v2_generated_storage_list_objects_async.py | 53 + ..._v2_generated_storage_list_objects_sync.py | 53 + ...rage_lock_bucket_retention_policy_async.py | 53 + ...orage_lock_bucket_retention_policy_sync.py | 53 + ..._v2_generated_storage_move_object_async.py | 54 + ...e_v2_generated_storage_move_object_sync.py | 54 + ...erated_storage_query_write_status_async.py | 52 + ...nerated_storage_query_write_status_sync.py | 52 + ..._v2_generated_storage_read_object_async.py | 54 + ...e_v2_generated_storage_read_object_sync.py | 54 + ..._generated_storage_restore_object_async.py | 54 + ...2_generated_storage_restore_object_sync.py | 54 + ..._generated_storage_rewrite_object_async.py | 55 + ...2_generated_storage_rewrite_object_sync.py | 55 + ..._generated_storage_set_iam_policy_async.py | 53 + ...2_generated_storage_set_iam_policy_sync.py | 53 + ...ted_storage_start_resumable_write_async.py | 51 + ...ated_storage_start_resumable_write_sync.py | 51 + ...ated_storage_test_iam_permissions_async.py | 54 + ...rated_storage_test_iam_permissions_sync.py | 54 + ...2_generated_storage_update_bucket_async.py | 51 + ...v2_generated_storage_update_bucket_sync.py | 51 + ...2_generated_storage_update_object_async.py | 51 + ...v2_generated_storage_update_object_sync.py | 51 + ...v2_generated_storage_write_object_async.py | 63 + ..._v2_generated_storage_write_object_sync.py | 63 + testing/constraints-3.10.txt | 7 + testing/constraints-3.11.txt | 7 + testing/constraints-3.12.txt | 7 + testing/constraints-3.13.txt | 12 + testing/constraints-3.8.txt | 7 + tests/__init__.py | 15 + tests/unit/gapic/__init__.py | 15 + tests/unit/gapic/storage_v2/__init__.py | 15 + tests/unit/gapic/storage_v2/test_storage.py | 11512 ++++++++++++++++ 77 files changed, 34411 insertions(+), 34 deletions(-) create mode 100644 google/cloud/storage_v2/__init__.py create mode 100644 google/cloud/storage_v2/gapic_metadata.json create mode 100644 google/cloud/storage_v2/gapic_version.py create mode 100644 google/cloud/storage_v2/py.typed create mode 100644 google/cloud/storage_v2/services/__init__.py create mode 100644 google/cloud/storage_v2/services/storage/__init__.py create mode 100644 google/cloud/storage_v2/services/storage/async_client.py create mode 100644 google/cloud/storage_v2/services/storage/client.py create mode 100644 google/cloud/storage_v2/services/storage/pagers.py create mode 100644 google/cloud/storage_v2/services/storage/transports/README.rst create mode 100644 google/cloud/storage_v2/services/storage/transports/__init__.py create mode 100644 google/cloud/storage_v2/services/storage/transports/base.py create mode 100644 google/cloud/storage_v2/services/storage/transports/grpc.py create mode 100644 google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py create mode 100644 google/cloud/storage_v2/types/__init__.py create mode 100644 google/cloud/storage_v2/types/storage.py create mode 100644 mypy.ini create mode 100644 samples/generated_samples/snippet_metadata_google.storage.v2.json create mode 100644 samples/generated_samples/storage_v2_generated_storage_bidi_read_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_bidi_read_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_bidi_write_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_bidi_write_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_compose_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_compose_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_create_bucket_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_create_bucket_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_delete_bucket_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_delete_bucket_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_delete_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_delete_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_get_bucket_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_get_bucket_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_get_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_get_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_list_buckets_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_list_buckets_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_list_objects_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_list_objects_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_move_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_move_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_query_write_status_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_query_write_status_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_read_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_read_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_restore_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_restore_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_rewrite_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_rewrite_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_start_resumable_write_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_start_resumable_write_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_update_bucket_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_update_bucket_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_update_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_update_object_sync.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_write_object_async.py create mode 100644 samples/generated_samples/storage_v2_generated_storage_write_object_sync.py create mode 100644 tests/unit/gapic/__init__.py create mode 100644 tests/unit/gapic/storage_v2/__init__.py create mode 100644 tests/unit/gapic/storage_v2/test_storage.py diff --git a/.coveragerc b/.coveragerc index 8eebf6dc3..89c9bc1b9 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,43 +1,18 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Generated by synthtool. DO NOT EDIT! [run] branch = True -omit = - .nox/* - google/__init__.py - google/cloud/__init__.py - google/cloud/storage_v2/__init__.py - google/cloud/storage_v2/gapic_version.py [report] -fail_under = 99 show_missing = True +omit = + .nox/* + .nox/* + .nox/* + .nox/* + .nox/* + google/cloud/storage/__init__.py + google/cloud/storage/gapic_version.py exclude_lines = # Re-enable the standard pragma pragma: NO COVER # Ignore debug-only repr def __repr__ - # Ignore abstract methods - raise NotImplementedError -omit = - .nox/* - */gapic/*.py - */proto/*.py - */core/*.py - */site-packages/*.py - google/cloud/__init__.py diff --git a/google/cloud/storage_v2/__init__.py b/google/cloud/storage_v2/__init__.py new file mode 100644 index 000000000..4d03ee922 --- /dev/null +++ b/google/cloud/storage_v2/__init__.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from google.cloud.storage_v2 import gapic_version as package_version + +__version__ = package_version.__version__ + + +from .services.storage import StorageClient +from .services.storage import StorageAsyncClient + +from .types.storage import AppendObjectSpec +from .types.storage import BidiReadHandle +from .types.storage import BidiReadObjectError +from .types.storage import BidiReadObjectRedirectedError +from .types.storage import BidiReadObjectRequest +from .types.storage import BidiReadObjectResponse +from .types.storage import BidiReadObjectSpec +from .types.storage import BidiWriteHandle +from .types.storage import BidiWriteObjectRedirectedError +from .types.storage import BidiWriteObjectRequest +from .types.storage import BidiWriteObjectResponse +from .types.storage import Bucket +from .types.storage import BucketAccessControl +from .types.storage import CancelResumableWriteRequest +from .types.storage import CancelResumableWriteResponse +from .types.storage import ChecksummedData +from .types.storage import CommonObjectRequestParams +from .types.storage import ComposeObjectRequest +from .types.storage import ContentRange +from .types.storage import CreateBucketRequest +from .types.storage import CustomerEncryption +from .types.storage import DeleteBucketRequest +from .types.storage import DeleteObjectRequest +from .types.storage import GetBucketRequest +from .types.storage import GetObjectRequest +from .types.storage import ListBucketsRequest +from .types.storage import ListBucketsResponse +from .types.storage import ListObjectsRequest +from .types.storage import ListObjectsResponse +from .types.storage import LockBucketRetentionPolicyRequest +from .types.storage import MoveObjectRequest +from .types.storage import Object +from .types.storage import ObjectAccessControl +from .types.storage import ObjectChecksums +from .types.storage import ObjectContexts +from .types.storage import ObjectCustomContextPayload +from .types.storage import ObjectRangeData +from .types.storage import Owner +from .types.storage import ProjectTeam +from .types.storage import QueryWriteStatusRequest +from .types.storage import QueryWriteStatusResponse +from .types.storage import ReadObjectRequest +from .types.storage import ReadObjectResponse +from .types.storage import ReadRange +from .types.storage import ReadRangeError +from .types.storage import RestoreObjectRequest +from .types.storage import RewriteObjectRequest +from .types.storage import RewriteResponse +from .types.storage import ServiceConstants +from .types.storage import StartResumableWriteRequest +from .types.storage import StartResumableWriteResponse +from .types.storage import UpdateBucketRequest +from .types.storage import UpdateObjectRequest +from .types.storage import WriteObjectRequest +from .types.storage import WriteObjectResponse +from .types.storage import WriteObjectSpec + +__all__ = ( + "StorageAsyncClient", + "AppendObjectSpec", + "BidiReadHandle", + "BidiReadObjectError", + "BidiReadObjectRedirectedError", + "BidiReadObjectRequest", + "BidiReadObjectResponse", + "BidiReadObjectSpec", + "BidiWriteHandle", + "BidiWriteObjectRedirectedError", + "BidiWriteObjectRequest", + "BidiWriteObjectResponse", + "Bucket", + "BucketAccessControl", + "CancelResumableWriteRequest", + "CancelResumableWriteResponse", + "ChecksummedData", + "CommonObjectRequestParams", + "ComposeObjectRequest", + "ContentRange", + "CreateBucketRequest", + "CustomerEncryption", + "DeleteBucketRequest", + "DeleteObjectRequest", + "GetBucketRequest", + "GetObjectRequest", + "ListBucketsRequest", + "ListBucketsResponse", + "ListObjectsRequest", + "ListObjectsResponse", + "LockBucketRetentionPolicyRequest", + "MoveObjectRequest", + "Object", + "ObjectAccessControl", + "ObjectChecksums", + "ObjectContexts", + "ObjectCustomContextPayload", + "ObjectRangeData", + "Owner", + "ProjectTeam", + "QueryWriteStatusRequest", + "QueryWriteStatusResponse", + "ReadObjectRequest", + "ReadObjectResponse", + "ReadRange", + "ReadRangeError", + "RestoreObjectRequest", + "RewriteObjectRequest", + "RewriteResponse", + "ServiceConstants", + "StartResumableWriteRequest", + "StartResumableWriteResponse", + "StorageClient", + "UpdateBucketRequest", + "UpdateObjectRequest", + "WriteObjectRequest", + "WriteObjectResponse", + "WriteObjectSpec", +) diff --git a/google/cloud/storage_v2/gapic_metadata.json b/google/cloud/storage_v2/gapic_metadata.json new file mode 100644 index 000000000..1a7c6cf69 --- /dev/null +++ b/google/cloud/storage_v2/gapic_metadata.json @@ -0,0 +1,263 @@ + { + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "python", + "libraryPackage": "google.cloud.storage_v2", + "protoPackage": "google.storage.v2", + "schema": "1.0", + "services": { + "Storage": { + "clients": { + "grpc": { + "libraryClient": "StorageClient", + "rpcs": { + "BidiReadObject": { + "methods": [ + "bidi_read_object" + ] + }, + "BidiWriteObject": { + "methods": [ + "bidi_write_object" + ] + }, + "CancelResumableWrite": { + "methods": [ + "cancel_resumable_write" + ] + }, + "ComposeObject": { + "methods": [ + "compose_object" + ] + }, + "CreateBucket": { + "methods": [ + "create_bucket" + ] + }, + "DeleteBucket": { + "methods": [ + "delete_bucket" + ] + }, + "DeleteObject": { + "methods": [ + "delete_object" + ] + }, + "GetBucket": { + "methods": [ + "get_bucket" + ] + }, + "GetIamPolicy": { + "methods": [ + "get_iam_policy" + ] + }, + "GetObject": { + "methods": [ + "get_object" + ] + }, + "ListBuckets": { + "methods": [ + "list_buckets" + ] + }, + "ListObjects": { + "methods": [ + "list_objects" + ] + }, + "LockBucketRetentionPolicy": { + "methods": [ + "lock_bucket_retention_policy" + ] + }, + "MoveObject": { + "methods": [ + "move_object" + ] + }, + "QueryWriteStatus": { + "methods": [ + "query_write_status" + ] + }, + "ReadObject": { + "methods": [ + "read_object" + ] + }, + "RestoreObject": { + "methods": [ + "restore_object" + ] + }, + "RewriteObject": { + "methods": [ + "rewrite_object" + ] + }, + "SetIamPolicy": { + "methods": [ + "set_iam_policy" + ] + }, + "StartResumableWrite": { + "methods": [ + "start_resumable_write" + ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] + }, + "UpdateBucket": { + "methods": [ + "update_bucket" + ] + }, + "UpdateObject": { + "methods": [ + "update_object" + ] + }, + "WriteObject": { + "methods": [ + "write_object" + ] + } + } + }, + "grpc-async": { + "libraryClient": "StorageAsyncClient", + "rpcs": { + "BidiReadObject": { + "methods": [ + "bidi_read_object" + ] + }, + "BidiWriteObject": { + "methods": [ + "bidi_write_object" + ] + }, + "CancelResumableWrite": { + "methods": [ + "cancel_resumable_write" + ] + }, + "ComposeObject": { + "methods": [ + "compose_object" + ] + }, + "CreateBucket": { + "methods": [ + "create_bucket" + ] + }, + "DeleteBucket": { + "methods": [ + "delete_bucket" + ] + }, + "DeleteObject": { + "methods": [ + "delete_object" + ] + }, + "GetBucket": { + "methods": [ + "get_bucket" + ] + }, + "GetIamPolicy": { + "methods": [ + "get_iam_policy" + ] + }, + "GetObject": { + "methods": [ + "get_object" + ] + }, + "ListBuckets": { + "methods": [ + "list_buckets" + ] + }, + "ListObjects": { + "methods": [ + "list_objects" + ] + }, + "LockBucketRetentionPolicy": { + "methods": [ + "lock_bucket_retention_policy" + ] + }, + "MoveObject": { + "methods": [ + "move_object" + ] + }, + "QueryWriteStatus": { + "methods": [ + "query_write_status" + ] + }, + "ReadObject": { + "methods": [ + "read_object" + ] + }, + "RestoreObject": { + "methods": [ + "restore_object" + ] + }, + "RewriteObject": { + "methods": [ + "rewrite_object" + ] + }, + "SetIamPolicy": { + "methods": [ + "set_iam_policy" + ] + }, + "StartResumableWrite": { + "methods": [ + "start_resumable_write" + ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] + }, + "UpdateBucket": { + "methods": [ + "update_bucket" + ] + }, + "UpdateObject": { + "methods": [ + "update_object" + ] + }, + "WriteObject": { + "methods": [ + "write_object" + ] + } + } + } + } + } + } +} diff --git a/google/cloud/storage_v2/gapic_version.py b/google/cloud/storage_v2/gapic_version.py new file mode 100644 index 000000000..20a9cd975 --- /dev/null +++ b/google/cloud/storage_v2/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +__version__ = "0.0.0" # {x-release-please-version} diff --git a/google/cloud/storage_v2/py.typed b/google/cloud/storage_v2/py.typed new file mode 100644 index 000000000..3fb77facb --- /dev/null +++ b/google/cloud/storage_v2/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-cloud-storage package uses inline types. diff --git a/google/cloud/storage_v2/services/__init__.py b/google/cloud/storage_v2/services/__init__.py new file mode 100644 index 000000000..cbf94b283 --- /dev/null +++ b/google/cloud/storage_v2/services/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/google/cloud/storage_v2/services/storage/__init__.py b/google/cloud/storage_v2/services/storage/__init__.py new file mode 100644 index 000000000..013d5aa1c --- /dev/null +++ b/google/cloud/storage_v2/services/storage/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from .client import StorageClient +from .async_client import StorageAsyncClient + +__all__ = ( + "StorageClient", + "StorageAsyncClient", +) diff --git a/google/cloud/storage_v2/services/storage/async_client.py b/google/cloud/storage_v2/services/storage/async_client.py new file mode 100644 index 000000000..81290e8aa --- /dev/null +++ b/google/cloud/storage_v2/services/storage/async_client.py @@ -0,0 +1,3443 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import logging as std_logging +from collections import OrderedDict +import re +from typing import ( + Dict, + Callable, + Mapping, + MutableMapping, + MutableSequence, + Optional, + AsyncIterable, + Awaitable, + AsyncIterator, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.storage_v2 import gapic_version as package_version + +from google.api_core.client_options import ClientOptions +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore +import google.protobuf + + +try: + OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore + +from google.cloud.storage_v2.services.storage import pagers +from google.cloud.storage_v2.types import storage +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.longrunning import operations_pb2 # type: ignore +from google.protobuf import field_mask_pb2 # type: ignore +from google.protobuf import timestamp_pb2 # type: ignore +from .transports.base import StorageTransport, DEFAULT_CLIENT_INFO +from .transports.grpc_asyncio import StorageGrpcAsyncIOTransport +from .client import StorageClient + +try: + from google.api_core import client_logging # type: ignore + + CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER +except ImportError: # pragma: NO COVER + CLIENT_LOGGING_SUPPORTED = False + +_LOGGER = std_logging.getLogger(__name__) + + +class StorageAsyncClient: + """API Overview and Naming Syntax + ------------------------------ + + The Cloud Storage gRPC API allows applications to read and write + data through the abstractions of buckets and objects. For a + description of these abstractions please see + https://cloud.google.com/storage/docs. + + Resources are named as follows: + + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. + + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. + + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. + For example: + + ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). + """ + + _client: StorageClient + + # Copy defaults from the synchronous client for use here. + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = StorageClient.DEFAULT_ENDPOINT + DEFAULT_MTLS_ENDPOINT = StorageClient.DEFAULT_MTLS_ENDPOINT + _DEFAULT_ENDPOINT_TEMPLATE = StorageClient._DEFAULT_ENDPOINT_TEMPLATE + _DEFAULT_UNIVERSE = StorageClient._DEFAULT_UNIVERSE + + bucket_path = staticmethod(StorageClient.bucket_path) + parse_bucket_path = staticmethod(StorageClient.parse_bucket_path) + crypto_key_path = staticmethod(StorageClient.crypto_key_path) + parse_crypto_key_path = staticmethod(StorageClient.parse_crypto_key_path) + common_billing_account_path = staticmethod( + StorageClient.common_billing_account_path + ) + parse_common_billing_account_path = staticmethod( + StorageClient.parse_common_billing_account_path + ) + common_folder_path = staticmethod(StorageClient.common_folder_path) + parse_common_folder_path = staticmethod(StorageClient.parse_common_folder_path) + common_organization_path = staticmethod(StorageClient.common_organization_path) + parse_common_organization_path = staticmethod( + StorageClient.parse_common_organization_path + ) + common_project_path = staticmethod(StorageClient.common_project_path) + parse_common_project_path = staticmethod(StorageClient.parse_common_project_path) + common_location_path = staticmethod(StorageClient.common_location_path) + parse_common_location_path = staticmethod(StorageClient.parse_common_location_path) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + StorageAsyncClient: The constructed client. + """ + return StorageClient.from_service_account_info.__func__(StorageAsyncClient, info, *args, **kwargs) # type: ignore + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + StorageAsyncClient: The constructed client. + """ + return StorageClient.from_service_account_file.__func__(StorageAsyncClient, filename, *args, **kwargs) # type: ignore + + from_service_account_json = from_service_account_file + + @classmethod + def get_mtls_endpoint_and_cert_source( + cls, client_options: Optional[ClientOptions] = None + ): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return StorageClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + + @property + def transport(self) -> StorageTransport: + """Returns the transport used by the client instance. + + Returns: + StorageTransport: The transport used by the client instance. + """ + return self._client.transport + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._client._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used + by the client instance. + """ + return self._client._universe_domain + + get_transport_class = StorageClient.get_transport_class + + def __init__( + self, + *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[ + Union[str, StorageTransport, Callable[..., StorageTransport]] + ] = "grpc_asyncio", + client_options: Optional[ClientOptions] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the storage async client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,StorageTransport,Callable[..., StorageTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport to use. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the StorageTransport constructor. + If set to None, a transport is chosen automatically. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client = StorageClient( + credentials=credentials, + transport=transport, + client_options=client_options, + client_info=client_info, + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + std_logging.DEBUG + ): # pragma: NO COVER + _LOGGER.debug( + "Created client `google.storage_v2.StorageAsyncClient`.", + extra={ + "serviceName": "google.storage.v2.Storage", + "universeDomain": getattr( + self._client._transport._credentials, "universe_domain", "" + ), + "credentialsType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}", + "credentialsInfo": getattr( + self.transport._credentials, "get_cred_info", lambda: None + )(), + } + if hasattr(self._client._transport, "_credentials") + else { + "serviceName": "google.storage.v2.Storage", + "credentialsType": None, + }, + ) + + async def delete_bucket( + self, + request: Optional[Union[storage.DeleteBucketRequest, dict]] = None, + *, + name: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> None: + r"""Permanently deletes an empty bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_delete_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.DeleteBucketRequest( + name="name_value", + ) + + # Make the request + await client.delete_bucket(request=request) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.DeleteBucketRequest, dict]]): + The request object. Request message for DeleteBucket. + name (:class:`str`): + Required. Name of a bucket to delete. + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [name] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.DeleteBucketRequest): + request = storage.DeleteBucketRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.delete_bucket + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.name) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + async def get_bucket( + self, + request: Optional[Union[storage.GetBucketRequest, dict]] = None, + *, + name: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Returns metadata for the specified bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_get_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.GetBucketRequest( + name="name_value", + ) + + # Make the request + response = await client.get_bucket(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.GetBucketRequest, dict]]): + The request object. Request message for GetBucket. + name (:class:`str`): + Required. Name of a bucket. + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [name] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.GetBucketRequest): + request = storage.GetBucketRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.get_bucket + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.name) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def create_bucket( + self, + request: Optional[Union[storage.CreateBucketRequest, dict]] = None, + *, + parent: Optional[str] = None, + bucket: Optional[storage.Bucket] = None, + bucket_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Creates a new bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_create_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.CreateBucketRequest( + parent="parent_value", + bucket_id="bucket_id_value", + ) + + # Make the request + response = await client.create_bucket(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.CreateBucketRequest, dict]]): + The request object. Request message for CreateBucket. + parent (:class:`str`): + Required. The project to which this bucket will belong. + This field must either be empty or ``projects/_``. The + project ID that owns this bucket should be specified in + the ``bucket.project`` field. + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + bucket (:class:`google.cloud.storage_v2.types.Bucket`): + Optional. Properties of the new bucket being inserted. + The name of the bucket is specified in the ``bucket_id`` + field. Populating ``bucket.name`` field will result in + an error. The project of the bucket must be specified in + the ``bucket.project`` field. This field must be in + ``projects/{projectIdentifier}`` format, + {projectIdentifier} can be the project ID or project + number. The ``parent`` field must be either empty or + ``projects/_``. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + bucket_id (:class:`str`): + Required. The ID to use for this bucket, which will + become the final component of the bucket's resource + name. For example, the value ``foo`` might result in a + bucket with the name ``projects/123456/buckets/foo``. + + This corresponds to the ``bucket_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [parent, bucket, bucket_id] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.CreateBucketRequest): + request = storage.CreateBucketRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + if bucket is not None: + request.bucket = bucket + if bucket_id is not None: + request.bucket_id = bucket_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.create_bucket + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.parent) + if regex_match and regex_match.group("project"): + header_params["project"] = regex_match.group("project") + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket.project) + if regex_match and regex_match.group("project"): + header_params["project"] = regex_match.group("project") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def list_buckets( + self, + request: Optional[Union[storage.ListBucketsRequest, dict]] = None, + *, + parent: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> pagers.ListBucketsAsyncPager: + r"""Retrieves a list of buckets for a given project. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_list_buckets(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ListBucketsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_buckets(request=request) + + # Handle the response + async for response in page_result: + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.ListBucketsRequest, dict]]): + The request object. Request message for ListBuckets. + parent (:class:`str`): + Required. The project whose buckets + we are listing. + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.services.storage.pagers.ListBucketsAsyncPager: + The result of a call to + Buckets.ListBuckets + Iterating over this object will yield + results and resolve additional pages + automatically. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [parent] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ListBucketsRequest): + request = storage.ListBucketsRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.list_buckets + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.parent) + if regex_match and regex_match.group("project"): + header_params["project"] = regex_match.group("project") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # This method is paged; wrap the response in a pager, which provides + # an `__aiter__` convenience method. + response = pagers.ListBucketsAsyncPager( + method=rpc, + request=request, + response=response, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def lock_bucket_retention_policy( + self, + request: Optional[Union[storage.LockBucketRetentionPolicyRequest, dict]] = None, + *, + bucket: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Locks retention policy on a bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_lock_bucket_retention_policy(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.LockBucketRetentionPolicyRequest( + bucket="bucket_value", + if_metageneration_match=2413, + ) + + # Make the request + response = await client.lock_bucket_retention_policy(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.LockBucketRetentionPolicyRequest, dict]]): + The request object. Request message for + LockBucketRetentionPolicyRequest. + bucket (:class:`str`): + Required. Name of a bucket. + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.LockBucketRetentionPolicyRequest): + request = storage.LockBucketRetentionPolicyRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.lock_bucket_retention_policy + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def get_iam_policy( + self, + request: Optional[Union[iam_policy_pb2.GetIamPolicyRequest, dict]] = None, + *, + resource: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> policy_pb2.Policy: + r"""Gets the IAM policy for a specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + from google.iam.v1 import iam_policy_pb2 # type: ignore + + async def sample_get_iam_policy(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = iam_policy_pb2.GetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = await client.get_iam_policy(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.iam.v1.iam_policy_pb2.GetIamPolicyRequest, dict]]): + The request object. Request message for ``GetIamPolicy`` method. + resource (:class:`str`): + REQUIRED: The resource for which the + policy is being requested. See the + operation documentation for the + appropriate value for this field. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.iam.v1.policy_pb2.Policy: + An Identity and Access Management (IAM) policy, which specifies access + controls for Google Cloud resources. + + A Policy is a collection of bindings. A binding binds + one or more members, or principals, to a single role. + Principals can be user accounts, service accounts, + Google groups, and domains (such as G Suite). A role + is a named list of permissions; each role can be an + IAM predefined role or a user-created custom role. + + For some types of Google Cloud resources, a binding + can also specify a condition, which is a logical + expression that allows access to a resource only if + the expression evaluates to true. A condition can add + constraints based on attributes of the request, the + resource, or both. To learn which resources support + conditions in their IAM policies, see the [IAM + documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + + **JSON example:** + + :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + + **YAML example:** + + :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + + For a description of IAM and its features, see the + [IAM + documentation](\ https://cloud.google.com/iam/docs/). + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = iam_policy_pb2.GetIamPolicyRequest(**request) + elif not request: + request = iam_policy_pb2.GetIamPolicyRequest(resource=resource) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.get_iam_policy + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def set_iam_policy( + self, + request: Optional[Union[iam_policy_pb2.SetIamPolicyRequest, dict]] = None, + *, + resource: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> policy_pb2.Policy: + r"""Updates an IAM policy for the specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + from google.iam.v1 import iam_policy_pb2 # type: ignore + + async def sample_set_iam_policy(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = iam_policy_pb2.SetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = await client.set_iam_policy(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.iam.v1.iam_policy_pb2.SetIamPolicyRequest, dict]]): + The request object. Request message for ``SetIamPolicy`` method. + resource (:class:`str`): + REQUIRED: The resource for which the + policy is being specified. See the + operation documentation for the + appropriate value for this field. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.iam.v1.policy_pb2.Policy: + An Identity and Access Management (IAM) policy, which specifies access + controls for Google Cloud resources. + + A Policy is a collection of bindings. A binding binds + one or more members, or principals, to a single role. + Principals can be user accounts, service accounts, + Google groups, and domains (such as G Suite). A role + is a named list of permissions; each role can be an + IAM predefined role or a user-created custom role. + + For some types of Google Cloud resources, a binding + can also specify a condition, which is a logical + expression that allows access to a resource only if + the expression evaluates to true. A condition can add + constraints based on attributes of the request, the + resource, or both. To learn which resources support + conditions in their IAM policies, see the [IAM + documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + + **JSON example:** + + :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + + **YAML example:** + + :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + + For a description of IAM and its features, see the + [IAM + documentation](\ https://cloud.google.com/iam/docs/). + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = iam_policy_pb2.SetIamPolicyRequest(**request) + elif not request: + request = iam_policy_pb2.SetIamPolicyRequest(resource=resource) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.set_iam_policy + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def test_iam_permissions( + self, + request: Optional[Union[iam_policy_pb2.TestIamPermissionsRequest, dict]] = None, + *, + resource: Optional[str] = None, + permissions: Optional[MutableSequence[str]] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> iam_policy_pb2.TestIamPermissionsResponse: + r"""Tests a set of permissions on the given bucket, object, or + managed folder to see which, if any, are held by the caller. The + ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, + ``projects/_/buckets/{bucket}/objects/{object}`` for an object, + or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + from google.iam.v1 import iam_policy_pb2 # type: ignore + + async def sample_test_iam_permissions(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = iam_policy_pb2.TestIamPermissionsRequest( + resource="resource_value", + permissions=['permissions_value1', 'permissions_value2'], + ) + + # Make the request + response = await client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest, dict]]): + The request object. Request message for ``TestIamPermissions`` method. + resource (:class:`str`): + REQUIRED: The resource for which the + policy detail is being requested. See + the operation documentation for the + appropriate value for this field. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + permissions (:class:`MutableSequence[str]`): + The set of permissions to check for the ``resource``. + Permissions with wildcards (such as '*' or 'storage.*') + are not allowed. For more information see `IAM + Overview `__. + + This corresponds to the ``permissions`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.iam.v1.iam_policy_pb2.TestIamPermissionsResponse: + Response message for TestIamPermissions method. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [resource, permissions] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = iam_policy_pb2.TestIamPermissionsRequest(**request) + elif not request: + request = iam_policy_pb2.TestIamPermissionsRequest( + resource=resource, permissions=permissions + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.test_iam_permissions + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)/objects(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)/managedFolders(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def update_bucket( + self, + request: Optional[Union[storage.UpdateBucketRequest, dict]] = None, + *, + bucket: Optional[storage.Bucket] = None, + update_mask: Optional[field_mask_pb2.FieldMask] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Updates a bucket. Equivalent to JSON API's + storage.buckets.patch method. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_update_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.UpdateBucketRequest( + ) + + # Make the request + response = await client.update_bucket(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.UpdateBucketRequest, dict]]): + The request object. Request for UpdateBucket method. + bucket (:class:`google.cloud.storage_v2.types.Bucket`): + Required. The bucket to update. The bucket's ``name`` + field will be used to identify the bucket. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + update_mask (:class:`google.protobuf.field_mask_pb2.FieldMask`): + Required. List of fields to be updated. + + To specify ALL fields, equivalent to the JSON API's + "update" function, specify a single field with the value + ``*``. Note: not recommended. If a new field is + introduced at a later time, an older client updating + with the ``*`` may accidentally reset the new field's + value. + + Not specifying any fields is an error. + + This corresponds to the ``update_mask`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, update_mask] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.UpdateBucketRequest): + request = storage.UpdateBucketRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if update_mask is not None: + request.update_mask = update_mask + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.update_bucket + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket.name) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def compose_object( + self, + request: Optional[Union[storage.ComposeObjectRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Concatenates a list of existing objects into a new + object in the same bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_compose_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ComposeObjectRequest( + ) + + # Make the request + response = await client.compose_object(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.ComposeObjectRequest, dict]]): + The request object. Request message for ComposeObject. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ComposeObjectRequest): + request = storage.ComposeObjectRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.compose_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.destination.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def delete_object( + self, + request: Optional[Union[storage.DeleteObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> None: + r"""Deletes an object and its metadata. Deletions are permanent if + versioning is not enabled for the bucket, or if the generation + parameter is used, or if `soft + delete `__ is + not enabled for the bucket. When this API is used to delete an + object from a bucket that has soft delete policy enabled, the + object becomes soft deleted, and the ``softDeleteTime`` and + ``hardDeleteTime`` properties are set on the object. This API + cannot be used to permanently delete soft-deleted objects. + Soft-deleted objects are permanently deleted according to their + ``hardDeleteTime``. + + You can use the + [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API + to restore soft-deleted objects until the soft delete retention + period has passed. + + **IAM Permissions**: + + Requires ``storage.objects.delete`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_delete_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.DeleteObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + await client.delete_object(request=request) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.DeleteObjectRequest, dict]]): + The request object. Message for deleting an object. ``bucket`` and + ``object`` **must** be set. + bucket (:class:`str`): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (:class:`str`): + Required. The name of the finalized object to delete. + Note: If you want to delete an unfinalized resumable + upload please use ``CancelResumableWrite``. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (:class:`int`): + Optional. If present, permanently + deletes a specific revision of this + object (as opposed to the latest + version, the default). + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.DeleteObjectRequest): + request = storage.DeleteObjectRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.delete_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + async def restore_object( + self, + request: Optional[Union[storage.RestoreObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Restores a soft-deleted object. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_restore_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.RestoreObjectRequest( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Make the request + response = await client.restore_object(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.RestoreObjectRequest, dict]]): + The request object. Message for restoring an object. ``bucket``, ``object``, + and ``generation`` **must** be set. + bucket (:class:`str`): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (:class:`str`): + Required. The name of the object to + restore. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (:class:`int`): + Required. The specific revision of + the object to restore. + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.RestoreObjectRequest): + request = storage.RestoreObjectRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.restore_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def cancel_resumable_write( + self, + request: Optional[Union[storage.CancelResumableWriteRequest, dict]] = None, + *, + upload_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.CancelResumableWriteResponse: + r"""Cancels an in-progress resumable upload. + + Any attempts to write to the resumable upload after + cancelling the upload will fail. + + The behavior for currently in progress write operations + is not guaranteed - they could either complete before + the cancellation or fail if the cancellation completes + first. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_cancel_resumable_write(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.CancelResumableWriteRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = await client.cancel_resumable_write(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.CancelResumableWriteRequest, dict]]): + The request object. Message for canceling an in-progress resumable upload. + ``upload_id`` **must** be set. + upload_id (:class:`str`): + Required. The upload_id of the resumable upload to + cancel. This should be copied from the ``upload_id`` + field of ``StartResumableWriteResponse``. + + This corresponds to the ``upload_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.CancelResumableWriteResponse: + Empty response message for canceling + an in-progress resumable upload, will be + extended as needed. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [upload_id] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.CancelResumableWriteRequest): + request = storage.CancelResumableWriteRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if upload_id is not None: + request.upload_id = upload_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.cancel_resumable_write + ] + + header_params = {} + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.upload_id) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def get_object( + self, + request: Optional[Union[storage.GetObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Retrieves object metadata. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. To return object ACLs, the authenticated user + must also have the ``storage.objects.getIamPolicy`` permission. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_get_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.GetObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + response = await client.get_object(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.GetObjectRequest, dict]]): + The request object. Request message for GetObject. + bucket (:class:`str`): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (:class:`str`): + Required. Name of the object. + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (:class:`int`): + Optional. If present, selects a + specific revision of this object (as + opposed to the latest version, the + default). + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.GetObjectRequest): + request = storage.GetObjectRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.get_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def read_object( + self, + request: Optional[Union[storage.ReadObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> Awaitable[AsyncIterable[storage.ReadObjectResponse]]: + r"""Retrieves object data. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_read_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ReadObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + stream = await client.read_object(request=request) + + # Handle the response + async for response in stream: + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.ReadObjectRequest, dict]]): + The request object. Request message for ReadObject. + bucket (:class:`str`): + Required. The name of the bucket + containing the object to read. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (:class:`str`): + Required. The name of the object to + read. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (:class:`int`): + Optional. If present, selects a + specific revision of this object (as + opposed to the latest version, the + default). + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + AsyncIterable[google.cloud.storage_v2.types.ReadObjectResponse]: + Response message for ReadObject. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ReadObjectRequest): + request = storage.ReadObjectRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.read_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def bidi_read_object( + self, + requests: Optional[AsyncIterator[storage.BidiReadObjectRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> Awaitable[AsyncIterable[storage.BidiReadObjectResponse]]: + r"""Reads an object's data. + + This is a bi-directional API with the added support for reading + multiple ranges within one stream both within and across + multiple messages. If the server encountered an error for any of + the inputs, the stream will be closed with the relevant error + code. Because the API allows for multiple outstanding requests, + when the stream is closed the error response will contain a + BidiReadObjectRangesError proto in the error extension + describing the error for each outstanding read_id. + + **IAM Permissions**: + + Requires ``storage.objects.get`` + + `IAM + permission `__ + on the bucket. + + This API is currently in preview and is not yet available for + general use. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_bidi_read_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.BidiReadObjectRequest( + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiReadObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.bidi_read_object(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + + Args: + requests (AsyncIterator[`google.cloud.storage_v2.types.BidiReadObjectRequest`]): + The request object AsyncIterator. Request message for BidiReadObject. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + AsyncIterable[google.cloud.storage_v2.types.BidiReadObjectResponse]: + Response message for BidiReadObject. + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.bidi_read_object + ] + + header_params = {} + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def update_object( + self, + request: Optional[Union[storage.UpdateObjectRequest, dict]] = None, + *, + object_: Optional[storage.Object] = None, + update_mask: Optional[field_mask_pb2.FieldMask] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Updates an object's metadata. + Equivalent to JSON API's storage.objects.patch. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_update_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.UpdateObjectRequest( + ) + + # Make the request + response = await client.update_object(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.UpdateObjectRequest, dict]]): + The request object. Request message for UpdateObject. + object_ (:class:`google.cloud.storage_v2.types.Object`): + Required. The object to update. + The object's bucket and name fields are + used to identify the object to update. + If present, the object's generation + field selects a specific revision of + this object whose metadata should be + updated. Otherwise, assumes the live + version of the object. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + update_mask (:class:`google.protobuf.field_mask_pb2.FieldMask`): + Required. List of fields to be updated. + + To specify ALL fields, equivalent to the JSON API's + "update" function, specify a single field with the value + ``*``. Note: not recommended. If a new field is + introduced at a later time, an older client updating + with the ``*`` may accidentally reset the new field's + value. + + Not specifying any fields is an error. + + This corresponds to the ``update_mask`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [object_, update_mask] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.UpdateObjectRequest): + request = storage.UpdateObjectRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if object_ is not None: + request.object_ = object_ + if update_mask is not None: + request.update_mask = update_mask + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.update_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.object.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def write_object( + self, + requests: Optional[AsyncIterator[storage.WriteObjectRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.WriteObjectResponse: + r"""Stores a new object and metadata. + + An object can be written either in a single message stream or in + a resumable sequence of message streams. To write using a single + stream, the client should include in the first message of the + stream an ``WriteObjectSpec`` describing the destination bucket, + object, and any preconditions. Additionally, the final message + must set 'finish_write' to true, or else it is an error. + + For a resumable write, the client should instead call + ``StartResumableWrite()``, populating a ``WriteObjectSpec`` into + that request. They should then attach the returned ``upload_id`` + to the first message of each following call to ``WriteObject``. + If the stream is closed before finishing the upload (either + explicitly by the client or due to a network error or an error + response from the server), the client should do as follows: + + - Check the result Status of the stream, to determine if + writing can be resumed on this stream or must be restarted + from scratch (by calling ``StartResumableWrite()``). The + resumable errors are DEADLINE_EXCEEDED, INTERNAL, and + UNAVAILABLE. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after RESOURCE_EXHAUSTED errors, but only after + taking appropriate measures, which may include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single + client where the previous request was timed out on the client + side but nonetheless reached the server. In this case the + client should take steps to prevent further concurrent writes + (e.g., increase the timeouts, stop using more than one + process to perform the upload, etc.), and then should follow + the steps below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + will skip data at offsets that were already persisted + (without checking that it matches the previously written + data), and write only the data starting from the persisted + offset. Even though the data isn't written, it may still + incur a performance cost over resuming at the correct write + offset. This behavior can make client-side handling simpler + in some cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. + + The service will not view the object as complete until the + client has sent a ``WriteObjectRequest`` with ``finish_write`` + set to ``true``. Sending any requests on a stream after sending + a request with ``finish_write`` set to ``true`` will cause an + error. The client **should** check the response it receives to + determine how much data the service was able to commit and + whether the service views the object as complete. + + Attempting to resume an already finalized object will result in + an OK status, with a ``WriteObjectResponse`` containing the + finalized object's metadata. + + Alternatively, the BidiWriteObject operation may be used to + write an object with controls over flushing and the ability to + fetch the ability to determine the current persisted size. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_write_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.WriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.WriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + response = await client.write_object(requests=request_generator()) + + # Handle the response + print(response) + + Args: + requests (AsyncIterator[`google.cloud.storage_v2.types.WriteObjectRequest`]): + The request object AsyncIterator. Request message for WriteObject. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.WriteObjectResponse: + Response message for WriteObject. + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.write_object + ] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def bidi_write_object( + self, + requests: Optional[AsyncIterator[storage.BidiWriteObjectRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> Awaitable[AsyncIterable[storage.BidiWriteObjectResponse]]: + r"""Stores a new object and metadata. + + This is similar to the WriteObject call with the added support + for manual flushing of persisted state, and the ability to + determine current persisted size without closing the stream. + + The client may specify one or both of the ``state_lookup`` and + ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is + specified, the data written so far will be persisted to storage. + If ``state_lookup`` is specified, the service will respond with + a BidiWriteObjectResponse that contains the persisted size. If + both ``flush`` and ``state_lookup`` are specified, the flush + will always occur before a ``state_lookup``, so that both may be + set in the same request and the returned state will be the state + of the object post-flush. When the stream is closed, a + BidiWriteObjectResponse will always be sent to the client, + regardless of the value of ``state_lookup``. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_bidi_write_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.BidiWriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiWriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.bidi_write_object(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + + Args: + requests (AsyncIterator[`google.cloud.storage_v2.types.BidiWriteObjectRequest`]): + The request object AsyncIterator. Request message for BidiWriteObject. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + AsyncIterable[google.cloud.storage_v2.types.BidiWriteObjectResponse]: + Response message for BidiWriteObject. + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.bidi_write_object + ] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def list_objects( + self, + request: Optional[Union[storage.ListObjectsRequest, dict]] = None, + *, + parent: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> pagers.ListObjectsAsyncPager: + r"""Retrieves a list of objects matching the criteria. + + **IAM Permissions**: + + The authenticated user requires ``storage.objects.list`` `IAM + permission `__ + to use this method. To return object ACLs, the authenticated + user must also have the ``storage.objects.getIamPolicy`` + permission. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_list_objects(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ListObjectsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_objects(request=request) + + # Handle the response + async for response in page_result: + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.ListObjectsRequest, dict]]): + The request object. Request message for ListObjects. + parent (:class:`str`): + Required. Name of the bucket in which + to look for objects. + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.services.storage.pagers.ListObjectsAsyncPager: + The result of a call to + Objects.ListObjects + Iterating over this object will yield + results and resolve additional pages + automatically. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [parent] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ListObjectsRequest): + request = storage.ListObjectsRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.list_objects + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.parent) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # This method is paged; wrap the response in a pager, which provides + # an `__aiter__` convenience method. + response = pagers.ListObjectsAsyncPager( + method=rpc, + request=request, + response=response, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def rewrite_object( + self, + request: Optional[Union[storage.RewriteObjectRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.RewriteResponse: + r"""Rewrites a source object to a destination object. + Optionally overrides metadata. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_rewrite_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.RewriteObjectRequest( + destination_name="destination_name_value", + destination_bucket="destination_bucket_value", + source_bucket="source_bucket_value", + source_object="source_object_value", + ) + + # Make the request + response = await client.rewrite_object(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.RewriteObjectRequest, dict]]): + The request object. Request message for RewriteObject. If the source object + is encrypted using a Customer-Supplied Encryption Key + the key information must be provided in the + copy_source_encryption_algorithm, + copy_source_encryption_key_bytes, and + copy_source_encryption_key_sha256_bytes fields. If the + destination object should be encrypted the keying + information should be provided in the + encryption_algorithm, encryption_key_bytes, and + encryption_key_sha256_bytes fields of the + common_object_request_params.customer_encryption field. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.RewriteResponse: + A rewrite response. + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.RewriteObjectRequest): + request = storage.RewriteObjectRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.rewrite_object + ] + + header_params = {} + + if request.source_bucket: + header_params["source_bucket"] = request.source_bucket + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.destination_bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def start_resumable_write( + self, + request: Optional[Union[storage.StartResumableWriteRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.StartResumableWriteResponse: + r"""Starts a resumable write operation. This method is part of the + `Resumable + upload `__ + feature. This allows you to upload large objects in multiple + chunks, which is more resilient to network interruptions than a + single upload. The validity duration of the write operation, and + the consequences of it becoming invalid, are service-dependent. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_start_resumable_write(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.StartResumableWriteRequest( + ) + + # Make the request + response = await client.start_resumable_write(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.StartResumableWriteRequest, dict]]): + The request object. Request message StartResumableWrite. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.StartResumableWriteResponse: + Response object for StartResumableWrite. + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.StartResumableWriteRequest): + request = storage.StartResumableWriteRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.start_resumable_write + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match( + request.write_object_spec.resource.bucket + ) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def query_write_status( + self, + request: Optional[Union[storage.QueryWriteStatusRequest, dict]] = None, + *, + upload_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.QueryWriteStatusResponse: + r"""Determines the ``persisted_size`` of an object that is being + written. This method is part of the `resumable + upload `__ + feature. The returned value is the size of the object that has + been persisted so far. The value can be used as the + ``write_offset`` for the next ``Write()`` call. + + If the object does not exist, meaning if it was deleted, or the + first ``Write()`` has not yet reached the service, this method + returns the error ``NOT_FOUND``. + + This method is useful for clients that buffer data and need to + know which data can be safely evicted. The client can call + ``QueryWriteStatus()`` at any time to determine how much data + has been logged for this object. For any sequence of + ``QueryWriteStatus()`` calls for a given object name, the + sequence of returned ``persisted_size`` values are + non-decreasing. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_query_write_status(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.QueryWriteStatusRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = await client.query_write_status(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.QueryWriteStatusRequest, dict]]): + The request object. Request object for ``QueryWriteStatus``. + upload_id (:class:`str`): + Required. The name of the resume + token for the object whose write status + is being requested. + + This corresponds to the ``upload_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.QueryWriteStatusResponse: + Response object for QueryWriteStatus. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [upload_id] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.QueryWriteStatusRequest): + request = storage.QueryWriteStatusRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if upload_id is not None: + request.upload_id = upload_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.query_write_status + ] + + header_params = {} + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.upload_id) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def move_object( + self, + request: Optional[Union[storage.MoveObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + source_object: Optional[str] = None, + destination_object: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Moves the source object to the destination object in + the same bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + async def sample_move_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.MoveObjectRequest( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Make the request + response = await client.move_object(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.storage_v2.types.MoveObjectRequest, dict]]): + The request object. Request message for MoveObject. + bucket (:class:`str`): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + source_object (:class:`str`): + Required. Name of the source object. + This corresponds to the ``source_object`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + destination_object (:class:`str`): + Required. Name of the destination + object. + + This corresponds to the ``destination_object`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, source_object, destination_object] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.MoveObjectRequest): + request = storage.MoveObjectRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if source_object is not None: + request.source_object = source_object + if destination_object is not None: + request.destination_object = destination_object + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[ + self._client._transport.move_object + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def __aenter__(self) -> "StorageAsyncClient": + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) + +if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"): # pragma: NO COVER + DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__ + + +__all__ = ("StorageAsyncClient",) diff --git a/google/cloud/storage_v2/services/storage/client.py b/google/cloud/storage_v2/services/storage/client.py new file mode 100644 index 000000000..2026a8918 --- /dev/null +++ b/google/cloud/storage_v2/services/storage/client.py @@ -0,0 +1,3836 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from collections import OrderedDict +from http import HTTPStatus +import json +import logging as std_logging +import os +import re +from typing import ( + Dict, + Callable, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Iterable, + Iterator, + Sequence, + Tuple, + Type, + Union, + cast, +) +import warnings + +from google.cloud.storage_v2 import gapic_version as package_version + +from google.api_core import client_options as client_options_lib +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport import mtls # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore +from google.oauth2 import service_account # type: ignore +import google.protobuf + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + +try: + from google.api_core import client_logging # type: ignore + + CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER +except ImportError: # pragma: NO COVER + CLIENT_LOGGING_SUPPORTED = False + +_LOGGER = std_logging.getLogger(__name__) + +from google.cloud.storage_v2.services.storage import pagers +from google.cloud.storage_v2.types import storage +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.longrunning import operations_pb2 # type: ignore +from google.protobuf import field_mask_pb2 # type: ignore +from google.protobuf import timestamp_pb2 # type: ignore +from .transports.base import StorageTransport, DEFAULT_CLIENT_INFO +from .transports.grpc import StorageGrpcTransport +from .transports.grpc_asyncio import StorageGrpcAsyncIOTransport + + +class StorageClientMeta(type): + """Metaclass for the Storage client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + + _transport_registry = OrderedDict() # type: Dict[str, Type[StorageTransport]] + _transport_registry["grpc"] = StorageGrpcTransport + _transport_registry["grpc_asyncio"] = StorageGrpcAsyncIOTransport + + def get_transport_class( + cls, + label: Optional[str] = None, + ) -> Type[StorageTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + +class StorageClient(metaclass=StorageClientMeta): + """API Overview and Naming Syntax + ------------------------------ + + The Cloud Storage gRPC API allows applications to read and write + data through the abstractions of buckets and objects. For a + description of these abstractions please see + https://cloud.google.com/storage/docs. + + Resources are named as follows: + + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. + + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. + + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. + For example: + + ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). + """ + + @staticmethod + def _get_default_mtls_endpoint(api_endpoint): + """Converts api endpoint to mTLS endpoint. + + Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to + "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. + Args: + api_endpoint (Optional[str]): the api endpoint to convert. + Returns: + str: converted mTLS api endpoint. + """ + if not api_endpoint: + return api_endpoint + + mtls_endpoint_re = re.compile( + r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" + ) + + m = mtls_endpoint_re.match(api_endpoint) + name, mtls, sandbox, googledomain = m.groups() + if mtls or not googledomain: + return api_endpoint + + if sandbox: + return api_endpoint.replace( + "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" + ) + + return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") + + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = "storage.googleapis.com" + DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore + DEFAULT_ENDPOINT + ) + + _DEFAULT_ENDPOINT_TEMPLATE = "storage.{UNIVERSE_DOMAIN}" + _DEFAULT_UNIVERSE = "googleapis.com" + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + StorageClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_info(info) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + StorageClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_file(filename) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + from_service_account_json = from_service_account_file + + @property + def transport(self) -> StorageTransport: + """Returns the transport used by the client instance. + + Returns: + StorageTransport: The transport used by the client + instance. + """ + return self._transport + + @staticmethod + def bucket_path( + project: str, + bucket: str, + ) -> str: + """Returns a fully-qualified bucket string.""" + return "projects/{project}/buckets/{bucket}".format( + project=project, + bucket=bucket, + ) + + @staticmethod + def parse_bucket_path(path: str) -> Dict[str, str]: + """Parses a bucket path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/buckets/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def crypto_key_path( + project: str, + location: str, + key_ring: str, + crypto_key: str, + ) -> str: + """Returns a fully-qualified crypto_key string.""" + return "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}".format( + project=project, + location=location, + key_ring=key_ring, + crypto_key=crypto_key, + ) + + @staticmethod + def parse_crypto_key_path(path: str) -> Dict[str, str]: + """Parses a crypto_key path into its component segments.""" + m = re.match( + r"^projects/(?P.+?)/locations/(?P.+?)/keyRings/(?P.+?)/cryptoKeys/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def common_billing_account_path( + billing_account: str, + ) -> str: + """Returns a fully-qualified billing_account string.""" + return "billingAccounts/{billing_account}".format( + billing_account=billing_account, + ) + + @staticmethod + def parse_common_billing_account_path(path: str) -> Dict[str, str]: + """Parse a billing_account path into its component segments.""" + m = re.match(r"^billingAccounts/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_folder_path( + folder: str, + ) -> str: + """Returns a fully-qualified folder string.""" + return "folders/{folder}".format( + folder=folder, + ) + + @staticmethod + def parse_common_folder_path(path: str) -> Dict[str, str]: + """Parse a folder path into its component segments.""" + m = re.match(r"^folders/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_organization_path( + organization: str, + ) -> str: + """Returns a fully-qualified organization string.""" + return "organizations/{organization}".format( + organization=organization, + ) + + @staticmethod + def parse_common_organization_path(path: str) -> Dict[str, str]: + """Parse a organization path into its component segments.""" + m = re.match(r"^organizations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_project_path( + project: str, + ) -> str: + """Returns a fully-qualified project string.""" + return "projects/{project}".format( + project=project, + ) + + @staticmethod + def parse_common_project_path(path: str) -> Dict[str, str]: + """Parse a project path into its component segments.""" + m = re.match(r"^projects/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_location_path( + project: str, + location: str, + ) -> str: + """Returns a fully-qualified location string.""" + return "projects/{project}/locations/{location}".format( + project=project, + location=location, + ) + + @staticmethod + def parse_common_location_path(path: str) -> Dict[str, str]: + """Parse a location path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @classmethod + def get_mtls_endpoint_and_cert_source( + cls, client_options: Optional[client_options_lib.ClientOptions] = None + ): + """Deprecated. Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + + warnings.warn( + "get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", + DeprecationWarning, + ) + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError( + "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError( + "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or ( + use_mtls_endpoint == "auto" and client_cert_source + ): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + + @staticmethod + def _read_environment_variables(): + """Returns the environment variables used by the client. + + Returns: + Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, + GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. + + Raises: + ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not + any of ["true", "false"]. + google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT + is not any of ["auto", "never", "always"]. + """ + use_client_cert = os.getenv( + "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false" + ).lower() + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() + universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") + if use_client_cert not in ("true", "false"): + raise ValueError( + "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError( + "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + return use_client_cert == "true", use_mtls_endpoint, universe_domain_env + + @staticmethod + def _get_client_cert_source(provided_cert_source, use_cert_flag): + """Return the client cert source to be used by the client. + + Args: + provided_cert_source (bytes): The client certificate source provided. + use_cert_flag (bool): A flag indicating whether to use the client certificate. + + Returns: + bytes or None: The client cert source to be used by the client. + """ + client_cert_source = None + if use_cert_flag: + if provided_cert_source: + client_cert_source = provided_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + return client_cert_source + + @staticmethod + def _get_api_endpoint( + api_override, client_cert_source, universe_domain, use_mtls_endpoint + ): + """Return the API endpoint used by the client. + + Args: + api_override (str): The API endpoint override. If specified, this is always + the return value of this function and the other arguments are not used. + client_cert_source (bytes): The client certificate source used by the client. + universe_domain (str): The universe domain used by the client. + use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. + Possible values are "always", "auto", or "never". + + Returns: + str: The API endpoint to be used by the client. + """ + if api_override is not None: + api_endpoint = api_override + elif use_mtls_endpoint == "always" or ( + use_mtls_endpoint == "auto" and client_cert_source + ): + _default_universe = StorageClient._DEFAULT_UNIVERSE + if universe_domain != _default_universe: + raise MutualTLSChannelError( + f"mTLS is not supported in any universe other than {_default_universe}." + ) + api_endpoint = StorageClient.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = StorageClient._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=universe_domain + ) + return api_endpoint + + @staticmethod + def _get_universe_domain( + client_universe_domain: Optional[str], universe_domain_env: Optional[str] + ) -> str: + """Return the universe domain used by the client. + + Args: + client_universe_domain (Optional[str]): The universe domain configured via the client options. + universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. + + Returns: + str: The universe domain to be used by the client. + + Raises: + ValueError: If the universe domain is an empty string. + """ + universe_domain = StorageClient._DEFAULT_UNIVERSE + if client_universe_domain is not None: + universe_domain = client_universe_domain + elif universe_domain_env is not None: + universe_domain = universe_domain_env + if len(universe_domain.strip()) == 0: + raise ValueError("Universe Domain cannot be an empty string.") + return universe_domain + + def _validate_universe_domain(self): + """Validates client's and credentials' universe domains are consistent. + + Returns: + bool: True iff the configured universe domain is valid. + + Raises: + ValueError: If the configured universe domain is not valid. + """ + + # NOTE (b/349488459): universe validation is disabled until further notice. + return True + + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used by the client instance. + """ + return self._universe_domain + + def __init__( + self, + *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[ + Union[str, StorageTransport, Callable[..., StorageTransport]] + ] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the storage client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,StorageTransport,Callable[..., StorageTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the StorageTransport constructor. + If set to None, a transport is chosen automatically. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that the ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client_options = client_options + if isinstance(self._client_options, dict): + self._client_options = client_options_lib.from_dict(self._client_options) + if self._client_options is None: + self._client_options = client_options_lib.ClientOptions() + self._client_options = cast( + client_options_lib.ClientOptions, self._client_options + ) + + universe_domain_opt = getattr(self._client_options, "universe_domain", None) + + ( + self._use_client_cert, + self._use_mtls_endpoint, + self._universe_domain_env, + ) = StorageClient._read_environment_variables() + self._client_cert_source = StorageClient._get_client_cert_source( + self._client_options.client_cert_source, self._use_client_cert + ) + self._universe_domain = StorageClient._get_universe_domain( + universe_domain_opt, self._universe_domain_env + ) + self._api_endpoint = None # updated below, depending on `transport` + + # Initialize the universe domain validation. + self._is_universe_domain_valid = False + + if CLIENT_LOGGING_SUPPORTED: # pragma: NO COVER + # Setup logging. + client_logging.initialize_logging() + + api_key_value = getattr(self._client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError( + "client_options.api_key and credentials are mutually exclusive" + ) + + # Save or instantiate the transport. + # Ordinarily, we provide the transport, but allowing a custom transport + # instance provides an extensibility point for unusual situations. + transport_provided = isinstance(transport, StorageTransport) + if transport_provided: + # transport is a StorageTransport instance. + if credentials or self._client_options.credentials_file or api_key_value: + raise ValueError( + "When providing a transport instance, " + "provide its credentials directly." + ) + if self._client_options.scopes: + raise ValueError( + "When providing a transport instance, provide its scopes " + "directly." + ) + self._transport = cast(StorageTransport, transport) + self._api_endpoint = self._transport.host + + self._api_endpoint = self._api_endpoint or StorageClient._get_api_endpoint( + self._client_options.api_endpoint, + self._client_cert_source, + self._universe_domain, + self._use_mtls_endpoint, + ) + + if not transport_provided: + import google.auth._default # type: ignore + + if api_key_value and hasattr( + google.auth._default, "get_api_key_credentials" + ): + credentials = google.auth._default.get_api_key_credentials( + api_key_value + ) + + transport_init: Union[ + Type[StorageTransport], Callable[..., StorageTransport] + ] = ( + StorageClient.get_transport_class(transport) + if isinstance(transport, str) or transport is None + else cast(Callable[..., StorageTransport], transport) + ) + # initialize with the provided callable or the passed in class + self._transport = transport_init( + credentials=credentials, + credentials_file=self._client_options.credentials_file, + host=self._api_endpoint, + scopes=self._client_options.scopes, + client_cert_source_for_mtls=self._client_cert_source, + quota_project_id=self._client_options.quota_project_id, + client_info=client_info, + always_use_jwt_access=True, + api_audience=self._client_options.api_audience, + ) + + if "async" not in str(self._transport): + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + std_logging.DEBUG + ): # pragma: NO COVER + _LOGGER.debug( + "Created client `google.storage_v2.StorageClient`.", + extra={ + "serviceName": "google.storage.v2.Storage", + "universeDomain": getattr( + self._transport._credentials, "universe_domain", "" + ), + "credentialsType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}", + "credentialsInfo": getattr( + self.transport._credentials, "get_cred_info", lambda: None + )(), + } + if hasattr(self._transport, "_credentials") + else { + "serviceName": "google.storage.v2.Storage", + "credentialsType": None, + }, + ) + + def delete_bucket( + self, + request: Optional[Union[storage.DeleteBucketRequest, dict]] = None, + *, + name: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> None: + r"""Permanently deletes an empty bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_delete_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.DeleteBucketRequest( + name="name_value", + ) + + # Make the request + client.delete_bucket(request=request) + + Args: + request (Union[google.cloud.storage_v2.types.DeleteBucketRequest, dict]): + The request object. Request message for DeleteBucket. + name (str): + Required. Name of a bucket to delete. + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [name] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.DeleteBucketRequest): + request = storage.DeleteBucketRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.delete_bucket] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.name) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + def get_bucket( + self, + request: Optional[Union[storage.GetBucketRequest, dict]] = None, + *, + name: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Returns metadata for the specified bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_get_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.GetBucketRequest( + name="name_value", + ) + + # Make the request + response = client.get_bucket(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.GetBucketRequest, dict]): + The request object. Request message for GetBucket. + name (str): + Required. Name of a bucket. + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [name] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.GetBucketRequest): + request = storage.GetBucketRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_bucket] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.name) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def create_bucket( + self, + request: Optional[Union[storage.CreateBucketRequest, dict]] = None, + *, + parent: Optional[str] = None, + bucket: Optional[storage.Bucket] = None, + bucket_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Creates a new bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_create_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.CreateBucketRequest( + parent="parent_value", + bucket_id="bucket_id_value", + ) + + # Make the request + response = client.create_bucket(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.CreateBucketRequest, dict]): + The request object. Request message for CreateBucket. + parent (str): + Required. The project to which this bucket will belong. + This field must either be empty or ``projects/_``. The + project ID that owns this bucket should be specified in + the ``bucket.project`` field. + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + bucket (google.cloud.storage_v2.types.Bucket): + Optional. Properties of the new bucket being inserted. + The name of the bucket is specified in the ``bucket_id`` + field. Populating ``bucket.name`` field will result in + an error. The project of the bucket must be specified in + the ``bucket.project`` field. This field must be in + ``projects/{projectIdentifier}`` format, + {projectIdentifier} can be the project ID or project + number. The ``parent`` field must be either empty or + ``projects/_``. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + bucket_id (str): + Required. The ID to use for this bucket, which will + become the final component of the bucket's resource + name. For example, the value ``foo`` might result in a + bucket with the name ``projects/123456/buckets/foo``. + + This corresponds to the ``bucket_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [parent, bucket, bucket_id] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.CreateBucketRequest): + request = storage.CreateBucketRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + if bucket is not None: + request.bucket = bucket + if bucket_id is not None: + request.bucket_id = bucket_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.create_bucket] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.parent) + if regex_match and regex_match.group("project"): + header_params["project"] = regex_match.group("project") + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket.project) + if regex_match and regex_match.group("project"): + header_params["project"] = regex_match.group("project") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def list_buckets( + self, + request: Optional[Union[storage.ListBucketsRequest, dict]] = None, + *, + parent: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> pagers.ListBucketsPager: + r"""Retrieves a list of buckets for a given project. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_list_buckets(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ListBucketsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_buckets(request=request) + + # Handle the response + for response in page_result: + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.ListBucketsRequest, dict]): + The request object. Request message for ListBuckets. + parent (str): + Required. The project whose buckets + we are listing. + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.services.storage.pagers.ListBucketsPager: + The result of a call to + Buckets.ListBuckets + Iterating over this object will yield + results and resolve additional pages + automatically. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [parent] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ListBucketsRequest): + request = storage.ListBucketsRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_buckets] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.parent) + if regex_match and regex_match.group("project"): + header_params["project"] = regex_match.group("project") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # This method is paged; wrap the response in a pager, which provides + # an `__iter__` convenience method. + response = pagers.ListBucketsPager( + method=rpc, + request=request, + response=response, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def lock_bucket_retention_policy( + self, + request: Optional[Union[storage.LockBucketRetentionPolicyRequest, dict]] = None, + *, + bucket: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Locks retention policy on a bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_lock_bucket_retention_policy(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.LockBucketRetentionPolicyRequest( + bucket="bucket_value", + if_metageneration_match=2413, + ) + + # Make the request + response = client.lock_bucket_retention_policy(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.LockBucketRetentionPolicyRequest, dict]): + The request object. Request message for + LockBucketRetentionPolicyRequest. + bucket (str): + Required. Name of a bucket. + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.LockBucketRetentionPolicyRequest): + request = storage.LockBucketRetentionPolicyRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[ + self._transport.lock_bucket_retention_policy + ] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def get_iam_policy( + self, + request: Optional[Union[iam_policy_pb2.GetIamPolicyRequest, dict]] = None, + *, + resource: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> policy_pb2.Policy: + r"""Gets the IAM policy for a specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + from google.iam.v1 import iam_policy_pb2 # type: ignore + + def sample_get_iam_policy(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = iam_policy_pb2.GetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = client.get_iam_policy(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.iam.v1.iam_policy_pb2.GetIamPolicyRequest, dict]): + The request object. Request message for ``GetIamPolicy`` method. + resource (str): + REQUIRED: The resource for which the + policy is being requested. See the + operation documentation for the + appropriate value for this field. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.iam.v1.policy_pb2.Policy: + An Identity and Access Management (IAM) policy, which specifies access + controls for Google Cloud resources. + + A Policy is a collection of bindings. A binding binds + one or more members, or principals, to a single role. + Principals can be user accounts, service accounts, + Google groups, and domains (such as G Suite). A role + is a named list of permissions; each role can be an + IAM predefined role or a user-created custom role. + + For some types of Google Cloud resources, a binding + can also specify a condition, which is a logical + expression that allows access to a resource only if + the expression evaluates to true. A condition can add + constraints based on attributes of the request, the + resource, or both. To learn which resources support + conditions in their IAM policies, see the [IAM + documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + + **JSON example:** + + :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + + **YAML example:** + + :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + + For a description of IAM and its features, see the + [IAM + documentation](\ https://cloud.google.com/iam/docs/). + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + if isinstance(request, dict): + # - The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + request = iam_policy_pb2.GetIamPolicyRequest(**request) + elif not request: + # Null request, just make one. + request = iam_policy_pb2.GetIamPolicyRequest() + if resource is not None: + request.resource = resource + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_iam_policy] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def set_iam_policy( + self, + request: Optional[Union[iam_policy_pb2.SetIamPolicyRequest, dict]] = None, + *, + resource: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> policy_pb2.Policy: + r"""Updates an IAM policy for the specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + from google.iam.v1 import iam_policy_pb2 # type: ignore + + def sample_set_iam_policy(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = iam_policy_pb2.SetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = client.set_iam_policy(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.iam.v1.iam_policy_pb2.SetIamPolicyRequest, dict]): + The request object. Request message for ``SetIamPolicy`` method. + resource (str): + REQUIRED: The resource for which the + policy is being specified. See the + operation documentation for the + appropriate value for this field. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.iam.v1.policy_pb2.Policy: + An Identity and Access Management (IAM) policy, which specifies access + controls for Google Cloud resources. + + A Policy is a collection of bindings. A binding binds + one or more members, or principals, to a single role. + Principals can be user accounts, service accounts, + Google groups, and domains (such as G Suite). A role + is a named list of permissions; each role can be an + IAM predefined role or a user-created custom role. + + For some types of Google Cloud resources, a binding + can also specify a condition, which is a logical + expression that allows access to a resource only if + the expression evaluates to true. A condition can add + constraints based on attributes of the request, the + resource, or both. To learn which resources support + conditions in their IAM policies, see the [IAM + documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + + **JSON example:** + + :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + + **YAML example:** + + :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + + For a description of IAM and its features, see the + [IAM + documentation](\ https://cloud.google.com/iam/docs/). + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + if isinstance(request, dict): + # - The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + request = iam_policy_pb2.SetIamPolicyRequest(**request) + elif not request: + # Null request, just make one. + request = iam_policy_pb2.SetIamPolicyRequest() + if resource is not None: + request.resource = resource + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.set_iam_policy] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def test_iam_permissions( + self, + request: Optional[Union[iam_policy_pb2.TestIamPermissionsRequest, dict]] = None, + *, + resource: Optional[str] = None, + permissions: Optional[MutableSequence[str]] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> iam_policy_pb2.TestIamPermissionsResponse: + r"""Tests a set of permissions on the given bucket, object, or + managed folder to see which, if any, are held by the caller. The + ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, + ``projects/_/buckets/{bucket}/objects/{object}`` for an object, + or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + from google.iam.v1 import iam_policy_pb2 # type: ignore + + def sample_test_iam_permissions(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = iam_policy_pb2.TestIamPermissionsRequest( + resource="resource_value", + permissions=['permissions_value1', 'permissions_value2'], + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest, dict]): + The request object. Request message for ``TestIamPermissions`` method. + resource (str): + REQUIRED: The resource for which the + policy detail is being requested. See + the operation documentation for the + appropriate value for this field. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + permissions (MutableSequence[str]): + The set of permissions to check for the ``resource``. + Permissions with wildcards (such as '*' or 'storage.*') + are not allowed. For more information see `IAM + Overview `__. + + This corresponds to the ``permissions`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.iam.v1.iam_policy_pb2.TestIamPermissionsResponse: + Response message for TestIamPermissions method. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [resource, permissions] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + if isinstance(request, dict): + # - The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + request = iam_policy_pb2.TestIamPermissionsRequest(**request) + elif not request: + # Null request, just make one. + request = iam_policy_pb2.TestIamPermissionsRequest() + if resource is not None: + request.resource = resource + if permissions: + request.permissions.extend(permissions) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)/objects(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)/managedFolders(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.resource) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def update_bucket( + self, + request: Optional[Union[storage.UpdateBucketRequest, dict]] = None, + *, + bucket: Optional[storage.Bucket] = None, + update_mask: Optional[field_mask_pb2.FieldMask] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Bucket: + r"""Updates a bucket. Equivalent to JSON API's + storage.buckets.patch method. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_update_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.UpdateBucketRequest( + ) + + # Make the request + response = client.update_bucket(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.UpdateBucketRequest, dict]): + The request object. Request for UpdateBucket method. + bucket (google.cloud.storage_v2.types.Bucket): + Required. The bucket to update. The bucket's ``name`` + field will be used to identify the bucket. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + update_mask (google.protobuf.field_mask_pb2.FieldMask): + Required. List of fields to be updated. + + To specify ALL fields, equivalent to the JSON API's + "update" function, specify a single field with the value + ``*``. Note: not recommended. If a new field is + introduced at a later time, an older client updating + with the ``*`` may accidentally reset the new field's + value. + + Not specifying any fields is an error. + + This corresponds to the ``update_mask`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Bucket: + A bucket. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, update_mask] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.UpdateBucketRequest): + request = storage.UpdateBucketRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if update_mask is not None: + request.update_mask = update_mask + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.update_bucket] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket.name) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def compose_object( + self, + request: Optional[Union[storage.ComposeObjectRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Concatenates a list of existing objects into a new + object in the same bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_compose_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ComposeObjectRequest( + ) + + # Make the request + response = client.compose_object(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.ComposeObjectRequest, dict]): + The request object. Request message for ComposeObject. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ComposeObjectRequest): + request = storage.ComposeObjectRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.compose_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.destination.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def delete_object( + self, + request: Optional[Union[storage.DeleteObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> None: + r"""Deletes an object and its metadata. Deletions are permanent if + versioning is not enabled for the bucket, or if the generation + parameter is used, or if `soft + delete `__ is + not enabled for the bucket. When this API is used to delete an + object from a bucket that has soft delete policy enabled, the + object becomes soft deleted, and the ``softDeleteTime`` and + ``hardDeleteTime`` properties are set on the object. This API + cannot be used to permanently delete soft-deleted objects. + Soft-deleted objects are permanently deleted according to their + ``hardDeleteTime``. + + You can use the + [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API + to restore soft-deleted objects until the soft delete retention + period has passed. + + **IAM Permissions**: + + Requires ``storage.objects.delete`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_delete_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.DeleteObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + client.delete_object(request=request) + + Args: + request (Union[google.cloud.storage_v2.types.DeleteObjectRequest, dict]): + The request object. Message for deleting an object. ``bucket`` and + ``object`` **must** be set. + bucket (str): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (str): + Required. The name of the finalized object to delete. + Note: If you want to delete an unfinalized resumable + upload please use ``CancelResumableWrite``. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (int): + Optional. If present, permanently + deletes a specific revision of this + object (as opposed to the latest + version, the default). + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.DeleteObjectRequest): + request = storage.DeleteObjectRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.delete_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + def restore_object( + self, + request: Optional[Union[storage.RestoreObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Restores a soft-deleted object. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_restore_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.RestoreObjectRequest( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Make the request + response = client.restore_object(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.RestoreObjectRequest, dict]): + The request object. Message for restoring an object. ``bucket``, ``object``, + and ``generation`` **must** be set. + bucket (str): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (str): + Required. The name of the object to + restore. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (int): + Required. The specific revision of + the object to restore. + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.RestoreObjectRequest): + request = storage.RestoreObjectRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.restore_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def cancel_resumable_write( + self, + request: Optional[Union[storage.CancelResumableWriteRequest, dict]] = None, + *, + upload_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.CancelResumableWriteResponse: + r"""Cancels an in-progress resumable upload. + + Any attempts to write to the resumable upload after + cancelling the upload will fail. + + The behavior for currently in progress write operations + is not guaranteed - they could either complete before + the cancellation or fail if the cancellation completes + first. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_cancel_resumable_write(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.CancelResumableWriteRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = client.cancel_resumable_write(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.CancelResumableWriteRequest, dict]): + The request object. Message for canceling an in-progress resumable upload. + ``upload_id`` **must** be set. + upload_id (str): + Required. The upload_id of the resumable upload to + cancel. This should be copied from the ``upload_id`` + field of ``StartResumableWriteResponse``. + + This corresponds to the ``upload_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.CancelResumableWriteResponse: + Empty response message for canceling + an in-progress resumable upload, will be + extended as needed. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [upload_id] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.CancelResumableWriteRequest): + request = storage.CancelResumableWriteRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if upload_id is not None: + request.upload_id = upload_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.cancel_resumable_write] + + header_params = {} + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.upload_id) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def get_object( + self, + request: Optional[Union[storage.GetObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Retrieves object metadata. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. To return object ACLs, the authenticated user + must also have the ``storage.objects.getIamPolicy`` permission. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_get_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.GetObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + response = client.get_object(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.GetObjectRequest, dict]): + The request object. Request message for GetObject. + bucket (str): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (str): + Required. Name of the object. + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (int): + Optional. If present, selects a + specific revision of this object (as + opposed to the latest version, the + default). + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.GetObjectRequest): + request = storage.GetObjectRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def read_object( + self, + request: Optional[Union[storage.ReadObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + object_: Optional[str] = None, + generation: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> Iterable[storage.ReadObjectResponse]: + r"""Retrieves object data. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_read_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ReadObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + stream = client.read_object(request=request) + + # Handle the response + for response in stream: + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.ReadObjectRequest, dict]): + The request object. Request message for ReadObject. + bucket (str): + Required. The name of the bucket + containing the object to read. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + object_ (str): + Required. The name of the object to + read. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + generation (int): + Optional. If present, selects a + specific revision of this object (as + opposed to the latest version, the + default). + + This corresponds to the ``generation`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + Iterable[google.cloud.storage_v2.types.ReadObjectResponse]: + Response message for ReadObject. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, object_, generation] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ReadObjectRequest): + request = storage.ReadObjectRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if object_ is not None: + request.object_ = object_ + if generation is not None: + request.generation = generation + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.read_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def bidi_read_object( + self, + requests: Optional[Iterator[storage.BidiReadObjectRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> Iterable[storage.BidiReadObjectResponse]: + r"""Reads an object's data. + + This is a bi-directional API with the added support for reading + multiple ranges within one stream both within and across + multiple messages. If the server encountered an error for any of + the inputs, the stream will be closed with the relevant error + code. Because the API allows for multiple outstanding requests, + when the stream is closed the error response will contain a + BidiReadObjectRangesError proto in the error extension + describing the error for each outstanding read_id. + + **IAM Permissions**: + + Requires ``storage.objects.get`` + + `IAM + permission `__ + on the bucket. + + This API is currently in preview and is not yet available for + general use. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_bidi_read_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.BidiReadObjectRequest( + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiReadObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.bidi_read_object(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + + Args: + requests (Iterator[google.cloud.storage_v2.types.BidiReadObjectRequest]): + The request object iterator. Request message for BidiReadObject. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + Iterable[google.cloud.storage_v2.types.BidiReadObjectResponse]: + Response message for BidiReadObject. + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.bidi_read_object] + + header_params = {} + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def update_object( + self, + request: Optional[Union[storage.UpdateObjectRequest, dict]] = None, + *, + object_: Optional[storage.Object] = None, + update_mask: Optional[field_mask_pb2.FieldMask] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Updates an object's metadata. + Equivalent to JSON API's storage.objects.patch. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_update_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.UpdateObjectRequest( + ) + + # Make the request + response = client.update_object(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.UpdateObjectRequest, dict]): + The request object. Request message for UpdateObject. + object_ (google.cloud.storage_v2.types.Object): + Required. The object to update. + The object's bucket and name fields are + used to identify the object to update. + If present, the object's generation + field selects a specific revision of + this object whose metadata should be + updated. Otherwise, assumes the live + version of the object. + + This corresponds to the ``object_`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + update_mask (google.protobuf.field_mask_pb2.FieldMask): + Required. List of fields to be updated. + + To specify ALL fields, equivalent to the JSON API's + "update" function, specify a single field with the value + ``*``. Note: not recommended. If a new field is + introduced at a later time, an older client updating + with the ``*`` may accidentally reset the new field's + value. + + Not specifying any fields is an error. + + This corresponds to the ``update_mask`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [object_, update_mask] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.UpdateObjectRequest): + request = storage.UpdateObjectRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if object_ is not None: + request.object_ = object_ + if update_mask is not None: + request.update_mask = update_mask + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.update_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.object.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def write_object( + self, + requests: Optional[Iterator[storage.WriteObjectRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.WriteObjectResponse: + r"""Stores a new object and metadata. + + An object can be written either in a single message stream or in + a resumable sequence of message streams. To write using a single + stream, the client should include in the first message of the + stream an ``WriteObjectSpec`` describing the destination bucket, + object, and any preconditions. Additionally, the final message + must set 'finish_write' to true, or else it is an error. + + For a resumable write, the client should instead call + ``StartResumableWrite()``, populating a ``WriteObjectSpec`` into + that request. They should then attach the returned ``upload_id`` + to the first message of each following call to ``WriteObject``. + If the stream is closed before finishing the upload (either + explicitly by the client or due to a network error or an error + response from the server), the client should do as follows: + + - Check the result Status of the stream, to determine if + writing can be resumed on this stream or must be restarted + from scratch (by calling ``StartResumableWrite()``). The + resumable errors are DEADLINE_EXCEEDED, INTERNAL, and + UNAVAILABLE. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after RESOURCE_EXHAUSTED errors, but only after + taking appropriate measures, which may include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single + client where the previous request was timed out on the client + side but nonetheless reached the server. In this case the + client should take steps to prevent further concurrent writes + (e.g., increase the timeouts, stop using more than one + process to perform the upload, etc.), and then should follow + the steps below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + will skip data at offsets that were already persisted + (without checking that it matches the previously written + data), and write only the data starting from the persisted + offset. Even though the data isn't written, it may still + incur a performance cost over resuming at the correct write + offset. This behavior can make client-side handling simpler + in some cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. + + The service will not view the object as complete until the + client has sent a ``WriteObjectRequest`` with ``finish_write`` + set to ``true``. Sending any requests on a stream after sending + a request with ``finish_write`` set to ``true`` will cause an + error. The client **should** check the response it receives to + determine how much data the service was able to commit and + whether the service views the object as complete. + + Attempting to resume an already finalized object will result in + an OK status, with a ``WriteObjectResponse`` containing the + finalized object's metadata. + + Alternatively, the BidiWriteObject operation may be used to + write an object with controls over flushing and the ability to + fetch the ability to determine the current persisted size. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_write_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.WriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.WriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + response = client.write_object(requests=request_generator()) + + # Handle the response + print(response) + + Args: + requests (Iterator[google.cloud.storage_v2.types.WriteObjectRequest]): + The request object iterator. Request message for WriteObject. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.WriteObjectResponse: + Response message for WriteObject. + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.write_object] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def bidi_write_object( + self, + requests: Optional[Iterator[storage.BidiWriteObjectRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> Iterable[storage.BidiWriteObjectResponse]: + r"""Stores a new object and metadata. + + This is similar to the WriteObject call with the added support + for manual flushing of persisted state, and the ability to + determine current persisted size without closing the stream. + + The client may specify one or both of the ``state_lookup`` and + ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is + specified, the data written so far will be persisted to storage. + If ``state_lookup`` is specified, the service will respond with + a BidiWriteObjectResponse that contains the persisted size. If + both ``flush`` and ``state_lookup`` are specified, the flush + will always occur before a ``state_lookup``, so that both may be + set in the same request and the returned state will be the state + of the object post-flush. When the stream is closed, a + BidiWriteObjectResponse will always be sent to the client, + regardless of the value of ``state_lookup``. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_bidi_write_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.BidiWriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiWriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.bidi_write_object(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + + Args: + requests (Iterator[google.cloud.storage_v2.types.BidiWriteObjectRequest]): + The request object iterator. Request message for BidiWriteObject. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + Iterable[google.cloud.storage_v2.types.BidiWriteObjectResponse]: + Response message for BidiWriteObject. + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.bidi_write_object] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def list_objects( + self, + request: Optional[Union[storage.ListObjectsRequest, dict]] = None, + *, + parent: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> pagers.ListObjectsPager: + r"""Retrieves a list of objects matching the criteria. + + **IAM Permissions**: + + The authenticated user requires ``storage.objects.list`` `IAM + permission `__ + to use this method. To return object ACLs, the authenticated + user must also have the ``storage.objects.getIamPolicy`` + permission. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_list_objects(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ListObjectsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_objects(request=request) + + # Handle the response + for response in page_result: + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.ListObjectsRequest, dict]): + The request object. Request message for ListObjects. + parent (str): + Required. Name of the bucket in which + to look for objects. + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.services.storage.pagers.ListObjectsPager: + The result of a call to + Objects.ListObjects + Iterating over this object will yield + results and resolve additional pages + automatically. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [parent] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.ListObjectsRequest): + request = storage.ListObjectsRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_objects] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.parent) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # This method is paged; wrap the response in a pager, which provides + # an `__iter__` convenience method. + response = pagers.ListObjectsPager( + method=rpc, + request=request, + response=response, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def rewrite_object( + self, + request: Optional[Union[storage.RewriteObjectRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.RewriteResponse: + r"""Rewrites a source object to a destination object. + Optionally overrides metadata. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_rewrite_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.RewriteObjectRequest( + destination_name="destination_name_value", + destination_bucket="destination_bucket_value", + source_bucket="source_bucket_value", + source_object="source_object_value", + ) + + # Make the request + response = client.rewrite_object(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.RewriteObjectRequest, dict]): + The request object. Request message for RewriteObject. If the source object + is encrypted using a Customer-Supplied Encryption Key + the key information must be provided in the + copy_source_encryption_algorithm, + copy_source_encryption_key_bytes, and + copy_source_encryption_key_sha256_bytes fields. If the + destination object should be encrypted the keying + information should be provided in the + encryption_algorithm, encryption_key_bytes, and + encryption_key_sha256_bytes fields of the + common_object_request_params.customer_encryption field. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.RewriteResponse: + A rewrite response. + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.RewriteObjectRequest): + request = storage.RewriteObjectRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.rewrite_object] + + header_params = {} + + if request.source_bucket: + header_params["source_bucket"] = request.source_bucket + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.destination_bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def start_resumable_write( + self, + request: Optional[Union[storage.StartResumableWriteRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.StartResumableWriteResponse: + r"""Starts a resumable write operation. This method is part of the + `Resumable + upload `__ + feature. This allows you to upload large objects in multiple + chunks, which is more resilient to network interruptions than a + single upload. The validity duration of the write operation, and + the consequences of it becoming invalid, are service-dependent. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_start_resumable_write(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.StartResumableWriteRequest( + ) + + # Make the request + response = client.start_resumable_write(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.StartResumableWriteRequest, dict]): + The request object. Request message StartResumableWrite. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.StartResumableWriteResponse: + Response object for StartResumableWrite. + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.StartResumableWriteRequest): + request = storage.StartResumableWriteRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.start_resumable_write] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match( + request.write_object_spec.resource.bucket + ) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def query_write_status( + self, + request: Optional[Union[storage.QueryWriteStatusRequest, dict]] = None, + *, + upload_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.QueryWriteStatusResponse: + r"""Determines the ``persisted_size`` of an object that is being + written. This method is part of the `resumable + upload `__ + feature. The returned value is the size of the object that has + been persisted so far. The value can be used as the + ``write_offset`` for the next ``Write()`` call. + + If the object does not exist, meaning if it was deleted, or the + first ``Write()`` has not yet reached the service, this method + returns the error ``NOT_FOUND``. + + This method is useful for clients that buffer data and need to + know which data can be safely evicted. The client can call + ``QueryWriteStatus()`` at any time to determine how much data + has been logged for this object. For any sequence of + ``QueryWriteStatus()`` calls for a given object name, the + sequence of returned ``persisted_size`` values are + non-decreasing. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_query_write_status(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.QueryWriteStatusRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = client.query_write_status(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.QueryWriteStatusRequest, dict]): + The request object. Request object for ``QueryWriteStatus``. + upload_id (str): + Required. The name of the resume + token for the object whose write status + is being requested. + + This corresponds to the ``upload_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.QueryWriteStatusResponse: + Response object for QueryWriteStatus. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [upload_id] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.QueryWriteStatusRequest): + request = storage.QueryWriteStatusRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if upload_id is not None: + request.upload_id = upload_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.query_write_status] + + header_params = {} + + routing_param_regex = re.compile( + "^(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?$" + ) + regex_match = routing_param_regex.match(request.upload_id) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def move_object( + self, + request: Optional[Union[storage.MoveObjectRequest, dict]] = None, + *, + bucket: Optional[str] = None, + source_object: Optional[str] = None, + destination_object: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> storage.Object: + r"""Moves the source object to the destination object in + the same bucket. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import storage_v2 + + def sample_move_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.MoveObjectRequest( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Make the request + response = client.move_object(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.storage_v2.types.MoveObjectRequest, dict]): + The request object. Request message for MoveObject. + bucket (str): + Required. Name of the bucket in which + the object resides. + + This corresponds to the ``bucket`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + source_object (str): + Required. Name of the source object. + This corresponds to the ``source_object`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + destination_object (str): + Required. Name of the destination + object. + + This corresponds to the ``destination_object`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.storage_v2.types.Object: + An object. + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [bucket, source_object, destination_object] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, storage.MoveObjectRequest): + request = storage.MoveObjectRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if bucket is not None: + request.bucket = bucket + if source_object is not None: + request.source_object = source_object + if destination_object is not None: + request.destination_object = destination_object + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.move_object] + + header_params = {} + + routing_param_regex = re.compile("^(?P.*)$") + regex_match = routing_param_regex.match(request.bucket) + if regex_match and regex_match.group("bucket"): + header_params["bucket"] = regex_match.group("bucket") + + if header_params: + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(header_params), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def __enter__(self) -> "StorageClient": + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) + +if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"): # pragma: NO COVER + DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__ + +__all__ = ("StorageClient",) diff --git a/google/cloud/storage_v2/services/storage/pagers.py b/google/cloud/storage_v2/services/storage/pagers.py new file mode 100644 index 000000000..79aa18984 --- /dev/null +++ b/google/cloud/storage_v2/services/storage/pagers.py @@ -0,0 +1,352 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.api_core import retry_async as retries_async +from typing import ( + Any, + AsyncIterator, + Awaitable, + Callable, + Sequence, + Tuple, + Optional, + Iterator, + Union, +) + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] + OptionalAsyncRetry = Union[ + retries_async.AsyncRetry, gapic_v1.method._MethodDefault, None + ] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + OptionalAsyncRetry = Union[retries_async.AsyncRetry, object, None] # type: ignore + +from google.cloud.storage_v2.types import storage + + +class ListBucketsPager: + """A pager for iterating through ``list_buckets`` requests. + + This class thinly wraps an initial + :class:`google.cloud.storage_v2.types.ListBucketsResponse` object, and + provides an ``__iter__`` method to iterate through its + ``buckets`` field. + + If there are more pages, the ``__iter__`` method will make additional + ``ListBuckets`` requests and continue to iterate + through the ``buckets`` field on the + corresponding responses. + + All the usual :class:`google.cloud.storage_v2.types.ListBucketsResponse` + attributes are available on the pager. If multiple requests are made, only + the most recent response is retained, and thus used for attribute lookup. + """ + + def __init__( + self, + method: Callable[..., storage.ListBucketsResponse], + request: storage.ListBucketsRequest, + response: storage.ListBucketsResponse, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = () + ): + """Instantiate the pager. + + Args: + method (Callable): The method that was originally called, and + which instantiated this pager. + request (google.cloud.storage_v2.types.ListBucketsRequest): + The initial request object. + response (google.cloud.storage_v2.types.ListBucketsResponse): + The initial response object. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + self._method = method + self._request = storage.ListBucketsRequest(request) + self._response = response + self._retry = retry + self._timeout = timeout + self._metadata = metadata + + def __getattr__(self, name: str) -> Any: + return getattr(self._response, name) + + @property + def pages(self) -> Iterator[storage.ListBucketsResponse]: + yield self._response + while self._response.next_page_token: + self._request.page_token = self._response.next_page_token + self._response = self._method( + self._request, + retry=self._retry, + timeout=self._timeout, + metadata=self._metadata, + ) + yield self._response + + def __iter__(self) -> Iterator[storage.Bucket]: + for page in self.pages: + yield from page.buckets + + def __repr__(self) -> str: + return "{0}<{1!r}>".format(self.__class__.__name__, self._response) + + +class ListBucketsAsyncPager: + """A pager for iterating through ``list_buckets`` requests. + + This class thinly wraps an initial + :class:`google.cloud.storage_v2.types.ListBucketsResponse` object, and + provides an ``__aiter__`` method to iterate through its + ``buckets`` field. + + If there are more pages, the ``__aiter__`` method will make additional + ``ListBuckets`` requests and continue to iterate + through the ``buckets`` field on the + corresponding responses. + + All the usual :class:`google.cloud.storage_v2.types.ListBucketsResponse` + attributes are available on the pager. If multiple requests are made, only + the most recent response is retained, and thus used for attribute lookup. + """ + + def __init__( + self, + method: Callable[..., Awaitable[storage.ListBucketsResponse]], + request: storage.ListBucketsRequest, + response: storage.ListBucketsResponse, + *, + retry: OptionalAsyncRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = () + ): + """Instantiates the pager. + + Args: + method (Callable): The method that was originally called, and + which instantiated this pager. + request (google.cloud.storage_v2.types.ListBucketsRequest): + The initial request object. + response (google.cloud.storage_v2.types.ListBucketsResponse): + The initial response object. + retry (google.api_core.retry.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + self._method = method + self._request = storage.ListBucketsRequest(request) + self._response = response + self._retry = retry + self._timeout = timeout + self._metadata = metadata + + def __getattr__(self, name: str) -> Any: + return getattr(self._response, name) + + @property + async def pages(self) -> AsyncIterator[storage.ListBucketsResponse]: + yield self._response + while self._response.next_page_token: + self._request.page_token = self._response.next_page_token + self._response = await self._method( + self._request, + retry=self._retry, + timeout=self._timeout, + metadata=self._metadata, + ) + yield self._response + + def __aiter__(self) -> AsyncIterator[storage.Bucket]: + async def async_generator(): + async for page in self.pages: + for response in page.buckets: + yield response + + return async_generator() + + def __repr__(self) -> str: + return "{0}<{1!r}>".format(self.__class__.__name__, self._response) + + +class ListObjectsPager: + """A pager for iterating through ``list_objects`` requests. + + This class thinly wraps an initial + :class:`google.cloud.storage_v2.types.ListObjectsResponse` object, and + provides an ``__iter__`` method to iterate through its + ``objects`` field. + + If there are more pages, the ``__iter__`` method will make additional + ``ListObjects`` requests and continue to iterate + through the ``objects`` field on the + corresponding responses. + + All the usual :class:`google.cloud.storage_v2.types.ListObjectsResponse` + attributes are available on the pager. If multiple requests are made, only + the most recent response is retained, and thus used for attribute lookup. + """ + + def __init__( + self, + method: Callable[..., storage.ListObjectsResponse], + request: storage.ListObjectsRequest, + response: storage.ListObjectsResponse, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = () + ): + """Instantiate the pager. + + Args: + method (Callable): The method that was originally called, and + which instantiated this pager. + request (google.cloud.storage_v2.types.ListObjectsRequest): + The initial request object. + response (google.cloud.storage_v2.types.ListObjectsResponse): + The initial response object. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + self._method = method + self._request = storage.ListObjectsRequest(request) + self._response = response + self._retry = retry + self._timeout = timeout + self._metadata = metadata + + def __getattr__(self, name: str) -> Any: + return getattr(self._response, name) + + @property + def pages(self) -> Iterator[storage.ListObjectsResponse]: + yield self._response + while self._response.next_page_token: + self._request.page_token = self._response.next_page_token + self._response = self._method( + self._request, + retry=self._retry, + timeout=self._timeout, + metadata=self._metadata, + ) + yield self._response + + def __iter__(self) -> Iterator[storage.Object]: + for page in self.pages: + yield from page.objects + + def __repr__(self) -> str: + return "{0}<{1!r}>".format(self.__class__.__name__, self._response) + + +class ListObjectsAsyncPager: + """A pager for iterating through ``list_objects`` requests. + + This class thinly wraps an initial + :class:`google.cloud.storage_v2.types.ListObjectsResponse` object, and + provides an ``__aiter__`` method to iterate through its + ``objects`` field. + + If there are more pages, the ``__aiter__`` method will make additional + ``ListObjects`` requests and continue to iterate + through the ``objects`` field on the + corresponding responses. + + All the usual :class:`google.cloud.storage_v2.types.ListObjectsResponse` + attributes are available on the pager. If multiple requests are made, only + the most recent response is retained, and thus used for attribute lookup. + """ + + def __init__( + self, + method: Callable[..., Awaitable[storage.ListObjectsResponse]], + request: storage.ListObjectsRequest, + response: storage.ListObjectsResponse, + *, + retry: OptionalAsyncRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = () + ): + """Instantiates the pager. + + Args: + method (Callable): The method that was originally called, and + which instantiated this pager. + request (google.cloud.storage_v2.types.ListObjectsRequest): + The initial request object. + response (google.cloud.storage_v2.types.ListObjectsResponse): + The initial response object. + retry (google.api_core.retry.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + """ + self._method = method + self._request = storage.ListObjectsRequest(request) + self._response = response + self._retry = retry + self._timeout = timeout + self._metadata = metadata + + def __getattr__(self, name: str) -> Any: + return getattr(self._response, name) + + @property + async def pages(self) -> AsyncIterator[storage.ListObjectsResponse]: + yield self._response + while self._response.next_page_token: + self._request.page_token = self._response.next_page_token + self._response = await self._method( + self._request, + retry=self._retry, + timeout=self._timeout, + metadata=self._metadata, + ) + yield self._response + + def __aiter__(self) -> AsyncIterator[storage.Object]: + async def async_generator(): + async for page in self.pages: + for response in page.objects: + yield response + + return async_generator() + + def __repr__(self) -> str: + return "{0}<{1!r}>".format(self.__class__.__name__, self._response) diff --git a/google/cloud/storage_v2/services/storage/transports/README.rst b/google/cloud/storage_v2/services/storage/transports/README.rst new file mode 100644 index 000000000..803b98632 --- /dev/null +++ b/google/cloud/storage_v2/services/storage/transports/README.rst @@ -0,0 +1,9 @@ + +transport inheritance structure +_______________________________ + +`StorageTransport` is the ABC for all transports. +- public child `StorageGrpcTransport` for sync gRPC transport (defined in `grpc.py`). +- public child `StorageGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). +- private child `_BaseStorageRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). +- public child `StorageRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/google/cloud/storage_v2/services/storage/transports/__init__.py b/google/cloud/storage_v2/services/storage/transports/__init__.py new file mode 100644 index 000000000..51802f9c5 --- /dev/null +++ b/google/cloud/storage_v2/services/storage/transports/__init__.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from collections import OrderedDict +from typing import Dict, Type + +from .base import StorageTransport +from .grpc import StorageGrpcTransport +from .grpc_asyncio import StorageGrpcAsyncIOTransport + + +# Compile a registry of transports. +_transport_registry = OrderedDict() # type: Dict[str, Type[StorageTransport]] +_transport_registry["grpc"] = StorageGrpcTransport +_transport_registry["grpc_asyncio"] = StorageGrpcAsyncIOTransport + +__all__ = ( + "StorageTransport", + "StorageGrpcTransport", + "StorageGrpcAsyncIOTransport", +) diff --git a/google/cloud/storage_v2/services/storage/transports/base.py b/google/cloud/storage_v2/services/storage/transports/base.py new file mode 100644 index 000000000..ea82adddc --- /dev/null +++ b/google/cloud/storage_v2/services/storage/transports/base.py @@ -0,0 +1,506 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import abc +from typing import Awaitable, Callable, Dict, Optional, Sequence, Union + +from google.cloud.storage_v2 import gapic_version as package_version + +import google.auth # type: ignore +import google.api_core +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore +import google.protobuf + +from google.cloud.storage_v2.types import storage +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.longrunning import operations_pb2 # type: ignore +from google.protobuf import empty_pb2 # type: ignore + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) + +if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"): # pragma: NO COVER + DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__ + + +class StorageTransport(abc.ABC): + """Abstract transport class for Storage.""" + + AUTH_SCOPES = ( + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write", + ) + + DEFAULT_HOST: str = "storage.googleapis.com" + + def __init__( + self, + *, + host: str = DEFAULT_HOST, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + **kwargs, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'storage.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A list of scopes. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + """ + + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} + + # Save the scopes. + self._scopes = scopes + if not hasattr(self, "_ignore_credentials"): + self._ignore_credentials: bool = False + + # If no credentials are provided, then determine the appropriate + # defaults. + if credentials and credentials_file: + raise core_exceptions.DuplicateCredentialArgs( + "'credentials_file' and 'credentials' are mutually exclusive" + ) + + if credentials_file is not None: + credentials, _ = google.auth.load_credentials_from_file( + credentials_file, **scopes_kwargs, quota_project_id=quota_project_id + ) + elif credentials is None and not self._ignore_credentials: + credentials, _ = google.auth.default( + **scopes_kwargs, quota_project_id=quota_project_id + ) + # Don't apply audience if the credentials file passed from user. + if hasattr(credentials, "with_gdch_audience"): + credentials = credentials.with_gdch_audience( + api_audience if api_audience else host + ) + + # If the credentials are service account credentials, then always try to use self signed JWT. + if ( + always_use_jwt_access + and isinstance(credentials, service_account.Credentials) + and hasattr(service_account.Credentials, "with_always_use_jwt_access") + ): + credentials = credentials.with_always_use_jwt_access(True) + + # Save the credentials. + self._credentials = credentials + + # Save the hostname. Default to port 443 (HTTPS) if none is specified. + if ":" not in host: + host += ":443" + self._host = host + + @property + def host(self): + return self._host + + def _prep_wrapped_messages(self, client_info): + # Precompute the wrapped methods. + self._wrapped_methods = { + self.delete_bucket: gapic_v1.method.wrap_method( + self.delete_bucket, + default_timeout=None, + client_info=client_info, + ), + self.get_bucket: gapic_v1.method.wrap_method( + self.get_bucket, + default_timeout=None, + client_info=client_info, + ), + self.create_bucket: gapic_v1.method.wrap_method( + self.create_bucket, + default_timeout=None, + client_info=client_info, + ), + self.list_buckets: gapic_v1.method.wrap_method( + self.list_buckets, + default_timeout=None, + client_info=client_info, + ), + self.lock_bucket_retention_policy: gapic_v1.method.wrap_method( + self.lock_bucket_retention_policy, + default_timeout=None, + client_info=client_info, + ), + self.get_iam_policy: gapic_v1.method.wrap_method( + self.get_iam_policy, + default_timeout=None, + client_info=client_info, + ), + self.set_iam_policy: gapic_v1.method.wrap_method( + self.set_iam_policy, + default_timeout=None, + client_info=client_info, + ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), + self.update_bucket: gapic_v1.method.wrap_method( + self.update_bucket, + default_timeout=None, + client_info=client_info, + ), + self.compose_object: gapic_v1.method.wrap_method( + self.compose_object, + default_timeout=None, + client_info=client_info, + ), + self.delete_object: gapic_v1.method.wrap_method( + self.delete_object, + default_timeout=None, + client_info=client_info, + ), + self.restore_object: gapic_v1.method.wrap_method( + self.restore_object, + default_timeout=None, + client_info=client_info, + ), + self.cancel_resumable_write: gapic_v1.method.wrap_method( + self.cancel_resumable_write, + default_timeout=None, + client_info=client_info, + ), + self.get_object: gapic_v1.method.wrap_method( + self.get_object, + default_timeout=None, + client_info=client_info, + ), + self.read_object: gapic_v1.method.wrap_method( + self.read_object, + default_timeout=None, + client_info=client_info, + ), + self.bidi_read_object: gapic_v1.method.wrap_method( + self.bidi_read_object, + default_timeout=None, + client_info=client_info, + ), + self.update_object: gapic_v1.method.wrap_method( + self.update_object, + default_timeout=None, + client_info=client_info, + ), + self.write_object: gapic_v1.method.wrap_method( + self.write_object, + default_timeout=None, + client_info=client_info, + ), + self.bidi_write_object: gapic_v1.method.wrap_method( + self.bidi_write_object, + default_timeout=None, + client_info=client_info, + ), + self.list_objects: gapic_v1.method.wrap_method( + self.list_objects, + default_timeout=None, + client_info=client_info, + ), + self.rewrite_object: gapic_v1.method.wrap_method( + self.rewrite_object, + default_timeout=None, + client_info=client_info, + ), + self.start_resumable_write: gapic_v1.method.wrap_method( + self.start_resumable_write, + default_timeout=None, + client_info=client_info, + ), + self.query_write_status: gapic_v1.method.wrap_method( + self.query_write_status, + default_timeout=None, + client_info=client_info, + ), + self.move_object: gapic_v1.method.wrap_method( + self.move_object, + default_timeout=None, + client_info=client_info, + ), + } + + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + + @property + def delete_bucket( + self, + ) -> Callable[ + [storage.DeleteBucketRequest], + Union[empty_pb2.Empty, Awaitable[empty_pb2.Empty]], + ]: + raise NotImplementedError() + + @property + def get_bucket( + self, + ) -> Callable[ + [storage.GetBucketRequest], Union[storage.Bucket, Awaitable[storage.Bucket]] + ]: + raise NotImplementedError() + + @property + def create_bucket( + self, + ) -> Callable[ + [storage.CreateBucketRequest], Union[storage.Bucket, Awaitable[storage.Bucket]] + ]: + raise NotImplementedError() + + @property + def list_buckets( + self, + ) -> Callable[ + [storage.ListBucketsRequest], + Union[storage.ListBucketsResponse, Awaitable[storage.ListBucketsResponse]], + ]: + raise NotImplementedError() + + @property + def lock_bucket_retention_policy( + self, + ) -> Callable[ + [storage.LockBucketRetentionPolicyRequest], + Union[storage.Bucket, Awaitable[storage.Bucket]], + ]: + raise NotImplementedError() + + @property + def get_iam_policy( + self, + ) -> Callable[ + [iam_policy_pb2.GetIamPolicyRequest], + Union[policy_pb2.Policy, Awaitable[policy_pb2.Policy]], + ]: + raise NotImplementedError() + + @property + def set_iam_policy( + self, + ) -> Callable[ + [iam_policy_pb2.SetIamPolicyRequest], + Union[policy_pb2.Policy, Awaitable[policy_pb2.Policy]], + ]: + raise NotImplementedError() + + @property + def test_iam_permissions( + self, + ) -> Callable[ + [iam_policy_pb2.TestIamPermissionsRequest], + Union[ + iam_policy_pb2.TestIamPermissionsResponse, + Awaitable[iam_policy_pb2.TestIamPermissionsResponse], + ], + ]: + raise NotImplementedError() + + @property + def update_bucket( + self, + ) -> Callable[ + [storage.UpdateBucketRequest], Union[storage.Bucket, Awaitable[storage.Bucket]] + ]: + raise NotImplementedError() + + @property + def compose_object( + self, + ) -> Callable[ + [storage.ComposeObjectRequest], Union[storage.Object, Awaitable[storage.Object]] + ]: + raise NotImplementedError() + + @property + def delete_object( + self, + ) -> Callable[ + [storage.DeleteObjectRequest], + Union[empty_pb2.Empty, Awaitable[empty_pb2.Empty]], + ]: + raise NotImplementedError() + + @property + def restore_object( + self, + ) -> Callable[ + [storage.RestoreObjectRequest], Union[storage.Object, Awaitable[storage.Object]] + ]: + raise NotImplementedError() + + @property + def cancel_resumable_write( + self, + ) -> Callable[ + [storage.CancelResumableWriteRequest], + Union[ + storage.CancelResumableWriteResponse, + Awaitable[storage.CancelResumableWriteResponse], + ], + ]: + raise NotImplementedError() + + @property + def get_object( + self, + ) -> Callable[ + [storage.GetObjectRequest], Union[storage.Object, Awaitable[storage.Object]] + ]: + raise NotImplementedError() + + @property + def read_object( + self, + ) -> Callable[ + [storage.ReadObjectRequest], + Union[storage.ReadObjectResponse, Awaitable[storage.ReadObjectResponse]], + ]: + raise NotImplementedError() + + @property + def bidi_read_object( + self, + ) -> Callable[ + [storage.BidiReadObjectRequest], + Union[ + storage.BidiReadObjectResponse, Awaitable[storage.BidiReadObjectResponse] + ], + ]: + raise NotImplementedError() + + @property + def update_object( + self, + ) -> Callable[ + [storage.UpdateObjectRequest], Union[storage.Object, Awaitable[storage.Object]] + ]: + raise NotImplementedError() + + @property + def write_object( + self, + ) -> Callable[ + [storage.WriteObjectRequest], + Union[storage.WriteObjectResponse, Awaitable[storage.WriteObjectResponse]], + ]: + raise NotImplementedError() + + @property + def bidi_write_object( + self, + ) -> Callable[ + [storage.BidiWriteObjectRequest], + Union[ + storage.BidiWriteObjectResponse, Awaitable[storage.BidiWriteObjectResponse] + ], + ]: + raise NotImplementedError() + + @property + def list_objects( + self, + ) -> Callable[ + [storage.ListObjectsRequest], + Union[storage.ListObjectsResponse, Awaitable[storage.ListObjectsResponse]], + ]: + raise NotImplementedError() + + @property + def rewrite_object( + self, + ) -> Callable[ + [storage.RewriteObjectRequest], + Union[storage.RewriteResponse, Awaitable[storage.RewriteResponse]], + ]: + raise NotImplementedError() + + @property + def start_resumable_write( + self, + ) -> Callable[ + [storage.StartResumableWriteRequest], + Union[ + storage.StartResumableWriteResponse, + Awaitable[storage.StartResumableWriteResponse], + ], + ]: + raise NotImplementedError() + + @property + def query_write_status( + self, + ) -> Callable[ + [storage.QueryWriteStatusRequest], + Union[ + storage.QueryWriteStatusResponse, + Awaitable[storage.QueryWriteStatusResponse], + ], + ]: + raise NotImplementedError() + + @property + def move_object( + self, + ) -> Callable[ + [storage.MoveObjectRequest], Union[storage.Object, Awaitable[storage.Object]] + ]: + raise NotImplementedError() + + @property + def kind(self) -> str: + raise NotImplementedError() + + +__all__ = ("StorageTransport",) diff --git a/google/cloud/storage_v2/services/storage/transports/grpc.py b/google/cloud/storage_v2/services/storage/transports/grpc.py new file mode 100644 index 000000000..6d5bbca85 --- /dev/null +++ b/google/cloud/storage_v2/services/storage/transports/grpc.py @@ -0,0 +1,1185 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import json +import logging as std_logging +import pickle +import warnings +from typing import Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import grpc_helpers +from google.api_core import gapic_v1 +import google.auth # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.protobuf.json_format import MessageToJson +import google.protobuf.message + +import grpc # type: ignore +import proto # type: ignore + +from google.cloud.storage_v2.types import storage +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.longrunning import operations_pb2 # type: ignore +from google.protobuf import empty_pb2 # type: ignore +from .base import StorageTransport, DEFAULT_CLIENT_INFO + +try: + from google.api_core import client_logging # type: ignore + + CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER +except ImportError: # pragma: NO COVER + CLIENT_LOGGING_SUPPORTED = False + +_LOGGER = std_logging.getLogger(__name__) + + +class _LoggingClientInterceptor(grpc.UnaryUnaryClientInterceptor): # pragma: NO COVER + def intercept_unary_unary(self, continuation, client_call_details, request): + logging_enabled = CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + std_logging.DEBUG + ) + if logging_enabled: # pragma: NO COVER + request_metadata = client_call_details.metadata + if isinstance(request, proto.Message): + request_payload = type(request).to_json(request) + elif isinstance(request, google.protobuf.message.Message): + request_payload = MessageToJson(request) + else: + request_payload = f"{type(request).__name__}: {pickle.dumps(request)}" + + request_metadata = { + key: value.decode("utf-8") if isinstance(value, bytes) else value + for key, value in request_metadata + } + grpc_request = { + "payload": request_payload, + "requestMethod": "grpc", + "metadata": dict(request_metadata), + } + _LOGGER.debug( + f"Sending request for {client_call_details.method}", + extra={ + "serviceName": "google.storage.v2.Storage", + "rpcName": str(client_call_details.method), + "request": grpc_request, + "metadata": grpc_request["metadata"], + }, + ) + response = continuation(client_call_details, request) + if logging_enabled: # pragma: NO COVER + response_metadata = response.trailing_metadata() + # Convert gRPC metadata `` to list of tuples + metadata = ( + dict([(k, str(v)) for k, v in response_metadata]) + if response_metadata + else None + ) + result = response.result() + if isinstance(result, proto.Message): + response_payload = type(result).to_json(result) + elif isinstance(result, google.protobuf.message.Message): + response_payload = MessageToJson(result) + else: + response_payload = f"{type(result).__name__}: {pickle.dumps(result)}" + grpc_response = { + "payload": response_payload, + "metadata": metadata, + "status": "OK", + } + _LOGGER.debug( + f"Received response for {client_call_details.method}.", + extra={ + "serviceName": "google.storage.v2.Storage", + "rpcName": client_call_details.method, + "response": grpc_response, + "metadata": grpc_response["metadata"], + }, + ) + return response + + +class StorageGrpcTransport(StorageTransport): + """gRPC backend transport for Storage. + + API Overview and Naming Syntax + ------------------------------ + + The Cloud Storage gRPC API allows applications to read and write + data through the abstractions of buckets and objects. For a + description of these abstractions please see + https://cloud.google.com/storage/docs. + + Resources are named as follows: + + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. + + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. + + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. + For example: + + ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _stubs: Dict[str, Callable] + + def __init__( + self, + *, + host: str = "storage.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'storage.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if a ``channel`` instance is provided. + channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, grpc.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + self._interceptor = _LoggingClientInterceptor() + self._logged_channel = grpc.intercept_channel( + self._grpc_channel, self._interceptor + ) + + # Wrap messages. This must be done after self._logged_channel exists + self._prep_wrapped_messages(client_info) + + @classmethod + def create_channel( + cls, + host: str = "storage.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs, + ) -> grpc.Channel: + """Create and return a gRPC channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + grpc.Channel: A gRPC channel object. + + Raises: + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + + return grpc_helpers.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs, + ) + + @property + def grpc_channel(self) -> grpc.Channel: + """Return the channel designed to connect to this service.""" + return self._grpc_channel + + @property + def delete_bucket(self) -> Callable[[storage.DeleteBucketRequest], empty_pb2.Empty]: + r"""Return a callable for the delete bucket method over gRPC. + + Permanently deletes an empty bucket. + + Returns: + Callable[[~.DeleteBucketRequest], + ~.Empty]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "delete_bucket" not in self._stubs: + self._stubs["delete_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/DeleteBucket", + request_serializer=storage.DeleteBucketRequest.serialize, + response_deserializer=empty_pb2.Empty.FromString, + ) + return self._stubs["delete_bucket"] + + @property + def get_bucket(self) -> Callable[[storage.GetBucketRequest], storage.Bucket]: + r"""Return a callable for the get bucket method over gRPC. + + Returns metadata for the specified bucket. + + Returns: + Callable[[~.GetBucketRequest], + ~.Bucket]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_bucket" not in self._stubs: + self._stubs["get_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/GetBucket", + request_serializer=storage.GetBucketRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["get_bucket"] + + @property + def create_bucket(self) -> Callable[[storage.CreateBucketRequest], storage.Bucket]: + r"""Return a callable for the create bucket method over gRPC. + + Creates a new bucket. + + Returns: + Callable[[~.CreateBucketRequest], + ~.Bucket]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "create_bucket" not in self._stubs: + self._stubs["create_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/CreateBucket", + request_serializer=storage.CreateBucketRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["create_bucket"] + + @property + def list_buckets( + self, + ) -> Callable[[storage.ListBucketsRequest], storage.ListBucketsResponse]: + r"""Return a callable for the list buckets method over gRPC. + + Retrieves a list of buckets for a given project. + + Returns: + Callable[[~.ListBucketsRequest], + ~.ListBucketsResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_buckets" not in self._stubs: + self._stubs["list_buckets"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/ListBuckets", + request_serializer=storage.ListBucketsRequest.serialize, + response_deserializer=storage.ListBucketsResponse.deserialize, + ) + return self._stubs["list_buckets"] + + @property + def lock_bucket_retention_policy( + self, + ) -> Callable[[storage.LockBucketRetentionPolicyRequest], storage.Bucket]: + r"""Return a callable for the lock bucket retention policy method over gRPC. + + Locks retention policy on a bucket. + + Returns: + Callable[[~.LockBucketRetentionPolicyRequest], + ~.Bucket]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "lock_bucket_retention_policy" not in self._stubs: + self._stubs[ + "lock_bucket_retention_policy" + ] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/LockBucketRetentionPolicy", + request_serializer=storage.LockBucketRetentionPolicyRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["lock_bucket_retention_policy"] + + @property + def get_iam_policy( + self, + ) -> Callable[[iam_policy_pb2.GetIamPolicyRequest], policy_pb2.Policy]: + r"""Return a callable for the get iam policy method over gRPC. + + Gets the IAM policy for a specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + Returns: + Callable[[~.GetIamPolicyRequest], + ~.Policy]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_iam_policy" not in self._stubs: + self._stubs["get_iam_policy"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/GetIamPolicy", + request_serializer=iam_policy_pb2.GetIamPolicyRequest.SerializeToString, + response_deserializer=policy_pb2.Policy.FromString, + ) + return self._stubs["get_iam_policy"] + + @property + def set_iam_policy( + self, + ) -> Callable[[iam_policy_pb2.SetIamPolicyRequest], policy_pb2.Policy]: + r"""Return a callable for the set iam policy method over gRPC. + + Updates an IAM policy for the specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + Returns: + Callable[[~.SetIamPolicyRequest], + ~.Policy]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "set_iam_policy" not in self._stubs: + self._stubs["set_iam_policy"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/SetIamPolicy", + request_serializer=iam_policy_pb2.SetIamPolicyRequest.SerializeToString, + response_deserializer=policy_pb2.Policy.FromString, + ) + return self._stubs["set_iam_policy"] + + @property + def test_iam_permissions( + self, + ) -> Callable[ + [iam_policy_pb2.TestIamPermissionsRequest], + iam_policy_pb2.TestIamPermissionsResponse, + ]: + r"""Return a callable for the test iam permissions method over gRPC. + + Tests a set of permissions on the given bucket, object, or + managed folder to see which, if any, are held by the caller. The + ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, + ``projects/_/buckets/{bucket}/objects/{object}`` for an object, + or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + Returns: + Callable[[~.TestIamPermissionsRequest], + ~.TestIamPermissionsResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "test_iam_permissions" not in self._stubs: + self._stubs["test_iam_permissions"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/TestIamPermissions", + request_serializer=iam_policy_pb2.TestIamPermissionsRequest.SerializeToString, + response_deserializer=iam_policy_pb2.TestIamPermissionsResponse.FromString, + ) + return self._stubs["test_iam_permissions"] + + @property + def update_bucket(self) -> Callable[[storage.UpdateBucketRequest], storage.Bucket]: + r"""Return a callable for the update bucket method over gRPC. + + Updates a bucket. Equivalent to JSON API's + storage.buckets.patch method. + + Returns: + Callable[[~.UpdateBucketRequest], + ~.Bucket]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "update_bucket" not in self._stubs: + self._stubs["update_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/UpdateBucket", + request_serializer=storage.UpdateBucketRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["update_bucket"] + + @property + def compose_object( + self, + ) -> Callable[[storage.ComposeObjectRequest], storage.Object]: + r"""Return a callable for the compose object method over gRPC. + + Concatenates a list of existing objects into a new + object in the same bucket. + + Returns: + Callable[[~.ComposeObjectRequest], + ~.Object]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "compose_object" not in self._stubs: + self._stubs["compose_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/ComposeObject", + request_serializer=storage.ComposeObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["compose_object"] + + @property + def delete_object(self) -> Callable[[storage.DeleteObjectRequest], empty_pb2.Empty]: + r"""Return a callable for the delete object method over gRPC. + + Deletes an object and its metadata. Deletions are permanent if + versioning is not enabled for the bucket, or if the generation + parameter is used, or if `soft + delete `__ is + not enabled for the bucket. When this API is used to delete an + object from a bucket that has soft delete policy enabled, the + object becomes soft deleted, and the ``softDeleteTime`` and + ``hardDeleteTime`` properties are set on the object. This API + cannot be used to permanently delete soft-deleted objects. + Soft-deleted objects are permanently deleted according to their + ``hardDeleteTime``. + + You can use the + [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API + to restore soft-deleted objects until the soft delete retention + period has passed. + + **IAM Permissions**: + + Requires ``storage.objects.delete`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.DeleteObjectRequest], + ~.Empty]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "delete_object" not in self._stubs: + self._stubs["delete_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/DeleteObject", + request_serializer=storage.DeleteObjectRequest.serialize, + response_deserializer=empty_pb2.Empty.FromString, + ) + return self._stubs["delete_object"] + + @property + def restore_object( + self, + ) -> Callable[[storage.RestoreObjectRequest], storage.Object]: + r"""Return a callable for the restore object method over gRPC. + + Restores a soft-deleted object. + + Returns: + Callable[[~.RestoreObjectRequest], + ~.Object]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "restore_object" not in self._stubs: + self._stubs["restore_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/RestoreObject", + request_serializer=storage.RestoreObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["restore_object"] + + @property + def cancel_resumable_write( + self, + ) -> Callable[ + [storage.CancelResumableWriteRequest], storage.CancelResumableWriteResponse + ]: + r"""Return a callable for the cancel resumable write method over gRPC. + + Cancels an in-progress resumable upload. + + Any attempts to write to the resumable upload after + cancelling the upload will fail. + + The behavior for currently in progress write operations + is not guaranteed - they could either complete before + the cancellation or fail if the cancellation completes + first. + + Returns: + Callable[[~.CancelResumableWriteRequest], + ~.CancelResumableWriteResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "cancel_resumable_write" not in self._stubs: + self._stubs["cancel_resumable_write"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/CancelResumableWrite", + request_serializer=storage.CancelResumableWriteRequest.serialize, + response_deserializer=storage.CancelResumableWriteResponse.deserialize, + ) + return self._stubs["cancel_resumable_write"] + + @property + def get_object(self) -> Callable[[storage.GetObjectRequest], storage.Object]: + r"""Return a callable for the get object method over gRPC. + + Retrieves object metadata. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. To return object ACLs, the authenticated user + must also have the ``storage.objects.getIamPolicy`` permission. + + Returns: + Callable[[~.GetObjectRequest], + ~.Object]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_object" not in self._stubs: + self._stubs["get_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/GetObject", + request_serializer=storage.GetObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["get_object"] + + @property + def read_object( + self, + ) -> Callable[[storage.ReadObjectRequest], storage.ReadObjectResponse]: + r"""Return a callable for the read object method over gRPC. + + Retrieves object data. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.ReadObjectRequest], + ~.ReadObjectResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "read_object" not in self._stubs: + self._stubs["read_object"] = self._logged_channel.unary_stream( + "/google.storage.v2.Storage/ReadObject", + request_serializer=storage.ReadObjectRequest.serialize, + response_deserializer=storage.ReadObjectResponse.deserialize, + ) + return self._stubs["read_object"] + + @property + def bidi_read_object( + self, + ) -> Callable[[storage.BidiReadObjectRequest], storage.BidiReadObjectResponse]: + r"""Return a callable for the bidi read object method over gRPC. + + Reads an object's data. + + This is a bi-directional API with the added support for reading + multiple ranges within one stream both within and across + multiple messages. If the server encountered an error for any of + the inputs, the stream will be closed with the relevant error + code. Because the API allows for multiple outstanding requests, + when the stream is closed the error response will contain a + BidiReadObjectRangesError proto in the error extension + describing the error for each outstanding read_id. + + **IAM Permissions**: + + Requires ``storage.objects.get`` + + `IAM + permission `__ + on the bucket. + + This API is currently in preview and is not yet available for + general use. + + Returns: + Callable[[~.BidiReadObjectRequest], + ~.BidiReadObjectResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "bidi_read_object" not in self._stubs: + self._stubs["bidi_read_object"] = self._logged_channel.stream_stream( + "/google.storage.v2.Storage/BidiReadObject", + request_serializer=storage.BidiReadObjectRequest.serialize, + response_deserializer=storage.BidiReadObjectResponse.deserialize, + ) + return self._stubs["bidi_read_object"] + + @property + def update_object(self) -> Callable[[storage.UpdateObjectRequest], storage.Object]: + r"""Return a callable for the update object method over gRPC. + + Updates an object's metadata. + Equivalent to JSON API's storage.objects.patch. + + Returns: + Callable[[~.UpdateObjectRequest], + ~.Object]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "update_object" not in self._stubs: + self._stubs["update_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/UpdateObject", + request_serializer=storage.UpdateObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["update_object"] + + @property + def write_object( + self, + ) -> Callable[[storage.WriteObjectRequest], storage.WriteObjectResponse]: + r"""Return a callable for the write object method over gRPC. + + Stores a new object and metadata. + + An object can be written either in a single message stream or in + a resumable sequence of message streams. To write using a single + stream, the client should include in the first message of the + stream an ``WriteObjectSpec`` describing the destination bucket, + object, and any preconditions. Additionally, the final message + must set 'finish_write' to true, or else it is an error. + + For a resumable write, the client should instead call + ``StartResumableWrite()``, populating a ``WriteObjectSpec`` into + that request. They should then attach the returned ``upload_id`` + to the first message of each following call to ``WriteObject``. + If the stream is closed before finishing the upload (either + explicitly by the client or due to a network error or an error + response from the server), the client should do as follows: + + - Check the result Status of the stream, to determine if + writing can be resumed on this stream or must be restarted + from scratch (by calling ``StartResumableWrite()``). The + resumable errors are DEADLINE_EXCEEDED, INTERNAL, and + UNAVAILABLE. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after RESOURCE_EXHAUSTED errors, but only after + taking appropriate measures, which may include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single + client where the previous request was timed out on the client + side but nonetheless reached the server. In this case the + client should take steps to prevent further concurrent writes + (e.g., increase the timeouts, stop using more than one + process to perform the upload, etc.), and then should follow + the steps below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + will skip data at offsets that were already persisted + (without checking that it matches the previously written + data), and write only the data starting from the persisted + offset. Even though the data isn't written, it may still + incur a performance cost over resuming at the correct write + offset. This behavior can make client-side handling simpler + in some cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. + + The service will not view the object as complete until the + client has sent a ``WriteObjectRequest`` with ``finish_write`` + set to ``true``. Sending any requests on a stream after sending + a request with ``finish_write`` set to ``true`` will cause an + error. The client **should** check the response it receives to + determine how much data the service was able to commit and + whether the service views the object as complete. + + Attempting to resume an already finalized object will result in + an OK status, with a ``WriteObjectResponse`` containing the + finalized object's metadata. + + Alternatively, the BidiWriteObject operation may be used to + write an object with controls over flushing and the ability to + fetch the ability to determine the current persisted size. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.WriteObjectRequest], + ~.WriteObjectResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "write_object" not in self._stubs: + self._stubs["write_object"] = self._logged_channel.stream_unary( + "/google.storage.v2.Storage/WriteObject", + request_serializer=storage.WriteObjectRequest.serialize, + response_deserializer=storage.WriteObjectResponse.deserialize, + ) + return self._stubs["write_object"] + + @property + def bidi_write_object( + self, + ) -> Callable[[storage.BidiWriteObjectRequest], storage.BidiWriteObjectResponse]: + r"""Return a callable for the bidi write object method over gRPC. + + Stores a new object and metadata. + + This is similar to the WriteObject call with the added support + for manual flushing of persisted state, and the ability to + determine current persisted size without closing the stream. + + The client may specify one or both of the ``state_lookup`` and + ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is + specified, the data written so far will be persisted to storage. + If ``state_lookup`` is specified, the service will respond with + a BidiWriteObjectResponse that contains the persisted size. If + both ``flush`` and ``state_lookup`` are specified, the flush + will always occur before a ``state_lookup``, so that both may be + set in the same request and the returned state will be the state + of the object post-flush. When the stream is closed, a + BidiWriteObjectResponse will always be sent to the client, + regardless of the value of ``state_lookup``. + + Returns: + Callable[[~.BidiWriteObjectRequest], + ~.BidiWriteObjectResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "bidi_write_object" not in self._stubs: + self._stubs["bidi_write_object"] = self._logged_channel.stream_stream( + "/google.storage.v2.Storage/BidiWriteObject", + request_serializer=storage.BidiWriteObjectRequest.serialize, + response_deserializer=storage.BidiWriteObjectResponse.deserialize, + ) + return self._stubs["bidi_write_object"] + + @property + def list_objects( + self, + ) -> Callable[[storage.ListObjectsRequest], storage.ListObjectsResponse]: + r"""Return a callable for the list objects method over gRPC. + + Retrieves a list of objects matching the criteria. + + **IAM Permissions**: + + The authenticated user requires ``storage.objects.list`` `IAM + permission `__ + to use this method. To return object ACLs, the authenticated + user must also have the ``storage.objects.getIamPolicy`` + permission. + + Returns: + Callable[[~.ListObjectsRequest], + ~.ListObjectsResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_objects" not in self._stubs: + self._stubs["list_objects"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/ListObjects", + request_serializer=storage.ListObjectsRequest.serialize, + response_deserializer=storage.ListObjectsResponse.deserialize, + ) + return self._stubs["list_objects"] + + @property + def rewrite_object( + self, + ) -> Callable[[storage.RewriteObjectRequest], storage.RewriteResponse]: + r"""Return a callable for the rewrite object method over gRPC. + + Rewrites a source object to a destination object. + Optionally overrides metadata. + + Returns: + Callable[[~.RewriteObjectRequest], + ~.RewriteResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "rewrite_object" not in self._stubs: + self._stubs["rewrite_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/RewriteObject", + request_serializer=storage.RewriteObjectRequest.serialize, + response_deserializer=storage.RewriteResponse.deserialize, + ) + return self._stubs["rewrite_object"] + + @property + def start_resumable_write( + self, + ) -> Callable[ + [storage.StartResumableWriteRequest], storage.StartResumableWriteResponse + ]: + r"""Return a callable for the start resumable write method over gRPC. + + Starts a resumable write operation. This method is part of the + `Resumable + upload `__ + feature. This allows you to upload large objects in multiple + chunks, which is more resilient to network interruptions than a + single upload. The validity duration of the write operation, and + the consequences of it becoming invalid, are service-dependent. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.StartResumableWriteRequest], + ~.StartResumableWriteResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "start_resumable_write" not in self._stubs: + self._stubs["start_resumable_write"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/StartResumableWrite", + request_serializer=storage.StartResumableWriteRequest.serialize, + response_deserializer=storage.StartResumableWriteResponse.deserialize, + ) + return self._stubs["start_resumable_write"] + + @property + def query_write_status( + self, + ) -> Callable[[storage.QueryWriteStatusRequest], storage.QueryWriteStatusResponse]: + r"""Return a callable for the query write status method over gRPC. + + Determines the ``persisted_size`` of an object that is being + written. This method is part of the `resumable + upload `__ + feature. The returned value is the size of the object that has + been persisted so far. The value can be used as the + ``write_offset`` for the next ``Write()`` call. + + If the object does not exist, meaning if it was deleted, or the + first ``Write()`` has not yet reached the service, this method + returns the error ``NOT_FOUND``. + + This method is useful for clients that buffer data and need to + know which data can be safely evicted. The client can call + ``QueryWriteStatus()`` at any time to determine how much data + has been logged for this object. For any sequence of + ``QueryWriteStatus()`` calls for a given object name, the + sequence of returned ``persisted_size`` values are + non-decreasing. + + Returns: + Callable[[~.QueryWriteStatusRequest], + ~.QueryWriteStatusResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "query_write_status" not in self._stubs: + self._stubs["query_write_status"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/QueryWriteStatus", + request_serializer=storage.QueryWriteStatusRequest.serialize, + response_deserializer=storage.QueryWriteStatusResponse.deserialize, + ) + return self._stubs["query_write_status"] + + @property + def move_object(self) -> Callable[[storage.MoveObjectRequest], storage.Object]: + r"""Return a callable for the move object method over gRPC. + + Moves the source object to the destination object in + the same bucket. + + Returns: + Callable[[~.MoveObjectRequest], + ~.Object]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "move_object" not in self._stubs: + self._stubs["move_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/MoveObject", + request_serializer=storage.MoveObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["move_object"] + + def close(self): + self._logged_channel.close() + + @property + def kind(self) -> str: + return "grpc" + + +__all__ = ("StorageGrpcTransport",) diff --git a/google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py new file mode 100644 index 000000000..d2ff8dc05 --- /dev/null +++ b/google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py @@ -0,0 +1,1349 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import inspect +import json +import pickle +import logging as std_logging +import warnings +from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers_async +from google.api_core import exceptions as core_exceptions +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.protobuf.json_format import MessageToJson +import google.protobuf.message + +import grpc # type: ignore +import proto # type: ignore +from grpc.experimental import aio # type: ignore + +from google.cloud.storage_v2.types import storage +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.longrunning import operations_pb2 # type: ignore +from google.protobuf import empty_pb2 # type: ignore +from .base import StorageTransport, DEFAULT_CLIENT_INFO +from .grpc import StorageGrpcTransport + +try: + from google.api_core import client_logging # type: ignore + + CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER +except ImportError: # pragma: NO COVER + CLIENT_LOGGING_SUPPORTED = False + +_LOGGER = std_logging.getLogger(__name__) + + +class _LoggingClientAIOInterceptor( + grpc.aio.UnaryUnaryClientInterceptor +): # pragma: NO COVER + async def intercept_unary_unary(self, continuation, client_call_details, request): + logging_enabled = CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + std_logging.DEBUG + ) + if logging_enabled: # pragma: NO COVER + request_metadata = client_call_details.metadata + if isinstance(request, proto.Message): + request_payload = type(request).to_json(request) + elif isinstance(request, google.protobuf.message.Message): + request_payload = MessageToJson(request) + else: + request_payload = f"{type(request).__name__}: {pickle.dumps(request)}" + + request_metadata = { + key: value.decode("utf-8") if isinstance(value, bytes) else value + for key, value in request_metadata + } + grpc_request = { + "payload": request_payload, + "requestMethod": "grpc", + "metadata": dict(request_metadata), + } + _LOGGER.debug( + f"Sending request for {client_call_details.method}", + extra={ + "serviceName": "google.storage.v2.Storage", + "rpcName": str(client_call_details.method), + "request": grpc_request, + "metadata": grpc_request["metadata"], + }, + ) + response = await continuation(client_call_details, request) + if logging_enabled: # pragma: NO COVER + response_metadata = await response.trailing_metadata() + # Convert gRPC metadata `` to list of tuples + metadata = ( + dict([(k, str(v)) for k, v in response_metadata]) + if response_metadata + else None + ) + result = await response + if isinstance(result, proto.Message): + response_payload = type(result).to_json(result) + elif isinstance(result, google.protobuf.message.Message): + response_payload = MessageToJson(result) + else: + response_payload = f"{type(result).__name__}: {pickle.dumps(result)}" + grpc_response = { + "payload": response_payload, + "metadata": metadata, + "status": "OK", + } + _LOGGER.debug( + f"Received response to rpc {client_call_details.method}.", + extra={ + "serviceName": "google.storage.v2.Storage", + "rpcName": str(client_call_details.method), + "response": grpc_response, + "metadata": grpc_response["metadata"], + }, + ) + return response + + +class StorageGrpcAsyncIOTransport(StorageTransport): + """gRPC AsyncIO backend transport for Storage. + + API Overview and Naming Syntax + ------------------------------ + + The Cloud Storage gRPC API allows applications to read and write + data through the abstractions of buckets and objects. For a + description of these abstractions please see + https://cloud.google.com/storage/docs. + + Resources are named as follows: + + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. + + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. + + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. + For example: + + ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _grpc_channel: aio.Channel + _stubs: Dict[str, Callable] = {} + + @classmethod + def create_channel( + cls, + host: str = "storage.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs, + ) -> aio.Channel: + """Create and return a gRPC AsyncIO channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + aio.Channel: A gRPC AsyncIO channel object. + """ + + return grpc_helpers_async.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs, + ) + + def __init__( + self, + *, + host: str = "storage.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'storage.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, aio.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + self._interceptor = _LoggingClientAIOInterceptor() + self._grpc_channel._unary_unary_interceptors.append(self._interceptor) + self._logged_channel = self._grpc_channel + self._wrap_with_kind = ( + "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters + ) + # Wrap messages. This must be done after self._logged_channel exists + self._prep_wrapped_messages(client_info) + + @property + def grpc_channel(self) -> aio.Channel: + """Create the channel designed to connect to this service. + + This property caches on the instance; repeated calls return + the same channel. + """ + # Return the channel from cache. + return self._grpc_channel + + @property + def delete_bucket( + self, + ) -> Callable[[storage.DeleteBucketRequest], Awaitable[empty_pb2.Empty]]: + r"""Return a callable for the delete bucket method over gRPC. + + Permanently deletes an empty bucket. + + Returns: + Callable[[~.DeleteBucketRequest], + Awaitable[~.Empty]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "delete_bucket" not in self._stubs: + self._stubs["delete_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/DeleteBucket", + request_serializer=storage.DeleteBucketRequest.serialize, + response_deserializer=empty_pb2.Empty.FromString, + ) + return self._stubs["delete_bucket"] + + @property + def get_bucket( + self, + ) -> Callable[[storage.GetBucketRequest], Awaitable[storage.Bucket]]: + r"""Return a callable for the get bucket method over gRPC. + + Returns metadata for the specified bucket. + + Returns: + Callable[[~.GetBucketRequest], + Awaitable[~.Bucket]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_bucket" not in self._stubs: + self._stubs["get_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/GetBucket", + request_serializer=storage.GetBucketRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["get_bucket"] + + @property + def create_bucket( + self, + ) -> Callable[[storage.CreateBucketRequest], Awaitable[storage.Bucket]]: + r"""Return a callable for the create bucket method over gRPC. + + Creates a new bucket. + + Returns: + Callable[[~.CreateBucketRequest], + Awaitable[~.Bucket]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "create_bucket" not in self._stubs: + self._stubs["create_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/CreateBucket", + request_serializer=storage.CreateBucketRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["create_bucket"] + + @property + def list_buckets( + self, + ) -> Callable[[storage.ListBucketsRequest], Awaitable[storage.ListBucketsResponse]]: + r"""Return a callable for the list buckets method over gRPC. + + Retrieves a list of buckets for a given project. + + Returns: + Callable[[~.ListBucketsRequest], + Awaitable[~.ListBucketsResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_buckets" not in self._stubs: + self._stubs["list_buckets"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/ListBuckets", + request_serializer=storage.ListBucketsRequest.serialize, + response_deserializer=storage.ListBucketsResponse.deserialize, + ) + return self._stubs["list_buckets"] + + @property + def lock_bucket_retention_policy( + self, + ) -> Callable[ + [storage.LockBucketRetentionPolicyRequest], Awaitable[storage.Bucket] + ]: + r"""Return a callable for the lock bucket retention policy method over gRPC. + + Locks retention policy on a bucket. + + Returns: + Callable[[~.LockBucketRetentionPolicyRequest], + Awaitable[~.Bucket]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "lock_bucket_retention_policy" not in self._stubs: + self._stubs[ + "lock_bucket_retention_policy" + ] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/LockBucketRetentionPolicy", + request_serializer=storage.LockBucketRetentionPolicyRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["lock_bucket_retention_policy"] + + @property + def get_iam_policy( + self, + ) -> Callable[[iam_policy_pb2.GetIamPolicyRequest], Awaitable[policy_pb2.Policy]]: + r"""Return a callable for the get iam policy method over gRPC. + + Gets the IAM policy for a specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + Returns: + Callable[[~.GetIamPolicyRequest], + Awaitable[~.Policy]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_iam_policy" not in self._stubs: + self._stubs["get_iam_policy"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/GetIamPolicy", + request_serializer=iam_policy_pb2.GetIamPolicyRequest.SerializeToString, + response_deserializer=policy_pb2.Policy.FromString, + ) + return self._stubs["get_iam_policy"] + + @property + def set_iam_policy( + self, + ) -> Callable[[iam_policy_pb2.SetIamPolicyRequest], Awaitable[policy_pb2.Policy]]: + r"""Return a callable for the set iam policy method over gRPC. + + Updates an IAM policy for the specified bucket. The ``resource`` + field in the request should be ``projects/_/buckets/{bucket}`` + for a bucket, or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + Returns: + Callable[[~.SetIamPolicyRequest], + Awaitable[~.Policy]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "set_iam_policy" not in self._stubs: + self._stubs["set_iam_policy"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/SetIamPolicy", + request_serializer=iam_policy_pb2.SetIamPolicyRequest.SerializeToString, + response_deserializer=policy_pb2.Policy.FromString, + ) + return self._stubs["set_iam_policy"] + + @property + def test_iam_permissions( + self, + ) -> Callable[ + [iam_policy_pb2.TestIamPermissionsRequest], + Awaitable[iam_policy_pb2.TestIamPermissionsResponse], + ]: + r"""Return a callable for the test iam permissions method over gRPC. + + Tests a set of permissions on the given bucket, object, or + managed folder to see which, if any, are held by the caller. The + ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, + ``projects/_/buckets/{bucket}/objects/{object}`` for an object, + or + ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` + for a managed folder. + + Returns: + Callable[[~.TestIamPermissionsRequest], + Awaitable[~.TestIamPermissionsResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "test_iam_permissions" not in self._stubs: + self._stubs["test_iam_permissions"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/TestIamPermissions", + request_serializer=iam_policy_pb2.TestIamPermissionsRequest.SerializeToString, + response_deserializer=iam_policy_pb2.TestIamPermissionsResponse.FromString, + ) + return self._stubs["test_iam_permissions"] + + @property + def update_bucket( + self, + ) -> Callable[[storage.UpdateBucketRequest], Awaitable[storage.Bucket]]: + r"""Return a callable for the update bucket method over gRPC. + + Updates a bucket. Equivalent to JSON API's + storage.buckets.patch method. + + Returns: + Callable[[~.UpdateBucketRequest], + Awaitable[~.Bucket]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "update_bucket" not in self._stubs: + self._stubs["update_bucket"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/UpdateBucket", + request_serializer=storage.UpdateBucketRequest.serialize, + response_deserializer=storage.Bucket.deserialize, + ) + return self._stubs["update_bucket"] + + @property + def compose_object( + self, + ) -> Callable[[storage.ComposeObjectRequest], Awaitable[storage.Object]]: + r"""Return a callable for the compose object method over gRPC. + + Concatenates a list of existing objects into a new + object in the same bucket. + + Returns: + Callable[[~.ComposeObjectRequest], + Awaitable[~.Object]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "compose_object" not in self._stubs: + self._stubs["compose_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/ComposeObject", + request_serializer=storage.ComposeObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["compose_object"] + + @property + def delete_object( + self, + ) -> Callable[[storage.DeleteObjectRequest], Awaitable[empty_pb2.Empty]]: + r"""Return a callable for the delete object method over gRPC. + + Deletes an object and its metadata. Deletions are permanent if + versioning is not enabled for the bucket, or if the generation + parameter is used, or if `soft + delete `__ is + not enabled for the bucket. When this API is used to delete an + object from a bucket that has soft delete policy enabled, the + object becomes soft deleted, and the ``softDeleteTime`` and + ``hardDeleteTime`` properties are set on the object. This API + cannot be used to permanently delete soft-deleted objects. + Soft-deleted objects are permanently deleted according to their + ``hardDeleteTime``. + + You can use the + [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API + to restore soft-deleted objects until the soft delete retention + period has passed. + + **IAM Permissions**: + + Requires ``storage.objects.delete`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.DeleteObjectRequest], + Awaitable[~.Empty]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "delete_object" not in self._stubs: + self._stubs["delete_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/DeleteObject", + request_serializer=storage.DeleteObjectRequest.serialize, + response_deserializer=empty_pb2.Empty.FromString, + ) + return self._stubs["delete_object"] + + @property + def restore_object( + self, + ) -> Callable[[storage.RestoreObjectRequest], Awaitable[storage.Object]]: + r"""Return a callable for the restore object method over gRPC. + + Restores a soft-deleted object. + + Returns: + Callable[[~.RestoreObjectRequest], + Awaitable[~.Object]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "restore_object" not in self._stubs: + self._stubs["restore_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/RestoreObject", + request_serializer=storage.RestoreObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["restore_object"] + + @property + def cancel_resumable_write( + self, + ) -> Callable[ + [storage.CancelResumableWriteRequest], + Awaitable[storage.CancelResumableWriteResponse], + ]: + r"""Return a callable for the cancel resumable write method over gRPC. + + Cancels an in-progress resumable upload. + + Any attempts to write to the resumable upload after + cancelling the upload will fail. + + The behavior for currently in progress write operations + is not guaranteed - they could either complete before + the cancellation or fail if the cancellation completes + first. + + Returns: + Callable[[~.CancelResumableWriteRequest], + Awaitable[~.CancelResumableWriteResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "cancel_resumable_write" not in self._stubs: + self._stubs["cancel_resumable_write"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/CancelResumableWrite", + request_serializer=storage.CancelResumableWriteRequest.serialize, + response_deserializer=storage.CancelResumableWriteResponse.deserialize, + ) + return self._stubs["cancel_resumable_write"] + + @property + def get_object( + self, + ) -> Callable[[storage.GetObjectRequest], Awaitable[storage.Object]]: + r"""Return a callable for the get object method over gRPC. + + Retrieves object metadata. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. To return object ACLs, the authenticated user + must also have the ``storage.objects.getIamPolicy`` permission. + + Returns: + Callable[[~.GetObjectRequest], + Awaitable[~.Object]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_object" not in self._stubs: + self._stubs["get_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/GetObject", + request_serializer=storage.GetObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["get_object"] + + @property + def read_object( + self, + ) -> Callable[[storage.ReadObjectRequest], Awaitable[storage.ReadObjectResponse]]: + r"""Return a callable for the read object method over gRPC. + + Retrieves object data. + + **IAM Permissions**: + + Requires ``storage.objects.get`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.ReadObjectRequest], + Awaitable[~.ReadObjectResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "read_object" not in self._stubs: + self._stubs["read_object"] = self._logged_channel.unary_stream( + "/google.storage.v2.Storage/ReadObject", + request_serializer=storage.ReadObjectRequest.serialize, + response_deserializer=storage.ReadObjectResponse.deserialize, + ) + return self._stubs["read_object"] + + @property + def bidi_read_object( + self, + ) -> Callable[ + [storage.BidiReadObjectRequest], Awaitable[storage.BidiReadObjectResponse] + ]: + r"""Return a callable for the bidi read object method over gRPC. + + Reads an object's data. + + This is a bi-directional API with the added support for reading + multiple ranges within one stream both within and across + multiple messages. If the server encountered an error for any of + the inputs, the stream will be closed with the relevant error + code. Because the API allows for multiple outstanding requests, + when the stream is closed the error response will contain a + BidiReadObjectRangesError proto in the error extension + describing the error for each outstanding read_id. + + **IAM Permissions**: + + Requires ``storage.objects.get`` + + `IAM + permission `__ + on the bucket. + + This API is currently in preview and is not yet available for + general use. + + Returns: + Callable[[~.BidiReadObjectRequest], + Awaitable[~.BidiReadObjectResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "bidi_read_object" not in self._stubs: + self._stubs["bidi_read_object"] = self._logged_channel.stream_stream( + "/google.storage.v2.Storage/BidiReadObject", + request_serializer=storage.BidiReadObjectRequest.serialize, + response_deserializer=storage.BidiReadObjectResponse.deserialize, + ) + return self._stubs["bidi_read_object"] + + @property + def update_object( + self, + ) -> Callable[[storage.UpdateObjectRequest], Awaitable[storage.Object]]: + r"""Return a callable for the update object method over gRPC. + + Updates an object's metadata. + Equivalent to JSON API's storage.objects.patch. + + Returns: + Callable[[~.UpdateObjectRequest], + Awaitable[~.Object]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "update_object" not in self._stubs: + self._stubs["update_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/UpdateObject", + request_serializer=storage.UpdateObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["update_object"] + + @property + def write_object( + self, + ) -> Callable[[storage.WriteObjectRequest], Awaitable[storage.WriteObjectResponse]]: + r"""Return a callable for the write object method over gRPC. + + Stores a new object and metadata. + + An object can be written either in a single message stream or in + a resumable sequence of message streams. To write using a single + stream, the client should include in the first message of the + stream an ``WriteObjectSpec`` describing the destination bucket, + object, and any preconditions. Additionally, the final message + must set 'finish_write' to true, or else it is an error. + + For a resumable write, the client should instead call + ``StartResumableWrite()``, populating a ``WriteObjectSpec`` into + that request. They should then attach the returned ``upload_id`` + to the first message of each following call to ``WriteObject``. + If the stream is closed before finishing the upload (either + explicitly by the client or due to a network error or an error + response from the server), the client should do as follows: + + - Check the result Status of the stream, to determine if + writing can be resumed on this stream or must be restarted + from scratch (by calling ``StartResumableWrite()``). The + resumable errors are DEADLINE_EXCEEDED, INTERNAL, and + UNAVAILABLE. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after RESOURCE_EXHAUSTED errors, but only after + taking appropriate measures, which may include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single + client where the previous request was timed out on the client + side but nonetheless reached the server. In this case the + client should take steps to prevent further concurrent writes + (e.g., increase the timeouts, stop using more than one + process to perform the upload, etc.), and then should follow + the steps below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + will skip data at offsets that were already persisted + (without checking that it matches the previously written + data), and write only the data starting from the persisted + offset. Even though the data isn't written, it may still + incur a performance cost over resuming at the correct write + offset. This behavior can make client-side handling simpler + in some cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. + + The service will not view the object as complete until the + client has sent a ``WriteObjectRequest`` with ``finish_write`` + set to ``true``. Sending any requests on a stream after sending + a request with ``finish_write`` set to ``true`` will cause an + error. The client **should** check the response it receives to + determine how much data the service was able to commit and + whether the service views the object as complete. + + Attempting to resume an already finalized object will result in + an OK status, with a ``WriteObjectResponse`` containing the + finalized object's metadata. + + Alternatively, the BidiWriteObject operation may be used to + write an object with controls over flushing and the ability to + fetch the ability to determine the current persisted size. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.WriteObjectRequest], + Awaitable[~.WriteObjectResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "write_object" not in self._stubs: + self._stubs["write_object"] = self._logged_channel.stream_unary( + "/google.storage.v2.Storage/WriteObject", + request_serializer=storage.WriteObjectRequest.serialize, + response_deserializer=storage.WriteObjectResponse.deserialize, + ) + return self._stubs["write_object"] + + @property + def bidi_write_object( + self, + ) -> Callable[ + [storage.BidiWriteObjectRequest], Awaitable[storage.BidiWriteObjectResponse] + ]: + r"""Return a callable for the bidi write object method over gRPC. + + Stores a new object and metadata. + + This is similar to the WriteObject call with the added support + for manual flushing of persisted state, and the ability to + determine current persisted size without closing the stream. + + The client may specify one or both of the ``state_lookup`` and + ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is + specified, the data written so far will be persisted to storage. + If ``state_lookup`` is specified, the service will respond with + a BidiWriteObjectResponse that contains the persisted size. If + both ``flush`` and ``state_lookup`` are specified, the flush + will always occur before a ``state_lookup``, so that both may be + set in the same request and the returned state will be the state + of the object post-flush. When the stream is closed, a + BidiWriteObjectResponse will always be sent to the client, + regardless of the value of ``state_lookup``. + + Returns: + Callable[[~.BidiWriteObjectRequest], + Awaitable[~.BidiWriteObjectResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "bidi_write_object" not in self._stubs: + self._stubs["bidi_write_object"] = self._logged_channel.stream_stream( + "/google.storage.v2.Storage/BidiWriteObject", + request_serializer=storage.BidiWriteObjectRequest.serialize, + response_deserializer=storage.BidiWriteObjectResponse.deserialize, + ) + return self._stubs["bidi_write_object"] + + @property + def list_objects( + self, + ) -> Callable[[storage.ListObjectsRequest], Awaitable[storage.ListObjectsResponse]]: + r"""Return a callable for the list objects method over gRPC. + + Retrieves a list of objects matching the criteria. + + **IAM Permissions**: + + The authenticated user requires ``storage.objects.list`` `IAM + permission `__ + to use this method. To return object ACLs, the authenticated + user must also have the ``storage.objects.getIamPolicy`` + permission. + + Returns: + Callable[[~.ListObjectsRequest], + Awaitable[~.ListObjectsResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_objects" not in self._stubs: + self._stubs["list_objects"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/ListObjects", + request_serializer=storage.ListObjectsRequest.serialize, + response_deserializer=storage.ListObjectsResponse.deserialize, + ) + return self._stubs["list_objects"] + + @property + def rewrite_object( + self, + ) -> Callable[[storage.RewriteObjectRequest], Awaitable[storage.RewriteResponse]]: + r"""Return a callable for the rewrite object method over gRPC. + + Rewrites a source object to a destination object. + Optionally overrides metadata. + + Returns: + Callable[[~.RewriteObjectRequest], + Awaitable[~.RewriteResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "rewrite_object" not in self._stubs: + self._stubs["rewrite_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/RewriteObject", + request_serializer=storage.RewriteObjectRequest.serialize, + response_deserializer=storage.RewriteResponse.deserialize, + ) + return self._stubs["rewrite_object"] + + @property + def start_resumable_write( + self, + ) -> Callable[ + [storage.StartResumableWriteRequest], + Awaitable[storage.StartResumableWriteResponse], + ]: + r"""Return a callable for the start resumable write method over gRPC. + + Starts a resumable write operation. This method is part of the + `Resumable + upload `__ + feature. This allows you to upload large objects in multiple + chunks, which is more resilient to network interruptions than a + single upload. The validity duration of the write operation, and + the consequences of it becoming invalid, are service-dependent. + + **IAM Permissions**: + + Requires ``storage.objects.create`` `IAM + permission `__ + on the bucket. + + Returns: + Callable[[~.StartResumableWriteRequest], + Awaitable[~.StartResumableWriteResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "start_resumable_write" not in self._stubs: + self._stubs["start_resumable_write"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/StartResumableWrite", + request_serializer=storage.StartResumableWriteRequest.serialize, + response_deserializer=storage.StartResumableWriteResponse.deserialize, + ) + return self._stubs["start_resumable_write"] + + @property + def query_write_status( + self, + ) -> Callable[ + [storage.QueryWriteStatusRequest], Awaitable[storage.QueryWriteStatusResponse] + ]: + r"""Return a callable for the query write status method over gRPC. + + Determines the ``persisted_size`` of an object that is being + written. This method is part of the `resumable + upload `__ + feature. The returned value is the size of the object that has + been persisted so far. The value can be used as the + ``write_offset`` for the next ``Write()`` call. + + If the object does not exist, meaning if it was deleted, or the + first ``Write()`` has not yet reached the service, this method + returns the error ``NOT_FOUND``. + + This method is useful for clients that buffer data and need to + know which data can be safely evicted. The client can call + ``QueryWriteStatus()`` at any time to determine how much data + has been logged for this object. For any sequence of + ``QueryWriteStatus()`` calls for a given object name, the + sequence of returned ``persisted_size`` values are + non-decreasing. + + Returns: + Callable[[~.QueryWriteStatusRequest], + Awaitable[~.QueryWriteStatusResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "query_write_status" not in self._stubs: + self._stubs["query_write_status"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/QueryWriteStatus", + request_serializer=storage.QueryWriteStatusRequest.serialize, + response_deserializer=storage.QueryWriteStatusResponse.deserialize, + ) + return self._stubs["query_write_status"] + + @property + def move_object( + self, + ) -> Callable[[storage.MoveObjectRequest], Awaitable[storage.Object]]: + r"""Return a callable for the move object method over gRPC. + + Moves the source object to the destination object in + the same bucket. + + Returns: + Callable[[~.MoveObjectRequest], + Awaitable[~.Object]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "move_object" not in self._stubs: + self._stubs["move_object"] = self._logged_channel.unary_unary( + "/google.storage.v2.Storage/MoveObject", + request_serializer=storage.MoveObjectRequest.serialize, + response_deserializer=storage.Object.deserialize, + ) + return self._stubs["move_object"] + + def _prep_wrapped_messages(self, client_info): + """Precompute the wrapped methods, overriding the base class method to use async wrappers.""" + self._wrapped_methods = { + self.delete_bucket: self._wrap_method( + self.delete_bucket, + default_timeout=None, + client_info=client_info, + ), + self.get_bucket: self._wrap_method( + self.get_bucket, + default_timeout=None, + client_info=client_info, + ), + self.create_bucket: self._wrap_method( + self.create_bucket, + default_timeout=None, + client_info=client_info, + ), + self.list_buckets: self._wrap_method( + self.list_buckets, + default_timeout=None, + client_info=client_info, + ), + self.lock_bucket_retention_policy: self._wrap_method( + self.lock_bucket_retention_policy, + default_timeout=None, + client_info=client_info, + ), + self.get_iam_policy: self._wrap_method( + self.get_iam_policy, + default_timeout=None, + client_info=client_info, + ), + self.set_iam_policy: self._wrap_method( + self.set_iam_policy, + default_timeout=None, + client_info=client_info, + ), + self.test_iam_permissions: self._wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), + self.update_bucket: self._wrap_method( + self.update_bucket, + default_timeout=None, + client_info=client_info, + ), + self.compose_object: self._wrap_method( + self.compose_object, + default_timeout=None, + client_info=client_info, + ), + self.delete_object: self._wrap_method( + self.delete_object, + default_timeout=None, + client_info=client_info, + ), + self.restore_object: self._wrap_method( + self.restore_object, + default_timeout=None, + client_info=client_info, + ), + self.cancel_resumable_write: self._wrap_method( + self.cancel_resumable_write, + default_timeout=None, + client_info=client_info, + ), + self.get_object: self._wrap_method( + self.get_object, + default_timeout=None, + client_info=client_info, + ), + self.read_object: self._wrap_method( + self.read_object, + default_timeout=None, + client_info=client_info, + ), + self.bidi_read_object: self._wrap_method( + self.bidi_read_object, + default_timeout=None, + client_info=client_info, + ), + self.update_object: self._wrap_method( + self.update_object, + default_timeout=None, + client_info=client_info, + ), + self.write_object: self._wrap_method( + self.write_object, + default_timeout=None, + client_info=client_info, + ), + self.bidi_write_object: self._wrap_method( + self.bidi_write_object, + default_timeout=None, + client_info=client_info, + ), + self.list_objects: self._wrap_method( + self.list_objects, + default_timeout=None, + client_info=client_info, + ), + self.rewrite_object: self._wrap_method( + self.rewrite_object, + default_timeout=None, + client_info=client_info, + ), + self.start_resumable_write: self._wrap_method( + self.start_resumable_write, + default_timeout=None, + client_info=client_info, + ), + self.query_write_status: self._wrap_method( + self.query_write_status, + default_timeout=None, + client_info=client_info, + ), + self.move_object: self._wrap_method( + self.move_object, + default_timeout=None, + client_info=client_info, + ), + } + + def _wrap_method(self, func, *args, **kwargs): + if self._wrap_with_kind: # pragma: NO COVER + kwargs["kind"] = self.kind + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) + + def close(self): + return self._logged_channel.close() + + @property + def kind(self) -> str: + return "grpc_asyncio" + + +__all__ = ("StorageGrpcAsyncIOTransport",) diff --git a/google/cloud/storage_v2/types/__init__.py b/google/cloud/storage_v2/types/__init__.py new file mode 100644 index 000000000..8ef177836 --- /dev/null +++ b/google/cloud/storage_v2/types/__init__.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from .storage import ( + AppendObjectSpec, + BidiReadHandle, + BidiReadObjectError, + BidiReadObjectRedirectedError, + BidiReadObjectRequest, + BidiReadObjectResponse, + BidiReadObjectSpec, + BidiWriteHandle, + BidiWriteObjectRedirectedError, + BidiWriteObjectRequest, + BidiWriteObjectResponse, + Bucket, + BucketAccessControl, + CancelResumableWriteRequest, + CancelResumableWriteResponse, + ChecksummedData, + CommonObjectRequestParams, + ComposeObjectRequest, + ContentRange, + CreateBucketRequest, + CustomerEncryption, + DeleteBucketRequest, + DeleteObjectRequest, + GetBucketRequest, + GetObjectRequest, + ListBucketsRequest, + ListBucketsResponse, + ListObjectsRequest, + ListObjectsResponse, + LockBucketRetentionPolicyRequest, + MoveObjectRequest, + Object, + ObjectAccessControl, + ObjectChecksums, + ObjectContexts, + ObjectCustomContextPayload, + ObjectRangeData, + Owner, + ProjectTeam, + QueryWriteStatusRequest, + QueryWriteStatusResponse, + ReadObjectRequest, + ReadObjectResponse, + ReadRange, + ReadRangeError, + RestoreObjectRequest, + RewriteObjectRequest, + RewriteResponse, + ServiceConstants, + StartResumableWriteRequest, + StartResumableWriteResponse, + UpdateBucketRequest, + UpdateObjectRequest, + WriteObjectRequest, + WriteObjectResponse, + WriteObjectSpec, +) + +__all__ = ( + "AppendObjectSpec", + "BidiReadHandle", + "BidiReadObjectError", + "BidiReadObjectRedirectedError", + "BidiReadObjectRequest", + "BidiReadObjectResponse", + "BidiReadObjectSpec", + "BidiWriteHandle", + "BidiWriteObjectRedirectedError", + "BidiWriteObjectRequest", + "BidiWriteObjectResponse", + "Bucket", + "BucketAccessControl", + "CancelResumableWriteRequest", + "CancelResumableWriteResponse", + "ChecksummedData", + "CommonObjectRequestParams", + "ComposeObjectRequest", + "ContentRange", + "CreateBucketRequest", + "CustomerEncryption", + "DeleteBucketRequest", + "DeleteObjectRequest", + "GetBucketRequest", + "GetObjectRequest", + "ListBucketsRequest", + "ListBucketsResponse", + "ListObjectsRequest", + "ListObjectsResponse", + "LockBucketRetentionPolicyRequest", + "MoveObjectRequest", + "Object", + "ObjectAccessControl", + "ObjectChecksums", + "ObjectContexts", + "ObjectCustomContextPayload", + "ObjectRangeData", + "Owner", + "ProjectTeam", + "QueryWriteStatusRequest", + "QueryWriteStatusResponse", + "ReadObjectRequest", + "ReadObjectResponse", + "ReadRange", + "ReadRangeError", + "RestoreObjectRequest", + "RewriteObjectRequest", + "RewriteResponse", + "ServiceConstants", + "StartResumableWriteRequest", + "StartResumableWriteResponse", + "UpdateBucketRequest", + "UpdateObjectRequest", + "WriteObjectRequest", + "WriteObjectResponse", + "WriteObjectSpec", +) diff --git a/google/cloud/storage_v2/types/storage.py b/google/cloud/storage_v2/types/storage.py new file mode 100644 index 000000000..9dc7d6262 --- /dev/null +++ b/google/cloud/storage_v2/types/storage.py @@ -0,0 +1,4964 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + +from typing import MutableMapping, MutableSequence + +import proto # type: ignore + +from google.protobuf import duration_pb2 # type: ignore +from google.protobuf import field_mask_pb2 # type: ignore +from google.protobuf import timestamp_pb2 # type: ignore +from google.rpc import status_pb2 # type: ignore +from google.type import date_pb2 # type: ignore + + +__protobuf__ = proto.module( + package="google.storage.v2", + manifest={ + "DeleteBucketRequest", + "GetBucketRequest", + "CreateBucketRequest", + "ListBucketsRequest", + "ListBucketsResponse", + "LockBucketRetentionPolicyRequest", + "UpdateBucketRequest", + "ComposeObjectRequest", + "DeleteObjectRequest", + "RestoreObjectRequest", + "CancelResumableWriteRequest", + "CancelResumableWriteResponse", + "ReadObjectRequest", + "GetObjectRequest", + "ReadObjectResponse", + "BidiReadObjectSpec", + "BidiReadObjectRequest", + "BidiReadObjectResponse", + "BidiReadObjectRedirectedError", + "BidiWriteObjectRedirectedError", + "BidiReadObjectError", + "ReadRangeError", + "ReadRange", + "ObjectRangeData", + "BidiReadHandle", + "BidiWriteHandle", + "WriteObjectSpec", + "WriteObjectRequest", + "WriteObjectResponse", + "AppendObjectSpec", + "BidiWriteObjectRequest", + "BidiWriteObjectResponse", + "ListObjectsRequest", + "QueryWriteStatusRequest", + "QueryWriteStatusResponse", + "RewriteObjectRequest", + "RewriteResponse", + "MoveObjectRequest", + "StartResumableWriteRequest", + "StartResumableWriteResponse", + "UpdateObjectRequest", + "CommonObjectRequestParams", + "ServiceConstants", + "Bucket", + "BucketAccessControl", + "ChecksummedData", + "ObjectChecksums", + "ObjectCustomContextPayload", + "ObjectContexts", + "CustomerEncryption", + "Object", + "ObjectAccessControl", + "ListObjectsResponse", + "ProjectTeam", + "Owner", + "ContentRange", + }, +) + + +class DeleteBucketRequest(proto.Message): + r"""Request message for DeleteBucket. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + name (str): + Required. Name of a bucket to delete. + if_metageneration_match (int): + If set, only deletes the bucket if its + metageneration matches this value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + If set, only deletes the bucket if its + metageneration does not match this value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + """ + + name: str = proto.Field( + proto.STRING, + number=1, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + + +class GetBucketRequest(proto.Message): + r"""Request message for GetBucket. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + name (str): + Required. Name of a bucket. + if_metageneration_match (int): + If set, and if the bucket's current + metageneration does not match the specified + value, the request will return an error. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + If set, and if the bucket's current + metageneration matches the specified value, the + request will return an error. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + read_mask (google.protobuf.field_mask_pb2.FieldMask): + Mask specifying which fields to read. A "*" field may be + used to indicate all fields. If no mask is specified, will + default to all fields. + + This field is a member of `oneof`_ ``_read_mask``. + """ + + name: str = proto.Field( + proto.STRING, + number=1, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + read_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=5, + optional=True, + message=field_mask_pb2.FieldMask, + ) + + +class CreateBucketRequest(proto.Message): + r"""Request message for CreateBucket. + + Attributes: + parent (str): + Required. The project to which this bucket will belong. This + field must either be empty or ``projects/_``. The project ID + that owns this bucket should be specified in the + ``bucket.project`` field. + bucket (google.cloud.storage_v2.types.Bucket): + Optional. Properties of the new bucket being inserted. The + name of the bucket is specified in the ``bucket_id`` field. + Populating ``bucket.name`` field will result in an error. + The project of the bucket must be specified in the + ``bucket.project`` field. This field must be in + ``projects/{projectIdentifier}`` format, {projectIdentifier} + can be the project ID or project number. The ``parent`` + field must be either empty or ``projects/_``. + bucket_id (str): + Required. The ID to use for this bucket, which will become + the final component of the bucket's resource name. For + example, the value ``foo`` might result in a bucket with the + name ``projects/123456/buckets/foo``. + predefined_acl (str): + Optional. Apply a predefined set of access + controls to this bucket. Valid values are + "authenticatedRead", "private", + "projectPrivate", "publicRead", or + "publicReadWrite". + predefined_default_object_acl (str): + Optional. Apply a predefined set of default + object access controls to this bucket. Valid + values are "authenticatedRead", + "bucketOwnerFullControl", "bucketOwnerRead", + "private", "projectPrivate", or "publicRead". + enable_object_retention (bool): + Optional. If true, enable object retention on + the bucket. + """ + + parent: str = proto.Field( + proto.STRING, + number=1, + ) + bucket: "Bucket" = proto.Field( + proto.MESSAGE, + number=2, + message="Bucket", + ) + bucket_id: str = proto.Field( + proto.STRING, + number=3, + ) + predefined_acl: str = proto.Field( + proto.STRING, + number=6, + ) + predefined_default_object_acl: str = proto.Field( + proto.STRING, + number=7, + ) + enable_object_retention: bool = proto.Field( + proto.BOOL, + number=9, + ) + + +class ListBucketsRequest(proto.Message): + r"""Request message for ListBuckets. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + parent (str): + Required. The project whose buckets we are + listing. + page_size (int): + Optional. Maximum number of buckets to return in a single + response. The service will use this parameter or 1,000 + items, whichever is smaller. If "acl" is present in the + read_mask, the service will use this parameter of 200 items, + whichever is smaller. + page_token (str): + Optional. A previously-returned page token + representing part of the larger set of results + to view. + prefix (str): + Optional. Filter results to buckets whose + names begin with this prefix. + read_mask (google.protobuf.field_mask_pb2.FieldMask): + Mask specifying which fields to read from each result. If no + mask is specified, will default to all fields except + items.owner, items.acl, and items.default_object_acl. + + - may be used to mean "all fields". + + This field is a member of `oneof`_ ``_read_mask``. + """ + + parent: str = proto.Field( + proto.STRING, + number=1, + ) + page_size: int = proto.Field( + proto.INT32, + number=2, + ) + page_token: str = proto.Field( + proto.STRING, + number=3, + ) + prefix: str = proto.Field( + proto.STRING, + number=4, + ) + read_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=5, + optional=True, + message=field_mask_pb2.FieldMask, + ) + + +class ListBucketsResponse(proto.Message): + r"""The result of a call to Buckets.ListBuckets + + Attributes: + buckets (MutableSequence[google.cloud.storage_v2.types.Bucket]): + The list of items. + next_page_token (str): + The continuation token, used to page through + large result sets. Provide this value in a + subsequent request to return the next page of + results. + """ + + @property + def raw_page(self): + return self + + buckets: MutableSequence["Bucket"] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message="Bucket", + ) + next_page_token: str = proto.Field( + proto.STRING, + number=2, + ) + + +class LockBucketRetentionPolicyRequest(proto.Message): + r"""Request message for LockBucketRetentionPolicyRequest. + + Attributes: + bucket (str): + Required. Name of a bucket. + if_metageneration_match (int): + Required. Makes the operation conditional on + whether bucket's current metageneration matches + the given value. Must be positive. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=2, + ) + + +class UpdateBucketRequest(proto.Message): + r"""Request for UpdateBucket method. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (google.cloud.storage_v2.types.Bucket): + Required. The bucket to update. The bucket's ``name`` field + will be used to identify the bucket. + if_metageneration_match (int): + If set, will only modify the bucket if its + metageneration matches this value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + If set, will only modify the bucket if its + metageneration does not match this value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + predefined_acl (str): + Optional. Apply a predefined set of access + controls to this bucket. Valid values are + "authenticatedRead", "private", + "projectPrivate", "publicRead", or + "publicReadWrite". + predefined_default_object_acl (str): + Optional. Apply a predefined set of default + object access controls to this bucket. Valid + values are "authenticatedRead", + "bucketOwnerFullControl", "bucketOwnerRead", + "private", "projectPrivate", or "publicRead". + update_mask (google.protobuf.field_mask_pb2.FieldMask): + Required. List of fields to be updated. + + To specify ALL fields, equivalent to the JSON API's "update" + function, specify a single field with the value ``*``. Note: + not recommended. If a new field is introduced at a later + time, an older client updating with the ``*`` may + accidentally reset the new field's value. + + Not specifying any fields is an error. + """ + + bucket: "Bucket" = proto.Field( + proto.MESSAGE, + number=1, + message="Bucket", + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + predefined_acl: str = proto.Field( + proto.STRING, + number=8, + ) + predefined_default_object_acl: str = proto.Field( + proto.STRING, + number=9, + ) + update_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=6, + message=field_mask_pb2.FieldMask, + ) + + +class ComposeObjectRequest(proto.Message): + r"""Request message for ComposeObject. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + destination (google.cloud.storage_v2.types.Object): + Required. Properties of the resulting object. + source_objects (MutableSequence[google.cloud.storage_v2.types.ComposeObjectRequest.SourceObject]): + Optional. The list of source objects that + will be concatenated into a single object. + destination_predefined_acl (str): + Optional. Apply a predefined set of access + controls to the destination object. Valid values + are "authenticatedRead", + "bucketOwnerFullControl", "bucketOwnerRead", + "private", "projectPrivate", or "publicRead". + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + kms_key (str): + Optional. Resource name of the Cloud KMS key, of the form + ``projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key``, + that will be used to encrypt the object. Overrides the + object metadata's ``kms_key_name`` value, if any. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + Optional. The checksums of the complete + object. This will be validated against the + combined checksums of the component objects. + """ + + class SourceObject(proto.Message): + r"""Description of a source object for a composition request. + + Attributes: + name (str): + Required. The source object's name. All + source objects must reside in the same bucket. + generation (int): + Optional. The generation of this object to + use as the source. + object_preconditions (google.cloud.storage_v2.types.ComposeObjectRequest.SourceObject.ObjectPreconditions): + Optional. Conditions that must be met for + this operation to execute. + """ + + class ObjectPreconditions(proto.Message): + r"""Preconditions for a source object of a composition request. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + if_generation_match (int): + Only perform the composition if the + generation of the source object that would be + used matches this value. If this value and a + generation are both specified, they must be the + same value or the call will fail. + + This field is a member of `oneof`_ ``_if_generation_match``. + """ + + if_generation_match: int = proto.Field( + proto.INT64, + number=1, + optional=True, + ) + + name: str = proto.Field( + proto.STRING, + number=1, + ) + generation: int = proto.Field( + proto.INT64, + number=2, + ) + object_preconditions: "ComposeObjectRequest.SourceObject.ObjectPreconditions" = proto.Field( + proto.MESSAGE, + number=3, + message="ComposeObjectRequest.SourceObject.ObjectPreconditions", + ) + + destination: "Object" = proto.Field( + proto.MESSAGE, + number=1, + message="Object", + ) + source_objects: MutableSequence[SourceObject] = proto.RepeatedField( + proto.MESSAGE, + number=2, + message=SourceObject, + ) + destination_predefined_acl: str = proto.Field( + proto.STRING, + number=9, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + kms_key: str = proto.Field( + proto.STRING, + number=6, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=7, + message="CommonObjectRequestParams", + ) + object_checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=10, + message="ObjectChecksums", + ) + + +class DeleteObjectRequest(proto.Message): + r"""Message for deleting an object. ``bucket`` and ``object`` **must** + be set. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. Name of the bucket in which the + object resides. + object_ (str): + Required. The name of the finalized object to delete. Note: + If you want to delete an unfinalized resumable upload please + use ``CancelResumableWrite``. + generation (int): + Optional. If present, permanently deletes a + specific revision of this object (as opposed to + the latest version, the default). + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + object_: str = proto.Field( + proto.STRING, + number=2, + ) + generation: int = proto.Field( + proto.INT64, + number=4, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=8, + optional=True, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=10, + message="CommonObjectRequestParams", + ) + + +class RestoreObjectRequest(proto.Message): + r"""Message for restoring an object. ``bucket``, ``object``, and + ``generation`` **must** be set. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. Name of the bucket in which the + object resides. + object_ (str): + Required. The name of the object to restore. + generation (int): + Required. The specific revision of the object + to restore. + restore_token (str): + Optional. Restore token used to differentiate + soft-deleted objects with the same name and + generation. Only applicable for hierarchical + namespace buckets. This parameter is optional, + and is only required in the rare case when there + are multiple soft-deleted objects with the same + name and generation. + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + copy_source_acl (bool): + If false or unset, the bucket's default + object ACL will be used. If true, copy the + source object's access controls. Return an error + if bucket has UBLA enabled. + + This field is a member of `oneof`_ ``_copy_source_acl``. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + object_: str = proto.Field( + proto.STRING, + number=2, + ) + generation: int = proto.Field( + proto.INT64, + number=3, + ) + restore_token: str = proto.Field( + proto.STRING, + number=11, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + copy_source_acl: bool = proto.Field( + proto.BOOL, + number=9, + optional=True, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=8, + message="CommonObjectRequestParams", + ) + + +class CancelResumableWriteRequest(proto.Message): + r"""Message for canceling an in-progress resumable upload. ``upload_id`` + **must** be set. + + Attributes: + upload_id (str): + Required. The upload_id of the resumable upload to cancel. + This should be copied from the ``upload_id`` field of + ``StartResumableWriteResponse``. + """ + + upload_id: str = proto.Field( + proto.STRING, + number=1, + ) + + +class CancelResumableWriteResponse(proto.Message): + r"""Empty response message for canceling an in-progress resumable + upload, will be extended as needed. + + """ + + +class ReadObjectRequest(proto.Message): + r"""Request message for ReadObject. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. The name of the bucket containing + the object to read. + object_ (str): + Required. The name of the object to read. + generation (int): + Optional. If present, selects a specific + revision of this object (as opposed to the + latest version, the default). + read_offset (int): + Optional. The offset for the first byte to return in the + read, relative to the start of the object. + + A negative ``read_offset`` value will be interpreted as the + number of bytes back from the end of the object to be + returned. For example, if an object's length is 15 bytes, a + ReadObjectRequest with ``read_offset`` = -5 and + ``read_limit`` = 3 would return bytes 10 through 12 of the + object. Requesting a negative offset with magnitude larger + than the size of the object will return the entire object. + read_limit (int): + Optional. The maximum number of ``data`` bytes the server is + allowed to return in the sum of all ``Object`` messages. A + ``read_limit`` of zero indicates that there is no limit, and + a negative ``read_limit`` will cause an error. + + If the stream returns fewer bytes than allowed by the + ``read_limit`` and no error occurred, the stream includes + all data from the ``read_offset`` to the end of the + resource. + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + read_mask (google.protobuf.field_mask_pb2.FieldMask): + Mask specifying which fields to read. The checksummed_data + field and its children will always be present. If no mask is + specified, will default to all fields except metadata.owner + and metadata.acl. + + - may be used to mean "all fields". + + This field is a member of `oneof`_ ``_read_mask``. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + object_: str = proto.Field( + proto.STRING, + number=2, + ) + generation: int = proto.Field( + proto.INT64, + number=3, + ) + read_offset: int = proto.Field( + proto.INT64, + number=4, + ) + read_limit: int = proto.Field( + proto.INT64, + number=5, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=8, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=9, + optional=True, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=10, + message="CommonObjectRequestParams", + ) + read_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=12, + optional=True, + message=field_mask_pb2.FieldMask, + ) + + +class GetObjectRequest(proto.Message): + r"""Request message for GetObject. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. Name of the bucket in which the + object resides. + object_ (str): + Required. Name of the object. + generation (int): + Optional. If present, selects a specific + revision of this object (as opposed to the + latest version, the default). + soft_deleted (bool): + If true, return the soft-deleted version of + this object. + + This field is a member of `oneof`_ ``_soft_deleted``. + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + read_mask (google.protobuf.field_mask_pb2.FieldMask): + Mask specifying which fields to read. If no mask is + specified, will default to all fields except metadata.acl + and metadata.owner. + + - may be used to mean "all fields". + + This field is a member of `oneof`_ ``_read_mask``. + restore_token (str): + Optional. Restore token used to differentiate soft-deleted + objects with the same name and generation. Only applicable + for hierarchical namespace buckets and if soft_deleted is + set to true. This parameter is optional, and is only + required in the rare case when there are multiple + soft-deleted objects with the same name and generation. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + object_: str = proto.Field( + proto.STRING, + number=2, + ) + generation: int = proto.Field( + proto.INT64, + number=3, + ) + soft_deleted: bool = proto.Field( + proto.BOOL, + number=11, + optional=True, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=8, + message="CommonObjectRequestParams", + ) + read_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=10, + optional=True, + message=field_mask_pb2.FieldMask, + ) + restore_token: str = proto.Field( + proto.STRING, + number=12, + ) + + +class ReadObjectResponse(proto.Message): + r"""Response message for ReadObject. + + Attributes: + checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + A portion of the data for the object. The service **may** + leave ``data`` empty for any given ``ReadResponse``. This + enables the service to inform the client that the request is + still live while it is running an operation to generate more + data. + object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + The checksums of the complete object. If the + object is downloaded in full, the client should + compute one of these checksums over the + downloaded object and compare it against the + value provided here. + content_range (google.cloud.storage_v2.types.ContentRange): + If read_offset and or read_limit was specified on the + ReadObjectRequest, ContentRange will be populated on the + first ReadObjectResponse message of the read stream. + metadata (google.cloud.storage_v2.types.Object): + Metadata of the object whose media is being + returned. Only populated in the first response + in the stream. + """ + + checksummed_data: "ChecksummedData" = proto.Field( + proto.MESSAGE, + number=1, + message="ChecksummedData", + ) + object_checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=2, + message="ObjectChecksums", + ) + content_range: "ContentRange" = proto.Field( + proto.MESSAGE, + number=3, + message="ContentRange", + ) + metadata: "Object" = proto.Field( + proto.MESSAGE, + number=4, + message="Object", + ) + + +class BidiReadObjectSpec(proto.Message): + r"""Describes the object to read in a BidiReadObject request. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. The name of the bucket containing + the object to read. + object_ (str): + Required. The name of the object to read. + generation (int): + Optional. If present, selects a specific + revision of this object (as opposed to the + latest version, the default). + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + read_mask (google.protobuf.field_mask_pb2.FieldMask): + Mask specifying which fields to read. The checksummed_data + field and its children will always be present. If no mask is + specified, will default to all fields except metadata.owner + and metadata.acl. + + - may be used to mean "all fields". As per + https://google.aip.dev/161, this field is deprecated. As + an alternative, grpc metadata can be used: + https://cloud.google.com/apis/docs/system-parameters#definitions + + This field is a member of `oneof`_ ``_read_mask``. + read_handle (google.cloud.storage_v2.types.BidiReadHandle): + The client can optionally set this field. The + read handle is an optimized way of creating new + streams. Read handles are generated and + periodically refreshed from prior reads. + + This field is a member of `oneof`_ ``_read_handle``. + routing_token (str): + The routing token that influences request + routing for the stream. Must be provided if a + BidiReadObjectRedirectedError is returned. + + This field is a member of `oneof`_ ``_routing_token``. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + object_: str = proto.Field( + proto.STRING, + number=2, + ) + generation: int = proto.Field( + proto.INT64, + number=3, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=8, + message="CommonObjectRequestParams", + ) + read_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=12, + optional=True, + message=field_mask_pb2.FieldMask, + ) + read_handle: "BidiReadHandle" = proto.Field( + proto.MESSAGE, + number=13, + optional=True, + message="BidiReadHandle", + ) + routing_token: str = proto.Field( + proto.STRING, + number=14, + optional=True, + ) + + +class BidiReadObjectRequest(proto.Message): + r"""Request message for BidiReadObject. + + Attributes: + read_object_spec (google.cloud.storage_v2.types.BidiReadObjectSpec): + Optional. The first message of each stream + should set this field. If this is not the first + message, an error will be returned. Describes + the object to read. + read_ranges (MutableSequence[google.cloud.storage_v2.types.ReadRange]): + Optional. Provides a list of 0 or more (up to + 100) ranges to read. If a single range is large + enough to require multiple responses, they are + guaranteed to be delivered in increasing offset + order. There are no ordering guarantees across + ranges. When no ranges are provided, the + response message will not include + ObjectRangeData. For full object downloads, the + offset and size can be set to 0. + """ + + read_object_spec: "BidiReadObjectSpec" = proto.Field( + proto.MESSAGE, + number=1, + message="BidiReadObjectSpec", + ) + read_ranges: MutableSequence["ReadRange"] = proto.RepeatedField( + proto.MESSAGE, + number=8, + message="ReadRange", + ) + + +class BidiReadObjectResponse(proto.Message): + r"""Response message for BidiReadObject. + + Attributes: + object_data_ranges (MutableSequence[google.cloud.storage_v2.types.ObjectRangeData]): + A portion of the object's data. The service **may** leave + data empty for any given ReadResponse. This enables the + service to inform the client that the request is still live + while it is running an operation to generate more data. The + service **may** pipeline multiple responses belonging to + different read requests. Each ObjectRangeData entry will + have a read_id set to the same value as the corresponding + source read request. + metadata (google.cloud.storage_v2.types.Object): + Metadata of the object whose media is being + returned. Only populated in the first response + in the stream and not populated when the stream + is opened with a read handle. + read_handle (google.cloud.storage_v2.types.BidiReadHandle): + This field will be periodically refreshed, + however it may not be set in every response. It + allows the client to more efficiently open + subsequent bidirectional streams to the same + object. + """ + + object_data_ranges: MutableSequence["ObjectRangeData"] = proto.RepeatedField( + proto.MESSAGE, + number=6, + message="ObjectRangeData", + ) + metadata: "Object" = proto.Field( + proto.MESSAGE, + number=4, + message="Object", + ) + read_handle: "BidiReadHandle" = proto.Field( + proto.MESSAGE, + number=7, + message="BidiReadHandle", + ) + + +class BidiReadObjectRedirectedError(proto.Message): + r"""Error proto containing details for a redirected read. This + error may be attached as details for an ABORTED response to + BidiReadObject. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + read_handle (google.cloud.storage_v2.types.BidiReadHandle): + The read handle for the redirected read. If + set, the client may use this in the + BidiReadObjectSpec when retrying the read + stream. + routing_token (str): + The routing token the client must use when retrying the read + stream. This value must be provided in the header + ``x-goog-request-params``, with key ``routing_token`` and + this string verbatim as the value. + + This field is a member of `oneof`_ ``_routing_token``. + """ + + read_handle: "BidiReadHandle" = proto.Field( + proto.MESSAGE, + number=1, + message="BidiReadHandle", + ) + routing_token: str = proto.Field( + proto.STRING, + number=2, + optional=True, + ) + + +class BidiWriteObjectRedirectedError(proto.Message): + r"""Error proto containing details for a redirected write. This + error may be attached as details for an ABORTED response to + BidiWriteObject. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + routing_token (str): + The routing token the client must use when retrying the + write stream. This value must be provided in the header + ``x-goog-request-params``, with key ``routing_token`` and + this string verbatim as the value. + + This field is a member of `oneof`_ ``_routing_token``. + write_handle (google.cloud.storage_v2.types.BidiWriteHandle): + Opaque value describing a previous write. If set, the client + must use this in an AppendObjectSpec first_message when + retrying the write stream. If not set, clients may retry the + original request. + + This field is a member of `oneof`_ ``_write_handle``. + generation (int): + The generation of the object that triggered the redirect. + This will be set iff write_handle is set. If set, the client + must use this in an AppendObjectSpec first_message when + retrying the write stream. + + This field is a member of `oneof`_ ``_generation``. + """ + + routing_token: str = proto.Field( + proto.STRING, + number=1, + optional=True, + ) + write_handle: "BidiWriteHandle" = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message="BidiWriteHandle", + ) + generation: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + + +class BidiReadObjectError(proto.Message): + r"""Error extension proto containing details for all outstanding + reads on the failed stream + + Attributes: + read_range_errors (MutableSequence[google.cloud.storage_v2.types.ReadRangeError]): + The error code for each outstanding read_range + """ + + read_range_errors: MutableSequence["ReadRangeError"] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message="ReadRangeError", + ) + + +class ReadRangeError(proto.Message): + r"""Error extension proto containing details for a single range + read + + Attributes: + read_id (int): + The id of the corresponding read_range + status (google.rpc.status_pb2.Status): + The status which should be an enum value of + [google.rpc.Code]. + """ + + read_id: int = proto.Field( + proto.INT64, + number=1, + ) + status: status_pb2.Status = proto.Field( + proto.MESSAGE, + number=2, + message=status_pb2.Status, + ) + + +class ReadRange(proto.Message): + r"""Describes a range of bytes to read in a BidiReadObjectRanges + request. + + Attributes: + read_offset (int): + Required. The offset for the first byte to return in the + read, relative to the start of the object. + + A negative read_offset value will be interpreted as the + number of bytes back from the end of the object to be + returned. For example, if an object's length is 15 bytes, a + ReadObjectRequest with read_offset = -5 and read_length = 3 + would return bytes 10 through 12 of the object. Requesting a + negative offset with magnitude larger than the size of the + object will return the entire object. A read_offset larger + than the size of the object will result in an OutOfRange + error. + read_length (int): + Optional. The maximum number of data bytes the server is + allowed to return across all response messages with the same + read_id. A read_length of zero indicates to read until the + resource end, and a negative read_length will cause an + error. If the stream returns fewer bytes than allowed by the + read_length and no error occurred, the stream includes all + data from the read_offset to the resource end. + read_id (int): + Required. Read identifier provided by the client. When the + client issues more than one outstanding ReadRange on the + same stream, responses can be mapped back to their + corresponding requests using this value. Clients must ensure + that all outstanding requests have different read_id values. + The server may close the stream with an error if this + condition is not met. + """ + + read_offset: int = proto.Field( + proto.INT64, + number=1, + ) + read_length: int = proto.Field( + proto.INT64, + number=2, + ) + read_id: int = proto.Field( + proto.INT64, + number=3, + ) + + +class ObjectRangeData(proto.Message): + r"""Contains data and metadata for a range of an object. + + Attributes: + checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + A portion of the data for the object. + read_range (google.cloud.storage_v2.types.ReadRange): + The ReadRange describes the content being returned with + read_id set to the corresponding ReadObjectRequest in the + stream. Multiple ObjectRangeData messages may have the same + read_id but increasing offsets. ReadObjectResponse messages + with the same read_id are guaranteed to be delivered in + increasing offset order. + range_end (bool): + If set, indicates there are no more bytes to + read for the given ReadRange. + """ + + checksummed_data: "ChecksummedData" = proto.Field( + proto.MESSAGE, + number=1, + message="ChecksummedData", + ) + read_range: "ReadRange" = proto.Field( + proto.MESSAGE, + number=2, + message="ReadRange", + ) + range_end: bool = proto.Field( + proto.BOOL, + number=3, + ) + + +class BidiReadHandle(proto.Message): + r"""BidiReadHandle contains a handle from a previous + BiDiReadObject invocation. The client can use this instead of + BidiReadObjectSpec as an optimized way of opening subsequent + bidirectional streams to the same object. + + Attributes: + handle (bytes): + Required. Opaque value describing a previous + read. + """ + + handle: bytes = proto.Field( + proto.BYTES, + number=1, + ) + + +class BidiWriteHandle(proto.Message): + r"""BidiWriteHandle contains a handle from a previous + BidiWriteObject invocation. The client can use this as an + optimized way of opening subsequent bidirectional streams to the + same object. + + Attributes: + handle (bytes): + Required. Opaque value describing a previous + write. + """ + + handle: bytes = proto.Field( + proto.BYTES, + number=1, + ) + + +class WriteObjectSpec(proto.Message): + r"""Describes an attempt to insert an object, possibly over + multiple requests. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource (google.cloud.storage_v2.types.Object): + Required. Destination object, including its + name and its metadata. + predefined_acl (str): + Optional. Apply a predefined set of access + controls to this object. Valid values are + "authenticatedRead", "bucketOwnerFullControl", + "bucketOwnerRead", "private", "projectPrivate", + or "publicRead". + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + object_size (int): + The expected final object size being uploaded. If this value + is set, closing the stream after writing fewer or more than + ``object_size`` bytes will result in an OUT_OF_RANGE error. + + This situation is considered a client error, and if such an + error occurs you must start the upload over from scratch, + this time sending the correct number of bytes. + + This field is a member of `oneof`_ ``_object_size``. + appendable (bool): + If true, the object will be created in + appendable mode. This field may only be set when + using BidiWriteObject. + + This field is a member of `oneof`_ ``_appendable``. + """ + + resource: "Object" = proto.Field( + proto.MESSAGE, + number=1, + message="Object", + ) + predefined_acl: str = proto.Field( + proto.STRING, + number=7, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + object_size: int = proto.Field( + proto.INT64, + number=8, + optional=True, + ) + appendable: bool = proto.Field( + proto.BOOL, + number=9, + optional=True, + ) + + +class WriteObjectRequest(proto.Message): + r"""Request message for WriteObject. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + upload_id (str): + For resumable uploads. This should be the ``upload_id`` + returned from a call to ``StartResumableWriteResponse``. + + This field is a member of `oneof`_ ``first_message``. + write_object_spec (google.cloud.storage_v2.types.WriteObjectSpec): + For non-resumable uploads. Describes the + overall upload, including the destination bucket + and object name, preconditions, etc. + + This field is a member of `oneof`_ ``first_message``. + write_offset (int): + Required. The offset from the beginning of the object at + which the data should be written. + + In the first ``WriteObjectRequest`` of a ``WriteObject()`` + action, it indicates the initial offset for the ``Write()`` + call. The value **must** be equal to the ``persisted_size`` + that a call to ``QueryWriteStatus()`` would return (0 if + this is the first write to the object). + + On subsequent calls, this value **must** be no larger than + the sum of the first ``write_offset`` and the sizes of all + ``data`` chunks sent previously on this stream. + + An incorrect value will cause an error. + checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + The data to insert. If a crc32c checksum is + provided that doesn't match the checksum + computed by the service, the request will fail. + + This field is a member of `oneof`_ ``data``. + object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + Optional. Checksums for the complete object. If the + checksums computed by the service don't match the specified + checksums the call will fail. May only be provided in the + first or last request (either with first_message, or + finish_write set). + finish_write (bool): + Optional. If ``true``, this indicates that the write is + complete. Sending any ``WriteObjectRequest``\ s subsequent + to one in which ``finish_write`` is ``true`` will cause an + error. For a non-resumable write (where the upload_id was + not set in the first message), it is an error not to set + this field in the final message of the stream. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + """ + + upload_id: str = proto.Field( + proto.STRING, + number=1, + oneof="first_message", + ) + write_object_spec: "WriteObjectSpec" = proto.Field( + proto.MESSAGE, + number=2, + oneof="first_message", + message="WriteObjectSpec", + ) + write_offset: int = proto.Field( + proto.INT64, + number=3, + ) + checksummed_data: "ChecksummedData" = proto.Field( + proto.MESSAGE, + number=4, + oneof="data", + message="ChecksummedData", + ) + object_checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=6, + message="ObjectChecksums", + ) + finish_write: bool = proto.Field( + proto.BOOL, + number=7, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=8, + message="CommonObjectRequestParams", + ) + + +class WriteObjectResponse(proto.Message): + r"""Response message for WriteObject. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + persisted_size (int): + The total number of bytes that have been processed for the + given object from all ``WriteObject`` calls. Only set if the + upload has not finalized. + + This field is a member of `oneof`_ ``write_status``. + resource (google.cloud.storage_v2.types.Object): + A resource containing the metadata for the + uploaded object. Only set if the upload has + finalized. + + This field is a member of `oneof`_ ``write_status``. + """ + + persisted_size: int = proto.Field( + proto.INT64, + number=1, + oneof="write_status", + ) + resource: "Object" = proto.Field( + proto.MESSAGE, + number=2, + oneof="write_status", + message="Object", + ) + + +class AppendObjectSpec(proto.Message): + r"""Describes an attempt to append to an object, possibly over + multiple requests. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. The name of the bucket containing + the object to write. + object_ (str): + Required. The name of the object to open for + writing. + generation (int): + Required. The generation number of the object + to open for writing. + if_metageneration_match (int): + Makes the operation conditional on whether the object's + current metageneration matches the given value. + + Note that metageneration preconditions are only checked if + ``write_handle`` is empty. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether the object's + current metageneration does not match the given value. + + Note that metageneration preconditions are only checked if + ``write_handle`` is empty. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + routing_token (str): + An optional routing token that influences + request routing for the stream. Must be provided + if a BidiWriteObjectRedirectedError is returned. + + This field is a member of `oneof`_ ``_routing_token``. + write_handle (google.cloud.storage_v2.types.BidiWriteHandle): + An optional write handle returned from a previous + BidiWriteObjectResponse message or a + BidiWriteObjectRedirectedError error. + + Note that metageneration preconditions are only checked if + ``write_handle`` is empty. + + This field is a member of `oneof`_ ``_write_handle``. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + object_: str = proto.Field( + proto.STRING, + number=2, + ) + generation: int = proto.Field( + proto.INT64, + number=3, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + routing_token: str = proto.Field( + proto.STRING, + number=6, + optional=True, + ) + write_handle: "BidiWriteHandle" = proto.Field( + proto.MESSAGE, + number=7, + optional=True, + message="BidiWriteHandle", + ) + + +class BidiWriteObjectRequest(proto.Message): + r"""Request message for BidiWriteObject. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + upload_id (str): + For resumable uploads. This should be the ``upload_id`` + returned from a call to ``StartResumableWriteResponse``. + + This field is a member of `oneof`_ ``first_message``. + write_object_spec (google.cloud.storage_v2.types.WriteObjectSpec): + For non-resumable uploads. Describes the + overall upload, including the destination bucket + and object name, preconditions, etc. + + This field is a member of `oneof`_ ``first_message``. + append_object_spec (google.cloud.storage_v2.types.AppendObjectSpec): + For appendable uploads. Describes the object + to append to. + + This field is a member of `oneof`_ ``first_message``. + write_offset (int): + Required. The offset from the beginning of the object at + which the data should be written. + + In the first ``WriteObjectRequest`` of a ``WriteObject()`` + action, it indicates the initial offset for the ``Write()`` + call. The value **must** be equal to the ``persisted_size`` + that a call to ``QueryWriteStatus()`` would return (0 if + this is the first write to the object). + + On subsequent calls, this value **must** be no larger than + the sum of the first ``write_offset`` and the sizes of all + ``data`` chunks sent previously on this stream. + + An invalid value will cause an error. + checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + The data to insert. If a crc32c checksum is + provided that doesn't match the checksum + computed by the service, the request will fail. + + This field is a member of `oneof`_ ``data``. + object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + Optional. Checksums for the complete object. If the + checksums computed by the service don't match the specified + checksums the call will fail. May only be provided in the + first request or the last request (with finish_write set). + state_lookup (bool): + Optional. For each BidiWriteObjectRequest where state_lookup + is ``true`` or the client closes the stream, the service + will send a BidiWriteObjectResponse containing the current + persisted size. The persisted size sent in responses covers + all the bytes the server has persisted thus far and can be + used to decide what data is safe for the client to drop. + Note that the object's current size reported by the + BidiWriteObjectResponse may lag behind the number of bytes + written by the client. This field is ignored if + ``finish_write`` is set to true. + flush (bool): + Optional. Persists data written on the stream, up to and + including the current message, to permanent storage. This + option should be used sparingly as it may reduce + performance. Ongoing writes will periodically be persisted + on the server even when ``flush`` is not set. This field is + ignored if ``finish_write`` is set to true since there's no + need to checkpoint or flush if this message completes the + write. + finish_write (bool): + Optional. If ``true``, this indicates that the write is + complete. Sending any ``WriteObjectRequest``\ s subsequent + to one in which ``finish_write`` is ``true`` will cause an + error. For a non-resumable write (where the upload_id was + not set in the first message), it is an error not to set + this field in the final message of the stream. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + """ + + upload_id: str = proto.Field( + proto.STRING, + number=1, + oneof="first_message", + ) + write_object_spec: "WriteObjectSpec" = proto.Field( + proto.MESSAGE, + number=2, + oneof="first_message", + message="WriteObjectSpec", + ) + append_object_spec: "AppendObjectSpec" = proto.Field( + proto.MESSAGE, + number=11, + oneof="first_message", + message="AppendObjectSpec", + ) + write_offset: int = proto.Field( + proto.INT64, + number=3, + ) + checksummed_data: "ChecksummedData" = proto.Field( + proto.MESSAGE, + number=4, + oneof="data", + message="ChecksummedData", + ) + object_checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=6, + message="ObjectChecksums", + ) + state_lookup: bool = proto.Field( + proto.BOOL, + number=7, + ) + flush: bool = proto.Field( + proto.BOOL, + number=8, + ) + finish_write: bool = proto.Field( + proto.BOOL, + number=9, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=10, + message="CommonObjectRequestParams", + ) + + +class BidiWriteObjectResponse(proto.Message): + r"""Response message for BidiWriteObject. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + persisted_size (int): + The total number of bytes that have been processed for the + given object from all ``WriteObject`` calls. Only set if the + upload has not finalized. + + This field is a member of `oneof`_ ``write_status``. + resource (google.cloud.storage_v2.types.Object): + A resource containing the metadata for the + uploaded object. Only set if the upload has + finalized. + + This field is a member of `oneof`_ ``write_status``. + write_handle (google.cloud.storage_v2.types.BidiWriteHandle): + An optional write handle that will + periodically be present in response messages. + Clients should save it for later use in + establishing a new stream if a connection is + interrupted. + + This field is a member of `oneof`_ ``_write_handle``. + """ + + persisted_size: int = proto.Field( + proto.INT64, + number=1, + oneof="write_status", + ) + resource: "Object" = proto.Field( + proto.MESSAGE, + number=2, + oneof="write_status", + message="Object", + ) + write_handle: "BidiWriteHandle" = proto.Field( + proto.MESSAGE, + number=3, + optional=True, + message="BidiWriteHandle", + ) + + +class ListObjectsRequest(proto.Message): + r"""Request message for ListObjects. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + parent (str): + Required. Name of the bucket in which to look + for objects. + page_size (int): + Optional. Maximum number of ``items`` plus ``prefixes`` to + return in a single page of responses. As duplicate + ``prefixes`` are omitted, fewer total results may be + returned than requested. The service will use this parameter + or 1,000 items, whichever is smaller. + page_token (str): + Optional. A previously-returned page token + representing part of the larger set of results + to view. + delimiter (str): + Optional. If set, returns results in a directory-like mode. + ``items`` will contain only objects whose names, aside from + the ``prefix``, do not contain ``delimiter``. Objects whose + names, aside from the ``prefix``, contain ``delimiter`` will + have their name, truncated after the ``delimiter``, returned + in ``prefixes``. Duplicate ``prefixes`` are omitted. + include_trailing_delimiter (bool): + Optional. If true, objects that end in exactly one instance + of ``delimiter`` will have their metadata included in + ``items`` in addition to ``prefixes``. + prefix (str): + Optional. Filter results to objects whose + names begin with this prefix. + versions (bool): + Optional. If ``true``, lists all versions of an object as + distinct results. For more information, see `Object + Versioning `__. + read_mask (google.protobuf.field_mask_pb2.FieldMask): + Mask specifying which fields to read from each result. If no + mask is specified, will default to all fields except + items.acl and items.owner. + + - may be used to mean "all fields". + + This field is a member of `oneof`_ ``_read_mask``. + lexicographic_start (str): + Optional. Filter results to objects whose names are + lexicographically equal to or after lexicographic_start. If + lexicographic_end is also set, the objects listed have names + between lexicographic_start (inclusive) and + lexicographic_end (exclusive). + lexicographic_end (str): + Optional. Filter results to objects whose names are + lexicographically before lexicographic_end. If + lexicographic_start is also set, the objects listed have + names between lexicographic_start (inclusive) and + lexicographic_end (exclusive). + soft_deleted (bool): + Optional. If true, only list all soft-deleted + versions of the object. Soft delete policy is + required to set this option. + include_folders_as_prefixes (bool): + Optional. If true, will also include folders and managed + folders (besides objects) in the returned ``prefixes``. + Requires ``delimiter`` to be set to '/'. + match_glob (str): + Optional. Filter results to objects and prefixes that match + this glob pattern. See `List Objects Using + Glob `__ + for the full syntax. + filter (str): + Optional. Filter the returned objects. Currently only + supported for the ``contexts`` field. If ``delimiter`` is + set, the returned ``prefixes`` are exempt from this filter. + """ + + parent: str = proto.Field( + proto.STRING, + number=1, + ) + page_size: int = proto.Field( + proto.INT32, + number=2, + ) + page_token: str = proto.Field( + proto.STRING, + number=3, + ) + delimiter: str = proto.Field( + proto.STRING, + number=4, + ) + include_trailing_delimiter: bool = proto.Field( + proto.BOOL, + number=5, + ) + prefix: str = proto.Field( + proto.STRING, + number=6, + ) + versions: bool = proto.Field( + proto.BOOL, + number=7, + ) + read_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=8, + optional=True, + message=field_mask_pb2.FieldMask, + ) + lexicographic_start: str = proto.Field( + proto.STRING, + number=10, + ) + lexicographic_end: str = proto.Field( + proto.STRING, + number=11, + ) + soft_deleted: bool = proto.Field( + proto.BOOL, + number=12, + ) + include_folders_as_prefixes: bool = proto.Field( + proto.BOOL, + number=13, + ) + match_glob: str = proto.Field( + proto.STRING, + number=14, + ) + filter: str = proto.Field( + proto.STRING, + number=15, + ) + + +class QueryWriteStatusRequest(proto.Message): + r"""Request object for ``QueryWriteStatus``. + + Attributes: + upload_id (str): + Required. The name of the resume token for + the object whose write status is being + requested. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + """ + + upload_id: str = proto.Field( + proto.STRING, + number=1, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=2, + message="CommonObjectRequestParams", + ) + + +class QueryWriteStatusResponse(proto.Message): + r"""Response object for ``QueryWriteStatus``. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + persisted_size (int): + The total number of bytes that have been processed for the + given object from all ``WriteObject`` calls. This is the + correct value for the 'write_offset' field to use when + resuming the ``WriteObject`` operation. Only set if the + upload has not finalized. + + This field is a member of `oneof`_ ``write_status``. + resource (google.cloud.storage_v2.types.Object): + A resource containing the metadata for the + uploaded object. Only set if the upload has + finalized. + + This field is a member of `oneof`_ ``write_status``. + """ + + persisted_size: int = proto.Field( + proto.INT64, + number=1, + oneof="write_status", + ) + resource: "Object" = proto.Field( + proto.MESSAGE, + number=2, + oneof="write_status", + message="Object", + ) + + +class RewriteObjectRequest(proto.Message): + r"""Request message for RewriteObject. If the source object is encrypted + using a Customer-Supplied Encryption Key the key information must be + provided in the copy_source_encryption_algorithm, + copy_source_encryption_key_bytes, and + copy_source_encryption_key_sha256_bytes fields. If the destination + object should be encrypted the keying information should be provided + in the encryption_algorithm, encryption_key_bytes, and + encryption_key_sha256_bytes fields of the + common_object_request_params.customer_encryption field. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + destination_name (str): + Required. Immutable. The name of the destination object. See + the `Naming + Guidelines `__. + Example: ``test.txt`` The ``name`` field by itself does not + uniquely identify a Cloud Storage object. A Cloud Storage + object is uniquely identified by the tuple of (bucket, + object, generation). + destination_bucket (str): + Required. Immutable. The name of the bucket + containing the destination object. + destination_kms_key (str): + Optional. The name of the Cloud KMS key that + will be used to encrypt the destination object. + The Cloud KMS key must be located in same + location as the object. If the parameter is not + specified, the request uses the destination + bucket's default encryption key, if any, or else + the Google-managed encryption key. + destination (google.cloud.storage_v2.types.Object): + Optional. Properties of the destination, post-rewrite + object. The ``name``, ``bucket`` and ``kms_key`` fields must + not be populated (these values are specified in the + ``destination_name``, ``destination_bucket``, and + ``destination_kms_key`` fields). If ``destination`` is + present it will be used to construct the destination + object's metadata; otherwise the destination object's + metadata will be copied from the source object. + source_bucket (str): + Required. Name of the bucket in which to find + the source object. + source_object (str): + Required. Name of the source object. + source_generation (int): + Optional. If present, selects a specific + revision of the source object (as opposed to the + latest version, the default). + rewrite_token (str): + Optional. Include this field (from the + previous rewrite response) on each rewrite + request after the first one, until the rewrite + response 'done' flag is true. Calls that provide + a rewriteToken can omit all other request + fields, but if included those fields must match + the values provided in the first rewrite + request. + destination_predefined_acl (str): + Optional. Apply a predefined set of access + controls to the destination object. Valid values + are "authenticatedRead", + "bucketOwnerFullControl", "bucketOwnerRead", + "private", "projectPrivate", or "publicRead". + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the destination object's current metageneration + matches the given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the destination object's current metageneration + does not match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + if_source_generation_match (int): + Makes the operation conditional on whether + the source object's live generation matches the + given value. + + This field is a member of `oneof`_ ``_if_source_generation_match``. + if_source_generation_not_match (int): + Makes the operation conditional on whether + the source object's live generation does not + match the given value. + + This field is a member of `oneof`_ ``_if_source_generation_not_match``. + if_source_metageneration_match (int): + Makes the operation conditional on whether + the source object's current metageneration + matches the given value. + + This field is a member of `oneof`_ ``_if_source_metageneration_match``. + if_source_metageneration_not_match (int): + Makes the operation conditional on whether + the source object's current metageneration does + not match the given value. + + This field is a member of `oneof`_ ``_if_source_metageneration_not_match``. + max_bytes_rewritten_per_call (int): + Optional. The maximum number of bytes that will be rewritten + per rewrite request. Most callers shouldn't need to specify + this parameter - it is primarily in place to support + testing. If specified the value must be an integral multiple + of 1 MiB (1048576). Also, this only applies to requests + where the source and destination span locations and/or + storage classes. Finally, this value must not change across + rewrite calls else you'll get an error that the + ``rewriteToken`` is invalid. + copy_source_encryption_algorithm (str): + Optional. The algorithm used to encrypt the + source object, if any. Used if the source object + was encrypted with a Customer-Supplied + Encryption Key. + copy_source_encryption_key_bytes (bytes): + Optional. The raw bytes (not base64-encoded) + AES-256 encryption key used to encrypt the + source object, if it was encrypted with a + Customer-Supplied Encryption Key. + copy_source_encryption_key_sha256_bytes (bytes): + Optional. The raw bytes (not base64-encoded) + SHA256 hash of the encryption key used to + encrypt the source object, if it was encrypted + with a Customer-Supplied Encryption Key. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + Optional. The checksums of the complete + object. This will be used to validate the + destination object after rewriting. + """ + + destination_name: str = proto.Field( + proto.STRING, + number=24, + ) + destination_bucket: str = proto.Field( + proto.STRING, + number=25, + ) + destination_kms_key: str = proto.Field( + proto.STRING, + number=27, + ) + destination: "Object" = proto.Field( + proto.MESSAGE, + number=1, + message="Object", + ) + source_bucket: str = proto.Field( + proto.STRING, + number=2, + ) + source_object: str = proto.Field( + proto.STRING, + number=3, + ) + source_generation: int = proto.Field( + proto.INT64, + number=4, + ) + rewrite_token: str = proto.Field( + proto.STRING, + number=5, + ) + destination_predefined_acl: str = proto.Field( + proto.STRING, + number=28, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=8, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=9, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=10, + optional=True, + ) + if_source_generation_match: int = proto.Field( + proto.INT64, + number=11, + optional=True, + ) + if_source_generation_not_match: int = proto.Field( + proto.INT64, + number=12, + optional=True, + ) + if_source_metageneration_match: int = proto.Field( + proto.INT64, + number=13, + optional=True, + ) + if_source_metageneration_not_match: int = proto.Field( + proto.INT64, + number=14, + optional=True, + ) + max_bytes_rewritten_per_call: int = proto.Field( + proto.INT64, + number=15, + ) + copy_source_encryption_algorithm: str = proto.Field( + proto.STRING, + number=16, + ) + copy_source_encryption_key_bytes: bytes = proto.Field( + proto.BYTES, + number=21, + ) + copy_source_encryption_key_sha256_bytes: bytes = proto.Field( + proto.BYTES, + number=22, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=19, + message="CommonObjectRequestParams", + ) + object_checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=29, + message="ObjectChecksums", + ) + + +class RewriteResponse(proto.Message): + r"""A rewrite response. + + Attributes: + total_bytes_rewritten (int): + The total bytes written so far, which can be + used to provide a waiting user with a progress + indicator. This property is always present in + the response. + object_size (int): + The total size of the object being copied in + bytes. This property is always present in the + response. + done (bool): + ``true`` if the copy is finished; otherwise, ``false`` if + the copy is in progress. This property is always present in + the response. + rewrite_token (str): + A token to use in subsequent requests to + continue copying data. This token is present in + the response only when there is more data to + copy. + resource (google.cloud.storage_v2.types.Object): + A resource containing the metadata for the + copied-to object. This property is present in + the response only when copying completes. + """ + + total_bytes_rewritten: int = proto.Field( + proto.INT64, + number=1, + ) + object_size: int = proto.Field( + proto.INT64, + number=2, + ) + done: bool = proto.Field( + proto.BOOL, + number=3, + ) + rewrite_token: str = proto.Field( + proto.STRING, + number=4, + ) + resource: "Object" = proto.Field( + proto.MESSAGE, + number=5, + message="Object", + ) + + +class MoveObjectRequest(proto.Message): + r"""Request message for MoveObject. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + bucket (str): + Required. Name of the bucket in which the + object resides. + source_object (str): + Required. Name of the source object. + destination_object (str): + Required. Name of the destination object. + if_source_generation_match (int): + Optional. Makes the operation conditional on whether the + source object's current generation matches the given value. + ``if_source_generation_match`` and + ``if_source_generation_not_match`` conditions are mutually + exclusive: it's an error for both of them to be set in the + request. + + This field is a member of `oneof`_ ``_if_source_generation_match``. + if_source_generation_not_match (int): + Optional. Makes the operation conditional on whether the + source object's current generation does not match the given + value. ``if_source_generation_match`` and + ``if_source_generation_not_match`` conditions are mutually + exclusive: it's an error for both of them to be set in the + request. + + This field is a member of `oneof`_ ``_if_source_generation_not_match``. + if_source_metageneration_match (int): + Optional. Makes the operation conditional on whether the + source object's current metageneration matches the given + value. ``if_source_metageneration_match`` and + ``if_source_metageneration_not_match`` conditions are + mutually exclusive: it's an error for both of them to be set + in the request. + + This field is a member of `oneof`_ ``_if_source_metageneration_match``. + if_source_metageneration_not_match (int): + Optional. Makes the operation conditional on whether the + source object's current metageneration does not match the + given value. ``if_source_metageneration_match`` and + ``if_source_metageneration_not_match`` conditions are + mutually exclusive: it's an error for both of them to be set + in the request. + + This field is a member of `oneof`_ ``_if_source_metageneration_not_match``. + if_generation_match (int): + Optional. Makes the operation conditional on whether the + destination object's current generation matches the given + value. Setting to 0 makes the operation succeed only if + there are no live versions of the object. + ``if_generation_match`` and ``if_generation_not_match`` + conditions are mutually exclusive: it's an error for both of + them to be set in the request. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Optional. Makes the operation conditional on whether the + destination object's current generation does not match the + given value. If no live object exists, the precondition + fails. Setting to 0 makes the operation succeed only if + there is a live version of the object. + ``if_generation_match`` and ``if_generation_not_match`` + conditions are mutually exclusive: it's an error for both of + them to be set in the request. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Optional. Makes the operation conditional on whether the + destination object's current metageneration matches the + given value. ``if_metageneration_match`` and + ``if_metageneration_not_match`` conditions are mutually + exclusive: it's an error for both of them to be set in the + request. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Optional. Makes the operation conditional on whether the + destination object's current metageneration does not match + the given value. ``if_metageneration_match`` and + ``if_metageneration_not_match`` conditions are mutually + exclusive: it's an error for both of them to be set in the + request. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + """ + + bucket: str = proto.Field( + proto.STRING, + number=1, + ) + source_object: str = proto.Field( + proto.STRING, + number=2, + ) + destination_object: str = proto.Field( + proto.STRING, + number=3, + ) + if_source_generation_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_source_generation_not_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + if_source_metageneration_match: int = proto.Field( + proto.INT64, + number=6, + optional=True, + ) + if_source_metageneration_not_match: int = proto.Field( + proto.INT64, + number=7, + optional=True, + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=8, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=9, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=10, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=11, + optional=True, + ) + + +class StartResumableWriteRequest(proto.Message): + r"""Request message StartResumableWrite. + + Attributes: + write_object_spec (google.cloud.storage_v2.types.WriteObjectSpec): + Required. Contains the information necessary + to start a resumable write. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests related to an object. + object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + Optional. The checksums of the complete object. This is used + to validate the uploaded object. For each upload, + ``object_checksums`` can be provided when initiating a + resumable upload with\ ``StartResumableWriteRequest`` or + when completing a write with ``WriteObjectRequest`` with + ``finish_write`` set to ``true``. + """ + + write_object_spec: "WriteObjectSpec" = proto.Field( + proto.MESSAGE, + number=1, + message="WriteObjectSpec", + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=3, + message="CommonObjectRequestParams", + ) + object_checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=5, + message="ObjectChecksums", + ) + + +class StartResumableWriteResponse(proto.Message): + r"""Response object for ``StartResumableWrite``. + + Attributes: + upload_id (str): + A unique identifier for the initiated resumable write + operation. As the ID grants write access, you should keep it + confidential during the upload to prevent unauthorized + access and data tampering during your upload. This ID should + be included in subsequent ``WriteObject`` requests to upload + the object data. + """ + + upload_id: str = proto.Field( + proto.STRING, + number=1, + ) + + +class UpdateObjectRequest(proto.Message): + r"""Request message for UpdateObject. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + object_ (google.cloud.storage_v2.types.Object): + Required. The object to update. + The object's bucket and name fields are used to + identify the object to update. If present, the + object's generation field selects a specific + revision of this object whose metadata should be + updated. Otherwise, assumes the live version of + the object. + if_generation_match (int): + Makes the operation conditional on whether + the object's current generation matches the + given value. Setting to 0 makes the operation + succeed only if there are no live versions of + the object. + + This field is a member of `oneof`_ ``_if_generation_match``. + if_generation_not_match (int): + Makes the operation conditional on whether + the object's live generation does not match the + given value. If no live object exists, the + precondition fails. Setting to 0 makes the + operation succeed only if there is a live + version of the object. + + This field is a member of `oneof`_ ``_if_generation_not_match``. + if_metageneration_match (int): + Makes the operation conditional on whether + the object's current metageneration matches the + given value. + + This field is a member of `oneof`_ ``_if_metageneration_match``. + if_metageneration_not_match (int): + Makes the operation conditional on whether + the object's current metageneration does not + match the given value. + + This field is a member of `oneof`_ ``_if_metageneration_not_match``. + predefined_acl (str): + Optional. Apply a predefined set of access + controls to this object. Valid values are + "authenticatedRead", "bucketOwnerFullControl", + "bucketOwnerRead", "private", "projectPrivate", + or "publicRead". + update_mask (google.protobuf.field_mask_pb2.FieldMask): + Required. List of fields to be updated. + + To specify ALL fields, equivalent to the JSON API's "update" + function, specify a single field with the value ``*``. Note: + not recommended. If a new field is introduced at a later + time, an older client updating with the ``*`` may + accidentally reset the new field's value. + + Not specifying any fields is an error. + common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + Optional. A set of parameters common to + Storage API requests concerning an object. + override_unlocked_retention (bool): + Optional. Overrides the unlocked retention + config on the object. + """ + + object_: "Object" = proto.Field( + proto.MESSAGE, + number=1, + message="Object", + ) + if_generation_match: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + if_generation_not_match: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + if_metageneration_match: int = proto.Field( + proto.INT64, + number=4, + optional=True, + ) + if_metageneration_not_match: int = proto.Field( + proto.INT64, + number=5, + optional=True, + ) + predefined_acl: str = proto.Field( + proto.STRING, + number=10, + ) + update_mask: field_mask_pb2.FieldMask = proto.Field( + proto.MESSAGE, + number=7, + message=field_mask_pb2.FieldMask, + ) + common_object_request_params: "CommonObjectRequestParams" = proto.Field( + proto.MESSAGE, + number=8, + message="CommonObjectRequestParams", + ) + override_unlocked_retention: bool = proto.Field( + proto.BOOL, + number=11, + ) + + +class CommonObjectRequestParams(proto.Message): + r"""Parameters that can be passed to any object request. + + Attributes: + encryption_algorithm (str): + Optional. Encryption algorithm used with the + Customer-Supplied Encryption Keys feature. + encryption_key_bytes (bytes): + Optional. Encryption key used with the + Customer-Supplied Encryption Keys feature. In + raw bytes format (not base64-encoded). + encryption_key_sha256_bytes (bytes): + Optional. SHA256 hash of encryption key used + with the Customer-Supplied Encryption Keys + feature. + """ + + encryption_algorithm: str = proto.Field( + proto.STRING, + number=1, + ) + encryption_key_bytes: bytes = proto.Field( + proto.BYTES, + number=4, + ) + encryption_key_sha256_bytes: bytes = proto.Field( + proto.BYTES, + number=5, + ) + + +class ServiceConstants(proto.Message): + r"""Shared constants.""" + + class Values(proto.Enum): + r"""A collection of constant values meaningful to the Storage + API. + + Values: + VALUES_UNSPECIFIED (0): + Unused. Proto3 requires first enum to be 0. + MAX_READ_CHUNK_BYTES (2097152): + The maximum size chunk that can will be + returned in a single ReadRequest. + 2 MiB. + MAX_WRITE_CHUNK_BYTES (2097152): + The maximum size chunk that can be sent in a + single WriteObjectRequest. 2 MiB. + MAX_OBJECT_SIZE_MB (5242880): + The maximum size of an object in MB - whether + written in a single stream or composed from + multiple other objects. 5 TiB. + MAX_CUSTOM_METADATA_FIELD_NAME_BYTES (1024): + The maximum length field name that can be + sent in a single custom metadata field. + 1 KiB. + MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES (4096): + The maximum length field value that can be sent in a single + custom_metadata field. 4 KiB. + MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES (8192): + The maximum total bytes that can be populated into all field + names and values of the custom_metadata for one object. 8 + KiB. + MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES (20480): + The maximum total bytes that can be populated + into all bucket metadata fields. + 20 KiB. + MAX_NOTIFICATION_CONFIGS_PER_BUCKET (100): + The maximum number of NotificationConfigs + that can be registered for a given bucket. + MAX_LIFECYCLE_RULES_PER_BUCKET (100): + The maximum number of LifecycleRules that can + be registered for a given bucket. + MAX_NOTIFICATION_CUSTOM_ATTRIBUTES (5): + The maximum number of custom attributes per + NotificationConfigs. + MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH (256): + The maximum length of a custom attribute key + included in NotificationConfig. + MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH (1024): + The maximum length of a custom attribute + value included in a NotificationConfig. + MAX_LABELS_ENTRIES_COUNT (64): + The maximum number of key/value entries per + bucket label. + MAX_LABELS_KEY_VALUE_LENGTH (63): + The maximum character length of the key or + value in a bucket label map. + MAX_LABELS_KEY_VALUE_BYTES (128): + The maximum byte size of the key or value in + a bucket label map. + MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST (1000): + The maximum number of object IDs that can be + included in a DeleteObjectsRequest. + SPLIT_TOKEN_MAX_VALID_DAYS (14): + The maximum number of days for which a token + returned by the GetListObjectsSplitPoints RPC is + valid. + """ + _pb_options = {"allow_alias": True} + VALUES_UNSPECIFIED = 0 + MAX_READ_CHUNK_BYTES = 2097152 + MAX_WRITE_CHUNK_BYTES = 2097152 + MAX_OBJECT_SIZE_MB = 5242880 + MAX_CUSTOM_METADATA_FIELD_NAME_BYTES = 1024 + MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES = 4096 + MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES = 8192 + MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES = 20480 + MAX_NOTIFICATION_CONFIGS_PER_BUCKET = 100 + MAX_LIFECYCLE_RULES_PER_BUCKET = 100 + MAX_NOTIFICATION_CUSTOM_ATTRIBUTES = 5 + MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH = 256 + MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH = 1024 + MAX_LABELS_ENTRIES_COUNT = 64 + MAX_LABELS_KEY_VALUE_LENGTH = 63 + MAX_LABELS_KEY_VALUE_BYTES = 128 + MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST = 1000 + SPLIT_TOKEN_MAX_VALID_DAYS = 14 + + +class Bucket(proto.Message): + r"""A bucket. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + name (str): + Identifier. The name of the bucket. Format: + ``projects/{project}/buckets/{bucket}`` + bucket_id (str): + Output only. The user-chosen part of the bucket name. The + ``{bucket}`` portion of the ``name`` field. For globally + unique buckets, this is equal to the "bucket name" of other + Cloud Storage APIs. Example: "pub". + etag (str): + The etag of the bucket. + If included in the metadata of an + UpdateBucketRequest, the operation will only be + performed if the etag matches that of the + bucket. + project (str): + Immutable. The project which owns this + bucket, in the format of + "projects/{projectIdentifier}". + {projectIdentifier} can be the project ID or + project number. Output values will always be in + project number format. + metageneration (int): + Output only. The metadata generation of this + bucket. + location (str): + Immutable. The location of the bucket. Object data for + objects in the bucket resides in physical storage within + this region. Defaults to ``US``. See the + [https://developers.google.com/storage/docs/concepts-techniques#specifyinglocations"][developer's + guide] for the authoritative list. Attempting to update this + field after the bucket is created will result in an error. + location_type (str): + Output only. The location type of the bucket + (region, dual-region, multi-region, etc). + storage_class (str): + Optional. The bucket's default storage class, used whenever + no storageClass is specified for a newly-created object. + This defines how objects in the bucket are stored and + determines the SLA and the cost of storage. If this value is + not specified when the bucket is created, it will default to + ``STANDARD``. For more information, see + https://developers.google.com/storage/docs/storage-classes. + rpo (str): + Optional. The recovery point objective for cross-region + replication of the bucket. Applicable only for dual- and + multi-region buckets. "DEFAULT" uses default replication. + "ASYNC_TURBO" enables turbo replication, valid for + dual-region buckets only. If rpo is not specified when the + bucket is created, it defaults to "DEFAULT". For more + information, see + https://cloud.google.com/storage/docs/availability-durability#turbo-replication. + acl (MutableSequence[google.cloud.storage_v2.types.BucketAccessControl]): + Optional. Access controls on the bucket. If + iam_config.uniform_bucket_level_access is enabled on this + bucket, requests to set, read, or modify acl is an error. + default_object_acl (MutableSequence[google.cloud.storage_v2.types.ObjectAccessControl]): + Optional. Default access controls to apply to new objects + when no ACL is provided. If + iam_config.uniform_bucket_level_access is enabled on this + bucket, requests to set, read, or modify acl is an error. + lifecycle (google.cloud.storage_v2.types.Bucket.Lifecycle): + Optional. The bucket's lifecycle config. See + [https://developers.google.com/storage/docs/lifecycle]Lifecycle + Management] for more information. + create_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The creation time of the bucket. + cors (MutableSequence[google.cloud.storage_v2.types.Bucket.Cors]): + Optional. The bucket's + [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing] + (CORS) config. + update_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The modification time of the + bucket. + default_event_based_hold (bool): + Optional. The default value for event-based + hold on newly created objects in this bucket. + Event-based hold is a way to retain objects + indefinitely until an event occurs, signified by + the hold's release. After being released, such + objects will be subject to bucket-level + retention (if any). One sample use case of this + flag is for banks to hold loan documents for at + least 3 years after loan is paid in full. Here, + bucket-level retention is 3 years and the event + is loan being paid in full. In this example, + these objects will be held intact for any number + of years until the event has occurred + (event-based hold on the object is released) and + then 3 more years after that. That means + retention duration of the objects begins from + the moment event-based hold transitioned from + true to false. Objects under event-based hold + cannot be deleted, overwritten or archived until + the hold is removed. + labels (MutableMapping[str, str]): + Optional. User-provided labels, in key/value + pairs. + website (google.cloud.storage_v2.types.Bucket.Website): + Optional. The bucket's website config, controlling how the + service behaves when accessing bucket contents as a web + site. See the + [https://cloud.google.com/storage/docs/static-website][Static + Website Examples] for more information. + versioning (google.cloud.storage_v2.types.Bucket.Versioning): + Optional. The bucket's versioning config. + logging (google.cloud.storage_v2.types.Bucket.Logging): + Optional. The bucket's logging config, which + defines the destination bucket and name prefix + (if any) for the current bucket's logs. + owner (google.cloud.storage_v2.types.Owner): + Output only. The owner of the bucket. This is + always the project team's owner group. + encryption (google.cloud.storage_v2.types.Bucket.Encryption): + Optional. Encryption config for a bucket. + billing (google.cloud.storage_v2.types.Bucket.Billing): + Optional. The bucket's billing config. + retention_policy (google.cloud.storage_v2.types.Bucket.RetentionPolicy): + Optional. The bucket's retention policy. The retention + policy enforces a minimum retention time for all objects + contained in the bucket, based on their creation time. Any + attempt to overwrite or delete objects younger than the + retention period will result in a PERMISSION_DENIED error. + An unlocked retention policy can be modified or removed from + the bucket via a storage.buckets.update operation. A locked + retention policy cannot be removed or shortened in duration + for the lifetime of the bucket. Attempting to remove or + decrease period of a locked retention policy will result in + a PERMISSION_DENIED error. + iam_config (google.cloud.storage_v2.types.Bucket.IamConfig): + Optional. The bucket's IAM config. + satisfies_pzs (bool): + Optional. Reserved for future use. + custom_placement_config (google.cloud.storage_v2.types.Bucket.CustomPlacementConfig): + Optional. Configuration that, if present, specifies the data + placement for a + [https://cloud.google.com/storage/docs/locations#location-dr][configurable + dual-region]. + autoclass (google.cloud.storage_v2.types.Bucket.Autoclass): + Optional. The bucket's Autoclass + configuration. If there is no configuration, the + Autoclass feature will be disabled and have no + effect on the bucket. + hierarchical_namespace (google.cloud.storage_v2.types.Bucket.HierarchicalNamespace): + Optional. The bucket's hierarchical namespace + configuration. If there is no configuration, the + hierarchical namespace feature will be disabled + and have no effect on the bucket. + soft_delete_policy (google.cloud.storage_v2.types.Bucket.SoftDeletePolicy): + Optional. The bucket's soft delete policy. + The soft delete policy prevents soft-deleted + objects from being permanently deleted. + object_retention (google.cloud.storage_v2.types.Bucket.ObjectRetention): + Optional. The bucket's object retention + configuration. Must be enabled before objects in + the bucket may have retention configured. + ip_filter (google.cloud.storage_v2.types.Bucket.IpFilter): + Optional. The bucket's IP filter + configuration. + + This field is a member of `oneof`_ ``_ip_filter``. + """ + + class Billing(proto.Message): + r"""Billing properties of a bucket. + + Attributes: + requester_pays (bool): + Optional. When set to true, Requester Pays is + enabled for this bucket. + """ + + requester_pays: bool = proto.Field( + proto.BOOL, + number=1, + ) + + class Cors(proto.Message): + r"""Cross-Origin Response sharing (CORS) properties for a bucket. + For more on Cloud Storage and CORS, see + https://cloud.google.com/storage/docs/cross-origin. For more on + CORS in general, see https://tools.ietf.org/html/rfc6454. + + Attributes: + origin (MutableSequence[str]): + Optional. The list of Origins eligible to receive CORS + response headers. See + [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on + origins. Note: "*" is permitted in the list of origins, and + means "any Origin". + method (MutableSequence[str]): + Optional. The list of HTTP methods on which to include CORS + response headers, (``GET``, ``OPTIONS``, ``POST``, etc) + Note: "*" is permitted in the list of methods, and means + "any method". + response_header (MutableSequence[str]): + Optional. The list of HTTP headers other than the + [https://www.w3.org/TR/cors/#simple-response-header][simple + response headers] to give permission for the user-agent to + share across domains. + max_age_seconds (int): + Optional. The value, in seconds, to return in the + [https://www.w3.org/TR/cors/#access-control-max-age-response-header][Access-Control-Max-Age + header] used in preflight responses. + """ + + origin: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=1, + ) + method: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=2, + ) + response_header: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=3, + ) + max_age_seconds: int = proto.Field( + proto.INT32, + number=4, + ) + + class Encryption(proto.Message): + r"""Encryption properties of a bucket. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + default_kms_key (str): + Optional. The name of the Cloud KMS key that + will be used to encrypt objects inserted into + this bucket, if no encryption method is + specified. + google_managed_encryption_enforcement_config (google.cloud.storage_v2.types.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig): + Optional. If omitted, then new objects with + GMEK encryption-type is allowed. If set, then + new objects created in this bucket must comply + with enforcement config. Changing this has no + effect on existing objects; it applies to new + objects only. + + This field is a member of `oneof`_ ``_google_managed_encryption_enforcement_config``. + customer_managed_encryption_enforcement_config (google.cloud.storage_v2.types.Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig): + Optional. If omitted, then new objects with + CMEK encryption-type is allowed. If set, then + new objects created in this bucket must comply + with enforcement config. Changing this has no + effect on existing objects; it applies to new + objects only. + + This field is a member of `oneof`_ ``_customer_managed_encryption_enforcement_config``. + customer_supplied_encryption_enforcement_config (google.cloud.storage_v2.types.Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig): + Optional. If omitted, then new objects with + CSEK encryption-type is allowed. If set, then + new objects created in this bucket must comply + with enforcement config. Changing this has no + effect on existing objects; it applies to new + objects only. + + This field is a member of `oneof`_ ``_customer_supplied_encryption_enforcement_config``. + """ + + class GoogleManagedEncryptionEnforcementConfig(proto.Message): + r"""Google Managed Encryption (GMEK) enforcement config of a + bucket. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + restriction_mode (str): + Restriction mode for google-managed encryption for new + objects within the bucket. Valid values are: + "NotRestricted", "FullyRestricted". If ``NotRestricted`` or + unset, creation of new objects with google-managed + encryption is allowed. If ``FullyRestricted``, new objects + can't be created using google-managed encryption. + + This field is a member of `oneof`_ ``_restriction_mode``. + effective_time (google.protobuf.timestamp_pb2.Timestamp): + Time from which the config was effective. + This is service-provided. + + This field is a member of `oneof`_ ``_effective_time``. + """ + + restriction_mode: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + effective_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message=timestamp_pb2.Timestamp, + ) + + class CustomerManagedEncryptionEnforcementConfig(proto.Message): + r"""Customer Managed Encryption (CMEK) enforcement config of a + bucket. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + restriction_mode (str): + Restriction mode for customer-managed encryption for new + objects within the bucket. Valid values are: + "NotRestricted", "FullyRestricted". If ``NotRestricted`` or + unset, creation of new objects with customer-managed + encryption is allowed. If ``FullyRestricted``, new objects + can't be created using customer-managed encryption. + + This field is a member of `oneof`_ ``_restriction_mode``. + effective_time (google.protobuf.timestamp_pb2.Timestamp): + Time from which the config was effective. + This is service-provided. + + This field is a member of `oneof`_ ``_effective_time``. + """ + + restriction_mode: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + effective_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message=timestamp_pb2.Timestamp, + ) + + class CustomerSuppliedEncryptionEnforcementConfig(proto.Message): + r"""Customer Supplied Encryption (CSEK) enforcement config of a + bucket. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + restriction_mode (str): + Restriction mode for customer-supplied encryption for new + objects within the bucket. Valid values are: + "NotRestricted", "FullyRestricted". If ``NotRestricted`` or + unset, creation of new objects with customer-supplied + encryption is allowed. If ``FullyRestricted``, new objects + can't be created using customer-supplied encryption. + + This field is a member of `oneof`_ ``_restriction_mode``. + effective_time (google.protobuf.timestamp_pb2.Timestamp): + Time from which the config was effective. + This is service-provided. + + This field is a member of `oneof`_ ``_effective_time``. + """ + + restriction_mode: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + effective_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message=timestamp_pb2.Timestamp, + ) + + default_kms_key: str = proto.Field( + proto.STRING, + number=1, + ) + google_managed_encryption_enforcement_config: "Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig" = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message="Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig", + ) + customer_managed_encryption_enforcement_config: "Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig" = proto.Field( + proto.MESSAGE, + number=3, + optional=True, + message="Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig", + ) + customer_supplied_encryption_enforcement_config: "Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig" = proto.Field( + proto.MESSAGE, + number=4, + optional=True, + message="Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig", + ) + + class IamConfig(proto.Message): + r"""Bucket restriction options. + + Attributes: + uniform_bucket_level_access (google.cloud.storage_v2.types.Bucket.IamConfig.UniformBucketLevelAccess): + Optional. Bucket restriction options + currently enforced on the bucket. + public_access_prevention (str): + Optional. Whether IAM will enforce public + access prevention. Valid values are "enforced" + or "inherited". + """ + + class UniformBucketLevelAccess(proto.Message): + r"""Settings for Uniform Bucket level access. + See + https://cloud.google.com/storage/docs/uniform-bucket-level-access. + + Attributes: + enabled (bool): + Optional. If set, access checks only use + bucket-level IAM policies or above. + lock_time (google.protobuf.timestamp_pb2.Timestamp): + Optional. The deadline time for changing + ``iam_config.uniform_bucket_level_access.enabled`` from + ``true`` to ``false``. Mutable until the specified deadline + is reached, but not afterward. + """ + + enabled: bool = proto.Field( + proto.BOOL, + number=1, + ) + lock_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + message=timestamp_pb2.Timestamp, + ) + + uniform_bucket_level_access: "Bucket.IamConfig.UniformBucketLevelAccess" = ( + proto.Field( + proto.MESSAGE, + number=1, + message="Bucket.IamConfig.UniformBucketLevelAccess", + ) + ) + public_access_prevention: str = proto.Field( + proto.STRING, + number=3, + ) + + class Lifecycle(proto.Message): + r"""Lifecycle properties of a bucket. + For more information, see + https://cloud.google.com/storage/docs/lifecycle. + + Attributes: + rule (MutableSequence[google.cloud.storage_v2.types.Bucket.Lifecycle.Rule]): + Optional. A lifecycle management rule, which + is made of an action to take and the + condition(s) under which the action will be + taken. + """ + + class Rule(proto.Message): + r"""A lifecycle Rule, combining an action to take on an object + and a condition which will trigger that action. + + Attributes: + action (google.cloud.storage_v2.types.Bucket.Lifecycle.Rule.Action): + Optional. The action to take. + condition (google.cloud.storage_v2.types.Bucket.Lifecycle.Rule.Condition): + Optional. The condition(s) under which the + action will be taken. + """ + + class Action(proto.Message): + r"""An action to take on an object. + + Attributes: + type_ (str): + Optional. Type of the action. Currently, only ``Delete``, + ``SetStorageClass``, and ``AbortIncompleteMultipartUpload`` + are supported. + storage_class (str): + Optional. Target storage class. Required iff + the type of the action is SetStorageClass. + """ + + type_: str = proto.Field( + proto.STRING, + number=1, + ) + storage_class: str = proto.Field( + proto.STRING, + number=2, + ) + + class Condition(proto.Message): + r"""A condition of an object which triggers some action. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + age_days (int): + Age of an object (in days). This condition is + satisfied when an object reaches the specified + age. A value of 0 indicates that all objects + immediately match this condition. + + This field is a member of `oneof`_ ``_age_days``. + created_before (google.type.date_pb2.Date): + Optional. This condition is satisfied when an + object is created before midnight of the + specified date in UTC. + is_live (bool): + Relevant only for versioned objects. If the value is + ``true``, this condition matches live objects; if the value + is ``false``, it matches archived objects. + + This field is a member of `oneof`_ ``_is_live``. + num_newer_versions (int): + Relevant only for versioned objects. If the + value is N, this condition is satisfied when + there are at least N versions (including the + live version) newer than this version of the + object. + + This field is a member of `oneof`_ ``_num_newer_versions``. + matches_storage_class (MutableSequence[str]): + Optional. Objects having any of the storage classes + specified by this condition will be matched. Values include + ``MULTI_REGIONAL``, ``REGIONAL``, ``NEARLINE``, + ``COLDLINE``, ``STANDARD``, and + ``DURABLE_REDUCED_AVAILABILITY``. + days_since_custom_time (int): + Number of days that have elapsed since the + custom timestamp set on an object. + The value of the field must be a nonnegative + integer. + + This field is a member of `oneof`_ ``_days_since_custom_time``. + custom_time_before (google.type.date_pb2.Date): + Optional. An object matches this condition if + the custom timestamp set on the object is before + the specified date in UTC. + days_since_noncurrent_time (int): + This condition is relevant only for versioned + objects. An object version satisfies this + condition only if these many days have been + passed since it became noncurrent. The value of + the field must be a nonnegative integer. If it's + zero, the object version will become eligible + for Lifecycle action as soon as it becomes + noncurrent. + + This field is a member of `oneof`_ ``_days_since_noncurrent_time``. + noncurrent_time_before (google.type.date_pb2.Date): + Optional. This condition is relevant only for + versioned objects. An object version satisfies + this condition only if it became noncurrent + before the specified date in UTC. + matches_prefix (MutableSequence[str]): + Optional. List of object name prefixes. If + any prefix exactly matches the beginning of the + object name, the condition evaluates to true. + matches_suffix (MutableSequence[str]): + Optional. List of object name suffixes. If + any suffix exactly matches the end of the object + name, the condition evaluates to true. + """ + + age_days: int = proto.Field( + proto.INT32, + number=1, + optional=True, + ) + created_before: date_pb2.Date = proto.Field( + proto.MESSAGE, + number=2, + message=date_pb2.Date, + ) + is_live: bool = proto.Field( + proto.BOOL, + number=3, + optional=True, + ) + num_newer_versions: int = proto.Field( + proto.INT32, + number=4, + optional=True, + ) + matches_storage_class: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=5, + ) + days_since_custom_time: int = proto.Field( + proto.INT32, + number=7, + optional=True, + ) + custom_time_before: date_pb2.Date = proto.Field( + proto.MESSAGE, + number=8, + message=date_pb2.Date, + ) + days_since_noncurrent_time: int = proto.Field( + proto.INT32, + number=9, + optional=True, + ) + noncurrent_time_before: date_pb2.Date = proto.Field( + proto.MESSAGE, + number=10, + message=date_pb2.Date, + ) + matches_prefix: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=11, + ) + matches_suffix: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=12, + ) + + action: "Bucket.Lifecycle.Rule.Action" = proto.Field( + proto.MESSAGE, + number=1, + message="Bucket.Lifecycle.Rule.Action", + ) + condition: "Bucket.Lifecycle.Rule.Condition" = proto.Field( + proto.MESSAGE, + number=2, + message="Bucket.Lifecycle.Rule.Condition", + ) + + rule: MutableSequence["Bucket.Lifecycle.Rule"] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message="Bucket.Lifecycle.Rule", + ) + + class Logging(proto.Message): + r"""Logging-related properties of a bucket. + + Attributes: + log_bucket (str): + Optional. The destination bucket where the current bucket's + logs should be placed, using path format (like + ``projects/123456/buckets/foo``). + log_object_prefix (str): + Optional. A prefix for log object names. + """ + + log_bucket: str = proto.Field( + proto.STRING, + number=1, + ) + log_object_prefix: str = proto.Field( + proto.STRING, + number=2, + ) + + class ObjectRetention(proto.Message): + r"""Object Retention related properties of a bucket. + + Attributes: + enabled (bool): + Optional. Output only. If true, object + retention is enabled for the bucket. + """ + + enabled: bool = proto.Field( + proto.BOOL, + number=1, + ) + + class RetentionPolicy(proto.Message): + r"""Retention policy properties of a bucket. + + Attributes: + effective_time (google.protobuf.timestamp_pb2.Timestamp): + Optional. Server-determined value that + indicates the time from which policy was + enforced and effective. + is_locked (bool): + Optional. Once locked, an object retention + policy cannot be modified. + retention_duration (google.protobuf.duration_pb2.Duration): + Optional. The duration that objects need to be retained. + Retention duration must be greater than zero and less than + 100 years. Note that enforcement of retention periods less + than a day is not guaranteed. Such periods should only be + used for testing purposes. Any ``nanos`` value specified + will be rounded down to the nearest second. + """ + + effective_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=1, + message=timestamp_pb2.Timestamp, + ) + is_locked: bool = proto.Field( + proto.BOOL, + number=2, + ) + retention_duration: duration_pb2.Duration = proto.Field( + proto.MESSAGE, + number=4, + message=duration_pb2.Duration, + ) + + class SoftDeletePolicy(proto.Message): + r"""Soft delete policy properties of a bucket. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + retention_duration (google.protobuf.duration_pb2.Duration): + The period of time that soft-deleted objects + in the bucket must be retained and cannot be + permanently deleted. The duration must be + greater than or equal to 7 days and less than 1 + year. + + This field is a member of `oneof`_ ``_retention_duration``. + effective_time (google.protobuf.timestamp_pb2.Timestamp): + Time from which the policy was effective. + This is service-provided. + + This field is a member of `oneof`_ ``_effective_time``. + """ + + retention_duration: duration_pb2.Duration = proto.Field( + proto.MESSAGE, + number=1, + optional=True, + message=duration_pb2.Duration, + ) + effective_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message=timestamp_pb2.Timestamp, + ) + + class Versioning(proto.Message): + r"""Properties of a bucket related to versioning. + For more on Cloud Storage versioning, see + https://cloud.google.com/storage/docs/object-versioning. + + Attributes: + enabled (bool): + Optional. While set to true, versioning is + fully enabled for this bucket. + """ + + enabled: bool = proto.Field( + proto.BOOL, + number=1, + ) + + class Website(proto.Message): + r"""Properties of a bucket related to accessing the contents as a + static website. For more on hosting a static website via Cloud + Storage, see + https://cloud.google.com/storage/docs/hosting-static-website. + + Attributes: + main_page_suffix (str): + Optional. If the requested object path is missing, the + service will ensure the path has a trailing '/', append this + suffix, and attempt to retrieve the resulting object. This + allows the creation of ``index.html`` objects to represent + directory pages. + not_found_page (str): + Optional. If the requested object path is missing, and any + ``mainPageSuffix`` object is missing, if applicable, the + service will return the named object from this bucket as the + content for a + [https://tools.ietf.org/html/rfc7231#section-6.5.4][404 Not + Found] result. + """ + + main_page_suffix: str = proto.Field( + proto.STRING, + number=1, + ) + not_found_page: str = proto.Field( + proto.STRING, + number=2, + ) + + class CustomPlacementConfig(proto.Message): + r"""Configuration for Custom Dual Regions. It should specify precisely + two eligible regions within the same Multiregion. More information + on regions may be found + `here `__. + + Attributes: + data_locations (MutableSequence[str]): + Optional. List of locations to use for data + placement. + """ + + data_locations: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=1, + ) + + class Autoclass(proto.Message): + r"""Configuration for a bucket's Autoclass feature. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + enabled (bool): + Optional. Enables Autoclass. + toggle_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. Latest instant at which the ``enabled`` field + was set to true after being disabled/unconfigured or set to + false after being enabled. If Autoclass is enabled when the + bucket is created, the toggle_time is set to the bucket + creation time. + terminal_storage_class (str): + An object in an Autoclass bucket will + eventually cool down to the terminal storage + class if there is no access to the object. The + only valid values are NEARLINE and ARCHIVE. + + This field is a member of `oneof`_ ``_terminal_storage_class``. + terminal_storage_class_update_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. Latest instant at which the + autoclass terminal storage class was updated. + + This field is a member of `oneof`_ ``_terminal_storage_class_update_time``. + """ + + enabled: bool = proto.Field( + proto.BOOL, + number=1, + ) + toggle_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + message=timestamp_pb2.Timestamp, + ) + terminal_storage_class: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + terminal_storage_class_update_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=4, + optional=True, + message=timestamp_pb2.Timestamp, + ) + + class IpFilter(proto.Message): + r"""The `bucket IP + filtering `__ + configuration. Specifies the network sources that can access the + bucket, as well as its underlying objects. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + mode (str): + The state of the IP filter configuration. Valid values are + ``Enabled`` and ``Disabled``. When set to ``Enabled``, IP + filtering rules are applied to a bucket and all incoming + requests to the bucket are evaluated against these rules. + When set to ``Disabled``, IP filtering rules are not applied + to a bucket.". + + This field is a member of `oneof`_ ``_mode``. + public_network_source (google.cloud.storage_v2.types.Bucket.IpFilter.PublicNetworkSource): + Public IPs allowed to operate or access the + bucket. + + This field is a member of `oneof`_ ``_public_network_source``. + vpc_network_sources (MutableSequence[google.cloud.storage_v2.types.Bucket.IpFilter.VpcNetworkSource]): + Optional. The list of network sources that + are allowed to access operations on the bucket + or the underlying objects. + allow_cross_org_vpcs (bool): + Optional. Whether or not to allow VPCs from + orgs different than the bucket's parent org to + access the bucket. When set to true, validations + on the existence of the VPCs won't be performed. + If set to false, each VPC network source will be + checked to belong to the same org as the bucket + as well as validated for existence. + allow_all_service_agent_access (bool): + Whether or not to allow all P4SA access to + the bucket. When set to true, IP filter config + validation will not apply. + + This field is a member of `oneof`_ ``_allow_all_service_agent_access``. + """ + + class PublicNetworkSource(proto.Message): + r"""The public network IP address ranges that can access the + bucket and its data. + + Attributes: + allowed_ip_cidr_ranges (MutableSequence[str]): + Optional. The list of IPv4 and IPv6 cidr + blocks that are allowed to operate or access the + bucket and its underlying objects. + """ + + allowed_ip_cidr_ranges: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=1, + ) + + class VpcNetworkSource(proto.Message): + r"""The list of VPC networks that can access the bucket. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + network (str): + Name of the network. + + Format: ``projects/PROJECT_ID/global/networks/NETWORK_NAME`` + + This field is a member of `oneof`_ ``_network``. + allowed_ip_cidr_ranges (MutableSequence[str]): + Optional. The list of public or private IPv4 and IPv6 CIDR + ranges that can access the bucket. In the CIDR IP address + block, the specified IP address must be properly truncated, + meaning all the host bits must be zero or else the input is + considered malformed. For example, ``192.0.2.0/24`` is + accepted but ``192.0.2.1/24`` is not. Similarly, for IPv6, + ``2001:db8::/32`` is accepted whereas ``2001:db8::1/32`` is + not. + """ + + network: str = proto.Field( + proto.STRING, + number=1, + optional=True, + ) + allowed_ip_cidr_ranges: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=2, + ) + + mode: str = proto.Field( + proto.STRING, + number=1, + optional=True, + ) + public_network_source: "Bucket.IpFilter.PublicNetworkSource" = proto.Field( + proto.MESSAGE, + number=2, + optional=True, + message="Bucket.IpFilter.PublicNetworkSource", + ) + vpc_network_sources: MutableSequence[ + "Bucket.IpFilter.VpcNetworkSource" + ] = proto.RepeatedField( + proto.MESSAGE, + number=3, + message="Bucket.IpFilter.VpcNetworkSource", + ) + allow_cross_org_vpcs: bool = proto.Field( + proto.BOOL, + number=4, + ) + allow_all_service_agent_access: bool = proto.Field( + proto.BOOL, + number=5, + optional=True, + ) + + class HierarchicalNamespace(proto.Message): + r"""Configuration for a bucket's hierarchical namespace feature. + + Attributes: + enabled (bool): + Optional. Enables the hierarchical namespace + feature. + """ + + enabled: bool = proto.Field( + proto.BOOL, + number=1, + ) + + name: str = proto.Field( + proto.STRING, + number=1, + ) + bucket_id: str = proto.Field( + proto.STRING, + number=2, + ) + etag: str = proto.Field( + proto.STRING, + number=29, + ) + project: str = proto.Field( + proto.STRING, + number=3, + ) + metageneration: int = proto.Field( + proto.INT64, + number=4, + ) + location: str = proto.Field( + proto.STRING, + number=5, + ) + location_type: str = proto.Field( + proto.STRING, + number=6, + ) + storage_class: str = proto.Field( + proto.STRING, + number=7, + ) + rpo: str = proto.Field( + proto.STRING, + number=27, + ) + acl: MutableSequence["BucketAccessControl"] = proto.RepeatedField( + proto.MESSAGE, + number=8, + message="BucketAccessControl", + ) + default_object_acl: MutableSequence["ObjectAccessControl"] = proto.RepeatedField( + proto.MESSAGE, + number=9, + message="ObjectAccessControl", + ) + lifecycle: Lifecycle = proto.Field( + proto.MESSAGE, + number=10, + message=Lifecycle, + ) + create_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=11, + message=timestamp_pb2.Timestamp, + ) + cors: MutableSequence[Cors] = proto.RepeatedField( + proto.MESSAGE, + number=12, + message=Cors, + ) + update_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=13, + message=timestamp_pb2.Timestamp, + ) + default_event_based_hold: bool = proto.Field( + proto.BOOL, + number=14, + ) + labels: MutableMapping[str, str] = proto.MapField( + proto.STRING, + proto.STRING, + number=15, + ) + website: Website = proto.Field( + proto.MESSAGE, + number=16, + message=Website, + ) + versioning: Versioning = proto.Field( + proto.MESSAGE, + number=17, + message=Versioning, + ) + logging: Logging = proto.Field( + proto.MESSAGE, + number=18, + message=Logging, + ) + owner: "Owner" = proto.Field( + proto.MESSAGE, + number=19, + message="Owner", + ) + encryption: Encryption = proto.Field( + proto.MESSAGE, + number=20, + message=Encryption, + ) + billing: Billing = proto.Field( + proto.MESSAGE, + number=21, + message=Billing, + ) + retention_policy: RetentionPolicy = proto.Field( + proto.MESSAGE, + number=22, + message=RetentionPolicy, + ) + iam_config: IamConfig = proto.Field( + proto.MESSAGE, + number=23, + message=IamConfig, + ) + satisfies_pzs: bool = proto.Field( + proto.BOOL, + number=25, + ) + custom_placement_config: CustomPlacementConfig = proto.Field( + proto.MESSAGE, + number=26, + message=CustomPlacementConfig, + ) + autoclass: Autoclass = proto.Field( + proto.MESSAGE, + number=28, + message=Autoclass, + ) + hierarchical_namespace: HierarchicalNamespace = proto.Field( + proto.MESSAGE, + number=32, + message=HierarchicalNamespace, + ) + soft_delete_policy: SoftDeletePolicy = proto.Field( + proto.MESSAGE, + number=31, + message=SoftDeletePolicy, + ) + object_retention: ObjectRetention = proto.Field( + proto.MESSAGE, + number=33, + message=ObjectRetention, + ) + ip_filter: IpFilter = proto.Field( + proto.MESSAGE, + number=38, + optional=True, + message=IpFilter, + ) + + +class BucketAccessControl(proto.Message): + r"""An access-control entry. + + Attributes: + role (str): + Optional. The access permission for the + entity. + id (str): + Optional. The ID of the access-control entry. + entity (str): + Optional. The entity holding the permission, in one of the + following forms: + + - ``user-{userid}`` + - ``user-{email}`` + - ``group-{groupid}`` + - ``group-{email}`` + - ``domain-{domain}`` + - ``project-{team}-{projectnumber}`` + - ``project-{team}-{projectid}`` + - ``allUsers`` + - ``allAuthenticatedUsers`` Examples: + - The user ``liz@example.com`` would be + ``user-liz@example.com``. + - The group ``example@googlegroups.com`` would be + ``group-example@googlegroups.com`` + - All members of the Google Apps for Business domain + ``example.com`` would be ``domain-example.com`` For + project entities, ``project-{team}-{projectnumber}`` + format will be returned on response. + entity_alt (str): + Output only. The alternative entity format, if exists. For + project entities, ``project-{team}-{projectid}`` format will + be returned on response. + entity_id (str): + Optional. The ID for the entity, if any. + etag (str): + Optional. The etag of the + BucketAccessControl. If included in the metadata + of an update or delete request message, the + operation operation will only be performed if + the etag matches that of the bucket's + BucketAccessControl. + email (str): + Optional. The email address associated with + the entity, if any. + domain (str): + Optional. The domain associated with the + entity, if any. + project_team (google.cloud.storage_v2.types.ProjectTeam): + Optional. The project team associated with + the entity, if any. + """ + + role: str = proto.Field( + proto.STRING, + number=1, + ) + id: str = proto.Field( + proto.STRING, + number=2, + ) + entity: str = proto.Field( + proto.STRING, + number=3, + ) + entity_alt: str = proto.Field( + proto.STRING, + number=9, + ) + entity_id: str = proto.Field( + proto.STRING, + number=4, + ) + etag: str = proto.Field( + proto.STRING, + number=8, + ) + email: str = proto.Field( + proto.STRING, + number=5, + ) + domain: str = proto.Field( + proto.STRING, + number=6, + ) + project_team: "ProjectTeam" = proto.Field( + proto.MESSAGE, + number=7, + message="ProjectTeam", + ) + + +class ChecksummedData(proto.Message): + r"""Message used to convey content being read or written, along + with an optional checksum. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + content (bytes): + Optional. The data. + crc32c (int): + If set, the CRC32C digest of the content + field. + + This field is a member of `oneof`_ ``_crc32c``. + """ + + content: bytes = proto.Field( + proto.BYTES, + number=1, + ) + crc32c: int = proto.Field( + proto.FIXED32, + number=2, + optional=True, + ) + + +class ObjectChecksums(proto.Message): + r"""Message used for storing full (not subrange) object + checksums. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + crc32c (int): + CRC32C digest of the object data. Computed by + the Cloud Storage service for all written + objects. If set in a WriteObjectRequest, service + will validate that the stored object matches + this checksum. + + This field is a member of `oneof`_ ``_crc32c``. + md5_hash (bytes): + Optional. 128 bit MD5 hash of the object data. For more + information about using the MD5 hash, see + [https://cloud.google.com/storage/docs/hashes-etags#json-api][Hashes + and ETags: Best Practices]. Not all objects will provide an + MD5 hash. For example, composite objects provide only crc32c + hashes. This value is equivalent to running + ``cat object.txt | openssl md5 -binary`` + """ + + crc32c: int = proto.Field( + proto.FIXED32, + number=1, + optional=True, + ) + md5_hash: bytes = proto.Field( + proto.BYTES, + number=2, + ) + + +class ObjectCustomContextPayload(proto.Message): + r"""The payload of a single user-defined object context. + + Attributes: + value (str): + Required. The value of the object context. + create_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The time at which the object + context was created. + update_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The time at which the object + context was last updated. + """ + + value: str = proto.Field( + proto.STRING, + number=1, + ) + create_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + message=timestamp_pb2.Timestamp, + ) + update_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=3, + message=timestamp_pb2.Timestamp, + ) + + +class ObjectContexts(proto.Message): + r"""All contexts of an object grouped by type. + + Attributes: + custom (MutableMapping[str, google.cloud.storage_v2.types.ObjectCustomContextPayload]): + Optional. User-defined object contexts. + """ + + custom: MutableMapping[str, "ObjectCustomContextPayload"] = proto.MapField( + proto.STRING, + proto.MESSAGE, + number=1, + message="ObjectCustomContextPayload", + ) + + +class CustomerEncryption(proto.Message): + r"""Describes the Customer-Supplied Encryption Key mechanism used + to store an Object's data at rest. + + Attributes: + encryption_algorithm (str): + Optional. The encryption algorithm. + key_sha256_bytes (bytes): + Optional. SHA256 hash value of the encryption + key. In raw bytes format (not base64-encoded). + """ + + encryption_algorithm: str = proto.Field( + proto.STRING, + number=1, + ) + key_sha256_bytes: bytes = proto.Field( + proto.BYTES, + number=3, + ) + + +class Object(proto.Message): + r"""An object. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + name (str): + Immutable. The name of this object. Nearly any sequence of + unicode characters is valid. See + `Guidelines `__. + Example: ``test.txt`` The ``name`` field by itself does not + uniquely identify a Cloud Storage object. A Cloud Storage + object is uniquely identified by the tuple of (bucket, + object, generation). + bucket (str): + Immutable. The name of the bucket containing + this object. + etag (str): + Optional. The etag of the object. + If included in the metadata of an update or + delete request message, the operation will only + be performed if the etag matches that of the + live object. + generation (int): + Immutable. The content generation of this + object. Used for object versioning. + restore_token (str): + Output only. Restore token used to + differentiate deleted objects with the same name + and generation. This field is output only, and + only set for deleted objects in HNS buckets. + + This field is a member of `oneof`_ ``_restore_token``. + metageneration (int): + Output only. The version of the metadata for + this generation of this object. Used for + preconditions and for detecting changes in + metadata. A metageneration number is only + meaningful in the context of a particular + generation of a particular object. + storage_class (str): + Optional. Storage class of the object. + size (int): + Output only. Content-Length of the object data in bytes, + matching + [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 + §3.3.2]. + content_encoding (str): + Optional. Content-Encoding of the object data, matching + [https://tools.ietf.org/html/rfc7231#section-3.1.2.2][RFC + 7231 §3.1.2.2] + content_disposition (str): + Optional. Content-Disposition of the object data, matching + [https://tools.ietf.org/html/rfc6266][RFC 6266]. + cache_control (str): + Optional. Cache-Control directive for the object data, + matching + [https://tools.ietf.org/html/rfc7234#section-5.2"][RFC 7234 + §5.2]. If omitted, and the object is accessible to all + anonymous users, the default will be + ``public, max-age=3600``. + acl (MutableSequence[google.cloud.storage_v2.types.ObjectAccessControl]): + Optional. Access controls on the object. If + iam_config.uniform_bucket_level_access is enabled on the + parent bucket, requests to set, read, or modify acl is an + error. + content_language (str): + Optional. Content-Language of the object data, matching + [https://tools.ietf.org/html/rfc7231#section-3.1.3.2][RFC + 7231 §3.1.3.2]. + delete_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. If this object is noncurrent, + this is the time when the object became + noncurrent. + finalize_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The time when the object was + finalized. + content_type (str): + Optional. Content-Type of the object data, matching + [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC + 7231 §3.1.1.5]. If an object is stored without a + Content-Type, it is served as ``application/octet-stream``. + create_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The creation time of the object. + component_count (int): + Output only. Number of underlying components + that make up this object. Components are + accumulated by compose operations. + checksums (google.cloud.storage_v2.types.ObjectChecksums): + Output only. Hashes for the data part of this + object. This field is used for output only and + will be silently ignored if provided in + requests. The checksums of the complete object + regardless of data range. If the object is + downloaded in full, the client should compute + one of these checksums over the downloaded + object and compare it against the value provided + here. + update_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The modification time of the + object metadata. Set initially to object + creation time and then updated whenever any + metadata of the object changes. This includes + changes made by a requester, such as modifying + custom metadata, as well as changes made by + Cloud Storage on behalf of a requester, such as + changing the storage class based on an Object + Lifecycle Configuration. + kms_key (str): + Optional. Cloud KMS Key used to encrypt this + object, if the object is encrypted by such a + key. + update_storage_class_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The time at which the object's storage class + was last changed. When the object is initially created, it + will be set to time_created. + temporary_hold (bool): + Optional. Whether an object is under + temporary hold. While this flag is set to true, + the object is protected against deletion and + overwrites. A common use case of this flag is + regulatory investigations where objects need to + be retained while the investigation is ongoing. + Note that unlike event-based hold, temporary + hold does not impact retention expiration time + of an object. + retention_expire_time (google.protobuf.timestamp_pb2.Timestamp): + Optional. A server-determined value that + specifies the earliest time that the object's + retention period expires. Note 1: This field is + not provided for objects with an active + event-based hold, since retention expiration is + unknown until the hold is removed. Note 2: This + value can be provided even when temporary hold + is set (so that the user can reason about policy + without having to first unset the temporary + hold). + metadata (MutableMapping[str, str]): + Optional. User-provided metadata, in + key/value pairs. + contexts (google.cloud.storage_v2.types.ObjectContexts): + Optional. User-defined or system-defined + object contexts. Each object context is a + key-payload pair, where the key provides the + identification and the payload holds the + associated value and additional metadata. + event_based_hold (bool): + Whether an object is under event-based hold. An event-based + hold is a way to force the retention of an object until + after some event occurs. Once the hold is released by + explicitly setting this field to false, the object will + become subject to any bucket-level retention policy, except + that the retention duration will be calculated from the time + the event based hold was lifted, rather than the time the + object was created. + + In a WriteObject request, not setting this field implies + that the value should be taken from the parent bucket's + "default_event_based_hold" field. In a response, this field + will always be set to true or false. + + This field is a member of `oneof`_ ``_event_based_hold``. + owner (google.cloud.storage_v2.types.Owner): + Output only. The owner of the object. This + will always be the uploader of the object. + customer_encryption (google.cloud.storage_v2.types.CustomerEncryption): + Optional. Metadata of Customer-Supplied + Encryption Key, if the object is encrypted by + such a key. + custom_time (google.protobuf.timestamp_pb2.Timestamp): + Optional. A user-specified timestamp set on + an object. + soft_delete_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. This is the time when the object became + soft-deleted. + + Soft-deleted objects are only accessible if a + soft_delete_policy is enabled. Also see hard_delete_time. + + This field is a member of `oneof`_ ``_soft_delete_time``. + hard_delete_time (google.protobuf.timestamp_pb2.Timestamp): + Output only. The time when the object will be permanently + deleted. + + Only set when an object becomes soft-deleted with a + soft_delete_policy. Otherwise, the object will not be + accessible. + + This field is a member of `oneof`_ ``_hard_delete_time``. + retention (google.cloud.storage_v2.types.Object.Retention): + Optional. Retention configuration of this + object. May only be configured if the bucket has + object retention enabled. + """ + + class Retention(proto.Message): + r"""Specifies retention parameters of the object. Objects under + retention cannot be deleted or overwritten until their retention + expires. + + Attributes: + mode (google.cloud.storage_v2.types.Object.Retention.Mode): + Optional. The mode of the Retention. + retain_until_time (google.protobuf.timestamp_pb2.Timestamp): + Optional. The timestamp that the object needs + to be retained until. Value cannot be set in the + past or more than 100 years in the future. + """ + + class Mode(proto.Enum): + r"""Retention mode values. + + Values: + MODE_UNSPECIFIED (0): + No specified mode. Object is not under + retention. + UNLOCKED (1): + Retention period may be decreased or + increased. The Retention configuration may be + removed. The mode may be changed to locked. + LOCKED (2): + Retention period may be increased. + The Retention configuration cannot be removed. + The mode cannot be changed. + """ + MODE_UNSPECIFIED = 0 + UNLOCKED = 1 + LOCKED = 2 + + mode: "Object.Retention.Mode" = proto.Field( + proto.ENUM, + number=1, + enum="Object.Retention.Mode", + ) + retain_until_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + message=timestamp_pb2.Timestamp, + ) + + name: str = proto.Field( + proto.STRING, + number=1, + ) + bucket: str = proto.Field( + proto.STRING, + number=2, + ) + etag: str = proto.Field( + proto.STRING, + number=27, + ) + generation: int = proto.Field( + proto.INT64, + number=3, + ) + restore_token: str = proto.Field( + proto.STRING, + number=35, + optional=True, + ) + metageneration: int = proto.Field( + proto.INT64, + number=4, + ) + storage_class: str = proto.Field( + proto.STRING, + number=5, + ) + size: int = proto.Field( + proto.INT64, + number=6, + ) + content_encoding: str = proto.Field( + proto.STRING, + number=7, + ) + content_disposition: str = proto.Field( + proto.STRING, + number=8, + ) + cache_control: str = proto.Field( + proto.STRING, + number=9, + ) + acl: MutableSequence["ObjectAccessControl"] = proto.RepeatedField( + proto.MESSAGE, + number=10, + message="ObjectAccessControl", + ) + content_language: str = proto.Field( + proto.STRING, + number=11, + ) + delete_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=12, + message=timestamp_pb2.Timestamp, + ) + finalize_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=36, + message=timestamp_pb2.Timestamp, + ) + content_type: str = proto.Field( + proto.STRING, + number=13, + ) + create_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=14, + message=timestamp_pb2.Timestamp, + ) + component_count: int = proto.Field( + proto.INT32, + number=15, + ) + checksums: "ObjectChecksums" = proto.Field( + proto.MESSAGE, + number=16, + message="ObjectChecksums", + ) + update_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=17, + message=timestamp_pb2.Timestamp, + ) + kms_key: str = proto.Field( + proto.STRING, + number=18, + ) + update_storage_class_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=19, + message=timestamp_pb2.Timestamp, + ) + temporary_hold: bool = proto.Field( + proto.BOOL, + number=20, + ) + retention_expire_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=21, + message=timestamp_pb2.Timestamp, + ) + metadata: MutableMapping[str, str] = proto.MapField( + proto.STRING, + proto.STRING, + number=22, + ) + contexts: "ObjectContexts" = proto.Field( + proto.MESSAGE, + number=38, + message="ObjectContexts", + ) + event_based_hold: bool = proto.Field( + proto.BOOL, + number=23, + optional=True, + ) + owner: "Owner" = proto.Field( + proto.MESSAGE, + number=24, + message="Owner", + ) + customer_encryption: "CustomerEncryption" = proto.Field( + proto.MESSAGE, + number=25, + message="CustomerEncryption", + ) + custom_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=26, + message=timestamp_pb2.Timestamp, + ) + soft_delete_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=28, + optional=True, + message=timestamp_pb2.Timestamp, + ) + hard_delete_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=29, + optional=True, + message=timestamp_pb2.Timestamp, + ) + retention: Retention = proto.Field( + proto.MESSAGE, + number=30, + message=Retention, + ) + + +class ObjectAccessControl(proto.Message): + r"""An access-control entry. + + Attributes: + role (str): + Optional. The access permission for the entity. One of the + following values: + + - ``READER`` + - ``WRITER`` + - ``OWNER`` + id (str): + Optional. The ID of the access-control entry. + entity (str): + Optional. The entity holding the permission, in one of the + following forms: + + - ``user-{userid}`` + - ``user-{email}`` + - ``group-{groupid}`` + - ``group-{email}`` + - ``domain-{domain}`` + - ``project-{team}-{projectnumber}`` + - ``project-{team}-{projectid}`` + - ``allUsers`` + - ``allAuthenticatedUsers`` Examples: + - The user ``liz@example.com`` would be + ``user-liz@example.com``. + - The group ``example@googlegroups.com`` would be + ``group-example@googlegroups.com``. + - All members of the Google Apps for Business domain + ``example.com`` would be ``domain-example.com``. For + project entities, ``project-{team}-{projectnumber}`` + format will be returned on response. + entity_alt (str): + Output only. The alternative entity format, if exists. For + project entities, ``project-{team}-{projectid}`` format will + be returned on response. + entity_id (str): + Optional. The ID for the entity, if any. + etag (str): + Optional. The etag of the + ObjectAccessControl. If included in the metadata + of an update or delete request message, the + operation will only be performed if the etag + matches that of the live object's + ObjectAccessControl. + email (str): + Optional. The email address associated with + the entity, if any. + domain (str): + Optional. The domain associated with the + entity, if any. + project_team (google.cloud.storage_v2.types.ProjectTeam): + Optional. The project team associated with + the entity, if any. + """ + + role: str = proto.Field( + proto.STRING, + number=1, + ) + id: str = proto.Field( + proto.STRING, + number=2, + ) + entity: str = proto.Field( + proto.STRING, + number=3, + ) + entity_alt: str = proto.Field( + proto.STRING, + number=9, + ) + entity_id: str = proto.Field( + proto.STRING, + number=4, + ) + etag: str = proto.Field( + proto.STRING, + number=8, + ) + email: str = proto.Field( + proto.STRING, + number=5, + ) + domain: str = proto.Field( + proto.STRING, + number=6, + ) + project_team: "ProjectTeam" = proto.Field( + proto.MESSAGE, + number=7, + message="ProjectTeam", + ) + + +class ListObjectsResponse(proto.Message): + r"""The result of a call to Objects.ListObjects + + Attributes: + objects (MutableSequence[google.cloud.storage_v2.types.Object]): + The list of items. + prefixes (MutableSequence[str]): + The list of prefixes of objects + matching-but-not-listed up to and including the + requested delimiter. + next_page_token (str): + The continuation token, used to page through + large result sets. Provide this value in a + subsequent request to return the next page of + results. + """ + + @property + def raw_page(self): + return self + + objects: MutableSequence["Object"] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message="Object", + ) + prefixes: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=2, + ) + next_page_token: str = proto.Field( + proto.STRING, + number=3, + ) + + +class ProjectTeam(proto.Message): + r"""Represents the Viewers, Editors, or Owners of a given + project. + + Attributes: + project_number (str): + Optional. The project number. + team (str): + Optional. The team. + """ + + project_number: str = proto.Field( + proto.STRING, + number=1, + ) + team: str = proto.Field( + proto.STRING, + number=2, + ) + + +class Owner(proto.Message): + r"""The owner of a specific resource. + + Attributes: + entity (str): + Optional. The entity, in the form ``user-``\ *userId*. + entity_id (str): + Optional. The ID for the entity. + """ + + entity: str = proto.Field( + proto.STRING, + number=1, + ) + entity_id: str = proto.Field( + proto.STRING, + number=2, + ) + + +class ContentRange(proto.Message): + r"""Specifies a requested range of bytes to download. + + Attributes: + start (int): + The starting offset of the object data. This + value is inclusive. + end (int): + The ending offset of the object data. This + value is exclusive. + complete_length (int): + The complete length of the object data. + """ + + start: int = proto.Field( + proto.INT64, + number=1, + ) + end: int = proto.Field( + proto.INT64, + number=2, + ) + complete_length: int = proto.Field( + proto.INT64, + number=3, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 000000000..574c5aed3 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,3 @@ +[mypy] +python_version = 3.7 +namespace_packages = True diff --git a/noxfile.py b/noxfile.py index 693fcb1b4..451fced3e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -101,7 +101,19 @@ def default(session, install_extras=True): CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) # Install all test dependencies, then install this package in-place. - session.install("mock", "pytest", "pytest-cov", "pytest-asyncio", "brotli", "grpcio", "grpcio-status", "proto-plus", "grpc-google-iam-v1", "-c", constraints_path) + session.install( + "mock", + "pytest", + "pytest-cov", + "pytest-asyncio", + "brotli", + "grpcio", + "grpcio-status", + "proto-plus", + "grpc-google-iam-v1", + "-c", + constraints_path, + ) if install_extras: session.install("opentelemetry-api", "opentelemetry-sdk") diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json new file mode 100644 index 000000000..907bdb30e --- /dev/null +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -0,0 +1,3939 @@ +{ + "clientLibrary": { + "apis": [ + { + "id": "google.storage.v2", + "version": "v2" + } + ], + "language": "PYTHON", + "name": "google-cloud-storage", + "version": "0.1.0" + }, + "snippets": [ + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.bidi_read_object", + "method": { + "fullName": "google.storage.v2.Storage.BidiReadObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "BidiReadObject" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.storage_v2.types.BidiReadObjectRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "Iterable[google.cloud.storage_v2.types.BidiReadObjectResponse]", + "shortName": "bidi_read_object" + }, + "description": "Sample for BidiReadObject", + "file": "storage_v2_generated_storage_bidi_read_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_BidiReadObject_async", + "segments": [ + { + "end": 61, + "start": 27, + "type": "FULL" + }, + { + "end": 61, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 54, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 57, + "start": 55, + "type": "REQUEST_EXECUTION" + }, + { + "end": 62, + "start": 58, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_bidi_read_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.bidi_read_object", + "method": { + "fullName": "google.storage.v2.Storage.BidiReadObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "BidiReadObject" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.storage_v2.types.BidiReadObjectRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "Iterable[google.cloud.storage_v2.types.BidiReadObjectResponse]", + "shortName": "bidi_read_object" + }, + "description": "Sample for BidiReadObject", + "file": "storage_v2_generated_storage_bidi_read_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_BidiReadObject_sync", + "segments": [ + { + "end": 61, + "start": 27, + "type": "FULL" + }, + { + "end": 61, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 54, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 57, + "start": 55, + "type": "REQUEST_EXECUTION" + }, + { + "end": 62, + "start": 58, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_bidi_read_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.bidi_write_object", + "method": { + "fullName": "google.storage.v2.Storage.BidiWriteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "BidiWriteObject" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.storage_v2.types.BidiWriteObjectRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "Iterable[google.cloud.storage_v2.types.BidiWriteObjectResponse]", + "shortName": "bidi_write_object" + }, + "description": "Sample for BidiWriteObject", + "file": "storage_v2_generated_storage_bidi_write_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_BidiWriteObject_async", + "segments": [ + { + "end": 63, + "start": 27, + "type": "FULL" + }, + { + "end": 63, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 64, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_bidi_write_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.bidi_write_object", + "method": { + "fullName": "google.storage.v2.Storage.BidiWriteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "BidiWriteObject" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.storage_v2.types.BidiWriteObjectRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "Iterable[google.cloud.storage_v2.types.BidiWriteObjectResponse]", + "shortName": "bidi_write_object" + }, + "description": "Sample for BidiWriteObject", + "file": "storage_v2_generated_storage_bidi_write_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_BidiWriteObject_sync", + "segments": [ + { + "end": 63, + "start": 27, + "type": "FULL" + }, + { + "end": 63, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 64, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_bidi_write_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.cancel_resumable_write", + "method": { + "fullName": "google.storage.v2.Storage.CancelResumableWrite", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "CancelResumableWrite" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.CancelResumableWriteRequest" + }, + { + "name": "upload_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.CancelResumableWriteResponse", + "shortName": "cancel_resumable_write" + }, + "description": "Sample for CancelResumableWrite", + "file": "storage_v2_generated_storage_cancel_resumable_write_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_CancelResumableWrite_async", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_cancel_resumable_write_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.cancel_resumable_write", + "method": { + "fullName": "google.storage.v2.Storage.CancelResumableWrite", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "CancelResumableWrite" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.CancelResumableWriteRequest" + }, + { + "name": "upload_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.CancelResumableWriteResponse", + "shortName": "cancel_resumable_write" + }, + "description": "Sample for CancelResumableWrite", + "file": "storage_v2_generated_storage_cancel_resumable_write_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_CancelResumableWrite_sync", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_cancel_resumable_write_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.compose_object", + "method": { + "fullName": "google.storage.v2.Storage.ComposeObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ComposeObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ComposeObjectRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "compose_object" + }, + "description": "Sample for ComposeObject", + "file": "storage_v2_generated_storage_compose_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ComposeObject_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_compose_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.compose_object", + "method": { + "fullName": "google.storage.v2.Storage.ComposeObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ComposeObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ComposeObjectRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "compose_object" + }, + "description": "Sample for ComposeObject", + "file": "storage_v2_generated_storage_compose_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ComposeObject_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_compose_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.create_bucket", + "method": { + "fullName": "google.storage.v2.Storage.CreateBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "CreateBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.CreateBucketRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "bucket", + "type": "google.cloud.storage_v2.types.Bucket" + }, + { + "name": "bucket_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "create_bucket" + }, + "description": "Sample for CreateBucket", + "file": "storage_v2_generated_storage_create_bucket_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_CreateBucket_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_create_bucket_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.create_bucket", + "method": { + "fullName": "google.storage.v2.Storage.CreateBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "CreateBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.CreateBucketRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "bucket", + "type": "google.cloud.storage_v2.types.Bucket" + }, + { + "name": "bucket_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "create_bucket" + }, + "description": "Sample for CreateBucket", + "file": "storage_v2_generated_storage_create_bucket_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_CreateBucket_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_create_bucket_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.delete_bucket", + "method": { + "fullName": "google.storage.v2.Storage.DeleteBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "DeleteBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.DeleteBucketRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "shortName": "delete_bucket" + }, + "description": "Sample for DeleteBucket", + "file": "storage_v2_generated_storage_delete_bucket_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_DeleteBucket_async", + "segments": [ + { + "end": 49, + "start": 27, + "type": "FULL" + }, + { + "end": 49, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_delete_bucket_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.delete_bucket", + "method": { + "fullName": "google.storage.v2.Storage.DeleteBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "DeleteBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.DeleteBucketRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "shortName": "delete_bucket" + }, + "description": "Sample for DeleteBucket", + "file": "storage_v2_generated_storage_delete_bucket_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_DeleteBucket_sync", + "segments": [ + { + "end": 49, + "start": 27, + "type": "FULL" + }, + { + "end": 49, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_delete_bucket_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.delete_object", + "method": { + "fullName": "google.storage.v2.Storage.DeleteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "DeleteObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.DeleteObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "shortName": "delete_object" + }, + "description": "Sample for DeleteObject", + "file": "storage_v2_generated_storage_delete_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_DeleteObject_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_delete_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.delete_object", + "method": { + "fullName": "google.storage.v2.Storage.DeleteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "DeleteObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.DeleteObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "shortName": "delete_object" + }, + "description": "Sample for DeleteObject", + "file": "storage_v2_generated_storage_delete_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_DeleteObject_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_delete_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.get_bucket", + "method": { + "fullName": "google.storage.v2.Storage.GetBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "GetBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.GetBucketRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "get_bucket" + }, + "description": "Sample for GetBucket", + "file": "storage_v2_generated_storage_get_bucket_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_GetBucket_async", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_get_bucket_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.get_bucket", + "method": { + "fullName": "google.storage.v2.Storage.GetBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "GetBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.GetBucketRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "get_bucket" + }, + "description": "Sample for GetBucket", + "file": "storage_v2_generated_storage_get_bucket_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_GetBucket_sync", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_get_bucket_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.get_iam_policy", + "method": { + "fullName": "google.storage.v2.Storage.GetIamPolicy", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "GetIamPolicy" + }, + "parameters": [ + { + "name": "request", + "type": "google.iam.v1.iam_policy_pb2.GetIamPolicyRequest" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.iam.v1.policy_pb2.Policy", + "shortName": "get_iam_policy" + }, + "description": "Sample for GetIamPolicy", + "file": "storage_v2_generated_storage_get_iam_policy_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_GetIamPolicy_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 41, + "start": 39, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 42, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_get_iam_policy_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.get_iam_policy", + "method": { + "fullName": "google.storage.v2.Storage.GetIamPolicy", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "GetIamPolicy" + }, + "parameters": [ + { + "name": "request", + "type": "google.iam.v1.iam_policy_pb2.GetIamPolicyRequest" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.iam.v1.policy_pb2.Policy", + "shortName": "get_iam_policy" + }, + "description": "Sample for GetIamPolicy", + "file": "storage_v2_generated_storage_get_iam_policy_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_GetIamPolicy_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 41, + "start": 39, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 42, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_get_iam_policy_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.get_object", + "method": { + "fullName": "google.storage.v2.Storage.GetObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "GetObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.GetObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "get_object" + }, + "description": "Sample for GetObject", + "file": "storage_v2_generated_storage_get_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_GetObject_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_get_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.get_object", + "method": { + "fullName": "google.storage.v2.Storage.GetObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "GetObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.GetObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "get_object" + }, + "description": "Sample for GetObject", + "file": "storage_v2_generated_storage_get_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_GetObject_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_get_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.list_buckets", + "method": { + "fullName": "google.storage.v2.Storage.ListBuckets", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ListBuckets" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ListBucketsRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.services.storage.pagers.ListBucketsAsyncPager", + "shortName": "list_buckets" + }, + "description": "Sample for ListBuckets", + "file": "storage_v2_generated_storage_list_buckets_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ListBuckets_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_list_buckets_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.list_buckets", + "method": { + "fullName": "google.storage.v2.Storage.ListBuckets", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ListBuckets" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ListBucketsRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.services.storage.pagers.ListBucketsPager", + "shortName": "list_buckets" + }, + "description": "Sample for ListBuckets", + "file": "storage_v2_generated_storage_list_buckets_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ListBuckets_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_list_buckets_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.list_objects", + "method": { + "fullName": "google.storage.v2.Storage.ListObjects", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ListObjects" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ListObjectsRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.services.storage.pagers.ListObjectsAsyncPager", + "shortName": "list_objects" + }, + "description": "Sample for ListObjects", + "file": "storage_v2_generated_storage_list_objects_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ListObjects_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_list_objects_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.list_objects", + "method": { + "fullName": "google.storage.v2.Storage.ListObjects", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ListObjects" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ListObjectsRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.services.storage.pagers.ListObjectsPager", + "shortName": "list_objects" + }, + "description": "Sample for ListObjects", + "file": "storage_v2_generated_storage_list_objects_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ListObjects_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_list_objects_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.lock_bucket_retention_policy", + "method": { + "fullName": "google.storage.v2.Storage.LockBucketRetentionPolicy", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "LockBucketRetentionPolicy" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.LockBucketRetentionPolicyRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "lock_bucket_retention_policy" + }, + "description": "Sample for LockBucketRetentionPolicy", + "file": "storage_v2_generated_storage_lock_bucket_retention_policy_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_LockBucketRetentionPolicy_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_lock_bucket_retention_policy_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.lock_bucket_retention_policy", + "method": { + "fullName": "google.storage.v2.Storage.LockBucketRetentionPolicy", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "LockBucketRetentionPolicy" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.LockBucketRetentionPolicyRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "lock_bucket_retention_policy" + }, + "description": "Sample for LockBucketRetentionPolicy", + "file": "storage_v2_generated_storage_lock_bucket_retention_policy_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_LockBucketRetentionPolicy_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_lock_bucket_retention_policy_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.move_object", + "method": { + "fullName": "google.storage.v2.Storage.MoveObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "MoveObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.MoveObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "source_object", + "type": "str" + }, + { + "name": "destination_object", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "move_object" + }, + "description": "Sample for MoveObject", + "file": "storage_v2_generated_storage_move_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_MoveObject_async", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_move_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.move_object", + "method": { + "fullName": "google.storage.v2.Storage.MoveObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "MoveObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.MoveObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "source_object", + "type": "str" + }, + { + "name": "destination_object", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "move_object" + }, + "description": "Sample for MoveObject", + "file": "storage_v2_generated_storage_move_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_MoveObject_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_move_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.query_write_status", + "method": { + "fullName": "google.storage.v2.Storage.QueryWriteStatus", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "QueryWriteStatus" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.QueryWriteStatusRequest" + }, + { + "name": "upload_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.QueryWriteStatusResponse", + "shortName": "query_write_status" + }, + "description": "Sample for QueryWriteStatus", + "file": "storage_v2_generated_storage_query_write_status_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_QueryWriteStatus_async", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_query_write_status_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.query_write_status", + "method": { + "fullName": "google.storage.v2.Storage.QueryWriteStatus", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "QueryWriteStatus" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.QueryWriteStatusRequest" + }, + { + "name": "upload_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.QueryWriteStatusResponse", + "shortName": "query_write_status" + }, + "description": "Sample for QueryWriteStatus", + "file": "storage_v2_generated_storage_query_write_status_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_QueryWriteStatus_sync", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_query_write_status_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.read_object", + "method": { + "fullName": "google.storage.v2.Storage.ReadObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ReadObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ReadObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "Iterable[google.cloud.storage_v2.types.ReadObjectResponse]", + "shortName": "read_object" + }, + "description": "Sample for ReadObject", + "file": "storage_v2_generated_storage_read_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ReadObject_async", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_read_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.read_object", + "method": { + "fullName": "google.storage.v2.Storage.ReadObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "ReadObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.ReadObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "Iterable[google.cloud.storage_v2.types.ReadObjectResponse]", + "shortName": "read_object" + }, + "description": "Sample for ReadObject", + "file": "storage_v2_generated_storage_read_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_ReadObject_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_read_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.restore_object", + "method": { + "fullName": "google.storage.v2.Storage.RestoreObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "RestoreObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.RestoreObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "restore_object" + }, + "description": "Sample for RestoreObject", + "file": "storage_v2_generated_storage_restore_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_RestoreObject_async", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_restore_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.restore_object", + "method": { + "fullName": "google.storage.v2.Storage.RestoreObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "RestoreObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.RestoreObjectRequest" + }, + { + "name": "bucket", + "type": "str" + }, + { + "name": "object_", + "type": "str" + }, + { + "name": "generation", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "restore_object" + }, + "description": "Sample for RestoreObject", + "file": "storage_v2_generated_storage_restore_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_RestoreObject_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_restore_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.rewrite_object", + "method": { + "fullName": "google.storage.v2.Storage.RewriteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "RewriteObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.RewriteObjectRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.RewriteResponse", + "shortName": "rewrite_object" + }, + "description": "Sample for RewriteObject", + "file": "storage_v2_generated_storage_rewrite_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_RewriteObject_async", + "segments": [ + { + "end": 54, + "start": 27, + "type": "FULL" + }, + { + "end": 54, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 48, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 51, + "start": 49, + "type": "REQUEST_EXECUTION" + }, + { + "end": 55, + "start": 52, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_rewrite_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.rewrite_object", + "method": { + "fullName": "google.storage.v2.Storage.RewriteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "RewriteObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.RewriteObjectRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.RewriteResponse", + "shortName": "rewrite_object" + }, + "description": "Sample for RewriteObject", + "file": "storage_v2_generated_storage_rewrite_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_RewriteObject_sync", + "segments": [ + { + "end": 54, + "start": 27, + "type": "FULL" + }, + { + "end": 54, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 48, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 51, + "start": 49, + "type": "REQUEST_EXECUTION" + }, + { + "end": 55, + "start": 52, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_rewrite_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.set_iam_policy", + "method": { + "fullName": "google.storage.v2.Storage.SetIamPolicy", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "SetIamPolicy" + }, + "parameters": [ + { + "name": "request", + "type": "google.iam.v1.iam_policy_pb2.SetIamPolicyRequest" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.iam.v1.policy_pb2.Policy", + "shortName": "set_iam_policy" + }, + "description": "Sample for SetIamPolicy", + "file": "storage_v2_generated_storage_set_iam_policy_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_SetIamPolicy_async", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 41, + "start": 39, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 42, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_set_iam_policy_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.set_iam_policy", + "method": { + "fullName": "google.storage.v2.Storage.SetIamPolicy", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "SetIamPolicy" + }, + "parameters": [ + { + "name": "request", + "type": "google.iam.v1.iam_policy_pb2.SetIamPolicyRequest" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.iam.v1.policy_pb2.Policy", + "shortName": "set_iam_policy" + }, + "description": "Sample for SetIamPolicy", + "file": "storage_v2_generated_storage_set_iam_policy_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_SetIamPolicy_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 41, + "start": 39, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 42, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_set_iam_policy_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.start_resumable_write", + "method": { + "fullName": "google.storage.v2.Storage.StartResumableWrite", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "StartResumableWrite" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.StartResumableWriteRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.StartResumableWriteResponse", + "shortName": "start_resumable_write" + }, + "description": "Sample for StartResumableWrite", + "file": "storage_v2_generated_storage_start_resumable_write_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_StartResumableWrite_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_start_resumable_write_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.start_resumable_write", + "method": { + "fullName": "google.storage.v2.Storage.StartResumableWrite", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "StartResumableWrite" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.StartResumableWriteRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.StartResumableWriteResponse", + "shortName": "start_resumable_write" + }, + "description": "Sample for StartResumableWrite", + "file": "storage_v2_generated_storage_start_resumable_write_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_StartResumableWrite_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_start_resumable_write_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.test_iam_permissions", + "method": { + "fullName": "google.storage.v2.Storage.TestIamPermissions", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "permissions", + "type": "MutableSequence[str]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.iam.v1.iam_policy_pb2.TestIamPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "storage_v2_generated_storage_test_iam_permissions_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_TestIamPermissions_async", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 41, + "start": 39, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 42, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_test_iam_permissions_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.test_iam_permissions", + "method": { + "fullName": "google.storage.v2.Storage.TestIamPermissions", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "permissions", + "type": "MutableSequence[str]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.iam.v1.iam_policy_pb2.TestIamPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "storage_v2_generated_storage_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_TestIamPermissions_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 41, + "start": 39, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 42, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_test_iam_permissions_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.update_bucket", + "method": { + "fullName": "google.storage.v2.Storage.UpdateBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "UpdateBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.UpdateBucketRequest" + }, + { + "name": "bucket", + "type": "google.cloud.storage_v2.types.Bucket" + }, + { + "name": "update_mask", + "type": "google.protobuf.field_mask_pb2.FieldMask" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "update_bucket" + }, + "description": "Sample for UpdateBucket", + "file": "storage_v2_generated_storage_update_bucket_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_UpdateBucket_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_update_bucket_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.update_bucket", + "method": { + "fullName": "google.storage.v2.Storage.UpdateBucket", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "UpdateBucket" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.UpdateBucketRequest" + }, + { + "name": "bucket", + "type": "google.cloud.storage_v2.types.Bucket" + }, + { + "name": "update_mask", + "type": "google.protobuf.field_mask_pb2.FieldMask" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Bucket", + "shortName": "update_bucket" + }, + "description": "Sample for UpdateBucket", + "file": "storage_v2_generated_storage_update_bucket_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_UpdateBucket_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_update_bucket_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.update_object", + "method": { + "fullName": "google.storage.v2.Storage.UpdateObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "UpdateObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.UpdateObjectRequest" + }, + { + "name": "object_", + "type": "google.cloud.storage_v2.types.Object" + }, + { + "name": "update_mask", + "type": "google.protobuf.field_mask_pb2.FieldMask" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "update_object" + }, + "description": "Sample for UpdateObject", + "file": "storage_v2_generated_storage_update_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_UpdateObject_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_update_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.update_object", + "method": { + "fullName": "google.storage.v2.Storage.UpdateObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "UpdateObject" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.storage_v2.types.UpdateObjectRequest" + }, + { + "name": "object_", + "type": "google.cloud.storage_v2.types.Object" + }, + { + "name": "update_mask", + "type": "google.protobuf.field_mask_pb2.FieldMask" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.Object", + "shortName": "update_object" + }, + "description": "Sample for UpdateObject", + "file": "storage_v2_generated_storage_update_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_UpdateObject_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_update_object_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.storage_v2.StorageAsyncClient", + "shortName": "StorageAsyncClient" + }, + "fullName": "google.cloud.storage_v2.StorageAsyncClient.write_object", + "method": { + "fullName": "google.storage.v2.Storage.WriteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "WriteObject" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.storage_v2.types.WriteObjectRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.WriteObjectResponse", + "shortName": "write_object" + }, + "description": "Sample for WriteObject", + "file": "storage_v2_generated_storage_write_object_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_WriteObject_async", + "segments": [ + { + "end": 62, + "start": 27, + "type": "FULL" + }, + { + "end": 62, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 63, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_write_object_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.storage_v2.StorageClient", + "shortName": "StorageClient" + }, + "fullName": "google.cloud.storage_v2.StorageClient.write_object", + "method": { + "fullName": "google.storage.v2.Storage.WriteObject", + "service": { + "fullName": "google.storage.v2.Storage", + "shortName": "Storage" + }, + "shortName": "WriteObject" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.storage_v2.types.WriteObjectRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.storage_v2.types.WriteObjectResponse", + "shortName": "write_object" + }, + "description": "Sample for WriteObject", + "file": "storage_v2_generated_storage_write_object_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "storage_v2_generated_Storage_WriteObject_sync", + "segments": [ + { + "end": 62, + "start": 27, + "type": "FULL" + }, + { + "end": 62, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 63, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "storage_v2_generated_storage_write_object_sync.py" + } + ] +} diff --git a/samples/generated_samples/storage_v2_generated_storage_bidi_read_object_async.py b/samples/generated_samples/storage_v2_generated_storage_bidi_read_object_async.py new file mode 100644 index 000000000..395fe9eea --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_bidi_read_object_async.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for BidiReadObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_BidiReadObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_bidi_read_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.BidiReadObjectRequest( + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiReadObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.bidi_read_object(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + +# [END storage_v2_generated_Storage_BidiReadObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_bidi_read_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_bidi_read_object_sync.py new file mode 100644 index 000000000..d494483b1 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_bidi_read_object_sync.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for BidiReadObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_BidiReadObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_bidi_read_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.BidiReadObjectRequest( + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiReadObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.bidi_read_object(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + +# [END storage_v2_generated_Storage_BidiReadObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_bidi_write_object_async.py b/samples/generated_samples/storage_v2_generated_storage_bidi_write_object_async.py new file mode 100644 index 000000000..89cf5a0d7 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_bidi_write_object_async.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for BidiWriteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_BidiWriteObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_bidi_write_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.BidiWriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiWriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.bidi_write_object(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + +# [END storage_v2_generated_Storage_BidiWriteObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_bidi_write_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_bidi_write_object_sync.py new file mode 100644 index 000000000..e53f97fc8 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_bidi_write_object_sync.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for BidiWriteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_BidiWriteObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_bidi_write_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.BidiWriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.BidiWriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.bidi_write_object(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + +# [END storage_v2_generated_Storage_BidiWriteObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_async.py b/samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_async.py new file mode 100644 index 000000000..3e2610dd2 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_async.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for CancelResumableWrite +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_CancelResumableWrite_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_cancel_resumable_write(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.CancelResumableWriteRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = await client.cancel_resumable_write(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_CancelResumableWrite_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_sync.py b/samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_sync.py new file mode 100644 index 000000000..38a1fe5b1 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_cancel_resumable_write_sync.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for CancelResumableWrite +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_CancelResumableWrite_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_cancel_resumable_write(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.CancelResumableWriteRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = client.cancel_resumable_write(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_CancelResumableWrite_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_compose_object_async.py b/samples/generated_samples/storage_v2_generated_storage_compose_object_async.py new file mode 100644 index 000000000..0f1e5462f --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_compose_object_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ComposeObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ComposeObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_compose_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ComposeObjectRequest( + ) + + # Make the request + response = await client.compose_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_ComposeObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_compose_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_compose_object_sync.py new file mode 100644 index 000000000..f6363ee89 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_compose_object_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ComposeObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ComposeObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_compose_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ComposeObjectRequest( + ) + + # Make the request + response = client.compose_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_ComposeObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_create_bucket_async.py b/samples/generated_samples/storage_v2_generated_storage_create_bucket_async.py new file mode 100644 index 000000000..afd3d5ea8 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_create_bucket_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for CreateBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_CreateBucket_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_create_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.CreateBucketRequest( + parent="parent_value", + bucket_id="bucket_id_value", + ) + + # Make the request + response = await client.create_bucket(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_CreateBucket_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_create_bucket_sync.py b/samples/generated_samples/storage_v2_generated_storage_create_bucket_sync.py new file mode 100644 index 000000000..9cc81d3b4 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_create_bucket_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for CreateBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_CreateBucket_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_create_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.CreateBucketRequest( + parent="parent_value", + bucket_id="bucket_id_value", + ) + + # Make the request + response = client.create_bucket(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_CreateBucket_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_delete_bucket_async.py b/samples/generated_samples/storage_v2_generated_storage_delete_bucket_async.py new file mode 100644 index 000000000..3e978be0d --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_delete_bucket_async.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for DeleteBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_DeleteBucket_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_delete_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.DeleteBucketRequest( + name="name_value", + ) + + # Make the request + await client.delete_bucket(request=request) + + +# [END storage_v2_generated_Storage_DeleteBucket_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_delete_bucket_sync.py b/samples/generated_samples/storage_v2_generated_storage_delete_bucket_sync.py new file mode 100644 index 000000000..93df10f29 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_delete_bucket_sync.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for DeleteBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_DeleteBucket_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_delete_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.DeleteBucketRequest( + name="name_value", + ) + + # Make the request + client.delete_bucket(request=request) + + +# [END storage_v2_generated_Storage_DeleteBucket_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_delete_object_async.py b/samples/generated_samples/storage_v2_generated_storage_delete_object_async.py new file mode 100644 index 000000000..ba87aca5f --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_delete_object_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for DeleteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_DeleteObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_delete_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.DeleteObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + await client.delete_object(request=request) + + +# [END storage_v2_generated_Storage_DeleteObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_delete_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_delete_object_sync.py new file mode 100644 index 000000000..cc2b9d68e --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_delete_object_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for DeleteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_DeleteObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_delete_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.DeleteObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + client.delete_object(request=request) + + +# [END storage_v2_generated_Storage_DeleteObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_get_bucket_async.py b/samples/generated_samples/storage_v2_generated_storage_get_bucket_async.py new file mode 100644 index 000000000..25816a892 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_get_bucket_async.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for GetBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_GetBucket_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_get_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.GetBucketRequest( + name="name_value", + ) + + # Make the request + response = await client.get_bucket(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_GetBucket_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_get_bucket_sync.py b/samples/generated_samples/storage_v2_generated_storage_get_bucket_sync.py new file mode 100644 index 000000000..2b2af4f60 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_get_bucket_sync.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for GetBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_GetBucket_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_get_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.GetBucketRequest( + name="name_value", + ) + + # Make the request + response = client.get_bucket(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_GetBucket_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py new file mode 100644 index 000000000..a7920496b --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for GetIamPolicy +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_GetIamPolicy_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 +from google.iam.v1 import iam_policy_pb2 # type: ignore + + +async def sample_get_iam_policy(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = iam_policy_pb2.GetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = await client.get_iam_policy(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_GetIamPolicy_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py new file mode 100644 index 000000000..a63fd2927 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for GetIamPolicy +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_GetIamPolicy_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 +from google.iam.v1 import iam_policy_pb2 # type: ignore + + +def sample_get_iam_policy(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = iam_policy_pb2.GetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = client.get_iam_policy(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_GetIamPolicy_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_get_object_async.py b/samples/generated_samples/storage_v2_generated_storage_get_object_async.py new file mode 100644 index 000000000..656c7e96f --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_get_object_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for GetObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_GetObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_get_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.GetObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + response = await client.get_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_GetObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_get_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_get_object_sync.py new file mode 100644 index 000000000..6611ee9e7 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_get_object_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for GetObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_GetObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_get_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.GetObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + response = client.get_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_GetObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_list_buckets_async.py b/samples/generated_samples/storage_v2_generated_storage_list_buckets_async.py new file mode 100644 index 000000000..0a51045b9 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_list_buckets_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListBuckets +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ListBuckets_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_list_buckets(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ListBucketsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_buckets(request=request) + + # Handle the response + async for response in page_result: + print(response) + +# [END storage_v2_generated_Storage_ListBuckets_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_list_buckets_sync.py b/samples/generated_samples/storage_v2_generated_storage_list_buckets_sync.py new file mode 100644 index 000000000..e40cafec7 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_list_buckets_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListBuckets +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ListBuckets_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_list_buckets(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ListBucketsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_buckets(request=request) + + # Handle the response + for response in page_result: + print(response) + +# [END storage_v2_generated_Storage_ListBuckets_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_list_objects_async.py b/samples/generated_samples/storage_v2_generated_storage_list_objects_async.py new file mode 100644 index 000000000..c7f2db4fd --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_list_objects_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListObjects +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ListObjects_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_list_objects(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ListObjectsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_objects(request=request) + + # Handle the response + async for response in page_result: + print(response) + +# [END storage_v2_generated_Storage_ListObjects_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_list_objects_sync.py b/samples/generated_samples/storage_v2_generated_storage_list_objects_sync.py new file mode 100644 index 000000000..1a33f0eef --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_list_objects_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListObjects +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ListObjects_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_list_objects(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ListObjectsRequest( + parent="parent_value", + ) + + # Make the request + page_result = client.list_objects(request=request) + + # Handle the response + for response in page_result: + print(response) + +# [END storage_v2_generated_Storage_ListObjects_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_async.py b/samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_async.py new file mode 100644 index 000000000..cc307095b --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for LockBucketRetentionPolicy +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_LockBucketRetentionPolicy_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_lock_bucket_retention_policy(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.LockBucketRetentionPolicyRequest( + bucket="bucket_value", + if_metageneration_match=2413, + ) + + # Make the request + response = await client.lock_bucket_retention_policy(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_LockBucketRetentionPolicy_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_sync.py b/samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_sync.py new file mode 100644 index 000000000..e80bb13c5 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_lock_bucket_retention_policy_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for LockBucketRetentionPolicy +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_LockBucketRetentionPolicy_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_lock_bucket_retention_policy(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.LockBucketRetentionPolicyRequest( + bucket="bucket_value", + if_metageneration_match=2413, + ) + + # Make the request + response = client.lock_bucket_retention_policy(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_LockBucketRetentionPolicy_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_move_object_async.py b/samples/generated_samples/storage_v2_generated_storage_move_object_async.py new file mode 100644 index 000000000..cb8c7b3f4 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_move_object_async.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for MoveObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_MoveObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_move_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.MoveObjectRequest( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Make the request + response = await client.move_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_MoveObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_move_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_move_object_sync.py new file mode 100644 index 000000000..8f8b3a2c7 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_move_object_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for MoveObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_MoveObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_move_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.MoveObjectRequest( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Make the request + response = client.move_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_MoveObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_query_write_status_async.py b/samples/generated_samples/storage_v2_generated_storage_query_write_status_async.py new file mode 100644 index 000000000..408054740 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_query_write_status_async.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for QueryWriteStatus +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_QueryWriteStatus_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_query_write_status(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.QueryWriteStatusRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = await client.query_write_status(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_QueryWriteStatus_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_query_write_status_sync.py b/samples/generated_samples/storage_v2_generated_storage_query_write_status_sync.py new file mode 100644 index 000000000..0c88f0f72 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_query_write_status_sync.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for QueryWriteStatus +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_QueryWriteStatus_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_query_write_status(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.QueryWriteStatusRequest( + upload_id="upload_id_value", + ) + + # Make the request + response = client.query_write_status(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_QueryWriteStatus_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_read_object_async.py b/samples/generated_samples/storage_v2_generated_storage_read_object_async.py new file mode 100644 index 000000000..3fb95e47d --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_read_object_async.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ReadObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ReadObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_read_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.ReadObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + stream = await client.read_object(request=request) + + # Handle the response + async for response in stream: + print(response) + +# [END storage_v2_generated_Storage_ReadObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_read_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_read_object_sync.py new file mode 100644 index 000000000..a188aeca3 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_read_object_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ReadObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_ReadObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_read_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.ReadObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Make the request + stream = client.read_object(request=request) + + # Handle the response + for response in stream: + print(response) + +# [END storage_v2_generated_Storage_ReadObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_restore_object_async.py b/samples/generated_samples/storage_v2_generated_storage_restore_object_async.py new file mode 100644 index 000000000..13c1de2e1 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_restore_object_async.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for RestoreObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_RestoreObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_restore_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.RestoreObjectRequest( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Make the request + response = await client.restore_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_RestoreObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_restore_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_restore_object_sync.py new file mode 100644 index 000000000..dde9f9a30 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_restore_object_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for RestoreObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_RestoreObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_restore_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.RestoreObjectRequest( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Make the request + response = client.restore_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_RestoreObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_rewrite_object_async.py b/samples/generated_samples/storage_v2_generated_storage_rewrite_object_async.py new file mode 100644 index 000000000..e8d676c4a --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_rewrite_object_async.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for RewriteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_RewriteObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_rewrite_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.RewriteObjectRequest( + destination_name="destination_name_value", + destination_bucket="destination_bucket_value", + source_bucket="source_bucket_value", + source_object="source_object_value", + ) + + # Make the request + response = await client.rewrite_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_RewriteObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_rewrite_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_rewrite_object_sync.py new file mode 100644 index 000000000..9c4c78cc3 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_rewrite_object_sync.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for RewriteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_RewriteObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_rewrite_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.RewriteObjectRequest( + destination_name="destination_name_value", + destination_bucket="destination_bucket_value", + source_bucket="source_bucket_value", + source_object="source_object_value", + ) + + # Make the request + response = client.rewrite_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_RewriteObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py new file mode 100644 index 000000000..06a9c50fb --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SetIamPolicy +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_SetIamPolicy_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 +from google.iam.v1 import iam_policy_pb2 # type: ignore + + +async def sample_set_iam_policy(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = iam_policy_pb2.SetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = await client.set_iam_policy(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_SetIamPolicy_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py new file mode 100644 index 000000000..2b3c0c6bc --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SetIamPolicy +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_SetIamPolicy_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 +from google.iam.v1 import iam_policy_pb2 # type: ignore + + +def sample_set_iam_policy(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = iam_policy_pb2.SetIamPolicyRequest( + resource="resource_value", + ) + + # Make the request + response = client.set_iam_policy(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_SetIamPolicy_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_start_resumable_write_async.py b/samples/generated_samples/storage_v2_generated_storage_start_resumable_write_async.py new file mode 100644 index 000000000..673a05e97 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_start_resumable_write_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for StartResumableWrite +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_StartResumableWrite_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_start_resumable_write(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.StartResumableWriteRequest( + ) + + # Make the request + response = await client.start_resumable_write(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_StartResumableWrite_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_start_resumable_write_sync.py b/samples/generated_samples/storage_v2_generated_storage_start_resumable_write_sync.py new file mode 100644 index 000000000..6f202ee2e --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_start_resumable_write_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for StartResumableWrite +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_StartResumableWrite_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_start_resumable_write(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.StartResumableWriteRequest( + ) + + # Make the request + response = client.start_resumable_write(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_StartResumableWrite_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py new file mode 100644 index 000000000..dd4818f83 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_TestIamPermissions_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 +from google.iam.v1 import iam_policy_pb2 # type: ignore + + +async def sample_test_iam_permissions(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = iam_policy_pb2.TestIamPermissionsRequest( + resource="resource_value", + permissions=['permissions_value1', 'permissions_value2'], + ) + + # Make the request + response = await client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_TestIamPermissions_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py new file mode 100644 index 000000000..e66d50d92 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 +from google.iam.v1 import iam_policy_pb2 # type: ignore + + +def sample_test_iam_permissions(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = iam_policy_pb2.TestIamPermissionsRequest( + resource="resource_value", + permissions=['permissions_value1', 'permissions_value2'], + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_TestIamPermissions_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_update_bucket_async.py b/samples/generated_samples/storage_v2_generated_storage_update_bucket_async.py new file mode 100644 index 000000000..bd30f9440 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_update_bucket_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for UpdateBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_UpdateBucket_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_update_bucket(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.UpdateBucketRequest( + ) + + # Make the request + response = await client.update_bucket(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_UpdateBucket_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_update_bucket_sync.py b/samples/generated_samples/storage_v2_generated_storage_update_bucket_sync.py new file mode 100644 index 000000000..2ca346ec5 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_update_bucket_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for UpdateBucket +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_UpdateBucket_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_update_bucket(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.UpdateBucketRequest( + ) + + # Make the request + response = client.update_bucket(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_UpdateBucket_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_update_object_async.py b/samples/generated_samples/storage_v2_generated_storage_update_object_async.py new file mode 100644 index 000000000..835840a30 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_update_object_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for UpdateObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_UpdateObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_update_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.UpdateObjectRequest( + ) + + # Make the request + response = await client.update_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_UpdateObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_update_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_update_object_sync.py new file mode 100644 index 000000000..2c70255b1 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_update_object_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for UpdateObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_UpdateObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_update_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.UpdateObjectRequest( + ) + + # Make the request + response = client.update_object(request=request) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_UpdateObject_sync] diff --git a/samples/generated_samples/storage_v2_generated_storage_write_object_async.py b/samples/generated_samples/storage_v2_generated_storage_write_object_async.py new file mode 100644 index 000000000..33b8fb286 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_write_object_async.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for WriteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_WriteObject_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +async def sample_write_object(): + # Create a client + client = storage_v2.StorageAsyncClient() + + # Initialize request argument(s) + request = storage_v2.WriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.WriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + response = await client.write_object(requests=request_generator()) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_WriteObject_async] diff --git a/samples/generated_samples/storage_v2_generated_storage_write_object_sync.py b/samples/generated_samples/storage_v2_generated_storage_write_object_sync.py new file mode 100644 index 000000000..c24150533 --- /dev/null +++ b/samples/generated_samples/storage_v2_generated_storage_write_object_sync.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for WriteObject +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-storage + + +# [START storage_v2_generated_Storage_WriteObject_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import storage_v2 + + +def sample_write_object(): + # Create a client + client = storage_v2.StorageClient() + + # Initialize request argument(s) + request = storage_v2.WriteObjectRequest( + upload_id="upload_id_value", + write_offset=1297, + ) + + # This method expects an iterator which contains + # 'storage_v2.WriteObjectRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + response = client.write_object(requests=request_generator()) + + # Handle the response + print(response) + +# [END storage_v2_generated_Storage_WriteObject_sync] diff --git a/testing/constraints-3.10.txt b/testing/constraints-3.10.txt index e69de29bb..ad3f0fa58 100644 --- a/testing/constraints-3.10.txt +++ b/testing/constraints-3.10.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/testing/constraints-3.11.txt b/testing/constraints-3.11.txt index e69de29bb..ad3f0fa58 100644 --- a/testing/constraints-3.11.txt +++ b/testing/constraints-3.11.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/testing/constraints-3.12.txt b/testing/constraints-3.12.txt index e69de29bb..ad3f0fa58 100644 --- a/testing/constraints-3.12.txt +++ b/testing/constraints-3.12.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/testing/constraints-3.13.txt b/testing/constraints-3.13.txt index e69de29bb..2010e549c 100644 --- a/testing/constraints-3.13.txt +++ b/testing/constraints-3.13.txt @@ -0,0 +1,12 @@ +# We use the constraints file for the latest Python version +# (currently this file) to check that the latest +# major versions of dependencies are supported in setup.py. +# List all library dependencies and extras in this file. +# Require the latest major version be installed for each dependency. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", +# Then this file should have google-cloud-foo>=1 +google-api-core>=2 +google-auth>=2 +proto-plus>=1 +protobuf>=6 +grpc-google-iam-v1>=0 diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt index e69de29bb..ad3f0fa58 100644 --- a/testing/constraints-3.8.txt +++ b/testing/constraints-3.8.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/tests/__init__.py b/tests/__init__.py index e69de29bb..cbf94b283 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/tests/unit/gapic/__init__.py b/tests/unit/gapic/__init__.py new file mode 100644 index 000000000..cbf94b283 --- /dev/null +++ b/tests/unit/gapic/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/tests/unit/gapic/storage_v2/__init__.py b/tests/unit/gapic/storage_v2/__init__.py new file mode 100644 index 000000000..cbf94b283 --- /dev/null +++ b/tests/unit/gapic/storage_v2/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/tests/unit/gapic/storage_v2/test_storage.py b/tests/unit/gapic/storage_v2/test_storage.py new file mode 100644 index 000000000..4869eba7f --- /dev/null +++ b/tests/unit/gapic/storage_v2/test_storage.py @@ -0,0 +1,11512 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import os + +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock # pragma: NO COVER +except ImportError: # pragma: NO COVER + import mock + +import grpc +from grpc.experimental import aio +import json +import math +import pytest +from google.api_core import api_core_version +from proto.marshal.rules.dates import DurationRule, TimestampRule +from proto.marshal.rules import wrappers + +try: + from google.auth.aio import credentials as ga_credentials_async + + HAS_GOOGLE_AUTH_AIO = True +except ImportError: # pragma: NO COVER + HAS_GOOGLE_AUTH_AIO = False + +from google.api_core import client_options +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers +from google.api_core import grpc_helpers_async +from google.api_core import path_template +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials +from google.auth.exceptions import MutualTLSChannelError +from google.cloud.storage_v2.services.storage import StorageAsyncClient +from google.cloud.storage_v2.services.storage import StorageClient +from google.cloud.storage_v2.services.storage import pagers +from google.cloud.storage_v2.services.storage import transports +from google.cloud.storage_v2.types import storage +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import options_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.longrunning import operations_pb2 # type: ignore +from google.oauth2 import service_account +from google.protobuf import duration_pb2 # type: ignore +from google.protobuf import field_mask_pb2 # type: ignore +from google.protobuf import timestamp_pb2 # type: ignore +from google.type import date_pb2 # type: ignore +from google.type import expr_pb2 # type: ignore +import google.auth + + +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + + +async def mock_async_gen(data, chunk_size=1): + for i in range(0, len(data)): # pragma: NO COVER + chunk = data[i : i + chunk_size] + yield chunk.encode("utf-8") + + +def client_cert_source_callback(): + return b"cert bytes", b"key bytes" + + +# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. +# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. +def async_anonymous_credentials(): + if HAS_GOOGLE_AUTH_AIO: + return ga_credentials_async.AnonymousCredentials() + return ga_credentials.AnonymousCredentials() + + +# If default endpoint is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint(client): + return ( + "foo.googleapis.com" + if ("localhost" in client.DEFAULT_ENDPOINT) + else client.DEFAULT_ENDPOINT + ) + + +# If default endpoint template is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint template so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint_template(client): + return ( + "test.{UNIVERSE_DOMAIN}" + if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) + else client._DEFAULT_ENDPOINT_TEMPLATE + ) + + +def test__get_default_mtls_endpoint(): + api_endpoint = "example.googleapis.com" + api_mtls_endpoint = "example.mtls.googleapis.com" + sandbox_endpoint = "example.sandbox.googleapis.com" + sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" + non_googleapi = "api.example.com" + + assert StorageClient._get_default_mtls_endpoint(None) is None + assert StorageClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint + assert ( + StorageClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint + ) + assert ( + StorageClient._get_default_mtls_endpoint(sandbox_endpoint) + == sandbox_mtls_endpoint + ) + assert ( + StorageClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) + == sandbox_mtls_endpoint + ) + assert StorageClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi + + +def test__read_environment_variables(): + assert StorageClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + assert StorageClient._read_environment_variables() == (True, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + assert StorageClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} + ): + with pytest.raises(ValueError) as excinfo: + StorageClient._read_environment_variables() + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + assert StorageClient._read_environment_variables() == (False, "never", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + assert StorageClient._read_environment_variables() == (False, "always", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): + assert StorageClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + StorageClient._read_environment_variables() + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + + with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): + assert StorageClient._read_environment_variables() == (False, "auto", "foo.com") + + +def test__get_client_cert_source(): + mock_provided_cert_source = mock.Mock() + mock_default_cert_source = mock.Mock() + + assert StorageClient._get_client_cert_source(None, False) is None + assert ( + StorageClient._get_client_cert_source(mock_provided_cert_source, False) is None + ) + assert ( + StorageClient._get_client_cert_source(mock_provided_cert_source, True) + == mock_provided_cert_source + ) + + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", return_value=True + ): + with mock.patch( + "google.auth.transport.mtls.default_client_cert_source", + return_value=mock_default_cert_source, + ): + assert ( + StorageClient._get_client_cert_source(None, True) + is mock_default_cert_source + ) + assert ( + StorageClient._get_client_cert_source(mock_provided_cert_source, "true") + is mock_provided_cert_source + ) + + +@mock.patch.object( + StorageClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageClient), +) +@mock.patch.object( + StorageAsyncClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageAsyncClient), +) +def test__get_api_endpoint(): + api_override = "foo.com" + mock_client_cert_source = mock.Mock() + default_universe = StorageClient._DEFAULT_UNIVERSE + default_endpoint = StorageClient._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=default_universe + ) + mock_universe = "bar.com" + mock_endpoint = StorageClient._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=mock_universe + ) + + assert ( + StorageClient._get_api_endpoint( + api_override, mock_client_cert_source, default_universe, "always" + ) + == api_override + ) + assert ( + StorageClient._get_api_endpoint( + None, mock_client_cert_source, default_universe, "auto" + ) + == StorageClient.DEFAULT_MTLS_ENDPOINT + ) + assert ( + StorageClient._get_api_endpoint(None, None, default_universe, "auto") + == default_endpoint + ) + assert ( + StorageClient._get_api_endpoint(None, None, default_universe, "always") + == StorageClient.DEFAULT_MTLS_ENDPOINT + ) + assert ( + StorageClient._get_api_endpoint( + None, mock_client_cert_source, default_universe, "always" + ) + == StorageClient.DEFAULT_MTLS_ENDPOINT + ) + assert ( + StorageClient._get_api_endpoint(None, None, mock_universe, "never") + == mock_endpoint + ) + assert ( + StorageClient._get_api_endpoint(None, None, default_universe, "never") + == default_endpoint + ) + + with pytest.raises(MutualTLSChannelError) as excinfo: + StorageClient._get_api_endpoint( + None, mock_client_cert_source, mock_universe, "auto" + ) + assert ( + str(excinfo.value) + == "mTLS is not supported in any universe other than googleapis.com." + ) + + +def test__get_universe_domain(): + client_universe_domain = "foo.com" + universe_domain_env = "bar.com" + + assert ( + StorageClient._get_universe_domain(client_universe_domain, universe_domain_env) + == client_universe_domain + ) + assert ( + StorageClient._get_universe_domain(None, universe_domain_env) + == universe_domain_env + ) + assert ( + StorageClient._get_universe_domain(None, None) + == StorageClient._DEFAULT_UNIVERSE + ) + + with pytest.raises(ValueError) as excinfo: + StorageClient._get_universe_domain("", None) + assert str(excinfo.value) == "Universe Domain cannot be an empty string." + + +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = StorageClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = StorageClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + +@pytest.mark.parametrize( + "client_class,transport_name", + [ + (StorageClient, "grpc"), + (StorageAsyncClient, "grpc_asyncio"), + ], +) +def test_storage_client_from_service_account_info(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object( + service_account.Credentials, "from_service_account_info" + ) as factory: + factory.return_value = creds + info = {"valid": True} + client = client_class.from_service_account_info(info, transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ("storage.googleapis.com:443") + + +@pytest.mark.parametrize( + "transport_class,transport_name", + [ + (transports.StorageGrpcTransport, "grpc"), + (transports.StorageGrpcAsyncIOTransport, "grpc_asyncio"), + ], +) +def test_storage_client_service_account_always_use_jwt(transport_class, transport_name): + with mock.patch.object( + service_account.Credentials, "with_always_use_jwt_access", create=True + ) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=True) + use_jwt.assert_called_once_with(True) + + with mock.patch.object( + service_account.Credentials, "with_always_use_jwt_access", create=True + ) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + + +@pytest.mark.parametrize( + "client_class,transport_name", + [ + (StorageClient, "grpc"), + (StorageAsyncClient, "grpc_asyncio"), + ], +) +def test_storage_client_from_service_account_file(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object( + service_account.Credentials, "from_service_account_file" + ) as factory: + factory.return_value = creds + client = client_class.from_service_account_file( + "dummy/file/path.json", transport=transport_name + ) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + client = client_class.from_service_account_json( + "dummy/file/path.json", transport=transport_name + ) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ("storage.googleapis.com:443") + + +def test_storage_client_get_transport_class(): + transport = StorageClient.get_transport_class() + available_transports = [ + transports.StorageGrpcTransport, + ] + assert transport in available_transports + + transport = StorageClient.get_transport_class("grpc") + assert transport == transports.StorageGrpcTransport + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name", + [ + (StorageClient, transports.StorageGrpcTransport, "grpc"), + (StorageAsyncClient, transports.StorageGrpcAsyncIOTransport, "grpc_asyncio"), + ], +) +@mock.patch.object( + StorageClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageClient), +) +@mock.patch.object( + StorageAsyncClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageAsyncClient), +) +def test_storage_client_client_options(client_class, transport_class, transport_name): + # Check that if channel is provided we won't create a new one. + with mock.patch.object(StorageClient, "get_transport_class") as gtc: + transport = transport_class(credentials=ga_credentials.AnonymousCredentials()) + client = client_class(transport=transport) + gtc.assert_not_called() + + # Check that if channel is provided via str we will create a new one. + with mock.patch.object(StorageClient, "get_transport_class") as gtc: + client = client_class(transport=transport_name) + gtc.assert_called() + + # Check the case api_endpoint is provided. + options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(transport=transport_name, client_options=options) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_MTLS_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client = client_class(transport=transport_name) + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} + ): + with pytest.raises(ValueError) as excinfo: + client = client_class(transport=transport_name) + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + + # Check the case quota_project_id is provided + options = client_options.ClientOptions(quota_project_id="octopus") + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id="octopus", + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + # Check the case api_endpoint is provided + options = client_options.ClientOptions( + api_audience="https://language.googleapis.com" + ) + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience="https://language.googleapis.com", + ) + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name,use_client_cert_env", + [ + (StorageClient, transports.StorageGrpcTransport, "grpc", "true"), + ( + StorageAsyncClient, + transports.StorageGrpcAsyncIOTransport, + "grpc_asyncio", + "true", + ), + (StorageClient, transports.StorageGrpcTransport, "grpc", "false"), + ( + StorageAsyncClient, + transports.StorageGrpcAsyncIOTransport, + "grpc_asyncio", + "false", + ), + ], +) +@mock.patch.object( + StorageClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageClient), +) +@mock.patch.object( + StorageAsyncClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageAsyncClient), +) +@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) +def test_storage_client_mtls_env_auto( + client_class, transport_class, transport_name, use_client_cert_env +): + # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default + # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. + + # Check the case client_cert_source is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env} + ): + options = client_options.ClientOptions( + client_cert_source=client_cert_source_callback + ) + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + + if use_client_cert_env == "false": + expected_client_cert_source = None + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ) + else: + expected_client_cert_source = client_cert_source_callback + expected_host = client.DEFAULT_MTLS_ENDPOINT + + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case ADC client cert is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env} + ): + with mock.patch.object(transport_class, "__init__") as patched: + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=True, + ): + with mock.patch( + "google.auth.transport.mtls.default_client_cert_source", + return_value=client_cert_source_callback, + ): + if use_client_cert_env == "false": + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ) + expected_client_cert_source = None + else: + expected_host = client.DEFAULT_MTLS_ENDPOINT + expected_client_cert_source = client_cert_source_callback + + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case client_cert_source and ADC client cert are not provided. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env} + ): + with mock.patch.object(transport_class, "__init__") as patched: + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=False, + ): + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class", [StorageClient, StorageAsyncClient]) +@mock.patch.object( + StorageClient, "DEFAULT_ENDPOINT", modify_default_endpoint(StorageClient) +) +@mock.patch.object( + StorageAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(StorageAsyncClient) +) +def test_storage_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=False, + ): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=True, + ): + with mock.patch( + "google.auth.transport.mtls.default_client_cert_source", + return_value=mock_client_cert_source, + ): + ( + api_endpoint, + cert_source, + ) = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} + ): + with pytest.raises(ValueError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + + +@pytest.mark.parametrize("client_class", [StorageClient, StorageAsyncClient]) +@mock.patch.object( + StorageClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageClient), +) +@mock.patch.object( + StorageAsyncClient, + "_DEFAULT_ENDPOINT_TEMPLATE", + modify_default_endpoint_template(StorageAsyncClient), +) +def test_storage_client_client_api_endpoint(client_class): + mock_client_cert_source = client_cert_source_callback + api_override = "foo.com" + default_universe = StorageClient._DEFAULT_UNIVERSE + default_endpoint = StorageClient._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=default_universe + ) + mock_universe = "bar.com" + mock_endpoint = StorageClient._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=mock_universe + ) + + # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", + # use ClientOptions.api_endpoint as the api endpoint regardless. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.requests.AuthorizedSession.configure_mtls_channel" + ): + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=api_override + ) + client = client_class( + client_options=options, + credentials=ga_credentials.AnonymousCredentials(), + ) + assert client.api_endpoint == api_override + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", + # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + + # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), + # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, + # and ClientOptions.universe_domain="bar.com", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. + options = client_options.ClientOptions() + universe_exists = hasattr(options, "universe_domain") + if universe_exists: + options = client_options.ClientOptions(universe_domain=mock_universe) + client = client_class( + client_options=options, credentials=ga_credentials.AnonymousCredentials() + ) + else: + client = client_class( + client_options=options, credentials=ga_credentials.AnonymousCredentials() + ) + assert client.api_endpoint == ( + mock_endpoint if universe_exists else default_endpoint + ) + assert client.universe_domain == ( + mock_universe if universe_exists else default_universe + ) + + # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + options = client_options.ClientOptions() + if hasattr(options, "universe_domain"): + delattr(options, "universe_domain") + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class( + client_options=options, credentials=ga_credentials.AnonymousCredentials() + ) + assert client.api_endpoint == default_endpoint + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name", + [ + (StorageClient, transports.StorageGrpcTransport, "grpc"), + (StorageAsyncClient, transports.StorageGrpcAsyncIOTransport, "grpc_asyncio"), + ], +) +def test_storage_client_client_options_scopes( + client_class, transport_class, transport_name +): + # Check the case scopes are provided. + options = client_options.ClientOptions( + scopes=["1", "2"], + ) + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=["1", "2"], + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name,grpc_helpers", + [ + (StorageClient, transports.StorageGrpcTransport, "grpc", grpc_helpers), + ( + StorageAsyncClient, + transports.StorageGrpcAsyncIOTransport, + "grpc_asyncio", + grpc_helpers_async, + ), + ], +) +def test_storage_client_client_options_credentials_file( + client_class, transport_class, transport_name, grpc_helpers +): + # Check the case credentials file is provided. + options = client_options.ClientOptions(credentials_file="credentials.json") + + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +def test_storage_client_client_options_from_dict(): + with mock.patch( + "google.cloud.storage_v2.services.storage.transports.StorageGrpcTransport.__init__" + ) as grpc_transport: + grpc_transport.return_value = None + client = StorageClient(client_options={"api_endpoint": "squid.clam.whelk"}) + grpc_transport.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name,grpc_helpers", + [ + (StorageClient, transports.StorageGrpcTransport, "grpc", grpc_helpers), + ( + StorageAsyncClient, + transports.StorageGrpcAsyncIOTransport, + "grpc_asyncio", + grpc_helpers_async, + ), + ], +) +def test_storage_client_create_channel_credentials_file( + client_class, transport_class, transport_name, grpc_helpers +): + # Check the case credentials file is provided. + options = client_options.ClientOptions(credentials_file="credentials.json") + + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # test that the credentials from file are saved and used as the credentials. + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel" + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + file_creds = ga_credentials.AnonymousCredentials() + load_creds.return_value = (file_creds, None) + adc.return_value = (creds, None) + client = client_class(client_options=options, transport=transport_name) + create_channel.assert_called_with( + "storage.googleapis.com:443", + credentials=file_creds, + credentials_file=None, + quota_project_id=None, + default_scopes=( + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write", + ), + scopes=None, + default_host="storage.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.DeleteBucketRequest, + dict, + ], +) +def test_delete_bucket(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = None + response = client.delete_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.DeleteBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert response is None + + +def test_delete_bucket_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.DeleteBucketRequest( + name="name_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.delete_bucket(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.DeleteBucketRequest( + name="name_value", + ) + + +def test_delete_bucket_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.delete_bucket in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.delete_bucket] = mock_rpc + request = {} + client.delete_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.delete_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_delete_bucket_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.delete_bucket + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.delete_bucket + ] = mock_rpc + + request = {} + await client.delete_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.delete_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_delete_bucket_async( + transport: str = "grpc_asyncio", request_type=storage.DeleteBucketRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + response = await client.delete_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.DeleteBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert response is None + + +@pytest.mark.asyncio +async def test_delete_bucket_async_from_dict(): + await test_delete_bucket_async(request_type=dict) + + +def test_delete_bucket_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = None + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.delete_bucket( + name="name_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + + +def test_delete_bucket_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.delete_bucket( + storage.DeleteBucketRequest(), + name="name_value", + ) + + +@pytest.mark.asyncio +async def test_delete_bucket_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = None + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.delete_bucket( + name="name_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_delete_bucket_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.delete_bucket( + storage.DeleteBucketRequest(), + name="name_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.GetBucketRequest, + dict, + ], +) +def test_get_bucket(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + response = client.get_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.GetBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +def test_get_bucket_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.GetBucketRequest( + name="name_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.get_bucket(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.GetBucketRequest( + name="name_value", + ) + + +def test_get_bucket_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.get_bucket in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.get_bucket] = mock_rpc + request = {} + client.get_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.get_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_get_bucket_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.get_bucket + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.get_bucket + ] = mock_rpc + + request = {} + await client.get_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.get_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_get_bucket_async( + transport: str = "grpc_asyncio", request_type=storage.GetBucketRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + response = await client.get_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.GetBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +@pytest.mark.asyncio +async def test_get_bucket_async_from_dict(): + await test_get_bucket_async(request_type=dict) + + +def test_get_bucket_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.get_bucket( + name="name_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + + +def test_get_bucket_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.get_bucket( + storage.GetBucketRequest(), + name="name_value", + ) + + +@pytest.mark.asyncio +async def test_get_bucket_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Bucket()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.get_bucket( + name="name_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_get_bucket_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.get_bucket( + storage.GetBucketRequest(), + name="name_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.CreateBucketRequest, + dict, + ], +) +def test_create_bucket(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + response = client.create_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.CreateBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +def test_create_bucket_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.CreateBucketRequest( + parent="parent_value", + bucket_id="bucket_id_value", + predefined_acl="predefined_acl_value", + predefined_default_object_acl="predefined_default_object_acl_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.create_bucket(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.CreateBucketRequest( + parent="parent_value", + bucket_id="bucket_id_value", + predefined_acl="predefined_acl_value", + predefined_default_object_acl="predefined_default_object_acl_value", + ) + + +def test_create_bucket_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.create_bucket in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.create_bucket] = mock_rpc + request = {} + client.create_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.create_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_create_bucket_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.create_bucket + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.create_bucket + ] = mock_rpc + + request = {} + await client.create_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.create_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_create_bucket_async( + transport: str = "grpc_asyncio", request_type=storage.CreateBucketRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + response = await client.create_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.CreateBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +@pytest.mark.asyncio +async def test_create_bucket_async_from_dict(): + await test_create_bucket_async(request_type=dict) + + +def test_create_bucket_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.create_bucket( + parent="parent_value", + bucket=storage.Bucket(name="name_value"), + bucket_id="bucket_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].bucket + mock_val = storage.Bucket(name="name_value") + assert arg == mock_val + arg = args[0].bucket_id + mock_val = "bucket_id_value" + assert arg == mock_val + + +def test_create_bucket_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.create_bucket( + storage.CreateBucketRequest(), + parent="parent_value", + bucket=storage.Bucket(name="name_value"), + bucket_id="bucket_id_value", + ) + + +@pytest.mark.asyncio +async def test_create_bucket_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Bucket()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.create_bucket( + parent="parent_value", + bucket=storage.Bucket(name="name_value"), + bucket_id="bucket_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].bucket + mock_val = storage.Bucket(name="name_value") + assert arg == mock_val + arg = args[0].bucket_id + mock_val = "bucket_id_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_create_bucket_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.create_bucket( + storage.CreateBucketRequest(), + parent="parent_value", + bucket=storage.Bucket(name="name_value"), + bucket_id="bucket_id_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.ListBucketsRequest, + dict, + ], +) +def test_list_buckets(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.ListBucketsResponse( + next_page_token="next_page_token_value", + ) + response = client.list_buckets(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.ListBucketsRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, pagers.ListBucketsPager) + assert response.next_page_token == "next_page_token_value" + + +def test_list_buckets_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.ListBucketsRequest( + parent="parent_value", + page_token="page_token_value", + prefix="prefix_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.list_buckets(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.ListBucketsRequest( + parent="parent_value", + page_token="page_token_value", + prefix="prefix_value", + ) + + +def test_list_buckets_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.list_buckets in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.list_buckets] = mock_rpc + request = {} + client.list_buckets(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.list_buckets(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_list_buckets_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.list_buckets + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.list_buckets + ] = mock_rpc + + request = {} + await client.list_buckets(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.list_buckets(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_list_buckets_async( + transport: str = "grpc_asyncio", request_type=storage.ListBucketsRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListBucketsResponse( + next_page_token="next_page_token_value", + ) + ) + response = await client.list_buckets(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.ListBucketsRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, pagers.ListBucketsAsyncPager) + assert response.next_page_token == "next_page_token_value" + + +@pytest.mark.asyncio +async def test_list_buckets_async_from_dict(): + await test_list_buckets_async(request_type=dict) + + +def test_list_buckets_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.ListBucketsResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.list_buckets( + parent="parent_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + + +def test_list_buckets_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.list_buckets( + storage.ListBucketsRequest(), + parent="parent_value", + ) + + +@pytest.mark.asyncio +async def test_list_buckets_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.ListBucketsResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListBucketsResponse() + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.list_buckets( + parent="parent_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_list_buckets_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.list_buckets( + storage.ListBucketsRequest(), + parent="parent_value", + ) + + +def test_list_buckets_pager(transport_name: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport_name, + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + storage.Bucket(), + ], + next_page_token="abc", + ), + storage.ListBucketsResponse( + buckets=[], + next_page_token="def", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + ], + next_page_token="ghi", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + ], + ), + RuntimeError, + ) + + expected_metadata = () + retry = retries.Retry() + timeout = 5 + pager = client.list_buckets(request={}, retry=retry, timeout=timeout) + + assert pager._metadata == expected_metadata + assert pager._retry == retry + assert pager._timeout == timeout + + results = list(pager) + assert len(results) == 6 + assert all(isinstance(i, storage.Bucket) for i in results) + + +def test_list_buckets_pages(transport_name: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport_name, + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + storage.Bucket(), + ], + next_page_token="abc", + ), + storage.ListBucketsResponse( + buckets=[], + next_page_token="def", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + ], + next_page_token="ghi", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + ], + ), + RuntimeError, + ) + pages = list(client.list_buckets(request={}).pages) + for page_, token in zip(pages, ["abc", "def", "ghi", ""]): + assert page_.raw_page.next_page_token == token + + +@pytest.mark.asyncio +async def test_list_buckets_async_pager(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_buckets), "__call__", new_callable=mock.AsyncMock + ) as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + storage.Bucket(), + ], + next_page_token="abc", + ), + storage.ListBucketsResponse( + buckets=[], + next_page_token="def", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + ], + next_page_token="ghi", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + ], + ), + RuntimeError, + ) + async_pager = await client.list_buckets( + request={}, + ) + assert async_pager.next_page_token == "abc" + responses = [] + async for response in async_pager: # pragma: no branch + responses.append(response) + + assert len(responses) == 6 + assert all(isinstance(i, storage.Bucket) for i in responses) + + +@pytest.mark.asyncio +async def test_list_buckets_async_pages(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_buckets), "__call__", new_callable=mock.AsyncMock + ) as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + storage.Bucket(), + ], + next_page_token="abc", + ), + storage.ListBucketsResponse( + buckets=[], + next_page_token="def", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + ], + next_page_token="ghi", + ), + storage.ListBucketsResponse( + buckets=[ + storage.Bucket(), + storage.Bucket(), + ], + ), + RuntimeError, + ) + pages = [] + # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` + # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 + async for page_ in ( # pragma: no branch + await client.list_buckets(request={}) + ).pages: + pages.append(page_) + for page_, token in zip(pages, ["abc", "def", "ghi", ""]): + assert page_.raw_page.next_page_token == token + + +@pytest.mark.parametrize( + "request_type", + [ + storage.LockBucketRetentionPolicyRequest, + dict, + ], +) +def test_lock_bucket_retention_policy(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + response = client.lock_bucket_retention_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.LockBucketRetentionPolicyRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +def test_lock_bucket_retention_policy_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.LockBucketRetentionPolicyRequest( + bucket="bucket_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.lock_bucket_retention_policy(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.LockBucketRetentionPolicyRequest( + bucket="bucket_value", + ) + + +def test_lock_bucket_retention_policy_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.lock_bucket_retention_policy + in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.lock_bucket_retention_policy + ] = mock_rpc + request = {} + client.lock_bucket_retention_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.lock_bucket_retention_policy(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.lock_bucket_retention_policy + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.lock_bucket_retention_policy + ] = mock_rpc + + request = {} + await client.lock_bucket_retention_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.lock_bucket_retention_policy(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_async( + transport: str = "grpc_asyncio", + request_type=storage.LockBucketRetentionPolicyRequest, +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + response = await client.lock_bucket_retention_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.LockBucketRetentionPolicyRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_async_from_dict(): + await test_lock_bucket_retention_policy_async(request_type=dict) + + +def test_lock_bucket_retention_policy_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.lock_bucket_retention_policy( + bucket="bucket_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + + +def test_lock_bucket_retention_policy_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.lock_bucket_retention_policy( + storage.LockBucketRetentionPolicyRequest(), + bucket="bucket_value", + ) + + +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Bucket()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.lock_bucket_retention_policy( + bucket="bucket_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.lock_bucket_retention_policy( + storage.LockBucketRetentionPolicyRequest(), + bucket="bucket_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + iam_policy_pb2.GetIamPolicyRequest, + dict, + ], +) +def test_get_iam_policy(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + response = client.get_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = iam_policy_pb2.GetIamPolicyRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, policy_pb2.Policy) + assert response.version == 774 + assert response.etag == b"etag_blob" + + +def test_get_iam_policy_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = iam_policy_pb2.GetIamPolicyRequest( + resource="resource_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.get_iam_policy(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == iam_policy_pb2.GetIamPolicyRequest( + resource="resource_value", + ) + + +def test_get_iam_policy_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.get_iam_policy in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.get_iam_policy] = mock_rpc + request = {} + client.get_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.get_iam_policy(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_get_iam_policy_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.get_iam_policy + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.get_iam_policy + ] = mock_rpc + + request = {} + await client.get_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.get_iam_policy(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_get_iam_policy_async( + transport: str = "grpc_asyncio", request_type=iam_policy_pb2.GetIamPolicyRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + response = await client.get_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = iam_policy_pb2.GetIamPolicyRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, policy_pb2.Policy) + assert response.version == 774 + assert response.etag == b"etag_blob" + + +@pytest.mark.asyncio +async def test_get_iam_policy_async_from_dict(): + await test_get_iam_policy_async(request_type=dict) + + +def test_get_iam_policy_from_dict_foreign(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy() + response = client.get_iam_policy( + request={ + "resource": "resource_value", + "options": options_pb2.GetPolicyOptions(requested_policy_version=2598), + } + ) + call.assert_called() + + +def test_get_iam_policy_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.get_iam_policy( + resource="resource_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].resource + mock_val = "resource_value" + assert arg == mock_val + + +def test_get_iam_policy_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.get_iam_policy( + iam_policy_pb2.GetIamPolicyRequest(), + resource="resource_value", + ) + + +@pytest.mark.asyncio +async def test_get_iam_policy_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(policy_pb2.Policy()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.get_iam_policy( + resource="resource_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].resource + mock_val = "resource_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_get_iam_policy_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.get_iam_policy( + iam_policy_pb2.GetIamPolicyRequest(), + resource="resource_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + iam_policy_pb2.SetIamPolicyRequest, + dict, + ], +) +def test_set_iam_policy(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + response = client.set_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = iam_policy_pb2.SetIamPolicyRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, policy_pb2.Policy) + assert response.version == 774 + assert response.etag == b"etag_blob" + + +def test_set_iam_policy_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = iam_policy_pb2.SetIamPolicyRequest( + resource="resource_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.set_iam_policy(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == iam_policy_pb2.SetIamPolicyRequest( + resource="resource_value", + ) + + +def test_set_iam_policy_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.set_iam_policy in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.set_iam_policy] = mock_rpc + request = {} + client.set_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.set_iam_policy(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_set_iam_policy_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.set_iam_policy + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.set_iam_policy + ] = mock_rpc + + request = {} + await client.set_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.set_iam_policy(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_set_iam_policy_async( + transport: str = "grpc_asyncio", request_type=iam_policy_pb2.SetIamPolicyRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + response = await client.set_iam_policy(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = iam_policy_pb2.SetIamPolicyRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, policy_pb2.Policy) + assert response.version == 774 + assert response.etag == b"etag_blob" + + +@pytest.mark.asyncio +async def test_set_iam_policy_async_from_dict(): + await test_set_iam_policy_async(request_type=dict) + + +def test_set_iam_policy_from_dict_foreign(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy() + response = client.set_iam_policy( + request={ + "resource": "resource_value", + "policy": policy_pb2.Policy(version=774), + "update_mask": field_mask_pb2.FieldMask(paths=["paths_value"]), + } + ) + call.assert_called() + + +def test_set_iam_policy_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.set_iam_policy( + resource="resource_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].resource + mock_val = "resource_value" + assert arg == mock_val + + +def test_set_iam_policy_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.set_iam_policy( + iam_policy_pb2.SetIamPolicyRequest(), + resource="resource_value", + ) + + +@pytest.mark.asyncio +async def test_set_iam_policy_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = policy_pb2.Policy() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(policy_pb2.Policy()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.set_iam_policy( + resource="resource_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].resource + mock_val = "resource_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_set_iam_policy_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.set_iam_policy( + iam_policy_pb2.SetIamPolicyRequest(), + resource="resource_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + iam_policy_pb2.TestIamPermissionsRequest, + dict, + ], +) +def test_test_iam_permissions(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = iam_policy_pb2.TestIamPermissionsResponse( + permissions=["permissions_value"], + ) + response = client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = iam_policy_pb2.TestIamPermissionsRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, iam_policy_pb2.TestIamPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +def test_test_iam_permissions_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = iam_policy_pb2.TestIamPermissionsRequest( + resource="resource_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.test_iam_permissions(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == iam_policy_pb2.TestIamPermissionsRequest( + resource="resource_value", + ) + + +def test_test_iam_permissions_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_test_iam_permissions_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.test_iam_permissions + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + await client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_test_iam_permissions_async( + transport: str = "grpc_asyncio", + request_type=iam_policy_pb2.TestIamPermissionsRequest, +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + iam_policy_pb2.TestIamPermissionsResponse( + permissions=["permissions_value"], + ) + ) + response = await client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = iam_policy_pb2.TestIamPermissionsRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, iam_policy_pb2.TestIamPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.asyncio +async def test_test_iam_permissions_async_from_dict(): + await test_test_iam_permissions_async(request_type=dict) + + +def test_test_iam_permissions_from_dict_foreign(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + response = client.test_iam_permissions( + request={ + "resource": "resource_value", + "permissions": ["permissions_value"], + } + ) + call.assert_called() + + +def test_test_iam_permissions_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.test_iam_permissions( + resource="resource_value", + permissions=["permissions_value"], + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].resource + mock_val = "resource_value" + assert arg == mock_val + arg = args[0].permissions + mock_val = ["permissions_value"] + assert arg == mock_val + + +def test_test_iam_permissions_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + iam_policy_pb2.TestIamPermissionsRequest(), + resource="resource_value", + permissions=["permissions_value"], + ) + + +@pytest.mark.asyncio +async def test_test_iam_permissions_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + iam_policy_pb2.TestIamPermissionsResponse() + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.test_iam_permissions( + resource="resource_value", + permissions=["permissions_value"], + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].resource + mock_val = "resource_value" + assert arg == mock_val + arg = args[0].permissions + mock_val = ["permissions_value"] + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_test_iam_permissions_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.test_iam_permissions( + iam_policy_pb2.TestIamPermissionsRequest(), + resource="resource_value", + permissions=["permissions_value"], + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.UpdateBucketRequest, + dict, + ], +) +def test_update_bucket(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + response = client.update_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.UpdateBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +def test_update_bucket_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.UpdateBucketRequest( + predefined_acl="predefined_acl_value", + predefined_default_object_acl="predefined_default_object_acl_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.update_bucket(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.UpdateBucketRequest( + predefined_acl="predefined_acl_value", + predefined_default_object_acl="predefined_default_object_acl_value", + ) + + +def test_update_bucket_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.update_bucket in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.update_bucket] = mock_rpc + request = {} + client.update_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.update_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_update_bucket_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.update_bucket + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.update_bucket + ] = mock_rpc + + request = {} + await client.update_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.update_bucket(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_update_bucket_async( + transport: str = "grpc_asyncio", request_type=storage.UpdateBucketRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + response = await client.update_bucket(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.UpdateBucketRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Bucket) + assert response.name == "name_value" + assert response.bucket_id == "bucket_id_value" + assert response.etag == "etag_value" + assert response.project == "project_value" + assert response.metageneration == 1491 + assert response.location == "location_value" + assert response.location_type == "location_type_value" + assert response.storage_class == "storage_class_value" + assert response.rpo == "rpo_value" + assert response.default_event_based_hold is True + assert response.satisfies_pzs is True + + +@pytest.mark.asyncio +async def test_update_bucket_async_from_dict(): + await test_update_bucket_async(request_type=dict) + + +def test_update_bucket_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.update_bucket( + bucket=storage.Bucket(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = storage.Bucket(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val + + +def test_update_bucket_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.update_bucket( + storage.UpdateBucketRequest(), + bucket=storage.Bucket(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + +@pytest.mark.asyncio +async def test_update_bucket_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Bucket() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Bucket()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.update_bucket( + bucket=storage.Bucket(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = storage.Bucket(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_update_bucket_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.update_bucket( + storage.UpdateBucketRequest(), + bucket=storage.Bucket(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.ComposeObjectRequest, + dict, + ], +) +def test_compose_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + response = client.compose_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.ComposeObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +def test_compose_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.ComposeObjectRequest( + destination_predefined_acl="destination_predefined_acl_value", + kms_key="kms_key_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.compose_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.ComposeObjectRequest( + destination_predefined_acl="destination_predefined_acl_value", + kms_key="kms_key_value", + ) + + +def test_compose_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.compose_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.compose_object] = mock_rpc + request = {} + client.compose_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.compose_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_compose_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.compose_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.compose_object + ] = mock_rpc + + request = {} + await client.compose_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.compose_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_compose_object_async( + transport: str = "grpc_asyncio", request_type=storage.ComposeObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + response = await client.compose_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.ComposeObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +@pytest.mark.asyncio +async def test_compose_object_async_from_dict(): + await test_compose_object_async(request_type=dict) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.DeleteObjectRequest, + dict, + ], +) +def test_delete_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = None + response = client.delete_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.DeleteObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert response is None + + +def test_delete_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.DeleteObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.delete_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.DeleteObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + +def test_delete_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.delete_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.delete_object] = mock_rpc + request = {} + client.delete_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.delete_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_delete_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.delete_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.delete_object + ] = mock_rpc + + request = {} + await client.delete_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.delete_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_delete_object_async( + transport: str = "grpc_asyncio", request_type=storage.DeleteObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + response = await client.delete_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.DeleteObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert response is None + + +@pytest.mark.asyncio +async def test_delete_object_async_from_dict(): + await test_delete_object_async(request_type=dict) + + +def test_delete_object_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = None + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.delete_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +def test_delete_object_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.delete_object( + storage.DeleteObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.asyncio +async def test_delete_object_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = None + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.delete_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_delete_object_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.delete_object( + storage.DeleteObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.RestoreObjectRequest, + dict, + ], +) +def test_restore_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + response = client.restore_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.RestoreObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +def test_restore_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.RestoreObjectRequest( + bucket="bucket_value", + object_="object__value", + restore_token="restore_token_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.restore_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.RestoreObjectRequest( + bucket="bucket_value", + object_="object__value", + restore_token="restore_token_value", + ) + + +def test_restore_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.restore_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.restore_object] = mock_rpc + request = {} + client.restore_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.restore_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_restore_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.restore_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.restore_object + ] = mock_rpc + + request = {} + await client.restore_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.restore_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_restore_object_async( + transport: str = "grpc_asyncio", request_type=storage.RestoreObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + response = await client.restore_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.RestoreObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +@pytest.mark.asyncio +async def test_restore_object_async_from_dict(): + await test_restore_object_async(request_type=dict) + + +def test_restore_object_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.restore_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +def test_restore_object_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.restore_object( + storage.RestoreObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.asyncio +async def test_restore_object_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Object()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.restore_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_restore_object_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.restore_object( + storage.RestoreObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.CancelResumableWriteRequest, + dict, + ], +) +def test_cancel_resumable_write(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.CancelResumableWriteResponse() + response = client.cancel_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.CancelResumableWriteRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.CancelResumableWriteResponse) + + +def test_cancel_resumable_write_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.CancelResumableWriteRequest( + upload_id="upload_id_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.cancel_resumable_write(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.CancelResumableWriteRequest( + upload_id="upload_id_value", + ) + + +def test_cancel_resumable_write_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.cancel_resumable_write + in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.cancel_resumable_write + ] = mock_rpc + request = {} + client.cancel_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.cancel_resumable_write(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_cancel_resumable_write_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.cancel_resumable_write + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.cancel_resumable_write + ] = mock_rpc + + request = {} + await client.cancel_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.cancel_resumable_write(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_cancel_resumable_write_async( + transport: str = "grpc_asyncio", request_type=storage.CancelResumableWriteRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.CancelResumableWriteResponse() + ) + response = await client.cancel_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.CancelResumableWriteRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.CancelResumableWriteResponse) + + +@pytest.mark.asyncio +async def test_cancel_resumable_write_async_from_dict(): + await test_cancel_resumable_write_async(request_type=dict) + + +def test_cancel_resumable_write_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.CancelResumableWriteResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.cancel_resumable_write( + upload_id="upload_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].upload_id + mock_val = "upload_id_value" + assert arg == mock_val + + +def test_cancel_resumable_write_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.cancel_resumable_write( + storage.CancelResumableWriteRequest(), + upload_id="upload_id_value", + ) + + +@pytest.mark.asyncio +async def test_cancel_resumable_write_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.CancelResumableWriteResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.CancelResumableWriteResponse() + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.cancel_resumable_write( + upload_id="upload_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].upload_id + mock_val = "upload_id_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_cancel_resumable_write_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.cancel_resumable_write( + storage.CancelResumableWriteRequest(), + upload_id="upload_id_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.GetObjectRequest, + dict, + ], +) +def test_get_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + response = client.get_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.GetObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +def test_get_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.GetObjectRequest( + bucket="bucket_value", + object_="object__value", + restore_token="restore_token_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.get_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.GetObjectRequest( + bucket="bucket_value", + object_="object__value", + restore_token="restore_token_value", + ) + + +def test_get_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.get_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.get_object] = mock_rpc + request = {} + client.get_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.get_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_get_object_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.get_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.get_object + ] = mock_rpc + + request = {} + await client.get_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.get_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_get_object_async( + transport: str = "grpc_asyncio", request_type=storage.GetObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + response = await client.get_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.GetObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +@pytest.mark.asyncio +async def test_get_object_async_from_dict(): + await test_get_object_async(request_type=dict) + + +def test_get_object_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.get_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +def test_get_object_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.get_object( + storage.GetObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.asyncio +async def test_get_object_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Object()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.get_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_get_object_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.get_object( + storage.GetObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.ReadObjectRequest, + dict, + ], +) +def test_read_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = iter([storage.ReadObjectResponse()]) + response = client.read_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.ReadObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + for message in response: + assert isinstance(message, storage.ReadObjectResponse) + + +def test_read_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.ReadObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.read_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.ReadObjectRequest( + bucket="bucket_value", + object_="object__value", + ) + + +def test_read_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.read_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.read_object] = mock_rpc + request = {} + client.read_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.read_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_read_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.read_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.read_object + ] = mock_rpc + + request = {} + await client.read_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.read_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_read_object_async( + transport: str = "grpc_asyncio", request_type=storage.ReadObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.UnaryStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock( + side_effect=[storage.ReadObjectResponse()] + ) + response = await client.read_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.ReadObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + message = await response.read() + assert isinstance(message, storage.ReadObjectResponse) + + +@pytest.mark.asyncio +async def test_read_object_async_from_dict(): + await test_read_object_async(request_type=dict) + + +def test_read_object_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = iter([storage.ReadObjectResponse()]) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.read_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +def test_read_object_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.read_object( + storage.ReadObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.asyncio +async def test_read_object_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = iter([storage.ReadObjectResponse()]) + + call.return_value = mock.Mock(aio.UnaryStreamCall, autospec=True) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.read_object( + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].object_ + mock_val = "object__value" + assert arg == mock_val + arg = args[0].generation + mock_val = 1068 + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_read_object_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.read_object( + storage.ReadObjectRequest(), + bucket="bucket_value", + object_="object__value", + generation=1068, + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.BidiReadObjectRequest, + dict, + ], +) +def test_bidi_read_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.bidi_read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = iter([storage.BidiReadObjectResponse()]) + response = client.bidi_read_object(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + for message in response: + assert isinstance(message, storage.BidiReadObjectResponse) + + +def test_bidi_read_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.bidi_read_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.bidi_read_object + ] = mock_rpc + request = [{}] + client.bidi_read_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.bidi_read_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_bidi_read_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.bidi_read_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.bidi_read_object + ] = mock_rpc + + request = [{}] + await client.bidi_read_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.bidi_read_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_bidi_read_object_async( + transport: str = "grpc_asyncio", request_type=storage.BidiReadObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.bidi_read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.StreamStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock( + side_effect=[storage.BidiReadObjectResponse()] + ) + response = await client.bidi_read_object(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + message = await response.read() + assert isinstance(message, storage.BidiReadObjectResponse) + + +@pytest.mark.asyncio +async def test_bidi_read_object_async_from_dict(): + await test_bidi_read_object_async(request_type=dict) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.UpdateObjectRequest, + dict, + ], +) +def test_update_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + response = client.update_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.UpdateObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +def test_update_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.UpdateObjectRequest( + predefined_acl="predefined_acl_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.update_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.UpdateObjectRequest( + predefined_acl="predefined_acl_value", + ) + + +def test_update_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.update_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.update_object] = mock_rpc + request = {} + client.update_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.update_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_update_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.update_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.update_object + ] = mock_rpc + + request = {} + await client.update_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.update_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_update_object_async( + transport: str = "grpc_asyncio", request_type=storage.UpdateObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + response = await client.update_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.UpdateObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +@pytest.mark.asyncio +async def test_update_object_async_from_dict(): + await test_update_object_async(request_type=dict) + + +def test_update_object_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.update_object( + object_=storage.Object(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].object_ + mock_val = storage.Object(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val + + +def test_update_object_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.update_object( + storage.UpdateObjectRequest(), + object_=storage.Object(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + +@pytest.mark.asyncio +async def test_update_object_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Object()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.update_object( + object_=storage.Object(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].object_ + mock_val = storage.Object(name="name_value") + assert arg == mock_val + arg = args[0].update_mask + mock_val = field_mask_pb2.FieldMask(paths=["paths_value"]) + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_update_object_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.update_object( + storage.UpdateObjectRequest(), + object_=storage.Object(name="name_value"), + update_mask=field_mask_pb2.FieldMask(paths=["paths_value"]), + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.WriteObjectRequest, + dict, + ], +) +def test_write_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.write_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.WriteObjectResponse( + persisted_size=1517, + ) + response = client.write_object(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.WriteObjectResponse) + + +def test_write_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.write_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.write_object] = mock_rpc + request = [{}] + client.write_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.write_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_write_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.write_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.write_object + ] = mock_rpc + + request = [{}] + await client.write_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.write_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_write_object_async( + transport: str = "grpc_asyncio", request_type=storage.WriteObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.write_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeStreamUnaryCall( + storage.WriteObjectResponse() + ) + response = await (await client.write_object(iter(requests))) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.WriteObjectResponse) + + +@pytest.mark.asyncio +async def test_write_object_async_from_dict(): + await test_write_object_async(request_type=dict) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.BidiWriteObjectRequest, + dict, + ], +) +def test_bidi_write_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.bidi_write_object), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = iter([storage.BidiWriteObjectResponse()]) + response = client.bidi_write_object(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + for message in response: + assert isinstance(message, storage.BidiWriteObjectResponse) + + +def test_bidi_write_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.bidi_write_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.bidi_write_object + ] = mock_rpc + request = [{}] + client.bidi_write_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.bidi_write_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_bidi_write_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.bidi_write_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.bidi_write_object + ] = mock_rpc + + request = [{}] + await client.bidi_write_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.bidi_write_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_bidi_write_object_async( + transport: str = "grpc_asyncio", request_type=storage.BidiWriteObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.bidi_write_object), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.StreamStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock( + side_effect=[storage.BidiWriteObjectResponse()] + ) + response = await client.bidi_write_object(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + message = await response.read() + assert isinstance(message, storage.BidiWriteObjectResponse) + + +@pytest.mark.asyncio +async def test_bidi_write_object_async_from_dict(): + await test_bidi_write_object_async(request_type=dict) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.ListObjectsRequest, + dict, + ], +) +def test_list_objects(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.ListObjectsResponse( + prefixes=["prefixes_value"], + next_page_token="next_page_token_value", + ) + response = client.list_objects(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.ListObjectsRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, pagers.ListObjectsPager) + assert response.prefixes == ["prefixes_value"] + assert response.next_page_token == "next_page_token_value" + + +def test_list_objects_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.ListObjectsRequest( + parent="parent_value", + page_token="page_token_value", + delimiter="delimiter_value", + prefix="prefix_value", + lexicographic_start="lexicographic_start_value", + lexicographic_end="lexicographic_end_value", + match_glob="match_glob_value", + filter="filter_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.list_objects(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.ListObjectsRequest( + parent="parent_value", + page_token="page_token_value", + delimiter="delimiter_value", + prefix="prefix_value", + lexicographic_start="lexicographic_start_value", + lexicographic_end="lexicographic_end_value", + match_glob="match_glob_value", + filter="filter_value", + ) + + +def test_list_objects_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.list_objects in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.list_objects] = mock_rpc + request = {} + client.list_objects(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.list_objects(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_list_objects_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.list_objects + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.list_objects + ] = mock_rpc + + request = {} + await client.list_objects(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.list_objects(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_list_objects_async( + transport: str = "grpc_asyncio", request_type=storage.ListObjectsRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListObjectsResponse( + prefixes=["prefixes_value"], + next_page_token="next_page_token_value", + ) + ) + response = await client.list_objects(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.ListObjectsRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, pagers.ListObjectsAsyncPager) + assert response.prefixes == ["prefixes_value"] + assert response.next_page_token == "next_page_token_value" + + +@pytest.mark.asyncio +async def test_list_objects_async_from_dict(): + await test_list_objects_async(request_type=dict) + + +def test_list_objects_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.ListObjectsResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.list_objects( + parent="parent_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + + +def test_list_objects_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.list_objects( + storage.ListObjectsRequest(), + parent="parent_value", + ) + + +@pytest.mark.asyncio +async def test_list_objects_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.ListObjectsResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListObjectsResponse() + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.list_objects( + parent="parent_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_list_objects_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.list_objects( + storage.ListObjectsRequest(), + parent="parent_value", + ) + + +def test_list_objects_pager(transport_name: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport_name, + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + storage.Object(), + ], + next_page_token="abc", + ), + storage.ListObjectsResponse( + objects=[], + next_page_token="def", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + ], + next_page_token="ghi", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + ], + ), + RuntimeError, + ) + + expected_metadata = () + retry = retries.Retry() + timeout = 5 + pager = client.list_objects(request={}, retry=retry, timeout=timeout) + + assert pager._metadata == expected_metadata + assert pager._retry == retry + assert pager._timeout == timeout + + results = list(pager) + assert len(results) == 6 + assert all(isinstance(i, storage.Object) for i in results) + + +def test_list_objects_pages(transport_name: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport_name, + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + storage.Object(), + ], + next_page_token="abc", + ), + storage.ListObjectsResponse( + objects=[], + next_page_token="def", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + ], + next_page_token="ghi", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + ], + ), + RuntimeError, + ) + pages = list(client.list_objects(request={}).pages) + for page_, token in zip(pages, ["abc", "def", "ghi", ""]): + assert page_.raw_page.next_page_token == token + + +@pytest.mark.asyncio +async def test_list_objects_async_pager(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_objects), "__call__", new_callable=mock.AsyncMock + ) as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + storage.Object(), + ], + next_page_token="abc", + ), + storage.ListObjectsResponse( + objects=[], + next_page_token="def", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + ], + next_page_token="ghi", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + ], + ), + RuntimeError, + ) + async_pager = await client.list_objects( + request={}, + ) + assert async_pager.next_page_token == "abc" + responses = [] + async for response in async_pager: # pragma: no branch + responses.append(response) + + assert len(responses) == 6 + assert all(isinstance(i, storage.Object) for i in responses) + + +@pytest.mark.asyncio +async def test_list_objects_async_pages(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_objects), "__call__", new_callable=mock.AsyncMock + ) as call: + # Set the response to a series of pages. + call.side_effect = ( + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + storage.Object(), + ], + next_page_token="abc", + ), + storage.ListObjectsResponse( + objects=[], + next_page_token="def", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + ], + next_page_token="ghi", + ), + storage.ListObjectsResponse( + objects=[ + storage.Object(), + storage.Object(), + ], + ), + RuntimeError, + ) + pages = [] + # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` + # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 + async for page_ in ( # pragma: no branch + await client.list_objects(request={}) + ).pages: + pages.append(page_) + for page_, token in zip(pages, ["abc", "def", "ghi", ""]): + assert page_.raw_page.next_page_token == token + + +@pytest.mark.parametrize( + "request_type", + [ + storage.RewriteObjectRequest, + dict, + ], +) +def test_rewrite_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.RewriteResponse( + total_bytes_rewritten=2285, + object_size=1169, + done=True, + rewrite_token="rewrite_token_value", + ) + response = client.rewrite_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.RewriteObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.RewriteResponse) + assert response.total_bytes_rewritten == 2285 + assert response.object_size == 1169 + assert response.done is True + assert response.rewrite_token == "rewrite_token_value" + + +def test_rewrite_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.RewriteObjectRequest( + destination_name="destination_name_value", + destination_bucket="destination_bucket_value", + destination_kms_key="destination_kms_key_value", + source_bucket="source_bucket_value", + source_object="source_object_value", + rewrite_token="rewrite_token_value", + destination_predefined_acl="destination_predefined_acl_value", + copy_source_encryption_algorithm="copy_source_encryption_algorithm_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.rewrite_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.RewriteObjectRequest( + destination_name="destination_name_value", + destination_bucket="destination_bucket_value", + destination_kms_key="destination_kms_key_value", + source_bucket="source_bucket_value", + source_object="source_object_value", + rewrite_token="rewrite_token_value", + destination_predefined_acl="destination_predefined_acl_value", + copy_source_encryption_algorithm="copy_source_encryption_algorithm_value", + ) + + +def test_rewrite_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.rewrite_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.rewrite_object] = mock_rpc + request = {} + client.rewrite_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.rewrite_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_rewrite_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.rewrite_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.rewrite_object + ] = mock_rpc + + request = {} + await client.rewrite_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.rewrite_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_rewrite_object_async( + transport: str = "grpc_asyncio", request_type=storage.RewriteObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.RewriteResponse( + total_bytes_rewritten=2285, + object_size=1169, + done=True, + rewrite_token="rewrite_token_value", + ) + ) + response = await client.rewrite_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.RewriteObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.RewriteResponse) + assert response.total_bytes_rewritten == 2285 + assert response.object_size == 1169 + assert response.done is True + assert response.rewrite_token == "rewrite_token_value" + + +@pytest.mark.asyncio +async def test_rewrite_object_async_from_dict(): + await test_rewrite_object_async(request_type=dict) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.StartResumableWriteRequest, + dict, + ], +) +def test_start_resumable_write(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.StartResumableWriteResponse( + upload_id="upload_id_value", + ) + response = client.start_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.StartResumableWriteRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.StartResumableWriteResponse) + assert response.upload_id == "upload_id_value" + + +def test_start_resumable_write_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.StartResumableWriteRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.start_resumable_write(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.StartResumableWriteRequest() + + +def test_start_resumable_write_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.start_resumable_write + in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.start_resumable_write + ] = mock_rpc + request = {} + client.start_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.start_resumable_write(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_start_resumable_write_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.start_resumable_write + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.start_resumable_write + ] = mock_rpc + + request = {} + await client.start_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.start_resumable_write(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_start_resumable_write_async( + transport: str = "grpc_asyncio", request_type=storage.StartResumableWriteRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.StartResumableWriteResponse( + upload_id="upload_id_value", + ) + ) + response = await client.start_resumable_write(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.StartResumableWriteRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.StartResumableWriteResponse) + assert response.upload_id == "upload_id_value" + + +@pytest.mark.asyncio +async def test_start_resumable_write_async_from_dict(): + await test_start_resumable_write_async(request_type=dict) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.QueryWriteStatusRequest, + dict, + ], +) +def test_query_write_status(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.QueryWriteStatusResponse( + persisted_size=1517, + ) + response = client.query_write_status(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.QueryWriteStatusRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.QueryWriteStatusResponse) + + +def test_query_write_status_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.QueryWriteStatusRequest( + upload_id="upload_id_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.query_write_status(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.QueryWriteStatusRequest( + upload_id="upload_id_value", + ) + + +def test_query_write_status_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.query_write_status in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.query_write_status + ] = mock_rpc + request = {} + client.query_write_status(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.query_write_status(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_query_write_status_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.query_write_status + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.query_write_status + ] = mock_rpc + + request = {} + await client.query_write_status(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.query_write_status(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_query_write_status_async( + transport: str = "grpc_asyncio", request_type=storage.QueryWriteStatusRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.QueryWriteStatusResponse() + ) + response = await client.query_write_status(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.QueryWriteStatusRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.QueryWriteStatusResponse) + + +@pytest.mark.asyncio +async def test_query_write_status_async_from_dict(): + await test_query_write_status_async(request_type=dict) + + +def test_query_write_status_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.QueryWriteStatusResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.query_write_status( + upload_id="upload_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].upload_id + mock_val = "upload_id_value" + assert arg == mock_val + + +def test_query_write_status_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.query_write_status( + storage.QueryWriteStatusRequest(), + upload_id="upload_id_value", + ) + + +@pytest.mark.asyncio +async def test_query_write_status_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = storage.QueryWriteStatusResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.QueryWriteStatusResponse() + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.query_write_status( + upload_id="upload_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].upload_id + mock_val = "upload_id_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_query_write_status_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.query_write_status( + storage.QueryWriteStatusRequest(), + upload_id="upload_id_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + storage.MoveObjectRequest, + dict, + ], +) +def test_move_object(request_type, transport: str = "grpc"): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + response = client.move_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = storage.MoveObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +def test_move_object_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = storage.MoveObjectRequest( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + call.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client.move_object(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == storage.MoveObjectRequest( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + +def test_move_object_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.move_object in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.move_object] = mock_rpc + request = {} + client.move_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.move_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_move_object_async_use_cached_wrapped_rpc( + transport: str = "grpc_asyncio", +): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._client._transport.move_object + in client._client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[ + client._client._transport.move_object + ] = mock_rpc + + request = {} + await client.move_object(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.move_object(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +@pytest.mark.asyncio +async def test_move_object_async( + transport: str = "grpc_asyncio", request_type=storage.MoveObjectRequest +): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + response = await client.move_object(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = storage.MoveObjectRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, storage.Object) + assert response.name == "name_value" + assert response.bucket == "bucket_value" + assert response.etag == "etag_value" + assert response.generation == 1068 + assert response.restore_token == "restore_token_value" + assert response.metageneration == 1491 + assert response.storage_class == "storage_class_value" + assert response.size == 443 + assert response.content_encoding == "content_encoding_value" + assert response.content_disposition == "content_disposition_value" + assert response.cache_control == "cache_control_value" + assert response.content_language == "content_language_value" + assert response.content_type == "content_type_value" + assert response.component_count == 1627 + assert response.kms_key == "kms_key_value" + assert response.temporary_hold is True + assert response.event_based_hold is True + + +@pytest.mark.asyncio +async def test_move_object_async_from_dict(): + await test_move_object_async(request_type=dict) + + +def test_move_object_flattened(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.move_object( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].source_object + mock_val = "source_object_value" + assert arg == mock_val + arg = args[0].destination_object + mock_val = "destination_object_value" + assert arg == mock_val + + +def test_move_object_flattened_error(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.move_object( + storage.MoveObjectRequest(), + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + +@pytest.mark.asyncio +async def test_move_object_flattened_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = storage.Object() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(storage.Object()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.move_object( + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].bucket + mock_val = "bucket_value" + assert arg == mock_val + arg = args[0].source_object + mock_val = "source_object_value" + assert arg == mock_val + arg = args[0].destination_object + mock_val = "destination_object_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_move_object_flattened_error_async(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.move_object( + storage.MoveObjectRequest(), + bucket="bucket_value", + source_object="source_object_value", + destination_object="destination_object_value", + ) + + +def test_credentials_transport_error(): + # It is an error to provide credentials and a transport instance. + transport = transports.StorageGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # It is an error to provide a credentials file and a transport instance. + transport = transports.StorageGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = StorageClient( + client_options={"credentials_file": "credentials.json"}, + transport=transport, + ) + + # It is an error to provide an api_key and a transport instance. + transport = transports.StorageGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = StorageClient( + client_options=options, + transport=transport, + ) + + # It is an error to provide an api_key and a credential. + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = StorageClient( + client_options=options, credentials=ga_credentials.AnonymousCredentials() + ) + + # It is an error to provide scopes and a transport instance. + transport = transports.StorageGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = StorageClient( + client_options={"scopes": ["1", "2"]}, + transport=transport, + ) + + +def test_transport_instance(): + # A client may be instantiated with a custom transport instance. + transport = transports.StorageGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + client = StorageClient(transport=transport) + assert client.transport is transport + + +def test_transport_get_channel(): + # A client may be instantiated with a custom transport instance. + transport = transports.StorageGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + transport = transports.StorageGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.StorageGrpcTransport, + transports.StorageGrpcAsyncIOTransport, + ], +) +def test_transport_adc(transport_class): + # Test default credentials are used if not provided. + with mock.patch.object(google.auth, "default") as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class() + adc.assert_called_once() + + +def test_transport_kind_grpc(): + transport = StorageClient.get_transport_class("grpc")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "grpc" + + +def test_initialize_client_w_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), transport="grpc" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_delete_bucket_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + call.return_value = None + client.delete_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.DeleteBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_get_bucket_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.get_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.GetBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_create_bucket_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.create_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.CreateBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_list_buckets_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + call.return_value = storage.ListBucketsResponse() + client.list_buckets(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ListBucketsRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_lock_bucket_retention_policy_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + call.return_value = storage.Bucket() + client.lock_bucket_retention_policy(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.LockBucketRetentionPolicyRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_get_iam_policy_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + call.return_value = policy_pb2.Policy() + client.get_iam_policy(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = iam_policy_pb2.GetIamPolicyRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_set_iam_policy_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + call.return_value = policy_pb2.Policy() + client.set_iam_policy(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = iam_policy_pb2.SetIamPolicyRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_update_bucket_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.update_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.UpdateBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_compose_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + call.return_value = storage.Object() + client.compose_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ComposeObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_delete_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + call.return_value = None + client.delete_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.DeleteObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_restore_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + call.return_value = storage.Object() + client.restore_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.RestoreObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_cancel_resumable_write_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + call.return_value = storage.CancelResumableWriteResponse() + client.cancel_resumable_write(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.CancelResumableWriteRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_get_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + call.return_value = storage.Object() + client.get_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.GetObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_read_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + call.return_value = iter([storage.ReadObjectResponse()]) + client.read_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ReadObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_update_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + call.return_value = storage.Object() + client.update_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.UpdateObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_list_objects_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + call.return_value = storage.ListObjectsResponse() + client.list_objects(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ListObjectsRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_rewrite_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + call.return_value = storage.RewriteResponse() + client.rewrite_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.RewriteObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_start_resumable_write_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + call.return_value = storage.StartResumableWriteResponse() + client.start_resumable_write(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.StartResumableWriteRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_query_write_status_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + call.return_value = storage.QueryWriteStatusResponse() + client.query_write_status(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.QueryWriteStatusRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_move_object_empty_call_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + call.return_value = storage.Object() + client.move_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.MoveObjectRequest() + + assert args[0] == request_msg + + +def test_delete_bucket_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + call.return_value = None + client.delete_bucket(request={"name": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.DeleteBucketRequest(**{"name": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_get_bucket_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.get_bucket(request={"name": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.GetBucketRequest(**{"name": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_create_bucket_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.create_bucket(request={"parent": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.CreateBucketRequest(**{"parent": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"project": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_create_bucket_routing_parameters_request_2_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.create_bucket(request={"bucket": {"project": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.CreateBucketRequest(**{"bucket": {"project": "sample1"}}) + + assert args[0] == request_msg + + expected_headers = {"project": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_list_buckets_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + call.return_value = storage.ListBucketsResponse() + client.list_buckets(request={"parent": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ListBucketsRequest(**{"parent": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"project": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_lock_bucket_retention_policy_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + call.return_value = storage.Bucket() + client.lock_bucket_retention_policy(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.LockBucketRetentionPolicyRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_get_iam_policy_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + call.return_value = policy_pb2.Policy() + client.get_iam_policy(request={"resource": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.GetIamPolicyRequest(**{"resource": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_get_iam_policy_routing_parameters_request_2_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + call.return_value = policy_pb2.Policy() + client.get_iam_policy( + request={"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.GetIamPolicyRequest( + **{"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_set_iam_policy_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + call.return_value = policy_pb2.Policy() + client.set_iam_policy(request={"resource": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.SetIamPolicyRequest(**{"resource": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_set_iam_policy_routing_parameters_request_2_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + call.return_value = policy_pb2.Policy() + client.set_iam_policy( + request={"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.SetIamPolicyRequest( + **{"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_test_iam_permissions_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + client.test_iam_permissions(request={"resource": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest( + **{"resource": "sample1"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_test_iam_permissions_routing_parameters_request_2_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + client.test_iam_permissions( + request={"resource": "projects/sample1/buckets/sample2/objects/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest( + **{"resource": "projects/sample1/buckets/sample2/objects/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_test_iam_permissions_routing_parameters_request_3_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + call.return_value = iam_policy_pb2.TestIamPermissionsResponse() + client.test_iam_permissions( + request={ + "resource": "projects/sample1/buckets/sample2/managedFolders/sample3" + } + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest( + **{"resource": "projects/sample1/buckets/sample2/managedFolders/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_update_bucket_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + call.return_value = storage.Bucket() + client.update_bucket(request={"bucket": {"name": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.UpdateBucketRequest(**{"bucket": {"name": "sample1"}}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_compose_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + call.return_value = storage.Object() + client.compose_object(request={"destination": {"bucket": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ComposeObjectRequest( + **{"destination": {"bucket": "sample1"}} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_delete_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + call.return_value = None + client.delete_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.DeleteObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_restore_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + call.return_value = storage.Object() + client.restore_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.RestoreObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_cancel_resumable_write_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + call.return_value = storage.CancelResumableWriteResponse() + client.cancel_resumable_write( + request={"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.CancelResumableWriteRequest( + **{"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_get_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + call.return_value = storage.Object() + client.get_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.GetObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_read_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + call.return_value = iter([storage.ReadObjectResponse()]) + client.read_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ReadObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_update_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + call.return_value = storage.Object() + client.update_object(request={"object": {"bucket": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.UpdateObjectRequest(**{"object": {"bucket": "sample1"}}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_list_objects_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + call.return_value = storage.ListObjectsResponse() + client.list_objects(request={"parent": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ListObjectsRequest(**{"parent": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_rewrite_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + call.return_value = storage.RewriteResponse() + client.rewrite_object(request={"source_bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.RewriteObjectRequest(**{"source_bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"source_bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_rewrite_object_routing_parameters_request_2_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + call.return_value = storage.RewriteResponse() + client.rewrite_object(request={"destination_bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.RewriteObjectRequest(**{"destination_bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_start_resumable_write_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + call.return_value = storage.StartResumableWriteResponse() + client.start_resumable_write( + request={"write_object_spec": {"resource": {"bucket": "sample1"}}} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.StartResumableWriteRequest( + **{"write_object_spec": {"resource": {"bucket": "sample1"}}} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_query_write_status_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + call.return_value = storage.QueryWriteStatusResponse() + client.query_write_status( + request={"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.QueryWriteStatusRequest( + **{"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_move_object_routing_parameters_request_1_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + call.return_value = storage.Object() + client.move_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.MoveObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_transport_kind_grpc_asyncio(): + transport = StorageAsyncClient.get_transport_class("grpc_asyncio")( + credentials=async_anonymous_credentials() + ) + assert transport.kind == "grpc_asyncio" + + +def test_initialize_client_w_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), transport="grpc_asyncio" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_delete_bucket_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + await client.delete_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.DeleteBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_get_bucket_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.get_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.GetBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_create_bucket_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.create_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.CreateBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_list_buckets_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListBucketsResponse( + next_page_token="next_page_token_value", + ) + ) + await client.list_buckets(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ListBucketsRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.lock_bucket_retention_policy(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.LockBucketRetentionPolicyRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_get_iam_policy_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + await client.get_iam_policy(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = iam_policy_pb2.GetIamPolicyRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_set_iam_policy_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + await client.set_iam_policy(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = iam_policy_pb2.SetIamPolicyRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_test_iam_permissions_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + iam_policy_pb2.TestIamPermissionsResponse( + permissions=["permissions_value"], + ) + ) + await client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_update_bucket_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.update_bucket(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.UpdateBucketRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_compose_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.compose_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ComposeObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_delete_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + await client.delete_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.DeleteObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_restore_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.restore_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.RestoreObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_cancel_resumable_write_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.CancelResumableWriteResponse() + ) + await client.cancel_resumable_write(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.CancelResumableWriteRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_get_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.get_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.GetObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_read_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.UnaryStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock( + side_effect=[storage.ReadObjectResponse()] + ) + await client.read_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ReadObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_update_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.update_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.UpdateObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_list_objects_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListObjectsResponse( + prefixes=["prefixes_value"], + next_page_token="next_page_token_value", + ) + ) + await client.list_objects(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.ListObjectsRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_rewrite_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.RewriteResponse( + total_bytes_rewritten=2285, + object_size=1169, + done=True, + rewrite_token="rewrite_token_value", + ) + ) + await client.rewrite_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.RewriteObjectRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_start_resumable_write_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.StartResumableWriteResponse( + upload_id="upload_id_value", + ) + ) + await client.start_resumable_write(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.StartResumableWriteRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_query_write_status_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.QueryWriteStatusResponse() + ) + await client.query_write_status(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.QueryWriteStatusRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_move_object_empty_call_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.move_object(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = storage.MoveObjectRequest() + + assert args[0] == request_msg + + +@pytest.mark.asyncio +async def test_delete_bucket_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + await client.delete_bucket(request={"name": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.DeleteBucketRequest(**{"name": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_get_bucket_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.get_bucket(request={"name": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.GetBucketRequest(**{"name": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_create_bucket_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.create_bucket(request={"parent": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.CreateBucketRequest(**{"parent": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"project": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_create_bucket_routing_parameters_request_2_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.create_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.create_bucket(request={"bucket": {"project": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.CreateBucketRequest(**{"bucket": {"project": "sample1"}}) + + assert args[0] == request_msg + + expected_headers = {"project": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_list_buckets_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_buckets), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListBucketsResponse( + next_page_token="next_page_token_value", + ) + ) + await client.list_buckets(request={"parent": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ListBucketsRequest(**{"parent": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"project": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_lock_bucket_retention_policy_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.lock_bucket_retention_policy), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.lock_bucket_retention_policy(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.LockBucketRetentionPolicyRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_get_iam_policy_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + await client.get_iam_policy(request={"resource": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.GetIamPolicyRequest(**{"resource": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_get_iam_policy_routing_parameters_request_2_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + await client.get_iam_policy( + request={"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.GetIamPolicyRequest( + **{"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_set_iam_policy_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + await client.set_iam_policy(request={"resource": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.SetIamPolicyRequest(**{"resource": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_set_iam_policy_routing_parameters_request_2_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.set_iam_policy), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + policy_pb2.Policy( + version=774, + etag=b"etag_blob", + ) + ) + await client.set_iam_policy( + request={"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.SetIamPolicyRequest( + **{"resource": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_test_iam_permissions_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + iam_policy_pb2.TestIamPermissionsResponse( + permissions=["permissions_value"], + ) + ) + await client.test_iam_permissions(request={"resource": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest( + **{"resource": "sample1"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_test_iam_permissions_routing_parameters_request_2_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + iam_policy_pb2.TestIamPermissionsResponse( + permissions=["permissions_value"], + ) + ) + await client.test_iam_permissions( + request={"resource": "projects/sample1/buckets/sample2/objects/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest( + **{"resource": "projects/sample1/buckets/sample2/objects/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_test_iam_permissions_routing_parameters_request_3_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + iam_policy_pb2.TestIamPermissionsResponse( + permissions=["permissions_value"], + ) + ) + await client.test_iam_permissions( + request={ + "resource": "projects/sample1/buckets/sample2/managedFolders/sample3" + } + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = iam_policy_pb2.TestIamPermissionsRequest( + **{"resource": "projects/sample1/buckets/sample2/managedFolders/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_update_bucket_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_bucket), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Bucket( + name="name_value", + bucket_id="bucket_id_value", + etag="etag_value", + project="project_value", + metageneration=1491, + location="location_value", + location_type="location_type_value", + storage_class="storage_class_value", + rpo="rpo_value", + default_event_based_hold=True, + satisfies_pzs=True, + ) + ) + await client.update_bucket(request={"bucket": {"name": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.UpdateBucketRequest(**{"bucket": {"name": "sample1"}}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_compose_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.compose_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.compose_object(request={"destination": {"bucket": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ComposeObjectRequest( + **{"destination": {"bucket": "sample1"}} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_delete_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.delete_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(None) + await client.delete_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.DeleteObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_restore_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.restore_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.restore_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.RestoreObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_cancel_resumable_write_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.cancel_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.CancelResumableWriteResponse() + ) + await client.cancel_resumable_write( + request={"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.CancelResumableWriteRequest( + **{"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_get_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.get_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.get_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.GetObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_read_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.read_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.UnaryStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock( + side_effect=[storage.ReadObjectResponse()] + ) + await client.read_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ReadObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_update_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.update_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.update_object(request={"object": {"bucket": "sample1"}}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.UpdateObjectRequest(**{"object": {"bucket": "sample1"}}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_list_objects_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.list_objects), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.ListObjectsResponse( + prefixes=["prefixes_value"], + next_page_token="next_page_token_value", + ) + ) + await client.list_objects(request={"parent": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.ListObjectsRequest(**{"parent": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_rewrite_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.RewriteResponse( + total_bytes_rewritten=2285, + object_size=1169, + done=True, + rewrite_token="rewrite_token_value", + ) + ) + await client.rewrite_object(request={"source_bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.RewriteObjectRequest(**{"source_bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"source_bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_rewrite_object_routing_parameters_request_2_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.rewrite_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.RewriteResponse( + total_bytes_rewritten=2285, + object_size=1169, + done=True, + rewrite_token="rewrite_token_value", + ) + ) + await client.rewrite_object(request={"destination_bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.RewriteObjectRequest(**{"destination_bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_start_resumable_write_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.start_resumable_write), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.StartResumableWriteResponse( + upload_id="upload_id_value", + ) + ) + await client.start_resumable_write( + request={"write_object_spec": {"resource": {"bucket": "sample1"}}} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.StartResumableWriteRequest( + **{"write_object_spec": {"resource": {"bucket": "sample1"}}} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_query_write_status_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.query_write_status), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.QueryWriteStatusResponse() + ) + await client.query_write_status( + request={"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.QueryWriteStatusRequest( + **{"upload_id": "projects/sample1/buckets/sample2/sample3"} + ) + + assert args[0] == request_msg + + expected_headers = {"bucket": "projects/sample1/buckets/sample2"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +@pytest.mark.asyncio +async def test_move_object_routing_parameters_request_1_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object(type(client.transport.move_object), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + storage.Object( + name="name_value", + bucket="bucket_value", + etag="etag_value", + generation=1068, + restore_token="restore_token_value", + metageneration=1491, + storage_class="storage_class_value", + size=443, + content_encoding="content_encoding_value", + content_disposition="content_disposition_value", + cache_control="cache_control_value", + content_language="content_language_value", + content_type="content_type_value", + component_count=1627, + kms_key="kms_key_value", + temporary_hold=True, + event_based_hold=True, + ) + ) + await client.move_object(request={"bucket": "sample1"}) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, kw = call.mock_calls[0] + request_msg = storage.MoveObjectRequest(**{"bucket": "sample1"}) + + assert args[0] == request_msg + + expected_headers = {"bucket": "sample1"} + assert ( + gapic_v1.routing_header.to_grpc_metadata(expected_headers) in kw["metadata"] + ) + + +def test_transport_grpc_default(): + # A client should use the gRPC transport by default. + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.StorageGrpcTransport, + ) + + +def test_storage_base_transport_error(): + # Passing both a credentials object and credentials_file should raise an error + with pytest.raises(core_exceptions.DuplicateCredentialArgs): + transport = transports.StorageTransport( + credentials=ga_credentials.AnonymousCredentials(), + credentials_file="credentials.json", + ) + + +def test_storage_base_transport(): + # Instantiate the base transport. + with mock.patch( + "google.cloud.storage_v2.services.storage.transports.StorageTransport.__init__" + ) as Transport: + Transport.return_value = None + transport = transports.StorageTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Every method on the transport should just blindly + # raise NotImplementedError. + methods = ( + "delete_bucket", + "get_bucket", + "create_bucket", + "list_buckets", + "lock_bucket_retention_policy", + "get_iam_policy", + "set_iam_policy", + "test_iam_permissions", + "update_bucket", + "compose_object", + "delete_object", + "restore_object", + "cancel_resumable_write", + "get_object", + "read_object", + "bidi_read_object", + "update_object", + "write_object", + "bidi_write_object", + "list_objects", + "rewrite_object", + "start_resumable_write", + "query_write_status", + "move_object", + ) + for method in methods: + with pytest.raises(NotImplementedError): + getattr(transport, method)(request=object()) + + with pytest.raises(NotImplementedError): + transport.close() + + # Catch all for all remaining methods and properties + remainder = [ + "kind", + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + + +def test_storage_base_transport_with_credentials_file(): + # Instantiate the base transport with a credentials file + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch( + "google.cloud.storage_v2.services.storage.transports.StorageTransport._prep_wrapped_messages" + ) as Transport: + Transport.return_value = None + load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.StorageTransport( + credentials_file="credentials.json", + quota_project_id="octopus", + ) + load_creds.assert_called_once_with( + "credentials.json", + scopes=None, + default_scopes=( + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write", + ), + quota_project_id="octopus", + ) + + +def test_storage_base_transport_with_adc(): + # Test the default credentials are used if credentials and credentials_file are None. + with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( + "google.cloud.storage_v2.services.storage.transports.StorageTransport._prep_wrapped_messages" + ) as Transport: + Transport.return_value = None + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.StorageTransport() + adc.assert_called_once() + + +def test_storage_auth_adc(): + # If no credentials are provided, we should use ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + StorageClient() + adc.assert_called_once_with( + scopes=None, + default_scopes=( + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write", + ), + quota_project_id=None, + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.StorageGrpcTransport, + transports.StorageGrpcAsyncIOTransport, + ], +) +def test_storage_transport_auth_adc(transport_class): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + adc.assert_called_once_with( + scopes=["1", "2"], + default_scopes=( + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write", + ), + quota_project_id="octopus", + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.StorageGrpcTransport, + transports.StorageGrpcAsyncIOTransport, + ], +) +def test_storage_transport_auth_gdch_credentials(transport_class): + host = "https://language.com" + api_audience_tests = [None, "https://language2.com"] + api_audience_expect = [host, "https://language2.com"] + for t, e in zip(api_audience_tests, api_audience_expect): + with mock.patch.object(google.auth, "default", autospec=True) as adc: + gdch_mock = mock.MagicMock() + type(gdch_mock).with_gdch_audience = mock.PropertyMock( + return_value=gdch_mock + ) + adc.return_value = (gdch_mock, None) + transport_class(host=host, api_audience=t) + gdch_mock.with_gdch_audience.assert_called_once_with(e) + + +@pytest.mark.parametrize( + "transport_class,grpc_helpers", + [ + (transports.StorageGrpcTransport, grpc_helpers), + (transports.StorageGrpcAsyncIOTransport, grpc_helpers_async), + ], +) +def test_storage_transport_create_channel(transport_class, grpc_helpers): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel", autospec=True + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + adc.return_value = (creds, None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + + create_channel.assert_called_with( + "storage.googleapis.com:443", + credentials=creds, + credentials_file=None, + quota_project_id="octopus", + default_scopes=( + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write", + ), + scopes=["1", "2"], + default_host="storage.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize( + "transport_class", + [transports.StorageGrpcTransport, transports.StorageGrpcAsyncIOTransport], +) +def test_storage_grpc_transport_client_cert_source_for_mtls(transport_class): + cred = ga_credentials.AnonymousCredentials() + + # Check ssl_channel_credentials is used if provided. + with mock.patch.object(transport_class, "create_channel") as mock_create_channel: + mock_ssl_channel_creds = mock.Mock() + transport_class( + host="squid.clam.whelk", + credentials=cred, + ssl_channel_credentials=mock_ssl_channel_creds, + ) + mock_create_channel.assert_called_once_with( + "squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_channel_creds, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls + # is used. + with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): + with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: + transport_class( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback, + ) + expected_cert, expected_key = client_cert_source_callback() + mock_ssl_cred.assert_called_once_with( + certificate_chain=expected_cert, private_key=expected_key + ) + + +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + "grpc_asyncio", + ], +) +def test_storage_host_no_port(transport_name): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions( + api_endpoint="storage.googleapis.com" + ), + transport=transport_name, + ) + assert client.transport._host == ("storage.googleapis.com:443") + + +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + "grpc_asyncio", + ], +) +def test_storage_host_with_port(transport_name): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions( + api_endpoint="storage.googleapis.com:8000" + ), + transport=transport_name, + ) + assert client.transport._host == ("storage.googleapis.com:8000") + + +def test_storage_grpc_transport_channel(): + channel = grpc.secure_channel("http://localhost/", grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.StorageGrpcTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +def test_storage_grpc_asyncio_transport_channel(): + channel = aio.secure_channel("http://localhost/", grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.StorageGrpcAsyncIOTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize( + "transport_class", + [transports.StorageGrpcTransport, transports.StorageGrpcAsyncIOTransport], +) +def test_storage_transport_channel_mtls_with_client_cert_source(transport_class): + with mock.patch( + "grpc.ssl_channel_credentials", autospec=True + ) as grpc_ssl_channel_cred: + with mock.patch.object( + transport_class, "create_channel" + ) as grpc_create_channel: + mock_ssl_cred = mock.Mock() + grpc_ssl_channel_cred.return_value = mock_ssl_cred + + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + + cred = ga_credentials.AnonymousCredentials() + with pytest.warns(DeprecationWarning): + with mock.patch.object(google.auth, "default") as adc: + adc.return_value = (cred, None) + transport = transport_class( + host="squid.clam.whelk", + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=client_cert_source_callback, + ) + adc.assert_called_once() + + grpc_ssl_channel_cred.assert_called_once_with( + certificate_chain=b"cert bytes", private_key=b"key bytes" + ) + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + assert transport._ssl_channel_credentials == mock_ssl_cred + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize( + "transport_class", + [transports.StorageGrpcTransport, transports.StorageGrpcAsyncIOTransport], +) +def test_storage_transport_channel_mtls_with_adc(transport_class): + mock_ssl_cred = mock.Mock() + with mock.patch.multiple( + "google.auth.transport.grpc.SslCredentials", + __init__=mock.Mock(return_value=None), + ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), + ): + with mock.patch.object( + transport_class, "create_channel" + ) as grpc_create_channel: + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + mock_cred = mock.Mock() + + with pytest.warns(DeprecationWarning): + transport = transport_class( + host="squid.clam.whelk", + credentials=mock_cred, + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=None, + ) + + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=mock_cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + + +def test_bucket_path(): + project = "squid" + bucket = "clam" + expected = "projects/{project}/buckets/{bucket}".format( + project=project, + bucket=bucket, + ) + actual = StorageClient.bucket_path(project, bucket) + assert expected == actual + + +def test_parse_bucket_path(): + expected = { + "project": "whelk", + "bucket": "octopus", + } + path = StorageClient.bucket_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_bucket_path(path) + assert expected == actual + + +def test_crypto_key_path(): + project = "oyster" + location = "nudibranch" + key_ring = "cuttlefish" + crypto_key = "mussel" + expected = "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}".format( + project=project, + location=location, + key_ring=key_ring, + crypto_key=crypto_key, + ) + actual = StorageClient.crypto_key_path(project, location, key_ring, crypto_key) + assert expected == actual + + +def test_parse_crypto_key_path(): + expected = { + "project": "winkle", + "location": "nautilus", + "key_ring": "scallop", + "crypto_key": "abalone", + } + path = StorageClient.crypto_key_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_crypto_key_path(path) + assert expected == actual + + +def test_common_billing_account_path(): + billing_account = "squid" + expected = "billingAccounts/{billing_account}".format( + billing_account=billing_account, + ) + actual = StorageClient.common_billing_account_path(billing_account) + assert expected == actual + + +def test_parse_common_billing_account_path(): + expected = { + "billing_account": "clam", + } + path = StorageClient.common_billing_account_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_common_billing_account_path(path) + assert expected == actual + + +def test_common_folder_path(): + folder = "whelk" + expected = "folders/{folder}".format( + folder=folder, + ) + actual = StorageClient.common_folder_path(folder) + assert expected == actual + + +def test_parse_common_folder_path(): + expected = { + "folder": "octopus", + } + path = StorageClient.common_folder_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_common_folder_path(path) + assert expected == actual + + +def test_common_organization_path(): + organization = "oyster" + expected = "organizations/{organization}".format( + organization=organization, + ) + actual = StorageClient.common_organization_path(organization) + assert expected == actual + + +def test_parse_common_organization_path(): + expected = { + "organization": "nudibranch", + } + path = StorageClient.common_organization_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_common_organization_path(path) + assert expected == actual + + +def test_common_project_path(): + project = "cuttlefish" + expected = "projects/{project}".format( + project=project, + ) + actual = StorageClient.common_project_path(project) + assert expected == actual + + +def test_parse_common_project_path(): + expected = { + "project": "mussel", + } + path = StorageClient.common_project_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_common_project_path(path) + assert expected == actual + + +def test_common_location_path(): + project = "winkle" + location = "nautilus" + expected = "projects/{project}/locations/{location}".format( + project=project, + location=location, + ) + actual = StorageClient.common_location_path(project, location) + assert expected == actual + + +def test_parse_common_location_path(): + expected = { + "project": "scallop", + "location": "abalone", + } + path = StorageClient.common_location_path(**expected) + + # Check that the path construction is reversible. + actual = StorageClient.parse_common_location_path(path) + assert expected == actual + + +def test_client_with_default_client_info(): + client_info = gapic_v1.client_info.ClientInfo() + + with mock.patch.object( + transports.StorageTransport, "_prep_wrapped_messages" + ) as prep: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + with mock.patch.object( + transports.StorageTransport, "_prep_wrapped_messages" + ) as prep: + transport_class = StorageClient.get_transport_class() + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + +def test_transport_close_grpc(): + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), transport="grpc" + ) + with mock.patch.object( + type(getattr(client.transport, "_grpc_channel")), "close" + ) as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +@pytest.mark.asyncio +async def test_transport_close_grpc_asyncio(): + client = StorageAsyncClient( + credentials=async_anonymous_credentials(), transport="grpc_asyncio" + ) + with mock.patch.object( + type(getattr(client.transport, "_grpc_channel")), "close" + ) as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + "grpc", + ] + for transport in transports: + client = StorageClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() + + +@pytest.mark.parametrize( + "client_class,transport_class", + [ + (StorageClient, transports.StorageGrpcTransport), + (StorageAsyncClient, transports.StorageGrpcAsyncIOTransport), + ], +) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format( + UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE + ), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) From 5964009c0efae9c84a9433715d74befca7ddf98d Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Fri, 18 Jul 2025 07:48:53 -0400 Subject: [PATCH 359/509] chore: exclude autogenerated .coveragerc (#1510) --- owlbot.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/owlbot.py b/owlbot.py index 2cc8e4259..e04f47062 100644 --- a/owlbot.py +++ b/owlbot.py @@ -37,6 +37,7 @@ s.move( [library], excludes=[ + ".coveragerc", "docs/**/*", "scripts/fixup*.py", "setup.py", @@ -108,12 +109,6 @@ """) -s.replace( - ".coveragerc", - "omit =", - """omit = - .nox/*""") - python.py_samples(skip_readmes=True) # Use a python runtime which is available in the owlbot post processor here From 61bd57509ab3966f4382656200f2600ce41cce24 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 18 Jul 2025 18:34:52 +0530 Subject: [PATCH 360/509] chore: remove duplicates in coveragerc (#1511) * chore: remove duplicates in coveragerc * chore: fix formatting --- .coveragerc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.coveragerc b/.coveragerc index 89c9bc1b9..b20914c45 100644 --- a/.coveragerc +++ b/.coveragerc @@ -4,11 +4,7 @@ branch = True [report] show_missing = True omit = - .nox/* - .nox/* - .nox/* - .nox/* - .nox/* + .nox/* google/cloud/storage/__init__.py google/cloud/storage/gapic_version.py exclude_lines = From 083a505e1f43c20657570c74ec707485f4b3989d Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 29 Jul 2025 11:15:34 +0530 Subject: [PATCH 361/509] chore: improve docs for list_files_with_prefix (#1517) If a user wants to just list prefixes without listing the blob names they can do so by following the updated documentation. --- samples/snippets/storage_list_files_with_prefix.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/samples/snippets/storage_list_files_with_prefix.py b/samples/snippets/storage_list_files_with_prefix.py index be7468cba..7f877d1d6 100644 --- a/samples/snippets/storage_list_files_with_prefix.py +++ b/samples/snippets/storage_list_files_with_prefix.py @@ -46,12 +46,23 @@ def list_blobs_with_prefix(bucket_name, prefix, delimiter=None): that lists the "subfolders" under `a/`: a/b/ + + + Note: If you only want to list prefixes a/b/ and don't want to iterate over + blobs, you can do + + ``` + for page in blobs.pages: + print(page.prefixes) + ``` """ storage_client = storage.Client() # Note: Client.list_blobs requires at least package version 1.17.0. - blobs = storage_client.list_blobs(bucket_name, prefix=prefix, delimiter=delimiter) + blobs = storage_client.list_blobs( + bucket_name, prefix=prefix, delimiter=delimiter + ) # Note: The call returns a response only when the iterator is consumed. print("Blobs:") From 6a9923e4fc944f7a7c3906eb7800d23677bd2481 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 30 Jul 2025 10:51:23 +0530 Subject: [PATCH 362/509] Fix: Add logs on AssertionError for issue #1512 (#1518) Adding Response.content and headers will help debug this flaky issue which throws 403, having more verbose information would be helpful. Closes #1512 --- tests/system/test__signing.py | 122 +++++++++++++++++++++++++++------- 1 file changed, 99 insertions(+), 23 deletions(-) diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index cdf718d90..ed5a0c09a 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -51,10 +51,17 @@ def _create_signed_list_blobs_url_helper( ) response = requests.get(signed_url) - assert response.status_code == 200 + assert ( + response.status_code == 200 + ), f"Response content start: {response.content} \ + :Response content end. \ + Response headers start: {response.headers} \ + :Response headers end." -def test_create_signed_list_blobs_url_v2(storage_client, signing_bucket, no_mtls): +def test_create_signed_list_blobs_url_v2( + storage_client, signing_bucket, no_mtls +): _create_signed_list_blobs_url_helper( storage_client, signing_bucket, @@ -76,7 +83,9 @@ def test_create_signed_list_blobs_url_v2_w_expiration( ) -def test_create_signed_list_blobs_url_v4(storage_client, signing_bucket, no_mtls): +def test_create_signed_list_blobs_url_v4( + storage_client, signing_bucket, no_mtls +): _create_signed_list_blobs_url_helper( storage_client, signing_bucket, @@ -137,7 +146,12 @@ def _create_signed_read_url_helper( headers["x-goog-encryption-key-sha256"] = key_hash response = requests.get(signed_url, headers=headers) - assert response.status_code == 200 + assert ( + response.status_code == 200 + ), f"Response content start: {response.content} \ + :Response content end. \ + Response headers start: {response.headers} \ + :Response headers end." if payload is not None: assert response.content == payload @@ -215,7 +229,9 @@ def test_create_signed_read_url_v4_w_non_ascii_name( ) -def test_create_signed_read_url_v2_w_csek(storage_client, signing_bucket, no_mtls): +def test_create_signed_read_url_v2_w_csek( + storage_client, signing_bucket, no_mtls +): encryption_key = os.urandom(32) _create_signed_read_url_helper( storage_client, @@ -226,7 +242,9 @@ def test_create_signed_read_url_v2_w_csek(storage_client, signing_bucket, no_mtl ) -def test_create_signed_read_url_v4_w_csek(storage_client, signing_bucket, no_mtls): +def test_create_signed_read_url_v4_w_csek( + storage_client, signing_bucket, no_mtls +): encryption_key = os.urandom(32) _create_signed_read_url_helper( storage_client, @@ -309,7 +327,9 @@ def test_create_signed_read_url_v4_w_access_token_universe_domain( "https://www.googleapis.com/auth/devstorage.read_write", "https://www.googleapis.com/auth/iam", ] - response = universe_domain_iam_client.generate_access_token(name=name, scope=scope) + response = universe_domain_iam_client.generate_access_token( + name=name, scope=scope + ) _create_signed_read_url_helper( universe_domain_client, @@ -320,7 +340,9 @@ def test_create_signed_read_url_v4_w_access_token_universe_domain( ) -def _create_signed_delete_url_helper(client, bucket, version="v2", expiration=None): +def _create_signed_delete_url_helper( + client, bucket, version="v2", expiration=None +): expiration = _morph_expiration(version, expiration) blob = bucket.blob("DELETE_ME.txt") @@ -335,7 +357,12 @@ def _create_signed_delete_url_helper(client, bucket, version="v2", expiration=No response = requests.request("DELETE", signed_delete_url) - assert response.status_code == 204 + assert ( + response.status_code == 204 + ), f"Response content start: {response.content} \ + :Response content end. \ + Response headers start: {response.headers} \ + :Response headers end." assert response.content == b"" assert not blob.exists() @@ -345,7 +372,9 @@ def test_create_signed_delete_url_v2(storage_client, signing_bucket, no_mtls): def test_create_signed_delete_url_v4(storage_client, signing_bucket, no_mtls): - _create_signed_delete_url_helper(storage_client, signing_bucket, version="v4") + _create_signed_delete_url_helper( + storage_client, signing_bucket, version="v4" + ) def _create_signed_resumable_upload_url_helper( @@ -364,14 +393,26 @@ def _create_signed_resumable_upload_url_helper( ) post_headers = {"x-goog-resumable": "start"} - post_response = requests.post(signed_resumable_upload_url, headers=post_headers) - assert post_response.status_code == 201 + post_response = requests.post( + signed_resumable_upload_url, headers=post_headers + ) + assert ( + post_response.status_code == 201 + ), f"Response content start: {post_response.content} \ + :Response content end. \ + Response headers start: {post_response.headers} \ + :Response headers end." # Finish uploading the body. location = post_response.headers["Location"] put_headers = {"content-length": str(len(payload))} put_response = requests.put(location, headers=put_headers, data=payload) - assert put_response.status_code == 200 + assert ( + put_response.status_code == 200 + ), f"Response content start: {put_response.content} \ + :Response content end. \ + Response headers start: {put_response.headers} \ + :Response headers end." # Download using a signed URL and verify. signed_download_url = blob.generate_signed_url( @@ -379,7 +420,12 @@ def _create_signed_resumable_upload_url_helper( ) get_response = requests.get(signed_download_url) - assert get_response.status_code == 200 + assert ( + get_response.status_code == 200 + ), f"Response content start: {get_response.content} \ + :Response content end. \ + Response headers start: {get_response.headers} \ + :Response headers end." assert get_response.content == payload # Finally, delete the blob using a signed URL. @@ -391,10 +437,17 @@ def _create_signed_resumable_upload_url_helper( ) delete_response = requests.delete(signed_delete_url) - assert delete_response.status_code == 204 + assert ( + delete_response.status_code == 204 + ), f"Response content start: {delete_response.content} \ + :Response content end. \ + Response headers start: {delete_response.headers} \ + :Response headers end." -def test_create_signed_resumable_upload_url_v2(storage_client, signing_bucket, no_mtls): +def test_create_signed_resumable_upload_url_v2( + storage_client, signing_bucket, no_mtls +): _create_signed_resumable_upload_url_helper( storage_client, signing_bucket, @@ -402,7 +455,9 @@ def test_create_signed_resumable_upload_url_v2(storage_client, signing_bucket, n ) -def test_create_signed_resumable_upload_url_v4(storage_client, signing_bucket, no_mtls): +def test_create_signed_resumable_upload_url_v4( + storage_client, signing_bucket, no_mtls +): _create_signed_resumable_upload_url_helper( storage_client, signing_bucket, @@ -439,10 +494,17 @@ def test_generate_signed_post_policy_v4( ) with open(blob_name, "r") as f: files = {"file": (blob_name, f)} - response = requests.post(policy["url"], data=policy["fields"], files=files) + response = requests.post( + policy["url"], data=policy["fields"], files=files + ) os.remove(blob_name) - assert response.status_code == 204 + assert ( + response.status_code == 204 + ), f"Response content start: {response.content} \ + :Response content end. \ + Response headers start: {response.headers} \ + :Response headers end." blob = bucket.get_blob(blob_name) assert blob.download_as_bytes() == payload @@ -487,10 +549,17 @@ def test_generate_signed_post_policy_v4_access_token_sa_email( ) with open(blob_name, "r") as f: files = {"file": (blob_name, f)} - response = requests.post(policy["url"], data=policy["fields"], files=files) + response = requests.post( + policy["url"], data=policy["fields"], files=files + ) os.remove(blob_name) - assert response.status_code == 204 + assert ( + response.status_code == 204 + ), f"Response content start: {response.content} \ + :Response content end. \ + Response headers start: {response.headers} \ + :Response headers end." blob = signing_bucket.get_blob(blob_name) blobs_to_delete.append(blob) @@ -522,9 +591,16 @@ def test_generate_signed_post_policy_v4_invalid_field( ) with open(blob_name, "r") as f: files = {"file": (blob_name, f)} - response = requests.post(policy["url"], data=policy["fields"], files=files) + response = requests.post( + policy["url"], data=policy["fields"], files=files + ) os.remove(blob_name) - assert response.status_code == 400 + assert ( + response.status_code == 400 + ), f"Response content start: {response.content} \ + :Response content end. \ + Response headers start: {response.headers} \ + :Response headers end." assert list(bucket.list_blobs()) == [] From a29073cf58df9c5667305e05c6378284057cda23 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 5 Aug 2025 07:06:06 +0530 Subject: [PATCH 363/509] feat: add support for bucket IP filter (#1516) * feat: add support for bucket IP filter * minor fix * fix unit tests * change create bucket with filter system test * add more system tests * update system tests * resolving comments --- google/cloud/storage/bucket.py | 55 ++++++++++++ google/cloud/storage/ip_filter.py | 143 ++++++++++++++++++++++++++++++ tests/system/test_bucket.py | 68 ++++++++++++++ tests/unit/test_bucket.py | 48 ++++++++++ tests/unit/test_ip_filter.py | 106 ++++++++++++++++++++++ 5 files changed, 420 insertions(+) create mode 100644 google/cloud/storage/ip_filter.py create mode 100644 tests/unit/test_ip_filter.py diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index c8df6c600..9d8c5e431 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -56,6 +56,7 @@ from google.cloud.storage.constants import REGIONAL_LEGACY_STORAGE_CLASS from google.cloud.storage.constants import REGION_LOCATION_TYPE from google.cloud.storage.constants import STANDARD_STORAGE_CLASS +from google.cloud.storage.ip_filter import IPFilter from google.cloud.storage.notification import BucketNotification from google.cloud.storage.notification import NONE_PAYLOAD_FORMAT from google.cloud.storage.retry import DEFAULT_RETRY @@ -88,6 +89,7 @@ _FROM_STRING_MESSAGE = ( "Bucket.from_string() is deprecated. " "Use Bucket.from_uri() instead." ) +_IP_FILTER_PROPERTY = "ipFilter" def _blobs_page_start(iterator, page, response): @@ -3887,6 +3889,59 @@ def generate_signed_url( query_parameters=query_parameters, ) + @property + def ip_filter(self): + """Retrieve or set the IP Filter configuration for this bucket. + + See https://cloud.google.com/storage/docs/ip-filtering-overview and + https://cloud.google.com/storage/docs/json_api/v1/buckets#ipFilter + + .. note:: + The getter for this property returns an + :class:`~google.cloud.storage.ip_filter.IPFilter` object, which is a + structured representation of the bucket's IP filter configuration. + Modifying the returned object has no effect. To update the bucket's + IP filter, create and assign a new ``IPFilter`` object to this + property and then call + :meth:`~google.cloud.storage.bucket.Bucket.patch`. + + .. code-block:: python + + from google.cloud.storage.ip_filter import ( + IPFilter, + PublicNetworkSource, + ) + + ip_filter = IPFilter() + ip_filter.mode = "Enabled" + ip_filter.public_network_source = PublicNetworkSource( + allowed_ip_cidr_ranges=["203.0.113.5/32"] + ) + bucket.ip_filter = ip_filter + bucket.patch() + + :setter: Set the IP Filter configuration for this bucket. + :getter: Gets the IP Filter configuration for this bucket. + + :rtype: :class:`~google.cloud.storage.ip_filter.IPFilter` or ``NoneType`` + :returns: + An ``IPFilter`` object representing the configuration, or ``None`` + if no filter is configured. + """ + resource = self._properties.get(_IP_FILTER_PROPERTY) + if resource: + return IPFilter._from_api_resource(resource) + return None + + @ip_filter.setter + def ip_filter(self, value): + if value is None: + self._patch_property(_IP_FILTER_PROPERTY, None) + elif isinstance(value, IPFilter): + self._patch_property(_IP_FILTER_PROPERTY, value._to_api_resource()) + else: + self._patch_property(_IP_FILTER_PROPERTY, value) + class SoftDeletePolicy(dict): """Map a bucket's soft delete policy. diff --git a/google/cloud/storage/ip_filter.py b/google/cloud/storage/ip_filter.py new file mode 100644 index 000000000..e5b2318bf --- /dev/null +++ b/google/cloud/storage/ip_filter.py @@ -0,0 +1,143 @@ +# Copyright 2014 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""IP Filter configuration for Google Cloud Storage Buckets.""" + +from typing import Dict, Any, Optional, List + +_MODE = "mode" +_PUBLIC_NETWORK_SOURCE = "publicNetworkSource" +_VPC_NETWORK_SOURCES = "vpcNetworkSources" +_ALLOWED_IP_CIDR_RANGES = "allowedIpCidrRanges" +_NETWORK = "network" +_ALLOW_ALL_SERVICE_AGENT_ACCESS = "allowAllServiceAgentAccess" +_ALLOW_CROSS_ORG_VPCS = "allowCrossOrgVpcs" + + +class PublicNetworkSource: + """Represents a public network source for a GCS Bucket IP Filter. + + :type allowed_ip_cidr_ranges: list(str) or None + :param allowed_ip_cidr_ranges: A list of public IPv4 or IPv6 ranges in + CIDR notation that are allowed to access + the bucket. + """ + + def __init__(self, allowed_ip_cidr_ranges: Optional[List[str]] = None): + self.allowed_ip_cidr_ranges = allowed_ip_cidr_ranges or [] + + def _to_api_resource(self) -> Dict[str, Any]: + """Serializes this object to a dictionary for API requests.""" + return {_ALLOWED_IP_CIDR_RANGES: self.allowed_ip_cidr_ranges} + + +class VpcNetworkSource: + """Represents a VPC network source for a GCS Bucket IP Filter. + + :type network: str + :param network: The resource name of the VPC network. + + :type allowed_ip_cidr_ranges: list(str) or None + :param allowed_ip_cidr_ranges: A list of IPv4 or IPv6 ranges in CIDR + notation allowed to access the bucket + from this VPC. + """ + + def __init__( + self, network: str, allowed_ip_cidr_ranges: Optional[List[str]] = None + ): + self.network = network + self.allowed_ip_cidr_ranges = allowed_ip_cidr_ranges or [] + + def _to_api_resource(self) -> Dict[str, Any]: + """Serializes this object to a dictionary for API requests.""" + return { + _NETWORK: self.network, + _ALLOWED_IP_CIDR_RANGES: self.allowed_ip_cidr_ranges, + } + + +class IPFilter: + """Represents a GCS Bucket IP Filter configuration. + + This class is a helper for constructing the IP Filter dictionary to be + assigned to a bucket's ``ip_filter`` property. + """ + + """ + Attributes: + mode (str): Required. The mode of the IP filter. Can be "Enabled" or "Disabled". + allow_all_service_agent_access (bool): Required. If True, allows Google + Cloud service agents to bypass the IP filter. + public_network_source (PublicNetworkSource): (Optional) The configuration + for requests from the public internet. + vpc_network_sources (list(VpcNetworkSource)): (Optional) A list of + configurations for requests from VPC networks. + allow_cross_org_vpcs (bool): (Optional) If True, allows VPCs from + other organizations to be used in the configuration. + """ + + def __init__(self): + self.mode: Optional[str] = None + self.public_network_source: Optional[PublicNetworkSource] = None + self.vpc_network_sources: List[VpcNetworkSource] = [] + self.allow_all_service_agent_access: Optional[bool] = None + self.allow_cross_org_vpcs: Optional[bool] = None + + @classmethod + def _from_api_resource(cls, resource: Dict[str, Any]) -> "IPFilter": + """Factory: creates an IPFilter instance from a server response.""" + ip_filter = cls() + ip_filter.mode = resource.get(_MODE) + ip_filter.allow_all_service_agent_access = resource.get( + _ALLOW_ALL_SERVICE_AGENT_ACCESS, None + ) + + public_network_source_data = resource.get(_PUBLIC_NETWORK_SOURCE, None) + if public_network_source_data: + ip_filter.public_network_source = PublicNetworkSource( + allowed_ip_cidr_ranges=public_network_source_data.get( + _ALLOWED_IP_CIDR_RANGES, [] + ) + ) + + vns_res_list = resource.get(_VPC_NETWORK_SOURCES, []) + ip_filter.vpc_network_sources = [ + VpcNetworkSource( + network=vns.get(_NETWORK), + allowed_ip_cidr_ranges=vns.get(_ALLOWED_IP_CIDR_RANGES, []), + ) + for vns in vns_res_list + ] + ip_filter.allow_cross_org_vpcs = resource.get(_ALLOW_CROSS_ORG_VPCS, None) + return ip_filter + + def _to_api_resource(self) -> Dict[str, Any]: + """Serializes this object to a dictionary for API requests.""" + resource = { + _MODE: self.mode, + _ALLOW_ALL_SERVICE_AGENT_ACCESS: self.allow_all_service_agent_access, + } + + if self.public_network_source: + resource[ + _PUBLIC_NETWORK_SOURCE + ] = self.public_network_source._to_api_resource() + if self.vpc_network_sources is not None: + resource[_VPC_NETWORK_SOURCES] = [ + vns._to_api_resource() for vns in self.vpc_network_sources + ] + if self.allow_cross_org_vpcs is not None: + resource[_ALLOW_CROSS_ORG_VPCS] = self.allow_cross_org_vpcs + return resource diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index f06de8e8c..3b05e8483 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -17,6 +17,11 @@ from google.api_core import exceptions from . import _helpers +from google.cloud.storage.ip_filter import ( + IPFilter, + PublicNetworkSource, + VpcNetworkSource, +) def test_bucket_create_w_alt_storage_class(storage_client, buckets_to_delete): @@ -1299,3 +1304,66 @@ def test_new_bucket_with_hierarchical_namespace( bucket = storage_client.create_bucket(bucket_obj) buckets_to_delete.append(bucket) assert bucket.hierarchical_namespace_enabled is True + + +def test_bucket_ip_filter_patch(storage_client, buckets_to_delete): + """Test setting and clearing IP filter configuration without enabling enforcement.""" + bucket_name = _helpers.unique_name("ip-filter-control") + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) + buckets_to_delete.append(bucket) + + ip_filter = IPFilter() + ip_filter.mode = "Disabled" + ip_filter.allow_all_service_agent_access = True + ip_filter.public_network_source = PublicNetworkSource( + allowed_ip_cidr_ranges=["203.0.113.10/32"] + ) + ip_filter.vpc_network_sources.append( + VpcNetworkSource( + network=f"projects/{storage_client.project}/global/networks/default", + allowed_ip_cidr_ranges=["10.0.0.0/8"], + ) + ) + bucket.ip_filter = ip_filter + bucket.patch() + + # Reload and verify the full configuration was set correctly. + bucket.reload() + reloaded_filter = bucket.ip_filter + assert reloaded_filter is not None + assert reloaded_filter.mode == "Disabled" + assert reloaded_filter.allow_all_service_agent_access is True + assert reloaded_filter.public_network_source.allowed_ip_cidr_ranges == [ + "203.0.113.10/32" + ] + assert len(reloaded_filter.vpc_network_sources) == 1 + +def test_list_buckets_with_ip_filter(storage_client, buckets_to_delete): + """Test that listing buckets returns a summarized IP filter.""" + bucket_name = _helpers.unique_name("ip-filter-list") + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) + buckets_to_delete.append(bucket) + + ip_filter = IPFilter() + ip_filter.mode = "Disabled" + ip_filter.allow_all_service_agent_access = True + ip_filter.public_network_source = PublicNetworkSource( + allowed_ip_cidr_ranges=["203.0.113.10/32"] + ) + bucket.ip_filter = ip_filter + bucket.patch() + + buckets_list = list(storage_client.list_buckets(prefix=bucket_name)) + found_bucket = next((b for b in buckets_list if b.name == bucket_name), None) + + assert found_bucket is not None + summarized_filter = found_bucket.ip_filter + + assert summarized_filter is not None + assert summarized_filter.mode == "Disabled" + assert summarized_filter.allow_all_service_agent_access is True + + # Check that the summarized filter does not include full details. + assert summarized_filter.public_network_source is None + assert summarized_filter.vpc_network_sources == [] + diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index e494cc18a..809b572e0 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -4612,6 +4612,54 @@ def test_generate_signed_url_v4_w_incompatible_params(self): virtual_hosted_style=True, bucket_bound_hostname="cdn.example.com" ) + def test_ip_filter_getter_unset(self): + """Test that ip_filter is None when not set.""" + bucket = self._make_one() + self.assertIsNone(bucket.ip_filter) + + def test_ip_filter_getter_w_value(self): + """Test getting an existing ip_filter configuration.""" + from google.cloud.storage.ip_filter import IPFilter + + ipf_property = {"mode": "Enabled"} + properties = {"ipFilter": ipf_property} + bucket = self._make_one(properties=properties) + + ip_filter = bucket.ip_filter + self.assertIsInstance(ip_filter, IPFilter) + self.assertEqual(ip_filter.mode, "Enabled") + + def test_ip_filter_setter(self): + """Test setting the ip_filter with a helper class.""" + from google.cloud.storage.ip_filter import IPFilter + from google.cloud.storage.bucket import _IP_FILTER_PROPERTY + + bucket = self._make_one() + ip_filter = IPFilter() + ip_filter.mode = "Enabled" + + bucket.ip_filter = ip_filter + + self.assertIn(_IP_FILTER_PROPERTY, bucket._changes) + self.assertEqual( + bucket._properties[_IP_FILTER_PROPERTY], + { + "mode": "Enabled", + "vpcNetworkSources": [], + "allowAllServiceAgentAccess": None, + }, + ) + + def test_ip_filter_setter_w_none(self): + """Test clearing the ip_filter by setting it to None.""" + from google.cloud.storage.bucket import _IP_FILTER_PROPERTY + + bucket = self._make_one(properties={"ipFilter": {"mode": "Enabled"}}) + bucket.ip_filter = None + + self.assertIn(_IP_FILTER_PROPERTY, bucket._changes) + self.assertIsNone(bucket._properties.get(_IP_FILTER_PROPERTY)) + class Test__item_to_notification(unittest.TestCase): def _call_fut(self, iterator, item): diff --git a/tests/unit/test_ip_filter.py b/tests/unit/test_ip_filter.py new file mode 100644 index 000000000..369462f2f --- /dev/null +++ b/tests/unit/test_ip_filter.py @@ -0,0 +1,106 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + + +class TestIPFilterHelpers(unittest.TestCase): + @staticmethod + def _get_public_network_source_class(): + from google.cloud.storage.ip_filter import PublicNetworkSource + + return PublicNetworkSource + + @staticmethod + def _get_vpc_network_source_class(): + from google.cloud.storage.ip_filter import VpcNetworkSource + + return VpcNetworkSource + + @staticmethod + def _get_ip_filter_class(): + from google.cloud.storage.ip_filter import IPFilter + + return IPFilter + + def test_public_network_source_serialization(self): + pns_class = self._get_public_network_source_class() + pns = pns_class(allowed_ip_cidr_ranges=["1.2.3.4/32"]) + resource = pns._to_api_resource() + self.assertEqual(resource, {"allowedIpCidrRanges": ["1.2.3.4/32"]}) + + def test_vpc_network_source_serialization(self): + vns_class = self._get_vpc_network_source_class() + vns = vns_class( + network="projects/p/global/networks/n", + allowed_ip_cidr_ranges=["10.0.0.0/8"], + ) + resource = vns._to_api_resource() + self.assertEqual( + resource, + { + "network": "projects/p/global/networks/n", + "allowedIpCidrRanges": ["10.0.0.0/8"], + }, + ) + + def test_ip_filter_full_serialization(self): + ip_filter_class = self._get_ip_filter_class() + pns_class = self._get_public_network_source_class() + vns_class = self._get_vpc_network_source_class() + + ip_filter = ip_filter_class() + ip_filter.mode = "Enabled" + ip_filter.public_network_source = pns_class( + allowed_ip_cidr_ranges=["1.2.3.4/32"] + ) + ip_filter.vpc_network_sources.append( + vns_class( + network="projects/p/global/networks/n", + allowed_ip_cidr_ranges=["10.0.0.0/8"], + ) + ) + ip_filter.allow_all_service_agent_access = True + + resource = ip_filter._to_api_resource() + expected = { + "mode": "Enabled", + "publicNetworkSource": {"allowedIpCidrRanges": ["1.2.3.4/32"]}, + "vpcNetworkSources": [ + { + "network": "projects/p/global/networks/n", + "allowedIpCidrRanges": ["10.0.0.0/8"], + } + ], + "allowAllServiceAgentAccess": True, + } + self.assertEqual(resource, expected) + + def test_ip_filter_deserialization(self): + ip_filter_class = self._get_ip_filter_class() + resource = { + "mode": "Enabled", + "publicNetworkSource": {"allowedIpCidrRanges": ["1.2.3.4/32"]}, + "allowAllServiceAgentAccess": False, + } + + ip_filter = ip_filter_class._from_api_resource(resource) + + self.assertEqual(ip_filter.mode, "Enabled") + self.assertIsNotNone(ip_filter.public_network_source) + self.assertEqual( + ip_filter.public_network_source.allowed_ip_cidr_ranges, ["1.2.3.4/32"] + ) + self.assertEqual(ip_filter.vpc_network_sources, []) + self.assertIs(ip_filter.allow_all_service_agent_access, False) From e84906c2252e98c2906d5d0e0da2249deb0c134a Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 14:28:57 +0530 Subject: [PATCH 364/509] chore(main): release 3.3.0 (#1508) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 17 +++++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b077ea5..92342065c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.3.0](https://github.com/googleapis/python-storage/compare/v3.2.0...v3.3.0) (2025-08-05) + + +### Features + +* Add support for bucket IP filter ([#1516](https://github.com/googleapis/python-storage/issues/1516)) ([a29073c](https://github.com/googleapis/python-storage/commit/a29073cf58df9c5667305e05c6378284057cda23)) + + +### Bug Fixes + +* Add logs on AssertionError for issue [#1512](https://github.com/googleapis/python-storage/issues/1512) ([#1518](https://github.com/googleapis/python-storage/issues/1518)) ([6a9923e](https://github.com/googleapis/python-storage/commit/6a9923e4fc944f7a7c3906eb7800d23677bd2481)) + + +### Documentation + +* Update the documentation of move_blob function ([#1507](https://github.com/googleapis/python-storage/issues/1507)) ([72252e9](https://github.com/googleapis/python-storage/commit/72252e940909ce2e3da9cfd80f5b7b43a026f45c)) + ## [3.2.0](https://github.com/googleapis/python-storage/compare/v3.1.1...v3.2.0) (2025-07-04) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index c24ca23d6..2279c3674 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.2.0" +__version__ = "3.3.0" From 7ce4e0b5ba596d16f16490e75bbaa0a3ece4cf78 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 21 Aug 2025 15:23:03 +0530 Subject: [PATCH 365/509] chore: fix system tests due to Public access prevention (#1526) * fix: test_blob_acl_w_metageneration_match * fix: test_blob_acl_upload_predefined * remove unwanted comments and code * remove unwanted code --- tests/system/test_blob.py | 46 +++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 8b50322ba..a421fb2e4 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -425,26 +425,23 @@ def test_blob_acl_w_metageneration_match( # Exercise blob ACL with metageneration/generation match acl = blob.acl - blob.reload() + acl.domain("google.com").grant_read() with pytest.raises(exceptions.PreconditionFailed): - acl.save_predefined( - "publicRead", if_metageneration_match=wrong_metageneration_number - ) - assert "READER" not in acl.all().get_roles() + acl.save(if_metageneration_match=wrong_metageneration_number) + assert "READER" not in acl.domain("google.com").get_roles() - acl.save_predefined("publicRead", if_metageneration_match=blob.metageneration) - assert "READER" in acl.all().get_roles() + acl.save(if_metageneration_match=blob.metageneration) - blob.reload() - del acl.entities["allUsers"] + assert "READER" in acl.domain("google.com").get_roles() + acl.domain("google.com").revoke_read() with pytest.raises(exceptions.PreconditionFailed): acl.save(if_generation_match=wrong_generation_number) - assert acl.has_entity("allUsers") + assert "READER" in acl.domain("google.com").get_roles() acl.save(if_generation_match=blob.generation) - assert not acl.has_entity("allUsers") + assert "READER" not in acl.domain("google.com").get_roles() def test_blob_acl_upload_predefined( @@ -453,31 +450,32 @@ def test_blob_acl_upload_predefined( file_data, service_account, ): - control = shared_bucket.blob(f"logo{uuid.uuid4().hex}") - control_info = file_data["logo"] + control_blob = shared_bucket.blob(f"logo{uuid.uuid4().hex}") + control_blob_info = file_data["logo"] blob = shared_bucket.blob(f"SmallFile{uuid.uuid4().hex}") info = file_data["simple"] try: - control.upload_from_filename(control_info["path"]) + control_blob.upload_from_filename(control_blob_info["path"]) finally: - blobs_to_delete.append(control) - + blobs_to_delete.append(control_blob) try: - blob.upload_from_filename(info["path"], predefined_acl="publicRead") + blob.upload_from_filename(info["path"], predefined_acl="private") finally: blobs_to_delete.append(blob) - control_acl = control.acl - assert "READER" not in control_acl.all().get_roles() + control_blob_acl = control_blob.acl acl = blob.acl - assert "READER" in acl.all().get_roles() - - acl.all().revoke_read() - assert acl.all().get_roles() == set() - assert control_acl.all().get_roles() == acl.all().get_roles() + count = 0 + for entry in acl: + count += 1 + entity = entry["entity"] + assert count == 1 + assert entity.lstrip("user-") == service_account.service_account_email + + assert sum(1 for _ in control_blob_acl) > 1 def test_blob_patch_metadata( From a8109e0d02c62542f1bea20373b53864fb776caa Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 22 Aug 2025 14:12:37 +0530 Subject: [PATCH 366/509] fix: send entire object checksum at "initiate a resumable upload session" (#1525) * [Initiate a resumable upload session](https://cloud.google.com/storage/docs/performing-resumable-uploads#initiate-session) provides a way to specify entire object checksum as metadata. * This will be used by the server before finalization, if there's a mismatch between the checksum provided by client (ie this app) and the one calculated by server. The server will return `400: BadRequest` --- google/cloud/storage/_media/_upload.py | 21 +++++++-- google/cloud/storage/blob.py | 60 ++++++++++++++++++++----- google/cloud/storage/bucket.py | 26 +++++++++-- tests/data/random_9_MiB_file | Bin 0 -> 9437184 bytes tests/system/conftest.py | 1 + tests/system/test_blob.py | 34 ++++++++++++++ tests/unit/test_blob.py | 26 ++++++++++- 7 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 tests/data/random_9_MiB_file diff --git a/google/cloud/storage/_media/_upload.py b/google/cloud/storage/_media/_upload.py index 8d89ee5b2..e656d3e5c 100644 --- a/google/cloud/storage/_media/_upload.py +++ b/google/cloud/storage/_media/_upload.py @@ -411,7 +411,12 @@ class ResumableUpload(UploadBase): """ def __init__( - self, upload_url, chunk_size, checksum="auto", headers=None, retry=DEFAULT_RETRY + self, + upload_url, + chunk_size, + checksum="auto", + headers=None, + retry=DEFAULT_RETRY, ): super(ResumableUpload, self).__init__(upload_url, headers=headers, retry=retry) if chunk_size % UPLOAD_CHUNK_SIZE != 0: @@ -472,7 +477,12 @@ def total_bytes(self): return self._total_bytes def _prepare_initiate_request( - self, stream, metadata, content_type, total_bytes=None, stream_final=True + self, + stream, + metadata, + content_type, + total_bytes=None, + stream_final=True, ): """Prepare the contents of HTTP request to initiate upload. @@ -955,7 +965,12 @@ class XMLMPUContainer(UploadBase): """ def __init__( - self, upload_url, filename, headers=None, upload_id=None, retry=DEFAULT_RETRY + self, + upload_url, + filename, + headers=None, + upload_id=None, + retry=DEFAULT_RETRY, ): super().__init__(upload_url, headers=headers, retry=retry) self._filename = filename diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 0eb94fd47..b7d5d698a 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -14,8 +14,7 @@ # pylint: disable=too-many-lines -"""Create / interact with Google Cloud Storage blobs. -""" +"""Create / interact with Google Cloud Storage blobs.""" import base64 import copy @@ -142,8 +141,8 @@ r"(?Pgs)://(?P[a-z0-9_.-]+)/(?P.+)" ) -_DEFAULT_CHUNKSIZE = 104857600 # 1024 * 1024 B * 100 = 100 MB -_MAX_MULTIPART_SIZE = 8388608 # 8 MB +_DEFAULT_CHUNKSIZE = 104857600 # 1024 * 1024 B * 100 = 100 MiB +_MAX_MULTIPART_SIZE = 8388608 # 8 MiB _logger = logging.getLogger(__name__) @@ -181,6 +180,14 @@ class Blob(_PropertyMixin): :type generation: long :param generation: (Optional) If present, selects a specific revision of this object. + + :type crc32c_checksum: str + :param crc32c_checksum: + (Optional) If set, the CRC32C checksum of the blob's content. + CRC32c checksum, as described in RFC 4960, Appendix B; encoded using + base64 in big-endian byte order. See + Apenndix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 """ _chunk_size = None # Default value for each instance. @@ -214,6 +221,7 @@ def __init__( encryption_key=None, kms_key_name=None, generation=None, + crc32c_checksum=None, ): """ property :attr:`name` @@ -237,6 +245,9 @@ def __init__( if generation is not None: self._properties["generation"] = generation + if crc32c_checksum is not None: + self._properties["crc32c"] = crc32c_checksum + @property def bucket(self): """Bucket which contains the object. @@ -1643,7 +1654,9 @@ def download_as_string( :raises: :class:`google.cloud.exceptions.NotFound` """ warnings.warn( - _DOWNLOAD_AS_STRING_DEPRECATED, PendingDeprecationWarning, stacklevel=2 + _DOWNLOAD_AS_STRING_DEPRECATED, + PendingDeprecationWarning, + stacklevel=2, ) with create_trace_span(name="Storage.Blob.downloadAsString"): return self.download_as_bytes( @@ -1999,12 +2012,18 @@ def _do_multipart_upload( transport = self._get_transport(client) if "metadata" in self._properties and "metadata" not in self._changes: self._changes.add("metadata") + info = self._get_upload_arguments(client, content_type, command=command) headers, object_metadata, content_type = info + if "crc32c" in self._properties: + object_metadata["crc32c"] = self._properties["crc32c"] + hostname = _get_host_name(client._connection) base_url = _MULTIPART_URL_TEMPLATE.format( - hostname=hostname, bucket_path=self.bucket.path, api_version=_API_VERSION + hostname=hostname, + bucket_path=self.bucket.path, + api_version=_API_VERSION, ) name_value_pairs = [] @@ -2195,9 +2214,14 @@ def _initiate_resumable_upload( if extra_headers is not None: headers.update(extra_headers) + if "crc32c" in self._properties: + object_metadata["crc32c"] = self._properties["crc32c"] + hostname = _get_host_name(client._connection) base_url = _RESUMABLE_URL_TEMPLATE.format( - hostname=hostname, bucket_path=self.bucket.path, api_version=_API_VERSION + hostname=hostname, + bucket_path=self.bucket.path, + api_version=_API_VERSION, ) name_value_pairs = [] @@ -2234,7 +2258,11 @@ def _initiate_resumable_upload( upload_url = _add_query_parameters(base_url, name_value_pairs) upload = ResumableUpload( - upload_url, chunk_size, headers=headers, checksum=checksum, retry=retry + upload_url, + chunk_size, + headers=headers, + checksum=checksum, + retry=retry, ) upload.initiate( @@ -3426,7 +3454,11 @@ def set_iam_policy( return Policy.from_api_repr(info) def test_iam_permissions( - self, permissions, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY + self, + permissions, + client=None, + timeout=_DEFAULT_TIMEOUT, + retry=DEFAULT_RETRY, ): """API call: test permissions @@ -3693,7 +3725,10 @@ def compose( source_objects = [] for source, source_generation in zip(sources, if_source_generation_match): - source_object = {"name": source.name, "generation": source.generation} + source_object = { + "name": source.name, + "generation": source.generation, + } preconditions = {} if source_generation is not None: @@ -4154,7 +4189,10 @@ def open( "encoding, errors and newline arguments are for text mode only" ) return BlobWriter( - self, chunk_size=chunk_size, ignore_flush=ignore_flush, **kwargs + self, + chunk_size=chunk_size, + ignore_flush=ignore_flush, + **kwargs, ) elif mode in ("r", "rt"): if ignore_flush: diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 9d8c5e431..a9277e09d 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -386,7 +386,10 @@ class LifecycleRuleSetStorageClass(dict): def __init__(self, storage_class, **kw): conditions = LifecycleRuleConditions(**kw) rule = { - "action": {"type": "SetStorageClass", "storageClass": storage_class}, + "action": { + "type": "SetStorageClass", + "storageClass": storage_class, + }, "condition": dict(conditions), } super().__init__(rule) @@ -846,6 +849,7 @@ def blob( encryption_key=None, kms_key_name=None, generation=None, + crc32c_checksum=None, ): """Factory constructor for blob object. @@ -873,6 +877,14 @@ def blob( :param generation: (Optional) If present, selects a specific revision of this object. + :type crc32c_checksum: str + :param crc32c_checksum: + (Optional) If set, the CRC32C checksum of the blob's content. + CRC32c checksum, as described in RFC 4960, Appendix B; encoded using + base64 in big-endian byte order. See + Apenndix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 + :rtype: :class:`google.cloud.storage.blob.Blob` :returns: The blob object created. """ @@ -883,6 +895,7 @@ def blob( encryption_key=encryption_key, kms_key_name=kms_key_name, generation=generation, + crc32c_checksum=crc32c_checksum, ) def notification( @@ -3253,7 +3266,10 @@ def configure_website(self, main_page_suffix=None, not_found_page=None): :type not_found_page: str :param not_found_page: The file to use when a page isn't found. """ - data = {"mainPageSuffix": main_page_suffix, "notFoundPage": not_found_page} + data = { + "mainPageSuffix": main_page_suffix, + "notFoundPage": not_found_page, + } self._patch_property("website", data) def disable_website(self): @@ -3385,7 +3401,11 @@ def set_iam_policy( return Policy.from_api_repr(info) def test_iam_permissions( - self, permissions, client=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY + self, + permissions, + client=None, + timeout=_DEFAULT_TIMEOUT, + retry=DEFAULT_RETRY, ): """API call: test permissions diff --git a/tests/data/random_9_MiB_file b/tests/data/random_9_MiB_file new file mode 100644 index 0000000000000000000000000000000000000000..8733cf599ee8651badbac6d5d17e348e5b946d24 GIT binary patch literal 9437184 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

agTU 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 `?#Bu6;ga-za@ozPWd7r(ub#cwzw4r@7w7jHg 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

f5g&5mz7tVh@_M9 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

y3uYS;7IeIyoN`+$>f= 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�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ϦmsV?06D%&7~ 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

*fiYdNhdN+j(!`hd4~AB| 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

t+Wg@13h(;_yt>s-JTp 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

l*1ZF?^at3BYJRxUL(|vq~1v?Z6 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�sz0T>@tn_LLTz~5 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 z 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͝OTbYbHD6r0V!PiIeZd0Qf3=`QuM=HV9zM>6@| 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�T0 znbX`PEM5l87!yyxMcvqBsK%TpQ_C@!q0&P`4|%i8g3S~L)4tNDe>sOGrthp(LqQ<4 zAhmLzHnMLd`b1=jWb^K)>*Vw`8iF5da@-TDk?3313;Xx7cP(K2QNQi1$7^7CQD`PASL~6k>-AZ;W!4<;{MJx;eC7f2LF{ z3LM|yn3W57-9WHYxY;u(>>}k9DcVS@7jng7FR4$Il2AruOo8uEDM}2~v_F2Aoawrz zni*a9!$SzmZuafXzq>jxM?qtC$cD)nini05S=NndLS8Tm*yvSM@A-xFsq9p9M8~9! z?5ezV6OtrlzQ1_!)}mkcXtRNC6A+B8tE6LUq{_=dNBY5YmjPExSsM7pmG!k0Ff1gd zZGcYpbX9xMr4m#dn~6IU{Ey!TD6qvUr34^_>CEtEFd8 zXb@vK8e`ognA~=9Fa_ClqBM1y%oDkARL6ALxdqP>ot9^L!tY$==Hjk_sK-odwao&R zY-yi!)Zp#&3q;rZV_&>k(!RYF>S#G_HM5^e_JJ96*vVgg5@$vRY3b7tz z-Q1p{!UGk)bcL76+^;RUj*0)qHeSH2SN~8IkZ<6+WC0qGs4Ce&U)&JJ5Zw`l4ifX1D)e9|8xNRBcX8{1%ZD#Xaaz`r`vLCb^p6#ofD^)B$^DU`S% zlDV8`S6$6r6_O67na8Y)zCF-|O1KQooJ?8K1~Jz`{!Rh%#8*1_Y3{sNm1c7P#2mXg zvT6!9KMnu&ek#qss6?Yns3TXY&Ywbb_E=r`in6*7=Hu?og$)#`wwfbQj2z+YdfGV% zey~(e(7V%2w3f{1AGS$rig~lR3en@N7u&5?J}&bO8LnK6CUD3fE=B?nu!&yt>yV-_ zZ=8m>1D5`tYQo~ZxuaQzSr36Ro;5j7o7Cr9E|UvVKzyh^ff}aYf-6lnxF<|*Ni?W{ zYRe}q#>oGut{=MTcsF3T7KwB|Wp2JnNY{>f?@o=UMExxCKO?=6AI`D+&dP4}r;K=d z{s3;K%Yr-gyn4 z^LC{IJ{p^t5c#oQB&(VWdW~2nk01kFO}K=owJ}?l)@V~38sLb+!!$-}E{w5W=&)+W zoU|mKrTjRBqOf1}tO~U$ODdZ5-l$X5+8CIt5&uO+A_~ZzF6;?bDSbsiesJ!>9+Y(` z?s?O9?IffgtH5IajFYS;{op;J^}+E=ex~zPxV)NlBE~J(p<-AkqP=5Mej4QkQjnp;)AtI($od;5 zNQV}2Wj1|DeLJx9k7+8q04WvxYHE%}##7_NO5@dGyq}0|wM2)lX@I~va`)ooG}XKB zg_0dAVM>?oy0tNy-QjBEJSr7iAr&vq{oWBM0B$n^m}uB*Rg#z`%nfEMiz>IjYP`DU zp6)_|CQ)dyTKCJzHjYOC706F9<=P87nAb_V@?1GB27a5J**}cY!uS0k;FIMCnAr0A z4Xn50c2uzcJvMCFM-%VG-49uj{hnUwD2a^=?`5UrbM@XL)l?XN-bS)>skN!V!+9fm zvS-~q_!@t7=7Bda?$Xj`W2+FGN0X;b;8{XYw-)MFSM(6LF#&x0dTCN>tVv4jzHX1s zBg9&})~yd8v^3`y5hU%GWeJ?C@%PKuj${Ay8%3l-=ig51R>5y`(VTK9 z-yIBm7hNOqjpq4Tc`<*sK9UUF*C_vvHPn+T8qUymTihrIJ?wwCqS9%D v$RyH}O z99?IK1=mmALlik~lV!jEDaV3XhqdnH65b6gaH2*2=x)U!%D>O?mviIaxc!Y)nouXA z*bu?Ip7P`6`bGZPd;}E0W*7DO{SatZL=C}Pm|t%3{P9?;Yn^1elIy zp`M4dBM*hDS8S6vYTIRQP2U?(cGVw4Mf*dL(FLM~;`>q**I=bEMsyvsl9NtG3@=RD;mG zVHTxpRLa?6OlvEE&$`?d+2{mVI#m0B8umk)%0%2rZ+`WR{4xq}ZK%1dET4TG@S<)p z@`36MbD8I(;W98jXw*6|@oNOnSDgy*=(vF1XYa(Ps;FBW+Zna1_Y6ba} zcA1GVjm54c!9x$aiqak~zikbT(3i8yIyMhh!v&&Xooq;O&VvN`pZR)FT4-Al5f{K< zLEfkK%|^W-8jA%s&K-0o7PzIcf7zJbbTuTQp+E*@rMYtLCww}M zcvfghLL2;OKbua5Wr}mzOQZ=`ZL%RI*|dTM`rR@S;C33;$P&7yGwsY~*~Hjj;#ToX zZ)ob@obtqLCA8RpT9ivhq(9c%A9bZP%T4BVpK^f$#IrhWj?3#ylMTyL=@tvy>DC~u zNLU@0OLoS;LqCGpj~xFKAM@ zVpa!pshK_mm%rC1JrI(H|A4FwT1x0GGD(f@AG+&RA>xFlA?ViwyoD=R8WvRHzCG<= z$DFkYLIfhO6>s#s65pR?&aCj;BVOOL_Bs|4M2+Jp*|rs{#~X&&Ks0dRPxF3bt1Yay zdrYeL0mU+q16|UqbZghQ!x21egj$j#)8n$zG-HQpp@BK0qsj?v?8b8`=`4OeMYy-+ zHAc3-AWQarJ&^ppYGgZ8ggt{EZ6(g_8Gl2Y(}6eROx8%nZyrl=>rJVJHPmO(kzr}y zni2%$bRMMToaP~p-Jbf;)3nAwaX2VO#P&>se=)GG|K|$3Ao3AY21Ryzzn{9|F*(ir z@|xvsiX2o-+lp^9Bj-5%hT(VgABhl$;S`tWI7)o_=tTKrd{dt-*Mb+z+^ks4ueKn= zHYG-YjU;I(3Nf~+6&h|S_4N*^$8;UyKf_g?_Rx_cU=SIZq)F2`tD8C^;0pZaK#<;E zEp<_Rd(D>lgERlaj1>yJ$vX|*{ij>xz3cf~(Sns_ATB_vA`Td1c@=6~({)TOBdUeu z@e6U*ckWDpmfx>+xMrzRB9krc(@e!FBG`NKAU;Bv&Vodtih#7(b$2D)dUlopUH;f| zIO&PX_n1Z4{j2-xYu$|Z(?0{{5k>ycmWgDBIxkWh9(=-vAe2D@7U~@;5UKa(z5$7*!kA-<+j14m~s%yV3lA5e_gZ>+Y^E-8sExupR z+@ITU)FM+laH~YVGksGJXu;z3j~5iqkd8LV&WfxhEho1?s9F~~B{^wNU{OcA$FfY) zKpPry82wVX)?6n|9TD#wQ22RKj8&b@ZJqdkM7IMl&zy~asfCzOP2Q`B0!yDdVa+Af zK8b&vE2;|)#FG19h(hYhEOxmMr(7x>B72{0;mZ}i;w!*UQicWX1c4qM9uEyYDk4OG zil><~u3n(?Wc?vZ#-bn(cuD{A1hqcI1amiDhiM~BTb#IVn_9qS`AR9Ea z^j)>T>v>53=q1`_oa7mKLU}Ge5SmSum&0`UcE|o{JBX7G_A}?xTaghSJO)bVgH)MI zSmky_wkZQx?al{vV2aB?cCLa>=E3@C{FFe%o5Oi4qe8%G7~$7vWS0L=#h<=%G6XHB z4_m}HPi?IJVDC>px+v(MEjYU;gqKh1@M{R!N!ob`{Ro(`k4HCDHS?|7dbZ-u$dZe^ zSx2-#SQO=(=h^3|VBGE+rNH<%y>(l5n(dqotfV7yHc3A&hdiU(r3M_v)#=U$(_;7J z0&Gz@>sDFkDwqeGI&x9W&hBdiD|d4e8(J!m9D25tZ7&38O7|7vj{%GI%_e7T+^a01 zcxOj|+5v_L_iZKR()yQUmy%wH9#@J|_!U)9vJ;qnnvTiOS)z^{)EjivIR>p&g|@O| zm|Fk)6iKENr_oOueGeYMs^o()cc)ql}v$5oHX*o^g_zk>4gW9nX}N9^r^;gNevKl<(<#8(P zGb|N@UO2>De@EAvTJ?cI@x#n28HFuEE-}vmlhWY!$9|o9SmIN~$;NFES*Vl?2hDlg zxQO#znE8t2Q>B22W9Rh^BDmbK?e}P2$haRrUH^5E11)B>)2KgB0Bv#)%)X7q1;{`3m|Y}Lo>wJ04_wRY#Ec3 zhxD;(B_@uAg2TgD()R2%9PAVW6PZ%1hWoMbm+rRfasA`1RxRhske5u8=*tb8&oayI zd{vRWJXRK{10Ws@z=M;DnRaCZAv8KXmI!Di5=P^iDo8bmNt^Q@HI*H!n-0ZK_!ae( zvOvdKfDCqOS}uMWzrL7X5AKyyA9U3X@i7+6_=@yBU5CTk@I}Ys;lmMW!BW1LNxSdA zS?*U_&RMkJ%+5!^rBtD9k!U=V*Yc39qD_p6wZEa&oz00^b+F5SUyz^-RXV*|&MT2r zZ(LIc^tlw!M1iR-olQlTAEzkh+^6Q^=(Rvcx{M%nPCnC6jV=t&xYnPWl4d2csr!8W-0{rWfZ%(;-{8!;h z40+r>Tm3IG33{TKADZjEwfaNInY$*w0UtSpjY-^tNDV{O3#yFxF%u^Jqt~c-{Nn^a zCFYo<%=Nr3>*eBKTx^PsbVdF)KKlD;VZW946V=wp?MKO%pJ(v|QeQI+qU<_6W&GPB=$?_~_8QdSY3iq9&E70_RcaIxdutx=f*Z53;m zHZ+j>GksG0)AGUo1f%VGMzRnWI9zzkGbkqBtpkqG+g~svF>Yn?XFap)gOwY=nqp++ZtK1OXszaTU)Y3NSBq zLc1d1-$th;;r+q&kO^>dfJE(gzum|5=*NKTslRwAY8dRs=_yOVa=m3}BqpblI~Gh( zEWGZ~aY7Wj_s)!`~cfN=&s?e2`#SyUU5@o z6&qqx_h7T4m;Wos!!qan#W53{G`QyNQW^_gUe3%h1$9z@DSL&Q#c4^o*;X^E|cBOIqWXytwAfH1KAtaM42l??L zdVJk^)%EaVjhLe{b#H@Z!CAZyqkBYg$h2!zT_E>eN`uDND0O^$*lGRKi@R}Yj<5-Y z#hJBpTd(QkZ2=R4u`iusqFcW^q3`q3co-#GH5#T=N1}XLJCf8E>7#GYN++)FBxbvNI{blLDe(K=P4$R2~nCRr8QTuLk zzaNtKU8OyPx%NwWhenxuM+HQx%BB-I4K#X$GhGX)8F}Z<=wtDxksEzDq0y@Rg7+Xx zS}#srF023v>C{SK#z~+&3{A3Faozk?t8exg#pMX_Jid{`>>T`2!B|r*xtGD18XQeT zSWGEAxdmiwF$wS82T$S?$H23+fh~Sd&zq@4%?8AGN4-iu9C|thLT0=@CLMu6Z}kSW zM7?r`yZ7rzxxf%6pE;M zv>WR;l^tSgmTbB_-b|pH*E(#Ibc#;tc5LjoscsRjVV(_FE$ZANALD(+@vmoz$W}Fr2_%9#5nnQ{bHyB`^?uNMtJwzzoUfe61 zkhLIIn&|dDEYD&C7jKmziVs@Ea2zCwxx`hN7QW$t1YS?{AAMwJMc+dfYV8GjGXk5C zK@6KrV7oNskqUZRe94 zg0r=}a#PHjHH(<)rxl5r2`K1>k$^>_sv`qv@-0R=WPWc%#c0dH9tH~8Q_4}}f!fVk2sk|_eXb9em`Ftgwa=nYhWCV+2Q`AgL0$cL@@oEM$pbNk`>&aLP7sy#F6AzUdf_&xdkGzm3 zF*~T;(uu&UY8L^5=@zT(ZYefNqQY{$Le$*+an-F)Ki%$@5P}8yS-CegnSIKTOpjlN zR-I5BvvN1^mqIxm9hHoG!%eR%T!rg59api^hsEV#22Q=Z!pav#?NW7};2K*fx$2j}M6-}$%8 z?y~TsXM6+oQ_OAxUJtBlwB&p%8u7iBr2_z&2B;H>Fcu$x|S$+kQkB2X*{ zj=snVF9QZDog|}HQjvAgDve#US42u@u?&)it#w){z~S?@AFGqZg`tg6C~LEMiRdKG zklEMh%0^x4i@(Wj6%rVk8(oVO{HAS3Mo%pSeU0}7LozW0yQRPnv=(1Ydp1k&+|DsC zM8OX;CS!t`Ya?BKp)XXCK~hbWI5&|EF$gawZ`^&~6>6A{GV`M+G$CL42733`Qz|+W zv5yr%8ZNz)o{ielTiRleIESCP0BYcJqr2sh@hy-D=D1*`8OW$&5&~3Gql&G+W*STR zMK_Ni^I;4>z}FJaD=^99IDq-#;!P;WozJsp0Ckb#YCH*zH<*7wB#J6+tl)#gjP(Rz zIm|iB0yzo?f9EB1CgMB|&V9fIKG*qfbVR?ZCfIHn$Z&nH_!|PTyBr|88p|RO3Yyim z&T@i6l7khA;=ciAfs;VA;f|tw6N#d9`ff=%Vz|*OL3_i zY@~W%c8!xHDP~=8Iem4zL3D*cd9?{T%xYD5{+3ME^e9_EOAhqx_h`WpCnm;r7KXHQ zV-Muxfs-5`j@daSKUF%BUGsZ4{lmQuLI7s)wyKXPUJD$uiwA)VL>zhL+c(@ELDrNL z^t`-AWfg%&ow%q8T&;wE1Tm~Cf?_fla97(n!99AItnmsVzvCies0Yv5_Y=?E^us?Hx} ztnv!Y+mnHbp@SVjCprWrlm1pcw<(lgC6S1Uo_7k5+fiKHKXKof1tuHSA^ts>clSFL z4ES~q%6VA34a z=Y-~ExwN0*Y`XBaO#uPSxV`_EvHwnyA3L@wI{RFqe8nH_dSVF;fRr_V@@9gj9V#j9 z!clK)IAW;VKKhH}__;XK0mfLs~2U@5SahU9xy&=HbQOJ>2Y1{Wt@Xp|9A`g)WH@vUj}PdSx|VC)AhH$6OD&)Y>(&BXDXeM*q=|iyB|S;wgFsBF#G>L}7d9TdvC2Zg_?co&5sCkSkhUSo z&>`e&&(xsKdZMmcw&V)?`JU@jp>Rq;^GNH6PB|4Lr7$oxf+k42wrCYA z9SQ6yj8w855wdH#-}#tjoUrx!sztMxH!p{_QyaV#KD-bbUM;mx+p+^l1k{WFGnk#+ z=SlqBR=ON$Vx(5-H|eLtK?WZcE;p;bk*^N);lR8mtND$om9L7d^+??^G1mo373z(X zfckI1kvks@MXy8ZS1_T~I6U~0VZ9ql7CGTzs=*6AgDrB3c)@Sulp_KGr9L9*;W9ns zU_s}wJdx6P=Z~dk;|Pa#oR>AU-mqZ%pp?RG=P`Yo@Fke6X69tccVt#~(z$475vL%2g$jD-~tKPYQC(Q?lzp|Wfc;x-%w`OOZg=%QASIoE`NE#Lv z?2=`AB)J^O#Xh(KPK>0w_JfCRpVRiRmCA#Ig?2W^RkoP&cd`9P{DrS&nbAn&60cKP zk*VII^v7_W^qJcAPFAc@a=*e$+rDya{p&4c>yLn_Pb68;)@R3z+;22Ov!rTzRB1}| zuj<6JQ+aSCSGQt-G^tv9oxD2qQKqc%w>L`Wa!7{@8rw=PQF>+AS~p?30`d31)20>e zu^U{xrH14LzLkevkJ%@cnX_Cljje@x*em3Twso-iu!fpzxW&LuHmtH#KGhW*;7lwt z%r-==p9HM!&9uKeWtN&sKI@YOQ11H~SVZH(6d(EmH1}Eov{dE5oQgDMS+sgJ>r6wr z4y8?_R!J-2#wWL2TN~E$O4ERt#TT*N6Gl7<&hKgr)zGwilcNTi+Kj(_B^}Wf$@HqJb4Pp_5KW0#LAzN$k80gAffI3DxaSGvPzcDqgVV>-r3j)E zyuL1LHtTW>c`a_ko?S+ScECRCmt*v_f-@JS5+f}i0gz>uyNF7!wJCP zX;zQ3pM@5%?2Q{+gp2xr-p|cf%wyWLL#{X;BL886SGOO+aK}L8xJd>x7Q_pg5X1yz zHb#y4>&NSBwc?jNTBV%RT0KkD83$zYixHIfMbVZZ4Q)w9%Fh{js^!{DGL2Cs%%pRf ze-?S`s%d}qcPFTtT$kU0FI3p}h9PHnS;P=()w(m@<&iU70jHyV5xK|*xEMic<0V-X z)c-=nRXg=X(M1QRXc7eIsF)P!&e?WG&*3h1LTAYJPWhLro1d^Q454zSA9(D+XNmy? z<0+&-s0{uq$oY?SS-xgW#>wf%UPmH82^C#zE!>P2@1FRJ=5J{W0zcZMnJj0i$KpiiA5D>Km#cQ@bWK2CbHGT!ZN#Q4AF_5V=mPN)SRCO znnEJ?{aY62w_M9RI6KY$> z7o4150wxIz$iR)GD9>}k!d_3ffl|pE3~b$?LfxB|NIOVHHHkcfzo<#6*n7YOe-MeV zY#5~m+LK|pYVUY<`u>6{>++EDXXs+ej11d6_EF2x{C2^CVne#mC;Z$Tiis`8$A0T+;=a2vt^1;g`c|MC!_{ac|;J>Z0F z&ZZ~*;KG*Tg_MkMEv4S{#-nKbk1cG@DVs6v+lelTI}1Go+;{^1O?R6UI8nhU=qmxxiFc=i&Y#eu526KE^vc(`%%`HzFm zAxD4R#x+Y0WA-YkBWvM%v>{Dlg~aw6lnuCj9_)@!HoiNUpicq|ms-b%YU_6!A!o}B zIf2f#8Np9xIc~Jtva*+pc?TaDdLt@@QBN7g(}pu$erlMh|8*`a%OUvsAug~fk3Q8|1-jg4%xj(L?C8rnmaH@G75V#{5xN%^PSa?$QLo3?g;_(Cml;$yBo{(7mf%8CS*ady_|`9~<4z27nVMoWTI&Ii4$~aA4~u z1%bWSz>TROUh-o@9Z*dM150q4;@vEoV-X`=3y;hdy}59+Ho_|tM1I}n+k03Mv>@P} zJT6@22ZF&$;{|5##2y7Kl|boV>#Wr7gFfL6m*PFKObS+QAwwfnzx91Mn-GcoTW~?x zYm>+dP0d^!0*kMnGcq9;j0Y*7&4rqLsrFY==AJ!=Yj?c|2Ce9Vn1huE_F%v`W5Jz)s|PVhmz3x?rvCmTt&FR`uKr1G~MFwp?LeSELrxE32c z!)H~oR2UNV7L0bYTWlM@toY!$&m4H?C}T&S+f~LC5u$`5AVEz+kKqfq3!u()^1fyM z83yCCJoK~O>xq{IYLKL;&tlkPY{J1w+c@jryOrfToqc2XCq$jBSu6-=T+KVtPdsL_ z9Y7W0X~b6j$-uKFAlQ1Z4kFEu!-GZPBu?fLNzd{n?5ewHhHrbX7Qkx>MKPNsXH}LD z@MMDJe=v7axh7wE3Xpn}WfO=8GxqL~PUeUN)lDqIDX_VkO_R038@bu~DR?V|k09iK zl-~Maj5}0%$)!7!605h~We+B1rc`61Kdf-A?}l8T(^YRUALU>PAQx|SP7sJY>kGTL z*$p?v$gn_3xJ++fjbRPP{;PL^_29s&+MH3QjXH{29o|iR0ssfS2obaG+eq%>`2IQ0 z68aoN=7b%`(r4jNhz)?=*1o7QkpB>J&|L^pkXULD3A#d7fxPUeNufuzC9fPg1j;5C zW@hDoa_H2oU~_pN6;JPk50a_Qm2?VlS?UX&9n3HosRoslbtGLP^Yv-r8I(V^NI$+z4(pMo!!>!b?0qhxMF*^P+&9?yqsJ0YI%^I3;2IH{PhwCqs)IYVBtP3|GyKQr_lofp=`p5e&%Dwt0Q3TSLd2XkG+gq z0E}FMB>UImdMfsb&N5(yzJ#5c?Sw`}`TZm1BmS^(!nT zdJs#_oLDzmpmfD+-RnHG1p98IFmabsVI7Maujh=a!H^*EpxNDHw=}%S^8p$cPHYX{ zseQR;&O3O9vx}{{2x26UpB5DJ+L)2q0f}^qm2ByiJ}JlsCk5%;uYe4J zTes5LM}6aADCJNXHPsq4jzC!UtvZwi;4OML!7fF~QRB`6&*-ye?Lkpj>r8(?7Ky4z zvL|TwWvxHMq<)(|=dtiat->FN%92#F<-p-Dst$D(#gJU9;qwM48u?^=z;g7Rgui<4@ObKl{?Z1ua%F(~#7IST!s^JRtkOSE5t< z)YAANHza1P zy2GfEd_1w#c)j7i{~+jUEC^CzdhgYrcV3M?TUY|g0BS@JH(Fuw5FNiotCc5sl3Cj- z!bTQ95^!7>HDq)@By)AblRFkWbM`;~E4H5mC`GOEeu1Y^3cDpd)1$Fudc0hz*D0b# zu(!XHI`SFGOiMpf;jNc@?j4r_)2s2p+N(@DP%d|i23fhH;Y$w%eDU7S&IRl7Z(7(1({B;&?uB z;&~KE80LpCGJ138%7M8bvn*j5vh$qAX&40^zZ>;!%Q-z9gtoa?OMy76XW#L+d4HOg zE}#rWBi~j<0+U9RfEH5R+L$Z@DHK=myY+2JHZeZ)C2WilOP?ZjhQrfHGh6Yi-DT4? zi`(}sBO(mb<{mG>QnmNOQk=VIw~OrCgF&2h6P`h?XApYbcFn9RAF)}2{0 z{TUh=ePO1M>*I!pM6YSCH4r;$S(%wK29x|-M2_@caQ4~=3n#T%{`KSiyP(d&GgUr) zfut*yJpKMLxqJltqPqu34@Q_{nt&e) zmxX=O&E*bav-o1h%t{YF1EEc)hVJ&LUV(|>*Ow^eQ`R7&`4~eNR&5OME=Ub$C%?&x9F$&p zy?n9Td(W0ajo*2+VGHGj2I{*tT(56a zdxvwF?R?SZugLLuMZT)?KNV8-vij&VtnPxcPaw^&`p%i&v;QstgX!|`NA)~ZgLT9u z+nO-^R+DMnJQx?FL*xcpGy~B69=Pq(z4_lnNw~%P&U1Zg_D0C=Gh#5~4y#yu190af zff2oL;V!@8rb3Fv@!+8pz7s2;v6fV2d~b zEmZ;TlfuZ;3|lO52!^V42oz@KKtb#&=#ez{&>@!aYqdHy9tdQ7?s*28 z5c^t!L;bOnT7Pbo76BN$HynW`AsNYRC=ohtricz;k5oU-^`p!%JX&{58`2PnD@p1w z)*A#5H08axegTq}v?zy%e$p~kB#5p5&D4WA3F=wn*G88#BpOMc@@zQa&?8x)q;_qo z1>yT2`ZubJ^Vtz>Ttnt>X>`VeaaVT`cohtKZU6n>dUDS6LS#0NPZ9`KGg+l%17)GF z9^I=X*2o2OikPWmM~uI;Q8zsjrtOwoaeX2=g)ZAtj5CK?8RUa(mB7%z37j3A;71O0HfFhA0M-9i_uE*~&@@V-Oz zJ5Y*fS)RS=#hM(R)FT}LI0xYdrYqL_b`Li@2x!p^DuMWe zXzWUh@sjoov^RLBIEbf(OvgE2;h~89%Pnelq23|~?3^HXs=?YBZC2FthWkE{|1ui{8p^QFz2N@NIY{NC%^4K$%{l70V&oZAtiN{F}Ao2h+} zyH?AN<{who6t#;MdaSBj<_-SW>pK4r+T9yI$uN4e)p#K42%VVsp@^8 zeBrB~FM9c36O<}#sRboI6bPghjU zG~`To8gxN)D=U$#W)}Q=llxr>s(f2wJQRx1(S~q9;CK~$@=srSI-_A(y5j+QNEoOS zS{+un2B=pQf!i_rZLW#27Pq>a|Hw6V=io3}))p8*Tt9A^KpWry9+OR^Jj*1{$pyCS8{fs<6lxuzm6V4a!STNwe5COWz^C^VEj}L7guRs&U1P)aT zv^!iooL=ad3GBzOi~9R+>1)E-D@3kB)dFinx0R8+~qR&P15iC~K`HQ<0<`}5g#F_y1*4E03jQnPCR;BIOc}oeZ|i zmI{le)!+5ihMIVp`P*u=R^kg&tiUpXjT}Wkn34@cOy)Gv45Gy|_csUNW+*6jNnovh z$l?=aJz%9~)S{oEdCrCj+Vb>2(pJX9CA$G-d5XHlj36q@P`llB3`tm^;UiKckEpo- zy^X?}a$Q2Kth*@8h{nJPz`gpsTsV6vSjW9Qgl9hN)=liF`PD*tf`~z|UMRo%GNVK6 z>~7XF|9ILC7Pp~+Eb?Js{7|ejL{c9RhY*@|JRpaB&9}28x56so3|x>MZ=!P-NuBi> zTuc|hQnp9EYE<3t>bg9liI-Iz^bU-wCXoxUj}QMx#4ce&l$M`HHcdpNPpS`5rWG`T zmLzCqjs-ItL?Kps#?fC2G9cR#>Qz3)BJ`fUns$}$zS+5vLf1fgXlaJ^ajG)~h}pXM zJX%81L1~r)p3-m7R}UKSH80j*2lZ~2KiI}}mI}BH-kc`>borr+(}6EcHJ1^6I0%JR zMXf*bBTKh#SVcSnmoahk8}GYHRbWI6CrdtSFPfN?$3Go;vq0~I)K)P zI8#i!2uwqHcze?gOF&42szZDmMX?i;k4YZ2>9{um^R#xq7*@Ivj0TPjpGJ#m$39eD zhnMy1JNF+`UUQ*-+VPTt#Neq5ksFBxV6Yg`Jq9*}2cs7IyvGlcn3_$%uAs$vn!QQ<1WUaKZHCLbVz5LxX4ZE3gcB2Ok+#=eAe zQ<=$q`;B7K&)4oUBCMQbdtd*bO;qKj%|hj`65#s>=oQco$*vsN+|{5N%K!fMx`5T# z1gEIxsAZPd+Jv1C>j2W^5uU6zWmMO_mf3RkCr$Uk~FB z$_6`$NCB5*i3EWupwlV)7Yk5P#(T%o7*BKGA6}jGR87i3f-88()Q6-2`8==TO7i{0 zWs`s>3r-OFi6}~CGFBvEh$o`^^m|fpO04MadMCE4_<>Q8-d~jvdrmW`F}BbJnt-bZ z(b~jylg(`Yn8%4Qs6jS5jb#5?tJ3v zp+#~HgW;aP*>b!_6sq1Mkm*bvk5{0`zS)f@Gd%h>a|~`y>HmY$DWu|IY$xpWsmLE+ z)gOUzgpHZ=i$AHdrOm*e z=c?WPcWqN*s6l7cFLrCi z9&4fR_{E&u!G_95-Gm2_V%z^{XRXmyX3=n0EGT}qoV9%DINL}(SzJaU&m3z_TV@#| z3b!#xnj6hS^C^zw7W53Q$QeSFd|+NM2zWffq6MIdwFtg>ZBOq1xcF=P4&$;2U(Oiubz0X2FlQ!r_MmLWcl@*~1De6DQ5?+l6z~OWjM^Ken1h$`m zHs(lG-%~pSM90Clk#IP# zQrA&nKeUqz8AT7wr04b(uwj8CysV>0{Q#SYOjC&u@^qWpz!^#35Q$pXU~Pdq zk04HO!{D{%b~bJFdtmPsi;Tz&2Xj4|m`mxnuFmu8NQ zFnANKzH6pHYCDaDA)}upYX!b#&N#%NckpaN(vNyqhpSI_QGw)Vc9w*G6_~0)%|E3* zbW^PJd(RKD0zgAU9;boU@STzdzBeA)&dKc93naV~RR@4%mjzAw*wG_wi_~GtlsqFy zF+aloM~c_ETc+^}{afSlv!(d)!Y8pM{V<@AENFqY+X}Uy-s&7TWfz!~Kux`2nrl65 z5sTs?od3(5AqgEi<-3B{Leml1Ox>9ULxRf=>Ep5gN#@Q}tn!b$YQkp(oaMujChGHg zx2lKAnnJIvI;8f<1NBS#N?{Uf&zyI1>N$oH6L$iS97)lQmWa6Fg1QKz#_R{>vWypA z*0NcSR`sSU)I>fYX4>6UeT&C`VmMLnl!k-IQ z33g+mUHYRMLhC^pyJmg&X>xIDY=7all1srY%Di5JRU{pECSxjNcXf951= zY(io)?j=Tt>*o^IP@Tjxk}U2M1GcRL{PCe(XOfbX&(;h4c&V>K`!}62$N}*wjYjTK z*D9%mlU+3}xv3hEw|F#v!v?A1g+~43kZB&Q7KQ(PxbA6yn}sg)qUE4Scl}w@UhJiKLN6%5YgCfu5LdQ`T!b5y<2B z?i%9W`PnTmc>EX54%P9pIk4!NFAG%5?AnJ;XBWDCqBoomB2ybc5+`T{bANB}^& zp1`!C9-D~=nZ9N#zSsuKgxlT{i*!?W{;Akg;M9rL)~qwl@BC4T%Q0u;XvN%S8hGy9BQ z6=qkVeF-ViRWBGTRVrcQr4j(|9K=tAoZTyPkPFtpaO)t+;TF6xjhm|d6(LM50rmSA z+xCo{s2MiLL@J7YsgpuX_9o~gvRrTC)#jqc+($!kM(+gUO^y`i_cmE#~nE$)3^fh~##6^u+pBWiXcyU_hO+by#k zIZ9i?wscBo2#uSBr(i~MObM9n`R^+=X|4n}~GzQnyu0d4iwl%XMOJ2S! zKvO)Od8{YF6hf;+K$kM}*GepEF3Q>J!Ei~$}$ZN%XQsq zn1}I_h3TclNyOc%!?qtLYe;s53W$0S8;I#UNmy?_KdbY{{v>Cg$Lsb|++XeKvS5-x z$9suc40p>U^W-5wpSvxJ?>qaf5Y&EHiUA9n3IJQM04LCaCEmN*AEqZSKmsvF6&g%y zb%GsM6`Ic~WwZ&hrQR~h66GPSZdys0%F8lOiF4!`J*axTIK_{jCquKIb*9m?ZQD;o zDggDNtW>q2KA}lctC6NkWEz()i4v81(GuZ%n6;7PgX7_|E&!m>^)!vf1iO4{&zlC5 z%B?9w<)x45dVP@-F~a0i+X#+<&~f{`2;oKY3G6Z1D?fRmj;Fh^h>Fm+W%dF&s91=&=RWrhXq#{$iv*11vW^zI8ooAv zy@R0b3SucIn4+#c1ce#TT3DZrRQ6mBC2tu8{C{GX!rnDMhgtb`2Y~RNrzspS4BoCZ z%r_($*w)S(2|10kUwBGJ{SOE4yv~Rh=jK3p5?@5$7}G%jurIw%1$@8YYs|h)8Hl&Z zFN~9muzFeiqWXD?C+lLT*Pq4AV!`Qy)=gSdg9OjTdGAhOAc?$vINDZdX%VZG&{g2cE8N^?&0xa{A z)#G8Dc2GVWb0YH8`85gUrB~^p3iU`d!mw)+maBGav7)!MLpikzgF_oDeEH{I#v~CA z*YT?F1%@8jfU?p6AT%5}AYei#8ubPwm1ZJ{`W-})oIL?M*4nl--rfFgHt6!5f3;mh ztmhmG_de9Lc8z^xW|W_=0Rm0QQo^JU&n`;yAj4cv(H8iD+?EQ4M82UIb6>w-GX9oZ zMoi5uWIkpbHLI!>gWp4ktC;%S%+ENw$9CeTt1i)iw+kwV-ovI4ebLw$uk8vWDBd^& z8+V(=4m&V8dxDmDC{joTaG6=xd94yGQ=@Kx@ZBylAFJ3x7Qf&#$rB1$QNM=Zs5Zsy zgNKGXgs0)NZHCaU3+HvvlC`!{%wreWC4~f|_Rv3t*Y(SAL;t*;`?Wzely=p4P9Rir10lNQp)6 z$gH_o+i!^K<2}JQ%j$#?a4S2I#|aB7FXM0KQVLYh^q!k{x4pH{yw|ZI)1+aepE_9I zH+Rr4_5)G*mJdN&4O-+LlrE;r05Hy<`y(mnx2#WXnEWxnRi4o^w(uZ1*g+@qhWS`B z1)pOM+v!^UH)meBAYXFVIqa4^g7+SuR3lnV;L;DhdPmed65%{a23;!(7$)A%5pZ&; zbRPUv3Brz?0FfMTv4pF#2IMBTU8Wbq9__KJ<+suC!;C)81G}V_j|m*hR`=+(x{A1( zcn74g4k22P4t$K0Yd+SRwFxmt*J?_Wtj5FG){3@ zwkppTMu}cI^6FIkRwO`0tq2G3fpswuw&2`1hU{@x?hkz2xJ20$@>!wn2a*yv$*aLt zR_azw^5dt5WBC(N9IU+~y%C>OW=4Za;DLOZVpFjfE?5qGTtB52C@19Ms;pjcp~aQxzcT|VuNcy*`WovY zFzt)`y%zes1cwDckxtvK4d^PH7}dQleXhb6&U!71j3zY5PQ-wSPrQ=^GeRo%@0YJA zcR^IkC7_ zkYAI-F^+8^<=~nq0&Dz$`5+FRm0j=A$fNpE& zU5QIK3_zp8h1VkpgZ4Y>>&bA7wRKCp{vcn3u~F-tE||p^;enBxf~`2*KoIT`cL7Z! zgZ5Rsz7!5+p1wXE&!S6@yXDHn*s|ThR$VGrBC*f@8}~%3UN^0HV8?}GFtn~&Q?<5V z?1&(4H#I}g!G<*|F^+=aFqmXLMtNszs$W{+-TgdX%S&~JwXBXsKR^shSvLIo@U+A^t7cj7FB?xV8vYKxrvR1)GC@1}z||ZC*aT zc1%x3nd(HoPgjqCbrW^Yy6!+0_a1+IW&6w8R)S;&wh$#VE)-_t@9n+Kb)J>-{(cw2xvwJ?J19s$pUi}lU_u!lx(`}~ zKRHKo&u!;4I@lEgJOrI`Q)GI^z! zn-dGTbt&0x{M|^TpKF2MvH6UFNwxrZzs0sv9*`iawEZ2lBj9&77|1Z4pDK4CEUfxY z0>2s`>r;2!Dx}N&`OybwlfEsu40}fXp{b>dgK9yw_K?iyTr2;!1mo)E<6(rwJ7kVca{L|SHHAm+jS%dA>TOHrj-c$BsC4jK5Kk_sF*BI->ByqN(%@c1 zy{(qb9XRO;PvP54-UU%63n-w`VeMBPgw{!H-y|?{(ZR6SNV8B(9;Ituq}6sY^Hn6F zhjl07_1BJP z-sgx#AI{hH1*ysv!*x+s&In)uyR=XA`3-`NAV8EsPw$tXzDBSBIL;H4dJje57Ucpv zREo{emero%i(lCaO1cixu#2P&Ifd>GW{4@zd4_*P3>kMp{hmC*9% zsgQ8VG_P+f^89^V`VzXQ@H>~4Zu`1lfEOOwb#iIGy!IMhL9A(T1>84*VzNKO3RMku zpa@g9Lv;@+BCisR@D;d_NhcU(ANOx2s=#Zyw!33+H=h!4N^YgZ*WZs^JiI;GxHj=v zl4BLzw+XlIQbYUEpV-Q5Qs*%BtJw0e`-U$bQf&TY_XYItV$`JsK!$e+YBCCqudbS5 znVlzf^qSc)d6#x{k4lDvf!F=9o~DzKqx<5S(-e*A3#2QUS8TTbBPv!j`3nWT?KNe! z?MFyagt*9byS0gQdp$mAVPx=ilN#Y1!RJXKVw*D~anub9gc;zpweq1oXI2=`P>d+k zHjn-)$Ef?#B5r85*0nDLx)3nZhys9(Nxe#(sWFuL^`v>dcB_uX6LJG_pEi*a`Ial( zfDdP!&1-qcb?)0#)TMVz)HTFMfZ;i%+e)c;b{kYEotaY#pwgDatYiqZ59copuI_=v z%N`rQav&=4TKcc%aJd~wdG0io$jXUf!7Dm{XAub3UVJgxpOY6lG^7 z4;O{CB%oA_I6S>{sxtW1D|bmHt{jY1!SN~zn1nQNVNVy>jXP&BXfA2M-Iw6j zUw<&30sQaEnCma@O%F@$)*VDEQBU*=EDZ%7)==QNh}K3- zz&)nC)Xjryw7VUL)YbV`yvDX3{v4-5VAbVaMre@Kd#8TC_Cp{uGj0xadh>(e?ipyg z_DR^H7pHW(r9&pn>0+dOK~o`{rl%fIL~!@kJ{;%p?`BK!hBYxmxWs5qSZHp(0N)*2GHh!~2%61fW3Yj&ZvT zEIlx3b>ENhTHm~aoqRG$FUP;bXm0>YR~Qg`4Zp9e%6dXJYZ3Vs>MiV<+A+zI*q(K- ztNGY}Y%fa9{Qe^`ubWq%J3sv{o=bvg8UVYh&wl~w*BlBUNCl|u$>uaR@$>-|a@dkf4gfE zLTMR88If9QD>u!RGT4;9K;v^4CHWxH58Wl&1AD_*Jkv%ppTdzQRnms~gXFLb-@EFV z+oR2GW^DA76I7}bk$?uoubn6)Al!ZYK{9U$B+`*wlKBPQq!5!ZbB&i}=a9jZ9BUka zJY2wWIt(A?$}egP)-1g9Cm#cNF4GEkidm)VK;sNBB*0I8?($K9- zR5c(TGumiO&b5;`xP5lTpcEl;BF5(-4W+gw&_(+9?`{fcun(Afub#P6C2ktJv49c; z*?*6gb+W+3zGimL_B6do(Xj~0OU7^SXh)N(**8@IhB#T?4aFTkY7AS-3sn~0pRS6^ z$bn5UNbmi;cn_b^$sgiCBz10(zk--7mA<+;1Roj9)^jx%AWy9+#QAa~Ib?Q@;;g&} z|CNE4?qJZr@X~efC3ODF59Gm%B`dUeWOS#lEl)g7cH>Etmst+BzeH}o=->r+@xAn( zUX>3oQLQ|!b4o*D_KMDI_{n)S zOyE18-usK!H4jq3JsR+Q+=s$nPN=Ku8X#5GhfC>Ka5&2u(2;xHJ z2XsZw8=r}bf9=I_wpJYQ$H$t+I3Z1@PBh7|_s^yVgA(@9OZ zoLbMivj|iv2-N*Hb~AT|c&B;2oii^eBW#~+JoQ1+b==vv?1qAY{5;oKoMR2efh+;& zaZmFflPxOq4Gbc@Rpwun$}qD_r|e9NokuDMCQ*?e;VyP^Bk z;4Y(|V~~^(vFw&3Xs6vQ(B{`3v1~R)bRC6AHoonYpJq= zlK{s#zpWMXq=hS7usNvon+m!)mHap!FSjg#Ixb}L5%d?!IebkdXZQdJD_U8yKSsM# zpdvz$n|g-(YOcY_mVgr96cOzfw}Sv86=xOylpBT)86it3k}Ps~%RbqMn)a6Y3peQ35vM^YZ61I)J4pf~5L4l8K1mTPW2F}}Yj z0U659w02(^gT(!@`wUJ~oxYDf0Sa%zJ3qxu+FaogKmFKtwjxyYrX&_->}Oie+a-(o zAix4p#=md%m}@Pg$7%}!QO=^(6p>1wiNgoP>F~b8s@ytNI4?&(wRH4{S9m-4lv{vb zOuM{~z(nhIC7@Y8hcoCCTp4#;^(Tip-vtYIEtLkt+U3=n2uf0{ z_`a^7!56?rXy8ur`H>d=pt5J2JlwaCTk;XkLiYgLD+d7}b?*Y_ z@^x94eD`Q^RQUrK;{y6Lu42qxDN#y-er=P`RIAaKuVLnbG2pX#-8qTa0@r}W!p}rc zzh>;27daysIh>3-7_CuT62M3`euf`6m<}byC0-g~wtA5)PJ}O`MjnsX2#k>%D@HzX zL|LHX0IcDTRGO9tV!AS7SBPpcGQ(<$J_hZ&9yNMlzWo zo&8gzY|1?7sF$pfzYIh{0m%Gg8sB(hSuN~+_z$m$ABs`#5}X#nCmxuyxK97AbF)N) zSK|XyU{MWcpdUJX{|s+uoq>XxF`*_#r~qbh6f%+(Zxa{&h8Tf3%A9m8ML__eD8Yx% z#sFxzz?^f~s3)X1a#9s0%U|kAblp=j9j0LXsIH=PuCw(+ls#$K1*Q~QIoO4dkAAzU zmEW9Tc-cv!@zjk$|1~gr;exeHylPM!OD3iUJb3v$40WcW8N~Q3-MLC-6~37q ztZmtjH0Gxq^1)m~^2{B!R?ImB{vNw1y>rQhsNN&zBL?0lzIT7_F-C;`L2X>hg3Z+d z!$*W;YBr+(n0_DQDt*6+5-$hyqC}p{WD{O|up%p55zKe;T9&DFUtqMV(0tpep{t>k zSjYjk^vjJDAE5bgC+KEnAa%}H$0l-E7%}7Y7_tFIo%B9;Z`ic2 zv&gP8n^qaJC$~M2hiVaSH@6N}*);$WB^ zV~%?Bje6FfM>5~OvmBr!@usT0bKpIXdMOL*b@uM$%Pn1(VM{8$`> zcdN201;usN6R=Q^;~{%JkmGa-*cVS9S!XWlSYdy>vE^@)yvYC{Z;v`G6sCf^{jeJL!id@kyOD1(ui~GD8UO4IX->=C>$pWhDRzL0-#|Br2W_UY zt_zV!%#4MsQC4H5*TdMDr=EQ0yB0^(54ug!-FIVH<^J4!&64vV8!L$4nA)Q+a|VVc zbU+yb`ntnsb>#(@y7R8~kBcSiAudHz2;@qshqr9edN}qk+=Zsspses=>aK%_t?4uq z*ZmDmOn&xF^Bk;-#tMs5TEwrM^iOL=;8O!CS;jYlKhi8+xTIx@U(VOSe(f|N+M0jv z%vlI4NrafbAkWRN}z{@(Xk&?Zo(_>AFu_Se}m@J(<=c zK(eb80)E{tg^oRzq&>FwkAv(Krm-;4mch9wnRq}G_KO?A8+Mx&0>u_FZ0 z4#8bEkybiZ4I4s2c1#!{5-M!z8Ocj^YQ^#$4qInKn*#V=SL}ZT(;&{HmlcYU>d?xr z1xC>GO|+O;ms?NT-RAx<$tTdgN!uwu9c%a7ZFA)WoK5je9)MybPFL6=7y}e3{&;9)2nEUUo`McKXkm2mw2WN%60a(H_1oxK7hLV;b>&ZG?zM_E4V}we;X)Rtkkj^fg9fNjA*ZK_?m{Ui4;`Qi z=@?7@%G4()^Rs0Oom(rjdyWg^?T)=&p~=Une7X{A8LCbM0dgdR`8`gK-0sy!D)3wUU+7Z;KI$UFPEwfCAtJ zA!$MCM4@*0Ez9qxaTvb;y8p5(ge#RNzTqaFgIs-*629C^1V0^7OYXC?b4Pl-ACTE2+tZfUE#1ql@@xM6OPy{zzSqIuKYI%^DS}B zwk&F~Bfv!eH0{DK*qm_eUzCf(k^ae z4~p$5`GF$8|g3^OR|-%JJc8l&V8)*I&sWjvtt+i?v96^ z=kM+5$a;(^MP&)zNHpnd0?|sNOTM+^jf_CqoQ9Z$f>`WL0b@5^qtuKvDJq z!K%-RZnG4S0wwD|nli__cPfM~1LIEHV}d6Ha8(na#OxJ@`J%+t(drOML@2XEc<@bJ zSo`H3MA4aGIp5N5O#g|L;Smhl(tiDg@m{j%_PVHG*Dr*mQ*3PlKw!%10^-@><;sw=M!HpXnKbLeR2++} zo;HDy7ruI#bKKor3l;w9;FoI-;$Wc25a9H zp)TGvE1VS?%;ApWMj@*I0g{|7S;f-e0_IvN%N$>66xiapRU+6aCwVMBr^mY5H)M7l zXnxr+tY`rqdKV5nU&9)_=r}vN^k&^%iYb0hUoG-(dggbRs$nOFz48_@yUa}_p(lj( zI|v2JCUMS5M%gN=Q$7-g&u*U~Ou~VfW&4Asv9$WPpk{uk-fb;OT%{W(x2Mgc_U*~8 zg_rkuie*ul`HF@b^yIFzkbupaQY^~<`2>is5%yfF3*d44D0=Id~E8gZWPSUqg{T7 z##M-ypjJ`6{}bqZ1UUVcSw_?Thh)a%liPPs%Ff{|1RG(WDlb2{vj!&8ImyYpCB_If zIzR*`NKzd@njbK-W6?!@3M-~W`Nz30HbCc0-xi<4b@6KqZ(HwdOK6o;Q11rf7z*9q zm~i!nX7Y_YWcN&4b=?<_QJ}2GgV!p?s#B3m8AGV3v30U2ksC4qKh{nq9^PAS%6BIF z%qI$*uIw0Wo0PTMbmD9_&D`cK7G^JqkC z_wm0>J(_!hkp=1wZOzb_2aDyO3dHjDyZIrJO8M^zY&jK}8+1witz~-Vzi*?JIq>bF zo8-;PSiajs&l((fPze{860DD#P8NgiYow(;E02mMe6(v(_$$XT?cW+&`*cXi7&xC zrXGh;!2G+;iRkNBc#4Sttq%N`mo=j&AJp3N{=WlTNXugNwV6z>8#|zpuYYh4BopH_ zMtbiy_j~(_qGv`(%K%CW+18Cw4k}jsf$YWf!>i$OKV3+Kv)s=$Q#Pkm><*EE+`hLT z^MU$qd9g8X&QzWeGQ$TO9Wsw}BVn{zWgXBZqfuqo6XN|~whuXzd%1@&x}e zN7|ui^CY_fS|h-uSRclJ*99Fm?2NZ2YZwy%I`nJsR^~W1Y+E)Lg85Z*T{C-jT15)mgp{4g()Mj}(;GV(D3T|q44<6R~jh*kSni{U<|e#~~#sYn-4(NsO|DgG^^s)A?{b-_y# zM@ySMoy4PH*`e2$gP)0VXQIv9?bQiin&5n~wvi>_0T6 zOTU+Eit~wjH9~ab!R;07w|1rtxcY6*!QzAA?wy2=6Te58V7d#8Rfl22dr@63L=tDW z;{Hgi8%4Se3MJifDrTmFhMdq52M)3)i*w6ip%$G`N?{WmpO}AXc?>n#X97b3%Ddve zn2X^y>Mk%C!5F4ViP?dCRK*ke_w*E<=TU7E?z6tFuo>a#10>ctI|wK<_xwM!WhbHd zUEU~uiB+xFL;c=GuU?Nu@a&cWHP;h$ihefTd6x4JuNsr^!b`GBE%f1W9eG;gO)3zu zhk@(#Dfy>Zw-x+}8TU7+_f67R8gVdgJJkxO;xEy=Com8&2!)ZvdX%V-H%WF)|7ZO| z&5nRV6XcDo5f;-I zeO-$F21uGLbi)T7GC%t4FHwIS)*KpBh(oSRpmes>%MT)sZKKv32iXnTlk3y^tN~hB zsuiMRElgFW+(6ta4cxdZwbgniKM zC6ED~3`YuMSn(mKv)&}>x^RGN{QX;qxv{;*24NtAzKQIZjz&(`;(|L`8ACiTZ(#&@zECHPhI4Ur0KVV(;6sD?V}i=5#zke^r^YOCLb z%&@p50#%adHE%H7crWX3f$Zp^3efffPhDP2>Aw+So(>RYvwkOyPi@JZ*(1$K=w^kS zmeRZlTs$cnXCJ{IzRvaQ%_KK5yBnAT#MoimbxIEMEjM-`DP~t}wqOXu%P}&A1u|+35ibX%%mHcOpQHq$ z{~!PGGvg(k!@v>z+d}xDXx+H{??CqI#q;~WM{RYk>GR0X<35X9A#a)Wt|JKyDAGxJ zxOxDtd##2EG8Lm1W+t#EvB#JLc7$bZSoZpCGEp})1>Du`0$JtE8-264(17dqkB&+X z1)veM`UYL*vaB>`(%4_APxau9HzT=GhB9A+Y%?CUP9K6|0FCS}>;}HGp3Yxf|MQM? z|K{arlWBP6_e9QNN=};3mTU~jv#KX*gw~@leWeJ5yc1fM9LBI!k;qy~wwau)0=)Ai zP+o*6j2FD>+K|h!HTz>mW63FWn206Cy*HsSrlB;LKv%!Qg$y`u#=7EqCYV=yR*nA6P(%t$dPuZ! zXOwp)|3A{&go+X!+H9FK#_L)HIs`CX)_4Df_0;#-p`u@+w-i`;yxRXjWc==2)<{a{ zFeb}>!(YiwCmh;nxsn1qi*~Oce0aq)%txN1pP1M(`=HbIVe(MjQvUtb@QO@SQHHYq zx&MH}GCzzaT7_7*1EBMXy@wQrpgt_MLIJ3xj!WNh3*7D6i5uTP`dMw+6{{U#LlMM6 z5CWerx6~oBO21R9&D3d0MCJqbT)9^80U*sHQy}72c;>t)luDfEk2J4eHjLRsWfBHg zntvszP(@!Rl^kPnz?5lCQy{(x37JRRxU=3i<8G(`aCe~7m3i<-6o`p|yDFY;e-Q#s zwoNEF?^A;iP95CAayH!{bilK6iLB!`h--BD6p}YD|J99>L z(~T~3iwr1{=D$B}SpP>;6YS))r30}46y3a`Z34Yu#hh97yzpc=ow@1T8Ajbq^yUPC zuz5J_awUkJatQ)&%Y=hskQ`Tk0>vEP*=6~akTFYGOfPaq8m)M+fpHSqqb-NjHS<1I z<-{;}akHK(gA)}BrwwHWf%iJ@vpu3}Trtb~PW^!y$@DF&CS2#NI3008_PJ zgrfIZ=`I9kH8Y1o{VZ{%X`PuojSEVMKTB)6)LJMcw8Go>eU&6*2)#j%^GkM(ZgP_| z%v&lgCm7XRa?u{bukZHvWQU2H4+~mZkFua2zP>;#gouxLEKhgMIoHI|f?6ZH?>MZt z&P2uCl~-I9Se}x_SN&IyjBrG!tAee9J5}s`SP5Uf-;I=?3@4ua!3Wd^B~rA((ld@n zOso215NzhIVKXbNM2nvkp)!5nui74Juj%ASxP77ImU3bN_e?hltS4gOu#Hj_Jle%m zg=C)0C@2R4f&^z!&MR!9><&0Y>2W9bn#!fPpnGZ_XI63}lBQfU-S+By|H+~sM-~9= z4TWy53PVa2LaWJxwpvbmQ{S9u1NE~E^^9bc4&|_8ksnNZC6G`9b0<4v1gTEB6=e>g zN!-Xh990pqhXrJn3UadHTXyoNP@S`tJ zkJP!SSKQ&3n(&U%wwz^Gfd9XFe&)?=4y$+U}-=)<@LluBOs0J0;v1rm_-h!*=k;Gs* z>W=_a%i`!j(Tp%OSKWb3U(1-`a7~b^%Bo389Xt$7Jn@hI=}FVsZ*DihpjG6=`mt)= zq&E1~9EItE>D4ddGKH11Oak$2?SrOQPfNf&3&JV?wLPbE!Lq|`#1uBh!i@F;<3vMV zS66vK!ctqZvwmt^z1utMICvwxH-FD>g(SV5H#dsOEiCPnK;o4XBOkB$LL7a^ zQGmA*YjlQ=WPSkXdqG}<{|RTRQKHu;s*mlr=3BbsFYrq{Yy%&Hq2nH7#X}}swi-{A zR;yjH*K?0j+oLHV&`*JfZQbK95g?D{RSMIoRqYb1DkKj7NPH8Xhv1DDVhvHsjb#b6 z*SnMd^s@ez5^uaGzEG2yN{pz7_v;sqW}EP@R$rfX+Ya=aMa&oopjk-+UwZ!+jLW7U zc%iwwT$r_F$M(O{%6@H(k}L`i;4luiIkwo3@^#~`%Gp_r$^1LwCu8JP7_0u3)c_D3 zp|5PAJFlj!!Fo^^t&@EbsYVKJ78Epiv5^DJ;#Qm?0y)^v`Lob{SBGh^B|hROZ;;BW z2!hw`JOgGDh*pbHc}U2&yTu*0_ys9JdIvCw17$!d#$UarWAtMjMJs~X>hauK;=LrF zy%WS|&H!RR1RXXr#!pENSAuYnWI-b}SI0m5JyBwK9Fw z5SqM=zSsFNVxOY6*}l@LIHTsUnXs>&22w)RX1iBSq~5VJD01KGZN8$&T{ErKC{3bW znX#S}6$Vhi?S3mMec?Bu%y|#?!x1NAE*{9J2Pm%po1JI8G?lD4+LwE2-cW01@~+d& z(Q@aZyl`yJnrk&frVi{pIMf1LU4Ro=YGx>g10wuu9x)zc#QljRkj!E=dwqpQ0>3?6 z5NANnt7_ar2{INP@=-J3_&hW1%VvQ@%M8_vdYx@#TD}&P)B|7s$!~n)YnF-bE4`?; z20Q-3TXzl*;hIYjcuO7u|79uylU8xWR-&39%ttSsFl1I_U+8La!(RSKa zAGSH^z6op$Uea7P{%p1$hrTwIB2)0inflDnBgBsNnsZ_o`gvTw?lWdh>F{AAR0*aA zr8nNgl%&SiSq9^8h zYJ@mNDMhTz7Dpp<)wc#l5=MjlL}5ep!B_LYPUA5(mZ*3f>bU2b;frv_P(5XeUXzBV(=J>~ZYTNWFhIY46%+#mN5?E*2;!6x0u~3q`~u1fh&V zHbiusjzfk!DNN86iJczFJ@X~yHS*ha=gHIm*Y%aZOx zZA0u#@NEUduct9dY!Q@ZxeO$-_lY3ZA^SnO8$E^oel_XfD5!&z%meJxYbC6rvPM1F ziz?HdY2Mel=xe-EP|cMO$RliwU(_qOI%M4sr&Aq{dXr~*3eNCILjn$&RRr3Bp z&pae&6P~qkIsSjVFN5UGytJiFo5Ehq%s82eQK?`p_{Q1Xo&K;d-mSkSr$zJ)rX@)e zS0=-Tn=jaAseQ(h5@vXIV`pYmF0NxiCo`TCS?ihXvrjB5(5?wZu%~M1sP!l_M<|?3IJS?>7SkzDVsLtKr4+$#VPn-ru(NBIhrJb= z;Lc$#fH=koS(MJ9PYc|}LuCf@_NzGgpPR`&irKr3CLP=|P3n_8xJW)oOa$4DEFjk? zTaERkS^`I23oY%=2&rvP3m6uD%S@L}e9=byD`cH#5^PO3T6jv?^ISZ8E|f+gLMh(r zo*VqIGlGXVGpW+w13@al?}5nKtRlEoj)o0XvU>-Bn%M}Lnj4dblAiT#^HG`>CmW+@ zI=WQw^)SUiD^jYgeRHuYC6xIK@UGrD&^U0Bt!0f?F-IJuKwbN?gnJZ*uI?g)yeo9p z!Ktsq&pDTHM9AM|+^-pJlHkmEbhxY`U=T4e?WYKj5nUrd!i-qR1L2G#xaPc~hOu2b z&Z)&9YsN0{Vu%ZG_b1hZ4EQ|;vtcwA{rIKVcDcg7DA!P{NS%jVku8xaAO_QsP(VA3 zOQSF;F+9q$O~b3~#(u0d%;WI^#R0wVxWWpR4&j@B=?!Sp%HW&>!PThaCgObD5FKhj zr9eXN0)zV#Urkh1ZQ+~nhrDt7GHduG#R)6&fDka4uomIso?j(SP`=I2DbN8r`N4Qs z#H>D%^#l)CNHorRLpk*ORPsl4V&?g5xx4X4!#IHkN8*P-*S5H>eu;(r^ga)VFM0s7 z_)#-Hn6yXKAxDS`&Y!2OllGB3m6k5%{LBQIPGtPs2^g+WpA6jg{QDU&IcbT9zb`j? zvs(OfBmQ#m!@)zp@E<-0g;BK!Cm~&wRNU`EXI2Mow%jM`Lpn%THM^|njOf9-wsDz=;SK)Sl=ZIImsHQhPhN)wl)AW1uW&o^~@_ zwzP|qsdtBNJk_eT{0XB1F!v~<34;Zak*(jBJT7m`=HAM0KNXz!B=5|V34cZAIW#1m z+?xFBm^eXyTTBR;Gkhlpvvd492EdGNUbEgXqZ+Bj^2!}?f3v{+R4bycpMA^$%xa{a z&;tcAtT9~v)D1RQddVUcR!7eAsS$g`V4W~*g&twNT#C%0(+*E3n_I{;*-HCW9ZK^% z6znQB&+&^ufR8Vg#p7niqN8SR6^2ZuwWphel+7p;JAH#0Qc})6m`)dA{H4;okt5$* zvCtg||KEtokMEeI&b=v9boetVI(zF5g>q<+22N0<{AEf_2o)cM3;iD7%``@g<(^ko zMO_q-!5A*rdnr=wS+68{v||+!IWrX?I9l^-PrkEMRlok)}Ccf9$8{Blxkwt7D&eP}oi?}2IYdY^#X%7ZQR z(Qm!@d@VvRLHU}DrDOJ@>hV~{5s91zTENVvH$^oN-z(=kYH?^vXFPg_1yg;ZD3+UW zIiz-CqO)$?o5{+dDyy=C>@aN4?rIA_L^_(GnMj5EX$G`~u0Xd!?eoH9$>snwq5Fh) zef-0D*VM$qaGeVyTbyFx%Ot>4-bR)_(MJp58U51K#JqCNK~uF^uV@eRpvJPB_NT+j zB`7_J11=s`jeUD3PI0((+Ow&F;)TM<@q*0J2J1-_$YLKt-_ypI9Urn`WP&RmUz7Vq z*>FbIV`3*Sy;hmCA8xZ}MTFDI{^dXrn4Ncrm%( z=PU3Tv`?pQfl^~YiwdJy58~5t4xMzRA+EqQTbDzfgWLZ|fo8By)Gso(g7F?lwW9$+ zu|pj-Le}dhTXa>aMSLh@@jBxydMXeXLXyd8Yhl6BA08Esxzz`x)P_|L41_MRXe$o( z2J6LRB-=`MifpRkS}S*U_r9_-IKB!e2Jg^b?N&eaA{-}QSe?YZTt)s4D9GY5@u@KD zt+ac-cC}<@Y625UXKZD`zAbus#%48NA>dFGerrT7r}IfaI!CeCe`8VQ;W_x`a`U6a z3L*wzmsAJM2{3(u_VDt0-FH9=`9UdE#7}iSrs-8T6Y-a_D;BDq_R?w`?G>j3$6d{t zgpr4>vb8H6863?;K1ejb!#p`)@!|Zm^OB0b?8!|G!22JC=JR2W=*{lvNu=FUkW?Oy zmobc@n-`J!-n9U^7K0W)%>k$uK=FYUi`U1vVNrj5!;d6`NmvMpZiZdA zrbzJ_axHu%HOWN}>#W(5VM-N(qpa8hktd}F{N%WJLFjZ#B7k)TBm@ZY zc4r&FZ~CrNp+%Qn+ZE%A00R^ude#uO3oTpP?Swc0eTD$~cg!Qvbi?ZWj`QYF0P2`4 zJT?1MDaMAerdx17m?Eh(xKh;V3&5Jf@XTM1RbzC6vfh=dfJHFQE(o;yw#e_q+`Dx- zq6oH-(h6QZ7n$CLJSJB&KDCy+y|EG-O2CLRFMwD(vz*-bUp{T7zEXM1c0IZ64fes- ze+~obLFU*hW4%!m^$)GRqG&=!pZK@H@q6c54r`qmO5*pEy8xKd)3~6-_+TlJSDe9r3VV$-34>YZX4%3!o_9&dyk$YvJD}d>oQ^R^?9^V$Abh*(SY9r-LkT=!oKDBg9(Ny?Wt>VDacfJ zKeMZ};A4)@0NhxoL}UY)T|VTLk>3=f-MK(e4D2D@X_*yEPzjVL$W*|ST6y+`&<~wS zq^vFi8tesKmw#|fF0U8pp-8{ere$muw<&j2&e(4Oz|dxYBuJN{s}fVvR94An_C}_M zU4)>*k#CTg((dUhF=Ro=h?OQokItSMT;e}ZzdQ#^btjdQAgi02OyZz?KJND$lTXy6 z|B~y*ZbBQ9?$psxXbf!++&uu=2)JEBD* ze8rXFdp_;GPvz$zZHM@iH>Ju%3!m(ftY-0VaRaCD`!W5XN?yO;fJ@xKpn)>$CS?ItTdOiia!1qF~M;p7NPC`}R4}Mz#}+q|PsW zGEEm~w5{RSLaD$LUY4wGd{cf0RQeNkKxQ`SQjuZA$>TstE-3Z<5k+mR(AOV~l^PTk zM0~KR>!KMD#4WG)z*sNJbg=kD#vY4>;oDuXkcCuMV+T~u)g9TytLZZ7>l5^IV7y9r60mf&G)Ou5h z(x;N0%H(Q=P-ES-vL@319>|6av!nKtN#U4my8%*iG@ZJ7DG)i-f<^4^;Dt@(X_Y}? zF_cIefb{PT_7XTLgcvn+>Elr4p=L-1MnY&=1#gDMZ7sB0(0SSO(>$8&N9vzJ1x}k^ z1#{824QPa4?Ql>Ql5Vz2z~C&P*x^Hwq~uii0la`QV7KxvyZ9jX7nkQ`!7P50@AF^&8*Ba^-5{6XmMC&1$n>V4veJNCltf^6dlRm1{j5hgft)6Yb#wz%=lQ z`1`u8`W4Q(u5isMgH}6Va8UYA5=CHOihRpSUCNKcz`&4^AgVE+kW*FWy<(E_qaDJ6K!a_u>oKJJPdu-;v}(A4fj{*L5g@|?s{By-XNKgG56&N= zZ;^E3a?++9mueSi$X)UebLNG62ssbebU7w-h!;f@RKxqpehh3NSIZFbLa176Y`ow& zu=GcQXc8HmFXGFJ$1APEf{>dumi;gH@Mdl-P2Gr2paY@6F9uxfiI)~WEJ*&~Yx(z#S?jF}z5gOJX*GwC%i;L$-@r9}$AmyZ~G{zN> zFqxPMxtIZZiV6kGUGLQT@uVFfyn2`FjR~O=ibLJALUgo2-rS}A++};-ana&n8&E}{ z!w%fu_JnA7*=Jc&C^|qee3pjF0K-LN=ruYCMZgG{4{v}*nX4(5X{2{$9;yxwpf~NJ zg~B@qb?n1S0=(xPM~5<}V`am$frAH>O_C|{GyIeYhDxoU?2TM~DEAPxSyNpHPAOAe zT>0`-_8HOj6a7(Fp)kWnf!OLMTRY&)YYJm9IrN?U=g&59t)^D*f+}*%B_FKjNsTO0xbT)E$}a{x0eiK)YRhE$nZeLa5kcyiCchyd(0y-I+_! z0wUVG)&;|A9UIL1_r6_4cbXFwZqQ2en_jrjfy}ZQKDG=$gMil4g=xUyg zcwH`FVN#-_1ALhCB?50T%XyaOJvTqwjzadCZg9yO=RZdZp<~j~y7T{gnAyv#^0)Si z7Lr;6Jl`S`%2t-ptxkAm?t943cU5<=36Sa1Qw<+yCH`J~i}*E0{0bd8OessfT8!d{ltzFc~2WM2U74155TXybeiU}tB8z~1zo8ZbT%Tmr&vCO z4gl_5J{1|hZRuAD15VKr*X599wiiyq)P?6M7LadYpw0Zo9D>1t?99O~jXR38)o~Z% zS@^3*ia`0}4pCkq)D9yS%19zjhMgJJI0^nT}l1tC8st!N+j ze7^hv3>x2>2%QK3R0@DkeGPF$@f5$ff|#o_ZDu4B?0SisPQzSN<1k3>4Idc_OAYbx zPFp%F^G|q$A`PI9PEO`{08RO9`JF`O_D~;ea~Y*rYTeVvNg!SJlCrqq=y$kYuev%s z=4th*^4NW~1yItzzz8rb$wnvp62;412^3!u$91tE&mE zCpR+Xk4G9dIh7^N>qBduCXPlUzl6j!ZxC1OBd&M*gDP+Ycb697s0J@)ZlFn)FwdED#U)-o;TS2&ThvA6~I8Lu{RC-I)@_-3HXcEQb2^g@g>KP%UMsnTE)VEpes*Vva-(h z-3@Tles{M^ux8RyqHmC|F8L;8f}X{aU@P3kkQj$i;x4rU_+*aPaU1Z1HZ|2r%N|y@EcYUaq;SS+6^(uocJWw7*r*qtn0rsO)qwsUPuo_M~ z5FV#GZ@EXoxOE6@xbl=+m2WK}*up$)t${(yfgMLD^9+r~&(YBX-~T5%acgd5V#(iWrxr+1M7O=y^lYqKi8sd?Z*=JyBi+*V}XCp$gBMje*{ zyl?hJuy(2kQPlu<{hr9mV(@xo93r+Rzdf|99fdGy`!)ce$~>d+bTJH^h{<)NFm>Hv zd{&X0yKse&s^_{MOV=dPfq(v^E*CxhsB^6(EJviwO1f@>i zQ9s<2C|f2~Jjk~>R1mMrev+)oL0r-%;pt999$wsCHa%$no97B;ftC2!Ai_R$cClZs6R z5|oYP6hT*>~bF=lN~kUQJKO6qSK|;Aym+Zsi7P>7^Af))`lw;G$2|-T+Wee>W_! z@Qf*y6aspI{PKHXC9gqHYOEQuL7<|e&A|*?6ZoQ~(Oh}aNd#b9P+lI09q8v2gw}Yz z>Fs+`v0H}F=9w?$*yR$EW2>}4zjhbIXpGHW&!7dMYcE`&m=^ilpfqUrH37e0Bh*+5uvL2oV)|rC4XV*$Rm(jsg9FHX< z(e%b%5!R*Sa!gEnzJIx?yEP1*fh2~eGP14jI98YreQx``69sNKwp$#Mmy2(V*FG*xu@cceJN%^P zEY){z;Y|nwrU|<%8(VWhc*QD-5tNr`PrA{nh*Mq>o!Z!g$`MeiRB@xP=TMImCWS#w z55h6*Xw+)3r5cB(5LQWlaJ{FN&Jf1&+FEa&e1VUtrlqNkjq{jbqBpF+uTnnntz4PS z@GQ}D6+BfQdOV5OY6lDE8L<)pB*X?uh^w8$4(uRKJd|q7$x_v>C3$s${Sj#i*6-1Z zuR@z{@6SV}YQD#oZYI=UZX-5;AIK8y$+tAFRW2nEU@$*3pAyFnc2=xs>)cq(9yj6I zp`Pjy(cIF3B6oBjIgygOAZvu~Z|1LBk>1Y%CshYm!Hfw?^}kDD_9++<;u)9{RphOa zP-pPs9712xHTz5QbMhy|pa0w4{;BIJ&j!e8!eVaaUg&+$8>%t1KUiul7ASTelrdtR z9y^##NxIBU)vZu;XR;l!u7FhkPCFebsQKf{`x!s}uoYs&NU?R0`zJb!ciWZdb|s>E zVKZy*P!GrNPsB7pfmSWY(@MXUoiDWvZXt`WLJh;$_nrLGOX01x-}ZCkBh|untq6LB%1Nnu0DOFU-btkasER| zK^(g6&;_eEWgY!<6Qq@Vlh%Y;lgEP&0|7&-C#}4F39L~3Ir~VjJ*r}l-Q4%0;@MhU z%=DiZwjSnr-cp2pxmqkL4j?a^2LS4I{f<^+nQ~0ksS<%@m{~Q?Up8q3$-;jFdd|Lc zqOm=bd({0a^b0i9j+&5_MQuc-@nqUn7(L&Gnerh-EoUfY`EF`s)Vtv0xNuHLaAho> zC0DEKM3ovQ0wqvD%!(wf%O4z?11+mz#JgLwV-G|*i65U2O?@CA26L^WHgjc6Ni$^F zV-=a-gH2kQQwDK2)MQrvmEaTB)8qvN;#IGTIDd5~l-}JskP>m;OlG~G4j3W$N31jw zR)bqH9y~PAm97>@ArU|GXI474O)lQPpQ3ks13&FoF}s6iCyMlo{AuFL5~3?QEDAAh zK{q2Z>g(QiI*dy8iNs`TW`KY`Mq6=BJhBZLx+df$?0X43j%C{uVf=J22E}C^+SsjA znQS)}2V*<;j_}mPHn(WJf%N!ofYK5n)^n+54uDjJ%*DoaFk?e{i5$R&4f;8y4dpbA zmxj~WLqkJ^DF+nStqhvekBw+!6gGr`q_YCokq0lyBHvq^uyRY$eBQ(J>}3r6avG1PeBA6dA(Q^d`P^Ppe2F#A9~HGO zRlII(+@lQuEhJsS&j{;FbO>Nk7jTKfhJ}P~&!3t^+hvKNa)JDDD2{g4%mA&sfpY9>&DUNjBD4sDRO4ALHZSj4gfRq&7Ni|@phtYY}#0aagnZH zxVMV>GO_)u)B48dxM^2i;~7aci|RK4H|fU1yQg^BOHB>;VEg`EBf5h8>8A!F@CcW) zUlAgkz=L1=_LenxE9F~hQ~kDeY9Ki4sOI#cMX*yt4if6u#{w}|(5Ebjw05v~wl5la z`7MjKyEPR(CueKKd>*G<#9q^@ml%&=ZXBh_+iCEGifl!wN}=>n%YUo7t<@tc^lIE) zVRr2!@3wlb+rXA2R74gkl#Ly_rw2qL5BOs`wFa$4LIz4oBd&|MMkFY`hpSwA@@_{W ze8JPm8B%}5-WhzyLDd?d*BKdM6x(&+==ZY7q-TEb@5ctP?o*^E$cuU8>^aaQJ!F9S zL%=_-;s;d0XAA|hdT3zw*}Ni)nhiSVxjSnvk8qWVE!3ao96Nr z**1@5<#WxBY3_hx5yo~%x89I#@_%$1nD8PkCS{^*0TXAdJZBr&jYDMv4jzR?b22%) zwg0gpOY5+XWP6HqA43&SHCB6BO!xN9o770%pelg1@!^x4;FCf{*>Wa*Uy1Ax!KU}U zQIjE3v89E3Ocuk59#JnN{lvH7dV2jk#TV`o;Z%1YS@EF-Sm#U)ergYL@WrJ@Yn+*+ zZ0JUjR6kuQyFPOPKq(V!D3`r6N={3hM@_?x|2h5`F#v&1aC-5gUgCFoUl+2FtW;=6r= zy*({2a%-mLm6X7}>tzHG1ju$hP1Vt3dGRl;c=dfvlOL`DiggRl37c_-D-kW*<8zz} z2-0J!a^HVMjV1`NTIto&k_-@i#fs$)(L4#qecQ`@SO~MRneCS;4G(OMKB%}jC35pZ zKw%Tn7hWsfuqXTObasA8#>%n?dN=q1N+zpVJmGjaqcn zeGjoSwT|OnrQDNx3Wr`#o!!6zJ@V>>si~A*MK&omqkjSuNy-jyDwy4y&F*YGH6=aN zyQ{}*;th-Itx-QtA~I1NhmSLF?akBr=Z-~_?cr)@W-?hKVU%EzOu*;4+Bi0)HaM1y zf^OywWA88Hjn}fLI-`aaUww@9ju;axaOVSU@2{-BRes*^GS@CYQrT+EE89WE|9@}m z_}zcm-upq80X>RR-NgcpEk3AZiXj5VUl)UE5#d$VFp{0XCU*n$p&=0PENskVHfv^q zR7fT86u0?ETxO4e-J4itdEEX84NSa9dg{o zT*$X#!17ePmI4C4x6R7%Q}{WE{Y{eZ+UZ45mh(P~LuHJVr$s3n$uZq8F)??3xwJ9R z{F-QP-&Cyws;BSsEtJ9R!8UxU zo1nmZTv{UxF2qVOt1bKcEAohMmY5LOK`tf}jh~l%0}W~%qk6utMCWms+b9^K!%L06 zYA@u?>|^yt0%W5v9M<=`2=YuXLdrjk5U(>lOu44eMil3*lSH=BS`1Z#?h^57`rq>O zN2OKXr{gPn9u}xSP?l5><5MbP+~2BD$8nRl zDV_=f!Gr14i3;U~$i?r1m<0WO=wZNrS)kG4|I5~PTNNI!XfNb7)Tb1wyg%61MZ_PN zNjOLz^P%a{j(LSqL$`-#E&qkeN{(jhgh6fm|5Frp?z$&x-814Hv_)6mPQZ7yZ9Zl> zQDx$;wRQUxlBK#bPD-Wrb>W3c8e;7G#_oN@`M5{QAi{WB+rN?S@N7*!o6}*x+Vflc zECLq}fulq!{JXaT4j8a1PrYa0%#m>La2cbOyNt1-$KtwBGg7Exs@!%Ug^cY&3jk%5i*A2isK;bZGoTCCz+`eKL1 z5j&Fr4_|DWBPazW9h5s21$oQ^dDf!}872r~hsgUzJZrv_=OVxIEyj40H*&}0Po`gR zkRK{3B-<2908q~)+PkUgp)^rv=^F(gCGxKMNU78N$)Ag}=#QZD%Q|SAVM|0y=d_hG zhcK~J+)GCzn?1R6y6V0><@r+q>I~xYt3Z4BXIz&xDO@t}@ z`gL9x^~J&?`l5ch=}%6daPoY)FO0euo4@mZ7W{Qm=HFP2@*{>P8V`bi`2lbSyIQqc zI_a=Abdfk7E0+ZZ(kSQ_arP+qOmW<%UD#(T$|FpidM`44jN$y{vu|LU9 zARr)=6e4@Hi;;gXC%)IOVn?i-d|9tzEp70%LnwSe;o)8UtoMEQ?@!Y{*8n$Yi!jh# z4|_{vtq;OX&~+J&9xz`z;~?d_^_>PG{RdHna~;{FTg~)$+@9}^m%IP-DF=6?Nab>< zt0%7U``wSfv2sk{H*KZT%*EJ!d|53Mk;eP4hDR>-aPgS~ML3QcOXDRj)T4fIFupc1 za#s*qO{*P+Xpw?zKXmDj5?~xYvlSJ$mnJ4+c}~f6nNVJLDXWqP3X&U!%HxZ|jJGt` zVuC@FXWZH4KirsKEz<=n+W$K9BI0m$fl2~PDe@qIe2Bz*es-K0OE9@j_v5#~up^it^a#%$3Z{^Ze#DVXelUXH zOe7Ig!x<=5tr_L;o%F;QyiPqOyuj##H4llMz=M|^N*rw92OJth^zok3kRs{~-yZ%~ zqC7?pC#NQggt%P$BM=i)Zu>At;*V; z#|+4iqy4Bro>=w>rXW37c@bYtZ_A~}dKj6cc0s)3=6n1ygvbz|Fy>a`DtG$7#ZC#Y zv*(K{=v(utO6+hk2Te-U6SOm%@j#q0E9*wl&*$YycVg&+MSlRalpQ^3hHhc2%b!ZM z#ZGll$PYpDf3gc@6ic-o{_A~;5QkCj{O#VojrsK#Yd4Cn$b{6cj2Pm+c^22paM;rc znClHe%UDA@AMBGbocERJO2jo7Zaw#5fp2v5lDGdFJfD{ z<%d!!+L2jLK%v)-p9qL(S^DA3m1*X1&zM{JvM0Wc*0A%#GXD~YE5Gi}_Vl}Ybf zcbEc=ZvHAsS#^LB@vXD_=X*f4HG`8PWN)-A^ZC-RL?`C!$CInAkV?~bc=itZB9Xk- zRJuO2K-jw$L3%~h$Y??-3T;_vPcIJRK3wFcvaws8(y8j>+CB$(a&Zr4>5rETG>e1d z^QVRv8&7!e!Mt4p5`{#+ksr9dz)>g|GwxIP}L`y$y|y~bV?545B{ zGS)*g;ivj-{;Ux{1Esx~FFrUw*20f8b$Ug{{cpofp$oQZzEqROF{ZbX0nBYaDF`qlcL~UHw;cxc zp31aC8=tLH@ZIxiA|KxLO7Rp1ohx`a)(+6gJ9j{9pzwz9rpd}{a|ldP`*diBVks?( zBM7adK~aA?;^I}EM&hH8OjDdATjxJx$(AR3+i9ObR(@xjZ+~)w1YZN+q0%h`k43VJ6jB7nJ`+9%F`vdFGTuB zxCT)Yq&Vc9Mzc1;1%V&3(I2d9A-!;Ew6Q;^=kF5&U<`c^u7hK!BTk<>$4$fJ{hTc) z*uwleEDo7@^AGIGe)k@i2s<3RR{9|OOZ6S}e zH-&C=aU{a~>PNB~`$N1jnHPq36BqAo=laKp0otNzNI`9Vu4w$hihgbO91P0ti3XT=HscC}1rO&n+8W;U4i~8|?n&25RPGCx!N^gL9UPlfYEh=*Md&pN)+`l3$ z09Qb$zdwrn$=bd^rrb)3uOrIOO(DX@&&pVjvdsh*D31GhH$+vE5vA!jp$7~4U%Nax zUkNZu;@k<;aC8IO7N>EVgLiQ5rJx@XJtk3o1lnC7s<{WF!6eo>`HpduyI~2oZC7Et z^3hI;j=rVY{He%{8p{f^RN{5Bc=xa7Z zjwJj#&#~}81YdzOEcQrnacF>+G%gB~93K#^CowhY8lyLMzNtvKI-+3_Bwbh-j;GRu^v1Ieiik zbIhP1;qUoFln;4i0pAHL?z2%5?+!@rjCN*ZV2Iup9Ec3ZujW&q(Csq$cRQAb60M?!nb*&=7$31^GBk%% zM2k36aUjT>Eg*Giwp)#|yM8f#m@Dgd>zk$pao@F7{-tnu@zME7uqz}Vmn8i~GIXri z9b(p_Dx(`mEnEKXL~LVO#=9()P%{PgEN99@9$;~iuTcQ^C1 zD;w-1>lEO^!1lB8X7Y;iPAk|Cd0jw0wzsU>}^rp8&6uO=yP7o8T#_4cV7zBq%cs4L5)Ug^F2wUtONWxhu z@Rh#aNOYSwk~;0RnW-D!_vp=QH#XExc`R|kL5T%JtY#N7X-1VKKcXLKfoz61!q1)( zInq*n?^kA`?Z=F6%T01A)x!YE*1X3i17*bB_~Bbv&oK6i)JrL9f|5r!;#Ygy`7mBq z$)?KPv`U^nQi;~fw&9*tCuQ@Aq`AwBN5w`cXg28D-`D*r{|{c(l^$++e7SK&I^B$l zm7tlD`<^aXaVudoDJT!9ijoi^5Isd#VvD%uOHyW4xfBGHzU4GirvOtDj{(G%@~yh- z+&dGt;ZdEXtRrbAFV1cteHW`jC7o!Emen*5Y7Mqryiy4$ zp?bb-Z&jLY>-h?O$!K(u|JAZ{&+wkwBm~HdY?6DJa^uWdILHrzC>-~ zkefesY<;O0xTC)D-ns;fbDW2ICgbD8SfMDExHm}B7F`@1LJJ2pxuFGvO2ldih#$38 zz@v~7WSLHyKy-u24iXKbY=~rhglgB(4S$O#iN8-$dRxFGuSs84>ov2JaN?28f1Vt& z3e`GX(#R$AJtOJ^nvmdvGk>`Ru8gg@@?&E(r1j$O6HkZkI|5>lJw3_%JzvUlq1T#NI z!q#dM)`@}0O2QfLwvYrzs*dA!#~BrbRoaylTn@0um$vryxA!~iifdH!`iECegMZrV zc&vTtQvgMguv{UD^2R=abHo>Rdt=Ownjdf^1I*=j4yTIJBFCU#AFHG105{&e3j()= z(8==t9|YgYyDkxHtS|kq>0T0jlL5h{QcoscQPw;IYUm#NMcTt9G`UE=Y7Csk&Dm-9?Gr(YFRW)Ftp0HW99JeQF+oEVawVS92oD?Z54XcO9b+9 z3#1FHT>KYTJuU=bpEpM6U@ddxpOm`VIY`};m%$7537e)G6{*e$ZOL^`w)OJd%DW z_d@cq!H%?6v*eD>j#<1!%?DRlnFN|S^_@J7A2Mr^c@*b2G3wFEMv|b38)8mEQz+r& zD>E$?0`h{DLZG-sK^^?Q)D_nXhtT}-vedP_OO#D81AYr8z{81;=&T){FJSatSXOxf zLRSJ!lje3eanX#m;5Xw0YWA~@&+9ldZMN43XomYr)(-gi}QFIQ;3 zC|)`b@WjYf8iaL;uoOooOHOT9jdbH5 zTVeV$8}mn4ZuJ#pSSL;4LaUuePRRtn?liz#GH0U=2&%%=;eQX9l(K}Gkoo^CIsqj? zc3CPJ?LU#6vS8+MhA&YS})Y^t!u0d%0g})4x14gkwWG7MWz!Q(9 zz~?nz>()de$joB*5?jJI0t6sgI}p?#G+A__l28bQrj&DFHtHLjQNUN@>~HHfL=-ar z%9Y)SnX+oU{q%%}abk}d)iY@g20b16=z8zY_njks9;&wF&~fZ0t6XC-+zyLG{YLzb zC||ixUTWEWzC_^Xl~FGf^GSYZ3j%0%~JC%%jeebEIE7+)Ku=qbsbCc zhqUY0a%Jt2c+rM)SN(3$jy5YotXyELu(v%}l>Bvf{0sfVZgSwz(xBv`+GJpNvK3y2 zPJZFihB?X%G;J7CiKN!FjX8ofImDXq*NG#FDQ+t0 zwTEu_?vRot0{0o@LT8za(F4{(g$Fbvpn9^x$^T|a@>{&?^OpAp_GT02VPy2gUOUjT zx=S4pBu?eO!amEahpW&kT>V? zNT1Z^23g5seOwK4_IAj}(5q}}8}H}|q=WAK!~O!QIYNP?Zt@<&S>oONRo}s{J$d%v zB6Jzzv?{#iOUfP`d*;R2RDF5SdvT6mh^9WBF7E9rQ!)2RjP2aP*Rz#%{Tp;kd!%#A z59h~^2iBVHkvT_de~k9mZ7Byv^^**=y~+v8kRF|K*%3RY#yo$M0j-g5$o2`zEF7H$ ze_Oi8KsUJZoB|rRC$x^SMssGR_!0O*Ry@)!g5!YG)HLY*4UYu!39_u({9II~|M@?b0h~gfv#sx|PZxwmN5AWu>=9zPGh$snCP_YW zFcj~+;ojW5dbwZZ-+aNodq>zAg|T6vHHq(T_?CxRu+&PwCf_8>pk6IR2_xLhOo?D! z3pV(X8d$P67y-|lJ^Y|6))QHsCckjt?W7XbX2`JjNV2M(<9X^xDn8j`8D31~y(aE} z+4c{j3uvfKueH1+(KLZOsn~<7->At1l|WDuR#y8PiDQr>CP-WI+NYc|?lhw)6{!Fp zu?~;32LpQZR(Jr+YBj1fH3t+i?pnEDAsjM%VWzF2k43ONrdBd>|EmyQ!hKiJTLadi9!h+Ny2? zaVnskRGLR_UvF4zVPgeFUAF>QfOGl82XaIPTSmr5um?*Kag;JYCg<6)CRp*yesW=p z#dC)0P6&V!N)3RiPZ&5;^m z)7m=A#wy@>aIP{Uz{vm$2nvc6Os!g#|J(03NedY^kp+q`Va1zmf}2<8ftOVwYziWu ztI^*7^kaPBZ-&9*b^12-r-s=-lAmSi9b)w;gjeVpcHYZh&XiWXD-g}ReqNTi5P4B_ zV?tUQ0mE!qQ{!sCYWDe15JT(etq7wiirMQV`-3&)TU#}XkUK`MsJ`9!y7((Y}0Ss;eqvu<=q)Zi*0JgM9j`EAg^(GIogwzgQ5kW zn9p+J(MbiZ#D-z+V&rur*L1D9farbQ=NBrgy|v;|v;BzQ)xTr{1x22sz`j<__d(;y zQuwFL`yKm*6*O^=2U^PTYwpm{)lSTY&-=vF%qu&dO1?2gFJ3Czhjmdl9&07Ihciy1DK|U$P_23C+pzm>JM`mY8CjsE;6){Ex;_GB+=64thTXm91H{hfVaA zBTS`rKxSf>w_nyoiYyf}b>+WBa|M*B_xI-ShENAX)QO~~GiM4Z?AjFZ95Q8qKN+tbyFjI& z!}GI_5hIb3(9^{ZZgGcvb=i60HuYALbhli1Swjmuwd}>4go;RJCJaNAG{1|c2#;US zKB@P^>Ryc-8;B13l$8rBX)J9~Y&GgM-L)BCyX0jZA?Z{7*qq9WiDwcgWzye&@i*$# zCKk@UX59N9^A>!;}>Q-gU*U+cl&nk{j^IXBG2J2!u1_s3hPkX zb9Adu75tc{1S)A2J0f2qJz2VvP58F5lfT7-lEl}(U&5`0Mblz`AgL~r@$sbZ4P%H5 zOZ;r7f*0vKG~bSZCtE-BdcAwzZARZ>va<@whAXfy#VId>s|Fp)EnvjGp`+M0h9F`}#4FfE)N%^XD!nquHY43q@WL_cNxM)xa@*}{t<@;xUi?OK{W=5) z220cAv79G6S&`#&<*Ig*gf`fiasO?ElL5^QU-DUK-j-@K*N#SPKRt<2_amY}$(#c8 zu1G>0=WJl;80SvZFRwH37p3RA6z6Og5~7+JH}{8*Cif+~$q}2#V{`~VUAR;b#{@qu ztOP{_gY5i%f!J!JIkmL{KLSBS;X&x!U`tY3+LkUkf5y|X*FiGSR5!rh2Z;76=CTsT z?I;QLIjmjoLYW2REp2diIImbYA$@YaIO4b@W9z z^vsWurRIWCmX~ad$AgJ|`6w1CPEGuPrf|WR1T!BpKs+9q+!g9e6}WaweaYg~m~NM& zry~76(g0wD48_Wf=N8o>)-XOV7Ml2|B!1g@D2IhT8yWOS@7BH)n_ucI0vQch(A*{V z0=2?ROmvTz=ik^Kl}YV6MkZ`NYhQspk^x&wRKDfpW$v;+%Omsv_SlT=%i-e|NW#ir zwN+lUs(#fns=^0L%?bpxXfWA&PtScGzp~DoV`@a)$&9rDbYW=}taHXkEGfIX?w78JW%CYT(?^r~)h!aR7?tX$f0 ztG+VIXNZ4TnxsupyyD=XfQ5Z><`&F}wivq8pcJ{`7zg+UIywKu!`@AEsuz(YdE{f? z?`JS-pep#xLqORZgAAovwY?4~kZjVTb}{-C%8r6ww_W*tb0j^ivV84OR%6$h%IDg% zO#0W+xK;CpEdaUiSaEWo#M_nhG@U7*NZ z;`tO>d-&KtfNmGj1ERU^WoH)t+t+bD&g{b1)f;Eq&O0J)f?JTnr}Y9W^_dsd#-$H+ zY98!V_}vWv;B%Xdpcc|$>f-h?a51%9)T+2f7J50u%JX8JK(GIP>#b18YB6E^VlHgc zzPc>j%{;W?9`+k?=QtuDxi0J!nv17z@nPB_Tt*pm?8RV_anBEuYBvj%}t zMy*(z1OBplb8W3}LaLX(m_-kE`Lj9+XYb?80SG5LW0eGh@Pg_)4pytKamrqI zn1(tVBjB|A#{hJiML|RY>pRaayDzyR|0sr`i6{bhj8HOW{U}0~@BTSS#%6*OYiBMs zQAi3sqc-7(q$(Y!Jzj?b_AoeZGE#o%A$DkMsP~&O;Tw7_Q5`(3Ado1d3x%*Rfr#Et zvvmN%{xM)R&tH0uXe|@i+@sw(cB0lAVnS$Kir&{NYYv z8I1e;Zs_Xue;cyLFg3(mxJ8ye&ya(3uIS^4-!ry%LbBX>%bwonwQOzr=db@WSp3++ zzd~HD2fH&xaQkAmB4Ah|mEXA4{uHnH(g_X$;pwl}O0uUW=5oXp>?ND*>mYebbV zTVb(2DH^1xO<@9~$3mHcs5)w_Mtv=+WGW`!*F5Pr(|kuL@3mx-7rf3m>E2pG`s&og7O5tSc?k-BPV<8Y#P`b75q+Lg`<&+G)_x8_6+R#J}XzRY9zfvTE8u8 zUHqc_)${H0YyM8cjCXZsjVlFy{@0W{6g8xL2s%o7^3O#L><#evGuri)Tsz0GXJ7;b zc2aW)!72sD4)vGA?%wPYWP{4BnK@%5?9H-*Dq(E7VJ`doh;xnXfbXY^Y$W5xmqGJJ zI>mZ%z_!eX&x{B1wHSr*Tay{zsvk9bVO~m}Mo-Dyx8(2RUpY5Jp#gO;kFsgemd%p? zol*F2|OvMyUICEziu-Yko_oKVeBLdhY900EsNlx>c{FP{C8 zYF{vcn5^gR+|pEqKw7>tg!9%NvBt9eHfvBx^TV>dp5Caxt0`wV`Q95)-W_~gSxhEK z;C@<`%MLTH|Im*41DV;IfTX038*3{7Gk?=W%I_0dmBSIf!0P98G*^WhFMU`bz`5~B zSs)DMSOZLwJ3LZwN$Ts@RuoSeF*nHUlH0iR^+Q^tRB;fxq@yGroiwzvhhhBNnB5|b68a;if+_U# zroIA_+1x)xMw$<)-FE#duTZ06_@^_2>2L6q9lb7f_L7HMZ(>>o`G%^)Prz89O-x`$ z#>+b4Ea;qv%>RYVi#Wc}nrHRd92r0iqHr7+{rug^_Cb6Q1GMFJFPATyqJh@F*+aiZ z^=~d0RbIYhTyatI(oyoSC zJjRu7|3;ybq)H|Emfp(Zgw9I^UP1xBw1jgW<^W>nM9i-8HO!O2K@^0}o!J5W#1PMD zFza`vZy<~bg^huHWz2?7vS<*3@I}41@tXduaoyN`EIC`Qpdkc?q>fRsiZl7oega4= zYN9CSbRei2A zJ9cUq;#N0VeuMR%Q_yc0CVz6v1*6mLj%%9>IPhDDfmq_-n-$q9ZB-=enK&WPN8^D)wFkh`n9g$lMzBVjD>Rvf(?ETiEPds2 zPO-2bdP&&v%LA|UtIIUg<(I!=Hm{H6UtunlV48o=XK@XfGT!_Lli|uCroAG{{}4YX zsrSy|2zf(A#Mh9~jv)TKuCFUH7TY@3R%&u4F9vbj(nm^PJ!V>&ln>11)nAicg|i)1 z>OOT|);vup3d+Oqz!hoI5GT4JHCbU#E(ZqVuGLmlXur05{R{r|i5gy)TsYv_bE<}& z%{5F^O-A%c%&`lB*qHa#z9u-BO}g-5bUmuyWWb18|LJ*Jp$@A*8~E+2>m&{?=WKMK z?D1jD?)NN!c#kFt4QE)5QaYQ7$3+dt{-|nW9fuTX#L<}6W4D@6UP*(*pN=lgzr7ms zLppC6BjV(4OA0rDrI2DWEOF|_xdvU$u8{0?%-e_2tOA23KohVX{v_{1{I~?O2o{d} zMWO@O%Nggg5sRHoNMu{`BY!yVIS>U&a#>(POs>tWZeyb=rI<-MZU6e@n@8xS$iA> z;c66Xpi@Zj*N)GQxHLNkZ8bssc1@*1gDSpp21n0&QGw~x)fF$}L{d-~ZvimhJKu$vz zh5(WM#=BS$S*?jJl5CCbuMm;D)}fjkMqN58a&|;uq@;{-&HkTq)t#UoFn!A(lX3tu zg?*3EnLUW?g#3(g@aS{@M$^4~J`zibDOM1BKL`BNu_0KHd)dgKpq!IS%`Y~)KA%@Z za~s~%K}72AvVE?}zIQWJ8f?3P)-{sYFUrz?G#)>b@Z1#j^lLIpco1`PUni@hrY#*I zc=h>gHBM}8ZQe}}qch`0BIX;Io%$r3@Gxh1vH_h8ME%5T*Liv&qf>KDE9w5{EM|cI zwGjTbJK%=}G55f_+xrf#33eYy8VEH)#^WSp; zSj)4o;*F)GaBS>CWjl+TM@zObpGt&dlc9S`?5Fa!uBXd|Sz(D<$)!QgmOiJclv{Sy z5crp#v-wSz{&!gcs7O0idivEALb2i*I|FBEc|7V$FDm%y3u%YxgdR6H4@%9%3-&~9 zh7i#?k{>5;Uh295D8@$n?JugpuugRkI=HOEt^J{d2B*-Mt}`LnktHfOVNJax*@Ten z2gHszIqYsL1J3$`Om6_l_W9$dy*HQ<`^2W+t-UEcc?(*OPlNYIsNiV4!H6DQGj|aw zJkm`WX#TyDi5Ou;Wd+D?vcw1lI1TDE!shzuKXYxw>*%|D1HfuP5kOQ! zWQ4N%c(a0ovT6CE8~UBjnLm)@*&#uw+@8G6d3k<6V06EglK=BPST665>$?AS$|;5J zv$>5s`sAEsXexi0U&dYPCT(0;w?n94j*d30+sB6#6-3Zzy;_15jd1nc*y zq(KMPS-hNasT@U9aC?6}Ti@JtXgv}YJ^CgfXf21a%QpEud9N1KxLKT;32oHrGBi*5 z?iFl7Ee3w^C9Q}(jCMJ1Rvo`^d6dL8GB#wz08#pOCtwul3kZT z_TO5qIIen&C?ZQ}a0MmLVtkouE)!DnT z5+XiLqGCz19e}HW?CQ%`^dV7?%+^8)7&uhtIo(C?%Y0aT!F`xs+YJ&HfK3jpFgQEc zJtA^-S%RIwd0Z>erhwHZ@&!aM0WVfL<=b?5?3xw=c9}M z5ez;qkpJj$1iWG7^&by#Sb$mnBh+Q< zpcfc(K5?wJjp!O+xYgp^flfgnx#MMxHjpwAmK=yAMx^Rp$5QdXgVToxWC0T_C)lHA zk9owxvjx_ot793Vr^}#-p$>IsO^}RT|NiR1t-@S+ywlnn_n3wMl*Pog{7KU=>oqJ( z$~yoVP+^1=gP@FKHxHu@pOOD(!aHLiesd$BBHp#P_P)^jV+Om@=~DM)9ck2s!iif3 z(!t3Fz1y@(I|VaWHKoT-X}XaY^Rr6iHjB-50W zNirr2e}GkSF{cA%Z2(uG5Jn0BS~EoC-OOdLuNzLF;RuDtUSRr#Ti~Dnj!j4rgF623 zL+iE(qT{Lywh8mu$0C-($^)y`y%3}arE&SG=|HvuM&EV~Y-G~T*?Bi5U9bNqqyx8n zUI4VH6;6s}q%10utn#2b)M4+wKzEe!*JE-chin}{hpZtKhr_$WEQN3+sx`8Ug+Kc2 z#&D8Pi;ztH=Xa`(yueyYu~O5#AV({! za1B%cBofO``*$YUHRGqVeN&mJv+1KE>vp$ld`O6nCyTYf;TUH`W_23GoQpR(X=nz> z#uBQ!zu{)(Q)~eSV1v&G7Eufr9#171*L`$suZ<<`Zu%EL4a5%K9fhh&r?DA$S4}Q^ zJ_(u@x}7lf(}FFCX$_U-syr}WwN7?eG~ClJ+>#L=s?b1`{v=d8{JsqtYx#sVS>YIX z8y0G@dO94zagUoNc|5(OMfbb;=2g_urlV*I$g^DEqT8b}Pt*86rq+MeV4KXJ-n(9$ zyoEeMZUm{=9&iXcA>ZR=gzBE{I;lS&;WS;70#g}sa9>{DtIVg?pmE>Smw^{}49@Ct z0OMpB8Uds6?w3v=cRN84)+a|Q+!7fdI-J=*J+{D?|J}A zpalJOzi14#9}c1qd7u`D?F%uVsN6Cs&f@2GwW^8XJoMU2p-MOMdi9aegSjX-&xI`a z%+0-dMlanXxX3`uE%qo(j^<}2Oj`T{KmEB*p!+)Zgl)yPG+utc8lK<16osuMkl1RV z6eiZAOMF3Se!h^ebdz+LTDbN~2u5~u6{XfU=70i(Aj(wQ*YmE#>D_#*NNRS_&rZ{^ zIBl^Y`yQYfcYFIOOAyV29~sd+(1nm&gh-{A3(Se5$b08n0A}w{c0VBUPRFPfG$s_% zf%qs>qwIAJz(vzuviuqWdnc|))YbKxj905DD@+DoZJ;=v$6xmRDtP%|gm)333~~QR zJVpJ%h6s)Ckcfi3L?NW_#-@@oLa?HK!vkV0**kAb@=!Z%a`!`jajn$))-R)-6M6(j zGrZ}A2k=GFbnZlL>C}(@C2){rguCk&T`k~}uJZ$*iQBo0Ir7rpBNwz!Wv^h!A;%S~ ztYuK1F#oH{_o4n~6tV(_4Wpq=!#aoe#0@0)f9V0xbrAQY3bAxcfWw6DBQ!2FRFG=;L}mGP;Q+T<+?r57F~x6PBu{%{Q8lGhqIT0Py) zcR&O(p&B>V$g=Qzeqd+u-?*`u+lrl{e@bxm=;T5>D+C4VW|W^)qVQLLs0Ik=_S5DV z%pu&AX9R-i#jDI@fF63v7OhblBg5Y><(O%*KC};RgjQKERW~o+X>&dUS_k|>(ggT6@3+g@7vH* zRfkpDcctFQHg6S=JCv>^U2T)(|BII?m)(D3TMW{c^R2>?} zL^N^m_Yk@0&^p#kN~mhNNM7m;4-o+rT4$LLmHNB@S95>n7UY&DbLU(_IM+fdZvPT{QGPrVwF!1b`Tm&E}WiYs!_S<&hq z^sE)YR(5D?&G!a$_bOlbtoxivh?9Z@7vm&gj6{8gO?FkybUYH%wDA0)tsau?i>_gB z)W!8VT>ob>oCkfh#Ym=|8|prxxh3>NfDQ%6@6KlEpQjO_KvbPOMBKg8yH6q#<>%sz zn$yBIz>v9FClSqyMPUk8VCKvUR?=iwJe3G+sXFBBy$O1a#+W+m-RJFV&#?Dd22e16 zqm^s$VW{1$O}EypiIG`c>*hL;GrExNw-ze%1BLh-OsLePe1U%?;Vb z+uupZ1sbDV{u^~Jv|_#!$l7lFoDsQN*w815Qeqxdo6&WIC?lccyhVRGH!*3^M%!QB z%f)DAWdAvn&RT{#WR(Pj+13~jW!Qo2%7|~LGE741d(D}Mn-L8U0zdP?+hN>9skD`P zWuJad1Iihc)B>YhjgMJrMA%YVyP3<8HUyJAwu%0ig22fLU=4U3_Z@l+x4Z$0zNF{j z%5Oun!FCgqowZU{vhUkOo-tQ&I6SU3WX}*~&^Xma;{bJKox2!1NiSGyb36BC6PClt z%>^coVfcw7`T{@=a^mx;$+4uI+CXQGZ12bYi}H!8^@Z5v2a58r5WuAcem`N~crJ7h z(M8Hl*$7o()h`Z-br*_=?YQ7ubD4a*C z``7^w>yI7~#*3*OkvrTL9W#50nXlW_E#alm*g>E#HTNC9cfjZ~z(WU-hE{%+6=UGy1Ui}ZNjMna?QL7StDcnTpYvF3yqWb?vGZ}zh|9bKE0TV* zwxQPVQIevI^WurNXU)0NwNvH$&1FfqMC_vT>TxcTuwPmIH4go^bBWTcCuZ>B#lP(- zrd0)*0zdr<+f_lMBSr@Sv_A*ayh@~Oa*Wv_ANFKJN94nKokC$qzni1fKC7wpz@W_u z{#JozG%izN}7D2uK?e;=aXIsAnLg|ekC_0%zoK)ZD&o=pKE+Jr8D_kPbh$A(Kk{IY0E=E!?IG9m9DWj!<8WAPh33QpFnn@!;l19II*B9QnlcLFFlj+4y=8tfMES ztv99B*a}XpX2sSwK#+Yn4(0@L(^2aBUPsMG=JzIQx~1O7OL?RUC<}kTtTB*1Ze_3- zz1C>J9};J4ZLctRC6sG-;NBuz_U0c`x%DvsELr-MXS9n%Ou>zr*j3@W{XcqPI-NHB z9ghCC;WlkWo(bkwOZ>||tAzObQ?`?gsdMhjUeJEG{XHd{8Hr`#bxDV1lf);Lv?HE+ zLPBaiX9H@{an48{@sg$Zz~k+r8%o^cT~^Yw|FT!pF+X`xmg%*?Hx7X9(OACrQI1_Y z#c@jTck0LCjXCb6`A2Ooc|V5-11lG9G9-N+&2>1ojM3$P303L{gl)$*OTbZCIo9^s zP|*xykO;rjWkLv7@cG;|NfNCx_Lo<`6Q{w;$vLt`NOXtGKVb3o){oS@;0CSW5sg#u z;+f-&hFBG7v;c)@lVwKPb*H2O`9kCa3kbB}R+j6gzh56@5#CfI=g819{+C=Zp8O)Q zi*aV;h%4~71k{uKvOFvMy!pbf#;l+PTzl*{Tz57p+^=I(gTe!5!1uHVAyLHY*IY4c zC)&Y_wsg_N=<=eD9))#=_s+jXlCru1%iX@3tr}XRI9AQP-|*Tp>U@C*N@rh0>+$Bc zwkRjf)F)%OE#nKt+m#?h8%jbwk1dWLwQ6GOw7W1)^?m<_wq(yTkC=21)M0{N@5JBt z{|Q|61&9mQG6jHWd(B<8s&GD7O#>59;d-yf?v*~ml`enwby`sPCyGp$D<(pCu04d0xU0LL74sF zR8OS4>*}&=76z#8BAsIJa?t`Y$Uc+~yZ;cf!kx?fXANXr`Kb5-6Xlb`1wazyfLO2y z9#;4OQJUEd@xkG&YDWBt_V|duNPZI$sYtyHIF0|a&2?+%*D7OFHlX3VId=I@xQGUF z!6etzJfFWi(I(JXfk9sV`M60LQ6>)KlA};d^q$xPrj5%w<2d=TSnL3Fq zV1>0e@+RWQJP$T=z)^4fEPAyiBBqCatdV9U%-SX{GGsWNo{_V_ZLx(aT1BP5*vG2z zD1-ItR@_Us7cRoCpOW2I5>!oQ7nN0QZvG|X;m`v|u>P?eu)z1w(M26U7}!mu5zlgv zNCkrh@3%apNn^t7;3`1dL72=gG}m1%je@`dzk2~*z5I(1B=)1hj&--WmA}1|d$Mco zOUGos64O=5yeFa3C56fX?F^vKSP^}HwwAV6I>im|gM}}bx|8rZ{x9(i$)P6#3{HBx zF{`k@?C$FJJA9*Gv+K;|fVsxe5rZMRB4aqnx=8WDBG%gE!gA`J+Ta$QaR!uoVNRh~ zW_cQHKAXCn^-UpR->lJP+!B^zVn~ z_57sfjxot5)_pF*POtXJ%Uz)W$fYmSgF(gLT~eiGOyk0NB;+!utgcttBZE&0!aR%9 zZwY0^n>kmouw}Tr@ip@ zO7vl!PM3!p1ZH~58$_P{m7KcV=^mn|;KzZ|G>WsQQ)&~u@{e?~ZqP|C4oNLeo^y)S z=&ER{VZV_q8u{BQq%7FC6YHmtVr4-6M|cQ>7iFB=BBpX^R^A|LaMij#n?B6DB56$S z&C%&r!su=cDA>so^OSeAj;Hx-BK#6s%7Fe*FK($m^*jjsTOd+jIgF$Po0Vs;^>7gC zBl4qAv9F@MTu5~z5@YpxXJLi>xbAe8j?Sz9+)O!vF%1Lon-)8!Ms#sJN>mpyTT6<5 z66{-~`>KfqocEM;DujQa^m@BI-4Jw+KmmELXgFqe52*ff!A-zrRB81+ul zFfrCVskN)MnCNI6i&pF069m0~1X^}L!(_m}pibBMq)l@8B_1dQ_PSmj)%L&zNzck| zW-h=32gwj<)p@MPv%Vx4jrD&gJ=j6Z>!52jpgNcA!C{gL|H@6)4}}+F!IK}Ebd+BP z2XmpUO#*L)q8zb*6an-5au@GT>bsh;kaj&1eE%q#B3iJJXdu!4z(9umto9;Qi@(!= zDjAt2eRj?~ewNbRlW3X9P?R;OR1seru z+2>L+NH*t;QuV2HL%PI`s5ZW2YrE3(GtWSFvq9;CBh#l|QW4A~H!LcI7MUW^Te?gS zR`Pof{phJIb343GU#1zNlp51w4T!jSe{wW2*=@XHHU_+o5Sfxwn=-Wz)Q~Fkx=ONC zV2HXSuwCF%1;-2#IU+C)t#!}n!RIJEYfN_vpy4;2&{bz}I6r|^%EO|6B<4m-o0J;q zoDaXUt@>Qo!wF(JzbgZ>G+J3)XtM`uS@96CL9FuW7Ieu$mnR&3NSR19K`EI(WK9YN zykIsB2xm%M^*pUM#;H}qX%chM1@R(BVkA$YI2<~HeW4;ansoK-TlvRJs`D<0oL4u! zl@dsY#m^tpUw|d;k_-y(ch#0x1pR&@(gLLj9MD-Ur^Ebbg8Nj~zM>L#q3kto0RK30 zHf$xx$c%N zloPM^eV-~3t^_KGBT)0xibVh#d6jvLkL>PvPr*uJJL%yobeR4E%djf=fknX1gq077CXd{fh!}@4P08%i%N!X>;fMNIVD@NV zi@2MAfTzjr@5glH3|hMFp@e2H%fg_w|MTx4oIT2#L5GiDiEBeYY63`$V;Zd+tX8NL z@)7crhAQI3aF~!~uU@F>PMLVBP^)T57I+ zt&`z%NN~Q5MXC#$D|QwHku+$${E;*|$uuHujkcsx2MDqfAQ!DwYr>uHvA=8J%O(}3`#Hb z<|MX9yf=ANgFacQMqMOqt`kq-&69b32)aJBG)!HlZGy=AoOziVSLVzEzq<0_k0p@n zIBMs8A#Nj^b0u%FD@an%&ISLtKwv+bM-10U*YWU7=hXsPMNE=`ln%|mIeGt^v5{n* zNcB!E1D;2E=}j05fHcUr!0$&O95F)QUaVn>BR_)r9?$pLk$17QZ$LP(_!I?20DFI# z2SfF)F5fv8mL&S}v)^I%@WxxW`t2s1lAqUP5`o!bUeoZR*U*SpC@a{uDH*Ika=u>G zW(MKQLAOU*DY08*ApXq2a)AW2s`|$K)%HvqP=-bc8X+2Rm>(nljyOBZcHwX_KGY%Y zT^`YIG{Id63}xFL261|^xy>eHHktz?G^v4ybt#lU#9@$o|I9qChj7mucMO4Le}N>m z=0sa(rI?~^v8>(C87LcfZ12=9)GVPjv!S){a|$z{&7X}i`e8w+z9_#RIl_nrRqLMI zD=ki?{V5hnA<3a}$72oT7b8EP*BODAwr>)rHNZ06Dl~l9`W^0E9IDYb$FeV%AHHkx?BajC&dL zb=6^B1nIy4RTkOrdUVx9zep}{aa2jThYeu81#>fDMB|J2e{Lg_@BSaI-m5NNQ>`KC z)i>N_t7DL`eZq?fBuamJQ4*{Ylsa{B+LG~r5(~nP01Nqd=p-WqAD?GRg6Vr=hdvg? zyQR=3L9_n>^FR@6hf_Owbe!G2)5}{uu50Fghto4uESj(@%pyE}8iav(hv(H2vK)$) z2oI2#*NgfJ_@qnC3~j-V<=sqig#mf^?ERQfAgN`^8p6Z%(=4h4w2`~v5}s<>&BoN( zRjz|tsB^i*^?(uJKnQAcWC?*1%)w459xYx$;nQa|>B30B)XoDwb{x~ioGZrc^!g0_ z{9J6tiE<#dR^;gSk5)R}O_`iI0-0K43T-Gz*#9C*Ex3{iiwU?)K(zP9 zx41u1Oqow$x|w`-P$^vKN#NYoH5%C?pV>+C3JpP$q$%_s<4%oAY>6yUD>_gxrF#Hj zB6j?`boEhp^K)l{fvRa|6MZPq0x>{C*LqSUe7mQKFy3~%EqDU{cA5YygkE0E<{VFR0 zf8G5lV!DGvyr^OywAMkP`CZ5mU2pwcs4$PnX&gZDLejI%&VV_ldT)7q(e~F@J$k?Q zYd90a&U1h5vIQNgqvZI;NoJ%nqR^-re1^d;*tW&oxq3P0d2x?hp{M!M3JGxnRFU71PNyw|Rlk)Q zmt?M3*A;FoKEIE}B4bq`{dTi(aj1(8WwpmUN=_jA`uK`4uv9L}BT5~#K~tq`F_)9f zn=%+jFvb>2O0?03nz%wK`VD8Oq<$?fWSyCF#Y(0iRLF8=-o|v&x5D0E<_KpX4|X6R zzh0dcj1zcQ98kEUh_BJ4!?IX{%?KxhKpQm1)=ut0+R4-ORHeozYFn9KNo37{SkXSj$&P7-5T-6I zwUDdTz9*^$zaB*T zU9aEX*$nw6bNjXb8RxZhW&Y!%8m(Fr#;w;b1Q4b9an^Pb&_Z2c^GIHU1t+MQpUZle zm5?x=fXAO?3*vFv_l(`Fn$NTV4+A!U3xA65F#2)X7f(zoaXV~^Kt zkdV+hBzl0-55~|s8C+Rwc4}8-S5l(hLVL@a<(G*si1$E1)wt12Z$D;;V&LiniCuZt z$ntS@KZ!y?5z`_i@WZVoha#Y)Vw3E`_@<$?Usbf%!Ipk=EI98X;tE!QsSIx!o8U%` zd)B*p$QUHB{ro6zvoEER(2~>1X{m*1bDZa#quFRu(Ssr$+uhe|vCU}2`n?F!iTO@> zISzujJ(1vUqFjM|_-L+el(Skl zJ$F0?Wj=47$vP(s*^=@!67&)MZ#F%{pI*iWm=QZsyASao*Mz5Cf%CYdB|a3;2srcp z{Fls2M{Q%vr56lx4gQ@@)yUoWm{TXy2C*FEKm>F$d`bPtw_>SevC<`GU z%}|G6}oIq6zeX)gJ3m_d2m(CKl9B*U2&d~AT)3>~c`>}~V%j(oJAq^tQ}*ScX{ z#aJ^b+qTprF~s|DY4gqLU*!_IAErgfDvm@Z$6Mxl;vmljl%5Rbb-Ytog`j8b>OWEk z499#4^jUsMU^1Lgj?|~*k!Hbxj_KZIOnUgYqa<=hB3I<0fwj^9djL|q1B!19lUn{W z$g&9EOfSs+jF8Y-5u5AeFs~$OVp#|Y-#Yb)RDa#joe#s9d8K8Dg5Y;>M1HsMwwqO) zdA;g>jI2|k_o5sDYw|(w%rx}8CAC9EQqvBJGJls-H+D^G{<#C&0VPNV*rtayx`jyb?qvy)({Z&Wxg-yJzL^ta&jxD);uk~h3i0$Qp4U_jgUqM=c1WXrwP6!_XQ?n|>bo+>!`he0hKBGm95JLtR= z8Y6#{KRX3yo7zuYXMs(t+c(6z2q}($oOiAaMmInDR#BodmIq)}t(jQS6le;B$oxyO zjWtIOQLhG5mU;vc~uvvQ^hdbY`Iadxer$;UEZVki(_mFPc-# zXltDJNKc>0j)y4r!`vc|Yflp^zD;nez+el>+GVs`er7Zwn$sT191Xhgq#@F02lc`l zpcgV2J{pkqMD2_IdRULqXfVD;)8Jk=f@6>q;=IGmKZMI&7fIzGK72RHJ@M^qQn~|B z5s+6%YB3zy(=AYO-=N~Jlo`VwG*5lj(o5J2ZDd_ZMT@QkcydBMA3!Dxe{Gz?>3N5| zxfzaz%byg3Xwq1>=8t|?TE>Tg<%6=fD{?H+*NG*UJeyXU7Nq3T&JuxK`tE!)siOb> zMs125rW35_K&N5ElWOF~TW)=W=VW}UmK0Rz$W!FXH2%lr`~uPQ#FNQw1 zr(L2nd%F1bLJ4to9c8RtHz`3!Q9$-CX|}I};K?r++(V^%XoZQ>T70x{wsu!$w%Z1Y zO*^VIfxEwQ+^QBv-|LDlJ)86qZ=fMr=_)H7CMaB=*`ZL@F#ONv8Z?z=VJQI6J6dJ+<=+)lFr_!wJym{8^Lm^h&^l5=uLt} zOHHx>ksc3`uJW;SK;Or;C_ic1>4j45o%Q)QGwVSC<#&30Wm*w z4TW%AmQEbnJg?Wk^hYDbdN#xiNj1U=Lw;LJcp4efF;%#|Kp9UTS}9KR=|yV1ZHVrMHPyAEBn zOi5XF0lr$~l*Q)^VPQ>&g)qH+zf>e(P=i9|-eUuPHmswj(;E%puxt zx7nK736l`MIP8#?=B3D~^Xkh@(~zo%fjrwwifxS3<&)n@)-X0S-aQs-a@F8j zk1eR~aL?rB0dcBo8r^7C=3vDRbRH@sO6$!{dI*XWVy0foBnt?oHKffG zF;o8Uk`WDoKIBML}E^%4Aa90B3 zY*UvRQ*B&LCy>%Dwh1E+BdjAQKn8aP8uV!&&?~a}N!k1LCqGW9W3rxqp{e9%JKiS` zTvuJoFbB7M9H%UfmtWDx(bCQaOR`szA2(URG?-qm6?te*%zsDxIb)P{N=ZkeR+k$A z%JMOTGxA3ys6sN((d(VKD9F9hJqFQam>13xq;lfF!dogoE=NC=2l`zFxWD{3<%P*wgX3aMr4aV$Z8bgMzB3gm z_!qBKP1~nKJ-z>NMS4@J7+ANlbwpy}zVf{jlgUOdp<|N9bEQ?v%?NY}H$TQi4^NijB4`9T|% z(JyYV7B6T?))iXd^BQHv8ZN7i$xeoZ13;yUT*fk8pan)o&>EZkjeDSJZMxiVNTo<)>}uLGHm_R1{!eG1%)$z(8kJJM|I zUJC?szz5;E|7Npd(5we*;7r@t6mtiAcCh$1`WpDg@1tjja=B=_z(f114la1pXu!#u zBRP0e89;w$9pC5vJ0sila_EcDWAmJ%s|xZruBZEf37ReXDOu`wGOmDN3@ zGpx526cEu=ggJGs^e0$v80&PqW8h3mMJ!u}35@noLTjP!Y$3@TJ8g3*1~(w z0k~r0(TvdzhBD!SwH`V-A94H9F-qw<#Eq-$tpZ7byEm;$v)5bkBVu1?Isq_AdD1d6!Pk;wu~_GaNO~5|p)eQ=81B%==}y6qa5f zKWd#v@+{1${Sy0i_1BF|xL16pe55}mf6a|Ri5b_>Wf<7__$&V9DrljjT8(D5sTE-4 zNO^dU%J=#J6@8nyct70u8v0iH?#g=lsNuyXTM<{(n%7Ty!;GGK6I zKFmA4iIx-U!K*4`L~`6Fk{AUHDtRh8KY|JU9?6h0JT)kr=k$H%Cq+G3tr8Gdt9%p6 zjti>7zT3v5q(;syBT^e!G;3$&6f$aADIWj+q!~9u;TR%X2G?C8l5Dqb2 zHL&HJX{(%xb3n@LsCmXJa1*JjJKw~L-8_2K()1UeQ!qi<9(QJw?NB_2C>NVEmx|i$ z9EAQ33*sC(nIQgTr4yoMmshX!#<5y@kxh^7fk#IB4I2j(Q6gtM)w|ed=m|DnZM30LR6Z`mPaFzzyP+Uj-YVZy~#G>1}XWOLmX zi*PB4)?T}WgN=sNSjj0b{PL?9CUbfLgaxD^z%k}_rW3DZq*KG*#X&8lw%Qv_jBViA zxy)48QoIefA5a5@kS7{7eQQ8fMTL&^rgiDOsvaf)X3b7_%180NSN0_zepA{iz%fxK z7U?sIJ0Nol%{9J8hmsW2zsYCl4vf~Mo_;$!CtK|1d2<7c1_I~#89LeBb`vTQ`(Sh{ zen?Ses+;V@twQ}aim8JhwC>@xChW9D*K)`r=ee5FGXW4(m#E{Qrjt3?O2(+VOlE77 z*7KhDELodjIG5;OuJW@Lw2e*`zaA1$JW-L~1hS1qutrG~!`HasT`m`W;4=iisT-Po zPybViC;JtfNFypd|KgAKk}^4HG<-QJ2}3{AfU1S;jW?7rI+~D(Y1P?}AGOzHSSc2# zFmAZ?HBeabZBJ2XClCas;+}igwOQz^9^P>;7S3mfk1D2&3JyRRKI$kj1u6_Xr|K3{ zCN&_SKSb<2j>Y+b^Z0M+mK;65A`-CBRm5J^%!X7Kg#en-_ZEC@rX+f4fy;qlms?rj z{z-7hJH)U!+dB|&*ona5yAXgZ=t|8eVs?~GjJ%cJBUyb2`S6FbX^!O!H(VGPv!=;O%3|NuA*O#J1hwx*ijw>Jnx+0 z6%+7>7>K;ryWH3TqG1jX2m8FntG}!}Ew};e22yW@;7WFOG1BDzbb_B7VXXtYJU`X} z<$#L@EDLmvt9?z3>3E{^2hznEvV_|_uKWso{meS)?cvnbS*bp6=xsk|N*N{To4iz| zLvS(h#sm;s`Lejhm#Q0EPo?DCa~M6BO~;nduudA=?~WYF&K? z=)X$gW7Ln-1&Uo6iSErw_72{yB89Xk!pSOL_*>z$o7I&fU}I`Gq=p|p5@5RO^rBrz zb>jk$g61&hwytD>_fK40Gc0SrG~%)~=2dB4!GA0oE_vRxUP)5d!$dSggH`4!fhzAX z(P8+1scLOMYI|hD9%NP?>5&MA$1)${{I}6H5Ms>$ribt03D0RoZBX#NO#aVpONzg1 zp5+2fgnGQ?8I^2p|CJZ^tWi>LO8&B(DYDXXzxA$pBxBp0B+7EP4L`N+^~evxh~!P=8CdeW!8twdih#luW@o<#xNoK?HCimxTAX zjr@rWXJNvd@Ky6>%sP&eovGp>NI_cHQ!DPBMgVe(io;LcVUl(aA=XK6egbx)*6K0R z0i=XPljcCKhjKIBFkM%15nem`=Qy<3awSAM+!Fg<`Xe2`$IWw2i=23?S)Z&f*#YZy zKovc!^Z(~t^VrGcVG{aAS$YjQ>2Gpg7(Jj|Iykhs9m0m8!%$DX>j;Oyq~a*6!h8i0tFd1w8Tlq1U?YcezoaMd-_x#LuU)iOWn zr9hyOWBym);vsQqyhAR+r0Y8TfOUdc=xHd*#*+p8qr7+FpC1FVUj7EE9&7{Cjk3Ny zg*J$4lskKWK$U_!4$d5`w!O=$rZ&P`=?H^hoXKMt1RvsdX{pQad6MuC zq>B||nOW1px&YOITXkuyFn)OED6rtU5?80BT}ZMWIWoKqlJ8-8K&Ap@$A;Jv-j~~J&@7GHuv^CA+JkdNu7anCgn&VRk2`+a3*-yqt_j!z zZFQOt)2Q0Oo{hYgqyG$o?XRwos9Kw;0W56<*z4EA!x}!vpDc+%QL5CEd^CvNCuf?s zQ~9==EyAEIG3$gxPqz>*(pMPsQr9)Ed&c5)#t2M3uHfTDV%maPh!Jc~<(3h!kAF|g z8^5xm`HnD{Sc$gfod{BZ0r|@RFTKa~C-z8pCL^853 zQ}~Jr!iZ{7&*7Ukw5IGPdY-^pe`I+mIe$rYzf_-EXyU)7DQO~e-sulN!IY>cLS^Pt zY{Xo+yU001QVNeVp$UCD_lT3;g-Z_mxl9FH#K7yWsy$I?bK^r5mf9IpFxcIA$HAG7 zwkE%di^9g6uWLx!L2u%akjw$vxFNPb8y1o;ftM#F*#$ycne8+IoJgfhE&`j3RX$_VJ4I&MP{4=@mk;H}69Sw;fY=|LZcmHQmwx7D{Socr z&XVI}0%|$Wc4R-M^n?OiHxSOLn1)u|*`6anr-tlen9MXF&nb}3tpB~_K zt0B;hySpKjQ#FmvzCI|)C@(r5-RoJ!jpDR`JUQdhKEHjEU5`syQP9eO8j^Vn8Cp3H zx(MzOrziAZ0@PN;N}$0vHQrR&3!N=mBd{o*zX<7@dKE-%iqq(lA*u^R5Pp33^1#QX zy`K#q^q*fw@sj1`<$%IzorFi?!L{>XhiqU7N?4=mzUnAHwz`ZK9BzqZx0)BDz5Ehr zm=~dlJs^w7lt?3!efffAI5SsC$VYCny(~{8NS1arHRQfvp05_K7VEz|Z07$lz1&$v zCqjQ+VRlC=3}!yzeg)~P8L5YLOH+Ajf1KkMukWqm{x0(0W0;7B(IVdI!8Z>NWTBM$ z1df`YayBOfBwIK2g1#*-JPD3nR^S=CZ|m&qRoz?0g=+D$8miP?Q^uCR{c#1$ zzmR@;R)r8}9jN+T0uwVGauJLlU1(|^jy9Sh(WaiR-g!FH?_GR7;Jw8L%e&=bkdvKZ zn_9O`56UEz>u~G`-ZT*F3f{Fj{>UIgJA9h7xXAVa4z}m#J zqmv>#f6D&4*}>?#x)A&Q>29AlL^nU*Hj$RlESJJ*69vUNlhTfm78a&jkehw^RR?3_ zI&m;>lK7uMCI~Q6QaCfIpu$DYggdyZT=#=pdI&Q~A((R)xgAjRZ&^2WgTGE}LwKf$ zI>U?yUAOXBy^MUvtFBUR3ylM`pge27w$1S_R)}VCgpy3W=Atmb<%W%ywi@UD#rU z*J44j`Lu`4x?PYD4dc$HGE1tsWrq-tS4++Y#dv%M{X|0n^uRV!ozBb2F70q`fs6&b zJbQn&3M9O<{OxE+Pm{gF6NzW7Dj%7VoQgw|!F;og5Hw4d$&V44K&Jz)w>fhU7Lk={ z;=#CKu}yHVcQ};-S@%Dw6lL)_-B^x_vo7_vN?;{qxX7IEhs131^IUje<6oyF=KOv#>yLk3yu}>CS%NR!BdzAXk zX;g)~(46S6EtW9S^(>>bpjzRyeyMU)7#{CK(|Dl7@DOz5xlpt=M zw`qqbb)9lH)@_cseTB)ej#f^WC)OU>F;Ma{~t7m@wmQYO)tgOpe zK<$B)jdY!LOY*=C_|#x=@gt9%56z={3Wr!osL^@}lsF5O4=M>^dUZxb8mKKdM~`!A$5y)j`1ahd?H@)n~2|2^ot^Bt(tfNjfJ?6X~m&yGR!4z5uSTr+yMN?H@D!gtz4dS7i@6hesq-v~&>U>87@vLNT_OU(bQ=MlB2ESsrci`vpDdMvJ;za$)viC zXhm$5JMb#j%QpWpSNY|8^|t*AHa){LNF?N5X08)QJV9)Gf_t3KwDW6;-bzsEqCxGu z76XP^ zvoZ)1G+|Xv^-PorB(fden3BR;vFx1jX z)l2*Pfg4nn{25ewd;cD&%5(X{bK46DRjN&8A}VxDpv^(-?%5I&-b`LnIf@zv{u4^= zmKt$Szj*TMt4>I7YjDr;!B{eoV~+SMXH(=xPGr^Jz02p$|K&^%N_cqAt_JmBUruP!(p!&!mMU{w2h)a<2Fn%l!P1})J!)EMhQkd@Mh0on`Q2h_`2>oe z#`9_3;HgAJV`vStm^h)k5lvaxq8Ro1YnCb_8ed$5gxcvQr>}T74T+>MoH+RU;3aC` z7qJR)ZX*4;C}oP;52E1Z!)F|&o6c>Xvk+?_<55?{aqwN=K>i4t4fjzfi)5@S@g6k_ zX|^Q42~k1rqGH$kuuD|t(|}p}Rn)13-LKhhAm-=(GeBtD#B!OKLha~StS+0sA4@Vr zs_&F`SHX}v6rN$I!mqsm7z}wfmRkq=soWLo&2B7W-C7 z>!cnT^4~$jD?Ulu8UiZN@NCpbJ|vK071G~u$~o5nk1s=1NHqWF(b zV>bggX!Y}J7C%6=4hxDgn>A$aibZJ_tgB1bqC*3uIbBitD3yTgmb)in{>8a=h2i?f zj*Ie3G*2BoPZToLI7gro9}H1c-R)SLyE#En)Z-|}znlc`Rr zS1BZ;ccLv?KQIj9p?nPb>T7Tr&Xnu{gb^FG1f%1;awX?mm&>fDX+cTEHQ!-^4UpDJ zS41mCgx~AUnPo$_-r4x9x7D|}gd)X!gbz6|YMoj#8rtsPhp39=3eqRnR6Ul|_FT&| zSvcDE75zgra==GKadikIyD;y&IhgS!?F7j0hEzXVjXl1V6dM7$BiZZMy-sMZvz4~H zYTK5BHzojm063FTT_WqmR~Y{;e}PDJSD*}~9mw}s>iakY>Zidp>gAqm|3{G+LR(g= zW`a#}ds_QOi1?L~wRLo8+ss?$fp(G=hP5ikbathDT33bR|C*wLX||frLOw!ltKw9i zg$f$5AF0wB(YK{wp%brz@{nw^zJ@Nwb+yv)@gBVnJa2Pwhn^5x%pO2ncyFj-l_dsW zPVF-5;TY@Fi!enXDL!3`W#5R@Ir>|d>Lnp&gYaj$TakYdX;3;o16M*dwh%si=hWac zJGmLJ;Pbh&f3FyuvG#vntQ+nqhCW{XP|BpOiH=PBE4y@$Z3%*xvhjPOmO(1H@??9s zYeW=@E~~Obp!;3(z}UAFeP{n9ctpD28Au25jBr`np=;4{5$4MvFCe|5eQ5B1HYNo zT=3AoY6#`xrqub%Od`a_fyYi>TKom8NUjn@Gjsh2o~HO@_MMjkcvj%t{@PPk^yOS) z3bC2Ay+7Vj=JEl#?Uz@k>3JWQ}Z6LB0>ZtW5Xs#|jI zGuHqnXojhn-4ra7N^iEd3cNP=zDg_oMWA#&JBSN%RIj<35A9R*TT%m3Lx4&28rY3JIupC8JJgZn|)8-h&P{D(=+Y_b`6^>k% znBf)5Tg5N%MXZiY|LnyadZc+qA~ol{>9qb~`Ya+!5?BcJ}B`SC(EEq6x9 zIhQbiZ(U|4ry6Vt8(FcOn{eLKlYk8yD=Y@1$}Krru@RaHV3z^4)H>dv{F><+D&#`ZGk$lw3+UV1zA+20pH*PpUDufuHKhX{qh^AeI3feakx8CCRP43 zx5j`FwKsz35NN8`>+c4a(PMDvpPc#DzwooLyVzv$)vF?*TAzWC8tM+cYm%)ajvRfT z^7e772&anCQ7M0k1JVwKR!ql+>hMdp(7Z$SV(*ZTk%_talO8J#q>0f1fj*_FPoxBEV~3r!m3zrLWIm5GilwH046jzqKf$BBVg#uAr2*bOVJJzz z-&_+wi2MylH;Y?`OT{huN)!GorVRdu^p7rthg zQX_P@MD!F90;+W}Ae^bKA=OdBmBv{Rmmi-9&*)rRH^C1X&=xZW_@$BFwMWdc{o-d8 z3ydbo-ov5T#PApf$LK*)G#F;we3is>1TH6r-s7WL=?y!=VQosMpm2FNtlw1F#OFt6 zy_+V<TM)Y!SC0o~;FLELz(R7nAr|UyZG`m9hY)Z`1 zLrH9Zc386}oAxrim51W^2x>gg>J?53 z1GV#fw^Niz5t%h5raOE)^V&zvM22d`{d?4Y4{&QPI)3Q6IL{606k?9*a$+8>$T;mh zOMRjRP+AQ_i1*|in**>qy8{|uh9a}Qh9`O2f5N8DGNc^$IMXOF=x&hCP0S3v*ocl= zJ%08~X9Sayp1ryPq|XxeINvd;gqzl(|Jpu zL=NqPhiSUUNz%q;0LK{LqWhG>AF{S7wApEf2vn!LzMaE-{MJF*_~FkQBYMV-sP&Eo zFPh-YQ&!5q!rO=*w36KR=@4JmrYlF!y4;loM38y~vi$7S)bl#KWR`6~v$|%v-(l>a z8hAQLI69QDwh8;(9HtwesEJHLL0{5ald;9CJo=g)-tTB@K%cpaCSeRBnw{50ni+Wr zx9R}?Mxu!M)F(`QnqavOO?!&C(e%J=!F_>^@F!S*U6@#Gx1PYcLMOjLH1Ga$Pt9e` zOx7&zh77X8SvEp6$mWMUg?Vf!36qs$I-~GJi$~QOqviGM!K13)jwyaFPyoN+$9hKy z2TldTbhCJRqg>uAcwRgPzvyY!|GV(HNbe-z5ANQ;wHs)HZc|XNJ#XXFL7b27#k6>| zitCk;Ivn{Cj*B-Lu_=sT-RioK5@Uq#{-b_gJUYo0`O|`^?Rv?{;|@h#aysPb#)IXE zqiv3Ac0(I_MgWrD615okW3b2qc@iv#yFD>CptgEnQ9Z*fG()r6Qw{3EAYBLYR0XxJ zvm@F&n3dnF$;4`QI-aLk_f#hX>JX{>b0^XF?8O~x(tuZ9ln=Wogx z(Vrxf7da1!OX^(A)I=R*VaB2a#Ne7E6pzlQw#bq|Ijj27z_l}1+b1$I<_R!@YAf#rFRbV>Ppamp!?8RwWu zxOz=g_&_ya31RyP!pT53fEz0GJp#}_I5hOZTG^SGl<7vvvGNzt_M9!Kw@K`ynYu&? zYRZ$q`T>$jaiT4)fUnK|LsjiTCu~jqv(`KsOXwdvy;_MAw);@b675gUqqVi*1~S$&KDE9m9$Vyris~Hb7F$bLyIo#DE}Q*(E46d~AmR@<$o;3~bIS zxIuUmoGy`=dokh2G>1nVjVskdR?b+a zu_(&|Ki`&iTf%62DA+*XRdlDiudjhfl+gJ%y(XyltcspXk=VGR!Q>dK4<{3c-0a*; zS{>Xk+2b!2M=~NgCS_NK-}jqnNd>s|0j;@oeq_a=blShroD>ekTU~M3N4*Q*Y{pL& z@9eh+VQ*fh))Lc@6w;%3+G*Z)bu@eI^YPITXrtdOv_U2g%hW?^{HQ=Zh&+R07Qk36 z3)*d6VYQ_w`#;V#Ce$wR%=36p^K*=svKy>5RLQLz7vYkMw@#7n&-kdOmLX78dby?( z8^PW5{JpJajps?e2ePTDJhXf^S4Pmtr*WHJ6z&CitdSgMf*V3WUVXGYG{7%AO!9d1 zPBcvA`c8cGnT{>F0FoM*R%~3Z`^45V`kV{KLQsr+?KU6u*3`VOwvyg0g#^yH*pFB$ zXP05PPpf&@_lezI0njTZB)n4EWoz*`hRq_#uYDbF>xg`G<)sUZE_&gQsQ~u2WcB0x z3{!<1Ar_oT6Hu($1UX4AEL!=&1^d;GfVea^Z`{Jppo$v8H@gzDjkkvOcqF(au*Gld z!Wp=)cSBvg1fvCW3@?=ZUJB!_5r2Wt%K6eMs>{mXf8Ex#jl-Q~rnh`Ky}4nctWMWH ztze&?ss-o^u!7n+8%HQZJ-dBKBmm7tN%^MLSr%hf%I=<|+*YZp>1Ck^Y+83{C>0}- zu}IglN?HiOBDCHiI)b@gMNfhHedRSHp5m&%h&GUC`#mp6xAK?W zXgG?Vxc8;URZ2vuAclT475esdCd^kwllnW%Q&617YaK<#58c4uqoQ_VthL3S!LGMQ zZa{t?Go!>~F9G7`VnL%+{00FgXANLeT0a3U)<^uCgRdW!dV$NVyeTmjt*IY?b&$5)Y6Tf}&| z=l&0r?~%d;NP^sy_2aK$`bQEM!8JExSP0r{13#S!*X{I1>7dD}2#wRZjLqc7D$7%w9SA%p%%WJzO0c0%CK*HTfn^H8SrkD&D@~u1>TxDI*lQjJ2#QFg(>$uyZ090>qZfDD#CiP|)5s8Y()F5+(cKnUN&@ zlNP{QFpcI>PB6Cw3~@ICo+7qwt#?G(8LOTlS_cmYSB)`HITfcGGUR0t4i8)=d8wpb za7_jD7ZDYLL%;!rV$72cTagqxW*zGiGQpZp?$`|v5fnC)P<$VNwv+CBEU>^wCpfO( zOCwGF7D%HWe;1mKX7fajt*}`_T+$-+bfOGEyAE=+ngksiL=f$ri4`;ha%~SyqiCGt zKLwooa+PC38eUIku3>NMNoO(e1GTY<_vV-!TcfS) z(4nJG`NYmJ|E`5lp<_eiW8gX4nxF|~GclPOX?=7o*i3ihW5SJr%Td37qt^8$RZ?r9 znHvgxTxdBbL(+@7K79RtpQl~hePp^c_r1s$=Qw&!gINC!J{XEqm|ssCn_OI(B`f6} zQq+B|^XU1?EM`IoLH3g%<=sER@7S=CRl>l0mJnX0^gC;Z)n3%d)OLWo03b{PTXe2< zMQ;h4LuyBNM27xNlgPpQl27ycEAV}xNIvl!=CI=n3c+X1w;+unjzATi z2XK*Q*wbS(I84&`CI$l3_eo3Hby2RXpuUC7z>Pl8OsM z{WL!d$SR1Yw;pVRewO5&Om*Iu-)Q*N&e0Onx3C1@C>w!s6&>b;$*SCyD6{r#oekn6 z;0wy*(7@kHfp`oDfmICd*O1Xq9)X09Q}6XgaGOweBD!+|bQOjRCJcMC*7hA0HQsL- zR&!|fjP`sT&Nssa8B$;lWLqa)lz}`)PK%GALj2y3Lj%ZGIJuiIvZQM+kpRe|K9yWz z2%d6_lJ`gZ*2Swu>XjOWLgVXqd@@=I)Q37UuB<}OA$lb3BkAKdBg;ukoBB^l+MVX{ z{`ySb9&P~N45%1p$D+l;0!JlJ6>_b$c#S?dV8;D8m_9NK z{zLYbainj9Q)(s!+5=*9>aGQ7>>V{AGuf=-O;xCmi&fh-kJTAM9d!S?Zd&=K~ewbrFb9MbIfRFQcU0d)w`|}f^ zzWmH4N0jbs#~N$-kI_f<1i;H2W&V4B_R+^-qGVZw{@$Kpy&kVMyy zY~^!~q({~II4Gd0AQeG>Yx#Ln=zhxMf!3l>m zSa`|+YYeyEqvm!XV1u37!h;^bv7}D$w)Q(&>>Jk(TMZ3wuZ% zw9Rx4Dj=tKyIEB!yZ}PJ*FPQ+pafz(45ML!`qZpwM7YaWw+fF5uR-&xGgcC1|rg$5>*$I5jHq`q6N3md5RDeTKrm0*eJ zhMT|_N&*X08&8f!{dYcTw4X0A&&YO}5B55Ud%U(KoabKK7TJmclK~WB>QNM93lK*S z(&Ext|1Pt~ETzv*q`P^%O;p-~4lG(GKdy^=CXqmQG>LE@Rm(cJ^*YA%%1f4W{D@hrp-(Y&D zIV*Q1W+Jrg?ZK!~FE*%E`}&9q(_u_O*+E!bpVW`EaZe3XyIuVNG5l?s2+E=xfAGTM zIZFtOhp}iOHZjy`Ma=u9cxz{Su+*3$Zu3E;gN$D;fxg|#dOjrwxoiA^5JCq6t+8ZK z{5=wpru71+wv-ue)s5CDdZbGGK7ZOf;@Flol-n;|reFYKokq*;=6ard5*}1U4&y4 zuu_A}vy{U?zm*HA!yKA`%d9vq4|#nxB$Hy_LIpTGJv(qU$cef6k%$UB1_>!Y1~)3A zPW4JU^v>8L8j^>&W+_?NI*t9~!(}IAdKwBX!`iFd0df<&i_0jusqp;oRzI1II!h6Z zQY!HK;|y#XL0o7KJN|?76BYX_Q(|ejuG-f)QGCnz<&f4Ym%cGAPTz>R+4FTkV_V;7 z{LS@icDuIHnr?^$7W9~$-TU4(zY4S@MCI?ii8-QXk0W_F;F2WeW^a9Ss3I71ynDk~m|>ov$@M;^m4{Bv1$veWoARfOsPXa|lPs>V08as>bM zlBmw5lX1#|`R>bgr6NSZ!z|l${q4#LPUS@O1ak9LCDxjicPYQH*kkO>K100-u?oUO zw1wp+q;^ZTDq3vTtIlm7ab5rby+#uDWI6R+gX(;-6gs=+XS1h~+EediRO@aZ-Qnn? z7f*%sC)_X7S0BC^B&;DKw#gh1jsZ!i+=B0@^*)WI2UHC8+qN@T%l?aeqt4R_39NLQMpq+gQ#HHrd~vOo0|8fcBKSe~E5-1`X+(N^aBjhxgg# z$|?6m$DQvm7bj)fwX6W1+_hTGG7%ARLP!mfkiM3tX}sh_64=FMHvxT^^zMH3DHJ&^ zXVVcfUv+rxcuab5nq^QjIcF#sE?fJkGD(O?rUMh2!6gNS?*f@g@6add^&Z8*9EU}X zQCVX=JP;MM3p%``*Yc2V6);U=3OY4U9u0Cc$|qP6r4*D&&ep;`0NF(`0SVo{mgaF zmjXyTI_6kF6T7`AJuom3!?UaX2VlNZ6cwK)mjid|*?&hW7^(OP+U38%qM8}_g~OyS zJG$rqONu8sPk#Tuf<#n|7WkI&DiiMz`?i8Cfk# zxVVaF@@8g5n%+*vqZ7~>;o%f2pbuclsm=vpKw!-r!Z)xQpQYXTIYz2)6}X#RjPGT7 z-QA`h)@>xj=v_rgjetD>D)KazZ~f8<`8Ko{|3%H?ZhV9gZG z+?V|9zzB9uj(c%Zz(n zy7T&zzYkJjTEMQT(4M3)fi9R6;C#9uh%J+r@kjqfau7TAQMg4du2!8MBndO*wQRv~ zkq}c9jUs35h==vAV3pcmLY?8Z8z^8a&J9b$d5NUIw<^X4=RYBM;MqT*0cKUIjlNDF zMM-jSUJAlFIhkw4h=+aU>R2;a&7W5BIq-^dhQhtO5K3d^SDp^xhIG9={Jj8gn($`X z*N{U|_%JA+w|`88DKlN+W31BB6E1=lPD)u4wJIROuX4hjd%c_kWl~&~2qWMU4c_3N zHov<|D>>2y^r4+%GbFL(kC9TK{%o}ZP7;TsbjFlQCl{Rmg8u0;yO3O_APN57#FV$9 z^ii9hVAJ5raILU(bx#pnD}y!}UuwJHbCQX%w;G{SUIV--9z<6jFk`$kU$qDCk@aSz z%mM9+wilo6@fu<{M8+_Ut{Dw8@NSgrv+afM@49s!sYP2P$>Z z(%h!|qP}aW{AkyjQ#l_9?9DxtMk{md%6@4s2CEsDYA9vq!wY<%lViT-Tp{r&NAfwS*67nY8MxERNE28a>oV!@eqPlH3B=T*@&eM!`9T;PFq81weLT>pDz#+ zLnMj`oLISu=g)V88z}%aK+3<@H}d<-836dMt`pz#NuT+*kU4A9;+rs!PV2=W$8Uoo zvvPZro+g-+8)$>`hg6kBE`qu#f`^i`#jPt9V7p$@7ga{>m6>(CmrL-hF1Ldm6H^5?;M8UoA zxLsmXdOW!P3<8;9$jY%tG`!mP%Zdwgv4tgG-#zAZh0mnXIt`RbxZUNkqA{!EMCzt( z8KjiG59{DrcGYbuOcC#n5Vum#P6fJK7R}_n*4(?w=k(~~5KHK$z->4N&spdzT>K8p ze?6&IRd@mKC}8rm@YhvV;}JBA=Bx1({tB20n+q-E#k*G@v|HYGWy$mjX7yu1Vh0lP zFd3Ejk(qIyX^OpzGu!tMZn}ZM1$P24T-cwqcFINH3~}|(prU}+h015xXe`3l))48~ z{l9%%e7Ru&1-iU(eA0%0H;^i6%aVn;R&%*GRiRsZ89<|_pM{J9H@RudYDr-4eq)`@ zf>fgKCOd;(KHbYKSgJIG3)01Je}Vho>^0u>D8$8Gxg{JL@@SrVpw*a_X}K1#G4-;! zSI?#D6{%Q(q2_nGSl)03rtts9(HN^0(e5-%tS1wn9U?GZSW8{9zp8$ zb{H0VdF)7FoKEiTd5;pQm>esSG5Kk;KMS{>_PCjt{eNQFu}F4E`zzClWb3cvmraKA zHh4Btg$U+WW$eYF_OQ**fSjF|&XiJ5bf*uhpKKX~6N#_#Xo>=UKF#tm{%}o|z(0Co zpVPX!5{e3>gia@v1!NT$?KqNSg!ez#p|snZU;QpPLrrF-D|cf23Q0~@Q}%oICD!l5 z+Or_w7$pa0c9+!O1RB3HGoRXhj|hP!MRHiLNZs_mHNqva9%0L~=d?7V_AU#@tDGPc z9GSFU&jdc5J~PkLcBJe0FFXf8<3`}zdx#uhfM9`M7Z5_O0$wZ|EEo??bv*W{v zaUY-!W*>;dpm!dVQ{c$HJ2;YUAEWfCTmPyu_{Ux>zc({T$fIowc{?R&fwTM+t2|Ps9nM8=7 z+}Ta(z6|QmrMkAa;Ksx3$kI@VwM-^@`+Q%ti{d#Oi{Q&xy0Q?U%+(6t9|)~e-upY{ z3iYMDA~l?q%8UKcwab{v8XqiCqeB*t#_8%n=4R9EqHGq=L!DkTR&itH1>IVfJ^&aW zDB;^!qRzY7b8RU71s5P=Dlgs`oZf6laCaUKRBH0F zv?MQfmPfmEcpO8|=lZSwzvI3w{3?ASE=(OG%jEzp^r^u9T%FN6NVvh8R`U;K4nwT8bYx&fs!qRA0C-h|^fGQBu+Ccd%utjZaj1|d)gBIW>@|x$h$mW>3xT0B*iu|k z3o^m8mRj1}c;S2LKMM4)hH?8c=oUz-dK4A4t;lh$3oNe_F`;O<^s$-GHwj{t7qY+& zUmwhfj=M<{mqma+!I($dLQ41cV~Pl;o(1C=Nd*)wG*HO4vMZ<-MpU_3GiwN(-!ou5 zqPhXS($}5D;GSBmm^p54q0hlz+wnRRlDkMX1mfc!Yk)uL0Xb|-E7AO2QDp`p@x8Pe z@>P|C@^3X$uOJ@(ebaHVr@e6ChUO{j=%%oQ^nzmyyw{zpf83hvJXP`FZf^5w5^kyH zw$?=NYd#bzBz7#yK$@A?X?i_{G7I&p8c0zN)-Kjl<3^tG*m<=g1V%<~In|;_nML&A zrE}R!Qdegd z80zRL=$EuYA))+x!A$#k9e`s2em6^faM2%yW~J+nIO%Evm$*j;s=cy6TCc1I91*Hr z_syxrq{1jRRGzOhzxXt#NSQTE7yG#UuOHu71UeMs0hp!$!!9_NuZ@evg*5uMP`D#S z)QY0(^*#2^FVlC6J89g3tk(gMVTG4Wh+ zCXkvT^EVHlam`t;p-CuyJ?C6CRdG6^XR0(Y=<64*k-HOYl}lN?20h}AvmGmQNBITp zZb=Id&(6IIUw<5 zDZ<^UAGz8^o0gl5kBeI0JqcZT|CYlxwGE>%L(Q1nj5gzM@(*^>{-x;Y)RMa(e*9L% zvyQ9`?x+7IXA&K@H(?{MVj&hGAQZY{|GPNTY%L3E0 zxikNpQ$CYK5>!~C!1H?%= zr6+F1TvAcElr4Om+Qw>Pw&5DcYtIwaPAASj7Xp?94Z_E9137sxKCjd!B4t_hb6`Li z_7DND9T=jP{A2op@}N!#oHsLnDkg$rYz%dKh*v`IdUo~$&^n!TqkO=`@zrH7Wzap2 z;L$M`jPL__Ppif1OfBRsM7%KnFn!JrkiZO+1^evm%dOHxWdBb?V*qiX#9@MqxpVg9 zB)phT8_t^bhJK z)E&EVuiEXJZPq4*7KBF46mCeriKY2{4CuH0S%ahc6aSF=BdqzMSdNp^f`y)~+oiQR zV;U|H%9Tu53_>Wr`oN|yTv9@gLj)Q)qz&1XSy_n25IRl zA&HOQTcxGFn$n4%Ex{#sb{T#_JXA&&P0gUj;GyR^%2?Wp18IcyhA*~D_i)Z!iXU?z z8A%ZyWdpeniD1MoW9~Ws)etv4N{}i(UFsFoT@iDvc0%n293%Vq83ShQ#jM~PsTn!5 zCz}eS4O+d%?0N`9LIofq!92b>;AUm*77!aHLA5M#OCv$*s{sb!ws@%55P_g);>U0B zFsR%@AJ&%w6tm7!+@*Hg^e3%O89G&sNiybwswFVEu@XuS{eU&mu9t!_3jRT{J#F~W zvRr{pX8?K+pctmw`OD0D9*Lzz&0Qs8#Kq2Hbq{~Y@Hy3`UbfK45XiC3{G0=h*9 zfQ-T^DdK)JcW2t#P+j*Lmul4sMc{4=1(=uy3a(5GwaDY(= zDgU=e?W4h{NHVykcb#aY{?*J~#H&*lLz4J7)k@Czshzx4yCknF&uD`OE@A7X_NDA~ zY94Lh%Yo72*sN_dp(%9#vlb?Rktt|s(R2x_Zea&&`Z8rtaP52 z*a-a+*+h(&STZzRwXS~>=9ZEFs5d`u=FBl@K#FYI>kmIGEr)iJC8GsReeh4Evu!1=j#Cx4aKcbQ{s)UyNMf zs3a%(TP{=ss=mKY!*6Jl&4clgXkg9P*W#c|At|VciOz^=8*e)NLOnem-4;=F3&u^Yas_C(YbW7?SWP zn*#QI*P?~^Frce#Xa6z33B=)~iL$0UOoO9Yai{Hya25x=YZ@WTwWG_W1{i9n1M+{; z6Etv07e;a07O_$Kj@9thtWbg0HY^|&jgqwB@yK#3yHze>kItwCl-63gKG) z2?;ti>-)q77bjv+D{PhYg^LYcpa!;)l@{!k1hE^5bXscq@UbEe_St7K-U@wS0Dwm^ zHE>K);&_;(F=DRB51s;!KuJp$s%QYwc}A=%_a%<0DfTP@_g}5@A-8FYHsoOot5Hsc3h8<`_y29D1mz)XH}=b<)t_zJo_G zvTEb{sKR7h4JF{S?x5i3Cbn1paf*XIq=ODbR3{$aq;7-sUgz~1oHg3umeHy=!8H!O`|y`fDPFd*HK@>HqFTgjIevq2L78e4SC0c751fB z7O}l=5dD$mdz%YAR1ta$P$sxa^{FBaUv>quCi|eF;$s+i{b#l&8L8*;<|ciAT#BH) zJ$4=oANUR5tl7vKaaGyo_V~sTw|ORnUq#EGEWgEKAool4(J+ICJh+XkX+Y-L5u3+G z>$3wrToA3gzsx ziy)!_^jYRkA(+7#$B0})H1hcCJ{+swu9YM~K=>t);Lb{--g)Z_OC@|DtjEz?+|%&u z-r5ivfBD&~dULN46Q5DHGY~bp`ZQ5(gb#IfdrS1DKji+8&GV1qmN-?HwR^@s@3JnV zKu;1G_rs`5b5?y{c4JLca#zOd@X)aQ>L6Jtx>=#HW)EsWk-sUkkx2^XvhRIfeLImz z8dGq--WHTjp@}yhvRA0yPtFrOd&&B=_!$8m4+>xYJS%ymE0Qe%2#SIfYqHkkAY-^l z3wFtA5Z&vGo?A*)T{M8aC8^ce&K8KqB17SOM1#)CPr;0mhb}EIogEtcd7Am2eCm14 zzq4$3w`d1y!inlwAcKBZd2Mcg9(p-o{xT2_6{8`hyA8t~ymm1+)f)LDvhtb-=n&O4 zuJ?C2kO_OOv*^v{KL`Wj+@O5ws}v9}nLj^+uE}{9IZF}YPzY}Xa(xjX@d${HewC@C zJnbu@ggp-@CWD0{Sw#l(j7sxj-iZcNg0hXeQO6>!LhX$sP)=hrOh>DcPFDLqt+}2DlWFLaQzWnf(N#33BrL)Vx+pxpo4#bKK{) zd6(NX>i=!`S$W>`G4yrNd<%9gq1N)@RWuDQU9@!B-%HO9I+v|Y5Mul|_}^?|!F=q= zx6-~C%pF~Qr0HUz^)HL)d+m5I0FV?ex*tr`I{b{qHS4bbl zv^GKB?;8$iBbSRq)T<4Z5v;&xpWL|fTAY8vSAn0=K>Lhq(24s_v=GU!PYe-r`n1W> zuAkfC96ft_ghUU$W3m}5dn0N@vl$f*6S1|i4{AkIhPB0Ckv(b}*W<8%kGp*>-015F zGie^@c&X%-TYc2(b@~4D+h}_mFiXRm z=hF?cY_Wd4X7j+AJJ{R5*kF4bqrX9FdbbaDmS5CDUt!;igghzhwEKq9F)jy0Mp!OAssZ> zIq|lj`2pKdICUmNZ~NriYDaZ**^F2UoM^QWdPU5&u2IAbnX{d+escD`>{gY$wfrw z0$i(^+?9Xloa9oS9+JAV6+G>~;R1)-x zuHNsJYy@s`%}c9r+VKLMZD4s)k)2N4xp7uS{7a*7IT}-yP)+1=*N2iLitDKTF#~wf z+=U(Lmk?g+#Q!?9*?ikryWJVMB&t@rgq&HGo*u)g6mnk_usP|`f$Hbe&O}=T9?HEQ zT>@tjw~S_f;s2H!$<3|SFR+j!~wr#u=9dHgtbZkgt&TU@<*Tuc}_R9-vwcH!BRy#|+4$fxbQ*U3gL0TH`t0duy&Q?!=@DPO3Qp};B~H-Bsa$Hu$C%ts{HxDgH4p5HWYx|`0Mhs1Z;smGJ61AA;COWimqj@ zdQ?&-PWqTdAF-*WowX!Tip0KdK1c;b@& zs0$VN8p;Yb6d@>u+u|RY=Qqa1FE0f7kk*!v%H_tyM`xd@$}6#09iV{JKfFmTA7%UD zbWexg&F8K-<1VD!3xOQNepr^qO=^$RyQ7xvVqEvbd&ZL^Hy@2`aE8+Z> zg9blwT7m*rWz{`e@A1C0nPXrh!LP94do!2no8n4vw5?+pY0)l+pPJ z_;l4N91=bdOaBeEsg2$*Gj&no;(BhQ8TgXrmB`#w0D^)n%YGTJGso#Y9i)RD4-az| zJe*@h&p-a_`^2=6$9hY76upm?=D(q;H0YOyarnrzoqhRA; z*{qOFYGvJ(giOHpXZAjd33fx?v~|m&ZF9^YbM5b~MadsBlzxukQ!0wh6L4kXdOAf@jbg_5xQ~-5e#r)}-y(2gWt2^NATUyL{}fWXCJG zz&sk!f+>+(QIOU1w!&wZ|K6t$PpFnK4*?Txg!&&aa)#}#WY73H*HG6>KJ-c2Wk{d0wzFw>EZHb%km7mv)b>||lVl^LyXo30w0geP*? zz|b(cUTIyK*Q_0|6@UA0Mfki-4qsD= z8MZJ-V}?9~D+ZD+l1HvgqZK7kanUx;dW~A&ITif-_%{KOY|J&q&gXi9(SDzL{4zFn zw#k`7^YaDH8Nx#bYG6`NyGGBd2-HL*R`U`s!ed5xXyHvWwtvxD96NTD8Mp+%eq^wy zKT@1&=my$xbEXWWt@e|A!~3O!_21;~ zs8137%19k#A@yuKV+84)71B%T=ZOu&f~vCmFAQ?h?N6QZC8PNQq0t`!@+l-mF!Ww_-0WI@hxyIu2Z2pGE_pF`0D>QxlNbNfQO5r{KWZv==wn3i3KyfmjN0E z7>l{==IE-zo@4Bw35pc-)Sw7k_~iN)*JcUHbMsds`ZeP9y8wT=*UpM|h+?{lGhH_> zrDb28V@9i)gLnvAp6d$v11?=}I>3#j+1{;&j&>Y^$RQ=7>=IZM&5hPd^k_(JbWGrY z>szCycg#*8Bo}K8rPppbY@&E7r`M-^<5;o=4AbT8dr3tEwi^sR zmYVk`6tkQ9e?+vzWe_kEO06MzsK)$CbnN1cqa9YL+_Cz{N7xL@h@y2YIbYUj`EF8U zpr={}=)>NZezK0Lq}s=U?^{GZy3Xid<~+S{)u3UB(jy4c7W8Bvz`0(4)DNcTFp!y< z7Gf(z?(NqehZvu!Q}IdiaR221*Mz``NLbxZceejamwWmIIe}Ep+^|iN>Y*lTllbD6 zHh6V;EP79PQb75&5?ixFw=TfS6-mOfR31x z5Pmm2Nh~_1c7B`=<6}DvKTWnB^+rr?c+j}kE=KI*(5`h;5o#*O93tT4K=aA?hZys6 zfMjZBpU`}5-uve!FmCPk2K_;`uFW#+vd~aoiwYcMgWC1JLyI#!2YGESp9J)%O3Du0 zh<)Jg*|cZ3)KGQPwwIDTN_BiHVGSl+wM4fDp8A^6qG-5+0D@`A?Mpb^EzT)$&N+G; zagvwy{#iF=7?9;Ic&FCGkW;!HZ-Y%a(W03OA3)QlBPI1*4FcYo_hq?FA#FrG`RU_X z4a4hNDhj*hLw*=m>kOqbZ~S%7H-EiQnOmNBPuD=y$abGa&I~jr7ZdAbboJwy{r%Vy z>>eVi4j&|PGxT3$Gtco?Qu>3izrY$XM>t%$ z=o&zc7xvJCu&l9onJp9SPgCKyj-jEnyHwc9g*J<^Vl{C8%@eIPJ)WcfqS&qMkY6az zID!uLxXXR0f|@yecUpG4EoquxGqsFQfLA}ky&kS&bEDfF;JdNlR0QUrPG*- zoP<`U=WbLPpL>u8MBir60kY7w?)gOU6xItogu%kZTK+h^vIb7O#oKjbe+Qs(>OcF%$Szp6hYKP6Hz|bx`4H6ecC) zXnfac5u==fyL{?maeMGN({HAvItWmw{oBhKrDyBtvTlb4gVkoo{VR3>BnV0Y_^W2Uri*MXUfGD$4OsJ0BYZ~lHF2)3NQ`g@b@PH3 zvqAz)n26o_!Pu|K25#{hf`5X#Ifz)d6;`Z1_4(2XVPlyk6t zxTP;3U_IntvS;#pGLN*kB~I z<4dxGKka!g;DBh#mp>9`3YTftkS~JRn=NH}9iU!6*$^^Mo~#Rz7u_-$R;fsvtTqpI z8(~idJ(0u@fRY~pxII)yGs}*@E$0B^8VBmI?Llp{0iT#_J1%EBgdBWIX@?AczZ|Mt-x^56YE&@>=Xo&(r-?>dnMef{$fZEi#DK^jp9G@aqatkRaolXJyP&fISdHOt#W_Dn{7D)FKr;E|=F=_)bt=Ux;4-~&SM_IZ226x6v3yK|>ak?^u{VdqdAkhUAN(vgXn zfd|5^KRsi`lH^-GC4iebXuT=D+SQxHHbH88s)}ulumbSs)4ue`9;R%RkTRcCv#Q1g z=$Ln8lT97(${J`tNP$1GNSC;wx3t>?MxaQ0S}HT~m>kS>AsFqLWIP&;0OJ=Sa~Tw5 zTYvA@oU}7AE1|+6Eag3-9JVm8Z-(F2HsJhL0<$w@qcKC0u|lWX6@6%}ljyw!Ag2 z`RZnrCHMX};$+68GGAoBk%U`)GNXF`(Ciop9dAGv#_eS^MtF*r_6USYsG((>^>Z)O znxwko#Q5@sw;$BgZJ0!AKW?f&*;$5@D^yH9;DTx5Lf3a1^H*V?S=Kx(9^%@1fRU6i zpSkA+Vdl}Y_+W_tXA80PUFE8H-TW74S0izJbJ^|LG`~R!6Yu5%2Yb966%Kb<0a_a> zV39A(Ar}#pTVQ^$m3-JbO1zIscN>PTk{diX_DdIc{koX8D^MjC8i)|wiU_vz)m~*VpmwDCq4Xujd*Z=4IK1umA!yQF4$_x+mW^C5*zNeVc|>zWSfu4=Yw}0U zOCaoja=+Z2Sf(efg|JVF`A!)RvDE`u%k!V|1=cJ4#x_t4dehpskxnqZhE?zUzvWp| zKisSXu?EzK=vxJXe~UYAB-7)ZW3(L`J*Z>rooW$(eV1bW!683}B_25aXkdXPQ|P-(_WDM1&z2v8nz-#323hV%v_HBfa&B$N3BpP;r7Gy=ddAuh`ba*J>#`m zIumxGgxRI%9grglXM&p+OuZGcC5fngZ#$X}*`WX2)m+HxO7OSns7lC^_{SwWsa5kC z!-BSB&G*yVN>JN?rDDH-pPiw0gm}Vo^PrN1XFOD|g}b-0$Uzc_EAeIs zmd${Jf&QP!cBXJxCiBAvvKB%adZ1FDH^G2(R2YN3M)r~w9dNrLCXsO-L9(XTM!AC3 zfpYUB4*aA!eYIdMdX zyiuA>H+f7Ep>IB95$W#Cbbv#V03VzrDJv-Lr60uAbtcLbhB0yHNw-15tuDFs6FKk) zxU-SZ#fkP4Y<;E|S!ty6PWX0pZ7A?21@|RPNksQJj77d9gv4XR1-BCQU>AKRkj!2s ztl!h7MpIscS;sBmwCEg=*oTJM`E2&b_duXF_Oeq8oB>?@^rBaf@@`Z+B0PN0OosPa zq$qClvLosILEAy9R8jT=t%vfx=3Eg}=2RcIYRs+U|UBVeaE1LOf_=C`sge3N&R zxxS$^p3CSQAFEm?sjpS@i2_BTQHTxN^Yi|a!x4c1s1zHvmB@cYkO@zoQNE?roFF2@ zK9k?8c)Czw+`A(@t3)b-bPEh<2kW_iqx%FU!-OEfIKZX+VfL0&x0^f;ERp@aLifAD z^1Ce@psHr`E+d6RDhp%Q@;bxMx%tzi^G7=EK8+ZJ@|HeODePLZTz(V#A96X?U*ALi z@{_C4E)^~z2I^_i!CD9!5vXHgkZ!gVAuC8!$4WmDkN>NyJ?B#H<3&ot7GOBkyNM}A z-g=KEGkE2FIGPVs8%tQBzI=#TOg;x!B}^cEr6if=@b~($(Y>HuO7?)&AAsD1 zF_keOADBrvJGCa$njJ_I%60&R+>CvNoP2vWg*ZvDW42heYjC$98WFbHm3Rj_f?_bV z19}+s0FlgKP%&@E^V=JPMa&&>qOB3}6FJ9Fa&jY04D6t(ZkVvRm`1&MNZId_5=Udy z#8Cef-OL76{!`>2#V5iXi)r3^&wR%53~Bf>iDL9Y$LB@wSLA8E9!0tb);wE5x0ze4 z!|XqVxN>+AphXQ20sl%CYw0-d|3dX8-V?Nv#t6`@vFg&fvYB3S_DYQhXL^-J`;o&r zMAq)yd<34I1a&m{w0I9^y}%sr8pC@09HK7l0z>j6{zSWY(4AM`w#Llmv~^Q3S@l2O zi!;5;y#pXP;cP0*e4~ODYXAiWWdV|qIY4IGtVM1SP0eS`9KJMWq%aXvp>(7~No>pD z(ReOyjpba@Ip>3F=gb0%En#>sf-~$_CFw5mD^a?=GRoDAy0Dk@P#3d`4!!J(zgEQF}s(+PT>IZM~R1zA)62 zkH*QpgMffA4$KnzPAv}U6OFgRvFCN0*P6ap6YG_|4{vUjjE7KdXd0^G_Tm}}Cp$lf za&P$ToWtdGzQA=pFAH=zKNWH!2PnF;Xsq}AH%_7JxQPfBaz>1OEA<)mNCnG^-v4F0 zdRA4}0YCD@gc!nh>0<50&yYs^=qZEW@F0?vhpHEC3fMLz2x;VdW?v_$KL~U8JUuxkh{X) z&bcTnH^?%N87N(8tljz4aVeTTfL_>5GZfF(taQhI(O(Kt7rQp=rfnnXaYRJF6fLPKpfocX!g;{} z-}EXo0TA#i5LC$M^^>hM&jku{HxIs;R_j9ZRiM4auokXS+h(n5;HM2zjJjKfboetW zB#1n)gL}hy5Z*;YXdm5+R6LH>)cQC;5=5WCYB%22!8TZ7n! znptOup%_K)_dEvMt`ZIu*Wx2+HeS+$XA%RpD{#LE;{<~s%d2bA;!~0z(%(N3TYzlP z=g-=Q)3pcbz({x^rw#Lv7RH)q?V^-vW1HhwYpw^~$yVpu3S5%8bMMY-mjH!_t%q@Q z-p-fyYdrCAp&mkt<}Cq%$lP23N@@Cy0bgE3Obt1HKS2h`#9UN6=23dDll@GO63Tc| zOY_bByczB66_c}kWfKL#KngL^%1NMJum*+8k;kYXc1sv$|IniBu3^3V#+KdA%7n|i zP)q3v0=yo1tzCK#bTrUp1v*+O1b?snhj!Xt2uvDY(XJzSZ(tTJ;vfy*DX~L&+ty z7r{MgqQ)8sudYdR-_&jt*7ExO)C<&uUxkyz8MA`iTObc1H;)miY^uygY-s#{Hn9+526To=s1C+QgFniYKpW zov2+Q7>Hm)14&-uUj(@#2luY~b?Tzi)78(~IAXt!T*Q65HwVW$Ui06md8d`mPI@QM zDs*4X0^n`i=w(Pd?M0s5z!`Og44R5g-6*i5#j{WZ$W?86O@zL7eIHDKV~SYnYFW6a zPt{ALUUI?mWkS-5b}?jZ)J7RW3D z%_Z#_B3?_2;{wyt|FtlIld?Il*YIYEfsD6-pg-tGzwyQI-im2dMGrZ-QzT&#>S~%W z>!rw{#`}6Gc(!WwQR(UeJp_FU5%uuroLIcFJ#z5)4mOA=@^4ed0~YcBxMK5c184D2 zLH)r}ItabP;mnB@Z_Ocf^YA@-FEgPSsA_lHY>ybbDd@Ln82n1PSncA(hOSIT-)=%x z5Tw~iT#+2Wrk$h~haar+)EasafR52Ji>FdzlgAI-gDW5Nb}4~{^>uc9McTpgVjHjI z7nGuk1r}n?d>lKcN67nev-TGl3-*fnsj_!NFKY-iG1TTK1ulc;ZP{7Mtb@0ei5GS8zqLwy=Il3cpjtpUl z6|QvgU3=Yh=S^Q@m`wz+RY9k3&-6_KK0!1C5F0OzxJFgA0_LArwU~j7!?)P z7+tWYywnmUduIk1|+?jNltWq59un#;Wqlg@ll(1W^c##<20NY!7IwFPW4%hN2UeJmupa}uxtTt@6>l59JI)zk`7 z{3m`#my2Su26PNw8J2tr&3)$uT=Hqp%t#&2-$pzIr|=?01YuP{c5}p6esOdW zb>F)wsDthWIm9zRR~W==Mt1H0xm5o|4;?BIvas&Q33iGGTB- zgn%q10n3R%z)=BO=WyElv9{WKN)NdMgXD>!b+e?tb^1?r-sqlB9@sH!boDV zH21d;jye!u>9HqX?bm7h~(wpQ!%7Es+lFux<%?;Ngy<#UY$&X2GE;LCKEEpnyAvG{@ zo7z=Qt%DP4klXlHAp;vCO@39N{azavGTaj>YE)IBQ!oajrG^^Vh`OlD}&A?d4HKIQ2k9yxPj~}AR4Jy zii*h;28)&I^|HKsPY1=3xa&rIu)$&`F_S( z<~&@W3x$vIwd1q}(Sa2>xt&O4T_gkmlh^x=nhydi&R#Vv=_=AC z72i#qk7$)B@puAnxJ}=I`np0BF5waF2p{f}=(PP{Euk!-HJKBo*y*CW`7HJEEe3z7~U|OYe9%A~#S<(9DwNLO* z)H&>ShHjhmlQ7YOq=W)$*WT&J;bHX^RtP*A9c0gYt0ugxXYhn7G$Dh*%bN;QXwtDcs`hCkYFsX0AC=14PQ$? zkt8lN28zIs>-QA~9)pdV(2(GzIqY899%POXf%5CU|2x}%Onkst*~(W{sm_yM8KmEf ziFcYz3nBKwDR+$IG%dC16{K|O!L|5XIJLVd`WR?>0wF#1oXkD-vP}nN0}|!r9M+=6 zROO9xZOEFt0y*~ai%?^Fi`#L)@-DPM33^QgEN1|zJSx(+nFxF9Y99O^{cqTJKv23e zT^faQL8=A7t+Kpudc3w((MkR%i?66!R8z%^H&DNzqNW!YmC`8p2Z8_2n2?RX65OiJ{%!;V;}8wjNGo&{?ikw%$21TP z8SlR4-}`Cee6x-s@P-k;n1rEmchw8lEZ(4OPiWjQ0B=mmGoTYti=7tpWmD?ys*#^3 z8nTHe154&%(&*v5_g(5Ua-kz@u1xWFdD*TqkXsKUQ06XPkm4}^TuMrNN*uf@R`j%W zBDfO@(c|@Ivx^32cjbM;3F7#foJ4oHQbF0Nz-N85MXzzCUB=aIvU!ehx-Em7Yki92 z>dP@-7)Ry@Nw5_EY|DT z+o^aQ&X@9nDg|8ru^Ty|UP&T0e-*SPg~W?O6W|EZ(|DwjjP-F1_+5e1vra}?dUi0n zOa+3Ax5uKU6Y#7K+H7E0=!(^ahPAdKK>e>TzF`!_=Z5ONt{L@#VbXI9rR85k#S=fm z8_|UOX@(Y|R{BVqKQ*`2g>i;hQKIjub7r!)_ZAcRO*o4~mM#kg7$c$!6Ze7PGREj+ z*x`_jYe{iXMSrFX)K7B8FAauwP8_H*q-gh(JXWukmvX5iQj(gKPsP@ow&xwzDYW24z-tlI_**r_FMwCa)fBV#zPtRq%9yPvKW~4 z`|SFB>_nz}{1J@Uf(ycwkpdlV`Y?4&RTv^z7_`25;K5m2p$dkWoywnwm_;3h#PLB9 z@BFdnYri?xZRB?eq?9hBFe_NF=$Bdkt>_@gY--!Tyea=~1)Ya|D_eFM_EJLWOe)8g z`S;-(-A#5NJvYI$he6U3f~*2&2wp%4=KF$48rBH66BoTWsRO8EA|8CiI+df)BzV_= z%8d<4KR^iPZwxxKXLEkk_O2iBfdRns$Afyo`5C^$IjAT*OILBDe}#8?&H&1a3sERr zV%(9BlU;{e-yCF}gN0n_9aueQCSy7fYX;#!)va{bRA$DcyX2f0d8mjlv;2uKK+Gek zj#*g#kh zJNGld{-ulZf7e2_PNqECm8~N4I5J z!|d@RZI<+>^lqKkTGzNL6S2AKUM0>sW{B+nq)u@8KOD7dM>j zD9StO1C252*ll+D9T;+{?zkDA{1JbZE2OULy$G;MjI)GTZSu8D6Eq~#C`fXHcLxNk zC#`t82nv|#_O4I9+|}?YNx+^Rm_-MBKczL)BEav)A+#7!wuRb!N z_3ofs!%1uly%Y6CPX6}_yra1?+@BS51`Y(qS)PYS%}fpv5!wOHZ`#|fK30KJ02s9* z0NH`}QBIRr{m7{4GtbOYf%nA}kxu0S#qHvr84$0a+!0cLk!`o*==h3P_S5tQiI=zR z%M%SYExMA$4PF$RlF%pyU-r|2n!la0=!aF2^uhvT`midx#N~@a>s-aF$j zCrBC)&<9jEx-2oFmcD0`bnJ=Zi{_%=VkL?&4tzJa-2V73e1qbW8AZGz7-MHRO-@jt zLE?-dVWt6v1c;93AyHL&BN1o)c{{UyGUg?c0*{^RF>L;2G5?$8h*1p-#ymZBjAIDO zjw6Y(E>E`zl;Ai%*pRqCqy>u68MJr!xj&;VH-EATl+;WPeM|*qOLY$Oa^_#$(wL>O z6am^XI$Xqde|_zNDz@(OE#vee&0EtTV7KD$>J^+mC)OL^cxmEud z^n}fUThN(bGrJ627aZ@JiwKap`D&)F0gzDg*nD_f0J}75&d4M~W5cI(nO2FJQvq1J z3&&|a3F~$MFV7CNI(WP<5-yR z$5qPny(OpZx1sG6+-sV!zgXwdg~)Q zkX+b@KFOHX)Y^J76{g86HYq5^E{L#MM>xT;rU}!Ur&?Xlb?>6~s_%zL4)~p)HZnOL z$1tued^&E$=C`Vj`b(h)n2}V$amJ;7LqP6S+4o&6H(=lwghzwD!LDfce*ZGYFia0S z>;#~NT^D%&mLPLW3nu{gbGPvutx4%V*_y<-7%W=DaY-f1rg>!3nk`pI7zxkCc>aiV z|2KL6*(}!*boqMeR7-gzVeIe|%Mc-TR`;1=zlw3v|S)#Dv-AI@)9WI z5tX}Z9qM6Xo3`#e`gwj3Q|6elM0fDS>@8FRzVWr&km_V^aNM<8Qt+;wiqG4{i>QH_ zg&iQQ!Ip%-j^n)F2Qxxs?!@IyROnpGHcTYhR)h%_%cb#NL1wdeLD!K>f9e2{h4eL^ z?h%bzmmX4RWq;kcv=FbUHDR$S1!@UWCBciNW-{7Fb>u9G7i`Nv6R^gA#DbmkXtEKy znH<-nbQC$i@ZI>heEpb&+IkRO$w;tT>why|@x+rBYbJb#5t z4CoYz{z5ikbQQEQut($!c@IlT;*cD=y!LDq>)3BR3SPj}=~fgvcPgO!+c}xqpOxtM zcJ;jH!j*sR$i3eoEsiMe71X7_@Y?N6yEE0kUWUDjXj4W=#|s+`Z$I*r^`OM~EADU+ z%nPv@O``A^6QI=eVlPEFzM2n*6r7xkIRHZXk-epBFae+$F0IcU*v>t(#8HZha+-hCKK zp9kpN1_9G2c_uIwi8km%SA_7v84eB4T5}0zY$W(bO#dR2pLn}toxA$tU@ak2pRjN0c;!w&7&%cpUeHHDh6Z^h|lxYk$ z^;*40poT`=*a?!+2Z9d@-YFA$rr3%#`7o+gAg>FeBWZ%u3XT%rNXHAcYn*3VbT*+e}QYs8!&HH7gs}DOAr01zpAz!JTEeCF(TXs0!>L4qufew z-RNchoCa=K?_NIv;W_dV2+QzGJHc2Q9G&5c-?L;R68d2O&R+YdP$(no@8#q-vo1AC z=PBFonx~_^^B!P2TR-MQfRehvQ#OjaXKcrXTNNc>Nno|%!H=HdC7AcXT(dxGs1R!) zU)oRtgzW{Kc(IX>qJtq?k}=e*adCLit2j-Dy+|~6&}5( zb`2_VUOY&;Eu!L08BB`|plq}vFP-iIi*pN6s-$T)lC@>)tyBedf5{jr=u5>Al3kHs zKEZ7xV*F&hrd9+IrZa(Bh6i(|-RJKj+zDLvriwAHbR1eM^O_?EuY|-HNkmannYs|ki(?-kmHCm!zhdlmc?r^Ms^kqeN8kipuLBQ7iX<B zP&G6?)|Zgsvq_rR+_}2rD481J?bgi;BHg~_t4#kx-Fd(89rzN?kQC)IRxs|B;a}F? zB;@(}N3ypS#a4xG4)S%;&p4An*G7PJnHsQBlwz2ir}I}s#rzLK#Gjm7(2^uWW8eba z11~VRv%_tqMt{4OYKaNgX-bwp@Y%PN!$sz^kEJc$Q%(bd!NvQ6H`qS_#riZMHw%^Q zqw#;u`n~#sW_-wiBZh^d>` z*0GFeG}`O;AGG-qMdwI2FHARJ33lp)2scToni+e#l%u}a`dwyyrw;pdB7I+t9q_Z8 zI8rJ_fU=HN^wjn`X(TUeCby_Y{JwZXRHJ^Wy92 zPV!1@2POGS%W0+EGKK>kL~$AN$98?^lXeWxcq34Tmd|r&Xi*hF@Y+oabFnN+>oQ02 zvp`Xm2~-NvqhJ8c)9k5wY&Z!$u?4 zOQ$ukaRKTz@Xka#F9r-$=9kkA9yHeU!q@utFY~MA?wPY%4_HUCiTHZ_ZWaNXZ;AXH zEMOD%i_a&;u93sH#UFZ+dFQF~a#~LcrY%>l7}_}FO)SoM*1E{^{omHqDV8951J}oY zgokIvX;DMWXdjLv!(?upHR_=kj;-AHxjKWqdaKOW zFUWe=M&}192ESlR<_6e&O)b~Ev3L8Y^#lScW^~R5=(15~fvwr*j|>TMm*LB*F^ag! zQ<*fd1G1I&xu;R|tFv4nECqtDnpoP_w`U^+$`UsZ0EG#$G9>cFrMe@YTRcS6kINOH zLBAQ^AdVWCtB@oS$9F129`8;Weguh$W6eyPToB4=-6BUITl0QhC1;%^QwzZz#Ssy7A zM15vKRVVog)|+XhPwt|l*6CM%7X(~S#ejiiAd8)fcB=|XKT%a`@Y_<;fUAAzE{NM+ zI^8g0Eo4n`auw3j)1_m>H7(QF-|90$eTP^#kFYMnMm7J{_nE}6HR_>@UBp~o?Wyw9 zsK3&!ggnalgp{EoTzT(0YRzS21GQh_Lv0Sxv@~cC=$Wk68(CjBwq`dX)k0eWq!=7uuc%*Mf~*--#!F^58t)0oXWL2jgyE& z)uG@jov2pxFYh#hi`7bCZxvfu3zCPbkn`0IK-t(c=u_0oj-JR^0mD#-=_aa)|b z@iDm52w@Mfi(G3pP1~r*@7cowIve?C3P?f!>s6CRnMa#>m3H}fFVjo2=6I(f`HbQ` z48bXS4qsR?68pCSfFN|3l*vS>1vqnkNvC&rcLL-SFP z-D*#rh$z)oHVxUOTKK+=>lI>~8DPHxE%uBx!Sr;=VP>$-oaw6LjA1JdbYH3D^0w%o zp)#~odW(1hyljn$b!3C)7yW(R2hbNaF_iN$7ZB+tsu%xERX7!)U$Qb{asBN#+h0zzYTPI25z61`VF+9e@q`vFB5a{5~ORh~|f>;Rj>*EaFeIv=v$fyV9NMlln+> zjKH8n)eGri!)*^Ih~SOZYa2h7z%x^u4QfbH-ogn$qWE|1B^l~Su|7@^>vQU@go8iC zgRb$NP#8W*)z)*A5ekWlTSZRS*Hv=FV2GVQA(vxI*?O27sZ4!4n(PY^i-h&42dUKp zpI~V-ny1_r?TZjZGWnH8QVvt!My8F7IKxqFVks&QlSqx=1)M*BbI*df6|PbtV-LS6 zo!V$3Yue1Vf6(d+6Amd|M?ve0{YF0XfvIk;mTRzA?DTu={@qm;AnbWw5Z~e!EvFJwv1je zqZ5IGIuTgoEv!ni03waJF&5!6gtKZh=?t+JeJgqLdIQMi?wnPcU`+eV*Wr>>HLf9` zLj;!Ui9_M!6~LKjhvcM4UfYH6NdS^#q?qd5BS!*DDHF{5ocg=l3GV%H6B6l!AmrK) zSe(ddImW%fMw|DoYNig?!w8?vl>YS*7>boD2*fckUH{74OD=LNH zl1j4U+bQjf)A|zj)qMJ4D{6zHOZ|$r#;kcvAz1Kvq%P-=(NXzgi+1g=9A>-XedU7f z%%&KccK@{JHmD+>;VutSNS6>~&`Xg|H+N*GKDS8krUnyVxPf%cRC}y;N=LRRuyCPw zpzj2Tn|`hnXG_Ic)9^R~x9RTjZgEq< zIuk47+Lf-@8H0<`F?n>)^#0b%CbG*|WqasL7wjL#8xQKEcd8 zt0CD=Et~B(F&fn`$7qpo9P0CI2w8GZ@jUVuL6;m!SmE(u9w0sCB`Xl-R`!6rCc>Ic ze7(~@pQGC_qWvgP%O@QX^mSp0LvQZ8Gw7~Sx2Iu(KQMcefo(rz6+ZaIB=NZU7U7$Y zH0rqINKw8doD+&Jg@S*klp)BD4Tp8YQ0&bnU(a~?@pXLeE3&UD!D3R~X@tkRaxY+4 zE{W4$2kAUx4g|+E*8xll9iW7Nc`h&2FsA=4hKx%e~R>k>3iR^ywE1OejX@9p0%63&CSzbKzU!`qD4FetP#HJ&l zpzJf)`LcK?G_Fo;?ct45sPo1Y)8zB8<3~}Ah!Pj~1~Acl6%~}y?Rfkc4ll6$iB713 zcAgiN!@IWCB39n}mC*rg&(-mq_%3Zd0m2i;;iOp8L+jIay2uxE zLaaBF0@pXffhfts2z-d+vP-vkfh~W1_Qa2zYrLl|Ir)kd zMe;MW_blSTTRZg!Z0IWu+HO6vaEbw_YX7hSIZfz)r*WT82Rkl;a6mi^@|jm(tKAy5 zuLza#%ONs)H&vcR_f4(}yY`}JT_^w&we9>#y(@UKWR_>f_Htu%K#&#oTT*-7lyIfX zH>U8*WP|PAz(tUjr`CcaL%G5J!A5!G22YIb9YRs!h55HE^2kldC&t=pa_(1b!2*xn znT(DGL4UW12`*-osmW7zO%@xf9DI?TcD&aAPc?%mwOA-xr2Ht2UsKyo^DH6DY3_

jVolC-=4JU^jqhmyIR{$~A>T8Xn?*G%dvABt#nv6|2p2 z-^MJY>9Uro37v)@@SI8SNZ#^;p3>Y{A~{lJlw6D-qripY=mk6u!_Rt4Rn?Q95rPbj zoa4K zk-ORyg#GO|m@}tj z;#&=H46@me{a^`0On6D{iMG%&1Di`{N)4h7JJ@vD_Y?XaZfu3SL{=4<`+s26fI{58 z-cF7T!$ocf!!%duK2mTH&P2h0^Ko4{yH^wolUQPtQZtdWkLPU_(k*O&_#tS>hFu1l z{^RD(VV;W{6iPIYXz}7KE7;OX8sT10e-jjL!}Vc0q#ls1%L5QCb-Zbq*jaKp*u~z* z*v(;!&eIO*D#^OsPsDKg5u0#(6Y|VKI%~W^t@g?hDkVoN!eB1bZ7e;=pOg;u_;n0Q zME?#{eSs~R#6!9dAhD7HpWlfJokh_p+dMvG$sH(vf{5m3b|!Q&{@iWY3V|@Bc-VFJ z+tnP9iAH2rMY}tz%I;@f{&x> z_$f!Pf&Ylwx?F<#-xJ=#Y=Q_WwRR_M{IQj5wMF^ZW;zcOt*o&Dz%D1YEQQdqFpY34 zc*?j9u0PJQGpIlTdz3R<}&hy&JWkRE#x!K6H?Zjq;~pAxu(aH(AIw#?+i6c zEzB6U;kST>;HyGXSvJ9-*?a^JL0G8HV;V9mPzAkU5gp@v1|}HpK6iial*y2n^9Z|p z^!$}qabGmfd;ST5Ckkh2fQO_+LOl;Ri|`O4VsHEA@b>B=iG8OR_-p2@_hL;9!kq0v z$wSQ(FBPo%vH4xFWBw~OA;N7^7^hv5*Mf0~hrhZcq=BOYbQEJe)qT#+Btv$&Qj)xM z^!p)?INMzXT*em&3bco|cc^k;TxpeQE2(r0V%3vMsDL8khUJP;RsOm5U;mO| z!4T$us3^de@!zJfKtH2MUKi=o!8)CGhJlmG!v+7vtkm0fFNR6mAOjN7`eSB18N~3` zi!^c9{;3niwAYHW$~3QQ`Zm;imEMxLl&%jI2}XV;vEi)RZ>IyO=_>OtGYU8uf!TIK zVIDKmVos3(GrjG!AhB9EMXUe)s7VM8S4!pxN+#3tQE17Zn`rIj6p^_HFG>57$cG=z zGq4!llYi3LecEuN1zGBBU_%vHywjL)J}WewsMyLuHYN6YX*PujJ(u`B{i>Pt>fwMx zg!Q#-1odc7GD6?TaBxjI(vHG#NP(7Y~nEhsJOkJ?qoRYz1`>$D#lrhe} z%Aib&h|iptc?s5%F|>oV&%eT+c9m;Nm%l{sbBtL8!?X}0Go>zQvi~EPfj=#YB_&QV zBn%np6n7Y7{x)rZxHl++aIS(Fj@ORmtV@F2LTE+(fo#A<)55))@2%*Az>C&jzHT8< zpVv(Z@AP14aM$$>M=&0DSOm6&AC^$HnW{YoK`20Vsw?GiRA@>%lh2mu6Y)Rm%Q2yl zux#)sw1Hklwoh#nJ>IF|^dtSFqUvwq2@oX_0?f`4*(WTGWdRw;t9WcsXRo{DX_8TL zz3+9=@vifxE6CrB{U8TbrZ`R0?TpvUPXYpH(4P~rge{7BpgX5%JuXKE1EMzoPx=zl zQq-=7N~bqXqx_-i19RHjV*k75mWW}T*hvl|>y?3fg8w>J<6k7|lV>hX@TklQY@wPc zNP=TwH8dWIms`M#KtOWcwJiZ5sB??8JO{esRP-~7W!wMsDXTkFR{E%(9&zqZx!p}G zOjb0u)9Cc%@3k~3BpgI_qN<7Q4*=cZLufLF#3R@yGd*CUsoYoOs^%%^@ze;%LC^c!I zNnKk;fd#S}O}k#Gu|i+f8O#xu1-dgKRt>E^f``jg%x3*% zI5yt7J!TfjW-LRZnj5!&MEw8`JOCy80EBM4sqSbjvisb^h{UU3B#w4=BASl>{boUZ z>{!k_nzYB@WqC$8{w%!OZ)|#UGw69a;perVPD)+ib4kjX@x?7 zH`Q25ja)i%L?Y#sUXZQT1v-RJ&G@Fonie;Wp$qb2R9nnJ#SV*xdLUEIq z57(U3FZ$f5uIkebr`Y^7ZEtVNj}wHuD;7$n&?A09oZ-Emj$&=J#exzouf}dJ-Lbu7 z(Gs{uzH!1Y)`EN}rVofd?q+AK{ibvl=YSHk(%15jb`6x z60Yz@?j;z`?gM{Nxf`?0e#F`$AEFCGL01gs+d}2eeKgz_+)gfI#&E)@QJ;?0!N4wa z*RTQX(`dG_o4Ht`C?UCQRTnQ#;=S#2D9cjpZSF=lAv76khidDPSV;imenvRk_9e<4 zfg|&lmAmO`c`m6arK*0<*+5#IcbmW=NWJkY-fanZB_})O)r9=850vmM*r0(fLUX-M z&XE@vp!pY8XK;Bv^CIuGA##kr)|8x|6YcbOm8CD|B+?1)e2!-|HruC6lePzMas<{f zAY!FLz?YGni{hxKD-X>3yL3AuFULF03i3swfCeRtgG(inJH8S!fP7}IjZh*GoCT#B zc4a@BCmVBlT4ym>ZNPd|_US$vLvv9e*SZQ?Sct9*^mS70U}+-oqgq_qljT z{w4LBy(gkVMb#YcVq?uZ1I+V3+|aH5Eu!!u`9dQKY%HEv17XLwGBzopup7HO#ozHR zXWcbB7oi3Q(iGaFr+r+>T5t(O$n5n?;ABIEJJU+`ZPKDy=((p$0z2i5rDjyhQpQMA zQC$+L4>5v9S_p%gdpZy(4s#vB1>B;HdTZ!GE>K!g?MTUPmxx)wNiL~VQ$TwW-=ENc zocX#kPNRHcE@A-7q#<7Y&jFqF1C=q|My9SpNO~Z}5WFni_6bdNEm^Cl(God!7b&aD z)!=jHp~hlp5lWs2I}?@izwP6$S)gNBX?GmkCc;~X(??ZB$F|1yDH3Lk_p*28|&?Kb7)|%>lJaJ>_$)bjM^fih(DOGiGTDtj`6Oa_EynPTC znLJ?mgEDH)vK@5By?OEy{NbjiXvdcHIR~D@0F6^A!uKWEo}aXFOa@=apfQKw5Gl0I zu|6rDJrd(vvl8g0z5HZ^WPWktz5U)B8+n~CalW!Z`$<$7v*Z-f7kmT;xVsLFkrFYu z+efvrq08@B$bS!oob@xi{74wJ9iBFx4ie#Y9M|-&)>~n6>r8cG<`GitkJ1BYF zI+ECQx?oy+#`Y(&(lyyHzkkD|4&GEXV(LrPCS%Z0TPOeHO3v(u7h2{$zNb7P4ffX=EcgFzgrI5+)-A_8X%3n^CqE z4~cUWS`3-SqgUwapyU@u*1jq>(3Pi2zd=70$(oM9tWWNG8FaIsf^T--OtQrO>AB)z zNes50e~L7K{7yn(oRKK@M*j`1<}P{X%SyzqfWIaV?x0{tg_6wE0@66Ng8ph=@*Cl> zrwoSsb?O;>O@>*sATa!>h53CeuK7s1r?Az~_9c(iuh7md(nBHqHg1_ke(_b3s?wBs zc9bXby(KJzWn{j+w^&+$jTb1qzO?ReR^I_mTaZh-y2Z2bG8x>G=}^nacSC@~GR1y_ zr-#y5G$-sVXP|gCBy%TuJ3RPft)!^?R%^UiHs6|G#_6^LoLJBk^NsR{_zK`z)Ir~d zH(0SRa#lf|Vc_~uHLoz)r6`sEgS@lj$Con|C5IQz&OqY$^Sk*N(?W5MyV>w=7)wQx z;93^ZpyvUpA43aDcTZ5g*7_n~TYz$!OS$&93Kl8~P~ zZNuAfgc+kAa95=f^qYlPNapUcGT-WbdnsMVj1${$ouktSu%Y)8u&?!J3XE0RvGO{=$YJV;7CA$iyt2;!v&EaJGWLG4BEO7e>OAFdQXp>30fd_>iERJFW&2AjL3RJn<@=#bvr(|j;z^hZTLF+fkiZkv>#NsAMvg*+ zBU*ge@zp`cDitUa(E)(S%);u!`0IZ^+9nz#{%-E2Fs}oi)Q@6ylkR;$U`0Wc^~8SH zbL%DcVRJvCP7z0W_|!c(4m|_XG|}>NK8bnU5@#G#gcE+3{Qq#-D-#x)MnrKgHq_i^ zK^`{4q(K?hv+8bg&ZYdffO{hyxg@T4e-k&|i=4y8CA8G?xd}nt&1|9quJAh%{gQ$O zNzy;C3sn^XN~ql%nKG8AHvUKKwlJ~y!5A{DEW}RgLV94kH|P}36cLA*Qo%9pd<%DT zeL)NNYmVQ%eJygCWlGZ*wZ}QR-gM(VKDa?Xgu5v^L7=*0zhn%py14 zS+LHHIP@UqPLDLL0(h~V3O}&(j$IlhO{8YR_r|$(L|Cyt*WEG%^Z{zie`J7}kw`dy z3?@_rM>w$#wJwy_#uAc}g=-A~@DK|;W_1RJTYQH-K5nj7|1@({m84u+I4E~464{%X znk6)1W@vHQzmY7W3*gfHS<`mQasG*=@!u*RXoEQ=OQpDWKImbYis?mwi{XQjG3nWZ ze~D_OzFR(;RD8@2)f$1X>?hv`c3c>VLyVB`bcYp$hpo61o_%?j6=wj}Uh2tz!gpGHWAhQyU zb<(ndh8vI?mjz4COAb77KwQX0hXkD%^%^Hg&0yb$qXJhusury*oxQCKe8Vc3Z+y&h z=)LuWpOed!55UVoM-~9(c%|MSKsqU3_e9dE-6UY0|G`QU{2Ka@6hfHU33~(P%Y}@Ew_8I?5!rhhh9-P zc|{isevsU2>b^?G8rMAcM`Tf>qnM+f*IeYW7ZNwT1qR2lrvQg{?=*$2mie!)+VHjM zHWJm?UCr`M81vlckDeptvmzIbxysmY;Ujm*P|-A|26D9TgQJc7bPtmU}jry%;*_Z@Glq*lN>#pI+?PXOm z8Rzn|lG6@GS?b^LNtM;&D6i0{Tlp%HABOWwar}Gk@_S+s?pywHH+sB+Ose79(z%dN zNBvK$EmEE%kzhF1`zz;^3Jok*uY=Gn@d6?U?_uh}t#dUxuXflVnk|(bIqOnO@fPWF zhLyuLr-AeUYYm(%9`J$!>4(6b^A&y)L1@pe;l{pu#~!}r}zzN&%Nu{K~&UV8RHK zbXqAK)aN^&2kj;EsT9y9YpEJR>b(k<(}5V0qSBL)Jpppur(~SXS06ObPf@1hl6$n% zALkii z{51xkv)+&^A;(Xr@C?A02jrt600sn;zq@syr3aq%i)GLB(26;+-0I^9U}FA1wRynF z?q5kQ3JocCl}fj8+aeNU2y4aH21R6|eQ)vJ7*)pSMe$o8rDO==}15Ri_ZQH^XYD@eAs~Z8#J>p*vCRiJvOnjaW8fLCu!nQ+=Z6QcvQsZ)l_P` z0Z)&_tVT@pN`87n2gV6n=y*3_?6q&j5DwinFQ>FFO!&yl%yVrCnrY6K10r`jwGd;o zfmjM3w$Qw0bZL~2D*q_ik?W2DQP4;+C8Q+~S)eLIE?P=qPniNW_H^PBFXM>|15ewf z;+yPZ>56N*2{1bBFB+U0tnta|(_9S5DlvpEA$ThBZ1yT1Sgu+|yK>;X}o&L?4{ z>uA_kic?5wS;a*DZ(WzaF1a^;`c#F&#B5{c>)v~dyOW1!%Kv1I@b&KTFKc@fu?o^5 z5GF48>gQ^LcGxrD_Ko^vhzP2aEE;v$$f4+#SF&Fx=knUWYa6uP<>$4|!2L&$Dx#s$ zHzSLAIO#V8~X z#vtLsSf%@R5ADSqS;ohuF=G@f83g5%9&r7BH4wc>Uja z`sQ{tY^cEpC~5@zfA%J&<$46Lbr0A{WZa>r-m|@Ho+gaQHA12gQM$Mgp!SGqExQ(K!LXu!tZCnKahANO>o= zVI&pDl^b|sX7fqCdsyYQfvlr01P`*p8bShS4`q?UP&X!MRRFZ@ZL>)nlQcIzbFP|n zaQJ~%np~c!`J@<_@5j;GFfdW>cerD1YB`2$;loidR?hX*^;N~YF=Yh!;C#aUNlR?H zsd!#D{x$8S$gW(%DfZ!30Y})}PqL(UmYGNjUsDIMgZa9fJT|E<3$nBI&7Yr3Xrp$O zNVy?LM9>46zeX`+1#mv^$*hE=nH`-1^J~FYG6Rz$18_ljk9W_Uj^lwfXF7D}v&i%V zAS81zUxwj_l$~L3AwcSUFpeBh54=wzadF_=HBj3vy2M0_R=3B-jThF`(AN>@UaPDV z5HmuLGG*Ue{2ideT5*kyleOd~W+qOYK*|sm_Z^f}x-_o(?RI94?#A|wfO11rgyni` zBfOY28#E?3C{Y~d!^-236Rq_)V&yz}C*2s>r;Ga9ceqIS-;uHIHdzoMG4J1q%#9s9czft`9iQCbB5xPFgcxgo zf^_I!KxylOLG~Pr9+AE>0FluHql@6bE;jF+0`szBTlBsIuqsi-N=y{d<*}r%IT1gXPDVr&1tgNnNzo0$WEf*G9bZ6lzAS@Z%#fQk&Lld0fM4qRvT zGKLLu#^(tS;(hx9R}3l76;OXpi8>2}he_k6t^(0eHF*u$I8FxG$)A#+PU>Rmre@~z zz%Lxn)|_E#q;ugJ)Q_rZ>ZW-IIJ`e#9^yQk&I)Z;54asHQVfK*erXu5-Q#L^>}pHl z>0`yRp=e|3@*dTz=F}M8|BG>81b|fLCbB_R(e6CJJlx-h$|BBUGI$-L9af&oj%W;$ z>v5JA8ZMdNazY<&pe-I+Nkew`Bl8d;L2@{vm*L&bY4JTlHN6OGoD7OnWbp3`pA{AE>8Rh_S z>1KsH`~EiMI`a9av~firG_kI`=Ir=w%)jIMp3 zQ{t3(RBA0YO1jVa+SDYyky7H)fVbyPzhQw8R5aU8x&h zgBlof>xg!2#6Coq>ov~_f;}6T4fpn)TpFCPt%!8Y7y z2Q@9yN&<;BL?H3GMTTfCS-}PYRS|+-UcVR%zQaF$ovDy9LH|4Rnnc952?1wUoS=tS zoV;Y_f0<8Cpj^P$K&{mm2R-olK;)AwexV3fYWPy%iL2jBj2ww}vL0KdzAONJ-Uur| zkVUm5U}Xzrsp@N$tHUBWmDBkmm9Jz}<3Oqt-Io@rLMlZcVr!+^TI%N3&R=s(8gh*X zdp%1P28QCZI|BF9Zz2n^ol0kbLU-XptyW(Jxe}LhcLxv$cSF9ocAUBOH0|l5@3zf{210bBCE{=V8~8s6 zeV1hE%)GMo57x(zF3fxk5dfiA=CdtYbc~jenYw8G&^pgWOZk{Jw|3+BEMP2cR?;U+ zOHDk5U}vX2Z&m(oY$p95>p0X`53NzZhQ0*(W{1DYf{7#f52I+i&xV0rkuH8Kz={go zVFjP2ypK;dva~?Jj6lIl5!Rd3$aJ#k$Nw=F1&6gpa%F4x49g*GjURoO%mTySVmujb zcg{5$7WLmjo3X->`|3geZKu&AwqSt)YB4A;4u91y;CA`$E{3MK$*{|4HQJvn*x6fz z2FUS8ck7fwo?-_oA_kXVrRyZM0zim4`1h3id9&cEnOI!96!dqeC zdi@dj<}WJ9HCuV^_*OeYoqEOq7^e7Y&2C<_OJvO0deMlASgh;ih_4knV#x<(H6~t< zu82M+0>~;{WTAdjmv9&ocuTRiI0pyzLuKey@okY@RIv{Fj;lp*J9p!V+{`!W`yVkY zccqG$4XBk(D9iXzrv@2)C!5WHi=qkCQu?sX-Z*z%pj+ac4vb2Ehk3?L;O^JP6+C2m zNoERizo@3f=Mx6^-6Rw#F(@XIgNAS0u52Kz#xhH{uLI_AVAl@+kK7xVD zrr;MTV|BV{RL43Bn!);WS8vPGKsWm7%xL#Qt!7OU0SS5TP9HTpVhhSlWOnc;&4jcM z2S%F>R|5eR&GcVTo~;};_Ir?cq6@K8u1HQ#r>53w&%LUs-ubkaNQFz8wv@RYF_i*p zwo?O?ly%R6NT*@GmESf3MCA-6qxDNqG$ON26ApDy;z=oOndw>xr=3h@hh=*ZMdR}S z+RZ%m6X?F38bhjKwX*a^36ZUSfOA<{FBoxd@?*w0MxHwpff8QxRF6V~)pcV}Z??~z zdr+4Ea%ArpWIY-JaDMFH4NyfXV7u2}WT`)xTknuS*}m##YZt!%YxL!$xA5-=NS;nH z(xaTIR9MS>LuY zXU;y`ca=gfg}5YX`(*y3i+hB)5N`_`?rADX@VDJA{QdPf?A}ze>>Be2>_Fek*N1LU zRgH}oDL5z3eM?BBI$9Y!vipNd;)cXRa<|*I;P+)@x@{aY;1_i?)%2icUg{pfg*+F; zGqJ1TYumX!N3c}{lgDAPcp)WIz`d>;)hg}F>V1AnliHyzam$!}I&5)uQU*;%OpZ2d z=4H_9nB@)Wq`6w7an@y1MeV7`i&#V5CAqo3(Xrka;UZJZMf3?!_7`hS%n^vWscm^b zx!l`^!@}CrA%L;V{z*mSvlmFCEi|Ia#Rwkjb8 z?KnStS;c&CeJh{qfEdt2*`RXh-tlcpVJj5E)G0*A!QzSkp~ZtEYQhzGY~XK&jguyJ z-m#AkFj1w+yLlhCEc+Ra>JxU1HAlJk6Cggs*8z}{p}&WLR@Ul5p{4)8kcKgjv5PXI z?N_cC8lN7}YuuZrrX20G*p#-sI$_Z0+D~gI)x>l@WdF1&hNz8j5aU2B<*oU|%lOe9 zE9K?&N5YPV06m-fG;=62y<49V+6cnsQU_{#yqxye|s{jFG> z;&Kb|U2ju`H%yq8AUIeq|1 zBnoZ0#aWnnk+Js8IvA*~jjpykycuWm<=9(Q{AXtgGOgO=fNJHmm#2g!d5!r(D2l>- zJv4|Gy7-8~M8rLCZ7BgkV)x2PMnHY|UMas^GryNcn5g1^j1W+@Wn=<-k=Ri3Ri$7) zNVv}{`KnjzM=l_+<+7ktelh};Y;Tz1ALpi@X#08LlY07%++iagn`FWqH2%&mP3aB%uH>lNYh+vAQi9HD-E}h48oBxoCrq>f zE2squzt)_x_&OZsQaf=4aVRyGgz09|el#0IKs;&Jpm&_Z)a4d&7{nW!99Fm)$CG7{ z9fF4!d4|7jDvEN%?q1>7A-ZT%mWNjs(iZ@|)N?WEC3m)4Zk2^B{N&UsAl;*?HQw#s zARj!*MlOuEL<({OXP8pDZPPzgV^)ZapxxY(9T;cMo!J$7_a0F6>-e4hR<5{#rKr_O zP(miJ>phdwQdC_)mu{6Wm7o>))u?vZ5#zuTmO=W=(xT`Ve#7dQ!)-7#`$W*)g@wrS zZi34+_Px<-n@*RT5G}c3cSc|`a z_?1>*!eSKvql&E-0W+Wv^o8?b*JS{G{@Rzag26j9PQ8bhG{@bF4*zaXGzR?lc5N$|Xrg5<0%7TtDM2xJzE-70W> zV^ktey*yVJIoiJ%OM{}9IMkj6pc{z$%5*qkD1g&QoG;%OM!XLV9=}8?A`7#un|Hp= zcHB~luHnUhjdRJU4wUPqA4|T};m}4-#BJbD(fkI4=(2u_w%}^_>W=`})NnqIF|1AH zu&I}hJq*hhKf7(48LgPulIE{<>kU(f*xvm7Bi8&XTFV+vf3wOyA886wR8~ZZW8-45 z?>lZuGw^R88V)R{y@spEZE2{qn*BB62z$;24U5^{<6X?`>698yISmU!c0N5c^C` zkV#6Gqu@lVz2Aa8RA~>q$8)O>J3UvauHEA%Y>mVb2K@d#H(ZKcQAlecmT6ZKsZDSF z(A6b5>1mqELo`mOSnYNt6u_81Tx~XtsI*-64`I#bc1z0X&N*e^u2r(e*+UYxcSOeU zucmeqQ<|{{r=f7ggAXqU;xJii(TNFJvVS3FeTKf*pwnz7{tl~ivT3ukJ7fx_Kpg-- zK)}B>Za1eIu|<`i{%gyHC^@lar_%HgeESz_x{ZSs`XVPO1*%rbb+1Sr4N@F{g{FGQ zY}a(Z4s6febNs>fgt3d4BcmQImjsog^?V<E3 zvK-xpdzHHI!1Ub_m3hA$w$|blO-dDV4Ss@>`Coc2Z)d;p^YUB6t2uJ*sE=!xs4Uo) zju$SR*Pnx9!g}o9oj3;Te5%K>dbE_jKH19uU$o1og!Dsi)5KFd6dYCtk>?F`f0lRE zx$UYjp3a{Q6w+Y9>cm1-6AQ&vb{8z248PL)+S*|lYtBy*%NJTs4}o=^ng~xjUYz%T ze*ksmmDb`QF3kj60x6;@37O5qbXO)K3qCE&pc5hCptK*-}U~6tZ&yBB;%yxk20~jWP!>w{JTKyJe>HkdJ|pR>zm!gaHkJ+g^Y7 z$tITKBms=={g92#hJ+g7oMgUDa!I&c$88UAh_hP<^wiCkLT$OJB`1YIlDGaG&1AU6 zRYnaEQoU{{pkhFjrNZNq@I?s!e1=u=2RcOc#DEG2dFMCT%ZVQ0&X*i}NjgzXGwJWg zG$4bd)}F5*oS^R8kR2>Ij0&F@xRo#vD+m$svlC}t2im)Py9zfn(4!mzRy6&+Tv9D= zY7~u_tf98+>y%p+P461Uyw!=ZX5;%MHRa*ToaFI|o^^RNq*R{$l=q7Gvvj#z@AURs zAEQAXL-loYLVmC1x;m6>IK(})dZ~onWKFBx1XNBxv*k}i_h`%w!hJF?{rUBjjMo|= z7PKnVfEVDagB+_P17bE6Afy}#@#v|S``o(Z=& zVSyH?Pp3h$J2e|r8QekG)4@YP1J!G)MLmb>N~*iY zUAJ62-zil5#0`RsQMRna50*jrnd_4&iRNF4Ad@Cah8lPS|Cl#uDmDvhOryffGFp;4 zQ13CM3{txt`>a?4eG)?5ldrNo`()B3_Y2IGPGSCT8P!lVnM{SCFGek{u+z9$AIO*S z9m0!Z4#0Q0{n#a*^(NnYzsc?Jn|vQY8Ty;(+=q0<;ro;_)s5@viN2kc7DeDLE!zS1 zNX&z$%aYi}8dXrvNTtE90=j4{s(1<3z7>nx<2l0R06L$KpGSkUF>D%6DKfN6i&o?yCsHSN~->o232SarcI_ot5tCtOyyq?#@~2TCGyYB!Szy-^QWX|KuF+hu3d zN0A&1e|j`(1#Q#Qq@9x_&lfxzO2F2rRvIklAQDdN+Z?du^4~A}RcEQ3MTo*CvM~wG z6Z0MYrNjRg#IF9Pcip2@od$_r7w{Mc~j#yB)H zWzAhoDq6A>R$LK`m@H!@prJD4X`oCj1?$4!RM{t=_sYaBDVBX@Kxn9$fWNk#H%?YX;Fz zOY0?rmRzGVx{p*^+zEsZHO2AhX&kSZc`8?_Puhg!?ltzQS3gt#zl0ik1R5ThnZ1`N zJM02Yqj#iBV?g!1 z{8hnjkzP|$f`Jhy(l?wul|sD6nb|Ah1p_Htl$olp3(A9aHo8l`Db(wpl{t9^+O7n@ z6By0?Uv?#l!m~-Hiy1Upa<%!a39PZEkbO}9@JE}a)U|-uBhx_=(rF@Bdh6RNIBS95 zLyoz^qGB@a&@e|OD!%SxVEE!JtN4t4lPF}+g&c9dz^lg~79Hx*bp&+sI%J8u8{-1bHj$-w>3h@H?GSAh0%7sf{L!sq)$281fJwkJ6q&ixF zh(HyaQh|$c{`q{Cpzh9p!bAQQPYl)Jl`JSg1}aVMk?em+zDlJo_TfRO`*j8IacehF)T@bXr2?(iqybq&ST=@IZBkJWz8;gk( z-tw_Tq|izu<@ssehSoqW#A@+}!oj#&;G!gQ*c%UKM?RXz;rGLgIoP9h ziKG%ZqzSYj@nkS5L{R)hiLJRXs+$vCMf5*4&vh!#?P0DESImfr?6@9B_{5&HcnNGM zGO%Rc^{`7nnn6q6d=TE|;=9IbY;w4$8ri4vC0=+6Z=BjJbHUjNoDB7oK0G$;nSKn& zsZ>;0%4{h_5kJPCXD)Teir6h%v7=Fgu;nPo=svFZC-+%5gtWG`nCT%EQ|lZ&fZahE;}Wuw8gv+#%-my?^PgL}azawH5h}L=WM*@NsGG;oi8>Ms zZ%gRSuHXxGrX&|dCO z#?QM`>&eG#=}6qMgi>cFiUU!m;t?bu^dwg-I`PRo|fsVr#~md13%^=GU)(*(z`f5*)=g40cjAN!o9O zeFvJBw#P9b(mq7?Yc_zc2%$lBZG0LV1tC1Q5*EZ_0k4BizGHh)P-5XLAMuNw!f~Pt zC9nlgsoIribsn^nS%R9sAc~X4uO^61IX-n@cC$g#i^Rj4XVLsS)h{Gnt6Z!XP=|tdR`B!vADc$!mr}%ef95P1W z<8&GB7RTN*w2&@OCc5)<@Y3JoShH#8h;uI<)19{C^5yWuM-HSSiBk;gmo;u@P5_qr z^JIRgNwNX_3OM2!m5|-LM1S55SK~A6EEQRq^OmRq*u(gk8SkwrYOAjqoQ0qTIcaLe zD=5xAz5NaS{(9QG;=7BHB0dGt^;;3BlyAn90vlz!fWkU<3w!+_zm_eQT|51b_0fq& z*cfi2LtJ&^#`@MxS~JE=TJ)fZRA+bkqB^#1zy}~lZrR*|V+p|2qHuabjE zw?`14YAD2gCXwV4ExUS2;w*d>z?FmXj48I6g2!*@yxX`1CVqFv;xbhPd;YepunV(c zzbYBp1gNqyAu7V@VS7LTv~y5?6~Asx?^H~P`zj}zW&Hxya*)L#mss9{TAf>;-$R!9 zCPwH9aM~jCQ)iAlS+|Mz+0T!L;JJ?1YiPEN>gancqu=ll`f3lpdOi|x&-rt<8`U`_K2a=Lk!M0LtUfQDp^D#Ri{<}wg$w|l-~aJT;>+6a`HCj3vbzn`Lyh0Q2pk!V$IE8&e{ER%NIYp3LgJ*AUgP~*X~nDQcDOo zFt2c~Ir;)QvebMrz)(a)&eKwj(gZN`mt^9m*iv~IMs|}?&9q{8k^iIuaVEC& zCNV|zfN!&dPw-h8Sd0nLvIs7n-!H}>%$~7jFiW;@S1YuH{S|DEL(7*gkDs0)|cG4BGW;?1-Ve4Yl*<~6{hyo zK|21yAP@?8EE0hyPET^m6OG^Y>K|0~p(Q5N`mF3c6Q&EHp67ZSMPxa9d(X+ZB)@^1 zBaC=T8_4{shO4~p-_(-=KLuAKsXJ@cR>>JJ9kxX|U@d36AE9P#@Y}OBQW-BD4PnxL zZ*we0XR3ZsHuAf2CgLGCx5`W3+e_T91w~G%j90#HqvMYq2hq247K0p?&r|$@@Fm^y zGgt5z34wHGA(NA*WfiPq5ya>CzE|v(cgrQcGTP_RV$?k$0ZuiTo z#^v*c?meR_3+KGdVP@d(#@g-ft*)TS8yHUM9MSMoN8l%U@arzmBC!ARWPMwc$1UoW zm)l{^w1z@-Uhfb zuWSR5c*;1+9;4@JOB5H_yt2AI%+#4C$M5QiSh<9sPY0tEH;{7k2b4w`5bujDLpSxI zVpRSXj8^BVGUnc``VjQ-aC`aQQIY_)WJS%o9h$%|bzG8#?c|5QM2_(jKm1^ViimQ@ zsQQ|8FviV(LRB=OEk+t1@4P>F3V#HY27(g7Za5+hDWWNJKOdivf!==*$>Hp2I&A?o z^|PBMMPkdFd{;^#dp;Lgsoz$CcOSAD_j+mvxkxesMu$pa+Br^c>i*#>S^HAQ$Yy#h zA#8`rzOLwpj*Q9=y=Gye_3p!P8ypOoT#M+{es^8xvTPWg*Jkx2w?vwYQtPSJ4M~t>n0)m&bZS%?au`u&`Tg%^F?X&*fFFCRNneq$B%W2Yh^X!2 za#98;Vr4OIyZ)-i8Hqc;oA^jK*-6#g^BlgIIs`$&1bC!Pi=_yRRpg5x?oW7HOA+p? zYsXYcxBm7?1=%(rwk^_>OL^u;=X4*HBIvq6;Tg=3bJ_)ymTL%Ls zYcMh{#X64A5JSvTzSKs|qwR6-pCkOShLDofFdB8U~>+H6x7;aE8$e?O|I zENvOKNOx@EynCu{xrVtu^ap)Op`~NKu0w((^3s2Xm>QVhd0trx)1K#P|JhqA-_XhE zD+d`i#Vr86eO#i5``E`;1x15)R-E0V>@Xz1CynW$nBFbc;XwCEuGkqHIrUd_>Q#GV zUIFd($x{gS19w?vf{q9Z$ih3ba0@z7x2OB&3DyMo%EDG+eE#L$i>=YO>E zU3>LH$jy(ZLlGW?un-f%hV0gNH0;jXy%BrBts!Ic;4@qbL>gz|eGZSrQ{pAxkc-;g zdZx1g@77va(>D~9-Sl+Su0bae@htK&w26ue%gIleS}jU_U-s6G0i>mb-c^y zN3MWYOGbW*pm7?qb`wnu zP}-*JJ?P`ws8@1aBM3>q?nCa@e6Nilw8IKfX)Bq?7vm00VxpFp?;$8lw_4sZGizLi zI;1m$^hG@f$a?0ViWEIJ&IL?|Scg5n(l|1f33*`{YWF-TN7==rZRsQ+$sYr(HZIOR zFE8AF7Cz&>MNc;U5^F`F_x5;n$5ftyH^yI&!TpjCkPFvCOA-Qt@-6`wkF42)!2k>hzPi~979-aAf6g(Uryt`N*ha?MD7C+Fwk0fX0kabAL zJu~B@{;OZi2RetYvea+ouo_b1ZG3KMU%$~aAXO$+(^T9w^YI8gs-IjwD#qgRPLP%a zv}dSROFCq3Zl5#7>DZ2Wx-IB4QN;++g+4&&(6A!i+U(nZa#qg)i7g5~`eF z+1IRe+5U?DV3ys0n!&1f#v{nffy06~c}EC*2uMGq9|JWH*WV<^GmbT4pA&>6#d(2OLXr zn^FFc`EZ`>T|_GJmWndODT%uGv&$40_=_=iPPrv79qwFkHfIVQ@E{P3kQqK!1oHwe zjlS;;hS}pB?L-I>A;iv5bMdjsCSEiF9kyi6wm9>F&XCRC(lbvh9T5XNl6Qw*@w4{o z#2iMN=1NIOot(5zR#<9_>sN#L8^K?vg<;Gw^tJ)o(rJ;3af<<>V-)#@dS5r?`F0I6 z&@lThB_}3d5n@Cc7Rej>!*lDyLg-&@?)pZ>`mWe4*yN+p<)JhN0#^DmW-`EbO+?Pz zFiHjYLwZsHsO1Azpk=89grmEhU)e5xR7P*kl-rrwS7}W!RmT)2FVH{dZn@pbx24O1 z9m|nhKFK?3`PT273a1*v5^rodHhe%@_IqqwZbw7zOrCPSf92{%QgXdRr{lG3av)Vb zK`2`d*O zMKw1-5Jog&vgTnSJoB@p1dAO43FVK6Nsi0FO12Bx$?(YLN*eB6TO_SOZ3-tdu~3#t zU;{U|bu`f~FT>&38Kme&FBlvYEwp~pUOu39D=hU%PAPdE+LNBFA^YS_c$1jmz%0Oy z2kLmpmqs*(@!S-4Bt)&ge1z2R>$CXWEvf)wTHO(NkV6Z`OBr~scVfsBQS(gy8;O=- zar$g}+GoOwYDFzQyXE8U5F$Y6le7G(1TTyKvh!bNP;dxP!9)81&v=_fi5>)!&Bt~^ z%!Hn!KspbxP5~C@(OSICQ_w1zvw@`+8$GLy25`Wmydn4(+?bX=#zx43RD1{;aX;?G z`y`K8O^coNx~n6nT=4Np{9Yc#mFfYT*ui6sV2(JIs%w~p@7@ct%=iJv&PF#nPP^2u zQC3d(_sO)o4qt}8PDK{J-Di77m>^9NApa?sL zXF($4Ap1tDZ9dEYq{f|>3)7S&uG!)va8qjc2G6tz+eDqXFb(7OFu*6Eru|u;^kH(( zxIi>z9V|r|fN?C}33na++N`ymgzj223@UDwcIc0%pR08<8DIa<`!qr{@2&OUpG#AR z%T>#E^^uzRCPv9fME;4j^$1Z%*BGEbq!{18FTaSBSN>uW?yUpbLU`BgZHuA+&id8lhFs)Z<9$BH!Pc;o>L%s=iS|p(kncv^(n4FBGn&6 z{0REGDSe}%lHOK-X9OH8yroNa6*ZF2mh1wf=WA85XHE8QSDX6_RG4-TgBJJkHfnI` z37D;+FEaTw9e$i*AB;b=v}~b2Xn02kwyH5Aj_5w$7)ctN--ACr`_rezSMjZGhn_g_ z!Cyyw&m4LA#RC;97i)J{5>o>!guucdz00mMF9l$3QDO8?gKM3CIj^hwWFK~X1DFk6 zt6iT|&Em$p_ahm3MK5d1>Wps8PVWH!Yrj66V3K7OJ9k%!YXqWDP78v{B*sk^g`p_H zCuW%GZQ~DtO8Ey&%Ra5vFF0Xg6<0W~hU~#z3dhu$hC-1_*h-~I5 zA5B9iOCz9yzh+djgD1kZdZe)u^=^^eLx>IP=Dk0@pPg18o}j?VcD;t?Z3&7za0;Z zRI{V+RT?#m>r@Uyf?!;?$jR-9k-V9?ZUBRHWS-XOnIP*3_(XM143frC6!f1e95wK$ zvdFlT@f)Y3fu|Z>lrEAgKpmKVQqzWS@srNw_iqW9)ANvAeSd`_>`ba-K!S$>)!Z6; z{M@{S=r6f`uAum?A(vnMr*ZdQBrcc?lDHuB`m8NORT&C9wfRqkcT9fG}#$QP=%Q~+slWni}57l-DjW$$%*MLZLd$jpZ9T-P7wv2_9*8HlSYK3!No zJ@p=eQmnIUxH^n$O6x-1JGXRb11h+h#^!82KWz~m_xq=CEj2K1~<+ zHsX)@0*cQIY|i45*mL7BeJ-u^^4kbkHuSJE^>J#f$opqDBbi~+X!xAEQPo`1HPJN!RtmR6nSg2M zrJJbvAX_Xb0ij~rqaqpCjsy0Rg;*~VmTKY-98nme^N^)W64*yMMRmhhAm%&|(6xws zPlpmZytwG1V+)$)auaw$URDOifp=U4gOsnvzR;jUHnpG^ntb!)v5i{CIbzIl*4Az} zWjCLBhA{S`9lLiLfYRXk0STAa6DZ#1hZ)r0{?gqW3yJ?nJN4lSfF}Z`EH5axH2@so zcJZg2S<=b5Ufu>Ymu6s5B>4x*AajIlRt2{a20H3(sKhWxxE>o;T`P&4qVu}gKkZLjRXNPg4b6@j?s!mwhY?a9n~bSu z)sCC1AV6~Fqp3k#9Ow+-9CWAbI%eVT$%_gy@ks&Am-s1ssS1w{Os^5zck$SVymjFE zvt=0^OyPV9Pa)vX>reHPR^a)=Zby;tDMFUN7NfJR8|<^lxNm!?GD^Gm!@Z&p*%YmV zcKu2#iE5`>-_;VdAao4(I4136biTDg*EkeG#&Y`qzr;jVCy_iGo|I9fJIOih$f7^t zQS6pj&}v@V!#pH5=*Zp;&keWz=qaXUepa>GkZr(0jV3rlzbWTjL@S2~`ev8qC`VO=Em>pIR&a61ucf`X*s1jsH^|@ErHESka4kP(^o*2C)L!mb z0F!&F#8{!5c{&`NU;{c*_sUrkVcGnr=(*}ux+nCVXg!P~ix3yHupTkL1XXcFs#vHk zbLlRd9b_{CQ7UFoC<`Xe%?P5PI^nWF#&PQFC~|OGCE!Ral;J#)GfXHkSuE4<{y|nkdo2W=+h;*6s_J# zeI;4mg6Nw1cEw`zp-VN!8_>NYNGR)>;l7TRmXh&S4?_90{~(XuF`=AjDo2aVKR&0? zP4UEYS;_Ips9;nM_r%v~7LnVuqXgF4r_0dv)=^-90&o3y-zIG9S&XUTMrU2GtY|+i zH8E&!u3!Sjz{Jw#&Jz8btO2>|oWO)BIiu!SFH;;bmx(>WN8gmn-WxlRO{O~AG$}K` z`m{MQPO?SW87Xau@X-TE%CGOTn(3J)v??arX+0a35`=I7X)`V0QCCyDaZ@(E?G4Mj!Fa-`1l z5VHz=Xd8@29n6G*V5kgWUUxqljfxnuhn@5cst3Wfj<%qyY_7Ha1_i?*#;7;aN4`0e z;ICQEVj6mfzwYKom8Sy5?H|I-HAgSfdeldfE>1P>*t%jWBpz#9+rI1t9WGtvV}&;3 zEFAac+J9q=3?1#qKsV-HSV+Mw;#*M4OU8!6uw~*y0`2zLW|LTRc1a&J7gI4h<^4c^ zSiP8)76K|5WJUX)wZ2?y-9ThggNUqQlWRU%M2cvlQ-b)Pk99hT;N3-mE%BDo@_5#U zWODMeN}W&A>p{@`^YnMa(lUASe9GLC=5%Knp|NF1YYZuBQnr(L8JmH+Uqkg#>XQ`lfqKzP98LYM89q_f^q|lR+|_r zF|>2_JI$Jwo+jgAcyWqxXeX4W{|Z~)Gp%wrzHhPa5tG&<1SiT61Rb8!ARJK=y?;#v z*BdCsaHi8JNTA6mYsio=sN*_M>tJY)b2hHwTz65Eyr+s;+(Cy=k4&?TCga~oVpF+G zTU6eED}f)TBRA6BuVh;t;}g)NB%N1X2*)h30rK?42;L#!(adWOjXSliHxL@i9JN2C zB3T*?`-PV;pLe10?>#kX@gr-$Ull{%gS3yzV(725N41j7PU9w+c=yRh;u~KW<6jS4B2b0 zA)Pt$O*)u^W-ieTfJ@`s$P$JDoL^QFk}u66(^AA!t_pn%_eo4GndibR31es%AYZN! zPM^|4OY4dmz{2ZGTqlSZg|NPVRgO~vJfQl2YzFjSLO)Z z^7rlDS{J*U-UVmS7BUQQFD*_C{!0GJWBJmoj&!4(tlyf&>a0NjpV8Lh7RIUbTq7J$ z-^18L1?o4^K#rlkEW2*HKI>5F&eY)Sm|a7!SZUmmJoJIb6Kehe!jtw9%eI}ZaehHh z>UxK4=vCvy8}G8k`_Y;iYaWH6GNF(96ml|wl;2{@=e%hMl|zkfu6Fqfn0(zxyonRx z$QWSegrU1d0M*B}k@oLwoIO~7l&aN3Ud8$mqmQ*nOL2n$Cr^w7K~~3-d_OPo!lB>D zh_cwLG*>O5P>u&`oNc1?Gla}gkC=z3te$#oL8GFn5n?(M zRC%I2(XZm_e@-Uw8P4tLb{JJ#E(3N*&=kZ4Zu7LejUzc+YV}0@i!hui8~ikD-(hb~ z*t>!&V}ShQH!LhM4k9%3wo7+)0*i81f0%xqqH=Q-{WfYZB>N&RnhH-Bqm zOXcpHOib?RI;jqts3Z^WtjjII^^Gj~3^74EEPvz3!RUM}*pJV%@B>DdhC&Ne5et{= zSD+OwF3q)~vSOA2QKI4#_Bz)0&M4p4@V0edqr6s{#y~8QjtCX=Uouxk zYn{|A5upId_Dm^i6Xcu~kr_9#-y0|&hEedVZgXZv9`IL)+fEt5tG}?|k1_C7)*B(p z)6O08J09@YRLPHB?ARln$FQWv zS3Sl1?oqXpC0cvfAB|&BUklUs#_?TmNL<*`*z8~}ObU=|kE!N zB-CU%{nFKYG^`XJGbx29du+O5uX42l&Mh%(OHLbW7mGnKa!C#67H{dbGk*0V;Bojb zlJEq{TER3E8B}2Z=*(-n5kndlMVA@b6#Vk+iLwpwIzy%Kv^#f~0h57S%sw?PyrPJv zo=3!B8wOnALQ!{6bgL^wrmdwJNaD!AYVDwP)R_>8a&@pbmK7m{7}Pf5w>kYh(a zo0^{dLbS5QLbxoIWmn4kt(abZ=}|M%gB==V?b;|hye>GgdwInq!7(nVP9gfDnYAi! z!1@?=M-r~$i4w}sOdHys+*vM6>QR_5HC!!xI^$=v6gFhZ!{3)XW|&l)F`5#-Su^IN~Wk>AzpXyJkkoORA6&=^Ds8 zDrHm4S6`~^G4;ZxAnrt1+x`NL1`OG}OaT4M_^Ozkw_|vfvn|~~IPndr4&z;z|5ES3(S0VKLa@&y9h*cOWGr2mjvG2(+L6?vA4NS0sksJtL@r2f z({5!0JYPzxWTtO76^=lk@T3a^a;Ue+L1%90rq!S-2aT>;k3wHlB@RD#S#1)r_ZvGkC294iedQ`sHu%du^UV4bA{Adn%Jln;R&*NNCeU za+Y$;H>>2({Hx>QqzxKo)&8nMu)u(QTzKn%%n?M+o**DC+fbuveZ8G**;5_&%BkzQ z!FBA*_(8aib1g`JCu z7j|!Vy_4C~aJCV@GkSf(myGL^`ao6+*e&Ps{(#|uyH=skt+N8%fEsVEK`VF~B4}R? zv9m_)B8Y?1xZj4h-G=(lyyNRGjTnKQRKF}_{yzu>AiXW*UPzww`9|~!%(KL%FUgwljO>XkF z;IS_fc^PnWC~xWyq6`13)3HEIXqTvwdqCXKA>StEr$1H|)^4O(4`d#^4-8GtXsn7JR^Z_0A9SW4q#X<5w zOVtJpPmy=XM}z^Bz6|81i#oirpPnUnq8C>pAX7->nsdOJ%JWk#5TuWNbOU3N@C)Z} z4Qn_lRh+hO(R+cAfq{xx--lfK0d8sNh5uORRm0)TLY$MTIgA$ zI9UJl6oMN0nF~||eL8gvbx6F=iTXPHzP!}jS6fRo^pz=|OLBN`KaNj!!rUpV3n? zEY!KxYD?u5_BtMO~vUDsbb)y8;nSsnyd9ImpD-GpkdbU(arkGGf2 zek^*;!B_9IL$)3tjMn2UMRE8JW?(ip0cm!P@ChZWC_Mz!0#5*Jl_RTGlE>TF8FMSKJfX*wLX_b8N3F`q+13(&2ATxGc# znf2Q|D~S7l=V|CS+?=g^s>WokW0ymguSzG%(@s%GkvNCr#PL{c5+Ha82KEALKqmoT z2;C_2_I+9U@&+!=kL`p2;}l2QW11r>o^eb00wu@J<_hp>KY=~XI1uQpZDQA0&%`B7 z{Y^U3ntvaja_Edg7F`WJ!bGd12R(Mc(ZIz3?i!Y|;)s*O=GbX=JzLX7)FDrrZcY-( zc-MdXoKlY1R0c`|v$>s>W*l-7F_UW|5LZQ_S#k4CE#$R`;!+-Z%bk1-zh)*a@~hXu ziF9k#uBwYQP-_kmcAMdcE^2M&*Nu$|;JK>srKS6UEQzvPDDw)!uJe*@>x{@}2|`e@ zFD>cb|?jmRDHux9%X{&M>jSQW5`r;#&Q-2hAzlkE*l+rc1P+ALJEUWDl3A>bNl6(&uqsGdPGy}c7X#NX#G=V z+0*!Bey{wkbtX*lneEw0Sd%t!7NGboU%e^LRA?L=UaLiuOCo5O~-#;ITCI!L7KWSauE8)zj;Tw4_~XT9NvI;BSo zRKD<-+m^{Gi+)@Rg^jTfe%8c1fB9LFH#cWFOV@Y^8jNFt(}kK>IOgx<*zDHUt&#p3Im|JQH$fU-mc3Xh{;q-i6Mj_~jDWJUpdN)+L_`2aw{{N19~l*UH5B>6iK9 zeEP6|m(y{Q$U$+6NN2@5&W!|{>8n6#Mi|nluVPS?9WQ%b%SBGC)eu@#VX5!X1u)y? z7)Hrcr7!oVY1wq^?qU$EYjU^YaN;w#W^T4JBA6jTnuMh(Op) zWq^C9f80Zx z}8Fl|-~n{DfyK%Cv{MH+%d zBCb(`32r66S_|fo)~7HoCvf8xv7JK`m~|LFLx}9lDKt2;rg`R&J*x5*#Mo3i8w^gu z!qtaaU|IDyKdby!?HagMK0AIa?ohWSlK4Vi9oQmP2+_nz;>Wa)3aRS}}K? zYHNv=IO8yMPKv2l0*wl^nd9z)#!MZ_V=PXc5whCVyc^(q~Ba-!i8FOUZ3fo^xmjE$7%UkitiGB8J5A87b2d z?m6KRdz1{-Ta0f2Gpj*95SBMRSvQCKsNRs9w-+#J6Y=ofl&TM@bih6n(ue{}Yzbkn zzycTONmO%vDd3UydbfS!pdk&0wyRX&>8<3MNR z>{~SGAm}PPY~>krS9Kn!0m>)!$r+MNu6^-zI+)M9sQb_jgQgK)NZmg+U{LEvbD*fv zyQ1kUB3XnWeG}&3!@NPziEj&!ANZfo*|(iV9Cpa(D;01T@w~1+cQuaNz)HF)$v{-g)S1Wi-a{g+C&?N9cJmNs86FmkUl6wd0buff!J;z#OryR4kU~ z=v)PK0tHP;Q$$p~*7N57V+zQT3K!PB?BPn7iRU3^;5s8P1*am$?2byg(nYL^>td~J zV|R?m0U?6FR9KR8V{#G%gU>70CxfCG6qm+gaVy*U{GX%UM~b9EkbB&L<>w%Um8wVD z?iy+R6@)xN+(>IP(DO=W4xt0}tEKAUUe`d*ruKwbUF*G4Ey9y2G!#}n-T^BhCF3Yn zm>|LBzsfi1cJNUEn9z*(ye{_!I5W$LO_Eb7sJUkVfz^D=!#RuFxI1TL@bbr?sB$9CJ(gZI(%l%Tx7e5S>&NVI**dx2jz3I=U?X( zbOLqPjSosZ8K@V#v9iypFB=~StqTex6TyqYj zi^h9No6HTNaI;muv?ap@nr0sQE0x6VIrIX^H?vJh@~1-?mHHP!m0D?jhRCed@BysO zdAxOREOmLbHx)YIZ=hsk%wOa&ts+XDv9y>J+yhTvOYMcEf(FA78Rg8!0PRp-b-pzA zmF=m_Wv~}xC&%wY=6a7+eNQG zz_LV*xMq^2cDQvsRvVk!tGyQ>U>N+UKEIJ)0Yf>t(%;dc*B`x((dnYF4E!2ux*QNo zh~<*g+ToAx`7-7c<4*4CB@Pnj2b@PY1yc^VQ0mVnmDU-GJF5s&MunxRWoMqCmOZn5&KyN<8Ji5vOCj}WKE2yUtCyb3gatgg=WJE zsK>!%*k6@0F);lx+$h@W4k1B^Fs;@w5ZP${>l3}nO!>wfcxjROQxSbU?!jGx)~Uuc{3EGQTUEf; zuT#FTfF0IOq}mvC3py6p#K;63P_>t#*KLbh5>@Pp63vKs?Nq}KuZe7(nm z)J?iI8!eu5b>BM5$YlYNrMI#I=^D*g!4-~>xLp)K*HgdZ@DUu5R>>pgqZjACaz`2y z4~h6MTnH%W_slu*$|MxzI+{z2$`8e ze7qdGgwKiNz1c~a3Rf{1bxJpYf-W(Y(1(s#T*TX=jZM-EHpjI*qQJG$)nTQC$G4W3 zOT+cZ!Y#&sV$ZpsJ{P$;|I4&UCE8Wl{UTFs{uOWhIx08_msRYOe&t6WoB zy)Xew(@bfGktBojR)5j6&LU-J*_cU z?zS?rGuw|jmLyJe&iepexFauK@^30DP$7KDPaEOY@kw6kcP3qfrGiXULX!AMM@Bi3 zGRpZLdxQ;O&u9p3W{qioz0QDzTeE0q$Khr%(764j*Jo&`j9JXk0ONb+40~C1*UFSu zq0Riev(4+*pykt05@K?eHL@!ZZSs2(h8uK0 zmJnFnaaP#!WHWjF=A9#|4r}SXAD;bsV*a_FPJ-LeK3F_g{`m|L!Y6~xBIv$8ZUh?y zGr#IP)PK8Xhvj$uR184|(iu<03K#h zcG^2WrA}dqJ7kV?KAyUAWp(K%@zz;p7WK|M#?jPJ8M-=sox2B?eDKc-Y1aakmU$Mz zS~M^-iFQQnbU{dAZ5bTqF9;-K#3zo`eo*l=zb{Rf>BYj_RywK~XPT@?elGD5$M3rw z{se|JbJ4Q>D2{OkBW%>V`O_{R_$u<7hO@d&dmvr}`fj%GlEO^CN|0mWMR2YT9_eL< zKAd}PhZ@WFQQ-}xUS7;s*ATP4VlXbE!UGFTg3rECKEYYf+t+yyHK7>x1ZqkzzwPxKr@p_@3ENBe{VGNt&BQ}NSG zzx+Y8bchuBVk^Zsx17TQOSNgW1?ATHkV}5Ew13W~E=2Hw+k@yf=Y@RDR%w30D@&Es z$M=FYw|y$zzR|k5goiqY#n=jFP1GPb8R;P&H}Zj8$eBQPd?fTJ3D#+nN?id!T?>Wg zeAez*&iB!fz$El@9 z##uD)OI7No=KVD0Bjzj(E?Y1qbVr;SJ^g;+2SvtKfr@So<-@>ZtzJ)WM#kP@l)mqE zqrGbf)!8Zggn_~1+_T-ZjvBV4Fu(F5xfe-r%AzDq>d^!~Pdrjmzadi_yY*)YCLN7X&ju=pZyjG8FXEtl{OD80DNM6Ft+e z#@su}J*u1sQ2G_$i{b-{-K$0wL;c76<7h}sU-pzl9MP&EnmNDm72~|w~)}RhOG6W18|0IxRMlcp9nESb6yo{ujeFu-GT9m zoU|x#-om1{tnjdWRbikv&`CpsfQ&uN|KVj5GZ{2=$ zOP2z%%{%Gz(FA)uT<8qz6~O@|XaTGf*a5S^yGth(eGz|onqZ5|Xy!B=!d9u8L#!sn z^2e0^jAm|f9cmygt`QY?eQyu8!PAaeW*x)(zL4*~K=Sy>#U(z-A6X<9T99I^u0t#c z2kaTARZZgczc3GhGV;ltF;ECpt$2Qbou>BSl|#LzpxZX(OR2*Z9gv!_n;!eOit6!E zIt$42UdM}ryNP6~c&bki8T|M3*s%=TT}Wz1m;5{Lt*W0s=>v`2!u>+eYM&)#qt0x_ zy&b6r0gKFa2ALOlk%NIAexeIcSj*(^0>y`oVmDz_*-gj53ab3Kbc?>r} zeaCFg$rd;SaPiA_)Y)Zszn$tP3CQ_Nu$=W$k-i#zZM@7t1Q%}p7ad+%FcGp_C@2U$ zO8e_~%4qWbG#P9)eV0!3iABuuJ;z3ukzO;|V^c5~hSsx~)1C90Lr*M;6fB*5^Mz$^ zfLF)09lOq%ckz@bgYpi5r48lzBS`7irM^r|O(&_V_V@b}5BaiT1X!zlbO<#t7t>&w zHOu6yqi?baV87 z#VCT{^@DJWsY_hd$xpL$srjelb50tXFN$dOw~U`i4GlActC%QZYL_^?8(gRue(eI4 zIz&_5S$aVK{M$9(PcX_|!9pSJ{nr3!lkbm9Aiz=&Vr2E)G0RKoTO>nIE{uW_zqbLD z^{|s@jlm??oUCXY2kY*w)0h4z%rMqe2KgI0B7vpw#t-|W)A_=d~*w#hM&ciFnI3_~ZPL`10!WHiCAAwnJL2c4aX9>vGa z0L_@n8f*@7RasP;?_l+u*jipb3W^m3bm~G&yDUK-wT!>_LV(UrIA^)tOj_~8Z)MIoF)uw_>nKN z|3WMEK2J^fj%L)_=oaJ}z|pVTx-MDI8#7l;18*bjhwQ3&`iuM*XKjW>BQVSZW4fFP=jZOueQ_$135;trm~FYqh;GTeZO!!}K2kiY&U?-H*? z^9hxbn0H0XOl1<;{a9#jojDt%@(D}9^;6_uW6Cb#xsGHyg(IaA!^#i9l7zFKk;s_z zNU6;*?QS+aaUII^B;MnC`S{&e*3m-l=ylO*t686v)h`msL&96~mAW;(G^mXGU0Tvy zHCeplyr~t{aG%G}jD+~lBU&xk*P`$_ZfVM0!e@mh1=W)OaM7r?%o|08iLau!0Zo7! zY&ND14!B)UtZJF!D9804E~XT(Z&DIEj2Bs-lk$6lAV3S=ZEr+^JyLubky=dc+{QkT zn+%bK;HydSD*Ng_db{rQl$=>2I6qfP8FkfgNm(xIs|dZQ$OX8-f|M+JC~C%q%CD2F zB2Y>330@qJIr_&&l7DI@ef`Yz(fqwpHNU<~bQ;az7}#b(p69Vr!9@{@d!zkC` z!Uj=UU|E$hXy8b7Su|3NmYUg8;6B=Uw6Ym6Hs)vS^b@bG$5D<$v4~Ca&NoFPD`5GK zwKO%=>M9~3slh%T)|V2;cT#)L=1f9q^CpNXJ9f5Kh~|=3R>?Y)5|OsT$POAE5H2-k zP)2fbY)K~EBH$|F^xO(w;3CrDbOp|+y21k$L0L?h;3c$!_T}p8`G?$%L`-j}pSDST zY%l9zF}vVN3d6idS31cgZSJ%VyHD<1`|J&~(7_vr{yvM+41$KW3X1Pn%57WC+oX;Q zskT54TUGnaqvnf5eD%}v*t9$VsbL$N>DW`3C{$y{zXy1m62!(Pn@Zb+bwik@i3||>-pBfi z1!ZA*9(Iog>N|BTjc69zczq~+g4vjFuj*$Sm|Fb$h9+Lg(fU#j|0bFb!!oIAU$Lzl z6sNZjj1qwau&ztrqG$M{AIvkJ%hsTcEM9oQur07gG9z5l829~*}A?_B3SL}mwbAsGOfbrdMi=<;AT_b(@_uiU zV+lh%L}PGexy*mefXCO1qgWeMx{IMlxJa!kO5}e}cc7)&kJUDh@9=1h|I9FyrS+um zB4f=KW1851-j+&GYCLmpD??}87Ar69pu0onm#HM_bz@Gr_}wrxw^E(#cX0Y+pX8S| z(^X{94D5pa4vnLDmKh?8nvBb*QxVY0lPubAh)IS|yPC(0LqCqiIOG2YR$3>Q3-AS= zMGm2Okur7$RuIsT*IQAjIUT1F^4b++kwlJT1ahn7!E=QSsE1$G+d@DlHR@epkAaI7?*|^$ZY+lA%rQTo~(fzs?-;_YH?FKkO-LGOdV*=GY(8hT3UCMJ3Mi5hoqUGEs=%oDZ|L;93CISq%CC~B(r7ylnt4G%t){zCA&t_rNvuQqdjSs<* z2dPB9u>&&EV!@vN^r@h-1QFMe!ybyB2zV4(2rBfaD5>DFr- zzy3YPb9TOUK#qm`7)4Y(dR|7zyvo;0YaW!kJu28#A}edNP}KI)s2FP`X(0qVi}LId zsK!8&FX4G?kij$&+Oj-gMAHH55^+?th_hCn*z;M+VWWky{}J-3fIwX9Koc)p(WX>N zgV1P?E$T_YX26OPsIZqBG*kE$AG=dQ8^eA$yv~*y#%XC|bPstMqDS$%vRNL@=XFN8 zP|K>bFD$_00nBz6`)m5*FbY{%TF4asW+3#+#G8$7 zSA_MzC$W%KJ3Gu20~W)|JZoF1*$V*HLhhz@%L64V^UCK!-rLj_2&AJYdM-!qF-mEalpLA=5=JIK8Kv2YWc|A5SYWA_kO>jCJa?B9X;Q z^L?wENQk+G%+Fj11qX=B7jCT@FLe$;1?h?FI)>P_WU4d>oGf#xbdjSQRa?n=YXBXC zjkRTmi|ok%hnkrqmY?#Ogh74#aMeMyg4PN+o_B9a4Z*B_^*FP-N>osm(W5t^i9~F$ z#s@gTY7G=AwvG&FHCWkGQdnnmpeajE7;_tl-~3D2SX6=rD^L|`cCbAP8$Dn1<-`c3 z|81NUu(jXoRQmC9lir}8(ss(@i+2eCe4;__|17&oJYlW?%;bu-gF|-D(AExD+jW72 z0bRt?H_{f)1Y&SOLStL_%^@|v<}b@*NAn}J%4w!Z_A)goRxdKqWexframHN@mV zfnWMU0oC2e>k1H-Q~!R;lm$S{dmHEWH4@|D8vylAQU%RIt}ayg`8$wR^e-C)IHlrM z)^>~&$ihP42Fb%$nIMRu`t$$>5zG^@cb!Q1@nph$b|BWSWEcSz($?y1l_lw8Xn>!e?@x0%LJP`BJpv#F)yB z>CZd4G^k#0<6SRpAdR|QJ^d>d2o08eyP*cqlH>%m@O***245=; zJk-k;5oW`+Sx5lT%MB1aZsBSrjE4xElTxk|pZ*#9*Vy|G)dz z0npO(DCZr|1lXrLYFBy$oRn}T%7QmnNjI~NlTb@mfU9p3j(sI-GPxMc=dN<`blzdo zF@b%PWp9tGKt*JvFJfO^^wN96I)a~CjS@?K)P0|sqcTZ5_Gr9jvl9(n!^T7ga&wrd zIQ@ez-J!*{#{z~`)Z(NX=w2x22HTT>);Jc-`jF(uNXP+06J6mR$e*_yzwGHE3-xHb z=%np}NtYG2u>a-vL;B4?IM0w(`~%J}>qCSYM$3oGfsIs#w(Zj3$T??bcUEL$VVw0Q z(k7H&>ygB_=hr=Qb#h0f)gC9Qsn-V)<3k3}V_cIRddD|2?PY@zrmY*FE{O-jFo#6zWB(W%_R~86$iTCDe+^xhb|N6UhCBx+FZG| zmmT>tBW>2K@ttku2RdQ^9L{UpE7;C+K92e)?b7DTE5!4@lq^UJ{a1QkvVv4!lDxD! zAfNerDP4VLZY5(zA=P>e0Kx<*fJkdZF{g(RD&_?erT$12Ar4tczq$lfx+6JzE$rk7 zgg8W*!I5$L?TPpJKJ`I`7zG_qcDj5izE93Z@9$eHew?Vu!!M9ay zjMaLg1b$n+r6VDG6`|QDQeP@Y4h!o4k`uH3CdkS#bg2}1cam-r4xzY)BBQyL^Ko!Vqa{+%gK$HdF+ydQT7UkN1Wxuwn8q zS~v*~+rsNgK8NNJEQEer5Sy8LP9);S5{6#bfNOI_Fb#nP-9^B+$ zRasyU^|WcI29=?%q=xqa3yu8rO`mhSMBm}R|CE!!I6A5K&{z7jpylD#=U*ZRnSxa- zq`{+<6@}Nhk7^sEwas|@K->_Et6#r?pVLPokE9PR;au|AB9EleX94P$!E8hn`?-XE zR3k_065z~e$m0&^ZV$=!ff?DY6?Jy?!0y{RS8BTu!R4}au?LXrJbl)w%&=dFJocIs zR~TXR6l+dr+d4c9@gnNZhxE7^1j8KYw#~L|Hgd0-Xn$zV;{x|ECili0&d13`t5_6M zpm)VeDCRS9*(hi|!^sjX~5QgG*Z?)gMHeTx%X*QA~E6u0UNkd9{uB%Ace{hm| z2D~&6L;c~#W#dXUWLk2*Zm2?WU>#L4YE@=FOc+;j?7{BZ6Tdy~9UT1L(MiinE=<5@ zxb@aTX24)3<3!WcDaKfG@VvLR9{}t00ZMmvrTz`1Ht*%@UixJ}3R{Q5ObS)!3U69x zwMRIsl5*8`^l8|N^#1=GE8K4&KbW`kRpYb)V&~L7MotDc z=l^E_`<-UA&TH586tYu{X@A;V`O@!iy4h>Lk?q+S6|A#_=CCpxuwEU53iLC!k3Wh- z{IQfPmI!b6Lt%GOJW0^lq$+8|^g%?7PxrDyTyG}rWKBZHG z0K3GfGxLd?YTru*Tj6#;rwW)%5RJ0!W@~N>EZ?9#2ZEf;!-5Zt3IyK{GG=wu3SbL8 zN#gd(V_ssUSmaeeu;Ac(Z!EtGWj!VMTD{IqDg(3qzgvrS2^yL;JyBa>uft$V6$5ll zpuaQ+yVXsy>YC?xMI#EzDpu>~c_sH~T!{(KSuY-RwzW&-=+CTzT;Gc%=M>WaJ`&)%wnXw~ar)V1ZQ#NrwDI0&FPFjf_p{?`gCroS5@iO$81o9HcBh zb;bV<#l_kX^Y(}Us{o%TmdyJ%Hk=A2q{dCCDkx0&0wC)BzD}|D+tl~z)b5Cnh0h6P zC-=1Sg5L!UaK0YKWpi6VsoOKR|8-ZFXn9d9mO`_dGkDAo*&|LV?N z9;|-c`-viG;-lT{gvtLk6;xR4;?xpyARswHoslyyaRP8auk`d>hqMq^$de&^9l3Pl zx$R#N4AASi5JA$y)e!c#>a_S$p%5&9^M^bOS{h@J)^14ntZLjlcj0SXUjEU=E43-# zSB6&lxJ?Y`;lNS%4sW68zEHFkj#C4sGA>>m_+SiSeCX#(2eN@n%S8*Gj#q=nZW`|k#S zFEsZI+qn-)>fmmX=FCr{VSdoZ;E^%ckglX#w+ZY?@qWb$v~$uikYBhoblVZZvqE^m zR9CnHQcHJ+)Yde zIK468IY0qh(i9Wp4wOtt;!<4iu_`TH`YZEQ#)_1U_y=rnhB?pS}ZYULItX!g&M1>4X42U6@oKmx}*ZG5FhfI)lp)QzS z8Dup6YFG^Ouj2{cJ+M|`=C}S}W){LcG(1dPIV@yKX>^z)CH-53d@IuS&a4m?k!rAe zetcPb$Z0kg!#JT~!f3_^NokC-O^D>-CA7<<4n&O={?L%lfN5G(uZ!FPLBwYhrr;FaSv*HB7&!Ch*uP$*wvaOYBuJp%dLx`2$wqbY^)_EW;=OKvr#SM zepNHOd5IegZmCstW>eDx#{Tlw_sV+?PuY1LIx}Z|; zex?h0V_JEPDsYJ-Uv~SU?v@~S9GQZN3{FYv<+w=B`xtCiAC@}(N(7kCqgw)=+bFXT zBTP*y6PP+8?=uzTNkuU~}};+Hw2dve)KYWD*Jo-lhaeZv_oun&$<_Pv%KP zk?@I(noqw@q@JM9}}8BZ8T9 zm!V>la{g}4Frymw(3aC-iLLu+B%x|EQX}2CF9q?T>F;{XtIzR|eJThk3+TRyrp2i3 zLRn)i*>VzyRcX77RqYxxq}A+Lw zceylHjR(6S8=EGul>$zvRU|*RfJ*dfYocf~(+Ad!LBpA510!ErO;Fbg(7Jd6vKp| zX%-|9Nd;LXbEcQu<$s1aJb&xd?P%pwKfw0J-=4xvIb{@2zU@hMB|GGN^X8dyN{5iI zq;G^4u2=Ecr$pHh{)+MPhL#C|yC(l1IBrdie2`4Eb-)f&9XdyK8_@4xxN+9EK2ezI zK`g%)FZh530>#r?6)x+iM@($@8<%G$o~3J(W^b{pA8s0-QFOc*&p197>W&2JB7Y?9 z-|Pu%2h1NNo1-hk3ISV{ekbo9-5;p*Ta>zk_^W z@0vAztyp{o2eeMTQl20|%)|I>vlCy;ds#cs_uOVPVBK6nb81l>y-k65hcYtbD>vWR zhU54mF`0#`3=W;$_Vb$WY1W>f(D%~*h*3>?zP`OOX|mQrod5#^75qIQ5GVgG$2 zZaaJqTC{4%RPaCPV&dmgl(P~~9MZPR_1Tz}gd4WOl7!9;q!bLpFzw}JV_$1iwB7qm-{KdEvFLIJYw`)!8f;B57 zAAZcdjTP|bR&0+YtpkfGBTE_LKKSXcZq~c7CB|7}x}8|BdY~N&Y$a}K(uP*k+`7}N zESy@LN>IIe-~!ul^<^fTdQ~(jED*l&Wb12Vw+|jgiFGG^=;veT?bBZIzSuaz#F4B3 z&l2~;YOP^?Tb!hn&{N`QLJ7H9?IW|ED-62r8(=BBJgLWpl9mFckk|#a8R)GUlDNlc zTLL`lDr<6IqpV_wY)roQtw0Pvu{Z}1k@7td7keKxwhreYQ|*FPMpy zRVXg7q})p~XZ}`8bSrV9b<@+2VEl$pMf|LUKqmldtt%&J0?~D#DZGzu<+F}F=j_9Mo;FH9rJ%3tL0kv(;P8iZT-O}Mj2jy*X zfqCjRt)l;Ra@ZenMyy%+sYjC|;tNBC8to~^aq|EUL!=}lCBZHnarLTw-(rWZ3NVyiJKGO03P$cx; zC7ei_jmE`Czm}=}%p}Ie1dQGr&*`9SiaL#!TDM!cn$VO!wP7ikD%#UePi$Roh&2F5 zWa)+B64uY(QOAvDX&00sl>Kd>VLEz8a`4*C=h^fjA-X;f0kziL60el#iz@gJ6M6JU zf|})nS5TIb70Ry*zlmd?^@Qf`A?kc%v77uS!fb@zf30bFBHmBR7ZRRz#>3Kk)Nz|q zi_4n$u@vcre_2uCT;3YfSpk9mt2rHv;)eMvkKgty+$4ENqkT9MyPXh+$cOP;xHBei z)xacu9LhZr$<@IoEB67lB!xVBN|*JTe^lKQNep{%l$xGRe3mFHt}^y-t%o3CI37c)fgM!Dcp8ik?CuPc%y3M z8+^SaG(e<<`Q1Xh2`wquua@FG^GMM9KGpSn=xOn%)zEOjb+Y5Q=B~td{TI%B)HZI+ z7Eg2dGbixb7OYIe7!CRpVa(r?K8bDfM;Y=UD5hRNL7fk>%Lz|>S9~e@!F$8P&GATc zRC!)8?O8B2rV~;BvYuBa4d0QwT%u2vS87)wv#sE? zeKsKqO3S9^c)Dj&J4@$~f*VjseSqC}jluJq3LK*&3wI~qIe*KA9~AmBuhp!#q15)o zc;)Mo- zdekkDe@-9LHr8@Hd$zB=)81Bwd6G($C`dBXMLDwI6n00eS8)7s(?{JRRWQ6O+q3J# zmD_Dsp!EABWu71K*6oj}1U72q+`z_@f#-diy{xPfhRMpQ6Pya|Z%Z3!L+{BbmY};6 zr8k<7vB(&x$!TE<^QMDp&v~+1dK!pl-tKjsaxZOoT&LY}@J~epq4IPYLT!`v02;x} zn7&PD(;4J+SbqRZw8~0U&}B;_gxW(UMNFTH3wRCC<1KDsFuJ*6g<{SttU$}BXfkUO z-baG~a^^cmAQ|f7#k*@qZVt}7nHwiA#t4%a{iCklDZtnF2~+k8{fpiO{BEY`-rn0X z1nSYHz}4vp22h^LkUx7>E6~I1*pu@Hs|qBYLNfWNGjL54Ka!v;`Ul}T41v^xeFK6a zjHq0BgEJVTivVvo8lR~xdBH1S#Gg{hOm?(#rZ*V$*m$)9dLCz+ak_qEp40#z-kw#8 z_WLh|NMYN5GL4+YMU}x|K~dHfc$+`*u;wnKP@U!{X#;>qbBB*CBG(JM?07-I8cT3l46D*`Lk&I$yn zC^EPjR1D%|C@zmSgP|%S4BCMpbK~P_GEu`*&@a127huWSV_;@xMl>?CILIjp6=^>; zQRtfOPnPvX!&t+LQkg+|2T0*S7)AK$X=g`UP;eV>dhED$M0&OapHS29nDIFSUzgPd=@V@ODw}Kh&#i$OkLKWF-i_8f88yT z(&V9DtNSwCP8{>UU_I9Q{f`o6iuG3?xk-s{_tezx%a%v-IWP8#bj8uZAj&tv<}l}> zZAc(-|L1*;6qZn0>{UNxO$)_<&n=&;b*2*HCcY<7UXj)EO-DiKBv38-<7+p~@P&@BpA@zGNy`0c1p7TB{gEOVC8K4ahV&;U^P%qzLOfl5t}kTZH)v zJ^h0?Vun@F?*)TsDEULnXdM!yJ9m4i&}L76;+O11M1&w#;3<6|2^a@ccT$}Hr|<7m zT?9-tfm}u5T6MYJjT6?PvVx3QnT8QY5FBZC0eCuE5S5*sN))Sw;Xf$4+PTgh1JBy>!tjfk5ep8Y4O{bVe zupVAfHPu)H``6r>iw(}iMw)5>5HIJI`{l23d)U0?NmdxBWtKSKX8-a7=?`Vk%1g4d zE1n5M3fVX>!(HHFF2$8q@QR8H+tp(Jex%9(h)Ep603UDlLj$EMDn(A2(m2R0R>>5G z>93wDUn+8gcbrx|q}MBe?q|LB>BeUAn>(7I^)j&Pt}JawwX~j=X$~m44-%NwBn6lE z*|hP`1*teFM~RAMv=$Dh)B58=K(QGmlk0NF*{o#X4nMxP>MZDCGTgSGs0SgaNY*CI z%0p1QpLvpr7dE*x!@&TFl>>iE3U0>F$)7{(Xnf{i>#;%p2whv?v{5j6V(4crKvwFtl zf~_>$Jd8cV;HmuDKY9a0bnZ;6`dWoMD_Npb3j++N9q(x~8XPz#+&ax0iYiv>DLv5M zVk0RlekHvsX{0s^?$;IlNMpRCJT!mDg6e+1*{M5F1dT05$qw=BiYEPgr>0Ku#_H-v zz44r|pk8sq&Z2~!;TfAjPskapf`;^UmG+LCexVH_Xp>?-gYCoB6pHJm|;CC;XQ@;$Hk5PF|C2=*SzK zSY_=A=FdnrWvo21<%Ei4$~Vl?wV+}qn>7rxPtqL}J0x*eu6&_|^cCM+H1Y~R66Ibv3a=enVP`aq6RNBvhiGMr@tFsv)dC$^Q z)|KRJk`~IRIO4BDDp`& z&W2&g(Z^9^H zbYb?FNPNretqSh${%}!siCbcm6?1+B{rRo}_E{65v@54uFXSaXD_y(&h!;9GBQp^y zo-BVVzvL5H`gfsMgG>pEEgx~h+=*!%ezc#m^;JnBOvmO5DN8TU6dCDCDy?k(Ykxa& zDp5!)^z2c>lhBT@27~z>nwhZyb`LI#Hgjoh4->$YkT9I!(CE#pb(|j{{87-`Wjh{& zr`54syNh4#0> z2cCg)LNCGtWwxc4!=fEVu!Q~Y2=Oos^kRRAQYEIua+1ZRce=k-cm&ayFqQd>@|4rxDD6+f&ko2uC3|ME4|U zvYz$~-Z0knQe%ot+1R?^Rc`|zPa->V_%wp)&_^i|nI*w?GmhFDEa#kckOmG8;JZka z81KJXVEwFy0g0&{9Yw#AU)#jjYiXb0=&Q{PY!K^vx^_s*_OLC@C|DsEOKoE6L`kwq z54J}_szZ9G!=t#bZ}WG;=o0JXl#0P8`=xxLbtC{z#l9)}W#tqz!PboRohA zEXKHQ{9WKSQ)qc8LZf^@%L{Zudt+gjm~`ZaR({LbJ4W25gc^^W=xwTtwc<9?zHd3o zf}*{lFPLSW&Nt|R++M{1y>zBR#^HnPjR3LyUbf@Yj)D3$nP|k4DW7JC=~Q3!VZV{u zSHchx1bx&iB8>Cq4;gDYy}aamVRh$sYdJoE-l!gaCgS2Kr|pGA3-4e{H(iohlVqHu zVT|8RhxhH3nHqR$ zynrkZuI=GYrFS*N6#;q{G>QWbZVV5^gVCFWzS>ha)yxnwg>8!R_sXK#m+D#b;a(>l zRcwH`F(0d#JH<^LY8n&Z$R06+=MBnT$<2o(i`_IbQnw9Duf<ocxXVY}GYhv!iC=CZBriWWBF28ivVUPw4%2ri#EXwZItgtrI5FozHg#{iww2~u%6yd>}ESQi*piu(b@U7GDiJoM(SVFMEZYu*)}7X zg0_IVk*9>^`M9OKAGf6ssu+1!f%S@A5~js^_9OcX68YWedm@>jahZ&1&}ryhT^<5i z&1o+iBs>l)_62__S9$R2qv)}FOM}w&opCqyIr#V*qsTos`;+*)Ro}%{7RWw_qh)y| zgOU}aN`}kB-34j_>1N!kKDX-goXHe9ShbqLKEiQopI|k0uEndXNQwBL(U714o2R73uB_g8ru?^15zXE`*qnCj@y9Zd%}Vx6^iPP1XXs^d zzc;Q{hW?k|s=rdWwr zZ?~y6m4)b}GS_4&E!fDsD->O;0c?nYZE$&Q$r}V=PkAj@YE?FzVBs1}PQH(V^bLrp z|2Q(G>X6vfcidB0db+?9f}w&jYuF1 zJLqgq1|`cW=_xaTS&jPcC$-RtVll(eFdWosR>D*=?dMKu3Y_M;c?P&It!*5;h8&F| zqWN2{PCnR5_8*g_nh|D?`UxW<+;e?x!m0GL4ZrSWrouM)5MItYrMrKcWj3KrvgDEG ztCi(}r_6=@lL%%n04%7k(?P+bE&Oi$6camYP$o>}4!K2YQ)?=%c~s;{UX;7Gv(w)a zMe$}y#$ZsS9l3LNL`;Z#ORvKzr6PDJUt#mH;1j_l;jJG2Kr>3*yj6bmbPE4+XWJU0 zJ1OO+%VuUgt+M8+Fbq^%Tm~?^1o8tUY|(4bUe|an)C&pNWKs&`qE*Mfl2FzE8%F39 z<2x)6q!!a^RN5Hnz3EVX3C5Xp-Gxx8HT^_N{B$Xu;9gw)FJ=fI)_~fw{jVl-lqQVo z;E!o$Pe@EcCTlB0dgH?^-u7a~%1ME`RU)X>OtZ#WT~;|2Vf8+nPd)Ka9DyZC;qH-{ z*lI@!5bD&NIXrXEV5Nw>$bM{$H~ZakP~P{Or!3X*7~GYEVSDWtK3@ zXpRd?GAmNH0-hu6;+X$zI2Q5DF9e zfYay-;kUjlNV2!&XyxiLO4s*H06{>$zxZgs-u9sd_Yj5?#p`fk>>F+0iHz>3(kex> z#eKsh5V?}Yz5Tw(ch8(9Ta|lNd`|Fan;%3AtaF6hZK+uMi|QEX^o2zy(_Vul(Wh#; zZBKwS^lpp={TOLS*0lk4*{-C)8nom368hM5V)eR*4z?kQ+A67=f$@b++CdS^A0xQb zxN7p6=Q=tKTY$6ypC{04n;yR-4M=0N#^t>V;D2Xlk0#6>$oNbL; zI<6M7^-D-3b0gax*irdBEWWCy(M+XCdhRQGq6UXSgK{jS8WMMNF8`j1a5tzRvLw7| z_-(L%(MMys?H(bsz>he|59m7FZ3raU+I!kG!p05u@TeZw?ZlX12|+V!JX);R3A6gk z_r?{q)^hQ;I#&!%#jf@OZIX?xd%ST#OMEH2!*4PU{dxseGUme5_I`UyS4SlN3A6E% z;vvrOSi!Hm^~E)sYex|I*s2bZI%DsMlQ5+?bk_{NDB53=G(<(9wzSN)>q1o;HZLls zpX^USTE}nQR-e~#JLfa-d9bkVDNkr{!UprN1=*;_Q5mVXdE4^3FfZns3|Pcsqn4t= zRH`@6Em+Ho;i$1_%pUAjP}Mqs&`0toRfK8G03bCq*N?))b; z;v*EfzoS&Mad{dYJ%=c|)|{Z>HpX7Q@-kY*f7j0aELI z$6wSRvlPF}L}2*{?T#Ra*t^1XqHgrl8Wr3%c_^P_#S2)5*=7VL0Q=2lUoq;pr!3JmaRu(Fh6*MdsXWA>xJ?yze8@K3m>J4j2PIl9{vAY3MU zbzsa4Svt%_>l%fYfriGQM*_6b5}9Q+q464-zPJrgiJ|q9ECIMoR%?F7`JF+*)`99+)){Fj=~x(oY`RGmwe49983bOxwcV5&y_en>+xUeSIF3xJrdPPhI33mkeCh3-z57OD+kQwi_G#g{CgUXv~IQFNMcLEoe+@}JIf26 zi{h>}lt3ez%+*0d1wCVS^V>bVZZX;wGcm{fE~UF11JCr4j2=;Otw{ag4W*3b=E=^e zh*V^)v6_vqD!OP6*QzTsLZi=jcA_s`Zy9y^7RK*z4XjRTYm+!LC#mB44#qakm$n3G zU@c^tUxkm2qdmvC$&&B}01m5G`a>F6M!sHI?Ok50C^gtpdx+`4O&_XiguWh@+5?d^ z>A#1lcri^a7tcuDxcr87AY}jqy=6`sB`T7M;O)(NJkg-5GEt6hsw(S`p(pelFD+Ie zEFd=ELAJfFox6|pS9^41lC6$V`L;@+HmvJNvM)5n<;=&qJQS66A8nj5KIFEBu)^b+ z%zp`^1UKKoz7T-O0X$!f$a$!ejC#O-x{(umys28#tUV)wpDWO=Qs|B7qw(Y}G={fh z!?i1U$1N8_4y2Ba7wHmLom5qh>&EVV6`S@p_EQeUAyS6KKrA4~I9#yK-B?l&b=ZRl zRu-Ixr$dSd`0`rkkb#-z#LtsvZaPW<)cDRa@1MmEs?`N=4vr2)x2H0tGJ#FuO98Bjr}nKw{@SsB71ts`g=dkBtE6?@SeZDV%>(P2Kn z(=Unk(gN32dasX_^w(_+c4s?-ugA6?Lfbxz2zc_x1OdA;K1mp&kK%|`izJ_vkQKoC z%iYnHJ0r?6=v##W7TR{dzfDG?L48iCL^5S~-6%mV$@k=w(11%-R5^dqN)}>wPmk5ud&|tBs=U=FN3d zkLGwR7j7f;(%&?}4hdPi0Nwp$K-n8gSTU``ZD>P!X~pBv!yn^=Z(?j}-5Hp38$`+vF`U#tylbpVu+KMGWzSu8UH$WFL#ML? zgN->LjJ~>jZBGdxPb`qmFik4ZDQr2svv83uNsyUQTP}$K&Rc`eSle86 z_(o*&ya?Ab{E`Qs%=R!7nd_phQhym!GEUe=o6++B%9w~SOcgSATxg@ofaI#2CLM^d zE&_b;hcm;FrVN#G@uXRWG{q`0`ERNA5`)kHdBe=6N%92uqXA^D1g67v(Kmxa&^Rls z;|h;F7FamXI@Oy^X`>zLUNPldKR!(me;S5*=PoR^H}K=%lj1rrC=4fYn0wKvNLV8wb_W(kU}oza=tH!pKy$sW zmr_77CLg;oY=M#Iv#e<@F!6mc@lxw<-ypxTkyA>icjKWfc1 zID2^KVsIs`&WhPJl0>EEf>z*w@g2`?816OiYai-{gE?*4X1ka7U}eWC-wg#e_tB7k zU8e39p+PB5axL>=0Yf=^e?LTIqY~yUtB%y)HxeUbX&?1vJY*NE{)Idm3bF7GK|t4) z8w!AnAL|F(ZmAB;AbNn{b6Fscc#? zMuBv@1EwHpF(4x2>5yyLIV?_1M3 zp|+4A=n098+Sg9EV$bxZ0mg7x=5P05xxg`*#1A01>+o;}n+0@Z6{jG)s<_fn?+%b8 zPNYEA=)=%oryDIfW2Hf%sRJ@9KODqFj+6SOj~v_CnYXbS;~weBaJ077_&s!9Tzv5w zg?PX3os(65IU+i6CNGo_Jhp3gBgs`*zF$_UwzuEK|4#ZJA&0hN+Z66Ue%r5uMgNfz zkz21sI~pWkVh3TQIigK|sOjd-v#gFs>~%0CL5(jgVc{j>jtn7%>$Ur>u zh`K}=_;1JIcu`QuLh@|#`@nx7Al{t$Na55q#u)Kud8UGNg_SP9SuTJ>72_RHZ*wg3kW9lu_{NRAF>3WJOKRab>q@`)g11`Kv#!@kFt#&hKq+qH;A5 zi_p!sTHryBq19Bp$-Cf_p)z+1(zt<;3KrHp5kfbwJQ2d;xbW8hqRxoBUxgGz_{M(p zJX^Ut|4~23P9A$=G};#Ka8t%sW+cFK={G1X7CZFGOj#nKZi_b1AR5#8!Bh(|E=*7Zx$ zsE?TvPno+tv3}Hx@Gy6#QJl>uGy9M&M@|z^)hJ4a2mt!S9f!~cQ4PUu|Jmh;ZGGq4 zUteK??1$+0&U}n4`)RnhR{8u21^QQ-`<9m!pTWql=s<-#EReJT;Tc@>#(JmkwHd5$ z1o@>xG`AzLe2Dg2J>{1LvhtVS7Gz*%^%B&2foT!C3haMGo>b0dx#~ZMScAYBp_2YK z4b8%cJb9@Mg*60`I)nYHui!byL>#|tE~KAh-+`dg;2$g%O!AawQrC>s`;(C%8XCI6 zPpoV#mJaJo#AngZ*2mBm+|`N|V!4#XHEm`(!sgcP6^X+45g^n|Al?*K-9O*)6_b7K zmjSSoeW38*q|TWj@`G-8-PDqEq>71dw(cB(0EiqE@&$Z>WhsUU*zq(#mVmk@j@-b|4YDzsB_faFV>28bUF z!;k>ADNHQbgF&Tbk-N33n*_a|XEB(?F!H9nQL21-mC?9_8csUA!SKnM0PSe>JOu1N zyI=JVuV@(Ku60Rfpc!+NFH*RmKJQH9SB7^4esH@+qY8TpuR$=i>L6O{h<$q%F1yk~ z#!45boS{M$-E1cseGb&l2rG5$9Mis7(Q=n_U&A8*#eZ-qR{Qztt?ZDcRd+GkCVXl) zAV(y2)mjop?kxO@rKA`%pm9i2$u%OioplaIz`6r3UTQ#3>YI~Ws8X7dF$x~#mw4ER&2$Lfg&)1u2bn0B$^P$gvBd71P6fZjg~ z=d53tJ3<9)@kA02kRA+Q>p(+n&JX4oe>}Sar_GRg`Rl|7_vL{nU|nQ_4SU}&J_^0h z)mY`a4~SuPcw`~j0lQh(%^_kP!&NJ4NcBIC2?{-JxtO(5nHoBLbH(Z7v~pv##{;e7 z_^FhakUi|e$Qgq*LbRMio$xD=C4zv@m*xVY@~k`oD-v}~u8-u+Apni9pplc0{pYl_ zbVfVqS4dIe;BwG1p+(!)nE&-KD7)Wbn5PlcAfK4_u+S00j}B~0BVQ*qcnjQT&*Brs zd(}$pj?c(c+j$RlYgT{zvRSTH=F@}=_?(a6C`KSK-7yPkBU3jKh%+M}E8WPi&JB9g zc)>lzriRwkB-g=iI7=Y>KTWpTq;V_QhYOwyBtLicMma9!X zq|2aCb8IGOvVIJ09CSkA_flCA4PQ>=sYE1PC0q4zi9irKT4^uqrSD!^wk>#a?T=^J z{fz>ecQ1J0p+e#$LS6z^0>ZqSIH*V9qsXzaTP;J^kSD6M_kv9 z-V_(uWC6oSRe1cV*~!LE)uIW3MoGGQy%RGvuyHoKI@L1PVz)7ys#C}YKZ*YAWKbsT z0hTrC&9keuLC>T{8!C;H&_}Y@0w)wyQ%i@nYD$`iFxTK4^?={2IgH<=Z&=7lSsBJV z-Lyaq^fA{f)`}F8mUZy)ldN16cBA+S~4V)-?CsZ*Srj5mUxMxyxIrJ z$#=xT^&8WXPEgAEAxYLXx0dT_A}_;yD&y(m8aLUXmMs174+ouF6JWG_foi0gmb2G< z-g}bN4EC(+yuvhno&-26NXy2ioFvZWj{o%Cpu!I; z!dG&lrL`sI^>!LuWq~D`ix7KKdOYLJ%$1mp#rIK*`hE}deuj<^<_uR}FiIm$f4Ury z{{47_NraA2yWi`or91%W;mogmM{{hiC2(>}q3hIdfhKU+Ms3d55qH2JtAdZJdh&Vi z*bf(pA{BgW(^Ct->85aCiJP0OD#|E(szXJxq)M?pH>!@1vcCYR7iJ^T&$}}vz%6~# zL4|fNRC}KX(R|{9 zWb=z8n8ar3eIWsqx8*khfP8zI-f;j-eG3Zcv1%1{qyrA;fsbw*x9@wW$fmNq(p=%H z_V=1!+0c19#sgkB!z2Zkb1R+vND3kOZjEkp%gnE-03p_eAnt2dj2v;jj0z=G^x3aMca)tIzB(o zd7tT4#9qfRfRU4P&o~EIGl4S^c4X(<1Pph-Ug)T@VH&G70ec+_Q@rM#C}=n*B-D)+TYLrc>P3mUa%UEA6M4 za+#Zo-{>oS%kiMSnXtqH7O7e$`ew|T)t1#w@b+)Pdhhh+kgc{ECk$s4lY`r3th z5ZY1&gy6BY{=&OItO2EujLw&)L00rNW$E&)bmvws0C=MYzWd_bInKXxXH? z&r$#`YqWB`XE)RYJtZK(}H81IZ0}e4yjVCqAC4^U*37X zX1@T@e4n7O`|o94-M7XSD6(4mhg;x(JK( zTl@*3F<-!Imu@SR*L5nX7eE`NMMRFNPwVhBf(rYDBlgvi;{sDQBui0NN)P-t|BZR zy61;k@jGOhDvFi!!%n|t>n~eDSWAxf!roq(f*0l2BePWsad^ANcNF}wfE^WCS?icS z3(h4?H3ohw`4PHuy z!CDNfZg}-vGOA0tV<4+5-^4x$K6nw*4sI>6Dn0z#Ai3kXx_Pw>i}CakX7t;dmAA^- zO<+J)hOe}oxin)RC8W53_egm3QIQe%%6hZG&kbw$? z*Hgs-&;UpA;94P#<+xow%R&L+l3_ZQYv;ta(TUu$rq360gb?rk1s$+`7(;wgLR zrgLT4fvJ8qn+|mRZt2*?w0nPSSta6q#& zuw5uX`Ez=pzSPh2hP1||#q{{lH{6BxxjA>Rh++hZ9~F@{!pmaco*PiJ+^i&fnAj0f zCse+&XY5etM*!FPr6v~#dKj* zSiupsf8B^Zk%wPxX6+_mH?G~qyPb8=S!JxWj&|xZo412YUa=riB{5DKyefNK2AAX4 zp$f$c$Y_&>vP;$z_g;~o=P={<%bIN&L{;aO`}Fix;eD0tR4xr;B{T1v0-|FA1A8OY z;F$a0t?aY4o~ag`$B#`=>JdVxI8-ZN&jTQS62lo%Tr-?Aq~lyUeiN!zGFoPVl6B*KUz34-1k*<3>i)PZ}FFa?gT1hQLDvP zZBfRyt{%-X^(#d{n&XRoSaA`UKNYa}Gqp!SQi^J-Qnx6J@*Nqg=y|O3fsBJk(@hV` ze9Wy#sKIyj89m)U@xnr%^?>z+*exMuPyx&_M+(B&(&$8<2Nuf8aL%g$qD~Zt-HIXZ zMTfe@Atd`ZEAEa;&11ZWr;VvkyUM`i-l5aqo9;1gXD-B~^Y7Q_$yf>l()cK+A}luX zr47m!>q8>VrcUMVLN5??dmqQXH=ZHoKwcBp8*2Oui`6Q58k*cx^E;x$z#{n=PEWai zezor(*h*}O;DvdEJwlIRc@=iriyyLs9Stc#3CH3>;z| zk|m`Y5ObO)R~OI`W8&`E_X=<8Z2(gT(O&(l1F*X<2{!t2YgrIWPO1pSX*;x;gk;>7?yBmw9&J66J&)+BPD@eA?!ky2@E{36J zoYShPf(Q_qO2~Z?=g5{d<`9dM>^Cg}N|k>~5I5rNP6k3&A#y2={h9GSp)i9s>qE4y zjo(7P%Q7F~*)Az68zXxk1%Yn!rz>%W#iLe=0%&&#r#gWqBzfLkixi3-QH{A)g~$CG zPU}%M;EX|mFV$%{Q7#6``YpMMz`F>Um+hNmM+t---MbMG!+v@&_esQnQwKB4Gd@xx zZawXU9u6YHzRWO?SuI|~@Hs5lX({G~9HR{0EP7t0j0$7XQjf&Bq#lh6c$_mEX#3XD z(ws-0{~boXGk$9F?nK`*725s*Ml=Y+I2Y|FS!t=h2pK~n8W+-Td~he*LiPt?`esFt z{1=%ONV8SO*rDKz$ZBrdXA5BWdos54@7aZ?^^_Fvsc6CLZm@oaNLJ^1wAG`@Ww;qF z$DzTIf`ydUVEG!hxfC3c7+`&{KK*NnJhyE3ts4tNj=@o-5#Gu4bOnkv55FL+Qvz&f zd*R&o{u!P~zqfKaK*JVLvoi@vQR10b{8gqPw3+ti{iU>}zXcwav<%*M7E|MgqCe6m z_~YtRE40H#w~Umw?@^>oqTe{C+;;|>a1kFwX(95fbSYfINBC`tH`_75kEP$bs3A{L@ii~i zBHn)2>dL#uT7gp*I_e}i3_<3g`QJuxN6OBA=__eD z5NuR6N!ij^DgJcv2XxT_jZ_2XX?zze))S-O%ssDBgqYj^ixkVer1SBwm$8_tyBW(g zGDdtjXHxZi)L+f|BcoO6t1rApa*|c`5wM2ycfcYB9KLC^8QQau8C9E@!BkWLS6eWd zZ_{5`{`A^&_kO%@If+yjTZU%ohm9Juu^`=%$5m>rtdjW|=Lns%hexdrXXi53wJ=BF zaNaZcGh~=uyl%y>!bg*`5P(O5EB8I@v`mf3WWHn<(FX>U+L`w<}L2JjRGw8ak4 zTMj!qDR_N>O{wupKwYOrB_SRNJ$U(csr|9C}hR%YR!=3x}e;O{IpAd;$j&3H=J@e+T7-)Y-aF^-arCAOZO< z@BAe9n}oD0+wg|7$@M*u4~F92`71TN5thck(4wumb>D$34Kyf6R= zR3qcS7Tf{1HLr)iHYmLQ)S%PjA9QTQe~mUDbdhtUP*Ag&Dp^ol$+zX=fNIyA zyM%IlS*#cPfSPCv@@2b8%|d5Mo*09BWpCu~iY-Dwb)C8!>px&iqaD(_#Oe|6Z=l?j z{z!p^o8gYDJA@fN*#ot-03H(s?$EUd@zYMn zDF=lYMxLA|G%`>4j~96 zvAm9_Jrrho5f=>(TyalQw+PX;66XbymY+J*#3}}1PhdTy**6@Kh>Q=UNto&3u%)wf zN~w0zc6iiddHOz}#&WexkD#_Kod?ips;v5W*Ba))ZC?$ULer#ouN0!by=#FQLgQVnxj`R+g~{(V zst{L9HHp$GZtt`JV@az!pmmXhJjcJ0NESIgc~xHE3eS52AqKKvSnv+V;=jAJO**^` zZB=qpr>*Y@@>I+t)XN)d{-#anw4vs6{Ytk-MYW?7cp8cCBruhzg;mL~X{rzbv-LkO zc@)AYT&qPr;%*`i3XX}^8Sv(DauaxAE=59<;|e*S8@SToEM|9p|5@}{=K+rPZk^J( z>^#IFmzB&{*IxqoMTV=>kvY|ni-N*N|735VER$HH^h{s5Z(aKHsowM%{wBzP1u<5v zNkf;8x8TPqQklXJ=Lyd38|jc>-?iKoeskBTHve(e0t2lTGdw4C8e#tR0x)-OA5EAp z$02LVbyZEfA8wv=N8evH31$b!VOz54b$K5oakVXlWVM}pW-O)JB3(?F#=3o`%lz9! zI4X?#3EXIWG@v*h#J^;#Uu|&dFmHA(L6Vyx!hr6%4 zPeZ=g>@4NRp+w!Ex8Km`#{Ux2SYB&~|KboiygaL!7IT*(eLltRtp7F_Pt8eLao*c6 z>kDH|6G6_F*(#xo;Qo9%1JlnyspiGJ)hfnwWE>9t8EE=Y3G0>o#l z=oXEP{8G-5NlqLoyxx+&OhU_vnWZ>%Yq3CGBFX!kLSqD%0ExcTROiT2kr$39To zAPk0Tz9m*>@aMW{yhef3srJJ>qtFt5m5D00q=pFcd}HRrAU7EvMjwTh9iHZTRA5NA zBuSx7GiMqgC9A^Mqcx1kc?50wVln!#=eWaec*Eg@R=WqgS1yxhz;b=PU0>Dq*#1{9 z>t4z>+7EV?@N8*S%7uAaQ|9T2)ol@s(Fj1vLTu+MUPCwUs$Ys+e>XrD1&gr5C6Cx{olv zKlSDKT03agC6q9xKdn!(x8}u(yLa5TGk_7U=;J6l@4socITC{*CJIVFhS$~U`w5k= zoD7%FXT)95hT+>tn7%PCgWUFzg31 z64?kS8Dt;7A9ZYyetb&TSC z)|+&p`@o_OmIoKJf(tj?HkHwc1FUqEY{`57w|)RdV0i6S~f@-8%iM4WinGbTxp+K%w*iohJBZ}ce!C(V2k(FQ%_k} z-b=GjN?b0MI&kw|yEYs_JUdghzUbD_d(mzmp*VA7B#X*p)UWT~OGpru&_RZ43I*+V z$~Hty@Scn#^_BrrGvULF^j4(IDrurjP<*#9g(j47S4ClrK@~-7+<&Jj07t+CrufwM2gICYE^b}C$2}i*?DS`N+LpWgK-=WtTPljxUSPS3l<`^G)Zj0JF~tNUc6%&- z#E^9Wh~a~sRee@7+j?>*$tz2KA<7Sb1LNM_N{yJ+wae|i!{iWLb0g#_1pIiJ$Mcjx z5unYx229;koO<> z$7~nI*8+>`HM5(A2ivIC@D+ffOK==bux}*~UoM{)Mr1mMt09QCLtLq?`JV|f!E3H; zJjpnWSy^|&`YD?dN6vvc@=2!M9WGIXObFKj6G_4vO7ay$tU=>8Stq>7ceOTvlaNZS znKm{+<8QhRvuy!R6h(0?I?wqQC|d(@BYLpuwb&xxk`dmTGwLM6Vr$J6n$XeN5MFdF z{81(2olU+UyPa$T-I(2%cIJq0FL9*_CeIoqeeLFak5bMpY}uc~B!zTa@~>b6aO`Y> zPfNtgls{nU7ri^w%ZA%Q03*{CMB185+;)el?`XX$2?B#V8wZ(i5o0g36MsRIroWi< zhz&o2AF^)PWQmzrRW?-WIZL9(R11c5A*!h01>RGKhHOYHD}-Q~2Fa5^MTyTtu-pjX z6@B&JB}~H0cdvF(EUukoF9Y=n6zzT?%ny-$GW7PgN4*Qbe8*wRq+)&KE8@&?fE7q{w#W!$G(Xk94G~pJ<~>$ttnaej8uOJv>gA zPOH35SHf2&%!rD_81&kAl>$oh z%yf8Mdc*m$0%O&kuWsVy98WcV%$hQhO~R8eJp^dJo!*Bd^#PTQ-T^mmZ{<@N*uJ83 zB?Irt5z2$Aa;ofP8Fxo6x2QtXLe+-*Ctc_VXr_1gG`el2U}-H~n34xSG_h_+8wA2o z>Z21xrMnu{oJT)&54ZRs0_z*N` z*Y-|;2$9$hP(8;~XFK}?c2L3ZW{D2;#FNIRD)9rQacYI&-shi2<0U~I-$hvS1?EIE(k;rMG!Te;^-mY(Idu}vT~K#By1pu z;gZu75NBc9<8NEApliily?mP3QnhZM2j+Q}V7+zsxT8~ez>W~p!!KUsQmKOG1Gi`G^CryCK5AvYC4D94NWFBU0XJnqg+UYh8K?71-| z`Q}~o!d6#7>>J{oTkmh1s8feA@a_`^&5lW*OrHo*hx0Z`;xxR7XuC8u#zWytDkcps z>PKLjfQL3mca!Z7ERAw%dGe3(jIXlUuq+Q^0}jz>cz9f>KG1#kQYc}XyU-VwY9wjw zneh|wUUazP6J@)6^)Ixo%aw5(v+QxSxCPFW!t1V5W2A>kOvL>J2r167i zN>}W;er(baB?EB}*u$RQVVR@Pas)CX!gxf-5N;Bw2kR!^VxcOp0WVQk1f^mu8KZlpuT|)sDtwpL!yzRZk2&p*snPA z6lP8gjsgHZ1x+Db+2jCo&_O220NaH1EI*dralOFMsY5RN=c2x1%sKqRMFZ>Ij5=Jr zI-Mlp{!E0(Ptew39B{17>{LdLn3u?VLJ&)iG5**%Tk%UTe0quNa*EuN`l!_TnDF?@ zudk_iL?Oz+wLY?JHxpOWr(;#Y%vP+fL$47Og0hS$pTWxN#IYF$OT%qgnHVMxL$FIW z=QHJT=p!o^#d^BpH^y>fx%delGQ{@V3Ln@NOs>NkLn`NiDDG`g#uYHWOBEs~#WYN5 zFGWi6l_0}C1SsN&1A86sIbFs%gdCOOrJld;HJX`2Ec3B3IIi`*%yL%pNRPFD7i6qg z(Ym7Usi6P7z5|*f8^U{X6xsO4`YWc7OI|f6M|tC862KWlTo0S)2p^*YSzXMK2wpa> z6#6#a*a#V|))kcVrNW(eEt20Cdg7;b1O+@7^wFNNV0TNDU!8_vmPR63vn@?IXoma5 z_?XYIx7CGT5GjDgE<(kQm5#{2$jS^NQ7bxs8T(mR@C+ZrY>|AOQ6czAFc=pR>s3in zJg&_X{xwSLr=>ATCmr#OFlI2 zmBI_11KXt6LWHj;#{Hsdf*MkBiltf6z6WY^yYE8ajV zX7c@aQlZ#045OTiB8m!4inTT2c+ig*I;Hjt|Dk>4eutI-EIqeKN7a8B4Nthhy2mDu z3{Q=8|CP3HPczEtT0kCnCfsFyHdb4*WbP7+$F>hwHK+iZaMdyQVJ-h2%2nUn)xg%0 zOu9vUoV#3Vnecu8H+hDqC4@%n*-gPg6cP}YVj6XWGU+%>ll=sPj;prp$|}T}9s9sG zb=ty(R7WToLmpk(GALQR@oo(8bR8#j1!H%>r*xT=iymFOrw*jefxTlIHY{O&~>ji^3PhQc1qNy%SF z;|x)mw>wPx(P@a)N6DF&BSOv>|F6p%ZxoADTO{zXaMaAVQjPVz<-P zW=S5e5~a{L7XdkKX2dJ(Ri$QG4R$xhD@4k5i@KWl+h&$_7g}6$EdDF}6hpR=kwRSt zzC^oO=v;w0TlZ4OBB5YKizYaBQD*6K@r)&A!x+)z^%YQ30{%z(qvw|el5dAqwXpKX zaG58++)d;E!$NOg57C^O@Zow(M3ZPIkLvzqG(W%Fr!P$eHa0kU)CB*BmxqYwH~bOw zM5Z_Mn4eEl{Y4FIH9e0E9{JW?EPB!<2zU~zcW;U$6reTLs+3TU+TR4OE=AaV`@F z?NXo(80l@6wtu!OM1O5EP%?R7?`Ji-4tNp?vX4k3`FwT`$ma~Y_|D5WbyN`mBPRdI zLXZfDZppl=qvl6skdE9Izhtch%!$Q$5s>D=sWT2s7?YeGas&!cg_Q>$u3h8j6{0BGS4|b>Z(Wl+jdtsld0nVd&^!iZ zqg3CXwjwvy$%76*=np)fez}tj9j<{5B#86<$4Qqi-B;#gw;0HwT0p4A*v<|YGVoW4 z9ymz8smtx1i~iD)N&rZO@%i#A|8K{K=IEZ(L`hMFV#OW{QfJW8ltAlXnU{(0<9E36 zcVI)FE&!}RMs5-RV#u!SF-p2LJrxmPm>Ze|YDkX|+!_p|s@2?z)iC&Qk3ZZcz${|7 zTRVUbwF4qEjKR3rXOKbaTh{kkDG(&-ML;HHpsyntpC{7HZu!?Qk&Fu*`MvCZ53kcj zwo<9=fw&GDEQuACD2TN_w1UJG$wyz<@8Mk(ElI?44y8H4*QJP7l_gH>j|se%^p_<0 z$=^`y*U8yl0$p%uWkCv03?b=hU!B<4#mNmxZj>$P_}qz}+QPL4hw?zrkhQDpu%%pYo?Gm$?pD{GII(l|18ubFdw z<$nOg%WMzZ*Fy~yYW5nQxJwN4Y=Ao1u6RZuFvy3j&$w2s$lMAyivrH$D^f%wmQhRe zjW|XBvWY`Yq&I)`$Q5_nFee@#?wA(o>n?HVOuuj!AdgPs?I&dv0VKtPPP=AjS%h_> zBeS5M5i@-uFa}>l;ulb+Tt-u)38^}S_jx1kX-`OytQJY`#R+`%uT@h z;%+8NOBD3ms*}0?+8p3PEaiU~|A8}re~WG>0`_*WqOsh{?lr|&1&7o8=m33nK52~@ zQsss4*|(M~?qp`m&3Z+q5(6}pS8IAu^=%+4`oLsv#jyvn9S(NnNjjFtljOcv1bz86 zC@tv1f@l-_I23}WV4s`K;g{bI5mY;1U&@fyH|m{?Q{|$T`Gk4kH+WSj+a|5+u1>$e zZVfVCZ@@z9I~VB1mEr&)b*3N8J(D+S&5R{l^(;+x+{Wv|V?gfW!CBO@>52b@#~}BW zrtmm;d6DCA6NB2mg|%s{=<9Q7BqPn&tFbxLVz7!a1=zQRa3Mi5duaScN5WM2m28!9 zTo2r!^o91{3ktW{ou?i8**J-NAhNJMJUdKJ8m^cc)_wyyf^4{or9Wxf1T_7xU!haK zC?FiWG@0g*(zh%YYj=}HXPfvEeUPN+cCbhEL*}>U8LF`+*MCioRW^x=tSrPP5VyK{ z{EUdZJs(X`9{;wJwA~WW{Ob_F0>#QHpcAEKAK@l7Z0VF&)B_T>yv*E=A6|-c`-{mS z*o;3$X`v%WrOifZpab@_ot%_-)q72_!!Yv~q4#}NU?fuq%4SW`6Md8q%jU~m{A6bm zqD(#035~gFzr`%TY^ivWp%k`{BZdHpjiAZe{&@9CQ-`>B(54m~{J=;Vs+r;6Crgt_ z5;4?a(0-mG|L(1lpOLLP(qonaiS-|!D|L(Z+$~{@W6p?LaJR~|0$(nG_gJ-Oe^7R) z8_v_Bo1{-OJ=L zoFjq-fc*8pXkP$+hXWk?I@Wv`nI90BP0bvVpD^Wq=iQpB?XAM&dB}nl+3d7$=F~{8O zD1Er{^#DC?QWZ!oyq;^?{0V&aYlL(S!9$XY<59nVTj#hZQ|G_XV#PntinX1P4fo z%xV_hT&+d}WBbRPqJ_C&Pv*-+Eh|1fePuIi<#5D3|9Zve5IS#+_%Q%QK)Syb)NZLc z-uci|edp0Pj;c)i!+McHL7r=-3NPcfn4I#CDk z_1j2UG&SDCBrH}p`7N@GqOH08So`ke3F06|%RLSj!1tAANX*ZA6UP~Df>2782P^ll zJ?5b1g6Q!tREZF}=;5ccL$kDO7%ULVYEmYHCRneT^5ujB49@%!% zIYHpw6%*w0TdpNE*`8x5TbJ4Xd!T1&DfHoxQDS-Lh!%^M zKO|dz{z57~9MS#&s~q9@S+l5tiSZM%ymTYiqZK#xD&h3B!Y_s!vNy3z2VE7NdsY~t zC>PNP(7mY=AT9bXo`Qx+8*=35c(8euIu6*KgWBO_eI*6RxC(sawKgl2`V!Mh3m9=c z>_7+m463Y3s&@A5tnd!O3!^H3c6!Lloxpt`u<#F_-uGhk6dj)GM;*J9caALpfT9RDt6etN4UMWzCho zw}U87n2h}a@T7bXx3p$n9==>PZ^3?sOjK^~n*^*gS}FH5k2_;+T7|z(*&I=Qs^G0- zx^Wxph*!)o(ozT6=9E=oya$!(9tEb5Y$wo~y^(G1OTt zUu9_c0IQt!(Iszc8#O!+Sg?DgJAaUMpvyyC1v^X&kytzi%82+v+DTV)U;m<_q$?ZT zFU#Ww2Na4KgM{0Ekt;$tV$(s(fJ|glUx*&F@>{vDgdgsgel#pW(NkXB#O(bNr+;Tq zRrCoIc^HSyLDm4TAynRrQNfg}o^%CqCQ|#5O+%9mw&xU8fxrl@@(kwU5H}E^GQ^DG zXJk^f6SV}e@K1nEa{Ken+ZqRlIycR)2tw7@VQClCx$CCHHE#$?a}$ZBQC*gC_sZ>u zR9G#EpI=>)yDBi=y0N;w4)S3_Ms9ynFHZ+_9O8f>GRm~v7T)33)QcYwJ%U-N7@T8f z`@0mL5QUB7@+6LzRXPqM&pumk)E%Yj-;n^ST~iNj@~9$FL|$hn;Ycc$K}N&_ws66* zO(AF0;r&n!Ufxy-P)KRyVo@7gjg<9N?O-w4E+Y?Xya=(@ad02kCSX4e@Ze3EDR~B*+v?Qo*FLM+>-bC9a6#)^ z%tyB8!j|5xr$ou~DF!xzVC&3b%v{0HXP$odxANgNLoqA}!47^nq-j`Y-NDNOW>ExK zM+6o=f&)`lv!we+Xk)$0N1n}&nC#uL=G*k!Jd~QapLN3`<7dnJ`{-eG!YcPa$N4H!%-N(qj6Xnv1^(nWT_!xLLT$*-oy|KW?G-{(6&x#7MCUTG9~C3%BtY=e?1v>e_Ft9fvMKC*VL>M zFWC&4fmG^k9yjQwDSn(f%yudSwT~BYV`d$abnX=tTDfZ)7b~4$_GOf7^AC#!4M8#7 z=Kjih2D{~V%R***l5;E79Nv9f6y`_L<;eBby;XIf!T{MuBy^c zF1$)&{eYb}c+lm6eFF7c9-3H%>bcOP`6RrH7#Y908^q6zV;;A7uGp#P75t&J>IrHq zjYAA-Khow4HJnW&o_D+$i6fbz?~l7|x{X$x{RaE!*R^IXiNufZ5bo!*`j1f^q3N3a z{#d9{0$g_aJKjksNK838C}9{u4exd+@Jgm~_^LB`VECY?uOulU)Dyn-b}vz4R-}$m zdS{*Yg_G122;Z~hs4^Tzq?4@c9fee1{=D^6rB?4NHgnJJGpQp%jdsMEW3TR-9rydb z+z+K3#>CNlp95T$rzuX0#q=B^$zMx|?K!kKVb3)g8%ssqmE2&-GUvm>dueI51{tem zbgPtzMB$ zGM1ybz^Up?V!Spbh7qDQDWg>t5{_!Jh5L0sTH1}aQUASx*2UV5@7&H9`~9cKY9mcyVs8vy0KG-+(8#SXtrxl}`sdt~q4?J)zK< zX<&+M7=bo+u&SmeB75-?fLIGA9oGi8VqkQ)2DT@*rx}nEv(ILDmG7b&zR)?7EzAZP zXQ{8P@W>ET3!f%js%V(VA#ih~92G;(k@V5^tnvC=mxA(d*VJ3;v)6u6n*TQC=0>W` zP)kRgQLBcR`!AF_t5@G_0Ee=CDu=ibA|!lI;Ww`4)l;-yN6D8$6LIpI)9kmF({_0} z9{*Z(*5SE%hS7O0OR7--hFP(rQ+@RMUT!(}RRzsFuyGEd zWB_5GuU&`JFKw)^>OR4DBi!Y1?fXND`LtGEdEw@O5_MWP`u-m)yR2sTfvSfgoWxc& zsXk*)Oz2Q*a+tD4BHNp>kg>W%h=Bx@YUh`W)-x@>8xp0a z?Z`x&qR{u2cQjsG{qz}$QLp#lS@1JrvYWK@g| zBM`KJ6vN;_`YcUg=4+enf*044E_5j`TY1sR`~CRA=pT8O9|gW*N%1w0TY6VMW`OwV2|iv7x%)t zr_K4D^B3>#offTU=w=+OBOa1|VOnzMk_|0K>)(Fl8??xhx-d5NUGXqe8-~Sf_;vhtMw=fUck7{+H9ylzeIUt@p}2-~D&BvYY9wp5jqG z_i`&V6A|Ryf6bRGW;Rei0IH00Q6&@U=NOkWX0d1IjhfKm$-x2d4_gBY1b6=35mrDS zF{^Xv#oT?8xd>azZtjs2OllayU##Xw?R90TvS$6*9lh9VOz(#)`n&flv8;Fqry9A6 zidLkREBm5qDAHM9UJ`JsABWQE`{|BM$Q-ES!>)di?v7QRZuCc8kWj-AaQ8L&cGC*eSghH%Xj}WKv9E$4clN0j9_%`_71E7wJ0l`0Ruab1JMEcjbg!SN ze(+z%PdPv->Y@ps>aMlUY?myCB$JudhkPW8h3viq#R>;JGCeTd4hZNp1nwX8o>dI( zi)CGUXg8811r?pnOFHK43fN?hV@e%>X^heIzXi9tVFeR|S<3c&)z>1>sDJY^;<$sL zePZ?F)Jn2zw=Anm?F&nO3Bph~k7qO@jOlso4lF!%9K3%MsFkI-Dc?wl-+g|dBj6dZR8-qyi1%}Yp8&YxucVc#@``TQ_ zSb%g6G+uwY31E+B%Jt3ESr0Ia({JEIRnyh3y5#b!{R^4ZpUBGBng0dHg_3L*OP0L@ z_u~AYz(Ob^;#6hX17`wp6{Q^H8%vA-Zr$-HUJc|{DmTn&TZ{di@@n3ge!7vytzrt1 z?(~N@8vp8ACMc2DZ_KT@Zid6jq=$x(Amo0yaK?qY1o_A3UP8Q>C{+Bi>yX13-^_1f zw??a6is-)cMo!~*zw)itM6|f+oKjo(w2CeRd?}@u&7Z~JWh<^N$0SF-wSaCxQsa2A zC>zJ+miE$}=e%Sgn!Fg!jJ#Jr}Wmf#K?iwjZ?`dq6 zC9{?!6WvxI1(WJW;%$&9gf7*if_8k6Q0M+JfvY|ec>ZGX*xmBNU!*;sn3wnAt!kZB zkVab%G=%&_=F7XOk!H2t6D{g%=r0rI$}x_u{fvL`GVTp zIEHohi4w^cl9GEFQbClfzG{+Y>DV*E0!U+5@4)H5nV!Rq(8|kkeg}Uw^4DnI>=I`2 zr&!_u;Lk4T!aKPRrKmbA0O!Wx+H~tX_as+7nwB(|d3*Xmfxai>e7RPdUH>wtC~i3n zS;a+~3AWDa;dm<2RmhorT_Po1#r4qt%>OYev_gtSsMMpD5y|A1Q!7G1z8C`b4ua4D z1lh}^PbqSamW|t36?cv@P+^%uk8q6oagL%e-=xdm1IdDh=UCHDzq%Ab{6EZ>5@3t~kdFGCpUI zVeuCeSlF%l-!D%m@rxrGc4Cr{(d3s_{ysA@Gem8eErltmFeFyU?J%FeZF9WMWWY9D zz%^Jo#-kS>CiZ|A@7v~jvBHN}G88psU;vH*J_4EfG|(#Jpyr;)+o^fJi(_&orl-V8 zo+U%&aFVU?#>*V2J;uwgw$+4@H*8Uo_=~b^6?T(CQlXKTc2!MgZ;+Edw<2H8Ez#R- z@jDT6vb2KLl3j5CyB%re&E*>Exs2&qcDg_YcW2}kOkUSHJDEF7GT{*#FEkuKHWN#c zRt_@9m&hW82#jhxCh2jvwldI9Su;+{SBF{W0+r@E6<^K`rb+DMhvgsq= z?B=er#80hE+jK$9Cz^?WOEo2Ch7_^PI<>(_M$l@92KGHx=45JMQ&17Jsgs&v^uQyC zfs!SR`a>;jxZebYGi59-BoH{pwA4FUTK@keLIQZy^;@ZKwL3FBQ4Q`s+j@s&Y{$yN zMB(Yf8vOY1{?715UbiPVyi$s5+^97gq^|_Ir|ARwcIGs4@YdWFOgepOM_ZMXVWd%} zG~F|nxA$#URe<3y*xE@Q;GfmctyeeMjN1jwA6cwrD7)hi?FP~P6^fHc!1CUT2RZk4)>DQKXbBpJjlZm|J-}QO z&et(0P;>>adX{t!R4dn(k@EhffvQ~!hbbEIFMUt)%p;%us?K7RONY!_E@0KkjSr+W zH=F2)FG5G9`W1F~whT7QoGXZz23+4`b(qYJhO1`59f%FVOd}G%jr;(}N>*Sqo?_=j zO{Od)RYpceAb+wSL!VqPkFt`v*;ve4!x`elnaPS;(16);xRxrPUg6X?T> zgA<}3!*Otc!m)*C%FmJ%cU$cQHN#6@2Ot(Efr+s6?Lw=t16BJdh2*t&J(R*TwAvBS zW-3RpH*>wc#Gzg>%@h0vo7e3ZK7~;3t`{bWRQP$-s{1%h?FV&OyS}d$WkB)TxR*YyDk^6 z_o?_krBPYCnJF-^P7Gk-iQ~M%1t67an+G=QxBiSspdv}3?yxA*GV#?ab~?oDEFL%U zsmvEw1y4KplKld!VGNY5=MSG^HK)1!>tLfIV0=&vvna@f9pW2LRM_LGC^}c;led90 zYHY-1Q#XyhthP(`@wu`dl&CdXoIx&mtxEAC6x=GdhXq;RBO~J0XX~950XuLYcOiIVG)E=~>JXn6^YmAcj{g zex47(N=Nu&N+MiD19VQbjg#$HJ)Y*5L@pH`HDzmiB`7j)GiRGU zjb#{>gX2^JzgPS_!|64;WON*9!&C^Vz?aroEGXGf@-*EvT&n|;d;Z(1dPDR-8kLey zo%qke?zM%l@akqjyAb-NE}K5WQ@U_h5Yx+Ld6St2y1oDZta^mh_YohC&>e4j*c#s+ zPOTNnZVWq!QxU*7um_8G{RlWds^z|{bx>!#1>bZX^kwgN%gvj}s%C`axUW6K@fR-< z^?HZp;Gxw5)sKpL=r>&G&;4Tb06c?>945zbbZaHJHlInV_usti{IQ2`d2dQeBwzZN z{+b8gD0H0pQxYPEdU1p4!#|5D=YKCcZ(1h`xXsUgr{aL_9gOyvz&sY1Z~ODp+L;-Gk2ng(=Uu^dH1bx($M0Fa^C*gzzwa1Y0W!=~}MXY;q6%GFppp7uZrgO-+Sq%a8Wqy4RLxGPE2K0F}kfjzAk zc`2Fu42!OPQbfIIUgeaNt*}p3)T!c+O4u5uz4ubIxWRsml8!bExu6}zH!)nd5*`pq zTQOE|V$%{TC3MsNMk{5#1vyRqi?&U4!w^4Z9xJJTIF4JrE7t4Fo z;dS&nBch*&T9>p#sP}nd5QiKXI)b`cQw;K~FvFzZ=P=KACHq- z7~~01wf$HH<=TL5VG&g?Zz=3dB#YpE0d&2(?!X*~B{`k$kcKvv`wfjs z@o*HGQrA(!;iFMkyDos~rXEnOB|hE$hWxH3Gyw$f;49D?72xdXgfZ?1Uc?s|bc0?8 zAUEILAN5{nRje;O2SFw1HG`G+<;B zf5Ui1mLNdiOq_E8DIFgGpo+HoPp&y60Fo65=~xt2bt7$ve+ka9_9Bi^NkzFpJ3u;Z z`4qatjf0!FcZ5!@022tjJOSNgM4da5SO%W~hu+GnDjoUg0SjHlr}K^LrC+H%pW;m7 zm|cKs?fjS0B0hHsW%h@N7S>mwI*ynyJc)<{xFt3T@`nn$NWN<(&z%1R6i@h8htz!L z(%rU3F5-(|^HW2s63BX`Ng{7_9~y%Ctw>Rds&~k82U&YRUFFd-A;*`}L8iGoF{ zH3W1o8WO@19FPnGew+Bsl^B+WfzL{?7_+{>A<;f9#&$9fsKB)|w0%uvkeI)ta!|Dw z@&!XNX|Ikdx)?X+$$(!}K zrDreo^G$0UkIM}^yb7z8{tP81YER^R@Bs~wJSuKpXoap!L@lZr|EJwq31sQ61nXMd z5r~}qu7%?#zCatI&ma#KRcft0f7M)@1ro#A&r?WF+ESI8ae-sAskKR37;w%HY%x%2 z#4Dnkq#2-i8*<|-AQhR!I+S@21!##UYFSXAH;zKI+(*h*2LnSX#SO>iq?6w#B&zhi z$_SC@o}0n<#Znqzs|+sLacAYi=s7`)!XtV`uHoE!?IjSh5^Oj|qY*sfdt{Xfv*it}tG?1a4u)Ue_G7 z1oLOEDn`_n_WwhGT(>zT%e7-)HuIqFOL_MtU}fhJ+2(TWN|V2y{WTWAeNl(|3=l-coEHwFmqkYAtB;CQ$niS0xj7 z-J=vaic-P0kBS$lV4Em~XCv}K59h{2^Z_IMGXG8C+a%)Q30j9E&Ot=xK8{Zhai3~u zBPFo);6V8+7bvPimEmh)1lHEcpBZAW&}PlU+But0GCQk zDJi#wwX3@ojCrHp;}k2{)4+bn+MW{xSPS^UVC>-(Ku~v02AFYSG~jsEc~YnkkVfVd z-!J_Shx_!r(6eB*a&dx#787i&qtOTJltX-ozA0-NWG=}2zD;c#)`YH9O|5%KLhNrL zb7eUL^b0MA6P%zTxHUW$<|;eIv}BrVkQc^-9?fFyrU-XLftOG9F&=xE#E=mgHOjtc z&!##MQQ3okPf_~INIa6?OJX6n+7iJA>quJ8yK-Lqvc~?! zqiVAT6$`z;*M+?X4;~-~_Ae(xeG{$dEW}7Z!TCU{5{{l`Jen0^`Bm{bc@Cl#+8lCC z8>tLqDH&)6^)WhCHC`J}l0T|5#>HrSlTgqi_oc9Zr0m}V0?&NRMN$~Yhe@()Oof|> zz90iQYjkTE;N&|;JM&8lw@d>Bo{RjP{Iss;DP!5X43P7X4k+os{F%TKG3UTOwDbOK zx}8{zEz3-h_n<1x6bPj;$8&Rv`KvDx_^_OdHV*L@j_u+edAN)+Aw!lDn2Er&R*=-A zxGi-0i?d-FE$U5bX^fXC=c=Eo!(`eHGQd70>CbxZCFrQ2f&&k?_wQ`^v-YzR$eyES z8TaH{pLB2eHFg`lu8B8xqar?RuPDVe;aP_otFT+&O9`1j zz8AaHti+2N#4d0=|C|jcvXSi*>LKZl?ijH6BCXJUb-d$uO_Dmnqg?%$8fTI=IoKDw z!XN@Kfj6u92c4J0+kt0V?ibS(Y$XQ%J_RzG$rw`0_-)5;E=cn#1SPVlkEgo(e~{&YjdCg~T1KTPzvicx#0rx@_7V=!L^D<$uZSau6{cAhu1 zw*$4ueHJ>7z&vUqykR(wFb*NFNdrLdz8S0lJ+sg00=FBaTk42*lD)lVMZX9TS-*=x zEH;P+Lk_f11!4X3<8NqG@UBQ`E0-@EXH!scMi%;NgH+dZnO|Iej<}_14P}pwrkbq` zyNRe-NU6^25yp>JpyMdyJ~O3$Ty7UX`+|3fEDKl15eb@x5TiRs|2x| z*FuOIczbiEiJos;5s4T0I9Q4KS|KgSKm9Gz1y18`>1dGp-Xgp*X8|TY25tuOOC@KCPlz8_l0VW5e`qgXm?CfXX-tDc-8t>>P6aAH zZZAKlQ02}R)^Tpx(FgRZZT|(dI$ckSp5-A*M>%Q7+Y5uneWr$VY-Yc31(wTm@yv}Z z4zks%H(F{q-9h)e%=}Ol1|rHrc^9?t-SgI;{uPWX&@RCV6^lRwtovDA9yD{(Xd@R} zcoC6_rOjSKh6VIkaqBTS?7ID0OGV=RmgpiRsO>F>7#41w%-JmMzzwtk4%$4ASNI zX!ysgt%Gi2E!^jv(!A3{{s&3ODy&R;_OUJn(;%Ud7g9ekbb9(|A2gjb7t(nI6Lb9i z09$+ooFmK#zUSSw0G4VKH8e3ke9XjCXZ`AJ_ml1;qy0}DRijW3L@JJfUu`Pv1imdx z>V8KDvIp76?_dooNCefixS@!}&R1f;G&(15Q^D#Z%6klrZSh^B-T?txe+R^|E^$QH z27;+Y_KoEc41iV0<{+BB4&{&v*aIrsc|I^oLDd6BcTaZvY)6qqS(E6tOGrl^j5A%- zAN+BapA2En@C2@nC%-qMz0Jmeo@;#?&0jh*&?}@^_{#>ezG(?J3w6BzZi}lVl&I8) zr2uFkwRFylMV;?>Budn?@K-`QFsb zHBfH3r3{Pnxn3c3+FQ>zr5#l|5&C!MXYWpC#vg&JNMQG1L>`Z#JpwtwY@ zqSb0blV{yYyXz1aDEKO+Z`nwo!PHxQIF_XyonCy|{L%h}#szc?#Z83O&$hNOzF%NO zp<$90psfN%)k2#ic2ygA7&3=ra<<&k=%Ywe#*DMY0&Jj&BEW>T+j?%v*jJB_5EPM_G@V4D@z72KT8#V_6 z3+=X7T~a9s=cPd)A8upo4RX}?2XI2GYsTb69V#H?7NzA1YeKL-97y6ZiXs`}asUzu zP?-{8XY~mi(F{+0VHf~~VZWz=3iOzrV%d7#b%a~X<#lh~&Y?+OVew?fQC;<&vRwV0 z*K(D#zL)|8;&VYZvai=Gv)*)Koz%p5k4no5hN8!j@sIzq=zU0da8?!)8~;&wez z@TpeEFj4grCc8;0UNAg4WcNL>j?q%)Hi0;w|3yy11$L#4033M^q|wk0uReoML9!pZ z)7gv0>yK!}$}Kb6FG6N9AQXRm*eMZf8*!;q^Rjv7qo*B?DGTP~eMySRmf1&d27&4T zBnM7DI3csz2lUBSQ`T0As|sNb?xa5DH&}uIrv}>v(MKV1`Jgw`FIG}GW@Jx}`pyBB z>}PO2%ZVUWCN1XqJlFt@$sod_V{+iP#?QXkF|_`h99eMo?MM{?V8c0PHz>tqU_J9A zrl_&7?+q*=gkDu^#ow!s%X6ZFA_fQKhLl^qrk70b=zLB?B1r~T+7akG3*~IC4IXGY zd1v7-tG1?Pf1QTt@{Ro8#FHcZPy)byXR4#q%>QFG3({ZsZWUs&eY+k$B|tbGU&u)k z_X#e98Wkh#FH%c(7bq*X>i<$~5E6=*C&q$RBbbZA2x6kcf(`JRTF3@}m7mVK4yR(=)o$&WTsL6>uoh);R#7 zLzW1GHP7!&(9;;%)PD2=gOFU}YI<*^1#^Vo6p|)gWw$zJ5QvTve+}mby5CaW;vev< zvsl00%gs(mIQ^0d{giV`d3W-$`{xSXwa;hLePB`ftG^&P5=a|g2qGxBk^_F)(gL_s z*=|{H2a^u-K?`%)Egn;{n&uAIn*7BysK&C)PG@fH;*lR3Vs|@JrBtio0m$noQ zAw&Cj)vs>IJCnl?P*(*S#ep}jKd6mNl-i8f!dVZ${P(O_Ld0e^l=-puAztg`finUC z#gxc~&EwO6%&IL>cQVPme$N~1Cm2^xF>jEx(Au0puekuavUHVxXD1wSz(5|9T1^xe zYq-^qsq0GQ{a37`JWahMa17v(Txq%V4b`7mHjQS{t_L?g&g*SX?X*P2C*o-HEoTQf z=hn6{*WOjR7Abm4_n*ic6)SI43_YyPGn>adEWtmKWEWQKUx#n|p@4e46(!KUN4WP@ zbYTLTkV%xO(f90P7@wDF*CWO#IyY&TDWQtwg;`1Bk_G2t2?Y0V`3TaseHH|PXtJRy zDd{HgJI#c{oA5*eBf#}GLc87XktL!F8-7U8Qu4%uJB-g}pD(Tts8~_Fe4So6*ZB%) zW_c7nJ!=T}DCB_Hhqa0Y!e>h5Xn`v%b-xJ{Xx6`a*xo8A^?RZ1@q4`L)OOYq{31i? zLgzHV2(yK1o~UYBgmAnZ@qoJA#m;ax46G#|yhW^)iPy$=rE1`#AMo}m&`*&6qz4?x zP3lBdtA~aponZ`Y|Iiq{aO*!z3^y#M%S67hX#ucg0}s*5 z7k&Rc%k)HL*-nBq<}ho~wi!MqUWpazlB2Q~va&8DTz_~O*rsB(NvtSqlJ;a}e%1k+ z`;oqn+q~7xSkUKJN7sMika}P#Z>N*yc^5Uc5rMKe>54tF5 zR-!?&1ph~S1Vtyxy-4y3yxOYB4Jmn3K@ylZOP@SuyJcY9#LIZq6{X~{-KZjloNu}e zyj)KK-&Hyrf{at^eCe9QM{DbSG4_XS%LUy8J5l3i5|;2MA(#V6cvl%ZH2ZU)8&(|2 z91x>mA+9LbC)K_}S1wwpAR!_;Qc+I`$huzabXeTJXFIM-4*|{fBw}jKhH)DFQB(R< zy7=g^$d3oe6667zNQApCrgsnZV4g1lo`O1fLy#n{bPrgakCIuCDVzEja@k@~A$v}i zL~UIoD*IpU2`cc`lQ|Ls$VEtsiKhpNdJH2|w%avAgz zuexU})ptM#+vfbANQjn_(CC;=8}#845tB@oFRxK zkFaK#jX;(e#ObxkVyyfujcRr}fS_%gh}b@ayi)#Fp|0}9m(6Sv2>~f&PYtvS^A9T-d6mz3??&b{mP`cz zI8PB@1teTA&!Jcrvr<|*hjmdigfG>YZMi#>OwFI)MjeK0ptd>r$#-9U&nUn0^u?7o z{B+AF3Nm`tkd`J%mdtR%(v#E*_2QL){hBO0exf*WYKTs&FjYvLXCC7G3)#?7@L2C! zHbwC#E$v|X8{yDTv^6xvka(75;rSeRR-eV)ydjcC5~ex#Kz_WW(^WdE>a$^7l1KfF z>-NFG`W4HYS`@td9V$gnNiv@lviz!{*F3oOwS^;sh`GQ9SsmhiV84r&S*=;0D0l)o ziTgJC(jNF!$$Yy7F1@<5r0hk(ayZitT+i4SsV*TdL5`S~s@b0*ONkyNU1K$b0~Nq~ zhiPTltp3>4S*K=809(AW(80>dR;eQ}oi;+rQ`UJFHZIP$`nw?^zT<{EnysFUQtI{d ziUBcC5vh2@YmvM7HydqF#FmkQ)LF8TNF3}{yfGO`;SY_VK`820Vlg6wC8F!8d6-A4 zByIQt1(H?VdDs4WDgXD9K^3I4i~-IPBJ8mJw3o(R+hp_WVwcUH9*!3>?f{Bo)H^iklC zss;Dr`P|jN#9*#>5L@eB1-?Xivg7pe6P3=Ox&zIb%C_8L-<47{vJ(a1+NAGKuS<5w7CJii#bs>TTmd%yGD&!TPd=SQ z$>Z9fu?62WmsmBj4N9O{C1^$NZwRJ4;`^VnH2L@=%3usugva;~hF6lwIz|&4lK$k` zN7?QA8rekq=>(m1f3|IFR8NAt)oD1~%YV#Un=vo@F_bTu-MMK>%s*R$ z{?h^gOE?njgo6l@gt~AWN^UaV7^AY$&Ggp2jT2joE=fySsAo(Evk*oNMug^N>?!Z0 zLxXO&miP8CXgl9H>GNt~`456!Y$D%+gQA9}7jN5P4^k+bK!XwtqE|Y|a|oxMNT2@) zXBuyL=fD-^N6vj)Iwp>vMQF+Q<*lcqmJjjv;iLKjV~)EClP-oBGY!dUp#nxXz6JxD z0Xh_WHtYuhn)2dU4 zv7)Cgz<|cz7fuF&2vZdmJok-?vhHJyMcF(A1e@U%mIc@kU}}3is>FT!$k3>d)gb#p z87At@gv(Khn1sq_>)vT~%TJvurQsKW4=@F(;EQl8-vsr6Qf=$(Ux)!ui|H9?-$|B- z4Eqc~y61=%LhI}hQ7M0O8yX-7eUrW60MJce#nvhkJM;%e4LiNtw=vnH`u!U6jW@DY zdXK63_Wcp(e2HuXFw_tp9~<6?I3bm4x^O1)H3P47d#rCN5#IG}VJi^YgvifpzwLzh z(^*$Ny(eVw|G-BJyF4sMvJ!L1X~+&KX1c1_EPS3ZPx5x++m;nxKSon}P0-GY#&NT0Hidq85q!D=AuJL# zVT<$SmLrC_=_LF*pOZ!&?wbV0-wht*0m(1BS%j=J;sIM)a14g+ST$6KJ2w;~)9boC zlm1Ja4(`a2TDAYr4C68Fds6?R#Fc|wAMRVEoD~fWiK{ZD`;d=pg+tMFgyx3rP%M_> zKmCz5)vzh(0xxf6*8lpo+JV=T8UAf7k^^4CusdPKBYz=BAUi!g)f0RIjLYu1%@~yO zL zZiAYH6BBj}Oc_NZIgW$1p%Q<@s$qSXyIdK~QZ7+UT-FGS68m%i`nX)K;XU?raK8}h ze7)Bx&zhx`fYB&y8FY*Uyh~nb&>UJM^jMm@@K4?94Sc85!c;Eb`2ctK<%-quVUTix z=toki+-By8yyN>?*JO?gcQe4-mjv-5^Lf`Y#p8lvF#w_{#8~;K2rz}8d_=XAozlMB zp{(&>q!=TR&^8PoG77x7euU26x}Qw}!0-`}G@V<-H~zG%AG|47h;B`otHk ztYpwzAlQCD+QB9Ox%-j2jHzqnx8>XU4K^xK3hqQJ7iWh^0TCK)MC+WdyTUS8s+LZ} zN}R8fS3|wOSn|B943oJ6pZ%zx;FPlN+qY}s4UJ}DiU-hM5H4&6n$^&9H#Vgcey_B_;b7k(VzgKXm_uHK7%x^lvS6wWd>x3c*hwIPTQLc8q|jY%bg7zMTMA#G&Z~39qDaRmAuBlqGJj8DRa1)0`nGtKXZTcGM{DC zsp~2~s%9eWa#z$VUjjI`8wUjM-I|~;Pjvyw6A*$Af3nTALe;4mwpi4(H0wY;D3<>hpS-j6U9p~mlE&%|`yz_htZOjHV8r_vVUt<^ zkNf*?FNAtrA|`XQwFU%yIcTVDA4JnO>@vk39pBz_Y#P>rvPw@|Ir-kGMof6x>=LM5 z!9ObQr{Mn$zw*KGKU&9Da?Ap=O8w*qbz3UR0m3!~x&mAtpCgsscFpY2--4|E+a#8( zD6MJnW1R>fDg@1y!vD`+owM6@Lu%PNc&Hc`r_U_wMgUJPVCW2r0^^80`F~-iivQK} z6ejQ2?23LiIL8-Gd$9!Q1Z8#pqm#fwiQ$VE+XbM*_`_xmviSi`bRTJSMGUzoLn} zx=9%QQtGHr4y8bK0`LiyHid8MZrs+l>VEmD8zfan-s!?ILh5ed=%o13R|}!h!2*Uk zIl}_jT-=S9^bcF|uW5Wn8xd?=7KI|`nwkQ@EvfEc+mDi#%Gbj-Q;wc}uGUkY;Baes z(r>&Zl8tM4qZkT@_fY$cN))j^p_KA`wQC^6C0QDd zWsG3(|Mp-+u_mNZ|6TI|7>)sTx?_-X>pYKVd7dWn{?-kh_p5KDcr;~1_Q=DJ<>|-? zLxh-Mv2jiY=g@in*4a7_Kxki}rHhwbN@al2k!m_s@S&^61SVkjWpG_f7`!gJZNl=< zWH0p&I1!s~c)F}>a^I(}dSkrcfjn<3_-PBbM>sB#@GciPoT`)e3tFF?H9XQf|A z_LHWHV4U?L`sFNckjw&ky*+@(#PTpz*J!M{R?32f!+$;VV~h2A{W>#L8FWX3`RZI% zc<`K88!Z8HecuFfXbl!brh-sydvusrfJgD$F609o`|y-n2ot|alraW{N37M2?Pw~k z)4~F;xicSmopZ+T>A&ejh+XnC?_uBO%h%!EyzFXN-^Iwrz8HwXaUEm~>>2wUowK0F zU0+)n{&nCs06O`1ZmGzwy{lMpoZQ|)8Fw=z#ISfHD0bQ83qLJ`k|z6q4~k8vXnRkf zIRO6ufs2;l*AtjAVUT&VoNq@lJCs zFuEhJa>4{({}K}Z=}ryiccWt{P-T^D>Cig*K@sC8$i!OEI8*Ze)6NX6n$Lv%LydiWP-S~;6pJ>f zcV4L>9D`eVO;INI{S5MYq{NP5=>sgXqO~re29)3!E2940W>trii+)N6Sgz?>gkJU+ zMR0u7b*ZowIG!QCBy!*8q)O7+ckOLUKM29mZxIve^ZMvDDq*gJmoa-!8f!-l4*Kax zQG@PdB)4?hjRRet_R=CuIgN$QrB`zwR8?LGF!b=;PXzI;BI@=3%PCKF`j7*<{^4H+ z#1{cu&*}a`J7Ly7B`RW<=0FP~ZSS({sSrZWe3*BNl&d0=<)L)zmMO)lNRHGsJSianm$dWSX&p)#~Nf{2QC|I+rxY>*+wKFGjCT+oxMKa;a zm4+1k@c@6@%(%NqEB*!RP3X-qNV}dvNe0ItUBlWlTIZa-9{`U+8mTPzPctnMF zH;0L@O@rD)C%_FDeX=`#hA!iAaxVusn!>d4Vk!Z9vm?u;1N2*4X03^>*#>cMk#OH^ z2(f(JJU0`KOZYnz(PmQ;07^N~(pven+JOHMpcF43&&gn4BmxRiMM7PqQX@I8X#D0l2qf{x<16ZAZ5G_V zee0SB2RoUY`N7l52MKREknb?P3y)C)KZzqBzv-wt6!xq7_QQ~w`u8{Yv;+B`S!HL| z6Sc&|iF$jT?P<19S9%(i-gK>^C@C-7CHfIsV5c@3VP3%&q(bsD&b)91mIv*=#XTeQ z2*kSmAdKS<3&~>e@`@#-06{>$zw_q5@6CqG#L?;0W86{6<^JKc*hhUpGR zPRq>j=@hPo@PaCNSvb(q!uyQMLgC3JkwSB=k=UmDR^&hq+0-nPv&;OE; zU;6Rxe(yOUxiyEHUG`1v=Fp0?>H#^v4FojlZ-nJvP%MLuc-kccseX@qUE@&e8ZthS zPZPhqDlnU6pm)Q%vOx#F(}z+`lsh?rM_>260u9NtG2mty%<7jV(@WrVpl_i$W6~n1 zJsOWUM*FR|_9UXF9(pAAT!uu(!~_$lV=7PIMO64u^?luJoUo?p6n|~T#Gtk~hf~r3 z96kw4=3vo0-NIH%96Cp9Y5H}({X8B2J|Epa0B)+B=Xw$`{k}!xfjBIa_~!SOBxSw3 z+rFCJO^q1|`T69F8>ztOfT&8t-I8iDc#I=+mvBO1!{k*OodcS+&VpFu#sx?KcZeqm~Uhdm+F7AB7Vfvc^I zegWDn_82x`?2_FN7?rd;UAAS>wrpw@W+~14=ekbix=6TZ{Np_LX7>8K)bTWi*zIz@ z+S9(Fz+xLiC$b*=d8?(fReNAbP;56zhb@o!3Pm-gDU+lz8ZkoIFG{l_hK65=oX`k& z-R-ny^D*PgslMlGAx_ASPjMN#i#O}QREg@lMxYVMGu>w5CR5Z&rJ9rB$tmno`n_O` z?O;#DRBbO07KT!9U&&Vvjl!5tSNIRx*eI_98F@CBC~tGF8@G;a+{mAFKZTZ@scoyZ zoF&?@a9eaK|I7M~F#DW8d+|kg)Q4Xwl@zp`;DMVKF%RFm%Uak2W5*vN_URg2R#Q^a zmM@j*lD@`4dxPUE?>>a~vyjzLGe&w^M*Bw;AZ3x@q#8PU9aIl#*~sc0io2Sh=7IF^ zei*%b|4yti;gv|ZP2YNbj>C15L4L>amy)Y7?(Sn%>4OK(t)ou7nyt83$uj@K>_9mY zPJtI8)0LW?qxk}>f3+DxseRQ@I7(bAQ@3}g?JQ9DT!9*n17-vr@v(GdPe?%~WEJLs zzMbSIC$g4T(YKNx89QDBu{-FHnVtx_Ks_o7UgwToGrkU#*j{9e=&_vqLO`%VH|+^H z@x0ROYdN~jR)3<)kZ|ddBERe&E?=tXgRpNer4r6c*~}ku{B3Y2!5n|hIKuJMt!7Fn z*4w8*M!pQO=vnJ>R8>0_fVT*U<#7}>EI(X?i7KJuvypTTgk63$|cuH12 z;xqope#m=&$-QlrW3Vy?q4o{g-O$B5pp)znRfWW@h-E_2$(AoJw|-2FsoQJ*JFYJK z7{+wf_+_@gvMyoQ)Y6GtU#ma zf06D@6{|99TkDe`5k}_!U)e}Gdve4DkrE}|U`fjSr20u@7Mwp*<_3w zxlq0DWSfwq4C)kSA+1U59G0WpZ0#-ln5ysPu3tNmw0x2kHMk-4Q(+ua$!O|9Wg{=y zNy?my^%NGPEAAJ_8SP5<`P?C_hU~Y^0s*>5-b@k1GB8)N!x>nZkB@XXVuOlgqL0nD!-%Z6pop~v+_SPAEssopDRR4N zd>Ar_6*oTFo8U}VC^YSYYSX%n*Ma*HDn`xS2r8p6fVabErXr(auqh92*@KYfR~|-} zq}F>}E7!oV0(a>6U;cVAj5B;x+_~0$`_vkH*Vkfg#@%g*)OVQxC;bgSwd30 zh&gGWk2@InhW*=5FT|!RycCrq0^5tALPrFC4)D-kx>&(K-LV~SljA?Xd48hcV59wC zGHv$pvhE0~5SF1+L1)I^{ntrs>_-1yiRzx`K|ToZP+;Tf$eDiiP?aQjA1zM0-L4;G z^VLx?T&XD4a0|PF7<6R^qu}o-`vzvi{|xo*B&@odf_ZdqvkUwO?=RGH@w6N5 z(HEnbfQjP;HmG(H#a;?O zo(SfHi`1r%dnBnrAg286A4MxkP4SG zX0V=*whTmhTe2`bh2MQ>%z8JMd&ZYBjf$QJ%53q5IAb<%9hryq$+kCJa8)w4f+&>3hwKz$MjcpJ|F7mHKN7s=bWIQC z+GPEw=k<|j)W%dikc)_(W%P|fcQU6s7FL?4C(7_%2s@E>K|zYB1IzzD**xN1Dt3@M zrB1L4zs_(D&OEzl1yA`vbj z=1Aq&#p7t0gpcLLV}Hw~c&>qcttTpAT5dEaWvg=%A(FXsyp0-;CFXZo(of zJI1}eFh&XR=ARjOli*G=k~2=f zxkBvD8#ysLXq-=#Xz<1;5#h6(+z$5h zv@`Ypyzl$H1)O58m(b_URYKNh%mrW~Zg+*A5t{d}SX--qAQ7qFj(odEK>Dx!JI|Eq z-G|d|95z6XXUoa-6LpiVrE^0W91i03(9-+TohvpIdVki>>4f>KAcr<8ZF@w(X zYrIkPz?k%`v~)oQk=mI#XapPuci!-Pxt${(^SVV#fAww}(^!D$xC`>jbR+L2aRVqjZOXm(k2j#*#-rd&JJ+6r9L)J%wFH9lnO5?bh zMvnn!!491hreA&94qT{E*jDENcCoPKtJy`j zKqFnPMN1JeMQq-UbHFkugr)xEf)Y0`7l$g0+aO!6x3rzgR0@-Zo2_4~@VZ>|raEST z&rzrpc)dfc*UJsDcjA~>&5zxoN^|k5v!g4rYPkdy?!}$lfU^^HaBDsQe`ljfAYaxw zj3X5rfOE=IFfMo9);TtVSJ8((xAy1;j3Sv(=L#aFA>@AR)6?|FarnEw50Pf{a0Po0 zI2T4s<`2g8JalydZkp0KhP`~6vZxn?U6eMC|5pU*O&yN)tg&P>d?V)c_N05Jpj6e_ zGBrATVDesXhM$sYO-A|s4>sr2Pjv-{zTB`hPpwLN{ zA8x3SrQ2n;0?O5_{BCw-cMo79%}M=uzN^rsx}5#QRA-0|hbOjXp{0Im~qQB7RsnO(Dc)3ptV5HL`xV6f&yk7>8`wW9G>_}!$L zf8WOZPu%|Nu7c;3T{g38nffLw<*X4b`z?`$3ISG&u>sATIdfmC)P!1Qoh(@bIo&9v zzm(OoY}Sbxx?Q;!^tXnVtO8YO3~;QZ%F~{Wz7m%+gf~60FeXkPyhFR%;kr8X*?O`c zGw01$m$fyh43piy6S_BhN^!FInMNt@xBufZ$=avRNs0sj1Wf4^+*Ga!D%4&#w;)_` zpMX3_1HGY1fBDk<30dP$ZbwXKMPtNk*<6qZdAXdWm$=$8!i731m`1xI?7Eyl$1Egy zx}W(9?!fbMFEnY3gx3?|hmZ?7=uKk-jBt&Sc*!yW!_}w*nLOfg1dMBDreZtDF|L3f zDso|xUqg)Sy@lfP6uHg97?K|QGH~$`8T#slGV*m6Kxj}8NkUVUWfJldR6qbwdqT+b zLZKwqC&6&g&Kxz?A{?A?J5&@ZR8u;Rwoq}DdOFrwW`;`IkmGw%cQw10M7|}f|F4Wl zu-# zx*rM_xy1DjY8jB5sKG1l%VALqbePdT>Yx#*AAXkP^38U6D0WICx$Pcfk*mmH(`Xt^ zqzj=*LkBIXO`y7kfX+!>pSJb5lbp&BEg`V3HF2Ga;~pqu)#<0w%xgKRfF^3M!nQuj zW3$7gb!{nC`-SDu^LFUc&Ns@p*K71Eb77{8-OEl#Yl#|9I^#{e?SM*anbxfL!1_@s zKEl;|(VPK-LvI80gEDkp{4N^}pNJ%^$7MQOtqRXjIi8r+5aZjaY`~OXN4bm>UelzZ zuN%FCBV6Lm7JM@v!);ud3p51T>x<|2z!_tkT=y5+8rcpy!f})RF$8PHEDUng{&GgDH=Y1_GNyjTffEW$4e*E!JCP1II z+G?%_DF)nuv~@hq#AhpcTIqqF7kcmEK}ZPhBiQ2cI^=7nqj%zsags+q!NI^iHofH2 zxOK!~JZs>8G@_@BFCKE7@b)IXp>XnZmN!!y*pPa9Wrfd?1$= zti+x3wlEE7kt6_2^ggW9j8+|3t*2E)BaW~W%3kEa1QTxDN|W~SPfH2fP}Kq`f5(g= zPZNET)$H9yf;7jSmKRHGrk0j5kO!v4FNwyn z=;eD*HDcA&7jZA*O3Jap)~0cz3a_H4$Cca}$FLzWKz6NQF6eM}a@mM* z8*WGq)3TGZDrC>PsatNEcQ3s(B?M3v`42fr$TC^rkPw_4f+LlyR`U#IUdHr-_VHq{ zR7VuHODU*uE3`f}0z9`1Ej1yX$vm0=x2iXdhPG{$qm!QrmX4c;Y3vCQz{uuuvq(`Du<0Qwz2KS;Ilt~S7Z|sVM3S|HUP^2q^xmJpi;mWAkZ^L>^O!$;&(f-S?I_<-;&GGt-@$NWhV%B|_ z_C-B~Az3r{OXhfKB`om+yqhG#h@(|G*gef*8HRkIkginO4qOZLG5STm<=IBP>4bgb zZiN>ErArnmaj%Kl*Uq*)%WDy_5b*X8{xIeSI1)kGY^N{|Vp zkYBH=Yz@DC<&5f#OnW;LS4hA1E~_rGS>>im2cr=z4+7;MjwgKk?kbeoH@^fQu!Ga? zd1d07s3HuFcnBIUl;xhkr>Jp28q0HRBkzkw5;F2;u5>vrpT^+OGTWY7DM;HH@MC-# zib_jKbK%x;y@fG17ciDVz6V*-8^>l^9!z!U{?cVI%hD^+F=RjE%Mx@2+aOK}k(Mrg zYM4o-iOn@U|4#}|iwn$`aB7$B!|i0Tpy@OVpI-wcv9)@XtS2Z&k=$5Qc_quOm#6eo zmhiB`h#lec7xE9K8ucZkEg*sd@MDw*kkllZ*JL`sG!mem@|3GdsQFMCG3M1~JgIPu zIVHs!S>?`OBRC@`lEcC&6hwm{cpd&mEbD&(@r7qN9jj%ciU%Sd;6{%Pm& zYWW><>$!8Lv*xR3FGyz-!h;rs4il8lbnnK`?Bh-e1Wn}9RiuY*HRJ9ox~Sya>D;Lk zVo5O}YEnuW15(wopX~#X^i1p?jaUz3lp(#mM3`UjOHpRH0~9DXueCevs;^I>LX+4#MQ^y5<&REF-o$s7HZW-f9ue9o)`~F}+4UYM}l^ZwmRU2JGpL&Q7}$C8;xH zs1J^k%6S6!g_%EMjUeK7P8lX03O8?_q*V4Dmkh}A0Bq3rDL zEKO*56qO}k$H0DF+@dznCztzvT%t%}m%Comr9T?q|G60MKpr+{i~`37cfB#|T1+Ls zCyU9b%^k^2-xccMmHW)}Q~#(5HTRHs3N+$SYcI2y|B$6#miSve?h_K-p0n z&X-UJq|gZu>Z9na5ekkvd(DpBgMRlX&+<@=R-iyon(>tv*eT6tJUqY^#<2#fbmJP^Ots6J)(Fc6Wh z1{b0w$F!rd**HJta@ll*Ss)2Io5I@OX%E-QjXZ=UUJGgnm~K|u1$oe#!u2fp9lcc= zq!i#GE{dI~6Y!BU8Pfi-Qu|UNgV>LB;5850SxM&p9qdlte*Z|<^BPCQ;7HC@cm}}M zxY;S@34@rum`E*{&CcAj={_p1C|NqpTMuQvH`7mt)^QeBS(_@7p_3VuBF<;KJYmx0 zA{{+p2$WuL<6OE{OL@R*;hPN-1zWZ=z>f59h`Mwv}?p#~^q$OC;k#6pVV3}lkTik+tF4$=a49e<CI9<{^Q0lI z+y>T;&9xAzTZm@?Xu$<(*8~JL^pZLS_F1c*vrAGEvd;xDmqV-CuujS#xIAORKrl+N zj@xYip_AC|X5#R*K$7M+yvNfJRUj*NM!@t|lmCmveDdbsHPFFTwyILZS_iOz^%zHN z{&{{(l~EM-P%+jd^;1E9K>4l8yfWv>383{U@$ODpBfrkMBI z&3RkuIO$R9F{P>{%{a!+rD*0b#4vO?Vdshd4RQ1bIpz^kUo&uLsjsAb_JeuSBQg{u z^&oXI^uPsgwXCj)Qq%5&*(c?Ubl0Q2Z*wWbhc1lpDrORL@@ba)7qEO>*G5#GM(JY$ zL%IBloMaf8krGP3NvGUoIxx7Udi23vpt~$iBS-Eb-*Z4SdK zniQpl2h~0Q=>Y(%TE#sI)Vms|W`!(ZN&TaTZ@EX0DGu7;_FASq;)qetJ_rJhabjnL z8PTSnw2DlAvPcI-xCs}NE>J%1kIhvFyjtP%FDN{fgrZ1ck6PP;)H$c6NKAW119Ygw zd}u2QqL$#b8G7Kd|9n;>fq5U=e%W}oE}8!N=6!Jsv%%la*r3^`fpyPEk_xSsutauH z%p$L~c(>x>cXzC2UGd+~=W;b9Jc1bvj$&@es)5xtJKId0lYpHD$~+!Aj-8>^DyLaI z>2{8`qFo29LmO}8VL>xhRo;#nsiti%NM}%d@r&im+i28ar@u!Lub7njT=;H&JY_zF zn-_aFx)@IscxzZAlijfI+uy{MNEaoJq*whR*a@$GzYrs$D1}ewQ ztcBnpd|9{|)oJA(;FqCDw2zit0Oh$^&o&m`o69wN(Z;w_cNyx1b?RU?wDYX1(R)=y z+xc{QuVZw(a``>EGmx`ZeqLZ|B4I)=3Sc#ssX*#?KK@K2at5}!*E?!9&*5ulMi?#$ zdFu8GGM)ueYY#XaGamxM0|6Z(uU_5dG#P;U*)*bXSrW@_yj)_U?2w;&pcH#0MHvJH zNqQ>}13P2PsX55whlrZ1%bD75g0gf9a zr*I;y!(_=Kx_Vd7OHwZBzvCdn{Sbemncg-XIl&0roYi@^E`A1x+YDlUHvMpr)%3vo zW~J1SsS{XP3J!4qP`mn1@4L)jaAnHA~OR>h|7R$i$B+nr)H{ zk{p4b^fvwTMu6M+Vopms40(%n5eNKhYEAVr6YP28<& zo3s4&e8=822J_UF@I_7Hz69|iIAmgmAQ<%OCXt1?TI{#xY7+p)_b6|Mf72`ViDtR> z(^hIKER-WWp{*G=f~ly=?^hA|pq?EYXWD&5n{b~rAeprKY3erP5ingaL#fD$^u|e! zrpEma%m(m5tA|TxUyYyHhc5y9+DK}&nO*mhoPOe0!68J?&PF#Tt$PrTpmVA!5V$aG zpp%J7J+&{^w###TYr~`077gnp7nbPey2mx7K;^hImSIMWOl{PCP)|N~{@*|3E?fT^ zixh6nJS#*wGsce2i4GR1UZ`XOpPpo0rG63py3wJ>s zMEzPyZ+Fo?s6jDkg08m*@uMQJ78SormbLDWutPYhSpL&llU1+yU+qG&=yETS>M}(B z(uhgY1BY@R=y#x#t8Q+rf|XYNbYAOaX2Q;$a=i^1#S}Wjqcv*|r5&Sux))sTo%;y8xOu8qpD|aFTKV zWI+xW)jR>7r?2{$)}8CuiShjRjHmGig=3258mWc|&ipM2Q3F1j01mY6lc%BOk`2W| zPM6o3h+PVatNJ6kZtVzQ=wSF4a*W@S8HH5}++CiqLRLSKccvP`^YWhdVS0sx);y)2 z%Am2<$@mzCRr;sA^*`*biZ)?Ib$Mek^n#gZ`7hcTaY{7SVp9=o2 z+fL?W8HprN_`?x;O4%u`QY9K;Hga~G-$L(D3z2XD`BDBN)5i?;gDXC)48Y`nn!zd_ zv}x|TG7R5s=&jrJi@3or&tkA6!?P7$gQ4k^{~mbBChLW8YR05Q@UXlqCGRd;1Z*2{%2ZegvjKi$n@ji^c~B(MwZZ z9bNyBWJ;m%1)2-*iEOI8Hk(8<5*u$dBHV9zS$}Mk=w{PW4sxnz!yT@tG^33O{9*q( zmdvxJ@(An{F!V<~)rV)58uf@F&a@^&z44pN-h=X<3&wuLfEoaCoD^2$@3(169#Pdp zZ7apulj}dm2y11x3K>r^h@X`pG50`1CYYRaox;$HAX@sGJBUztEYRPVB&Kbo)5$Cc zVj-9JTDLQy`4^udJ$wt1L^H<6p!psr zwlGG!)hm&+J>DPH_!S4xMj@oL_RLFaeg)qqA?SZnGwfM(>}s4@e@bICZ6T-#+4PCt zv(koJyIIT`qSu4$&YHmmQ0VnDsTa=JKXAd7jqEyX$j_|lmc~fpcHJtXt%BY7O+O-l zQUCBum&?pX;p0P$>eQJ-hHY#;SdWq7S(+YkP9aHBmhm5PV2-=8orn?8dGuQw}g(=uKdnOV^%230sZ=F*OZtkroS5Bi*IxAyfwKLDHs>-cfRxjK9#;l*ky8Jhiv52U}KXrpz`8ab~ zW)oCQnovE0*-#8bxPmWD$c~|GZ(8>HH+sNZ>c?Pn{4LYm=z-~5JgUU&xJU2z+n)OD z21!8B*JNtj$RkNv8hd{Mz#A%sn|vf6tTUSPiQo+2AfMu{3iItX$iAEH@bSJu8}DSZ zd;2Hy^~!CT`1D{#kA6+ZqqXbuE=L+6L0Z{fGG9^G5gEqRk-b+#{V$D~WRGM%?QHzlRR*aPvN z448T`XzouYeZQJ>7KC?Z3$d`w>vtFiKnwcxs;=XxSHHU9bVyXi)F`@2Ys{Gv-NVklC$A}p!QaAhy%cM7?C9;IQnprqnK(~Z90cCevi2mO6r!HMQNjU9puc2lTG!|h=spFnlY zc?yr_CO!TRoTraeJXLSZ#(|>=adTpj4~ZWM4<6@f#D>+m-X|vAY+r?XtB0%R!uCJ> z>rCD|fbgF5{h7qdc$5ihOL>0VW|^#89Ko0hRPnc^!NJev_X|fL7Si~Mh?W~TwRfWa zg(@a@`0WnEp#gj{7o$K;O%c;0ZL*O|aGYN83iPuP=2biGwd zX4#+=!$$`%=UclKbUZmA@O=L>Xg6y-Zauw7GG_{XMh3jpwoHVHzCOT*FmpF=<5pMqp5$<#`KAP!~@!>0HTEU8Jxqh)-^t@(L-h)JA`D^yx1ZUNnvJR1;?yc%xU z?iWFLBzS$GogVz;O`*;q19ZQr`7f}A>f?J1?84ejJH73kA-TFo$GYM>Aq%>8&vpiW zZ<05@%gOQAT}p*iStjdPOvB15>3}`Xe=K$%5r{$=#HhS)vmX#Xtc0&HcBhx)#iO{l z`nl2@y5%gV1;`qtQ$lK6n@+5a%!s~?t~xjxe5vehb4cG_!xS6F(!t6%;C7_-Nc!xk zaK?YST%sCQi3+6?poPx0!U@NAdp}ocIEd`f8 zMmxN#DZ(bIt*3|>Ef6-lK)j<)>H8n zi|D>E%+dpIAXA_eaMA@X6B3&Bd|qXQGYJk0X2*6U^>La?#{uJD zKh{~(BL5?nLu}LR5T5oc-o%&Qq>0reL%N2jG2m{lZkTNogYS6#3Hm>=94qF-U4d|G z4qS2nj=$E9+MclrHOK1@TS@(@H=&Pum-^%qk_nDL(sO$8Aiqe1Mp02ZKlw3y`2M|y zHeM+$L1X8(d#i%2&@2w%3yR9zENN$7!m$OswcWQ*dWap!5UACp<`Cm9|3WC89u{sh9ir-ZE3?<8gfBba1YX;NM5mhsof{Rz zUS!Z+r88iUiw0UBjYXG-w+$4DAEKO~m&_})aIG{z0seIlW9Ws3Qv?Ed(VSy}v#V@( zlnU7#O-Pms$my=jjo|l$m z(rNtEj637PD5cT-7nbDqoU&4uo!OL|1mTX;2;shnPqA>EqV@ei7z`xpluju(vl@qK zCp^rMQ(t&C;8sS}>~bb$7(N;p-H)V=4*zc0-YDWi$vD|-$hZdh_q(ODK-6GX%PqOT z$d1u8c=5Olu!%WypY~R-72*1VkL4lu(47gucMsJ65j5w4$6{>>At+C0G`4v9ZGJj4 zEe#EgoROBJib0F1#dZ9MyP9_vd!He2sGJ}9$#pe@%}e8a$x(R^uO9vW%u&y1FQg&2*} ztfE!Nlvy9N^}^2^ZWbKw5I8ISD3u;c2#XOA;JayD&39tI2eG6!mh#P}Ri5$jG0!;m z+-P4&HFu`P{YZD3c&s0Pm8AxRVA$A<%^jt=I5;P2AU*2mTBuL(&}&e6v5up}EH%bq z1=dNjQg6(0g@l!=*ngRmuD@GbXRz%hA%AHKYpV6@k5gUrYQV|}F{TG`y++iAd$xaG ze^<4f%343Zn&m++418gkX7*X;>rsP@%RNAboUv3rotK;eFwX*bzf?RZlEcqsoIeQYB1^=|BBMKu$*% zR4~r2HeRKu6xlFfU_aZ;S(%(^>Xt4MKW%0%* zpu&ByhH$7}15X7*H2`j6zuufudpvAuss&eEoC*jvqyr zf~ACsByiBCsDF^3-pC#n#2Mq>DfF1oN2TequjBt2fw46uSgIgHMwYCzp;P=-Wh~gn~6! z4lNuS{u@8uosMZL+4o0vtyH!<(H38lPP6NR;IEO{tG(}6G3C8(f^mv=qRGjY6RwDa z6dLG2HP_|w3sG_R{?`t<_>Jn`Ja16;au1RPnFJxLrqQ68M5=3f45;oALk!4hkOzNA zj23ycfHRLNOCe?yAS^pa;3P@0RKQ#NN_=p;bSCwsNX7G^>p9KQ)-Z2fn_N0j(3;+D z4-32V=NO8rkYx&r=x*PqRTBV5X*)N!5}_kX1m3*wQC&~KR~3!cx7R7TmOux@iY`(; z!}0EsnOMp9Y{BW^hhIEBLa+E(nT?(mh>&2H^QT?n1}#H%J=c0Uz5GfTi${`m>B!c_ zy0vOQ{mQO+v5m#0lf;`JcaUpi^zH>xFMGHh(dKnOnz-@jx|X9N1Y-{`AJn1G-^8gG z`4fNYNKQhAA}Zfe=}R&J7>Iht>N zY!|~B?ujGtIEaUo)me!Un}^?8Y|afoZ5bVay@;qx)g)Ytp7J&wu$a=EqsW8I9#V`h zWgJF^dJ781%*MAg`6qoxpg4SS^MP|jYxB3x^N_R z{-8wM96c1y&Z}r?`TB6_2I|s}AjvG_Jh?Fp*wcu;s~e3luiyj+`>k6K{S-eYcT_}k z9ach*_x&{|y+G45Ms2}BT-}jd&tvm2$MrePsx*0^Soc-+$geY@!2vja9p0uWH=Csy zsfS+zXa3GV7m#!|(Ne1KQdWMksFzZgF|Mh7;PJJ`rKoWpF?^{h3Kp>;uanC(yestJ zM!si>yvMLLVer@FA5P!{qMoIp9nICbz7GX>)OnF|)i`;#mz|aPq?c>y;H*aWSembB zol-h6Tk=DWwwLuBs2?kLPBp6Pt~Z@}qQB-qEr=ao*;*p)vJ5N$Zqc18$Cj6+IHd4- z3F-}S1)0S9Lg0=ibnn%Hhcetsg%g|6)^PRGwSwdbrklL4WR=2^-jhw0lSVxbM{Sc48C}w_8UhkJG8f`lpWnI$sxUK+?S~AILk64*6xF%TiXcQ74^96vbbWQ zqD`9~KG6`+yBUCUy3#RT3)eMHFqMyxVxv!;x5WN}#BLwPbZplWosmlw>{Gi0G87*N0$IBg)#aK=wdxP_&R>4Xp@~vKkWN^# zTTS|M4>0-y2Hv)V`4g;i1(WZC)P(ZR(ZL||JGe3dgj&pQa5{a|oo*6Giml%)L<27&!ly4YHC=`&0bt}3p^UiRcvREH-HgCl=(|IGW%f#}|)pyM%?QHM_Efn19un*V1^AcqNX*k9(x#g`SJW0yt-b@tXT5r{t zIMh-zk#*B_hK*gfx!w>8qpIVKpi6e^LBSv446j^^A#lQPwzeegwkjd_#K}HPm$+-- zS##-#I0eD~FGwDGgNC#RGhshe!b;j@876vMU08GhtP(wacxXK}b=Puc65*;tl5}%v zVPUS}oFY+2xVv3!BR;r`SX%@bMn9~upG{Gqf0{3r(-!(Q;pX>;=BiGbxwHkhKt?fQ z!3Wqs&+5$AEuGZ9J}qHDO_8+)7ihn*sq-XiHEmqz8AMBGHjXnjw+c$;ISqt3+j67U z!%YuE|EEWnu2b-AnUQ}!`-CoCL(yR}ffwROkLbX169-07N3&(9x+gi2?98d-?KT0=3SeO6~PF*W|i zPXd+S1X^}wg3y|LSL^Ps?B3{>cpTQ1WNAAyb$JT#r{{(`^ZPPz>)8SKH6@R-*a(AH z+Y0j)qdk?i7`hFB*%-V!qjCFFmRgDCJ?3@dLSJgYRM*@_!Igl`yON!~+N(Hyx_hKN zY83Xz>opG%_rnlRqY2h;{djvttQ;TFR76;*4{^B$G{JfVX6g7UXr)F z$yGKCkE#a$0oulF{9*QkW<0Y!C}aj6H~*m3DfT<~1P>X|cjW1nP>xE>ENlTd>6_sr zT@5|)m1Iv_{3sP!N6`EN=}3gkhhKQbF7)DG3i%cnJLStvw_(PW@fhK5q)&ON79=4) zQUz}Hq*R0_3#rl-vzP8m@t5r-C@y31Lkox_xh!F9n!{cQf!}?9+rM9b9qiQ2r8VkK z=20Z*ks-UW(#o1NCTFA32DEv_H-J9@5q6vC+nMKs!!u71$6>anRtif2BQfi2cVtQU zWbUNNu=0*F3=QavxOP2a%oqbdb^Z(z6YS=_qob~5k{Tf{y7>9*Eapnun2=LKt;i5_ z;08TN3oiWV4HLb}=(r&dh-;1uiBkV+NA;ULzS@jh(4&0CZpeCTG1DzrfeLq0mNYxW zKY4fx-T?`DR<+364n`(0!Yu(cXNcM>!Hj}N z!pQGR>&oScpo{?ONFIJ_fveORy`zvX)ns7C(bOg)4Ai@;pgu_pcbna|;wm{UF>Fge ze}63gr?35Ap4$0Y73YYQ#qWPLSA*G*sfcL3-A$yOkm6h*Z09a#^oS6UtDEGRSHVZC zyCDs2shdvUrR6Sl-D_i}mAedy7oG(JIM|<&j*89Mcd*dP zmHzASnX*J94u4`yk;s!gI$(uL*pl|{q9xPR!=6=hQf9YYe76^{!WaB&Pqw8d7j!^KjiEf{&GWz z!%ayl)TK|={PQEh7d|FTpx(0i_Ac`i7^q(%#e+Ed{C*B4-+nlmn#GUy?i(wjIAT7x zpT{&|dxqq#zu&_t(O3<{dS4ht5}`00$eD`7zic^!D(2Ai(`bT_&~P)T`=-N2*|Q4U zVm+!aCxE+M_?eBoh*Gw*sgz5F6vr~a{Em`{xYO`!)YON`xIB+Tp`Ii-smiM1hZE;U z!D6<-Z%q1msIisqqlIB(e?Ka=^5dy&w#e;S;`-jml=xz?UNX{CG>7+5_Qd`@ZwUjA z9{AS)%R5P$A$6mms6VLz`T^@*{GhtEu|9c z`c%|SF`*HDQ&Ek#XNd5~<~cv__azS1BDJOTTQXs+vs&uE1Wn7IF0W3sX9>Fg|`}%Z@M>vdd$+*KAl9bFi}$X&>|+l{Qv%TLW~X@mE#_oUzMcW zyOcZ2N{xT>FiF-76C!DR7!GIP_!Y26<#hvU#L2PL9gf;zzr0q{ab-6VX64RXV7`t0 z7?0Wda?pNNYuo7dkHtxDrOF{8TEWdAUud^Jn7>t+E0EuCE|5r$f%@y3cfoQisq~!) zIdejjI*X3h;T0xqU#-7G7F5SjeKlP!&Dn!pCcjOF{R3`_2Wf(>f67&~UZf+bXzUV7 zhLvL3Ve=MZ-4&gp>fFc}b&J8zvk*FjD~F>g${^U?uO@n<`dx{Hzu`}UbJb5NhoQG<5}aH>6B&;ij3 zqF=a<20XkD%g++X|3NYVdMIj(e<02lgN)U1z~tM-F+Pe%5~nN(tEW!N4Kk;sbG6J8 zAIx+U+wxN=z`T8Yj%nO@6Kp*~#2drd^2H_k#%mKi`!p?u)(Xk_c{4*Hj)uVH*vV93 z-$K&(<>Ka1<=-|%=@?-A)J{KVVuT8^0j#Si(9(G2ERW;AHO7$7EMyFtudB~~Mbbz) z1QV;oQ({J-o)u?je~}K99x*|b8u}t#)DX6`T1-TFcTy)XOghxZ#?hRib0uUN{Hkgp z|5LSYF}GN2^fB#2nkJA|*9+fA@lbOAk@lNY^#}Fg1_)sdG4OWlBEACCGqTm5PGy%! za(i8oXPJGpokoo0y~KquD;sHceyrk8?)baL9l%Pow_4PwQ{tDRgz&A<+=%inmC-*2 zC?K%P&|abl$IYAOL0d?VQylcUqUD>=N!q_QCOgAehk43ry=j<7P9Pb;*Iy2;Pq=UG z@WJ-hf6=H#z@~$j&oo=-bC!T?ipykCR*6Hv99NKv^QNfP8Jx)EVan~}j&d^3m_dlgE(3+` zSl6iZpgE(=Ps+%JieKC+SQgXiz6Ja3FQOAvZ728kFDLS=zF-Q~JmeNyt!(^B)(q&5 zU-6TR^Z(pHB6-Hq0$ zs$aR!2!Rj_hJpeEA$F!I>)19cmmE&Pkb7p|$Xho-KsuD()JO*vSAd_4V07Ccsd$A>r??u#+ry z)}n1w%}4Z{zwRxZcBg(1*eVATr}c}HF!NI?o##{$@%tjibp|3G~}pM@;~``Tt2ZV8+5lv;2qD*10;ax73hPX zh6ZO|Hgms%mv?Hc{v@Q9&HEnTXZEGxNEqS@Of1zAfm5QC{V% zX<;Jm21Ps^M26KvIWe1H`>0~r3hH3+*{^2l)z?Pd|C~JQr1$_?K&HR14upDx;PAN* zCA>VyfSZ(>uRPUk%UdJuV)-O`(Hnd9FM)QQ+@y+e$-Uy^mZ0i@#J~(ORXr!Ck-mBM3 zq~?}zr#ty+(yKf-2^sWjnJ$z+kJx)=!viji*_zB z4P7S}>*G)I|6|=j2!#i65yq4;>m^3_b!rHfT}&CCuvuX_;+vLXh(IPfK&7jBY32@?Sa76;W^=)K>mW+q z>B|c`JO;#&&$M8gqs`a`HiE6O)NhRz?r6_6Ba+v{2M_CQx41ZnlHnwgRX9R=VJ)Bf zS>PP)B;gVxAK4&TzqS=W)Lh89;vP809fV%YqW+OqArPQ2D7k{XHjca4iLH3Za%0Hw zN$V%L?Tvn>i5+rrqu`D^H9sXqzn0XtE#*yDScRJBl z+eBhV+>o_S&~g5Rd12J14(A*h4>+AOsFxE_bRwvR`EgLu1w+9}%;U3C>&9Zioz_j_ z^T5hX2&Ebi7g4yL=$m7o)EZip@p7&o`%%t2snj3U$Ko5@xxPYz8`Q=8KSZ<}Umy|o zJuT476SdDM^#A{+fHo~U=hpU3&yZ-p+6I8JuF2Z&pVfm<+}HWRR&h>?J>U@CbosQa zvr3_&a6y70V*!<~PE$ED5?N4vZrsR{y)qzt!%CCtBwgXKZ_@(`xGiq&gi!O=Ak^*h zev2VWLw=A~O66*6-inMj!co$%roHeCe|;|B04-gbiBp-y@9~p#uu4~)P}l`ne%phc z#lXxoUs~2cz)ciKwHB@`l*T|)TS;H7w(XN$4(I#Y3WY{VGGdP{GL(ycfg^U5_9eJv z&3wYdl`3nuH#B~ioSZagxd^QKYVTG%KaBm1{gB>~e&RU3ESGx1RlzEH2z8>itbL{#nFLaN+Ko$4;s)8VoVTaVC%AU^2LF8nXjeru6sj3Q^gs)5 zv^;w$6V-RNPjJ=xrW_5>WKxNv;d<^ESIq2Wdbd~VLBS6Do6@_^PdR5-2c-{Z@OL!h zvh&V!^I{Q$^Qo_w=Twbi!QIBek2VEmL*J3{-7ms$YUZ!dAHcHJ7cRWB%k2!yfUAnH zj!cM(Ld`A=01@5Ytr1$jm0S~rVMIQ@Ie4=TaKe;CYwg$7f1aqM2NA{PU7S31g_Ev1 zw8p;cPC_E!|0|yR#FTpHSCdevj54_taQ9i(0GJE+)hRdKZQ!+gy-6K-_w?Y+R#?KB z4lRyDYTsw@_eoy0+z#1GfF(8j-!21DNt9PjTF49q#^+FryHyF?N zi0CzOjx+O)zI6uozS7Dn1pUVKBPgyxx;u9(H>+-5=aI4gCRvGjDVX_jy(R#VC%=%# z2)px^plmhyKcS+-4)q=ro()r0sL0>E&DUPB9vE+z0hPGs#;X?8Z}`R&duR?YNzUUR z{kjALy1jHq*n>+Ua9k8kky2Ix4jv#g#bWo($5s459o^E>(BpQ)yTdd3np5zfM9+!R0Cg&oj8Fmdf;WDk9`HV1FRg|6wwv__B zc0m|J6!j*xL-sG7V_p@F)B|M^247WVdW=~(h3QW|_kdKG)pu0fEoKt*&UAECzuIHj z%+sDA?7Bh6@KELS^p;i^`T%aeM^68v4u1y`v+#uQNmcl;YI2&|r}#DgXZ7#<`1G<(>~F|<~tvsW7$$g_POBRw(~eIKwV)xy}s{t0+MmFq7>mroAfqjA-~AwoXPFDgOHLOo!B?a z!zduA+eC}ZIn9cUbphto=+kx*oN{c_)XtMv$#SQZ+xh!Qgk>KyXV|D6J&S&iP)!|S zdYBXPFA7Tjiq~GQR0!6agcHK4*}eLZ7Qn>MbTNt=uLjfw)eNLUNV?=o`R0PpaR!z2 zYp}RCSvg+@8Vv%eiZ4Dof7dABqsJ2Hi_7o@MsdE5g5V;0ORPXc5F-e{1R)lG7=tQ{ zvEI8-EzO<794N^bE~j+kWOyO#Pgu{d+#-jB6Ki|8wJlG_G#$Bd_0Uzw4M3k$&)~z|W~3=@xt4Tsep68-xCV@lt_RoC zsYWb6xEW1@iKPu)%*X**0r!jh(G*^^n@@-fy{$ooiZr9Fj{AN}&_QD5DCw zwbgp+xR+2jU>sRcXJwke>s*CU`1)AGRJx9<96KXI5} z?S-K#_@9x{95y}towis^iYs4?ULQ-`m+NXj0otqit(m@xv?jP5q4m!1@09-==?*7X zK!7b0j5X*!3g!t|!c`lPFc8AT(pSEUUiu|)L6pk+`L-->w}7YqAD|Vvf0`!RNqTEy z?8KyTLc*k5iS2Kz0}>qSz>FcImP8uN6i;{>n>*P^T@dICK7_1aFq~l;&7oc0dO}vG z!|StFs7g%(n?W9;(F$CqJXdw_5IWnU{-<7VEPf=uh_j_XA={+7HOvWj#7xugxKAcC z-ijxwxaJ@x`sc;#ZQUq(?htj>S@##T&uJ>b^DLcBUav3X&NJFVV>$;I#d4iGP5Llg zEu_8rNQqvM@(a8RF%r!}KZYpdwS?{>x%QUJr_Cv5KDDr2_c**FI8F93;W((92_MaG(K zUbszK&Q!EsmprwMl>be6QFc7?xlOEGVzt!l75%|`v+UFIsLq0Ycmc;5lPOvVVUU#> zyIo4zt>5a_uoqrhJ6ymRo839Pfg9LXxTWUPkb#2{IyJ+5vFzVT{ZFw?9d@O{utG=w zUK-|REysJsz3JUYm={05ZOVv4o z+7~x|in4BCVhgxyrjW+&Uf=LQdxq%ITd|9)4r&V`pfRgn{g3<(Y7a+Un0n+&h3$YF z@HP2pXxXBnw=4D6QGW=kF+NP<@Qd{?R0V3Q&*V|K_8}2h$K{QB10lNjsvT;^u;m$& zbFd!mk|q#j-)bBINWGZGn}xA{BwyVg2;LFATC%o!;Jho18lEmGFSY8h2|zAyiN&saY{QeQ8%@lHlq^NvSt@_M=9-aPlKPGV`iy&TY<#go^~Xpj za3S$*?OpM+!R6g1O1v|%Wuai)ajpc7@~b)b{m<+7D#}Xn(Fv|X5&$i(RZ6!qty-Ex z!YyRQFdcX40REM$0Xp7XNAx6`afXEPGCejDxcCEVn{;+4<*D`_MKl*{RJ^qAvZ|y* zuc_@FII(c68YUL@Jf}Dd;ICH#hJJy* z5vazQySUE6+K_ekfFqiBcYu=USK9hJ3B-f03U z)x)=jW!_xce-vGPuy&Kp96RjnJJYVc5KbE$O4d%WQXdkw$%WR~dzQ#E@ZCjkoVR#w zBW`roe$EWZi8oD-YM;sv_~`9WdX(kC_-z*~Sxf^SJgZR8`yIQOaHmalwzE_Gfe|s? ze&4Hs^Cj}>GVtX=H7G(jlzbwqeFYxB{LBmxA=Pqj*N_Lc?QO3B=_l(WTEzs?Og79G z_$iZsIn!5}A8}Tw%R#}?VPbLR=J|oKj>3!#yNCL!glEv!vj%#(gdutcVMx-?3s#BN z8SQDCvp3mZ?90#*F*rZaeA=?yyrr!C!V@%CFh6lPS^MH)efp|}?^rvSQZ){_F_T%~ zECU2dLki#IubypuzG5(93^&xML7W&wk$ltd`#ix*730PjVv>)bAY+JTqr=RY4E36lw#g<>L}4?*wK6^d&{~AP)@r)jdB?CJRlh&k6YyCDhiZ0Mega zX@S8&NRfn>i{7zi%Qz^&+ETsz<)FwS2?mtF>MbT5%~EAv= zZ&hVK^2#O1)(O+NG-k$o%cQ3x{gFIMhH3nKPALv$xbc$)9ua&b55NKEUR2mRT6hYG z@CzG=Oj8-^-YuZ~?C@xU;_EF z#95!6ICt@xRaggDGQSQW*&3K5P745By*IXHlhvYf%}(V=&K~c<$z~XY9-8< zZg2K_e)B0Hkqv&n0G!OJPA>E{Q$vkFkL7Iz-enB45W=twsJ^rZ)4fbHLpvE%FS_B< z>}p#ZR|_+Y98@K-CX7U2nJ4#O0 zg1*^GD=Q-rejTi=$a3jEy8tp7oAMv?a37=7r>xVLef|i^m{$ej<1R1UuiW=TvYs_}S#K91rP znnWzpABZchwG>|c_ayG#Xh4T__ssXAkXjWMate9EkRjzFG~wAy%t~{A-vCtN<)$+GAydq1jlhD)3G)Y@ax1*KupNlG zU|2l@7r)gwhd&atalh2c?I5`3~B* zQ!Lgm*c11cwaAo$X~rHtN=$9K8{3J#PHxQY#+Pk>n7oGSj6)u+<=EQNl#FaZwicM= zZ4fthj{W%uQjtO_nvGY9b#9dW|8hE0i790E%p&mZVv0YK*e^j(Mo+v|Up66%zIO4|xxbbyo%};K|IoF31Q3 zPqN>bC92lgDH|g~k1vZfKNs3iOm!$AS~P1j;UG?#@-O7kpT=E=?1cd}{bsRtr37i+ z3` zVbTyjO=iC{m;7#DL$qJb(}S+Y@U#{yhi2nWQe9t`WY7$gnD30Mw5Z(s(K+Gt?h74o zz`n&I%ypY%ujS_rzZ99+y(&vZrsqzez{NKl5N0F zdPw8N&LuNb&)8Bnf>$tb@%Y2?MF&Q6Xlb7->!Vup1Wt-n56s*AG$t)EP5l;eI=~u> zbdBW(>kFM#;oC%n0>$E@31-igu|=_}%@H*T7#5zfh^8sj-3(m&;Ze6z+SAdf;wopwiH&75G0o5)4b3u<=FYL* zV`T`)+q|#u+SRba6Eg(vbVo__@f1fHh3NQGRiuY)C4-@u`bNo++iH#H2@N>yf?#?y z*x9`RT?9Y`KTn}0rK2a=L_8*bkZ<+X&2d{yUQGYKoIe8@K0VgfDmo8~_EG4S+1&_M zqeEQ@ULUp--ALA-_VPd<1Q6C*i5P}IVNw6hc)od0Tt2qaa%qaAo=@+}Lr`*boYhtB z0M|8CN^MG)J)MUgI^*j{DKmt@QvFPL7jV$F-C<&hVe+?Y6N7Z56sDvw7$eO%mc_eR z+$|+TgIq%6W26e}!}i62&rmQT^OQ2!S%EZsjpQ+CvayPPx&&;jtL>dTZe+_}&!=x` z57t%RCT;O`C1WEwnorAjLkU2 z5y5Q%R#*0pXz@i%DSjR9Bx2tQ|2TH|<4L{eAg2>Tf=8IeI1N>vsghtaGVBHr9R2TF zLMGa`De*Z$`0I~Rd@Ft@7e;CbZ=*dx?O5AO+#<@`GfR%hWWIB>SQDbwf| zFmf%dzjLg4q>hP?EzgtxNt^K!$jbSN23{~e8okWvPXI%!+GOlY9*>J)6k&Lksr?^- zhJXQYmj9z4A$w*%>J0MWX%Zjaw&hZ5emIiWMKvBbZ;~+X*R5}z6z+|Iw&4#l=F(@9 zTAO&M0amW(PeGUKw?u&N4)A{gX=YAd)S;!rje`xH{kCcsWh*tz3@vGOAY(J=`4Ul( z**l@(L-2Qo$k109r%2jmLKw8#!N(GH8Pgk7@GfoU%lJ?@6cF_f$6OyJfp|+{28?^J6u&fZRc4_(YQzal zA%I<)L%KL>H<=aKnAa>bjy1?kaDY9-+|+w{gp<=p`@leX4e<+23e-l~@y_C(a1 z(%=4>o@prhMtR4Atc}#`h}ra%J7nXrOJP&F8*8RMgzIda*92L+M_*M)r1Rn(2HpO~ zdCUV#9vq9e0|wZu>#;gG4Pz~Obg>O`9iy^5Vu1ysvNIRW_xb|Q$<$m?Gzw&U4HW4> zN=AEBAumxZfEh9nlaT5Lp&5aMOp`Jfk0EUtDEXU5m+T$wyTs4TD3vY?Mjsr# zVOKAWQW+uUziI5{JHpV1P1F=9&Ux`iHw*pd?yE^`OACwa@tKepWudS3n#Pmx;} z5cN1w+oKpN!YJfW^)=np8#2-Vv&jQvdPRlz7=#|@x<}uhX;1m~ zK)Y-YWlo_k#e34~AnucW>~9~=t+RT|(!u=>ys?5ovB`!ZuP zOQOUC#-$J&hu|>`+#QzrnwA+v0D5)z$7>0@#X5sKN?Gp0Csb8+p`yp02z76gI754= ztQdM97e<;8)9&atod){M2co$~?{z$&_ecDL?XhAqrmx_-W zjE2r%rRjFPz;L!gDc&YccH74c@jy`ZwpF@r_xyA^{}JuKLR*kcozOjap&vJvq(}(4 zqm(Z#f~+YDvUbS-1ivXcgIXk0$mF8aWPZ${kQU0)s1AEQX3c;mJyM+PsPZ;o50|Xp z=4~lig4vhof(fem1u#c>5u-0fJYn5&aJzl(RhS}b6hE>HO+DB(Ye69y#4Q#q)B zLUo5%-mel#q=j{NIuv!UXoJY^nteUSuU6Ax9pz6#YNNr?1B`1b?{RHtt{3LrBhRK# zZtN!BGo(VIe(JX&u=@VKizFw+1W?j@Ty#(-WCf({F%_#vgGDQTpAN=Nnnd*rkBzXL zzMQZ&BGhrHm2O1+O3>f)@UQi&`bB$;)t z=&OXM-#mTDwH42j`0=p+Oj;L=bu#6iDb zP5z6W14WU^?BrEwvbXP>PZtTi`R?&e9COF#JOoJW;of>lWXme5*@QVEUcp0{Dsg}s zq@HaFS2s*w;hp#h$$c!gd!`r+g~yYzo_?N2L+F{@oC}Ft1~D`@rfm_29_YVRVpBtT zUNQ_g(9-A%%%Q>=sL9%KR98P)E|@o&UwKJCD+|L7+539&Ma^X8C6LMv5wOq0#&1;} z;5Du@Xa5HH@sMNI$`!BP;?&Mi+PqP`+YnPr6An}Tk_g=`+y8PH*oiTF0CSNV`3Gu( zvdJl=>fn*&w%odZw_3Y3F_|QhI?=L|A2>sxkH|<+8;F@xmZM68lw-j*#3QQoFbr?kmurO_QOIPw9}TjR*-O2~ z#Lzj_46-V5>LSfD!2uST?2Ok*We z76-wR@_KACN8tQIPUnkWNx;n_w&ZpMje5Jz>(gkd55=ptBj@ei^H`Xp+ZQEw=g^?; zb?rsb87aV3@DkV!S%+nYMz({?MWzc^Dm9*eP}T7qC5E8Y`>Us@eoT)r>-k>Jd0s9Ez5GrONn7FYJ-B>; zqifmNwg(cW+SDCP{8bpOppiHr%wLjW8PGH@TZ;(t_iC|w|BPs0HrXymOWZXKDm|IS z42`x4j&yL))1-8PF;z5izWkd+I;I_>z)Y6Dn1B9|(Ljxj%T7R#8rWM0EW>zJu2>-- z1m6ORwu^Sl`D`En&4V6+l!4#BfnFa#r*1_ww;koh4~HDey$j&is`$im7@rL@JO6Y< zF`uyvkJk$#zkIC&^21KG!Wj2U0E4*7BxuT$+Ui_tl7l!yZ(&v91}kd7twB}s7jNm}#BpvHqB9?zSKVPldq zpvo3pQ^~XYHH**QKiP}E-6h~tH=rKem%pEnd%jCjfuOj$;dX+Fc`4|NC6~M<)}%SH zBf&wSWKlMgS1a0*aVu$0O($DbwDvt@;4kmiCc>(3f1V0Hctv|S?|a<~kpcoRv;e{yA58*i=^2gllBMqZkPGv@7i_sr2hu;K{xzGWROe{+0X-9AU@-n1A#U~(^O zusn&v5>MDQmM(G*R02}eCN2_K#stSg{+YqaG~mu4N>g^l%SLy@RcqVr=_vVjgvCvB z%v?yZ=c;+dXgzOMpB>B#>rAr_g)SY_t=*|CsB&Ji2+9OOic>70i0Jsltx~asJ=8`n zx@cO6xddU|i^dk^c`o-VT3k08UP~S6_up*q(S7q#%>^i`kzM^e)gDXqnssh ziVK9gq>uC^KlQwugIg-x)EDwoh-uNp{Eufl%pYqbN#Vy#D_2V5+w=NiILlrpzM^&M zyj|j-F=Bm*Ot30MMtqZ2o4_tEwn(@{(?Yd>pbCphtpQ0`4GBD;FaY{AKSmLj><4X&!Jsj}4a4uBV^nJb>u!=(O7X?U!1yuZ5EUz)uP zdO_hrV+*1_bY>A6=Tq(N?J6m97mDU{l_`vOkp4Io`<#C454KC-u*@O1p=DsPfXd|z z4rxrmA$buvKVYRY$$rO({^7q?+!}^1t{~63tk7)LdlHr^>gLM1Ms$5z<<120U%%?{ z#e53qR0J4!}_yOrXs54+hVb?+hSS-LX-qcUfp&ASLaS_0%w?(SO`<0?yW=xCZe zA&ACB+vUQaodSY7S}@xxLyj_j{zYXpE)w@RgFi2I0ouzls$99_r-$0uEEg-@Vc=X{ zYwKg$XCJs8pRLgGYZGJ+OT(8c~Mz;kjM| zBJHp|s0*|`Vtj-n?znj-M*N`~^sfa@3TF~_u0YjrZid*Beb`dr8#K41uEy~B(G-=NR`*G6JW{_iP{4i-$F`Ppm)DLc zi>7;y!R&^d<^;ag6ClAsfAKB=nL{+;{aFkCqSn~2-92JPR`42no-JdrM%UnMr8!li z5_!9b%kB7i6?R_`Fh7Eso4mC+*8T#r?< zMetmwY_zt`r6Tc$zxxl4#hlSve$^kwZ~`Pk**dVp@qPvP7a$g;Db&O~Q`Xl};w7Pk z@fwd?ZoV2rH=v2pDqw@tslT54ZQBtVhld$Q+lOG9G&KY9Ntg8+uVmKAQ$}5;15!K< zghTVo~h#Yb~H`1zMNFkO45nK~=)pP!V%*qy2LK?kl)N@?t<8m||`kUTuEZrsR zzXRwK`Pj3S)bHn<;g4?*nS-to7EUErXSBdK#Tppk&UJ_uckMIW=`xT%F zRe)}O?znr}#ZRM1>`h0%^REFv+(}d|KQGCrh!RnAy$l2pdl-NUCIzuA6Tcq z$H%E8wDiDO=eAv}!)w<#t6KnqpcKkg;YRE-p?N!Dk;DbM8!^g$q!p)lIQ&yTG%?9S5Y#${i?` z^Y12T`+){O3-^lZREN_C4BZB;={h4iUti{(B5)y7F__MZB@k?+8K5CD>|0^e zr)O7|qng)~FYGt1)&f2Yc!RA+*4WtzZcgg3o-G5x$>%?vR&5xHl#c>g%0UhB2w_Bg zYCW2nCs`N55<9h*HHgoQ>Sq2YnBC~w-1G<;{?z;!0LzJ6xckvu_fTIng#STJqh7*rM+^#dB0@q|$WR2iLjlz}Z z0h_1mNC~kNYG{FODFf*T~G#^M6T+I!g$v16NSS{s5|?Y8GXDfyQ*#nC1>3iDL)?caC+(qMKJ{ z)^RDha{~dsEu5Z!#N3R0l9PT*ME4r413!%IIij2IB_B=JJ8Bx-aP3M+18#560hQ27 zFM>UI*XR3Lxj}*kF0q(lVap6oFusMrn|I6OdDwIUqKzl#`8rFxl_IBLTf^41^B~gU zIo%#BMa{}AJvQ%3jpTbo3>_ECM4`u)v#dw6^?cA@nFzRZap?%HuUXYner(*^rBfGo zte*Zy`IrMLTRq=+GFmjk(&$)SO3&P+73IEWQ1N(r_lR?-GRMYbWdW>N=!u1Yp2i{2 zn_{$Vgb-MnI%QMmIOX*=fCJP_j5tmpHs9WT)fv!;YS zyx<#jZP%yt@34?Xm`n_VLR1Am7LDW7Q7E4{a?T^K_Q?&S*CbTD9!@g@U{>dVd1L5n zswXH07+wjNw7P~+Gr*aVb8t1G2)Z}Sqbj)irF%^tu~4AS5xUOhH7K%gqW+7N81*{4 zu2@LD_kGIW(ChPbHa%a; zi}#wXlMf=V$DiqMa~Z#pJ1w=yYax0Ttue+GP0~7RLNX+edI+Y)0`!@20o|KAYo_KW zB93IvpCe!V4kOZ~22tbA*3y zd_u(?Ggn~I9o{=s+UTOY0r@oSlBF=QHLHNr{BJN3*&_5;Yd>S2=o;#tY zE0n696);3>G_l*w0LgP6CqSMwMi&DrmDi{aJ+Y{NwR_*()^knSKepztK_1Eqbh`m@ zP%$(P2R#wr((ljrkD#Dy-a}fdHmOUK{m>h`15xGd76Q3f0Pio@^~1a6=a~^8JowklE^`%YteS({8E07QOltv*2CyvwpA3U z?ctLR97$NrGpK0{rBR+~^~H|&xA<+ts(fC;Ou3XC0kDD(vG0cyD0u9P*zeRo6> z^$HF8yOLd5`lKUeQ-1>pZl0>HO%0*$=5c-2JKx~QmGb@&i!ij_;UHjfGeSD*P*XaA zVJMMgDGX3BN%b)DHGSLUx+(1rd~{G81Uxt7nzF z$MWy#xw+DIOP^A1ujwObGVKJbbqf3mkf+;V^;8v|zwXLdR}%&q(-dtk)64uVlrdty z!i@kit{x7_0py7oV|5EFw57Lc7b`%k?|;R$Q<5b&cl?ygC9ogo#r#}@jcq0g6N!Ye+~w38a?YF=SM0Tlf+U}BYS?*qKrA?e7_4c$q*vWU|HJT19rf0g*y;HKHw1v z&~!iOsgk+YEGt{_Pf&|ycIJsEm+}cvP_2%qaAMO9ZxQ6v+_k^BgoJQk`1RD50_z!> zch=r)|LMl9OH?45@8|Z@Fw$>rkbl@fdA55we%PK>k%~}CSh3}w+_&FVulU;!&nq1a z%euABFjxUscE~jpN?vi-ZPtJf4gRjJu2X!(n77;KtHX?$mx4{|d zv$#FQCkQKHF zS6M31v_jdnYemw)=WE=l|?i}amZ^J&B>K5&Bs zE6N+wRFL$Egn#+<`!zq8piByE8I8673O_}KdV^{;CGy{tZ}af9a#thjqmZF!C%z0N zCLt1k$V!>N621%!66@46&}JuBgAUsQjq&yUEHF=>k^7H7B2n0-AcT2Y-5ms1NL;{{ zC>rRm7+Hf6M;pIz#&q!jIKi!uB=oY@9=)&>plBGTcTHTUV=y5~h=avhJ_m0^I3+r1 zR_|c}>1V7+Tq}hpwdEqeBD`twLo}tFNcY=gFs(ESD@~vZS7Qr*a$tlh<7L4ZteH|{ z)dyNI7O(mvtzKjF?Lq9m5Q6+KTlG3cu|Xu+T&;FcC2q9>jpCW3o}wO#LzRb{Q8MBA zPDmxic&K!@XKy+DIS$}y_4Ga)lWc*F!`%Y1AyhlCj4^5bw7HzBD{FE= z1gt&wJ&jFI#!3AToM*pvb-pa+54-z#;d1ym>4}Te#r*P0G9Mn8+TGwU`_#~o5I6rp zzdp*+hpbT-j_s%qOR~os79{`&v`v9C@6sDT;mBau!5GI{m29ZK#sJF$$Yo6TFRQ8u z4w>#6yi%>SWmclN+l#)7X_SF?}YqZ;8qGJ~*HsyiBA zVSQ-zwgP2>sWW6yjI>~EmjvR^=|v-PS0={Gklphf8>ky!KZd&V)-{Wzi_vT74PwQ} zCTbh_6VC%_pAVSvs>7~!J@#Hf7A=`eMoK@+S}ayQXSqrK}T>=5Zr+c+MIIF$m3CE>f1IQD!M>tD2(+9@dm zUF-&H&xS2({v&&%h8A0Vy8pqLjtdlQMh4iU_+OogO^ZUWdCsM?@Nwc&J7AGYz??^3 zkAzm$Bkb3b+|+#w&5+2wf_f;r$ATA--W$Om{t;&iSE{skoj&n?3MM_DacRcV_Of#@ zJv672EQcs{D78ne3xp}_RIE!*y_(^LjY%mZ%f!?s6u09&{rt{#9IIi}ZA1|Odz^?y zR{6@fDZRaiMv}L8DaXDRGn=B2zFF*K-e!R|iPpQ~lpfLWu0Ger_t$K->F3c@>9!Bo z&J2k^>VYoKV=J^_0hHzCd%ts|vK-9_?d!rt-JYOTY^5@c9tZ%Nw-4^@gEVA&$YEmg> z-5?5%HPJE87=j_3V!!u8eq<(5{M*wUvVV>PPYF_&9@FW(d?*y`Afo_XBs5#({cCZD zp{*z?knFQ;a5fcKu!MshUuH%UcT>K41Ee>>$R^f_=5^y*uj#(^;b99ZRRO!g#%~{0 z=m>=C>L0JNT}AQBrOVtgT$g@mdb>zDWLhOVAds@R@&$q&Nfoq-=)$GqfZwCH3#va8 zEofJBF;+q)#{AbV)c%)DL+@;|i}9}CDq7)!NFB9eS#t2fP(O9=En2nG3L z2>qv#OTN8>ed{3wTYcM_9~v0m(d&JDZ#mvjvH&^^fKd=#hsx7B zpy<9qFl$=$U=FhoXnARucSTTPEFwDh&Y(zaGrA54-G|{k_q9|2SuT{Dd(-p75JC3O zxb?f=^Tpwj71Q1Ch!XB7YP2GBnH#umY`3xy{>9mwo>NO`UR0+L^;1xbaTNe5GO;)e zM`dIQ;Y==2ZgkHcQSJO3yNji*9w$eprAz?nmm%QaP05;1LRKGt%P`nlWu9>-JHdob zDkF4xpyGiSf!?!02kQgoMU+Py6bqIn#Yye7S%P!Z*$>c}L#g9)qa<}W?nfFVbW>}_ zsLi*XpJ4=&1iEH*Fwl73{o*l&U5w(!9T##7li4rq7P|JlhkiUH@m;4a9xAZJ>zcb1 zso@7Tn*JN5M3XJ~D|Jg{qSuXbCSr4{>B1z84{FQVIiMl~f%G;ycw*39=30e=tnC^MH&8&ns^l5AIMAm(}lkNwpYD z>{{sBu6a+iHiel$RMe1s+9{JLMwR_Qs3X3%{z1S>#hW$+p#G)+m)AG&=I4lwEK3KJ z>oE$oiWBx07S(2G92GIs9Rn;kCszr!2Ndyz2~iaX!eCx(4MCv^7t?$a15r<9^a0Se zO-&r>3JmvVyKubmgZoQ{ZHA~Cj`0gZT{0>znvYsIi8gL)zZ+hA}8beRMOf$Dt~LW z!SF<7Fz{P9^4XR+ITnBU!$ydFh zvE|I(8Sb|lx$kvUsOL~PYdXsifSzdTkca}f$KG@|6Z^gbR&%u)`O{c{Lzgj%T?fgi4}U>g$4Xn8A%y$+ISlp>e<;PFrK@ ziCJxTIS|%jNNL$q;w-eJmC$7j&VfOle@wAvn6&e~jSbT#r~{L){|a?B!0`XVznQpog~SB8MsfNkmVGh{4?@qldex-inEQD-4*?D%f*qVCVJCNov>MWm_J zt8paxa(5WL@RWVDjC{D6x&(c#KTB>skCitSUV4%rj^jXISIDbONki_0J(Ga zf<}BL^q(;N(F?r>fd@aN1kSXb^y45l9p}6IAq|-&fj!;Zc!~s{SU>nU$J;IXI*q8R z{wj!~BXIFK@oGvwA6Y#*- z>@Ql5=TukXz~HGgqnp`rYy+wW2|-Jm)+=BCO zQzSG_7d_2YZyY!_gedON#XS?*N;DMP|1uiFMvQm6 z%Nhpv5M^*IHkebOzGB-&g}BcbcH7`-WzUKDbKKbB@Goo&Nnw&O`m*GwuY1V-o*hd^ zKZZXi&{pri;72YUH+DWa(1fU0Qbc2(KXi9yfnrP?tKLnIFHl21qhjxd(uMXw`Og!j zi9cf3Q`z{NcmI?w4m!uf3nKZxSOk7(?xxe*Xw3>)DQBNf$J`jURRc%7CXcXNGI~T$ z%TLJf^`vd!z+-KxveDbLU$sK_=!TJo(!(RQ&z-4%|Mf0S$Etf8w%g;1HIvKB6#WQm z_8di$)sxQt2+K2H>5GrY%$4m4S)2vYQP2O(B;1Y(GvI{FsS2{uNzLSkg zO4g8vjW6eg!%^g9paW9|fVu>f_MsUyv<%Ss{27gz2-XhJGPy<}$H%5W{gtEtEH3!p zb1EHT4lbu0V#l)IS9RLm3>D!E^P-feYu;>qg(-kVynGy@*4sGiI> zh_QaTmyF5^_6upyOT%g$Fb|ff{E8E1Pz~KlP{vWl{ULJOQwiP3oZOm6Ti0af<03bioC5CK+xcJPb=vwUmvt~QkS3Je(vjOZ(cZBQ zT0y0FG^JY&>7?pugd6mugBab#-LWrAZ;=rIwipU-WhO#Bi5;{nfnhLo;*mF#56wa4EwIUCI zF>(-~a39*3BJ+HuEz6B+HkW1}aeWbwiX&S#DB`|MCn6n25RXGLi?!S$N`HO5F-{RG z6cp^ul%eOVT_~wP+aw@#nXJVgGmsl%ao2BIwc!Yonw?G2BiN}$pBoAAJ+5&N*Eeno zTqKknwE-Rqv*Xqf7v|6NWvQFQ_yhZ(snT5{omNEcZmMbc9iP<&a-U1X2<9aJg&GIA zE)KcX$*c?U2w2Xg@EJ|S%$YGW*UdPyx5z0@>+5c&;I0lYcQ7acE-csIw0#$BtWh9O4$Z0$pyXrFVXA^Ox2X;# z7-ZuDlK|lnSH>H~4k|J2yol#^Hse%Q-?ec_WTBgtS^1yFXAv^U)_A>F1e$AdJ9nf= zln3ze(%2Y*fk%rBk{L0&P*mQlCOsukoRsCB=^6g8;!9uLI+1|_4j-k#fOSEps5 zfL@^GOaR=?R{Gm#sY|pT4dKyeXyJ~>s*%uaM+wWVRmrV-`C|SpS z2{DjjKpNt(lq5A-G*oGE*H^_nrKh>M9}>2!gM$6#>+!70Xj|j=Yo`~~&r%*`q}?ye zI~e4Q9?jy5jSuai+yo+1Zx*+2XjPCRRX0G`bQk&h(r~2V|DVs|{K_a2;X1|aQU#dn zY2xV7m2JGfH*8ZPpBL@Z=@f5h5RPrSQ6x520VcB0iD**ttI{OQH%^8B+s&tDUl*P( zzX0QW=(i5z*}oy^OCA629eD;jJI(Fewrb!sN8h&?2DXE`FZhocm`FW^A{Tncw-Im=M&rmmMP)oFxQ2nt8dK@+s>7EFDbhcYxl>FYiru4E9za zweImCG11HI+lJVIO2(c%>GUERwSR}-B=m1o{bqh}2b18Ih;DMa9Z+=lB+L2u!t`E~ zuOhl^kS3a(TE4$!*C-B33lm-xmn?Co(1ecrcQ4gKtUaZwomnsjLlPiOm)Vbf{C3?0S&Vs8TU3#<9 zf9v=HCZ1&xw#||p1dqb{<5V1DtqN6C#6FAc2?iWdYYXi-=~VpLnUmb?U^``yG*9g9 zu<-w!$^IRl)*LVMF2nG;=VrBE{+Q2NIp~q_6WBx0Pe&s#G$ntO&QoUPw9Hi}M}m)z z-K7v5;32Fx1eXx+ z^bU;z0&RSkgJg=UMO_LJ%XMWaTS-7GK-wght%v55R5?BeKQr{|-1L=dZj*>L0VZww zP?uTk_dS?#4nP&fcb8-S*fe5IF?O*GHSWs0yquz?h>{g`+_dD=iYWKSH$-r@%j{2b zB@G^vodI*;NuS*QN^DXtIXP(BLd#_n;G$RWEG)E5z=9sXEM^U(x@_`!|2=oN{TygDl*+ogv`#0pou`)YX`xsjGi)|b(T#aD9%9B zy{tytKuetPd+LMe-TWgJfY85l%|mCGg+-o=0D!^A`8R+=457@2{mos%AK_y1;M2$& zcW1|M=a^%fe1fGCzx>My(y*HI{|Kz8{+{3j2KASgkrh(+C7X^6Rq|JQ=XLfAu-}#0 z6dV3!uj|+6jRCl5b}SiRfSfozqPbt7k|(bdoew#@Jm#d)8>iI7ry$lyVynL zH0HW5=sS|?scT9bh3|mSjvd6RYQmlNAv5_LrzFO@1P#B%R|sx? z|I7EAahkGmpSoI7V`Kq6LWKd|-;E>KAvc@d{k-uRaD1kqvAR)ej+V&)>-6lZM_G?nYSK*f)IQgHdOh7 zU{K5&=aP&~TOKD@P=6U0C$zTLT=V+BCg@p5k*KFrgHt^9^;IeX!h-X3BIkHM_~ zSn7Cb!zcy^DOn8TXMvJ2Gc^wZYN&G;HBVgz$^uO&KJBQ0_aVINh;)2m*6y|CIQ1@=_(XIZeh zd~=l%l_5ORcP&jK{TSFvvC6lptG)L0KkV6e(@={B)r-8AaEHl35j_n2y*kbUp%jf% zXr;r|Z^bDuUelAOG{*e5S7nUGBKj6AqT_lw@1pAA!i+SD5zeD>Wj~)Eyv~fr4mNEr zV0_ZbShJ$?Y4>Rv{mR(VYXygV|6UJer1<9nDDA%x@*jbFk7(nJNb`#Y3UC*A4qvC` zhgD?wVueg`RJLz?TOt9>8M9yKXoO#MuT!ua{jpU?7vFHJrhos=Ur@@G;*xpp#DN3W zR#_kRM@SKY@_Q0xy- z&;tMo7skg|C&Qtp=F}K~l>u;6Az@xIJoJ)mMCqr@BK-Bv!f(ib8%}XXDsK?<% z#nuQUM*^Jrm;b1tiM9b46nIFsqLu8(QC%4D`E;fG+s-PnR<)H%> zJz-^e@XD*UD=pvnK$(}rv^0t>7?L`d0txc>)As8U;^YbhT1(B6q3&oEj5mBxyl<+GpI9CUjiKGlaark(1$Ac%Z3LVIKauyCiJ0QdhV z(RrylreDwoM1n@IEF83l#9}(mO>-FYKA7kwiA- z^rO`v**XD>cPOvxx;9#26>C9}+l^O!aVH`kx8tu?J~5_slXDbiqiB6QrSwfKzJk

9%p);j|;dOJsa&sMG!M_njy&qjR2tusvsU0O{S|*_vJN^EBNlT~9J` zQfEG>r|ZGpc*N%96g7rB>BuZ_nN~X2?gAdr0zS|*qj=7+=@Ou1qX-+4cT29Y8?h=I z{<@ij6B+U8zQ)N+5Pd!Nd9O=T<%BCH2C*zW{(y9HM^6*RzvyEaf4h{qIk6>p1WOer z-v|&=dTVszobWsQa9F8_^<=SdSE+o>qs2@xdXmZ5tCu|FI(`o9hK`#2C2+P_Mz72k zH3Rxc1ra=bud*QhZz3k2yYC-Mn85%W7B5+9l2 zv8Kz^lWaCorhb-dZ56z82fOYUgF*W8o}`JCzh=P6qQ3c7zF7TEHuhBN6upG4`m10r zQ$=D0i2M+o*|oZuW2r{wl8G2F(dSkfmyif^BIqY*{Ip{j>tvg~E-s^ur_z;<)zG%= z;9~VAje8St>H5o!BT#y>abxgODlB=f(7)ZI;|`8 zXN&C^o9hvXiFUV~(SAmZSbOm<6&=llg49uJjid%BAtnkQd>!7_%K0#{dq54h<9AgA zPRFvyF%$swAhI;R zdCzr&C#xS{t5=Q5OQ(CUS)Gf_CXkIi*9M)09h8CAo~@n(ZUjU`7eG*?<_04FdeFJpfOeRw4LQ< z&;2=&O288yg@5dShcrk2_JLJoEMR~1AWrQdyN>0a2MOgq>7$kt=7tZ9^qdyxEbizN z@CQ>`V7lQX6|_mlbd}y=%M*?PYtwQA25BHLMgfbz5mV#?EM$T4jW9 z>%zVzN%4l{zP()e{-jb$Fy8w_x!=t5wOeJruw+s+RRsZzArV(u_low-A<_g!{M{85 z3ZRV;Dp0v}F*lyX5Sf0Khkhw=o^zj+SM_%Wq%-+7>jgm!vkdWs7)JTDRoOr-Wt9HThisZ9-b$PNi0! z^$)PEuPEKhU7*992|V@zm@2d>Dl8aiV~|8a7``x;r&++Y14dd1bRj)e*8QO*-A?zW zri$!l$;g85GL<5e@@{C`G+xYdMj*S*o+mQkmDiEu1}>i=q*{3yhw_kgWhX3Ywo5k- zS6D<=C^PP<4KMfFO3ao~;gH=&Vx*`wJXR_a^r1rz7uOIKZjdvl78e^^062Bs zGiZ%0@(w$>q56|-3bmz8ZDGPh+{$Lbg(uAjRCxE-&dTgeQF;b!dHjlLcj1B=^%pl{ zB0IEu%LJJOx^H(RQFf%%BG`%Nd>BIZe%k)|*Cl;lG>S2hcAF(#-wxD^sF2>Uh@`&O zVGr$?K-v2XygTS;4GuuD2W;_~mhFHUdUtMr91-6k=Ja+=(fJvHJzqa?M64LQynbq_ zz`V|KV-@L^Hprf%EO>in&N{IZkDji;LFOQl`y!q?6q3K8#rUkBgdi6R z*GM1sE33Sl%YZc<_M?thgNM@exhmAh2q=>0feoo^I;mI_tuc=WP>QsamxGsw!W$hluSw8>gq8Q}&e4#mfpR94red&OgY#7iOb8 z6LQj~f4<&Yf;}P9t(SCD{>vDS=X2r_DZFot#~^@Un0i2$85jr0<&5PIf>oTSCx@eJ zi}otpxuHf;47ZgEZ{Gsd$LezzQVp53qtn3U!HtO@ZwRGliE z^y({NCPjam5=g1xC-F_ehKOUROql;CuajAS7v2W!p41V}i~}lluekhbiNUF>7EAEo@@8cevY z&LJdzwn!`tVZr8YQcxNhwnKhFgN!co{@T2w&e6MxXD^_q6zcOCrR8EqxG>x6vo+Hu zCn5cV6_vFN%kVQE3f=?^-WpjdV7VH05?BaT)m>1aeu9#%+Glquh54^mzBA+l|_fRW1n$nuw__&_xolB{h zb0e^08jQ=(Q{@h0`EM&|=FFAxz)Z(Wm(=YkK#VJeLFRv3k+%))cIXI3oS_xm++iqG z{;GUd@a*z}!JiBeZSn*c@n71hvU_LnT*B9wgPHvUQ=;3_$a;H9%3jXjJUTA~_@X81 zZd00cE`iO<<>4MbknY*C<_!3^Yz!_c>|rX6L|~gTi6v@9>X`ykF)-1BIaTM@yt@eA zoaf+DqJDOu@QU^l5j;++$O+;K5Cy+WKmSjf^+ilmPySSMAP_*JCA&<^6$Dim@?EV% zk3k>+53ki(aP)_2IV&~cM4zNJ@SO>jO5R8ku-!h(z%;?i{(ZXzy1x^6-?u=d-!ST`eD2#AG}jl<^eBQ`I)J zB=4&2{Fq}|?^?IBL!&)L`&42nP*l6l#&va9 zjUgX&b|pdW4w#B*H{U^NKqp5eQ3d;7{$aA_=6m^Wjfm!znB9 z^Tx={%t2PBqoVJ<`KsBBzxnJry}c^y_YULZzlYK#qNPT7o0v}Dz%VV_$pj<91Jnbi zwx^^8w6p}`i>6(-(vslGHt$UGSkGAgoK1=J{*h06>ujQN%{QHotj z=eoafuO%~urIg2bzn;Y3? z(&hnHEM38IV23LC=o7Ei7x8mBR}b)zm{p#CO#PtC3w)4h^Y*P&^0AJ|dQzlKS&M$o z;kps20|ZlQu4Hqj)V!^C@8(`t+q(kLts=jFws?n-L%$(R$k1r@IxRCK(}c90A8vp2?gG6SNm zFC;5ZLscPre|)qh3#p1x?%afgJefLax`W)s?xAF9r;z87SQO z-Cl%}ENa~5u;sbcKMXC^4Q0CFJx?-^j}dw~z>BSU%#q#UpV{QB*PF}M5tAejbb7*} zf`e`Q9pmlw@QGMs1$-qq=V(yHuf=bIv)^aa-0ZVm$Ui}me0*)LQ4@miVDCyUSh;Jo zPZ5X8l|{AR3GazXZ-&-vtH#L_S3XMjz+iiDo=pWLfC;#;2rCJ>N9K?Ih8D11NG5J@ z;Djs_(_>SBM;1lT7@F!u76y_S>|izo&;)&-YiQ3qQE{`YB2S<`;B6Y=#=O~~p_H~v zfp4vMIlI?bXmElAK`Ms{3q`QM;{e+xR#S$q#=_uZ(=141?<5#o11WxcQ?xfr;p-^v zWP*zW1f0%G`gJCW(>luyv;^P9XIiRzI2XpBQ=19T@lPoV7uS-ym29CaB4Tan*0HW= zd4BHt`@cO>aC)^-wmMlucdXJCEM!#P9mE)jn@@JMd`A*K)&Kjp+U+lRwCsp!)fl*- zO|Qhcny>LQaX=0Km{NWZ9T|xo_30w2==X+Ts=2z9n*DxW;SdJXnr<@NCRKNrQ{nn5YUuft8cYb6kN=wxZ)gl%mB*}Q}KS#ckJc46>$=okrk zKwV)-Ep$geC;&DstS8E_@mM>HQLeLpM+VS#W)v zp%qcTC7$D$)>b9z-}{T&4R?BnWqx`8$XFd93j?Or5vo>}IBH*7b+}|JPTT9-Y=uPj zQFpYgFmaf?P*^~i(KThRkJdPt01AE=9SrbI)dH*GtzG^C6kP&}&|R&DPCoAF0-Wt# z?GB$rNi_7o171=r)$IIJIAA4$xppdT$9DPbDI-S~rXV>zC=<-?JuwkSGScmH$)2F! zr^JTJ#I9HRpi`aB1zI9s4nP?dTv`@}lhG921_Eq00b#F%Ug3WNO2tlCB_qrS*j_s` zCWks%{nw~WLG0S#VWi1$0{_FJKSslW>!0tWwQysCs&5jc2VD(lGsvf?UDc12^&+Pe ziW&+k>it3J^Zu1@Y0~_;0OF?*Vm%xuRh%s*yGy)q?=3}OJw!rxdSG5)lYheLQzNW0 zkvstYmDIpYPQmtwe_b%06N6If+cAO4+}MZr4&4}FQls|lkZh-YCoHvoQN>3?eoR7y zeI`Nf3Mgx5XNFtbM@M(8c3~UQ(N}~^OYkAoJx)+ND5_4>@bvJk2n8 z5}+Rnd~gK9VJuZx6F|sU6ijLhJOlCX$P>vm@+==)y6AoMqJOL zQw3FG_@2lBy&Lr@2EI)TkLReT2>dW}%DBo*HkeuqvkFWQ+;`mEkTz&o0|!3S-`O0a z`#)8lD_Qk3aYZ?Y0ZJ{A}3R>4zU_pT?kK^!~*zYA@7@!GYf4`YA(fZLZLZ4Dts`n)| zLXlP>+w=?pIeYJhZI1+3)e78=`rICPm8n)eF)k!;9l!~iFxFYV@Oh`A!MU<-q)IdR zbZBusNcd6;c1Y^f)>~8dNvZ}WMvBJUXH#sywK2li_@!yLiOH%2sHXZ$v1KA#sa$&I zm`L$^Mw$)jaLb1~#uOdLPm^f`8%R>Jb$A&yCy>0)>Fsd-yJvIcHIjVz#7%`$D*qqC z@;kz~BP{!kn_OkS{mvoR+RxnWvM^5@SBeUyn1w)4E&-upa`vF3@%*+`JIOjDC)OD_ zW%o-cj>=(4A?8hIglqzDgbD*kvF0YGhnF*e(@JupA=I&WrD{F*73*jb(FatfmC`X6 zbo00k>)#McbQBlbab?KXKVGBf3Ve|oDq`Ei+GY~kJ9#6S&pgpN;+?2n{MyL{wJu!C*a@=&ynxo(D()jmX17wjvga4^{T>K2jz>FYeMB#-Kjo3}c%skh6zd08C_j z0e-RF7>;W{v26$lE%jht%C6__C8ilnwwRx-DA$#W3!ShlR*Ct`>}`nHfbnG<@tf8I zpv@)`(dIRjv-svx8?8=Hv%Wa;W7Z4bYRFP)Ondn~9}+|!QXVIMJY={oWP48tG3GBH z<0G)*c9Wg_K}m2eJN%Ts`i;WK0@6bKEUCF)3ljJ&kPh~`fKYn%rs=vUygTbhhGQdkvz^syVr~+9~R1V39FoJX$*a);GGVx&ZrIiC%V0* z)t`Zg{U7#2JVLE#uUB+SAfvd#^xKTq^Ms08<)Q)R&~}sPZ7EI}`h3kF&8!WX##WKF z1rP&iy|iATRdR#sv=n2YxO&fb0(o1a0ASzdA|5>;_uqnubq ztMy`QoLFp|hNhz;Z)+w0WIyeh8l%BqTxSOTBv|t08pj0ppD1D4s)nI7nNL>BRyp>^ zH>gywD_6L^qzrDX!&^)?-lrz4r%F*KOKboR$&P#RRqe~`PArt8eH94{!)*1FjQ1y7 z%V-nP_qa-PF@(9Yuy@U+G-yBO8iF(oe=0XO+fdPx0X*6$JLq>*O;a(mMc>G3X;{7% zD=#X>GRz*1Tujt?>a(@}o50lR1s;#rn^Utz)S2EvFOgxoo4M>s7>I20rHR#^;*AM} z3f&_pPZXWy;RnD%7F!eB10ls)XhY9d%ZM06G4cwzfM@$fn983IX+}0>CLT-?0$Qxt zw2EM$IN?pZC6FUrHR++IfNS=14R?T-7Mnr0*fSwhclDONI)Cx|jW4~v4RD>tmd0Nm zj^lU)kvJQz1h4z8O1k)KWvSs$F*0p@cyP4qZb0V7o7pOcQSg!wg8)iZ;m_^?Bzm_* zjn?9?HCeze^<2uG6#4%gb!iPiRm8{5^j52Xe@U}J$+09gdknSnrF zom|W4Aq#jKTh+MFZ7T)@9yFezwjQu&<>#j0unfaNH>SDG?u#mEO&RZd-?|`G=Mn3e zag%q8IRn%j5o_lZU3V2z%BT+uHqBxX&t}|vhq>8nihr3yns+g>?Y8q5Wct~UI+nuu|J!@Eg@tNbqe=N68m6in50;^@zoK%6HB2I0Z z;2Zi@ib}fx2P)z5am``vwVj+gPZy>~rC4mJtW7>!Q!^|XQWqfv2mG0Oc>N*o?I@EN zTFMjyjj~XYAL+KTO+|JLW|m*qU~I1YZc>^PJu5d9(mfUSFK>y+qPVNQ7 z4Z!3Z`G6-HRF2+L>YvObZs_{y@82^ljN+XHt9_yt0Ud@(bpUJL^`G z)w5N_*y_2w*#>b`aCkmi4XFUM%S6>o#DN1g4GbEMh&Pt;==ugc;o7IzDfD$7gibK3 zPFJ8jFH?Wt`^@qCZ|A3}zfKA(2v&vN#^(9P+*=9WT5Lk|fBuc=Yy+?+v#ZZ#BPO#% z&&f+k4VaByO{JVt5L3n|`bR+g$2%x3!WfrcI@8&3r|(!8He?6p19DXgpZCQ;4aP?~ zs8r|!F2zwEJ!DQk63$S|iTo!igwPdwMv4|bFQEQKRjMxnND0Nd-;e z$AXl;w3)*Ps9^Xen_MzV(%3HT7mZFJfxJRtTkd)fo8l!Vn-RrZ@&hr(Xg(S zqdF-7y8O!_JSYLFe-*VdM^c20!cb(?_-t)aMzT;Jt%JmfmuEleH?le%ZrbwdP!>iT zIp{-BZIbu1FP~R`r(y90-n2)&(d361TlHo=)qaaH#p@wFQVEU^$ho-*yO{`}-0a$1ZF0(Nc>hC@r)`5p zxpPN=I?{(9x#sd+>Kk;#WfoPCF>EwJ|Z2JbtmUKf4;<&H_s?IP}S$3ZySQRl|HCA z;Bsyf+ilsrB+kf3i*NqnLJfo3&XItl_j9SSDvacqYsJf8NLUc=-uQpS$l!UyLBbdQ7iYSE7TgrcDSMjb?5X)SMoK;Rc>J6L;3!s8lPengmTY>63CtQx+^0)O7wBks?O{sI-G%h#P*eKXWzde@G;Cv8 z0o~-0fHwP%M~k8^xnBJoCArDA1y!tIteBsf=oCcZCtLgER6@! z$RIq8p+fe99@h&;;7;+?T&i2E?*Zf#5|>6iD^o-Y;k|4;*@qGkDR|0iy(%o2zJG!^FBZ|*1jenY7(u0-ct zcIo#`;{@9#3YsK*u@{)LRG9iW+^MoDu(S1uQ4X>o3X0~rX|PFG&LeMok?&zXA1>^l zv^zSyb|b{TItn8OGtY|O{aCTD0s|n_D^hg4aTmHzD|mLv+8z zaq&roY~|-v>M7{*TIRbR{XAubtkWT>x-WOtr_W9!o9pw1dy;-%8h`9MeCf>6=Dts; zgciyd`Ec-?j((t2M7~5~+AH_!AUlf$<)cMv^0(_MjyO3piTK1K4g}1ODEmRx0U2tL zQ6ngV$ayUTzaJPbyxGKsPL#?0D~JKQp-TG~(8>*X4kUa~X;uB20&x|se%6pl>EHIo1EE2-Qgg%^>(ipOfWyKr zXc3&eS)E7awU(J6tVlA!*_zvYj$;XESbo(FB7cr(*)rW9l`7DSymNQ25rDg$lopJc zSFgtsR+@xsJy>T+-h@~ULtp>8s@YdXB{sjl5m8Hg`l0=X&@AZf9#1p*0$BU2oRg~S z`^lZl^S#D>^XT_nTCyU2cM3JWD3wX-sbg?!dREh%ij=h)8(ks%E_#B@kYxsNX#Ry} zaH1AiWd)^=*s4dqd4rEh+@>kgPx0+jQ4NJCwZ9Le;S^?KuuBtNm5R^fmW@`m%m zu03&A<&N8%Qi`CkbYC`!AJTbgUB`kz_x+iRl;4}d-Abt(H^9I(blMQ_N?@`ujkzzQ zja})RK!j!%5hPIB0LB4Pe#*_eV+Lr|OND#ppt&-BR^$bXU4+rizA>l@uShD^UUet) zsF{1opo+(k{@bEh!JoUF_%Q|dUfEc}``S^fUsL^v3O{*Tai)GnvA< zT$q7BDUm=5mp+IG^VYqzy>pHgj+12G$+0s3y4(=}$Ks-AWxS~D4t8wH`+Xnbynfpj zx>3Vmzt&2(O?D>$j3~pfECNmLZMg^yXyJTU!^8Tp%wZpVkixNSd}iS_r!vaqw&utQ zOBF(|xfcGVM^_l5Xe6;=F6eFMcDleGY3x(S`6!)vUFPUZUX#*($X;v5@N9%DCYSu z5$s{V`fBZ#QMpXA4iD2SMtVIc68G^vNF?6P{02 z?1}b{M{zFk=pX03H)1S0FjVm6rIWlEqL0dJ82%Q8!Stx-0|)wi$7a}P>9DuBCX+cp zP9p6&@GeKjPe~`>6F1PR3XeCI(wGODYN1jA_12A98735D&hfTsGVN>XA=AZ5xh*Qm zgti!6AW5my{0G=<#J%FP6XyPo28rRLG;j-+<>-|%UPyf#n8+yxT~wLMW~{0ffcPUx z$4j^&Du#s7sK48t3Q3?L`Ac#qFc#70(H|*&vKL&w89PR4S)FAIfQ?OQH~JKygWjcJ znx{28!XychazHeyQY0v=)30*MCv1A>zX-#Ia%8|ix^Y&jC~6F0xT{f7e%bfJ8n!t_ zxXumNPkb=(Zj`NfILF>So;D)Ri%2m1k&hn2xA+&B8a>}JF8YKoVsDykrs1-QzS=4B zwn1Z5Ip-J%H2q$4@X!$HNz_w7YYk3F8gAqKz?m@ix6_}ej5?J&O`II?8YiJ~PbpE) zv`Xql1X^%(0gV$ELrdN^h8D!yv66)o?p6RYh7GTx%YW3!>)tX~$L*Wz_y#I{{(qx{e0O&S6#!|rRv_I98%qIpv>g)wniEjgM9BVj$>hh%1-Ssk04NsdV13|z&0bM z!?%yOvA&i({07$Og|aBcx=k$JKuj2qrZS-vXBOc13NIB+08^?%%OsanHuBZ;2XUG7 zo}YS@YJh0-U2(Du9u||ifb2E0oVSHR;`T{Lfne}bhY1D3cF{+eED&Mt{uJkx$GmO7 z^c2^Tif8bzHWC!mm3QXm&crz2GZ>GiflE4-vWio(k#!6BsBekNFBfH;gRC^x+HCTL z2o0?ukdyi-U?o_hRsXSY@VI6HX%d~pCb23TH&@{jJ5k>Z*zD`I`g5Bm%@?jz(aiRy;dY_xjfYzN5faN z+URu4$hy9CoAXVaz)4`j_ge1TymNPV+>BN(`iL8@} z>mcjWa2*klr9G^lI=D))geV9pwUj9a=D>w> z50oQBBx@Akn0a1$fypT-CE2yGnHwNBJ7a6&)B9K)`e9fvbhNnK zZ*K`)cu?%=ti#l($mIq#C>&kflJbG;c#}VohX{Bl_Ig!_;w##kLhwp^*OKI;IU?Lm zbVY#hRs_vK55Aric zKlM-;{*jo7OUZ6U)T+a}x4O`7BG*?n#6BTl{l$mqvkaA6m4Fp^k|$@#Ert>>TEy=j z_^o<1C843++x%T*S%O_+XeIK^{)X8YuOjHMYLaP8{EB%NiPz7NiKLDlw%`;s)%b#h z5)tc0O5NyE`9;W&*MzdsRX(Z7Ph4{mvU>=~Uauc=$mBge$Z>{(i0XLfVg3xvH}~<( zog0IGed)oSPNb!lt)hg@+`axw3R%UEIp`P6SC6PFBbk|8Fh>RJWs>r%vb6cNs6RFx zqMiLKmPLkiU2a+m08qlSQi=^gy+%#L?HyEeg10<@g~kw0gPA-MlU*xzks=9;?Wx_= zM}?*UJ3z$00n_#du4(-hZQikHimNA!)0NW37H7(G@s;5(F}T@tWEpsNLo13zTxE8% z?|ARTEUlJLrkcl~zzv8)GNcK&#J%aqwQ1g)!W9kQ&#`-?-y7HJNdd6bG_!^CP6O#a z!)O0V0?4xhl;<%2*sCl&V6xA0%B&_``L!UP13JlN9IP0Tf;49jZ1YM?46G)$f4Q=I zaK!%6sSsd6@Di`FXH17mcy_RM?W=nCVh<`9Ws`w7h8@UABaN6-UjWN{XVHVB??m?R zdBzBu_JC5<+D&qJ;Tp_+#>l^A1gZHV)`-|3!2yifG`w`L(9=k@{eatj))L3YR<=R) zk{swt7&jc(zlFTpO+Q^g5*^KXNkPXiQ-zw10917*YPU7Gsu(<&3S-flpg(#-KFAa8 z$dO)g-E0!Z&+e+Wcwr$9Q{?*LoMxet{bmwayY^su6n5V2@%PG?R?SsoR^mqsI+oe0 zVke_1>R~Q;ye8279q{JT@1R)U$UI}KC>B#0qyoL&yc1SYW-@;3n+ooCA)s$e=byzP zh2jP?^9{UKaAB7kM$UkaUN&B$#h{I%G|9x`MVmuzN-4yteT|klS3Rx2X2g76BUfUS z(~tj>qAs>SR@4A)%;ftM;0bWHw;IpdEL|VI0N@w#LvpJXoei&sOoAsP-P5;TTj~Tz zGj<6GOUNlB~%w(uOM)pZbCr>VXt;mc%vJ7L! zk%(NEmIO*LW1sg5>kl$T`cXCyrJ9=cXFLbE1j2*-82S8O+hC~@dIF|ZPsXDEIPZx9 z@X{;M1zMjUm(EGyGu2h=#CNN=d6_=^PHT+%(HfIp4*cJg5QIA1aQxfN;-E|(t-I;0 zt8F}*MxIyB%Z5#9G~DM|R3jofNlVrrHTraQ-os}kdzx*bOh^0)0ISoHLX36e3Th>P z#$bW7VVVSmYO zUwV6#9j$=`Q=oB>YY*Cq>MT?#14c%za;X87BGn0hk$kQCA}|s`=K4>fddcUHLlSKY zQ;htdquzJ>FV60BJq_w!te{rkf5gMXPX7f7r2L#m(b$lqf^fv`TMe&zuh5{S*1&F2 znujSk>`4^|@c$pN?`oSPlmeDnCUEkBn_)zD9O{U}x7c8?zfoz|`lGQMG7jbxEjF)% zV`D0L=H8)j4xEsP>>3~@oB9s;phub1IVcpR21uJMa9MIKA81*uL{YRfJ-{XY44+Gy zx^LN2C?(QWVMES@e|nZKE+X!@?c-g{M`=53RBG{jXq=`w+s%d3dKOCkBQS2jl|2Ek zxs9E&LHGZ-bN&FdUbgK_at=dH@DOt+81VkG94#`8`EeMMvM5X8(t|k_Jo)`JLnJj4q(tg^k z9dyUbu1@l(Cko~I{~Pcu7nBKEhLjk(C5bKEmZ&PK8))Qrb-m(~bAu6~u{%%vK)!oP zMd1(G1~VaWyb5Ezs@1EghMvMNgsoW{H7!REXTqajtD}6x;W$R3kCikGQTFqx*2{jo zYAyzlpdRO(5^ac&SB#EWY~LwL{4A+xpSzF)t_v-W@!dGzPD`=HnmGl;?V+iwL!vc@ zH+vieqm5~(@C}E2S1pQ@4(V<9eSVhO8g5hE+_&;)?EJU{DtHdo*eKEvQkL&yS8Ggx zVog*Y)RPw2`*F8$^a2+8x?2c+y1`R6H*|?X7m~If*+;@4G>Zip8455c zkIw1L`BTW&=i#OeURh<%t|CxA9*SFli>}2nr7!q8f3((#^S*J_0sWW82cezP zp+;ZZ+-@(J8Dfbkot=XhsjQI_*7t#I{>8All$&3JQ@ZJWcoO|Js-9=P8dJIZdi&V| zb}z({ve8%10hW5+vI|DoqfmZrtG1NEP>(8L>7%v|6~?KK1LZGrLmNdj)jEz4*|05Q zx=Qp$t&SdV^u|VC1kfTgjck_c{v50~-Y9jLS{o~IKBsU1)!%3?#{}r&T^{2bOcE#a zjibBZG%EVBD|UXl-eqG=+tMM-g#DNecgVF+K&2ZEWX*E7nCB|`?xhuNl4PuiZb9z! zt-O@_voMdQ;s@(+)=3l-u_kUX8PKphu^y zmtrz0{3V&R!)Hgf9lC^k9*m01TVDT3XRChB0D)F*QS7?%8k;fA4oA%Kjv=}efkOZ# znim(g9pvi5TKUZOgCWgfibOB@4TjQcrRFddNz|#|%AFq{)^@aI@6+8P5QE}7z9q*o zZDoUuOC6`ZO$0H3>g{3oE4pH^pSFy-XyDM!0V%~)_C)?NMnA%F(#J^6rF*G&P^oyFTnIt^_j>iLZ(p}1}^eqyT^GjI$!Dk7*LPkV!!Q;VA z9lQjI=y3X9d4`7~-11qf(59TNc>t$IqCH?yCWQ!2PS4H$V>s3=Eq#U_y2COB+mhMt znZX3n8AsAu9vMR_j4O21MFdXNi_fxcBQ1}*VYS7MPkKjUfJxr~;)@%Q1Je7_$jd!T zh!eV@yTJC_A(9y)1*u^413UPggivt${BG5Pn4YbRS+UJ}i%9(e2&TyDJqDu0t{m@u zp{xb_`gJom>I)#;tUj|4;nfq6=NWRc#H0f99s}qL)}*TQt3ESRITGtRV#oM@-s%Lr zJ$_M+a~CNg>EtQ;6`%=#!mo{-Ez+Fj=cYG`2it>6Dc3$~GuvhE>6!&A`4bnwa-z({ zR0nJ^3eG0A&DtVJFwNhLwToX?{EXEqC|I1~OpGLmi6Nyc{yvT1JIt>f)b6fKbdN*6 zwE=~ZyQU;0*?l?#>_2pAhCP}(8aH<=ZC;ZZ2x!nGfmgM2GF>lERIgZN){SLgxR`sv zgXII|6Vu3a>nL59;u(WI^r$(>3DMfv)tC`bw4#kC_4fZ`yYhM?xArSVq0V`<6-JKW z(GXhP&FY$GJUfw8LP}**q!&y^a^)tsum3*VFLL8^<9c$urXUlThjd9ETS*H~0xRkl z!KEdhwlRhr$~DEyZ8j)_fvs@B^d`5JcXzuOP-^j1?+(IdYij%opE~&Zy~H(7G{A|= z+q8Tyzy5u(@27UH3`K{dImZ8}oYa*Lv-uEy(9p&n&JGP|gJW(iI zppE-1YT=B?9@?X#@V?$NwvM+mast+}PR0@6r4;4J17THw`Uwi1%qRe-qpVMN%=NJ3 zfwr&8!^CQ9tLW#e&N$6$lX=5?EF49Gw78(cn?t)Ohe9X<-cWKTaISqOUTodUp9-AHbVywWazn93 z;!7{Tci0+f*BoZ`nYUwS?i$IO8vIKZrVuNq-dybUcjQf9LH760yZs2~B| z&RJ>_BAimyJe5Dul9AM|B4o~7fy7x{E543aPPk=%Jhu%mp`haPa;Z$@My8P}+qLuV zvo@|xS+0y_;mJ@8TM;3EZqaUL%UKFQ5P1s5C7 zp>sszstw;}!G+uO>Oq@};A9ue9831Pai<*sG4r4il z6Guw56j?j`JO|+3NqekqyoXM`U5Hb^sff4)8BMa+-C+2d5M==-h=lQ^YIK(A!FK+} zI4(Tp9zO2_@6;8oT%BDyc^;C8=(dFV*RYEeb^ku@(x|3+LZbEAbZokFp^HwrAJoqE z7*w{jA=N~0TQHR1-%peC*}As2v3C=DEMWMkPcx5Ji)|J+^ZiQP5XEBB6{ooetBw+T zlT5_37V^?o=#)-HLJ%Q3#3PKD7FiM)32SFbMmMA1!S3|>%pbxl(C{9oLNtUPT^VPXsE*DM6+#T;k>T@Yi@Fbz}_P0TF5*i+?AT_kEAf~;uW4V5S_!a z%WOY2^q&bnxg%uA5JB8LcQu~H)>{pWNjfHi`n;!72g32> z6Nt7tv5^x2?}Cnqecy%b;h?)Lk4|EP8`v~g5#;{K~2Clvut*O zf{WTR2}M7nlk1Sa6(kRl>TXIwb#Pj zG6G|=LFADp8{_03KcUOlBU}GTBF_fJE{3& zLdq2-;jYwy0sIXvJ?tN8OXwRal&O41eYEwfq?H$r`}maZ=b`kcLx| z#msMJzLrdD?UYm!d~W5odpO!)tsy|0auj9;mugqn`RC>?$Ly^;8J}R@uj|}3y1Cwr-zkHgzx8?H#Y2rn$-z5M9a*U+fQHE`X@Bn#O z9!|2s!`?$v_nai6J#t&N`A7`H2SxalrDKJp?ax|(OT;f)VO{m)jn6mL0;kpUp!j9E z)d?2T?YP<4Es!mww@+k8Ue3@!Ee`WGFBALoGFmL4oA{E;dOQzUP{M3~aF>f>nOtmp zm^5=o`~mQK^%U6kK{z?hMrG6e0Smb`NDCXtl`^(l1<|kFRx3 z4<+L)0%)ZmCk;*>oK=(Kec62sLgKk?Ksf@WnC+n}ERCpK9)_zW^7Y<9M28Qb2ud?K z0eML$Te(?g#^6cd>FmOzlHEORmV%q_BTrK_AL<5EfECY;;e4WP9puw8r+~(S8;nZy zF;;l-f_ZNpQUY*FMC~J~nLs_cj)g|uWoxSWP7OC^ng)ft@1cPvgti09HcK)itn7n} z{{Kh!QI6Y;AU+P}M{6?okqOa7><&?5`+#PuO=`D(3kQ5OA)EGa$EcDbak52BZ=QGQ zBG)j!1wDO}V?C*_$Kwc7G$pRE6T~=d?}a9+U>J9Zw8)?&leZT0miq{B^fH|JZ#Py# zx+uG)&$#lg2_AlY6`c&!CPXOcg=Mxycj_+jDQjlZeXxGLk5Th#iC5omnf(eSc&2fi60OH zuc60p_lYUm$|?tf$2tq0nGNuW7Tl^32rSA3C&GBd%p}1M^mV1p$q_aR2TJldh`yv# zm`EfcUv4V`OmG4pc-KUj^0rD`pVxA4c!EJ}Q78dCwh*e=6Q`xUXI=!%Rh=JBT&pqJ zG{pl7g6TAgb1-H*L1gO7Jf5YH`QWffoNnK}IbQ!U!4ZBt$$P~##xRj!IG&d;fzZz+ z)OuY>Z3M6~iAN-mRtpSEW}lZ~$qc=Z@QDgB|6ych-usJUzu0tH1b{xL=*3MB9F_M) z4!ZF}ZW9G)@|+e>>aq=;dE6gxuTwNyn^`J$5&C793!V_6nk)p8wD&w6eL&nS* z#ypyF6UuN-fGFT6LZZl08xzSoPZYb32!cGBg{W4KV@sG6*{_DlD-a8tW?zjMORqA5 zf`;*WtT=Q|t&I!7AU|H}X>47J%qyr)+gGef>_kooFa}>VdAcSCWJZ{hSH!>;=Xf75 z0Q!Z;*>^gnyHe{-8fXsTk*U3Z06U4bB!^_vfV@kP}c_29D0aYCUgc|fT#4ie*N|m2ABF+`A}KeH+G^Y`>0K$V8K#$=Wf9(WwK0?>sKM)h zSky+Vq{hP<7Wl~T;(hqjQV35NR8k4-A3SA9DK7^8uiZmQ@!%aCh$(ce+?j><@V&%b&S~74ZE4ZOWvc7l*YkG6LPj6He>oK@0I7LIL_Nb z%~BiZWqys~8cqOiw**+}i$?F?i0m!N%(=;anaVmbDdj!$;i>ut+nAXFAKP=Jzt|KQ zZNRzHT6({>8$f>_*y^Pig`$F% zG{zr^M+$iy=#Og@kL}-|=3HL#l>|nscpdR;NPQU=33+{yuY}OEBjRhM7Y@Ao3ke8P zZC*e?S`5Nr)6q4Od0G%XTkw| zUsgIiky|pn?yH4!7O}g)!@O*L!6Yx|$nrL6IB)~cOU+nh7M6+7R1R!izpa%VRc=VxRjTzjq1wI&-{z5Q)lYmqzx!9{u5zW^_-we7R9(eVk*>^G zSte71iX}h#L8(kzuEgb9NlJ5-x@>k=E?QBn)}~D@ww+KI!R!0|9qYq~3$&g9max{| zppc&0#UH+pT&=S@(uecWz{0@;=gEP8{pcmrJ9`^WYbvWLi~_u>U}W0&5(FY-wAio) zf&u`m-+2BT?m_3+fDQ|(di06&3dnK99$psvXWPz$=TBK=t%8JCX|nxy!-*?SYoDpF z%bCRZNEL$pF9JL8^(z+GZke~rVVd0nIW>^j_!@yPZ?G=i86;FvBy05KEd1(&YDJ3>^3^6~Rt*6mD~0t?I_yAf~T8(q*QIwpl)4g0*Elmc>U&%)UUC$HVKT!)+<;&5Os%vf#)=6Vm z!bU3;-k7=eZ#&VqsdO{jfO;6LN&hzvrXuN@-JQDg^Thfu_jyaWYgHJ}@u+g)J zgYT^HPWQEm^k*F#@!lsc_el8{FX9vF;3Y}Ho&hi}I}i29U2GS>NFRv1TjvJ!4LE+F z-XyI5DWqNoOPdSW+1Qg1X!ATut&u-eSf4(!ol{0^n~YUniW*U9ib>3;71aQ)=^GlQ`37oAchT|zOvM0_i5_a#^f(4}gvu+^eEw0+68^kv?$TJRr$C!KDAoPe>OW_mF#Sd96Z# zlJx`qsZ5=!`9b~hmGcAXO5X7BK5ZaEt{)blr41d03N#c|6fg6t%QVPp&a(fm#KRG4 z>n6fA_OV5Vr-sAhO}~YPzTv4aJL?e$=pB(B=z;gOb>{t=W z3ZqA$d9L!Nx25jBTSvS}cg}c*so381+PND8s*$t}x?%hNzO;%Kw|7o$=MLAQX4Ll( z>prMh0cuG2xkv-}^IjHPQvP0(_S%yc1u3{K#4gSV30QB|v9D#V0_1yiLO+jk$QZVB zuvkY%(s@CkVo?NuML}XJ!D-A~o0j=1xBQ}B{`;_ft*u|>L5W?}bA)$>n4o&(Swc@! zMF*qshF}o$44(L*xF}I=UC-KfYAT-*Y}nBked{=unw^b;Rh(s5EscsDGU1v;8CB8t zChQeKXoON@SSATTbA^6#FiTd%0&rgXx0o?w$``;@f@8gU%+K*zCrMEZV zJo!CBml^&*i#KS;hNa3oh7@#*Wh*C9$6O95_;5Og=_jKm;4XZs~Zl# zfx25k*wD@1YIjczmn0*YHrVwzk1cDZvSI?FmmfX$Hbq!VwViwu=s;$>@&Y*Ejtpo= zl#78&GB`q~%i+E2V<#L^T$V)LXn}~Ki+*6gVhOht>Q}goZa0JWe=%PZq*W?P(1`$! zASJlbgs2C*mhG05`b6NG7!+DpM)FG??z?X_)(VVU z#0%=706t?6MwSlDgT#r?olGN@rpH#8Snf$$4yj4ZLU95*P%2$DX2hojCc3eA1%n{2 zowR=NgF&=6K!F@;A)qky(~&$RPghep^U5T|M7jw_jAOKCu}$j)&nekX6CDpQ_k8u~ zw-4M5brTUPc`SC`yLwz!)^rr!%Po<{%Xn;t$p7xk#EBb()EBo#dz)h5qgj^^2C;J8 zAjKbh`^*T2-lb>`oR9n_TwxW;mL}dLN>cBVlix^79b7|BQcLJ6ZilG0B?Kuy1nx^` z8f6pyOPwt2aAH#pM-CVj4?vfE0IVwrE6#k7d#5ZocrZJ_A4S6}^FugBImQ4^nu3lN zhdqNt1#e6t+L|0(@;`7k8Y^gkc?S#a((=t=y@m~7G9;1!OvKCTR~CuuyZLUt!#ME6 zVbKg7=<0Re_1o9Gn@%t0=JR>r7!dVIXlSSJFYzGOYg}4`P&up19%~q?_f~j6r7#)>i zWXyMuUgO_!F9tf4n_0hL2u9y5-Upi|X=Q`zC031k%bu-ZHx!84yfi2NqK*d;#wyPt zuEwO^G_6k8L7OgU&bKq4^1KBtwAe5-;GLx5xFq4WVn;}UshqWNuVoLN%4c9y} z%VO9Wnp`zyQYGw1eQ1Jh;nk!kZcG58I^_~3`41%w0Aqo*n7EY7{Y*!)J)|Ogpi=h5 z1VXP%uS6>$nA69Am3IS%Zmj=S2pFF+PjUj)O6-)SEc>3TlRN+L-j$`DTn677o7}*% zg1)L!f?*Xg!U6OhTv?u;u`l{IkE)pAxw5|yGffuoO3jMA%l7|Qz=*bL;0yr!?(cZY zI=p?DU+}uM3rC=B+Disi%EP=*H;?@lz)oS4$_e3Z+5WpK-iUWC9_(8NY))*ZP48ys z+AJ%rmJ9HDOMsXkIVv@7uGi*Vsu)Wy`ehc6A*SDTO5LKDmcqKfBry)Esg?1?3&1Pq z1pVkdkDCP-wwtTb@4};#$(xZ4)-by2_-ynFvAqvr%EaUA*8Gy6p(rvrPq&0GwAO9iQuH0L5398M+DCUu(zu+&ChC)5Kj0m9mvIoe&32Q4ZM zkR@$mDJa_W8W1oji2s=%)^^+x{)uYzZx(=oyZxn_ug;GT~n&{%pVO1a;Idv=Szr zbZtz#sLNw-64LTVOeK9#BKQCN;7dg;894OQbIYD#7t!~G4q?gt|8cAl7&@!F-0e(7 zq!RH^AGY?d##~^DxZxQmg|W)yWd^#6YIsecHeT#*bCWDdS6tmQSGHMGt+M31DIJno zZrjp!D(FS}N$}7oJsg1vFfuJC?MKyQBw@40mshsEIaeLFh3hS!A^d3yV*;F=Uw)BM z+~EM$L^YkZjb?3rQ0)f&H`P`5El;y@&>A9sH-eYK%KU~jY!>qZESzSi$Y#GIph_TV zG*J-e6&7cSjJ=thus;1cwz)0|Y~?H35?+`(i(m3T%W}Ow0;F6+^Duw(x@`4$X0-Pr zFHW8bLdI%3rg$Y2TI&G72Vi@_P1mC^F@VXnjXUm}=74eQ-(KcBa|q&z1celN+&|cO2_1b%@zxT(Q$6#iX-zIc_)+YI z&a#X>CZMWAE9mYS#OUwDKfT9siM~Q=02GSd)Cedku9GEMlLT z7DHv#ui?M9%xM_*GpJ>)YKjc-?$ZqUV$VI#a!`%XD(FP zy-KOYnSAc-`vQGjC!*Nyyi9O;&gOjgIS<HeOc6eGp-6Hat4grK8rfEiL!J{ z4o#nhmv!v5$`uxC++XMG-QPl$)5kig34=($kXKpzvq27S!y|z2 z8}0gDls+3B`$hhW8jtN`9wQo@%rgjpk~O!5bN4rjw)XCC4KXDd46RAqP+~1$#TM*> zsh8O?bKdv~TL?dg@gZmNAb?T0e$WufNh{*$nnY+DeI14@XL1lO9NGfv?7*TZ)=25B z--Rx(%AeGW5QJmjXd;-Msz^~Fb)LD(Sz4U^yrxXK5AF`D?Ms=<-Nw3k8DhU({Kn5{ zj&W&N=LQrz@bCpCbT|OMz~tYEAgF^MEBYD?2rLSFGzKk+tO%0V5$$oAQBmTActr{C z9Yz)dVv^BP6z=D4(XV{3<2D-<65xrK1g;%fZ1Ylwvr6wK@6MCw+$gYq_p^!|_D{-7 zOmBFG@wA82YnvhSbn%f|>q^ZH0v_ZR6ApwsIb|X zGgNDZ@4PdDpOvGsl-oqI`MaiaZ0$$I%w;-=p^q>Y?QWO}AvWH(L}H%!mCfv^XnFcE zc>%Iv1F$-TpQ`Uh>-yA*kkXJ(JnH`OLSTcX|4e(>)<2sY&ft*0QNss+foX@?&qxSf z^VpMezhfNXv(GFo4M%%h=_AM@MHH!b?Mh4$y0e^i29?Wedrf*6GKgLF3cmk@l`&1- z&2sBa6kI~|DouKK$yqds;9sCSyvKR3Yvu^)!>4a__c%hcJoa8swBfA<5#4mD1}wW@ z_rQ&Mu8Bhy<>l5O)4axVqLJ3UX$N2}pW4`EFK$Je$JTzlam}%r$bOv@!fn zw0gtjMbgXx94Y;x{cY6klN|qz8I|a)AqW=dP-luh0FR-4JQ?CVb~cHWRd!Pb&ORqq2HTQFTR$~MTyRMD0FrKN-mqj>g0NRhb;6oN~|QVlds#OOIP3V z&A`fG9&(8>tEk5}c$k7qr5b?jQEE73YUZ4rlDn)r6@L-}Nvfi!){#2SdpgU_j$BVH z;qt=e(K(fr1=8*J3K<-&^q{1TSPV@%0}$~qBS6yqh$1eNzU+1T^BRfJ;L&X@Q>sQE zN!t3^;N)h#ac0lpKn|2q(%0#h@y{zyvf{Slksa$ZE9r?NjVKG~waWtp4+vGk)%BH} zW|yZJ#GJW6>di*kXte)$uq!|aQZ}556nJMIFQjF(z`TNnHH_r!g-l%VOns_a`2&4j z#qJ7#c888~*i&_vZPNg}2~fam97dIwx?x&NKewYbIN}*L8C6CmoFjY+&o;KsCQ{T2 zDlA3;*}n+rGnt8V29``$ z)+mR}7SqiRAU#`_eYZu)W4&Jws|vqPRuOZkAi0LV4#OLBy}o}i=}FC~22m(!0}Dif z%J?*aaihZ(QmLLo6fyFzYq_~HL5)G6yCYOj@Krn2CR8>rbjPN@Ce0Plu!x6fP)l;< zi!-=VpVT$rKMbS*f!c^J*pilA4I=d)wj4XeSRZU;$ZaSOC2pT!%(0I(I+H5#%?^>R zp%4|?Zs%Y+WNsQzN)HgCs`qJm=ytqrei)U&FbC#vMo#m}b+KbR@J{~AAgGG(#7c(Y zY%nSPSaPRQv5Fz8jl4f9&jv!1#-=iFut=qsLgyEXw-#IRDOs4Oe>{1@i7{5 zI8A)ZBi=Fq4s%;DiDK8Xh;%EjiKhw@Z%h~QiR8!EOK>ZD}2(S_}lP~L29*S$fk=2|; zKf?3z^u2KB(;YmRnC=}F$*oEVobN*Vv$v%}36O`1O?uRtvYf>Hf+`IDaTK~~PC-eN zTfjp({QOyLO7IA~d!VSEKZvO0Z1I=Pk4+^k%jrlY@G2kli+65f>H2HO=@)pcfD(gKyG<5x__o4ZH$`1 zu4igA``$W7{@2DAaTxSbFvi3z(Xe##zr`NuDHyYmn)^1ck7x@}8I)|l0>7iPCLDWq zboFj64a&Vm&*SI3xakt$wSS+qqoC0k&9D(bRe~HcmDL_RGhv_SuJJFJ41k*! zQX<;OvbP_~e^LVG`>2HkFkS!Rg~4h`$yhz6aj4&5i@XBZzjWA`_h#|->sEh{Nm^~L zF~s6wPyJs*<{C;ABi=+T=Q2uW=2FoM%kdJ=ee?ZMS~EK-ZC<%uRuF8ymwxfc0PPx_ z;)EG~ZWd-exR1V)yAI2k2tHU9!a)z~kKZalQPpBVz#33^LTGu$S}x{|%fb`v0U(PA zLAJ(blO~%OBHd&>Oe6gJ*wH}t${Ai#dA$aFU{9a-0h(|d|59NbR6x*sLTb!kOx-n$ zBJOQPAy~Q>SDHh5l7SZt$F0G92c&VttNak@n8yD~d#Tz+qLE=T!?<%Yd-VR^lH@Vmf_Y4c7Hcp@8tMVWB1OA$GrK z`bpvI+VgI123Bs@Ff}sPm^Ai}L{gc^FI3FLNn4q>xS7s8&dm-gRSS9tJY*M}vc(&n z;V4zkE?mN+!|dBGGv-8F-#JB{G;0WN6$?0uUsy#$4C#7GjsQWrPE_pBv8f3BJg3cugp zUx#&QW0)$x0z00HL{HLz<}Z)Nf)86o!6J|#A!)B>g{y=u_i%2Ho`!I?$K{Px_&|Yj z8GB%Q9rd&h%ChF|?206{ekd+Lu$YQH6sK@PUQMt%2+k`MYb@7QD^zGx;#~!u@7A76;Z;wy6EX){HdD03}m^6)ov1iz$8n4S$md< z;6l#Kn&Y-YI9-NWPy8`ZUrv}FnYezGXD8%jTY^T!1{~J2Ih3u;FoT}BxMn}8G>L`_ z+&0n$X#cg@HY|y}KaNB}ceSQ`m84r8!#QBV`Mb&hJ_8?icR79P3YjhQt}NUTlw`F7 zcQ{G$n(eX%C{9efhGy4PRc*WG4ZrHAiN~f}$QSlN#3A47-8@Q9Y?_(TRtQWnvcE9u=@T9$msijkjYqz`Fl%xRSi?qchldqTB4F0 zAeG-F9x9FamLRiB*(xLC0fEoS@t`1^NIwx^`{Zl2;6%+Pw!c^^h5#ktLI8m5D&-su z%TDCSdmE5+oE^q2+hC6gq+i2X8<(UK^crrH%`r-^!f(zzS=9K8ICdiWGXYc))ygm3 zX(tX=-N+k|xUYmROrBKvMq@v&ZgGr?=0ytPqDIC~&m{LbO4_h{Mehzt!QnECCPh;- z+MHZmY(eTqS`e^MffNR?!`xo>F0FrbcoCy-YGLu4;51x<;gJV~IO2^BKGlpo!89a* zB7N!?--FS!#iPWUX`5j1YZ)OD47bEOtAn3EEcs`{m>jl|mEFwp+TB?HfrC%LrWbds z-!9{3w3Wjv()p<9YZ%GV*Qn!0mXLNmdWL&ha|f`J>WGBi!BY&(Ki(_`66PlKTueg;=eK5ni{r=0W^gGyAB1(e*B)X-!8@|^|R z0*4(H&>BSC5y|>XF+avxRMz~q1zKRJ=ru0&qyfM*uf;r+$M@}fPy(Iot`k0%KCipi4d;@-RHV5(2Ug-ctIz${aHF&d zvX=p-ZaF=89=uq=bns-z)DHo4?sEej(C|mH9w@V#%O|Z#+YG9QkMl+pA0B$A@Ls|s z>?rB^wwX*lv)||cLa}OQuYB~p@&Hd6#N8xLv7WiX1e-jSsEvfC)}7;EDP0+9N>BO0 z6adgEgmU>{(UT^LiyWEIbPlwS2yKv01dtt>3FxgL-Q>qR`6CP&hvEORpFK_(l2!3B5wB|E)fX;XM93>*-Np>h9z|`9Jx#Tbz%@MX9_~Q-ISp2DGIO&%9;rR83 z_%nhX&lHwHja-v(vN*+JM29%tK{dSp8&MmUsW&)!mbii90zj2nEY|5Ot#Foy7#WGk z(xJ7Q`2mzvndiQ^4~dO-DHIR>FDMui z>tnh`7rMG#QzY|9>Ph*e@jHn@P|u|-3EQZ~U&Y@)8hdLUwI*%p_AqBb1{rE3Q5}3-8@#^>7=U`00$|+a3eg>1OCiaDUQ}^zuhCU@!$V zBOvmxqjcEN8cQ^HKX_H7y!BlgUvJltow%3Kg<(f1x0Kq+zQ@nbSsIUfxjRbx;1XQ6 zL_MTZPIMiMo+kZv?RsRu_kzIHQa<}6Ahjq(Cwo34k_kM(6Sbg7(ExeW`6taX@_}V6 zuLhl4jnhSo#qc85EE(n~gRlruJ>hWWs&#ptF5 z%Lq~lEeeCMpX4=}eY?uX4SHrSDoBgK0l+ZAC@rQo`pFU;Y!akGtZ64H+%rX&EHxrz zN*A_>-V+=ZfhtLuT<9 z^M!)EqLP9i73ly=0Et3sC&$9~Ok9qy(F!3Mm|%HLkqHFr9NN8TZE8-4VJZM(mN*V7 zeaGTYGvX7|?JXGTC%fza?CUs4et7H<91QfeAut=o5KNfy8PtV_dNWS_9AI%nO0PS8 z?qy=ry{Kugl1RX_F!xOFAcb6+mLzdo<>E54hLT(J?AHT`D>1)~t7ZZgh5ZrH$iBiu zz)f5HZOYzH$k92@4x3tB?KexoWgR(ruiv17jGd|JX5jq-OC_}CXEi|0X3e%cu+$g+ z*y#fo>p4Hi*w3H{k@T%$&xqC?jVJVaT0{gEUAe6b^Rg6Hx}g!#mh$HByNR>7x@mPH zO{~*6W$V=6u7iY*x<~}_Qzp9aNxz3zev1vC9~~JH{u-Uk>g;jRDVcK4^8qbYln^+7 zl<5wm3eYKKq4OEpN-`}aS{&k2D~zRr$Bby48%r;DM!V+Umpdh+Wz2|59YK`wIGZr1 z4;U(cj`o9Eiep$DG!9{L5h&SxjV^ZF9#Uy9VcgKQwu?Y;6AHwO&J4gSJ963LuS9Go zGlSL0W^x>es*x#e&;nY!`Ox$9(VoXitF5&dgvrTQX>YFtdRc%mdGx|BDFLGRo5;ic zVSsUk`foazgTcW6860?)XrP1k_+b|pVkEYt@{DeB*M8E$vMy{eXC)-;^;-_eiI_D= zXCiAFAK9ZF9)m&Pv7c*d>{_Y-J3z$07tHjE4kW%w2R@aN2?(lsUvZ(p?V2g=I@h@1 zzKN>4yeJz}6l#-QvN@fWb`=e%+MskWQF}b%!(#!g1+G+tjVyG|ePoh^{<7q*UpHXs z{Ay3(8G!^|LH$*jEG7?+Dd15!pBe0WPuV6$gXpz<@YEbq6ITIw#B1-#)~57p`pl>Y zkikOi&9`kvrp zdsHU}up^SE>KhsuXN8+iqNDFDOfh*Jnj8!9QKOX|WVPq>Ieeg1KgNbrCX#zjac^{M z@5XEj|9h&TDyPAR`>r^H$Vv)Kucz#KGu*y-<(O6;kEPHuw1v|h8o4(%uYa8+5!RXK z3IySFX6R%IK9Lby8e1cFfJ6lv!HRF9U30okHnKR(_T6i#PiKYl>6r!q5N4RK4k^-o z-^?O1>gnNz;r7Gel>|9+KYK8#V+jxac4Q|@wKa41$yUe71fdOgoA0NF z<^^8c!oc%9I>}aYuKiD&=NnWknHoo0=|Z?jR2@2cGRT`b-3 z$Z=UFUkE$jD=$L#vau8VAPoCSPij4mX7<=YPOHDqjsB~_-}rkc4<{S9ObCmpHrn%& z5?Ec@lx@`^F}p70)^DBWi;iiM@(4yG&LfUXHo-{pbzBP7MCC&B*YU5Hi!q?6Afu&5 zxVjTRwe-eBW~LnBo^F@iU>-8}59n3JbcF_1BZ8rHpo7zE>qEe)9tUf8W>XE@hOOK- zW>)XcM&=Oob>lzblBPJVjAKwg#$~Cw6C)TQc?rw0|Ms{*?{<>^K3*?x$0x2c6XfKL zs%)}!UzEHEi90kk8ViaHT_k9w1EF*wn&&n`XpZ1Vr+O8hTuNc}TGuO-m$KeR-*XWB zw>z*B31N1AIiQZ9PSf8b5w{rJ=4be_vq#*mDfyK}bNJzm5)+G z^Y`oHkc|S2?#V;xYp)!JdI*p#FGC}t+m9LbN*WSHmK%&8t)3t-Se+h4EeAnfZ4`$p zhG!F^#LB{LNCy2Jr)=HUkYQ2o{a;15uJOT&$vI`h2qZrh*5CyP3t-vvE@hPb1iO2k zO&l(PFJhuA(GA?al>I1xFNB>H+ml~PdGOu?QP&%boG6p&Uth!uEW-b8V0@|+BY;(4)g{*{OjiCIxADgO zh>%4G^AeK-Amt?5e-X%#Nka@20gdylnrfM7q2cP~hb znkq=AdhyomRbF~ua=CG)@*e2z>{8?uJO|Gxs6oq+DP&1>>+tQoUN0;-uZ)t(=J`H& zELsv(&@&Bw0GBnYvCe=FU9`n?GvP%7g4>tLAmgRXrH2Q`>7$fo3(Z5M8>OcQa&V+( zpK4;VL6E}AtaCflx-46niXP=qO4T1P^?xu+JnxzCsjiJC0G%B5^x>b*N5HcU}jMuGb&`e1-)BD-NkzdCP+OelC> zxHMV?)_0eJ%7b6Pu7bZ;)4xGd4+!J@FEZX$BR4^R@5aZG0pt;q7@6E$dMcazu@xqI z=HP~W;l+OPZrDIW`LPjRN?@K&0{t$Re@yoFf!I{5$-9GOg~fGO9!YRY9^$XU*dbK; zXjJtwbZ&paNY&pROhZSY_MxdB*PUQ%O)i3F5`I_F8Xg>E!M3Go)wIrwMCZ59qo29w z8+Wii%Z}I!#wa`DmU55lmx`YV&-*sB!U!$PZ3UF{1AQ#M8oMK78MuD668;eIL zK@IGx7n~VHi&U$Oz*BTDM2^^257DALA70ing2_aGhrt<$ z5ln*ESes?+^G^r#ksgz#cz7lk+z zhh(T;mG#r!SY$fr6bG0pYX~?{^Phv71g=X{=biq`Nk<>pN@3 z+$=KQC<~FIkXf&g;ol`9P8<^Lw9Y897 zmuSiK2*RrJLlbM=Gd^>LHjHeWf`+g~cgXJ+O0)9A5GF@&a(HghFktT$Vwv_a6#&Qo zT}s1rqNi4%ZPkU(7n8{(zdU_nQNbJtZM9nepT*w5n|i5+@gEx?Z-FFuFz?JVdR24W z1;DW9HLjvP$&0Rqh7I{0yh5b$M5w)Sb8Xqf@0p+axjRCx(fNOLhJU3q#j3W(7&tf! zQatjdpMUQ=UcmDu=#k!Dw<<#d1WE*%JKs#?RZ)y@;~|rnq4S?h_nI!mo608p=%6+< zaQ74E{Mv&r(G|G!;jZ>$&^N=PEVzUeI&H20b7X|= z6#NI%=_C47aN!6#s=is6TJZdLtZ&TyEHN5ukKYx2zaG)STDa|1zi7T|9m?eR7N;wU zl4I}clo98*0Sz@fRvW<#w=}uRzC5Lwcc{k<9S>^d>z+DLHa4xFa$b(lcJ5r^>J|D3 zXF>2!YW?Nb&3=1ht$zcTSn z(YIkMQ~#69@z+}}%Yc2y$PbZQ&7lhlh>x7nl~aN%hz(HOF?mJ}^BPMn%UP3Xj(wJM z-pLrfWCJ8rFuShYMq1Zy7VZxG8sAo;u?B|dWX)v+Hz+_V^Sab#)UmiIvpH18r|0Wo zfkqS5+A8XKNGk7`6aIQ3BmYI1nhjj%CVx`lYw?|@nE#!;6jT(7y;+H|1`VGk$+bRtdwngQJm-pgmw!|r7|K7` zkGTmJFD#a09%3}g5L1|M+X>T><%^O0Kn>9ukfpwz-3!3{Cjdn8luLlHvzF+pwY zBQ3ehn9S65{>SWW)}oKS2<~8CH!F8!$bpXMI16S)V*L&1&$#rmX*tCZ7jc_?E)U@k zDrEpg(dt?xDXJI81O8baOwX^968EuAv}0XN+SpWkykXD4XSGt*uG#&qd{aI#X$skZ1-~sM4IAWt z%P@CD5s&lR!HZs1>Qw%TDp5@YfcAPFUC6{_9{h2QT!mq2jl8lxC-aS$v zkJ5h>g~YMH2xrtqCQ@BPZm9lblHW9iG~lp*BgT-)&;@=}(+T91feOT%_@U+ROtZC7 zlS^}f?m3>$2%~=ix<^y&D&*^2FXgYQ?ICdooD~rlUvhy6x>?@mCK@7rzeLcjW%_(_1u+^_vw5JQlQo=Tk9Di z4A`ywW9CwutM~+HldkGaam-dyTawShc=9U*#~P`<+Khc)DkA454>mU|5%V&Lf})^l zf0Q7YbqCgwQ#7COuXDjmqeNb)*pN18-8Gpqly3q@YW%SJYw{OvQ724c(+&o-U0vFU zNcAhrhKsgv(6q4h22go3{A#`Ba#kBJRt{ z5fHlJ+g$JGjx-{&ckzMeDXZBhqENKU;#XS0=;sBrCuQcBP`cyWJ_mq$T7~qu(2*mH zXPac_U}FaA&4(EFzRTsm3Fw#FvrTRmVGrzGIGDftVnJE|C=!Lo$g&i*ugJ+;?*-Ey z3+YXj+`tWUN*-G3)8FV^SG*z+?0t;MhyYmmYza>U&71ICu>$J`D|{gB)BPMbR-<>W zoQ{DNl1-KY2NMm~?}!MqU^6K!5YcPH_se%Ule)PJ7xIUM)tZ##8WlWDav|gpKItZ0 z;qPJb&r#o33_FJ%)GU>-CPcQwJl)|UeKvc(|JiHY+^Y*b81;9a9VesMt<8+1{c8vy z9)L5(;V?&I*g6`Qbx?wb4rSWtx-)cNyw`lAcW)xyrNyb3vA=TRiPcQN`4ASSeobaT z+;?fK~PNNz-l@%a4pJE>bt=|jz@;Sl-UeUwHpMr}{@ z;a_4`Yu){Qia8D-%s#L}?rIDS?Sk@o$%m+QC;C4*Xy$#}VD}rwn-Pek2J)MU@t65_ z_<}O5qy7UP4ALSj>WH`804`jTDsHGF{i1wBk{yEcLgeY9Ks z4UwOW>2Y{gknwW+>l1XuD2Q#MTas7|zmY0jvG?Twhx+AEOHg~EMav`6_QJFXt zH!Ojbci|XZy-F=uJ?ZajcpEVht4QP=b{gQ>C}AIq!}WILpppX|t5zrQ{JEOhPDU>< zkK$uJqs}hD_jf=Ljn`^_v!}d+raBr{=R8EM)-MC-Wes|Cr*`p`%ax+cHGks14JKCG zgd8csF_&}{4{fqO%o=5vap*JD^W#5HoFpyLbAJIXOEN0A0*2jNpo*De{EdIz9e+16 zZ>zi|({=q`p`?MKZUmkQ59-?tneH$Xc(K1TDk}?69mh;HJ-&%brU?Rv6gUY#+Xhy6 z%lH=7S;Qf$(Eaz*sqD7P5W~O0x~+5B=l_Zp0t#Oq{7Wc9yUv=I;1!14L5)4kwFX}n zm!drx@ih|}A(NKLvR=YPufpAyPNH2F!?7bWmA6uMEvb6MA{GzhtH3}icUC3Eat#H> z1-3JfuO=Gyp`)v@oxUX`OWtk?KnBfE@s2%<#&QZqV9^qUlB1L3t@xbg@9@T_<9zWv zwwp{9ULWq`LSJic6D~kaws%a^<60|YbTsF^P-&R`V~i{91%je>RkK(gc%SF+P@~VJPoWg zVF{5K7V>praa`6{Qt{GY-{5dAO)fk-=e_$yt$|v%RT5)RKU%p3zch`r_Gm4N6NeR| z=68wJ;_Eood6uV;v>H==WCd|q*QQ+hu*jWwd>DJyR>_5^wf6#`3(RQxW-5Fjk1B0I zJ%JAa2juwlmgt?9_sg0a%iG)x;Y~0LX6tuYX`S9XV%cfgME~w1!J1MU>}-#wCq^Vg>~9&tU$tLf zk#?EbdFLTy4uV#(MA#fuKD^ay>FD%A#kipplj4(d=>}3zre)9LJy(y{3_`xBqqRa< zsXJ2^Zsn2@)6wwN+!hFtCg=eRKcw(ZXpP@jQHF%{iq3|Q7LynV@1U=Q&SkB z)aVQxG`NJCe*8))gWs7|MguvbhW*1g5B|iI_o3FekMy!%)(j(nz`!1?^8qnr2Y3ll zleWisaQmpsU##mtUbu6dNr%hsUle9YOv7eJHWNu-D`(eSDt|#b=j#kY);O?3R!wV0 zy0bZ3b>kS)N;&f`;w?;-EMWZkY^1Q}2j4gj8Fkb|TfQ?ftzg;G%r?+0QmM1~3cL|+ z#a`#C!^WzMZM8HE4<^e272)&pLoibLPv>Zj)^za0D_T6((iAl-XDsQ zJl(#iL<@Qcx030S`x|>_AqxIf3xCECIqb zhaNb4UoF%Rdk~@Dp!77Ow+7T3k-}IadZ4of;a7NK<4L z0uyXByIXu$A*!CL;8q_&U7N13MH1Xt>3sB)kG@R&6#F`L^V%FUqbcOTZZdB6=(jx6 zxSKMIX%QG#l#Ig)PPBJfU2#Q8Fq0d6jx#n{33Px>P+j!m3!A5WwB&hIcf)Vo2JWZ# ztMlVwajmul43V31z!}#lL#r)X`haHW=o>b3RrTB&ZE@k4OV#RpQHd#|8-J`RPH3N<%dXm!lNNX?Z*_)FXTNn6^kJMkx>@oWg6 zAe#(b8L3R>NF*X2Gxl-^TR|@c8lFN!^UZil)MvZ9C6)hCyw$#dU&45bNKw4=dw+Yf zN+Q9lNu%M=HA1}wmMY-0Z$rN{STWAWz?+i6T-)4UzTG@5Sly=iqTiI3y5mD>baB5! zIwiZpl&!ty+uL?Cr_CRs6Y?8kN;QNH_lfUzyMSWQH81oLe3q5=_)km>$;Ig2LPZ2l z;O-3<_Z{tF^BY4W=&ZPK1bmb-e%{mZlS4_%i1e1*DAz!FfX;2>)~3#?&HIW-og>Go z$Qc2tR9n*NaIY{JJ2jW0MuPZ{ZpVs3kK)(`EM0F()eDahlC9j5$L*8hYVE`*$Fot^CdBG2;%B0O|ac#k>TmWiY{4x59l1V7aE z`&6eYPvAMx^7p%sE##1oyVvsGWVS~Vh0<1i(bYUjmZ(V{Xth=fp4MXPe%k0m9vmwg zru)kFMq!SQBuIJ8NM{>4?_JlQrL~pI{|QL`)BGzImd>iigzh?-5MZVBY>Of_;;2up zi*|&b7edu`&CXv2*251q5eA3+aZ3Jwg|E~uia1G0L_^N?bEP=1e zlw~l=n2XxO^HupE{RYNBIvUG#W!m42qEmkAxWqH12y{u>pgsO?D$_-|?p z{~=#gtLV!r9#PNI&bK3i%1H_o+ znF3*vRewju<_>fkTS3j@AHxewoRu`wzDcO=+)=YCf%d0YIu+0w3aeg(X!t?;tqmH> z$7&=kz40t5MbB_4)WN>CPscbgL(j!M5Vs|=oQV0fG( zCh`eQol`qGZfwwGa+zKhxB`cuPj%Z9ft$r+taLzQMIHw>QxAmv=Yi-In@gpY2Uv7g znRx@RTG50&62s19GJs{Bck!sT0SK$mDH}3Aia3JH85ydW#FbLKqF>%d)m#$F94>OJ zt`*LxC>Qahnp_wy9wwDNKjCUhx@Yyb^KZG?ag|OzhCmQ3sTlpFX2s3a>adg%okIaD z%97?%-|sw#TC(*ejv6BkZk*9Xa=;poY;J;2{_4>XogBBI@Cck+>StyQcJAcdm|b}L zjEYajk&{H@D?>_?t!bde<4yjkRm?QU6+cFN2WE~aMET1x}IwaRxEi|wbK zv*wmRqR<{ZEUAA8oM2mW+#&Se#4f6b5kos`j@JOYx1guPP?d#B`PFs5pMkatfANYz zK4Q;%^7t^!1qixB=GMx16a7oP$yUB=b<>a*D?BHn|B86-^7?($_Tjh-suPvmjqJ@gdXdhYdo>Z*|0!%vxyq98ljusE_^WQnKS z@XX&smf;XN|K=VQRTeHLnWvLzs&DE_FOhG^T4X?B2v`IyHNbk%!OtJWs|e9fi$HK^ z%I+l~gZ)@fy07WBR_;U*-C5N%TCZC`c>4J}a3>lw z)fFBZ(j@!)<#eb0PhF+x1K(i_b7Ur^nuP+W9TMVfC$Bu?;OlHs(1cs)s6Y`;P;#A#qS3hRXaS`zG=r;>C%Ya<+Ty__=dKJ3NR)LA zmOM;t&l7>4N;nyh$oUz>T!{bGHG=&Lde{;dw{ol>Bfpk1N>U*6GbkS))ze&Nn+J z4k3QD1&$y7$)MH0vhpn++O_;}_2pFUjcA$0GN5(5AY#?-&mVT(o6J{EsvS{KT~qVW zYIvQeM#Db;4?tPJOr6gRl=_|iS!w8-cuJ(mL@l4LeaH9)$WreAWBQx^_nNv$|DA6< zp_D2()29-hkg%~+?n3=F*Jn=t5;1b=Sm1N=W4N(`9_E9!kAT->xNG3WrP25by6y`E za%Hd=Y7{jCc9os@SG`Dt#FV2k4>0ptoJ6W=5+XbnyAw2G(RID?ddq06Rv7fZYNzb( zMKw^rXB^DIMj^hMS-?oip42ajq<6|*Iqa})Vk9tAHl!PhRiUIpOj@-Y9< z9>sG6n`{975EMQ#Hyi<1Jv$B*nLb}ST)m@e`LrsJCRK!nxUHt()V}*D z3fTR)q|W^g_i6^~M`S+^KK4e$e^_NLf_*>kpQOG7^pXniA8VjmGFzxNqb~)hDjFnX1$15eV zNizWAuUOaQ2Y45@pp;qB-Iy(jb$SVUjbDKkLwT-Fb~`($UEywhwkS);r1MWGZL^bS zHj`Fp*j30IQ+LRmMu6i2C$62Fjp8TwF3G^WaOffWh(d(e5;X=%$-8vyHAX@`Ig>`= zYZCo18@U0CmqqN%T*iJ@&%R##@4$GCx;%AB)$kQ%$0n?g?cc^IhJwYeFo~^IuK=Ef zms#og=m}gn1a4 z5%bC~IHzo38`{r0#M`@T8f9>&~z;|I2%Z3$Ko;v>~ z*=N|YmFQG569g8t6o~&CHjjvZCWhVR z^>jzoido>hWwcFT4Ay~{dx5=Q^{Sx1g^TLU1sclWTI{8eqU6IbUHZC_-{;3}fxIXj z9o}t&qnjNIG=Aw2qp6>xY5}@G=P2&f9RcTd)v}sAbPqy6lX@Ec(4~d@YjP6VE^?xJ zZz7snLspg{1b4W;#r^v|U6YW|&JQ!ti0(biF)6>NP0Hi|^QEvOBam5%h7lTS2Dokn z^sO6+jQ6f)_Psp9Mj7=vuRE9dqSE`iHUcr)5LIW^B=)L$vw#^kYG-V#eapdQ`G}sis2fE$*Qufg*zEC%%ni_pEbw6 zQ7V}buy>ozn#+H0Kfs|3z;B;A3ekxT%WZM5?Skm$Nh%NtpT!UT$5{JB%j!H+={t~B z-KCE7PM2{qkYeDAf;=0ow8NY*pMe2P@?%1Mz}zfIOjQ;vaeI3$=I$bu>4+RQA7v>Z zppPZq2>;3&HNk861QQD{9eC))ZisVsQqLOjdE;h~JA9)<1{dK*n|L6C0oIN-uq$?b zjn(D27B`lT-8r#WVDBzJAwphPaX2O#oR7JWjnWhmr_QX%$v&*KxhwbXan}K1VF7|F zY4<=vc;bv{SCTL4%dz@lS5q8RopLa#FAGm^MOVYH!5fD z>KN&=PhTwA)G_iQgF5uQa^(`NhzTAun(^)Qh>CQ#+lr4T)3LN7TY#7B6vTY=UiLGr z=!FAGNp8Bq80T-M{n;WMjlYyU5A~3w37@D+ZOggh$&KC&jV3AadA;3fF`Zv7N){YQ zj=5DtrhhF|thGSbXyjz=i3Ay68#OO3xj_B_zKLCCpr1^eMtbRh0i%sv+P#;B0;#kw zpZ=H-Fv%^sC@Ebh1Z})ep&LeYz$sAT@#5i42{DxP?gD4y+Y9bpbX7gsImM`PT&iK< za?-pQMltw%m!Lg|>S8cSpx>bcglnC_ez=Iv?-K&*=J>N+|2Q4H@S5_3%=X@D(K?ad z=%f<~m!{IPQKZ<-GZJ*Or)z(BBI#?=&p^;jVF74giOz(7fW;aUCd9k&OFgoGxm085 zl(26o@Gmfe!AIzB$zy}m#)oRJz-=Y#3?+dw9vCTj6-YWJhoS}cJO=287&S(F$ufqv zf&^o}+i8xWabs6@wPxE4xXwftH?vMy?Ebh=ZL-dqImh4uo$2lVyaJuFLG`kJ9q|`6 z7h-!*N&K`Fxct?UqvknDZ!3A+IdRa1xPgywZrGKNpnME%Rzn5luUCFJzt|H z91gLfMN7#g<(P^SEHemk{$4iNJ9 z4ViPQfgp*+nWCdlCuGV{ID392Vul(b_482zP>-wR>@}@s?ww{1q*I6`N|-e;@D=IH zpFbV}w9{a;yPIjN+xeZ?>oJVY284{Lc}$hrQ;lQW@6<;`dttEe z6ado&45?MmuXyZi;EXDQVMiq{iOf)DnPnI(m|oSNdA10Wuv+^$kgrjyj-=E)-mUWR>B?Sp~#$4 zLmhDY!G`z+fdd@AtK#2B08JJf=aGq`q;61-?3`?KxWN0o6D1>IAbRx9~i2=!;+ zOxaDv{4Dv67r*qyxueCocU{*-J~M##^{O2hvE;)CMJ`QfUz|W^Z8V&h4zoK#ZpII4 z8-KUZ2=XID8ZCS2VaJX+ddGh%2boirxb3a6`>&KummZ!Oi-xLNAI5!7ImjR+D_NU^ z`CX-t(Ok<@EXu2DVZnRB0m|Mh=}cFUK21cd>fk=U_+rsjhCx2=|y$8L;f~u{S!r3SDL4np4xv$zI0!_9b9snmTZ=-_lVb8K*m*bEKRWR5Qg(?bv> zJkbOtYHVPfl(mQT+T!kQxVC=kSxur0WXe~tkT)`FHZN$)z6KU&#lE(uI;rDwr$!YR z{02eSPg4gl?h$Cvhmo^w0Ga-ql?ZzmcA7g;@q4gN)=i#duvk9G;g++78K~17s)9&} z@}r?zDK6mbOC(^6f_y!_6x`-X-j?o|fbRot=e`!B;6JwU2l0sy2j59!l2&&){zcD# z%J&`@`|yP`75n}=v#8d<`au!1LFWlh#@C7yA||T3k|(C^d{0r6~Q(2tDy@+AsJ^d?u?;Zs!F`hD%5oNO2ZwHT>54)c!fg zeEn&EKr(#e>>_1tFDVhA1DPw*ag!+&yVxqVJ?+quc3GtYF7Gf9@ORIXx3!d%*{`<$ zOWKpk=E|D6S`kqE`sJ{CA(ETWKT%*G4q8W{+eZw!5mAo(jRmZ*&q`K3oAF?FACia7 zYT8gjGDB!0&)bO;+#Gp5h6g#z}4}SP^1m8@malH>)Ut**L&@`SkpZ(Rk zgBpTHSPkrcVb1){s-dh09ejnKNkh==z_L^35RejBCjynm*5q{L@DW4|atD5oZP}_y zPdIsbh^M?tQxx5aP9=MMl^sWLFrG|5xMcCq7B#}bw5L#;dH^;#CzM7$mZaZ{S5XmR zg;_OHub!k@Hkcf!=sM>&1(t18b@yZScs@M`(KL#!ww1Uaoa)s{p{G!CyIO$aifUiAYvZ(F2SuQMZ8OXOQ@E_s~UYh>VImAr%shAvx2m1K`r$*Sx! zKq*+6sbQn3(#jzeZzYB&gB1I`i^gh2>8QxVJGMA$30H)ErX#6hg{J3rbPPzOpc}ALZbV zHcfoVPnUf))w{(hyFT>gHy+ChDvC!PVsU&aZ|yx#uxjm8-H8at$!dQK`kvQS-pd=z z@du#eU-20nL2Odi^F4Mgw2?N+{@wyZ*|KsGG=PF}@!5En6pvSZ1q>uDUl_~@N~BHR zq7R?0o`uWWkJXRR{h8u@K(iEV{!x9KD!rocbZ*6zs&UkciYlngPq4k%w+UIfCr|iS zOn*sHu3+~m^1mRwzOu8boq|&PU49!HCPEaL*>EMCqg|tYC|I{vNu8PDn790(aMTcm7=9P})- z_A9tpfgek8Ot49`aP(2*guatm*F7yz6zNCS*DGUF-uMG-H)CZt_#tb~F4?i|k(%+r zkWo15D44l;#{39FB%2hE=6?p7SFEq*7tSlGvrk=+Z(akC*9{Cn+LRVhJz#quJbOB* zNd8tSd!kxP(Xz=>D$P@v0XuK-H5r4{DQ6#|jDyzUiI3eK&y>USIk*+bYdK1B@Rxy# z);13pSKXb%h+XSzLhQ=n!SOqzzAJ0=QIANT&N&#kXfI<`$2)|Xk)M4_(4U|XgN3(H zW}`~=w4^h4f)J-Ia-eD;imnzc`&(x?WyNij19NoS@!X$_|4hLN`2uw71t{RJbo8ek zBv7$dM?;}%a{l?Dh|X8$j&|z89YdT*etsP>g}A*``WWiNz!8BFP;oHu1RNh#KpGL| zHFyE;fBWW1`6-w^zArq_!8xdHLq6+?YNS2LiJ{sBK;hQF-_8NWmPq2pYJ3WUSCzyS zX(-a@FwSo*N`}>D4MwX{!@RsqGlZO7Rhsq6jI*SfGdjDHvERi4djwoN^-|0BcUm@} zjz@On1F&J^q5K7)(4H>CxJiWKUq{dn490e@v<$hsc=N9sE_!H@!=vf5A@92cwtQ<^ zX>08hI3TqMHpO6p9KN8J5~0S!vq;k*+6A&tnDP#=oVLm#P>V*HnV~Mxx$oic)mt`% zAB@z@CKwdd17&rA14Y@09L%q+GoQM4ly?eQMeD7YbQ1LYR}SW8hfkuJM|(!M3W+K{ zS~cwz?ZzIevKy;Ooy-8Jp{K4EMK@A-0zHE~@sj7Jsl!)*@TwbRkt^=vxbS~@Q){YZ z8l;iW_!!mAhCdC+CpQSrP(mo{0?*E#`!PqcJ@(;b6ZKIGP4=3}2Suw2kTkgC_enal zcbMm2dpj`;ZDG&IA29uQ*Q!5DlAfnBrgN|e(GUtNs=PTRX-2)KM~Bp7IeIbtsPO>* zshC9STQR$lExQGzg+D%l)}R;io;ku#eCh$oUL!$z+km(psTgWCH70J-l&)F5E_{2m z+P`%NG$s?gYfc2)C$Q&~y}zYRrtOn`{*Uwh^UKffG3&x{*>;`I4l;uM%}4zL?tC^tNW zqwZBp^_T5cua?(NaW!OQO4lC5-<7eaCP=&}8}4 zNW66M%89e#P^G@t`uc~;N$0)#({VctWj!Lc#{qN3|r^N$9E#yV>cH6^q!OrFQ*ubyh+2-)R zj&q7#+tlbkjGL@l#`D+GdkW*CaceELw&%66(FmMUuvtj=(A% zEndbFxO65be6h8ANPN`kwA=I}vQjBZ-w>v(|LT?&+03t2^D;T|ZPA7^{8ZfgC2B!XzFBTEeFFEbII=U|N?YMM%z4aUv*6Mii9l zE;p*zOJ3#~n12EkENS~unFzBgzPMTt9VhHjXUq>t`wtD)MD(R28V-Nc&(mM4PMW^R z68yun@TXcik>RtC-wr`&T*;xZ+M;D`xX&qs)~hO87~3N z_Z+hNRx3TvNb=8y$sDF;49ib&!KW7f{qT3lTXJ##3K%}v3bw1@4LSjGvQ85Fs8&7+ z9psA3g0}R2DH9-|=fh>mu!BQ`t(+|0Ka$e5{GL;K-uT>9}!%4qjNZ zSTZ#WS2y(_gSwh5QDXpxim-4JyL&+UGqWNlU#;DOS*Cfk_rJKais!A%XGFSPtZXZb z6$blQmr4w0@Rdkq;LvbJCNb*jS%mO~*H9kz?;8*&Efp>&+E3%ysw1O5QYSWqhJsS>2{x%#*gNBMbF|Z;k(LGVyTL z{)6Ej@Qbit0FPBc!mf^~p7tI;i>=`)|6jiAM=^rTFzsgzX{Xp(d-5`_lhc%R>68Q~ z9H^7sz#IdjV&fBYYKZVbiJaQ+)<1nujH^dl9baS)AGfwe$$Blx3v+E2B3b z=jY5@UEm_=7{uI~AL%jOVPohy(}e{I*N&*{Og~G5u9?D3m%n-=#AD%2&e_yYaWfreP-U95X&g z$f0I-(I=8>zAl|3t!V=VvT)0c+>#)#YD`jNQtjdezO?c&9?!l(D0RIl2c4fvTW}d1 zZ_^?Jtk3CWi`*pa%ytmmM&&;CFs+*Qq3<`k9w83r`n5z+-0Qm0ZIVkDT)ahcH;K}R zbLZUDz_!BB33Sd9@f;5yz#R6sS>M=dBk8>Z|6MYd@kW8)V~k&cZ4<5q`5A<} zlmP*<``w&}mCL7>EDO6{D2tmC)_ocA^sfM97lM532gOu{c90?!R577%$8#!J< zQxexAqf+^9t2Dz{CcHE+H33f=Z@=d-z($2S9_Ewbc1^_kR}}Pm#R8Lj2e~C{>YwK} z20|0!Q2B%8cwjKJmc5H;{eA;q2Na!sERaBmesa&^)re0Ly&L7}hvGSZae8TsLR=lV zR{mEt#X+cvAOb<1cJ(uMD2*qQo~xXlbY$?H4KwLH5_?WZNv_mic?#NaqE_ zH4;f3A5LGs4aZ;Xp7@%$=|pIJ7#`3tFT|JhT{=WAS7+4fLDDKw3vSU;<5~B zqSH?s*M?B0e@=^_tNpj2mN;cVws^-yjS4vJkvN<0DkoM!T-21EG=ec1-rKE$K}BRkU6;Brfd*DyMI{u&M)KQ8G}hWvSaw#~(1lEs&I38Aor<2r>cY zla1t)mFkU44(wP7p&8DU3=b;cb?^P9rZM~7lrz9BZLZ-Y-7zV1gMfz9$X;SWnb8$Ncr8!YDZ6wnNm;fi zrv9A*24st=YIjgk=S32-aDQE@%PQ>U^6bYvcXu zZgchDR664%7A88pLJ$>@C$vy9dFP{b16cKq067p=C$&tXNdMmid+Yk23BMWEH_jv) zC*XS(H?gUJea8~h2xBM~3~v_+`d#pkWZ6(4|1L>@3aM#IfB9dBP`&MRivEAwJi>l} z;^~Ai9>q)@l(I%|1}Qsg@Jmx2#=8iuT*Qxk{f=_HyVvzczc^^W2<(Jo2yKD| zd6RwZ{oK=pm{qVC6PhhMi>4@aa1tFO^@=I*M$P6%TRPy!$DsCDotyji6!V={hGvBN zFfgN{#h`xub%s@^+E-rRg}y>G{E>I^1xR!4kMQ(<>pEdE!DH5uKQz2|sob{w7vtaZ zDP%3a{PA8|s|%+e&|t8w6|G*HBJQIEJ*2>scDvP4@hxKs>R72g2pczSBzU(7`sTZV z6fj>g@CqW}DQ5OnF-k#T-1 zBI4mV1#MrPC6Oprw(!~E5Xu4S)*L~|Aa5T!inq#UbWU;B2<1J4`feMhQ)>MMa#Aw; zx5D69nY-tvgFrj%@P*f%;4CTVG9RN#%R&L@b7Cd1M&c! zd0(1T9ZIfi+kEH|3yCk*iX*%A>z4`Yxaa^Wet$pW#l7WLBPU**H>U| zD1&of58r5xKs6@O!}QgZLFd|$FKQ-ymzbWhKJ8ibEjshh?Ko@}=k7&nbOyZD zLGQDG_;Jd*u&|0j4cmN~cI`CZ;-gsbnNeO=TNoyrz&Lp3DRwn(+=2&>`-NsWDG=7< zzY)I}&>zvrUK%og_LL9=)f2Vo&sIiY!>!^#mzqB<4UgN&2j(RPD~0(tA3rdTD8Yow zfXz}Eui1qTO_jBLLxv~5j7bZuzZt8M5>}b@ZOcGhkSbEY+(w1oPlSm@gbn9jY$~_k z!k@J`Vw{BMbfzX)Pj2#i}72&W_r!F0kR0bI>E;EJb>NP{YP$xth#qB3!pVmA>a)B0m1Gc-b#T6 zA@3l;FtLUXiSe}$LbNFJRk=VBp$u(qPFTfiS%9vNo(iMvlfyPU4|3!m#59r7akCFP3MX zxo(I@UWunok8!p-(G@@Fw5FONp+knbYS02eXa3&HtNytp$9j)knsqEU|O9xc24Ub69NMFwgNMp?=79 zEd&yL2o$r`-p4*l$beF2h}(#iA8IujMny|SfmmtI<)$T>nGLQ?$iGaQGCv`lD5f@x zY`ym}?slBJS6Q^gvT;hTkYM)XIAkr8k5#)GR%r*hGT}^$;t{lqV<{HJ;1%Pi z`7Y$Tf0b+DQjCR3&!~{&??{&sxx&i;eV38Fabyoxl8H+EK)MaIc1am5&)@SojTx=9 zBJUdj#hEs9MblH_BBw|>q4d!YTM`NTcIq|LyLpVD$k!F#;>Z^Rj;&}B8i{v0L|KTL z7%m)N&h?ldeR#Z^-+P;m3!Y-1OwF00j@ehQ`gtYZ`0K`U_wkG(Iq$V-+%h=qgww2AXONnOicD*nKbvL|S1`o#7Xf z!LT9Zj<(5OaCDKG6`{ccIcjZ#Mi#o~8QHbHGx&>&X#GC_zYvx5CExGn+EqE2uF9#j zdZlM?%AM7Iv^*u&o30YO>(9du&6h`DLATeb8BihF zEDJb^jxea&*^Df=PiTJ3&Eo-hg0S9(P`8tfTV=lBbht1MzpsD3csa*O%_ZMxeM&8A zTP(N$l9um#a#2`dLB|(_m1FFAlaU2*#5pgegnGi%$k2Kgv+;{`empM!;9ZBEUKw1f zAf6su4Mv7duR5lRDKaNl@p_3V+z?&h&9q}`G@-*dNS3|h<$%S`IX^7HX)h2*tOY-` zEt?G@@tc@B*|ppG(wTA=pr|ZBP_sDPo!~oau5R(0)9+A1NDZSFR3sh*HOSxI}zjbzUT2VJ}|iygwk047;jwcBfibdPRcb<9=)h0cG!*T`d1@ zb7q6MMb&skugt8vFfD^HAC&Mt4+hSuGu&|$@1Uj`j}!1AQDeSweIy%gN} zW5wRkqeeTBiK;r9v+X1HDE!^|+EI~KE#;2sBo`FEOLWkAQcNk`R~cv%ZE!;lGemKD z*$TGSlwdQMxHhUtmt-CV^7>CaCes8xx-UHN=?_L$I)@>?$o)xqYvqjYoRRT+W-nM7 zIpnhFQ@#ctvPU^r%UL8pz93z_+T3Ff3A>e_mdoqqN75B29N&^Bz?$Z z^&z!~Hk&P13<`xFh9Kyt#cR0vQ0!btqQlnm0c{<{Y%}b8f4JPW^$ceI>upupG789A zVttY>)Q(5e46SDcA}Zp`DHqE!XTuy(h4p*Ofl(8+4|u0CT=iVf49-T~4vjzX3aFK0 z73PuAs0i1Oqgm$m1e{O#EcM=tvm^wmnpE%-u%lZ$An=2N%K?qfNu8&-3Mm8%juQRZ zG?IMuyx-CU`^VFqst+^JVGhhxVx{AYeV-B`~<s`daKBI-F#2f=ai1>TDFWoZ#AU9 zj{rk>d-;{;$z500V3;Ody;UcoA0S&Q9^>~V?SwFqN(A98k)pRQjdcs*tM1w_HQx|H zMw(K5L7g93cQsPy(XGEcKLW(T^LL`k_X01d+eBQ2blC4*buq*+R}>@#q=CFWhaXHk zYX!>422|6Z{82BumjGj{`FTir`;bRs2I(Sx3uu%xku}(xIo(j5y?L7QVN)jzC-l70 zLp9AX9uWz1P{D;;PULYj3Wbs!IS%R-u2i!a2mr1k{C~gMP^+=5{r!tf?pGh!49k(> zZJ_`k@fnlCOn(=+UNjWeN67;-dTz!mNe?+WnbFgMCagCm6)=Hm8C!(m-%mdGXhf6A2dW*Q;mTa# zn|{2BfD@$;%isCIHW?$76kjfQ$!te2k>`dnu z(nyiWLm``haG(_-pdgV(WqGo|Ew-AMj@U>0)FL(48cLj>xEjPO6XdgS#LR`7aZKf+ zM$~hfEP|GWm43s2y?81E!eAU|=I*$8SU~fqxcOxHi1k;gT}lu_9Qc`eUEUkZyx>^d z7jp%SIsnITADeX{8yreL4IWb%Q$MCiiSE;@Xa*>Sbf<3h;XDqe#>HQzffQdNp{(^jYE|XCY$L5;wfYZ z^gTJqnNilAjD()0+Hdx3g1@Qb%PD+zf}~baNVaBY_~!KKl20a%-gw5SIv(B;9}T8y zru*2Y1yGE&FHs5#Q{QO~c3OdEirJLEW5Nxjv{cssR4CZ){k4~TPA%1obb_~`nO;~+ zo3#W6D0GW@e!;|;4+7_F2Wd$c5rI63>qOvkgEiXn*FKJZTBgMstTFFdn#hF9T;GQC zCk7@X-;=`T+dgg!$Erw@)y>S?LVCEemXg3h$MhzL`cq zFlhawbmha}0=YJ0u=KiXYf_TRunll>3xiy^>^ilUcuGzq4SSq~mLz@`3fP8?EU(5` zQ41EqqDMT&U#KF8Ub0m3hK9s_fc^ltYyvz=h_)v)d-5D?#WuHq+XT|X@F=xKulD8U z9;kUXpyjtcgK_>w;wSLx^5iHSywiIy|71=;6if;I(8 zoO+_^sO}eA9Qb`F4YcNDZ$_RS*wu*v>)M)hLzX2|*_I+adWg9`i5TrSoVt4h`fkEt zShog_*zA=fGo4j!Vbg7kf&XodK0~3SFZ?TGO3=Cs9NF{E^Y4VDcd^L5&*Cd!(>8fB z_2J`&97~fVpY@E{X%|u5QVv4-Xp&D|r7l}L5=*?f%)=93!#SY#pb+m{+B-KL7^P&r z7;5#flrR?f%8|KajOkp<6>Rwj0#qA|M63dvQS~7xD8Sn{7cT(;uVqH+M&}AMHVgN_aWi5~#fa51c&ypr`|{ ztXhQMhe1sE{ z&NwGbO|+G4hRQipWC4uo<`S3I=}n5$tkTfr+Y4-|?XC@hLWT|`8#eBE@-}dp)K4}LvIY^bYYU9lz_VMLW=ffV}s^>gy!Oc45wU0Rsc-dvb17noF(g$pEdh zO5{seyZMDT(Bgj|_OTgNj4oZaHO1TpOEE$JDf0Q&O(2zcvHSyTC;dND*54_HmmPUd zGsJY;%i5gk<(@eSP3`u4)@+Iw#=YXmo}5S8vb@|O8QfZB`0kbC}Z!_ss`P( zA*sVmq<@#*Xz0#8*JVwEzi0)prCz~N#oFMCt9mg3}`6jc8(ze}@2=P`Dt>{sLHY46_#dYnR7IBBx+2p1lj z{vF)ZdrE^aO&0Ch%ij69&okY2@OX++rD)9zvP;LLW5HsLm+C+zjNx!oUTCFYPtb@L znv}UP3+-XMHP7c}W`5xZ!1G-ABU@_=x+xw;v4=)c8E??c*#6aLnQen`I4=LmsDECX z4DvHY^AH#zzpbuIl>W}B)m6j3*fmsUc?lSe%TzF8+p!ww4yntiuj3b9OmrEO(vBL@ zbThMNIc?ZomrKn$t8utkWOEz>Y>=?>nQdw7b${ALCm8pl2Oo_T4v9E4gxtWh_v+R( zak*mU_YYm6rw z)z-R3aT_;`_*<;JF8m21ONw7hr_Rhaa0hMY#m&O6L%Jg;)o(w^JH<0R)SL6XD18lE zpl;)US2#TF3EA%P`EdQ{8_0_oGP{b4${AcY`-Y%~wqX1ihe7tMlSHZhO1L32-!+Q9 zJ-rJgUI?>zG#az=$JcRYh8@!X6wRxZs&U@>&B8Nx#uUq7%1sr|3)VmuF`6BY$Nk6D zLsO!0o_(cZGwjcXC>u>CiCC<>^O_S?j%_W%nlfH(NK4$@B%e|KKoGDt^#~E;T{=3w zHKil6j$Wq%a|5a1)?h&+#e#Lvg>PT!dK?92-oL<|t*q~Dwx48mhc;}RWl~Fx zdlDl0<%q`@I3VgRyz1y^$C%b;0E3=KP!6FU*FI`s02!onMrN+O`+OB&!W8njQMjrX z?Gt0-Aw$E5Fq?OkF7)9Z8akgguCXvP7(i+}C=B86Zkn z-=@%Fm}W!#UzOH;<=h=(;-gU@dXiQ$i1UKz&&1QF_7m0n8 zmaI4h?A^xZTfTiU=jamXH?Y(S;OpE_zF_&vJ(+nxL3!-;Tih%~bvrUd8x8#(S$TqFo?kc)?SuXC z*l=mueU>uyAvn*gh8T0I#Oc-tqAD9F+WR-6?@2|BEdBg>pi`=m6p+LI<=Wa97W2)b zwLKILUE7n_stegO2ZTwrAD`Q&!a*i~5h1zU2x{va`q5nT44(3rNv;G=FWG}!&UxD{ zx>8gvwMY6Ije%D7RfrY>?*VmY=VK>dU~UoO;~5_-GiIU0ACoJMb z$jR|{ae=1A7i z=Ba%4MlowcGUOwG4MKIquh2Sd!UC@H&nZ*>i$G}jc?G$gnhZCwI8Tyl&0fl~KwYy& z#+D^y;4}>{L+t@BP#YLa+li47e|`gSiUJ9Cziy}n-PE~w%3_8o>?`b}@qt+f09FVJ z))5SlzF*(>HSE!bEIT7MT3c9LVwUUg`2wZ)z`>JZ{b$oG(4alqCP+B%){l8E#}3+! z00)&sC%5PfuqS901}p;$RL}Q%y^8Q^FYDRj!#dKFyQGM_^Snt!@c2jT(h6~jr_eyT zO^aQ}#!7&*%$C3pe2AE@ipz%wNuWc#tz3yUZ9#yu4q5_gl~_=bKK}s{vtJWG*PYx6 z&PrYo@dYjk*o;v5;wvDhhB=`1Lie`WkEnovHdX8H{kP#B6sU|O{ zH-T#uID=S1=r&FaIobvEpBT00A@mj%lw9g*uDg;tVgoqVv|@>4#8NngVz~2Qs5&3@ z)NRX!z?4bM5)oL8sXO98Nv6t}R*Oo*F0qf{2u$M4Uy?$eNcrih%sObh;~`;>f%yKx zrP^}1#V3132Jx{l=8UhjsK#pN2I;(OxlzDn<&P1Nf9B2T5S#$U$z&I@q3qPI(`CSE z)}PbMd_+fSZWEaa4`fpyc35|R6(FSrug+eNJ<81lAD}J+l@|Jdt;ZIrewsIoTD5W2 z^XoO81q=Fr!leXTx=r~Y=?)k)H}mH)ZELA*U{k2trx1vcwylOTIg7O?Jjl#n#JyD9Bx9Tb}c|fXk8X#0BAne&G>iF#QTn$gO7Tm6HG8ktHG3sJvuYL?#sOGWj7!PS8l;-)NU4p=(VRZuWY0J2);RC zb2@(5nzTS&u>QI{Cw#oQuTR8lH)@p(cmVDU_C~C;q|%)!D4sMm{Yrzszml8wh2Y@R zG^3luCtRx*VGC1>PZgHSqzk-Wuzf@PSJAaQD)V-S+Nk7{>c7|xV5Op*4u>$ zcWr1p&n7xvv|=}1J;n^IwXvgaTLi?3cC+8(&UawUBe5LY9As7h@xEJ>Re$y>n6h+ajs95RJhlJ4E9I->IlpSuEX)x;ksHDs> zngZh@@ZX2n*aix7nGm;ut#(Tpnzr-ragBXR$9#+TIA{*VrX;Z-UvXNXEWwyp`kDQ#dKa1OlhxL-xXPF!@VmXh`~>SN%;rJ7uXi77`}l47w^9vJY) ztLE(s?0>epj8*`VfQ!(coV^t@Ozexue`;CA^JgZ7oHW9R_ zp~uIQ>@zN)4&(ItB=!GdL1I~th2z~^=Taw=99cnWvs`tN^lxyM!-pXoG*@YB?8MjH z_wxDkMGA?lh^;yCGoxrt))W{0beoT!V+IkKq$q`ig z@hn(dPFtavVkREH(&0e37jy(=zkMwUV3f32P%Y>s6^j5M8hztDHJK6HnmVgNTP`_(%iUF=@Fgx#5|SH% zvnLU>T5a&2y%luY1{Y+nlfPMe5Jl{IZx?cQFFwM1A`;L|be4!|pLf7Lzb*+%FRiZ#s2ayd)j?=BKq~?jv@dQr@pi2t< zI7xso&Sy_#rAbi4Xp#WK7Bx_Hy}8hy0@iwjQR&KHNMJTg@z-# zRqe|)B1pIUR^DtL_?-qJ=1vruk_&r-Q*+2E@#bVj6%h-N7X(M$BrW+;^cCwZit681x=?uM>S>YpC5lex==>%F&I~92=ig zmDN@gZ@Bpr1{QQ*W-?Y2!al|onm;mg0N*;Sbw^mEX?AwV{Rq92E5d&&&6K&Z$esw zfa#v+Ibn#fuA8eJNrL03@wr^v(FyeS7mjE>$vaN}MfD-X4NsBRaw>{Zu$;F}nR^Am zv7D3F7wB?uvU}%mr>^>HWaxr)_ASf37^x6h9P1DIai~sp+P2r>>`^oWPfU%3UCXwY z4`RsS_nvN}(Kc4yYE*s~3DwJ6%ibjj^z$e=Pk{tK)rZa`NnS2QyMPlrn4`Ss<}lvL z*CcsETBcu^yB|y>FIIAm;O->eAx@UU-8XjJ=(<;M(?8jb{PK=htN0Hk6AU5m34iTz zZ7X%%1$_Lu9S9g$)ruGOYww_Lpu}{VCE$F<9Nc3+Z1;%#B)i{vSGdYp;k!ia zcwMyOLlf=Ew!!(epb=$>5@?gcJgB#DskNvRL`JhfPyv2ppiK;!G%v;pY=3@gM5DK< zo9V-t)L?OaSA*%iqsY+P7Xh{8Ws+K7-7Pi1I9Qe6qYme%veJ8`CA7xX8Yx39kh;R` zH#wF!9h`LFY-{WpC?XSDhp1N1)~r#E!RP4v8s@hY*!DwW)G8=XW_=HgQYGU9NngC7 z&qelKxd*UO1(=aT^-nWbZ3g!EzU|Qmmm5LplU%XC;Xkzx)^rQIZggbBbPoEJbLvXV zN-sJDtREht6+YJY+j(c+)Gvbs9GXwc2@LzG8!XhKtBs|JpuEYl`Mp8Vdq#_;OaAg@5T9Cd3((un^1I&D9=aCUFjZam zqj7t5?mv*sW9;4{`@7(8Z=ga<_xLna>y$wzmUylJq5JP1#bRfv#UA4G$?%7iTGO%$ z6Qzuoh{H_sM`4h-AtvRn)aEpNh=`m43swCy=XH{z6=M-Sa-+qKQKoWNVdlz{W)gI< z8mF**UDr7n2O_cqD=DemQxsI`TgZ&e&xm$R79MH0B&>F$eM6;;pV}9yC3p7P z%n2A-h5KE#@OLBby6qd{SO+bf!V*=Kk)uu#pF?8nt9kKC2%v>X!sY z)*ZwPl59cvsD&1<^#jr)RvSB8^+51haU?ComFQc({YJ>kNc?ZfGFOp*0bS0}$b#9C zqZh=4VJ;{*?lA?M3or9Hfftq@zH?}$?`vVgss!6CqVk%3h&rE$=-h1i2JnZN+w(Zs zD>&$K3YDoC-V#Zbgio3G{~jb2m=Plyw%`85#JLgz5b%&M!p>~cl9PKs3L|xWkyBAN z)i0cG#qF|N9IW9F@5&|zWaaLtuMMZQZ0g?!KxLYkp6X*gK!_f|Z=pme#B5AndW zD%Nf#Oi8V)z6@Ponal--jh~&$hwEuoj7d~hLGM&G=aM{_Dt0qckeOmDB|=oiEWAD_ zyJ56xs;KE^;?6%l872NX?@0SVf7?xu1rM2kJ_!HT-Xt

KpY_gIjuk+}PvYTDaaQ?sEBb?MqpT zZW34F*v-**l2f-;dP6B5o3RB1gsyrM)}_47T0)y_-;;sWicQ+Mjj6r}eB$HJB8cx! zO>wdMCOMRkS?1F{IST8`&Cz8M*{_PFO;lN$XFyLue-D(k2ZfR?C_qAt14XlIIRdS` zuS&JF%AlvgP~L0e!xevmfZcVXRNq~r0&BsjCVt2+;@&MjXQMW7?fLZu0VyB7vIery zV6v-Z#4;J;#ko&NLc(#=RB>EMpXt4lqmQOt2M#h^6Z-}pVy6Q8(Pgp*iU}_YN}m+~ z-X3pc*5PD!_5+z+lMNVNJMiWg4WP)^Z_Gto2s!O2x|s#M~j=w5zG8?Ey!X_E5h>09BE zrbH8L+Wg;nq{vGgCZ{4qh4{t!u4wu%n?yH(jb&9yED;+lM*vf)FXXUV<@3PS4M(JE z@(jFRI#YL5(5$4VcLjTxMKoDQ2M;wh6yy-GX-9f^pB`V_)Z*%x4;!OIM;n#&$BI7u zf&o_L^8>*Ef!Y{HH?!6DSh2?Mv6Zn#y2ql;>Yt(J94x_ujj$$I#mg1b2b`-MYoBy) z@vK>^9?(dmHabQ3wC7>iQxA&ct8#AcH!NybWwpy6FC${7I*5bq3Y-yvewnqxf5e3a z5*Guz9*UF@F@nU`1`x)PqJ%bwcjqFrfi(_0Ar+ii`+W0vtFGvYdr4Dx$33~03{u6X z+qIRV{RSnf(2x35th&D8=$M1&x21%L$=6g}S3V&9Z(57ex48ot2~cFFP55VMrNkjIp)#4Qxw> zYi1|WTGSgVUnv4H!tExjMnS~Zy1fCjYEIiu&oorE1SNo{@-_rM^YrgJq9@kK(-zxT z7kt$PO8UzTK|&L2(X@wj1{d;eQpfw>vttVP8ieyY)jI>pZ-UWYaF#_`wd||VoCIaJaIv|hD?g&Y|L54STJTaWJr+8#ZHZX| zBvY`DQzxa`mxO&O=@2;=**Z*u3fheKlYNt0&8-9LN#iOJ*~NrV9YdnKyHN>6QT*a& z=T9;aeI8I(gHtwarJ7q(kY)Sye|GTgC#LUm6=jY7Nxf?D~B8Dp};Y zS=nd~pn`ovS(e*S(XNpkpJaM7PZg;Z%q%R5! zy`7>Y&p+x(p$&m+13N!3AV+0oCQrW$LQ>`o)Z%BQPZL8xbjd_8K683x zQQ$-<0R=mlB12ZY9Xkqytt!nR9Q(xm`i1cSQqRWXDJ{1zK{BLnM_!g(zi*=}OKRD3 z8A=$~n7%02r(iEzv?~-9fXh={frjWkNaglLg#`Mbr*$N z!_KY-_&X1Th*^gvU!l9waPlVR&26|>@MNLXk?(9#{|SEX?HhiVPS!kg{R&*ct7M)U zpuHv{!qVC^&BwBV`D5giw)Oif_yaB+!763}TpaL_VP_APM_x+21Jyn35iC6jqoPw7+Wd-xOo=~CtZ)P zt^j{H@-AH-Ur~S8Js05{)0x*a;{(s%NvuE+rC9$uy6F2_fRy<)P>ixw_dv+ni5*#V z+)T@d?hSgystJ?gbxjb2WGws^og8T}en4xG3RLxhz0_ZG{Fv-sq)@|5n}3m=+1g?I>WnUSitHiW}%vpU#<&G*6tf{`$;R!Py+-yv-lNeCos#Ngx!O4^^! z8JQD{$m6LKPOUr$u2P&rEF+QT=EwWCI_fDcsXvM@*=Fsc6WTO##!jtaQ;m#fHj z5N9_sV8_(7W0@a+A9a}NkMTa(`U%;uLZiCpemSS2?*-g;3lhyZ!!~QK&?^i0zhJn~ z!~_Xh!3!Q)+SYC8lU`%_sajV_YCd&OAZM!+GRri9%`E9fE<(xWh@@Vr z#^^Z(8d&-}aZpeOvjQMyB3dru+|C$GUF^0w^q+(*JqUnl(0bdSinFhHBCmh>(*kNu z<+KcmU#MT9uFgyU?On7)E6%OpXys=Q$=-nDvKwo5UBU<(fE|Ub~~l%c}?`clbLh zo&#ylR`MGNt9ezh{ZY_Z8nNpBuV=DhpK8+bIs#E;F~E0PPRmYe9R^-Vkw0PF>`=SJ z*a2j3^UbL7AfYX~HEJ!w4glGc36q$YMn!3ckFwSD$5d47V=N9*NS=qP#B`w^#wxJM zoRL^J)pSt77FvZj-W}x22C<3=+fKO#dWfS3fa=|zcAooWe%oA-UuZk-z#Wbs-ovYSmrprm$grZuW?-wR=uodj zY@4_1-Us)7Irwg(J zEuI^T;wQGaeR!wLV3xC=)j^@&I(M1VlylNuu^6RyZEwfFyx{_?t!ke}0TP9Vn|I#VWCd?ST z<3V?AKJTm^+pY~qe)Iq(Nd5Px4O5Q#Z58%g6Y*A3V~@m7v7lxYb+K$`UTD{{%P=E=L_5c z*mTKI+V`ReMlyj)bva?qA?VkrZ7Y@Om#qR&ym-^L4r`l&SgD>;7&itGf~iCS5w?XT z&Ew&|9nIe4V6pIdv;mek?)nw?C-fBhu38$WNUO|y_$QublBhKHk#G+dm5aDV3T5l| z_!?_)HRvyer;&P5_^Ctvu+2#G5%)c@(vs%Z2-=#zT(hUUlhUZku|c#&>B+sE$zIePR)F0b zcrseX$@+%YU)RQ=32!NU6R=$q>bDqHE(w7_7N^C+y%>zqz+{<`7S26UIcin@!tK3p zv<;gR6MDJR9!=#%Yajggmm-keBbo=oQKX)bNSvd;xv<0#Du6THjo`wGuj@b*dwd5! zfQmdCPX`d>HD1-Pc{drAYUv%SVL26T^;tLu@NH#Ec{jZZ@N&TbTc?50&G+iAA_iHd zT$G;H+L;5=fxY+rKMK7N7?hrdE-?KtyUP#N7;I-AXtxNC02u9}k-3BF+*HvCdKbGv zCzSqo+2>fTQ|Gx04bcpPtwZFgl$n=`Y?V!M)M+0yg+BCl>*fPl?grhoV=v6&=}f9k zJCf;2i#FST` zWTOGOy|2Jqk%$frt14EfZ{V>A|D{?VhX4kId#MEb=NHiGd&x*X3EoWPWoX+kqzn~i zlo?S|FKouf0!q$G{033%L-Hq{;sV^xBrRz#TS0^_r+^`Zif{6b6qnQ+6AmX@knP|J z4mImjDhYkrz*lA3qY(p!YIdD44uiIy{0uR|w<-n?xB7F^*6gI_K;|OebPp6&GzWay zzdR$V8IJML8YWZd>e`AxESVfJ3(lpqO`Mv7;y~ppzwrS*9x^5kZo*#U{l$wBGj3bc zuxnHo+;B!)7f|~1`sES&3l@5SO@=s53z#{JC!V4FA^)^1qK%`_vQ)Rip!>Oh!-U^d zR$+`rxxbMZB*KE!v=@o>4|&<1Hs&eSjDZ1BCI_2@w$G3A4t4R0!C>hMIJ&1?RM@vX zUvs850*d9)n3sn&flYwSD-rL&bZ{s4A!o;fZ%PP3G$+yY+(@p%{nZ(UV1eVQOyP7#V8ez^k? zRO9par+Rpe@g0#OY&g67qyQ2XZ2_< zWYQ)fOBy36S0$b{c^3bUVhd0J^hk}zI)4ZJg|U0Idcdwbv>skOdrs6rb-}EZm@`8U zdMO*Y;xD&ApZoLU(Nd`9po89>!FeQO_y9O_NplYUGWUs~F`na)8X24ux)bU3M6t;+ z`nzu&lHbC8#b+$!&0XkLYr7nHukUZ=K)DFZ)sTWzYkk7FfHB=*c17{|Vgyw)c=viS z(&#j*8KDrG^g%5Gr>8LL;E?|~y#6#N9>z0$b=Zl zLuNT}wXByScnj}DBd}r-6^+j!l;eg($oXRJL&`hJf=YjO#(hjwJl5VMlTTqLD>>9@n-|oCH9JuDzKzmVY6uHTw3JSab-5q!?1ZaTVC?wX8AD~D@$1vl0wjku-3p!)rEro=MGQ$}>43B}=@QyI%%#Gf@}T`-VT^aqp8c?FF0+66#Em-@Cq&zV@u~V8_Vn^0(~`~dY62cnSg(wtT*>~=_J(z+Sh`U{ ziD^>}0e;s)YJHr!b(n@0Jdv?>8H(vFL+W4XK-H7{Q4HUZ1^rm7yL?9IF=aFdW}MS! zl280MuFZ&`jWg9)kGsqqzIivH>!QAC?|O(uJvT-eJr%Z1FbmoOs3nUC`MQN~H=9G< zUtrvbuOae12jotLh%sCwZ{GscP>_7=!8;;c18pT}s3OWs{H{n~V}cEKp!lwFmMcig z3!dO*OVCzAwPGLFNCLUY0*03ng2b)SW8oKwEZ&l|A z%3&7f4|r;L{(4-rV!K8UJ@iXjx&^PlECI>UL;sAR^Fd2KOu+PC%?KMj`%uCB&y&0b z0MpC+;FUQ&M?$pCx*no4+*m-@~@7S+& zsk>F;rcjT+b8_RQDL$J)02|oOhnv>|m+qt=%zht=_IsU{S{ogj`hxOjmq_(elu1}N z3lA)AxJW!#H^0mUnBz}i7JurxRl~zD^XS%tmrAscub)Pbsbp11Wbn(!EX?S?N%<&= zr=V+hkTr>Sm~FNe@0{>O<;?)$cRi8+fwKD9=T#zs>@VRD|5V3fMksg2tZGy>!2jj_ zPLbVIb`UW5rhiwW{f~CnxE$vqCcKs+xBX2yGw z$2QKWDo-7*d&1&*Dcvhh1nne|#L*wf;Q?MQdoYuGA{IIs^;+;+^~UEJ1cPKy#{f1! z$-j*uGE?H+qtby!h(x%2zOz24)$V9Kx~0OiF_&aS`h_IPsm3%3(Lc&~;1r*7`q5W8 zsGlUA0qZN>t!aegVvD;f5sQEi+TANFwAOhP3i9r5Bg!hOc~I z?kqaUhU@L;dOda=PBsVmGmA665NvO0EAzOySIHDA!C|>i2s+wmp?z}z^`HPu9*N7KR%O} zyQm;RRY_2x7+9CMQH8~MJE*(>4 zhT-Ivo!JcDKDO`Zb3?v)4P>*PL1~iZ-j(Pje#^AF+G3sTX4r>bM94{@)zydmr4h|A zUD{xudsh)%;+;Q1=nzk5ci{xY;UNydf!HTM1SpCQrllPG!YT59Y?eXgtr=e3O%c zXRNN6gi|-%*VMv@yos4CEd!AOSVc977PSS{aq-!A@@2Pm)O0_UqwCy7X~T_#m;pE} zUAmPvkz7|1%2dt#iB>_0YIsJd7BUUi<>XV%NLxU~X{7*IHRb+3B<%IwIw2)&S|V^Z z{xv04EAxb=S-6T^{9}(eqnj)>SHlDMy66nQ1|y!nGQO>|x*+u<=<&5(yTCK$-dIA$ z|2sQ-k%)W`EY#@6h_{?kiUw^Lbex({wc)tIaC4Wy>@` zh@S8q>hb8{3QNqvfFLn_*gt;dd`Q<`U=qe!`8C&j24R6>tYh1M8`&V7%mnC)JG2w5 zI#_-zk2jm@{kzHEDPtgJ?d2-Hd8>UfT49?Z$UxNCU3e!OHN7hR?g1)vBCu`LG zl@G_Z+OG6#_;pGw&GdvyX7pl^;gAV{HK+^bd1u}!njcP9n6+_Ipct&MgbbUZib1>n z)0+Bz_EgXOaNj_6szQiieePFUhFWFhXy9r{MJ4xq1T^XfLK_98gAo>x9z9c=CS7Ty z=z>^-RCD#2zjzIKZNVGsNz4kPTNc`cPU|M6g=^8g$$wx0Kq~*$!~alsj4jBFj&0fr z%?ZO6^L?W7n;gu>FnPe=3q4>OQJS{NS}Jpf)9=S8A_;x7V32t2V^F4rcHmCy=Y57C zw3ItAUfPxH!!?V69m^jcJpTIdVxhJiMl>PNY%UJkm$E;|n~H=yV}qiBo=x|>u>eKr zp-oqBQ%I9@V7K%D1nhXpdDYFT-EGu{7)NQ#K_)!^ixIl&3H&H_6EiMmfgY1~A#HyW zs$GTGcz19l#4}diG!pKc&EuQ7-$P?#siT%dkiAVyF`3PX_NhdPHF44;9%q;$YNyzn zS)u%;YJ;E^8gd7RTrk6F`m0B;xJ=@;;yWCA*`d2X_~>kusdNF7q)mC$tO~KyTU2O#*`SvN4Mhldr|DmkeWKVZ}Qcb#jr1fKN#p{d=24PmG)*_rue&U`rQ|&T3Z?a|$ zoIvg0Jt>ZGitV;rTG`!o^a*ZAgD4g$C~s&JEILDsZ2?>o#(fR=7(M>$*9mL+qDSfF z7YjfrX|n^<7%JWFj?Z(H^{oG? zLdblb63)*}ntTCG9b_@7!iJA&;+CYfqfb%%M;&6WmV8!*6ebj$Cr){Ni;W@N5w(Nm zw0TfD5u@|GxI6PeC0zdNHJd+7;{%WJb00q~Csd1$LDY^Z_>n!pHH;7>@oTswu$SisrJS44_%I66;(xgxH4i4Q zFXsv{j_W(Dyp2`bCR}!UUvw-6jyP=%C|#(<4bv1?wS46Fhgu>(KerEC6Ckp~?2Ms` zPjJ#e^M);9n2S3kcllpnBAV-7oT?o-yvOcURPz2{TlAjHPl<(d5fn24n=0VPGIvg@ zuu1R1!dtf6r;h417X}zX__$NUmXl1A2Pn4Nx~C*F=@f*F$;3IE2V9c};+2))t`?{_ z@>C?b{hOIx#7&%CvKw+w=tISo{X;4uY?7l80dtitVJWZVCU&ffZ2gcett4;5&c7Rh z1ghv9KR6dI3{0^G{~2TBl-UepN(V_3Y|xs4kufw=QYIkx&8>%Lq-fPqt=yi83l$^7RFdvB-g-;_q6xburM~;|NE% z#vzjm6m*hYkFYifeYLfWp1VDeX{_wIjxm^aEDZ2wMWzWDCtfFuuE5bz`(1RA<}&zw zHkSeO#W>a?UxSM z_pFa$U{S<*?z$y&kjnEq0U#K0SR+5VyP zwHV_UjyTI|;v09Y2dYSWmLisrt&A*y5Y^{lqF9wO#=-w~n~X$C@;aCwP`C!DQwTG@bSk=B=j(wtP1L&Oivlx2H&)S}c=Zms(LaCz z?4{OqG2ctQR+k8+f)T8?;terMr0@LgU8#s=+gDn{p(Fl#YS5W*Y^BMxs-WNu3uLBG zhZLRw87vyjwwLQ+O^`o;+M7r^8m1PCNl?zWm%5R#_vZKIiWXytC|_w?VdoqV(X>Ga zbl?$w@-1m;xRoUndkQz^wV{x~P_GS~KhBdqt`LXtC`?0)BSad&k0*^ZY0g5*Dq`B& z)Xe&QG{*n@ZK-mNCOoswDB&0l6$$WeTX+X!lVM+=vc(?4K_!`z-;46_ ze=??p2!OUUH3o&Zw(yD^NLmYrmd|U-ian6bzddklzgonV{KQRh0LuD&PSyavM7%zF z^s807A=HtN^ZpKrMWt61#*g+uFH~~Jv$nVUCTQZuvnn7tJ$mmjANAp{Bg3w=PUxsD zq!J=q^gSzi15kg+|DRj)m#o6RbbP&W`VZGWy?F_?q(Kc8$jJezl`c|WE@ULbY#X$$ z0@fp_W<(#QzB4k)T-o^EX8g*iA{;n*3~gfhfS+xI@>>3>pbmmYk~Mdej7Ww#Fm9x( z0~&T%Pu(W^7GSWS>GkM zz(1%iR8q~-(}%4flp7!dpAYicGwvgP>)WcnV}mu(Z7$Wz8;p4n5QZa=X3=QolRHn6 zp+AGoX7s#AiWtJD-|a62wUTGCQvj5@|hsw)ixL3=idjIFpGnUZ?P z<4LS8B~RYt;ie$1;th`kO`p2BY1q)eyqS@)Tp4V-sWKy{1svc5B5| zJ^2wrnBg|_FSvS48jHwjq_>{=;6x;Loa@$$m^m`WfQ^-$RP>TT@g+VCuBU_c4gEi1NGJ>Zol%r0UdiJT> z)8}-aX?fGqFM=WXKg#ew_ljPU;c!z*0}+$sW^wCDmzwa?@G@rKRn1VF!d%x=G#ymM z`*6lLD2JCJ2{8@5=5G=+il@=LyyoiUm}t^Eq4EAf5P^|agltThYdMJ^ir9ixI18?nULHv1tjQY>{NPu6!Y}RXp zjcLRxowZBpm)ODuV7wu?ewsny5x)i@-f=EAApHpuaM43n`O;IUX~psjYbVrqaD??N z3V~ONB?gL_FOzi)^}`OO@|H7?Mg#z^G`YlfUU69ZWwz(G>lX}~jK$i+jslocx1&2C zA%*;1TGtvBOaZ=dQh;%DA^NfFk^#qF?IQC)lM7$l+Pt&BKGMu;qa_$@$oYWwpjB^d z(FvVNYKXYfiq^gbM3vj3phA}AiNKiOD9}A=gPx>Q4@-RHDs-d%$voXCq|17tk9+yM zlFs5B-uSC}ftcaL724167msazyR50}KAs6!<9gxli_HmWA8^ys47K@^1K8lNoNU>3 zD!6FEojT!8cCy#XG(v`1UKJ5&w|rlWci04U^$N*rTiS@oa+8tQ^Lm#DRPTYp6pW~m z7Q|?WAbHswK_EQc{c`!|p;1LLn3#O>-3jK@((xI-pY_R+P<3YN@_o<-W==h`yk73+XJr|i|mT$oR%?yPY z2GZT=M2!(yV-BlCi$xFpPm?~jl9XPG^zuQ3%QR0-$KmoE$SdQ5K@csTlG_*rbX3{3 z!6=QIhIZbi3yk&mS&{cR2m6EP7qAd>Ex)jCntB5P4UFIODnNg(kt^0Dd|B9Stge5`93R z;^ZHEsY`aY&3H)Y>e<(i#f_K(d?o)+y*s6|KxsKHN$6}p#F>Fo^&e%2ij{%Et&ynMvhr5x?vt^FR1hp3dY2U7q~xUeXWHhMzf#n zhKQ)5b!y?9PueyktulZq!PL%&k1+#FsRt*1Hb2bUj@Y1$Cb> z9a!Cuc6T6;V!A*gyITlQ+~Jy z(_j5bCz%V)UT8;NDA6dZ@av6R#!5n*em!`^@)JGX>vFZeX+rIZ+OL4>7KGUmR56p+ z1m=_&L=y6}p9>WJJp2uw{Ojpn&k%2$GWcEXE5MM(=51p2I?V&RyX{A!#=Y!H3{yus&`-2* z*6JecjEm`x^#Rj&R7MS|VUGNfRVvx{&0-k}qX|Pc#KD;C^5cyV*q|h3eWrP1(t(7# zF2SP3uE;?NBeFyFiqzj7Sy*)$@sC!CGQE`6YbIr%r8o()FvW;^dr{%Lk0yB8iGNV< zs}?52E;wXjSqoZ4NTZaUkp6F6X|nadZnyH^(c+Dz*U++r70GX(j~*}ewypT6Z4q~r zzg)dmDo*Dtgw3D0JbdiTxILGUd>IN#G0@zW+%cHG5*{?)>0xp#o#lu^zTbN(89ZJ{ z=-+fJrPS6NE4@Fb*hJziPiQMb;MFqz9a)|^$vJ?8e}!PEtx2c;qMRFg5%@w}b#Y$F3Vs_VFWcfY&%-|k z+moB{>3cJ$yvp*0;)t2f7 z+^x6T1wS^c4%iD5aR9*8N#1D-EwCCDFwpi>`&XL`v)1FP-(0=-M(kjTn)@l?f^7N# z`XoTH!P^i3;qDKK&EPSEI%-BAodzA$DUh9O{+QKO|T(6!;!ERA>*U<38b@AaN1{Cj?r|HoQ-&hSRKH^*#M8d2D-3T+TQ#6sa74M}b+3AiON3%W zYPk^$>vKvjo>~8zwJ-4|y(5Br$fM!>4c+qlT3GJN9tL^1lilt#H~?jf7nfoFN^RY; zuA%Dm3c1e;J6ahx>DVK=gGwgtWd1VOn)czUp&E32%=LtK;b$Nwo?j}?8L)Yup*8-g zt7CZ>$M@D;PeoS|d^f#~vmIn%Jib*iwPHIyr<`oog}@oQJm4QPOgE_tVf4{zaBFA% zZqg1#CO647Rv*6RwWd-dZj=cXq{-NC+B=}T6 zLYC$~R!~PE+?V_4>mw7|gW99+pVx>#IH*aUVpO#rW_ly&x*N*!xp<^qDs-^=12|kF zr#J;NahxYGQ^~UtX1FP|^m||A%y)%>4nJzaXe%+G`kS}c&SID~MNJ3~t>4LU zRN6CrB8BO&;D80wfGZJT_-ynB(B95%FmP-qydv4AtB$B*69<}JYF_bdDXKq-xrA7m&q>KdM=NI{(!OJf0+!3I>=oNTi~fJHSwvcmA* zga}VZaekwC4;oHFi8TOvsT;GvrdfCBt8>;{w{#xH6Hp7Ap;qUvk4fu&qL=R7*&_tN zPmwIUdW55mWG9$PNh9Su1}w8>mq`BW42~@6(jU0(u@LE>#KUl|VetUgy3JKeV}aR$ z#>fHQM6ZL;i(<|KnJQ>itTmb`QtuF|IYxjP60vV8HgBf9JQx&GH5 zGxX&-hZ*Mjp%?)$$!Cj_#IMmfal*vHT=(NkX0#G`L>UiHF~83U7$%NmZvDY4h-qHrl^0Tb z)R3jWUS(5G3N3s61}?}Kmd}BVa}TH;*UwSh2wuHYX_fQD2VxboqhWFV_i?MvPmy5}soYqsrz~r~x zDJT$c>38{|80gf8bRM7CQ)_<%mRsI^%v!k9z0=gkP+zRMm0-=j;dnTnubxHvp$uh} znB)OImGr+I7%-k@!Q6Xa-aBO|IAa8U|5-(XVOn8WH>y@1QTONGP!Im-1zx4k+)MHt zX|bA~geIP!-`Vr|w>^5eH}#9OZg zg8oD>%;ar2Q@A*J;`l;wX_Q-=7zc37t3V2N%n(F?RBj!3hL(tFI;)y1W+n|;v1CeDDDq=0q=?_A#0K&pl(A7O%yMCODrf&Q`n{2N#+;)BD&8s z%!n3D-34896Q#w)=#nT#m94d`f{MN&$cBA}$~ug}XEYee zLTH`VI$**YTqTBiSITDIW7v3lexL|fP)ytjUNuPAJqG(!{4lN> zpKXL%dIrr`3+Jxc&30{a@h)pw8^eHo0gTxg&}!P2FRpKMo!OL?9X-$I z7MoZut|{pFCJ|{^(JWsaTWRbzEUD#(2ef8-3gGmV%U{*R%iSzczzhlF1UOF6zwkHJ)t?@k8GJRaRi-NO@ zLVQ_IIr$kYG+oCrsM1ICcF}W*xty3vM)ybRQO0dS&FPS}Di3Gz^%EZE$@ga`PuO)u8wZ>dpfhkcT`->NCv+1JIBO>{}FBy%niBGYM3pOT#Y> z(QupMVW0V8fK2aLv7Z}<0nCQKVT$Sf3H7nc^(CN@=XCly295<7Q_M<>f%O}s+G>ZD zlA2hNkd<^J82EBuFiDnlA$$tKRDnok_B%3>N|ft4+vU01IpGZUMGfL0LizHldF__t5{cjWzj|ILY zKX+)8_^8II&PK=O=V>2&M%D7bQdZ*bEQ@>^9fqnMXu=MZQ$Q0rGIkOYi1V8%o8>>Pj6$ zGL567aR*jyasZ|R@zN&t^1Uy#f_Fu&{ECI zzqOTWyH;wMhowb`rpT^m46q&7jIQTXq}rOi$#VJbp4oAv@~0q3)wsIDTp*s)-# zw;vAi4S^A~r_z6kMoxuBtqYL$@PTT|WHGN*v)vHnq<}1PTafJa1I5rUp|O5`{Zx`( zeczVF=l+faKuIZkrtAg|gNs28-h9pCBPC@y4Y&EPr-GnAz#2#;>Fq`jV`-IN_cnq; z?p#G;n`KcESKfuVNOjlaXiR-xKsf7IwqK`CFC}ADWz^_t(VfAP)~q04nPnHW+HVQm zUf_gn4z0RDqaGnnu> zvSk80@_jqLS-#WQa0$eIYFKs1@siMqeFGY6^64BlHv1$?vT8~4>01#Rq3H1BoHznj zEq}n?X`ZA`aA28q!HNzpaecYH_A%R5()4k&!Dw1cj7b-|{^ivTQN%9#4iM!f`|b&c zX^1G&Gc{7^W)6FX@Jpi)Z3;N@S9%<9Tv{)1_%Rjv)!J$Z-5QMli2Mq0)wjeT)EWvGA35W!gEGdJ7cK8~GJ>ak3^^7K+(_owPAOTEubQDz*oX80POksbyKcQ%u6Z z@pj2yH0YG2EhV%#a~xKtY48 z-=d;8X45;@Ny$&-0yn6i5=~7(UM_ubRBX;!h3b=RTLB5^ktSjr{=gYKKu1$-{lE(^ zfc+_Z=+w{BkU}2!;O&#J#0fF#nJ(;r^f}+%(Ua&?Wnr~C#4-j~NRChkD~+)?Vgq1N zb)yB}np!#hTj1NVlJy{KJ0-FfdLv`$##5=Fx@09{q8&^EOAbnuwTUkyc$h@ziDCBE zkAN&_x1olE`7b_Ln54?eBS)NcL5oz&!w(_?#9xB+F=_pUZ+LVs_WYlTDD79J4w|wO z|9O78iF|}`b)$*kh3-4GA<^sd=oe0BVDp^Z3BjC?$m)9uUQt0XK%|3FX|GfyZtmE% zWl`EOSViz|_0Mnq;ouYVPRC~TO8hvAKk}L?yhek$8n z2TYq-FrpR{nLpziq!y-U4megc27f(+-xr&;_u|@&a;#53;Ed_nlq0yr6Z8MzXObzS ze4&PKZF!K0)}iicnI#v)QpVa6oP~U&b=(IkMJ<1{+Ym4^##g(oFpL^jDf1s>$l>Amsmiyx>NgdO!f9=MB@_!8cT&f^U3f!T zdzvb_>vXySd6D7|%jWY$*`h3ZiG9`3P#xc#OU4|p4zTq4qPoYT;5| z%~Kk(OT9O(PwUEHGJ}pG{X$J(&SPEow~U*%<*I>5Gx;#;%q!_?!9}Pn(2D&!v)NHP7jvtI?C6#1 zaZLvNb9NdnF!;AvF^jJRrOIh8?+y%YB(ZnR48@VZ?7i&#xHHZu#M6d!8XBhtC2qNh z(3(_EnLS;zjlj{G;0SOruiZBQUc_RXh6KwxRgGCW{{^HOxq=}W=QbS~_*lrB<9$?| zxcnKt1Mc@U-CNW1DcdT-lK?F{^s}Quliy4Gut&&m9wTJlykVWD5ejFzPf^w-D*j4X zd+xv27%mQ!VeC*#5aQ~~RY#HR4Y#T4HBrt1x?#|rQn0vgLPb-m#TMwaK%OF=eoVtrwevBF*KKO5OW1YX z;1%+BnA+X(K8M7`rtUcTL>PE_l9htLg?N7#7DSgQI>2t}55G4KJvwl6H(S>AFPxSp z=7$x^|B!j$33XLO*n|iMbDwW6wTRLhysRoqvwo<(*S*5)aM5Rqx*S4{x3C>>{Vb+a$zaCCU?s)1R zFtHox-r3uGhf?n=5M%pbvn!VQtNM|#fB;eArGGkuj-zYQYxiV&YtjjP?OO9s+?f*3 z0hTdGF>A|p5LnU$n6IUKDyQEiw%L7;Nct_k_H^N$sIpg+kU*}IiZU!V9`RM?nYu!g zgYx32qsU0_+uuRBVd=(*q*n6>ty7J*!`{p(V*z|}4dvX9Iei2bulgh|RZC9sE$^q# zC|o8(=i#~sJP$B*1L3mdfgqBYpy62?!jPI6g!@$@gH&)WsGAyEws%o`}>S~?A=5OcQ2OP>8rOC2O=7t`?-Y+s!?Ntwn0 zGj#iItWzV_Mi78pRE?!4$Whuh!he9<8A4m+x1V;n6k%_Z)Wk`MuHZqsmwnFY@e*~= z(M@9fy$`tdxB6^CHl#Qx(}HrE%lZ}~6YbJ1YcR8~&Sg`iI^aO#0wFlcGxX=|zj0Lm z60yHv1MfO{7qY!Ms+n9~xQZydR%%Jbqwm@!DR2AvA_P04s(GZZEn9kmSW3{>-v+#|( z@$9!poioNSOJ?VXJdEnZty4Qw+{w^#(y356TOicxw zjZ(Q^w=&z*;zJS_xKj`2O`i=Y3ESe{ipEaljKpm7>k5L7uusz94^{p&j%znB z1-tkLI7f)#V-`~iG1I@clK0EjsBksBo8jsQj^@7r$4&ILaC*y?e>Bsp{FkK1p5mz;iDA*3+gVMtVQV5bxzK=ugJcFBlu1cP%s zCR&-LYl0}63EWa_37F~&U(8($=9=Rg&2kxsC)B%1lpVoMh>^AATNkJ$2`pz3?GuW! zjAb0G`()%dC2dqd8kH$tMkeSe{P{GRM9J~5&Ozr-iws&QJ6Ahk0+4==Rv(mNAne1_ zE_cj_z!K|URtqzqc}*eklJ%}+7vbQI{F@ULSqyNB^^WUnK9zQKn=apnE^C~Tmzq|D?Scw9nT5g!* z8o8Q%6Afp8-E@EHHcyia@vIRlBV8b$W_h*6FZ;i^MjoFp{9( z9|v&eZ9L_?{F&(Dm}bp&Nd<1pdg*e}SCdEm16XB_7oO4aY&sZX)bz1Zxs$^o7Eq_5 z&UB8oVQ~k6;YV>WXpqy_Imx~CqbGl9KHt^*y%Zq=Tf4?BNf4rEX8=Vd8kgdc!9p3i3I7I5E$1zurrE zuQC}&&Y=zU<^HfJ$H5RL+ z1a42dQ0WcaNhlK0zGwCgS~C*xBo-p2mb++Ml)@5Hs^9gfdW`6sdr|xs9SUVY6>*U? zr|JY4DF#8XCzJpv0-owP;jE!@HQ?L=_Do5pKxwLi*R8s8ChoLVLsf?;q1#1Dr@ls{ zzFs-eR`OSbM0v`E)5J4A`x{KfY4U31NoRxB+>zQ6e_j+jv02(WT;k?BA%!E|7f=xK zgAK2%-cVPoamWEwIytWbB*V<-2AYCygu(G#wow)z?~_dJ)$Q>s%%+#KQeYmh6=c)2 zmBV$WZ4VWPfoCAdvEzuXlP0fZ|LjR8_u4tbi8WTsdCK$c2y7u*h23`x&d~IDN=Y5d z%Qmd{@+wR!L8Tg~&q#PS`cED6o2RfT#hB)g*&)^gCn+g>&KYhLS?1{yvydEV*5NBd z$D{ZdtiV~e;+}K*K3`*q!NOOI|)gf4Cw)XpnnmUr%|G`_!>Tm4s~t;boEl zu|3gO_6oY5Y~)pL*8m1|su3YW-*3|;aP=t20`AZ`#8YNO{($MbmOCG5XH|2PE7HKH zK;lX+Y6qqD@9OA7u`iN!wIQqR!)O|pB9=Hq3`9_<`5zo8W(iv3XTLSYx1_vJX9ZYn z=5$nXa%nw9*Uj|_i;5d$#552V6=NeJ0zI|Gk~b&g-i~NT()DK+*}hZd$nYzq-xA0# zj#m<{E0e|z9tJ4D)IwWLIX7RV9B2I`nVr|D|7Ci)P}3PiXNz3e>-`i(w#P84LJPuK z2%V^09I*m2`yUKLX6Df{s(!Xgt@Mo@{(XxTwkvbpG6YX)zjb{sM%5R5D8I}GggKJk zkp2=onP7hWlTuT_8Ir$aaue;$#gPp_p|2GU%y7&rD7Q;fjRPfjGI}>R*&JYF#ks7+ zWHbMS!QKyxY7#C5#=;>}TfRRaD zuHMf?Y2SmRoFaH0#YJFve3clDlZ4-p5292asqy3wSF13l@9he2rY6ReF&!;OzLS@2 zq=pmYgr9zTbTbDdddrtJt8j{e&HR~h;dtPCQ&TBqTZtG|DSl;avM6stk{Sw7jT0^5 zY1g+CcGDh8akv0nv7YN}u!F}R!zG_4)&+)9`6XD@S{oPO)MEG~lOBrP0amdaMP_YY z9GHl+JS2N%8hd!?e#K6tGE-9Qmz000uLqga{#PuS#2P3a`UD5)nzjgZ{|}xyIB9t% z5FbH%_vEG%Q`uX}A*{Yc_6b7Ui7-sQQ`M zzG@eFgphAHTU&g49 zTG!re-CdwP4sFg}Fawl|Ou!HbQq#Y(drM647& znkaeoH6=O8@r1;uxhajJa;6|WJ!p+@*^7mQb0U15Zy_69*SB(oU-b7vv=V_P`e#TU zGAU@|o6bSLNlA>9cm8XLiB_F~@E^uX8_%K|57zm=!lc0chl2XzYr_sO75XpkN(IME z+r!JDb94G$3K$fGdF|aok*;{@m9}g#@jK3eNG>4SB%ji%s0O^!Z_OywCDNqp5Ul)3 zK*0`|mhBa^Z&HWUxJI@WGZGUM-5Lq>7ySUYc#3ItB8J$1F}#|~1+4Dy6jg=A#G4od zBN1^_Afzur3N_q%M@ZXn%ym#Q@vfS5VJlhyyK$%!xSrbADJeEehvteCE5I`2yMd#s z*Sj!)2FpU19fi23KR9#h6+eV?k>2EQYOD2dMwmruDpVcO+e@YZte#wh@h{Wka#B?k z!u`W(P~2F;=HLCv;ZNPFAHJuVfEDJa`5DFT9)(I6~f1xBnK*- zGPC-DHuDBF!DJ3D4kQVcaW20QP`;_?yR14AfkWtcY9cAJxXkv0b2LYc^=-3g?XT#e z>Y$6FO>7TjUg!3&B}P>4opHuoV}po`t8eLKx~p!PUDvV*Arra;=J%?0DiO_hm?RiN zY1rKjFTU1>#I($@5!2bbcb%TfY0=2XwA#5zB4i|c!=X9yR-6*E@Sn4^=eUEpEtuH# zZ(yCb8Yw8Y?!eSJ=wH9alR@IlYPZ`ByIljol6zR5;n;JqX5^SfL%e6e(tBnpaN7;waK40;ibMkNUsw1|p-ZO5C z+>VgyRYA^c)bH;D!xBv&?{?d~uJ!TkV^3>P)qpQ_k6?6?6rOrq4WSG*kLw+J@Mi9z z75vYP!5GmZZ!OX@8TzEr!YPuPYITepDm}jfOXZBEJS8ymi>|XDnXNA9t3O(_g%5;x z1_YaN@TN5$0v+apG_vZ-JbG z0ml+CpCFu1e#3=PkCKXC^9R6T3!AjbsA$a@s#+4rTj&y_@;l@lzRlcIw)bA({(|5odM>yp8aW>7z~qL*4R40uilx~Z5Y zkF*wqNwR&>59L~TTzVHRdCoW35!3DR}LPwhTnqu6zYN_=1rFy1_j?ViiHqP5D)Gw8 zI!|+NW4^qep&OrCKp%(#zk@t2<2|tw$T?pUIdFD?)`wB!M9F(CG-RaX$yjosrhKM_P?yjF$dy92rIx7S8fD|-Sp_za*VSSB?fpc(* zCJeo(WxLsPX^P1|fr+Jgfsa0-rr_p+!xAcsR5qu6*>V=TmJi_s8MK={E3-R_b0!iP z{SBWgrDpDF-t^z7{_;(22PYVvl*}Bg?B%X|BnA(IT*Z3H(``_1ZdI5eRHIcvzM++6 z5vX^&aa`jr3HW~hw2E*PBCFV7Bu{*CcT|tl46>u6oA0T|m>Kj;_fzZz^fh8qesh!;srWeYVE`*!0&D)J~_JNEbp1OnS&#rNX#jmbv#-E`+EXHA3FvN4t3!r5&|)d z4K*e-%{1#B7d2mvCN+bTRrd17$vPs9{q&n5>_%hi_TMB zG3vfX4+j)xQN1}0)xpC7MPQpm6jq#p*AHpm0B2!YL1Cm{*0d*p8iRzUsp$i1H&!xE!E*_C^f$iLaarn4-!2Z~{ z#US^SCj(wrlwb!-FZOhO9`L{R5bC{4SQlBy1$h?m{j3#Ai?|1(qsTP$b*nu=B{K-L z;->R0G_d2o*U7rjm(jn#84D$PpbHd3fCMhm_p}o}1mka2i%Zi2;oIw;qI}pS_)RXD zLnt4!sl2tzrkqL!x{K-Uk6rPZYg41}wz9TNJ;^Rj4kXSQt_rcR4CoI)3Gl=$_W# zL%MNba+}r&?GdJ9UWOe@++!$hzg;ionVrAv>Gi4wCsaX0P+xLDcVY2qQ#y9Ofs5kU zTBVnq{$F69MhJU|$bq4Be9K1CyDiI*e)OZ2?6AOy=sJVKkkaZlJMmi`&=9QID!2v! z%M=;E1!z^~_>^0X+$PE&ctGjZI zcF`j2D}?@-gaVE{?+CLP%1bzn2<}RM&!dIrFxSR%6*t@iVXat%fuCjB0`EXyCj2JO!h?B$i)|bN^5%0d>(5ukD9)vK*2Yfc*Hbn2@}Ni`Ih+ zMZs642&8_fS|xm^pD`^R&>?*Kdbk&5^Ub5Bb-%-^*??~s7Ig?l#35mBNJ}gLo7hlW zMBM+ftPB$+e9|&YpiMvq@#9nBvG`~0!Ns;2+~cv%VFs4F*L3lI)}4~?ioIhq+QU@O zB8rn0;Bbrg+_5X7y#0TQwf<+mM=0fX?f9}wmHru16bj&}L^^{|8MtcN}N*srd*1CA| zYRjF9E3WN|1xk5}XrO%i6#zeMZwuZR)W5WI|N7doZ;Ch>(8CD+R|0+poc9tj?2o>0 zMJQrrobWE*0K5#b%G>*$RCt?FrdgaWwGL&IlpeJI0h&XOugJX0f?a)ZhYNe)Fe+6CX*>1IC*s9OXYJQy#S=CubM^A*J|00omS0;$xzYxuTia1&?x zW1SEpKg7l51w-pN4wJMwVR%$VU(aV{PA~4mv>XODXI5W9zoa;f7%YVpDD+C3-J!Q^ z>yL2O;uD2y#H)T7Aar(|jr@D$qS*c6uZ)|sg0?Ug!*oa*VSfrQACpIYiuKuFb`2V_ zi?!JfY!H`-07pQ$zg!ZKa~El*y_~vL##|XuVVSG_o&;va`JVX6Su1f3z37LMUFzW_ zAk8Hf5u?X9^RvRy2 ztM6n_hVwBJz4lK3x4-HZE{JnWHteJtIJ>nTn-wiP*UNXC^G*6aA|6>AZSX|=~YAmUbf|KrI#N8 zi3N5_#Z6#U?vlli@k5aeByzDbO+G%GQvkRDaZ0b}Fa!-7H+k*&Rcv7unzcj7n}r{B zNM-1~oUv>JHp8Kf;yC)4UK_;HE; z^R!_T``n+%%Tp1neUE_k+}7Or(5B6KiF?HolS8xGpr#)~ut(?N3Dg0Rzc=wDa8Oxy z6kS`$blAJC%~kD&-A`aUJBq>~VLINgfD&~x+D*<;K|3g$dRBvKaJ}aiCn@Yc61asX zPYM+4r|oLd*<4j4#V^{?dzXupFo<4+H-J?kkdOljy|IPa%9()rjf{$QATX}FbLZ7< zkD68#VI(8nS|B4#U`%GS*7aegE%8*5AE`NAQ-Q14k5RC)O01;T6vHfOO>;O48Wsh9 zy`R;cK^OuLk;XwlA+50BIe)GCqQ9^nG>%|&KFafo!kuS%uwWl#IatYZdn1wYR+@^f zR#80Kx@3bWF>++K9KObzDz?asnPK1@2OrWg3oP98^2`Xc8qF>^P2=xDh<^!7d3&aw z#0v%eUN$K-$}tF~RJ|t6Sq$5qrM1?)hXKJfziI)EH85)DcNJ-{&RR0MHQs35Cyurg zwRDk#vpLE?s>VE!FcTQAqccnJD1K$=@0YlG)xuCUaO46 zP+MY+e?e&!Iz6m#X%igRU^M9V?2uu*y`jo)c2EGAIGH}KUn40?lsRL2w2Pyak#h3I z0peiR!>~QUe>~y7SU-4^0DzdQyr0KYuJkse=P|gLn@!2&X)9`Q>JiiuM^UY< z@Y{VRGP4}x7O1i{%dM( znqBuTxMUnvCTqGiA)fhhsc*8#vy%boIX(nyhOi413Y+`fJZU8IJk(c7|>y`+;CB8am9mJ_WcH*#oPuBS>h}O)r)|OEW{Qr23$v8 z+t(Jz5c6Y}r(ez{eW27~hP3+xnk<;5a5u#dmVMGh14aR#!>{+VEjpBUsMC�Qn;7 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

@=tuUfs7rXrs{}lyB z^Or@F0-+PQ+k#Iv;FLvS!ki8@*th9G1rNie(*Xf-P^Jztul;c>_Kzh&cV zFdOOVmFX;NIQoSTiS_@O;M0V9K2JIKoSbUaAh9-ZtRw~-x$_YaArK5n3`Ob1KONEh zp(j6XN#cuwvH>a@*Pu@`NadB*EP7vVZFVuu?63haIG|u%6c>-!12d!BC!=Hr>kspM zv^N*Jv@49IbRX?SK*eVn6>ROB7abyYKD@~I@n<~=JGO?YiI^-O0h0cubei+177Vvv zf{e;rzSwMGfAqw@mz7ZPI54vyQEW(jbEhB-^U&zJom5LK^PXm4Me7BY(Nyz$0fp3) zoU+<;dU!z;2QWIS9_v?_!Y!rLfE|W*h2R$~NlYc%;N$slL(x?)%R3gftWQjxORxNw znehe5L$5OhZU9*S0YI+fXz{8eh-_>{HX3gv7NgjW@)}V8$osnRSzeT3)m6)~bkedu z4*)afoBSb#85Eap==s=7e_%JCbnzF7*U$f_$teL&w+Yyq+=o@-}+)xk5tRC{@IWxN^@>|ZdkQwe0C?#j^W>9Lv(O@ zxwfV#6+RO06kwo|Ci@*t9WOB8@_YmlsV&Yv z(oe4|zAFaP*6(EjcPzT^;yiE0!&}I79Pk#9c|3ds!WOH9jz+1{-V@l_9sOe{ zX}Mfl7*uUgF@8V*OV}nV$WWI3XA%9Qte+aX!jo4jW|$A^q^(9CUrntNzf0~!D)P_Y zA8~-xmr2BNWO#L$Dt~^|&B9q01;DyXy1He)Pne_KF|yD8YKRh=<#uH11|adQt2J}J z0zw{T4w7WN?*1v4HErrI$K@@y)fD z49c3!Y_*b~wk*`}ms$yl&!kU>V6vsD_$B_=vJ%Yqf5W%u1m@O}s1@i_yK<19^bmd} z_C7ynyvF_>g9KjnB=}e(36Pp;+Dd;|saB75gpzR5%2I`?k<_!k>t*>=(h`{$R+8M# zT+U1(m3VrP3A?=bhFinz@#uH7?zwBc=isW0Mmf*1BGA%m^WD7w6? zk~`qZ?c1IFTp}khw`50J^2cj^D6)+?GxNzK{`kF{)+HX$HWF$RspkHoU}O~{}PGUs4wE>xe) z`9LL8tFE}9q^N80~gw`DtQ-%#pT4R!N5g_`Y{6oJsGq~;@`jPEYh;?#x1iVwRGp7QI=CBE zZ8<_wxn~kW`yI8bXY#%dJzG`FaM91RA23U`S{@XQv8$h1ea!<5pM zmxNWE%yREe-pypXkhGq|Z1H4j85)1+^8K-U)}gBnZs5Nt=46)n?qmd-00>U?_G@MP z&qX`mV(j)k54o~zxRUdUo6QBFTX?b2n(Y+;>=Uf3s+wZf7us{w+j0aFeiY~8rsqzt z7SY!|F_}UMOSO~(NL6o#I@v@JkG04(KLCy|&04AXis?mj%{5UASdslBV=z@I5~^BC zIL?3)85XIweb?(yuA5rDS;$AWE#*!5&bcj30K`SE7RN;m)j0#v3f@vB;EIhNA5&#R zjxEv!o;@NSaho^mN&T4Z0e^*QxT3XG9#Kf;ARXQ7Ne5xYwA+6R;B0j0yS5ceA%Yxx zmLQ%P5o9~#DTLh8#NkY7Ee2-f0XcNXaSsbZt0!yRX=*t;{2u#yTlrmv`+K(4RE*XQ zMU|#5T5^{~l4b>u9fyaBd&R^8@mS=Kf2Kx>9*W=EpAT~bkR_1p6MBtfs~oiUCUtgG z*NUl*Zru<;$tbRN-aS1#ZlG(jA&2xxDq4u=#)h|%8E#=QmsZ?N6G+pU9+BB8x2{i&sk$ZIcnH3!-uk5}Q27q*_d{a`jS2Z$hC!x+vG z1$qE*n?1W|*00tML&X3)K*Yb;Z#)YB3Q1F0K&-ggo6uvDIz zlDjQ9j5MwuT=pfAS=8h&H~Up{U8j$2BFmT~tL3;o)6^7z(FZtrc3GrE@%=|w(gf%C zxM!e&Nl;rFk%RO4L`C3|i@#8!es7MfIx>txnDeSA-F!g&@esZYmo>K8m6=>ZY>*Cp z&hon4o3IVGl&L&5+8hNN^Wpvo$)Z;oOxY+fA{D-*>5Y_{SEoqVYFFkFuChm9cP2>1 zv_w*Cn#f@}2eH$@RD@(g@dsKdDrAw3b%M^o(92Tk?O~z6YPms`S4s=WoO@Vt$ZALU$iF8UK!ib*e$c%mkR6tTvc1P zk)ks+oB-7h&lA>OTz5K`68F;_)%esGoo*Tsr%NBmgIZjRo{dfOUKuq8v25wJZI=xU zl4o{8iPJSxBg^TpT@JX*p%W*$Wm&)5zGOeD%`Rt6cLXxl?!A|%PR5KqI7#E8_UVVp zi0z?3m4X8893`T|#z}G2wpbI{wIXl;)N7K(^gKt)NfFs+Dd4BLN~JEZG&@}mFQE-`gC_y z0luULW0l3KpKUkF5kIaBiy4reC=<1`;CccDj2Ue(3!}K=!6GJUr#x>m8%fggI7b&5 zHArR#^>)vd`!iL8oH9+!N)8(KZo8NCY@xp-kM8R2-9yN$8zZ1C;(qd)j!*R~2i-T8 z@)^qQoRvnSF{zcO8`37RFcvjS{uhiEDTp0I51BZ{YyoX2ZHe6+Aeuq!bA$}pK&WUz4 zUPsx2KLw-dSA}xR96z^da&3^|2w^i;XcVGQy3s7Boj}(#xXw)0(Z9tk)wr&u8YSUI zk{NBxfi{{#{?mLYIyXi-WY%NU@J%Z-s{dof!U@bx?(@q3qo?R6Y>-v|2?h)+)k6bI zDhhCv`O+6xFztOEfeCs;nipgCOk%6w0P}+1H2K-hr^v<9S2@4T0<>Igpn$KU)-DV`x#$=$evDTw zmftUB4jG>mxBfI-pZZ2`q6K%bWQR4%vHN7-*;WU*ay3bG$riAm$#rh~Jt9_57y2@| zW{7>>Fp}|OkHJp*Davo~iT-&c?S*+z=lvh|`w|280Aun__7I6_KbQ z-OIJYnyo{}MZ3{%))Y=k-sY3+?i+SR6!xun&)&`LY_GJ$)XYu6sh(;A!8fI(Qh=&~ zS$>}vX&Q}**yS=|UeRJvv5B6Jg^f<9;t{6HYJL4~d_uxygHTdzD$V^BzOM<>ZjM-S zuE~BzF|!Q!xN81(a!whDM1<^PZ^B;_xovK(d#F`A|fqFuA)+de{lo#0A&RY zi`zEXQ6ItL<_}lhFXj%vE_uycGqd~|tt3!Q_WVgc{)hoVRS1pmO16`v%L^7zhAqhh z^r+NUtS=E{3VlkK;7*Skb5pcJC9g}F$b3$+VRESLY+;qHDWzip_l$~mSMmj~DO=?S zx)b-zQtheD;O2|h0W^M8%Zh~P=EzAr6QXKr-N2-%l1QB;A*@z+L^*t@0F9scI<$vD z{2rP{!CqqOMYCH~ctGWL~BLUgo>^&6R#oSh~s01&-K$+6t z5qCRf-p98J>v~+U5nqZt2XHfWyal`4w~K=i6pJ1)_M!;E{VP^I@w`{$8wH&K5?>2+ zaa;6iF8nj#RYmmMh3XR#`!;*}Lu?UZYAZ;rzZ;3GF==5shUyl<5?Sjqi;I$YRRIWM zdW_WiTlH6zMQ>2m8gYimrWuQ+N8-ZPkI@^!wt`@1J1nyqD|L)N8mM)TmF?YsmW3F^ z4H?re(38TI>7$dI#c`J6n4C9CUO-Q*N+?=(8nE85O=_H`|~a>PriVPK1b>6-z&>Gt;=JZK=%ep%M8 zcEZs{@)l*c%Y@~D2Q{=8>`dCp&F=%=bf%f!NwEZHFk<`bdn>P)f5A3)dY7xwL;74Ig|puZ*u}R0Jhu;4IgZ1OO#6 zHkDK1hjf2{dy%mrc9u(`nM7GQ^Ix}L92p|vnvj$NNbj8v!i|Z*J~p9$y^?QKa-7rW znC>a<%rx@vW4sOt6oyJXmh{$Ih(s%@u5sWOR$D(EmzeV-T)>-AM#2f~KbGLplenN8 zO3gA~?AW&iLxfyF-c=}75${JPI6HSRFWMhI+yF?o!8hL2`Kl{-{ppkFbqCB*Rg5f0 zz<*R}2xD|4t3`HZIAhUJ#l7L~TC^woj_=b0qR5VUoVFYLfkJ{ZI}V#5=pl$06g0c< z|G+u<_^4HG;O)(D%cT`5ys%IUftRm5CBAOA2~!o>B%ts0r^tNhzEbqOMEzU!*J?&F zj%99?I4#ScwNeO2tg5fh-$aY#47;5T+P75o$lH4&u%;1O1kN;A2|HH%Wt^qn1{I^{ z;T$WsA?J(!IYgjNvY#SFiaIHgbD&(4h$+6YoV-=DXTg1J{aD1vi2VQBU$`T~^Uv6_ z1gW~YvTvpo=A&8L(WLrEd;Bn~qoo!ddSaLV%sFX{_w_J;^u=HxJbRMIw_fkV^40D5d z4&EuOh6>XAM-sI$QZ$cH^A-G1B^oE!XU=)Mmt2j@);nFpCyqJp*Zs{TT3 z-hI*q>rSqh?9myU7QP##KL?|h5f#Pvz1gXk19p1QlEP)R9qUG=GR2s_?yI6HYC$gP zal9S*tH4}>@SGG9{9FToEYF8*R&ozAa12wfni)4l4UGa{29lm!J9GAd*sT3!!M9dfBTN{Um@MLI*BrP&-A z%`#(AR~Z)Rn`Bbl$JY@sr(jvlujsytEM>sY)gDn`SlD%?STcJrsP12aK;)OyT}%-O zeT89+*W9`&FD?VH5lKfD`#L{I3Qcjqn)?vVFQWN=Ml4pzcOGtrmd3ssWuALP-~#_x zy^^*U-5Fk08ov?$+lq2T5vl+jqWe&tumvblka^nHI*zO@zU~l7e76JM{goS<1nMJ$PsNtX@n?3$jdsL`(Ns99Q%eE(Mnbw-SRh=opz(~ z(`7=DWATgNjLAIG-`3HplZ9J&6sQzGZE$&YP(~?%T%oddaG6hH#0FSe#@8K2v!aNE zi#c6uLNIW_%V{Xid_3ojeT_y&w!rJ%JORTNFumM^g>+F{&M4u5LV7EakS#?_hSG|f zcJd&a7j+ABO}LeqVh+O`z*Op}`){&&Zcw|bVzF=_SxOm*e#&pTa+;63VO05uhk9OJ zj&dA=?AY?`n~-C*2@7bqv@a)mdWH;N7F^(OuH?Kd(*?g+{Rt8wQkF9zR0_`0k*oGv z;>2&BDd+Q%a_oQ(Y{7&6f@W%qA~ut;%#JVu$Z_&qFa9e8Ql1e<`io_APXp>hn=jzZ z7K!$G?(&i{SJmbm&o)g65?m?i_bA*SzcK*XpVgM##sv?f5Wq)v9VAG09r z+8ZRa-DVCU($fs^a4w-@X6IB4cxsz7Hxwou0VqtVjz|0|ls+6#XOeC51{8Lp953p9tzVF8YE)RLjb->e@9X5N8 zHqwARr+oBp)+{3-6=BLThqr?U4GRU;njj!E5pb;3NC%VQ5sslELO{wogBz1DcT4#B zp9&{GXmE%fZM9YfF9qwUxrW55&rS0Zkrr{k8}VV9a&jNxUuG^c2u!cj+q3iE4srW$ z!bQ!TeQpy5tMBEduna7UM=}ZVGKN#2 zP}MZ8a3M`e7zn-oW&iij{m$G}g(bjvCBp!aUbY&!Tx^BO`q++TB%5W-oav}}F^QW! z2)UvB^*6x>y+x(=q-Zk%8yuTpO%8+XhhX(?z(JG{Ra}8Hw`4JEkY(OWpx1M0NiVX z{UC9ttwHD5{bLs6H6j%?G(c=h?Iq060ed}8grHp@ot~q<&tJ5o-KewUte$+5IE{w7 z^xzNlyhKh7M$QpKepl-i*%V_^L-$=g}K_h&OJG2z~aN}`5OBJ*IvNMMgoNK^Yf2NJoI8!Eauj^ya2Jbk6(p1iY=Z}22>=|DP{i~#k+ zM{#aTr-)=>yH*phOQa2yj5Kh5)@Fg-J6o>4&xQMQ*k@b}pP^3t&Axa5+!;y>xFgln z=zvxi{q6B6SV0@-eCHN!X>UMZBvxC~K_f^Awa&)f_K){FR5otMI5(p(HQeKax;QPZ zq$C0Ht7cz`=0(pLuiqbN;8EHwT32?4%I-Xcyk4ws-$Tu452{j5S-=x9GgpQBAI?1| z=`)Ea9!)j2gMnl)Bh1crJN715ojEwKZI4&?h)d1_w?dfxV?3tl2I32sWVaB;098x% zK;|5t1L^4=$WXVc1}1*)X@D#N%*G0`T{whG zBD$0SPV)%U);8=qEmEtn#?$Rd(@R#SU6Ri|Cpj2alPxE(gAsM?eMRCZ2XJ)SfVH22 z6giFPY}^vrwmxBo-&y(XPQ49boAW@R>=0C+oZlcts0h#%fcfj!h0NrQ)?=JAggbCK znd0-JrJiJ*?@@8*q(O=>Nbquaiu+(V6hua6ri^+oa9-nID7jbxXMQIO{E0@e#hXuet z+wYkzA720EQ@D)pJ>mQf)wH&k!VfxegW%OcSCUm}AK5inF*J^?$Lw@@{TLXUEZ3j(?aPa}eI6tUWT1<=d3#UsMvO&0kFAh=~tl*Q3 zkm1-c_QL{xR+|zf?2HE6N*|lCZB#Xm0UhXg9TYaFRCWDvcDE7)5)4K=1AuO1o@*L4}iiW6D7Td1Xu>xvr*JaMF$PM6a+gEMp*#bc3`G>OZut5|?MCp)KI zDhkjQ#|$z5LC_=1>U*yP{#c;3i!S#D`OIRZ|CM4LJ$jU%AS~a|bGB6)tD&AyI(2I( z%!$KET3o}%J{7SRy2nDn>;W{&U(3eepElIp%I}rMEej3iamqNz?zdkZFuAh&n5)CF z=y}J_=fDwI0u~Lo^v z4!t_H8{FF#i)FqOB~L{J2s!^v&-vG7by%b`08HS*tZ_(gLHy%UGs|H1k^`RkYPdbp zVr1SIhL@;hl|X0>!74XlZET=OvhWYGQGWk|S`&;gqLJ9GDl{F!e*Bp*b~yWQ9(UfU zI&y}6%_d`)>QR#jUFe)(pBbGNeUZUMvWih?)=8=x%d92Mp zc&YTZ^sNn!`+hT=O1wxaT9XaP!F?tyq`@1ILd=_mR0?5bt`^Q{6?zvRBF*HLA_d6% zJ3-K+6`+k%Hhx;F=OKkcZv*c7plHM3TC3xar8-CS&g7YhtC^{)cP;~Q5TE$pWFHa> z>ZKod&f-S76;Xuz_YOlZt!sL8Kl*5Ha*ss_Gw0B5*J|ne^)t8m&2~Vyt&hR~2Uo6v zBxjU})nh}o3f_Z19Gpt~i(d{?n_l9)dU1-Cex_prX7lmO9`UP&#be-5rYh&$1FX^= z)kMQy7UD^zz@m#QD}1Ekz#I>K^p2IB!&d95dn!J8v4KmIONiv4INnqaHbra!*_h(p zwC8QwLFI~hFAN08f(4vgp&uMu4_f%B_4wjA3SvyGg}>)sQ&m9&>NrQ%Ote;Q$uEfN z*Yg1)y|C}2_Isx%0RqT|CKQntS(Z0%bPm;VA<(`RC$1Y%M0{n-b3-=WEgDnsSIPl6 zMdH7pXcvKWE0U?47R`aEkFI~uRww?bWU7C&fF!552eXXvvVRKBF%4;_zQa#yowq_mS{WmJ8l zxL-V{Fx}05Pd0&-SR*pk)bNgmr)0?^M$z0cvF&sZ)S?p2LG#_W4%XHTe(^=d$Im1) zxX#y=fvRQ;;a=WVh`YCVsW*hR90>!YQk8pdYMLG_Y8uK8i@X-GLpW>@_y>kQws->@q2CLF<`;!bKm957; zDx=|;i21|k2`=w_%|HDkz&BioI?7AdU8UZ4VUf3B+YjDuJb8og258%=1ZEo_BC`9` zkF=aXDNemE2f@CHKoQRj)3u>mgb!8)UDO~?yDGf*Gm#3;3@?}8Q$y%sQ=i=cO;}b@ zGlCiXa3fR>#DLh_3>TjE8E_I;+t-p#1-!&f-OvDJUo-j zbtk!%?LlZ?M?Oe+mqxl9#7GvFD@d$1k6ah{79uc7eB|VCHxDC3RScc=*dYRm`|KVq3L!R2E&l1(M`l1~LOGg!uJJ9p6i#IZl?@x3!+$e%`4a>qU664ue>Innvfws(vRQlVhWRBy9hxb{FQn z^heE%ybEZHwyoE-gy6|x0GD$+lA%H-QUop#pTTr+J3x}+ zdur;yejU*LP*sYq`_bjHR{{4x3vpIQw1loSy z0ZDm-mkI|8^kKL8u4kiDX!$hvZqdMEV@2dGNsKs??~Dz^GX_p!+qJK5+c}0=ll=gs zv^*q`UVX9Qhd2de-(cudSn5rDqBd2WaDX<#f@rfImp83tu!^vP28eOTvT$TCeM(}O zn4Oqzus{V6ec~f4F)3pcM@dpNh2hMPJSu?1&!gIF6zr)6t*Y!JH@yRhNgQqa341~- zi<$2RFGjswW<(KU{Yx){@6`Ev8u#nQOhlj@OkIdIYNDx)w(-SdGYnHV0978~uKt#U zfo9B`-wGH9S7rQJsf)KoKqzL&(1n$&8fFEM8_aL)3Mj{{29TT#x7&GK>4PtIGq@7^dSUhhU@GyXM#LRj&K9 z`nS$RBo>SxS5p-qX2Y2A% z6mJS5}TWorpU8jJ)soR&Ssh1|5y2-XE@im9h$ z<207>K#j#8cIV=Q8gk8)=krsi5UTe3nBe320L(D7Ug7-tR}5eo1DTiG0P^}t?YUv6 ztj|tnATSJujs03g>C2Npr=gJ9Pj0b00FLb1oEcDOrcqtwCK<-8?_SK_x@Fa$ zi@6_f4yBO3VnnNYn<_KXZPDKx+=q^A3-)?8})4k6<)bpCqkF zt~6XYZs^5uBJ9=)P%`Jz_BApCZWX9LXNRGfeeLk}E$U`Lf!sJt|u=7d#kO zoPz#%-qO4j@s65<>&V^s)45Z5G8$VIY`Bhpu@>|+m6 zGfeW7h*YuCIK8JCP&S{g(Z%|9u30q0j03nurGPxl6Q6FjsTkB~{4>hMz6SJV@Cok>FeWAzVxk;TF#cBv- zjp`m5u)~J@mdkgX-jCp)*#&!&6m^2MK)pmMNVoMKgwbrqNp9@^fvwR5LXY)Q@5yRh zU4mX~AP;!-#^-)x*$_Vc$AR~X_e6fxbBdF+t+mR zS5~ZAj!>>HP99Bpu3a(06L=M=FSG88zgE~>7LDYnV}Tpb74Lkz9$**8JV8r-bt|qV zzin#K3$PK)4`DUh4_wOS(WmY$p$_fCj)nEpBw-N}=U~@>rsX0u-&s|yX5L(JC%7yI zJM3dp;DcBd{m_H|)Nr}aHaDA$PKZaKf`F5HJe1ozM@#dtX`TtWIjO%C1%f6M?36e~ z8zda`TyjhzeMkY!;&-{E$YP)d1wACm65CKY@y(KmOyglKDp-J$!66gjgJ!gLR^^L~ zw~M8)WOns@1A1@HEK#GxC~mf!K0%njxH@vL-8d_C-<78M1R>-4dN#BxQ z(}dpA_s;dA|8hJF|EKGmP9@Fr{l4E!euG?noHaVw?+rbT)5=+tz$wEdt=;&9=IslU zZMvTWH-jA7PJNW=jjuWERwnt!#=&s@M%Asv)}DUdr^%)R^X37Tj?C+p9RrClMbw(G zK2_~Blx8ucX4K%l{Yr`kW_X8-o9&5$&Tq?GOth>jq~bmu<+hR@dhBb)$tRTH)W;Zs zO=xiwyCgk#?cDmZnv5Tr(iQo5AZOU^db?sjN}l*A2@kfou2@)^g&A$TE^f+{CT>NB zf`({T)Ol@AXCJ{o^0pgaho?IH4MNtA6pGb^Q6RpxFj$EtU#$6qDNoykGS8?erDESn6Xi)NWmslnb@ZYZZ9t~CJ>Bcf2G z?apqE_gIAKn3cMjo$_hiE4}pHW!S1DxoWac!GsnEO|Q9Ak5WokMxdJgtC{Pxrvhp1 zi@SrX%QC=8VL5uI3)&J4CkNvY!pHdWa&Nd1(=ba*my+thB1c9ZnSBz%4r)lWKc?HX z)ApMbvdTww>zSqUcYD8y6%MuSNMU{ZyiQ;+UT-GG$^r)QXn2Hs(^*u@wK`+vsP$l~ z+Bb;wRz>WQy^8S#hfHdfLA9Y@%(B&VAXC{91HTTGnX<1av|(CB4)R2~H1j=jS&?vS z=pLHzHVN*CJDx5k4?Om2sh`0}w3@h(jbt6%Qn^K{W|_Ib_B*nt^cc=<11*W7H&2Pe zM5SvTPYFFVtoajIXtA6oTCwZEm;I1kC!(-klR~td5$XYuS;4QpdMU7xW$$IK&q2H(WS?P)Y;GNjFe_8o7}Aj7q@7C@An8da?ws~kf|a_tiF z)FTw+P~FONv7aVzNnGQ0DaRm@Wpbl++p9av0olSRK1|1jUszsynldJgMo$ZFW|&9! zv&KL{wU5B2*Z2YB|t#&T&n)sE5DsIL5GEYydA7c0l!4TYbf$v<;LjJeE!@EPID?;Hd5>S z2Op`nEiSwO#~DKF)2-dhDWXmbRcb-Qny!OsEE|m*1$P&27(=RhQwq0sp+bjPtT-db zX^lh-_n+VI8t=ggb~|Ef3vG590XUtm=P}>1aLue`XX}232%OT2L@0SQIn_-6Ep>~e z)R$dc_#d`OW+324qycXp<=fqu;uebX;)?IYS>Ky?`;EJj7jFwvrijv$5R>K4wCyH+ zuaba4lo8Y{gPuB{ZYMWx){TW;8=AC;P3-hpst6}gZq~r<0@zlMWqtiNwI_s%GVHtw zcD~?eHY1WXef7*CTLc$$&}88>v>G=4L<#{0Tp!!MaQZ2nBoL>TRP9coxTOXtZYh9~ z@jH^}4S3C-%a@H3D^xgT8GY`E?OC*YNkZp6cc@^wrgO-$jaBbS1WVMf>LKRIb4?wm z&_}^JRpa0I;?D#3>M zM;3=#6V)Z%m$Zl@RbO27V8)Dh(>5ra!8tNoyUm@hGv>!7EuR>m&u!bIYC2$|OXgPPpEJSbZ65z`Wok_=tYTKShz92`^%p19ujfqdGNXs%esJ(b3 znxzAzq0_Kn52v`Rh)3VwPA>oDUx+Z{y=hQabx zZ#5wvxKvyXl8VhPB(T^0C;D9{j^Xy&I(tbqZdX{U+XCXg#U7gP(%C%Ps^@PF-PT9| zm?Y|eWA42i%zMbKX|@Hq&7%XXl3yt;EhHlF#C4(1(mVYuNKh{M#Dk*3!&zET`EY*tc_r^#DOkWcTL(WwdW;YzJP!bF+1;BSe?lq4DXXdJs60Yv@3UEI5P!6MjW^AqZK7Xxzn1!gZ z6fZtIrEKEpcjQEyf8_lHZwE0s2?8huS(PIMa6M6zyFmfPehl(vEshPv;73koiLd~ z5MOT1Y25A@h>O3GlP`gK35Qrz+kU=^2t#9+ z(*bIDj-ghA@JS&6Pn{cM;lxUGr-*;NG~rJTN@x=4>IJf{DZLt+-raG}C7b4zZ*c-JUu6FG;nU>mPX|dA(pwf; z##C$tO$p_pm23qcapyC5HUFIPZkdf~$MTe${EbGpGg%vb%Y&g8dhDG`+Ku)uW!OgS zh=^mp4H?|FsOJXhB-JVj7KE|ID4^?SyafJg*9l|DrOQ0T{uzFU(kP_oNIK(iFYvYK z-))_+S$|8ji@1;=fX=Y2SJ2iv2%vdTZ&$ecwA{o$Ytm4?%Dj-?_~DP6*LSXV7&;BZ zE8({X-6c*F!`wY`-o{sg?5R!EGakbHvIO6El4;1k`q^+0z1`o!rtsWTFU_7yw9AxU z7&aWg*t=Jm)eqvfu{({7#f5v8e;iY{U^*ry>rlOcayOwinR(euoUJ&Vxc8S zDKLGhug&w+hcEC#^x$r5*`GJBaTXQAH+3VAYp(JMY`CZ_bJvl}v}@R}Ccip~=CfMn zv2*qc^7J`Kpi{@;(g2jsVn2|@0DUskwQu8C7Lqzzq2q3;c`$9w_#_!A)Q!mCv{*=P zLILY=W4hi^GkJ1(Y4rgH?H)fG`Y1)@iou2!{g~i=P&DFG&v{kqD0J~9p?p&AevW4F1i=vaA?sj^B{jfi^M7BGP zmINNB6Tb5L;(Xky5Pt$m^siI7cCWq4syVrIh5nB~l+kJ#}3C|k$MO?9`NHQuE z)jy{GXT-3s&>FBkXJ|c9{sur2NgFop{E-{PznG8_Sp|3KrA8=p?Kot>kq zXDUM0wRxA$+4Tsmw7H2K`QJz!hAwklCpm|pA?fJY6 z_m`XP5P2q#1q{YKEusCra1e9^r>F7=;o7PSbNF;#DDlfSG(n<^99bELcDqw^^Gbe_ z*XPamQIwNoZWM-_7dhao|Fr8{4hSHS@ zWg{GYSkutd6ee^vcEJ!vol<^gk=3~v0s#6Ut2WUo1@N?a;A9eHvGOzK=Bw$C zt0qkQnzV^jwVUU``^PltlRv29hw%!hQD*QA$Y^Uq0TjhW*rWleT*;Cn##mEQ@lvHC zI&dZw$EfS*qwF{#^0S67F07&$lo3^3U@njh@1ej_+!>^D4Sg;lBPfgtV#xlJM`(+r zq_&VKWZ|d?092D$uKmYiA4|@xikAQykt}yfHvrY3qq08b511vb&17;safO?w6TF%N zz9XV`dlQMiMw0y20Dk;oB7R)|x%`Y^?b%3n&W4HB(3(*gB5Atoh#^zm<|6-YiV}!N z0bO3ad##u%0JTWBf4VH**OA*Li68Qy8R|OAg^n{aWvln6WX1$c7eI-J z)&>%Qy<|n&q%In47U(ul2!dtdjB17&^Z$muRk!F>`6E!t@BLUFxnt+ zgNJ#=3+^BvCY&sR$;Rp&rq&y@If9a4BDXj}!I7PMZ!=-*=oa~PaUK8$N{66A_!^yl z(<_uXuP0ug`Y(&tI(Xlz_uE(<8QVW`55xk7UO!)6@+fu9vZdC$VL%sx2olPNQCtXb z883LV;=9n(aAnNieScE|B$YOEM7W3yn{I2W%(pghI`o_3QR(eT;99U$oA2W){+%jy zjbiNx_TUAKIQlQd*p;&J%-B&cKk%FOo{qbhYh#K2Ft>-^@?v;Fy-qzRn9d3oVf19Q zgWg1%$tf|2Df;$KR^e5e*6zj0bizrFdk6sfPLZBQxc#=*Z+D8)Y9C25nz`nnftpZm zL24t`os}sW)F~ux$+MAD$^E<}PKPH4KeY3;?x@;hb&Qj_ON<(Px$7q>E#W=gF_lx3 z8j6QKJ_~ydtD%2dE|GJR2=7cDVXpMHFeeS=G=Va6YDNDeoqC&n_fTd>nJiZOT()q} zB{dPBR-hii_o`YqkWru{xz}5OK4L@m+IGTE15@+e{LQet^0Qyl1WVL#807Eft>)aK zx`h`UT`IxW$)aRoj5e8t@7W5Ml8Q<>LgC z!jBs9?F#+ZHVSdLHAAmub*(|~Oku~Q{UckdGj(pWDFPe0)!)59h4(@)+ir|>vpqQu z7r6T5k;YeqGpX2Ko@a8ae(MWrLmtZ}r@`5P9Ei+Bd(?8|!)l$g9W|&U*qc|L%Mk^c zMnr%;2$(rbb}>wxX4E@r-Bp9PHPWL4oUcWL=IIz@?6L5_G}La+#eNuc5)A!kt)Mp#~fl z6~0hRlY#x%Ah;RxeH$0Cpu=pjpH`05z@QLLBpJ|jJ49@<7hEvehLpVy6>Wwdc`M_?#EQ4 zbJ!CL6S2TE$Hv7iM6H*!k<3A=sWbmJ^DIWq=3jxd1c(&2c+-eYgPV7!WbGgu-klhE z&bpO~$3(7(VFGo=o!&Bqh83yi#6-gNAkqurfIs`HSt{rOW;`zG<=q|pS)O~B5~#F3 zaO$w`tW6kZ50V^NW$!AQ*w_*S`5+W@;?7$mIZ~zDT%msGPf|d+u(}@o4+(xILOPY` zx$7M#(sQnk>E(*IW9B@VVQ;bB{e%VPLnI>@knY;G+;{V|kXp0%PjoTBPt!Xu`b*M{ zwe-BOtjo7z|BZ)O;{PMQ*3LZyeSVvCH7o|@dItjwEkR>%Ugs0^IPd%gnYXi91jXT? zgyTmBk>Fd}mI?$<)2b1nxmRB&j9LVeg}SGn|7va*a1YOjE_$WK>!I4*&cix=i&O+? zy%1o=Wvcg#RmzI0qa~eN*fwkQvZ%Bd_)$2aLI6j#N!P=`Ws+zLIIe$HySExhh!I`P zPG*Si0ruYz{5#O3-c%x~Q^v0_C#R8ZNV&ByG<~q9J6vl>X&_Or*`=`+XxRh-a?i`~ z2Co7NmwG7Xqr*e*XbOm`(k8Yqj~dO1(2UN(AI^Wd(UfC1%^30|t7#007g@Fy2wf2D zZ($QKCz)>FjXJ^1`1?PBnbLIRowIVPH^LS$KWxTSM+tirA%c;UXT@P57U}8ALKvq1 zg9ZQaak%vyW#fruz@GLbC*#>M>J|pPp$WM8R2>CAT|&&MAFbw2k?7F;G~{gP@FS?F zWVq<;eE`_wP@hKmHzKYQzrY<-0|$&BkCK7Bhik{72*>k)%%q^(LLkNZk!Qrqc(B5d z+XlR&AtqbTggK4h6JG04Dv@>3@6FNcYrR6#o_GK)K+?aw+}B9r&{xyd@WYuZlbQdY z+Z4HhL%6U%Vb-OkN~|l^&w;5xE|#tnpSvt+JQRUOccaA74Z>@W?asKun+4>9RJ634fn?qI%NQVsLUt>TZif zyZMD6vxt&WP^ckbZ7GP4Go6R=^&=TD-56jI-X>{26LEmLSF$k(Z(@${N)Y473N$Xe z_GB~qVzaddY_F(ch~T2=Zhxum0k5%lv*Xa?2w``|pa^LQ0)j&3Vg{sPIOXjo{?SHc zD@{thP!cy6xEdn@76kJd-@Eo)FiAKz)c%87m%n~9{wN@l0Kc62;z%{P~`m8W7*!2uhdBC2S=N^-4qPFZU6q?#;IrIW$Rwm6Y8_1<&pC% z#a4H*&($(hzsS(BLz!tI4ZV3+@X|Mt@i{<#DXvF2pRRG7V5~9qyajfB`C@IQl>Dh zCWlHqw#3frLOyQ8TvsJxk_MUF&AN|!93NcsrY2$eN%V(gk4Rx0fgIm>&WHDFvj<6k zRA^9B>l^lizs*v|5vvk5NcPlkY{>K08#5$v?yM@e6B2C}qpp6+V`!uXXsv>$S|2+C z*3I}rZ?sIo?dNBjJ~qq++D`wyrN2pZ$Z|20I;L~t8e69=BviqrrY#-eUNWYfbs5~u z;)V?yL}kr384i4YmUY(_euY=1cjk>8u0%l=sx7;l$aL>QYoq3V%((Hpg?=(A1}Y2w zj^s95d#3&o4=4gl_M090k=S3RwVZslhaU>m$6AZJJ-dcg>dqC=(K?{!wlg%w}o6Xfwzmi}plAw3&uN(ZAX7F{cO7gupNRIUKS~r6u!MzK;emEHn_g z;Tkr)gDe<4XA`cqVYx%x>k)CR-L)Huep}NI*zsjd3GGOWE#m$WaWh9fA!MCq{3d1@*Hhx3VFv_@@WTAHR1nvm#ep)(GGN` ziC$+ryB0Hlx((aTkLLG{96b;1=kcB_DOo%5D;V+&bb8LTFGxTJ|M!D|1WuN%(kYq? zE4;d8h$mJkx}V&=wmqt)Xs=3MhCckD7%|PQh$i+ulQzi=pH6q^-!lp;Lff>2<)q(d z87Vd81@;Z69Q)-gy+d)9GSogOr4R-jW{sTFn6BNrgLKDBke!KX!@ZSHT{g770NCLP zM@o3uf-}V{?ePIus%bjM*D!7tTT`kj8f`t<(Imk$NEFT@jpUU8#id=&aE%YLD*SFv zfp)olE~4Yx*Xg8z8)^ufc&cssI%DquKc8g8*pT>b3$2M>?DpI-q3Pjst@?j-3VySSGR|K5wlqX8wXG0?c()HH$5(L+08!4C48s6zc^QKV=d zE;lv(Zs{j?`o7i9ro+(%0{qKt{>bwghDfLcMW^50a}n+EvEG}kG(+k>qpWZ?m-Hyt zdEOmaV<|`A>^R-jq%+e5%nX1@i&LS znP%1bxLKB1lJy7P1ED;;NmwP8XBd`fF9A-EDI$tBzz|~1K6scT>P;L;`&w)Ocp6L( zKOgwvZiF*gakP6T?oWDW$(vqP0(Jn*8}-19`LxRu3C)$LFXOFWb)}xnIGW@dTK+fF z2->UQXzN*=Co$%*-w2mRbea#EhF#k<5tF6N$L!d0>c_A74dJh(nJmQAg<7#RPv`%7 zgaA|?Rn1y&YH4s8X6-*7{G>Da}Y&(zr5X^-|q~b)jp=(unqBSl(xQ2bj?Pc1T%t zjP}p1H&uj($VzAY82p1sWJAwAQ#I_@z1H-^{ke1_WR0M9-(@c?_4}or1b7rz5n*aQ zsZhgBW{Mlm0IHCb2ilQ-NcRrnhs%!;FZ;oCwW@-iY&|iK2w?I5eMGbeA17)4=G>B{ zKd%k$A_-UsrPv6j0B@9iqJqMA46A7|X}JUos`7=B8avfZ4EG85XS=k*n13#&=iJD? zGXtUbg-dNy#q;Z{YwSUA8fzkqiUf*!FwbLxUoI zdBM>!Cl$3e!1OT|f1ixSd^VC|*f*Xr)!saw?N+DQJmF0#)>Gu<+swqY?9p?`?`72RGD$W}z+21slyys>qy zv955{BwL-flIE21w?#skF9Za`rQA&Yvh2FwB<{V@%Q`tlwgtY8qV&&Q9jqig+U3Vj zog+P^Y1eOr7>wg>w>o!;FD_-T%|&NxP$GH7&|$l`YaD0MfTaVX6rz^Fid1_)&AMNg zUEF;zhGeQ#D(G2|Obelz2(2LNHNe`-EI+hnH?i*jpq2QNy@2i_fgtzwl@&J~IU)-a zAY|ckOnzxU+f}K|i2yIJ*R-%@?61MaXLC97yah}kBpY7>C0St5bi@?rv45h{KzQ&; z>msnFyO`gb;g%~&c1oXSvD=c=65D{847vywJ#M|hi2J}5Vu*Rgd+EKmyw>f5&k{!O z1my?)ZOI3AnDJs1(0#2pt+X36oj+`^m4%b*zBL(L3+a*2G*r(%-UnVbf#^(GfLv{zG}d1P+#x}W8Z2pzq#`tyscptx>A8wH`< zAV`^dnhqLMOp5(Ku7hO@R=yz0!oyZE)IKE^0eJ}JbJ=yWs0#JWeJf-wJcD-fIGVT4 zq%JOyzSr7%D&eLPa5(-S_eL`>NWzr2;0SO&;`l@Q4a|o1%p|cI8(^Sj<5p|dtU)cO_puxTz@nLB zq!+Ty-9%VXAIr*Wlb5l;4&{w9LPLAhT47gdUlV4)o{Mdx&#z!918c@5igG-l1h21G zkrnye0I{E8BLSs>6b{b1SDl7qlAZ!4p^HA2pAyO3?0NOOy9wes^%cr0M zw=C%Te@C7V9jLElrgTlN_Wik_=_HMkyy3IOX~3LXUgc~kQG+Sc1OM>OmI zDQ?NM;2vKf5A8?eT0QLZ8+Zh~;f=Yy`*W4}U4i$yXpCVA+1yihM3^EqH&5IADayg< zrJG5+P?L<%fT~KdsQh!(fnvlk%*yNof&T}*LL%mO4t$0hS~`Q}LK4{L1Mm6HHd5=z zs6+#{80-nPI33@& zGJ-x(A7;o{U~&Y;G2a82bB^$sE>b>=nIbVS@IzzVT0i2>BuYbow-qx1;#vFalQnFt z>+X2E{GjzYJ%wi*wl!65M$90#-gm^&RjA5%A!S^EU%+Z8=$SVw28v}*`(~WM(438x zWWwnCqn}q^0iAIeeb$7nj$^ltC!}`qZoA__5GN$YJ-uG|Qd-ZC^&KCd3l}E33T?yO z7`cV?dx~3xKVttAp_ak85QyJj4}$Sc4NPoH`zd{vFtw-S7E+u+j(c{nTnry4|*g&9iSz+%eZve(zyM}_}}dM z+N$AXrQCCA4<5dc3-HVTnSFhms*dkOl7klrpO)lG`+t43+)?2GqD;mzC8Ve-?In3i zAfU42j$cQ-I8IZ7ek(zyY=y&V8kq}}8%Z`3@{MxhA36viHUfF`kd@}39C3kS)Zsj{ z{C%}!8*J>ECM;9ly!~v-krGI>Lbx^ZFC6DKmc9d6m$gwmD*cijjqI2&`FZ=~O zRUr3A(Y}o9fN8N1nAZZ?ft&F6>!bLCgE$lp;tEC-_+E2C9BvS`cvB&*?*p<9m}xlV zm*@WHdw^7-`Vgx1=fa3TS*0--u-cYYgR{D1ig4p(bRaBvzfJ4SO~3US(MJ^USqv%h zml!lWr=V;&kJ>PIl#`ggPnCh5lya{?clGwQ6}#=-5|{|(;d$8m=C12^i#a9DVd&TK zX6m5nvjeH^*-#LgP4$*;-%v5Ol0E;YD26brvjRtSCj(v26j3%sYxz}{bw$O;ZmR2< zR&AXLm(Fvfg0r`Y*ciPu1zC2ZJk1D_SBXmjQe^B)t^v5c=i8kcrYk8j0m(l}mP#QSi z=#!C@ol|YL@K?XU_1cxKf(Oxzq%rfXtznQ_OzwrjeHM0|Q^xZ4Vk^=m8FIcvk~YD% zh=YGwzI*hnBN>HxK~o&B3zo*7@m=Xh$!EIrJBghOkYZ`VC3ln^=3_h#%b7GRZ9+n| z!D`T{H&7PNH>1nnD`7ajz+R*RnT+FB6l>KJE&b3edugl42!+~feY<@0IoO3Xh%xkH z_%m!F#sbK=g3!S4#%Vw?^d{0$*rOlrNMXe3a7upi-JrYy&9AAaK;Ii0jIIya47a@$(^QmD zJzlbtw_2VC)EeVyyQmN%PlQzJ)ALQi0M}_=d+v0Y45868R0Ael>wBctJ%;ZlesQfA zdzT2p`tpo+07XN>$M+3+3_cWXGJ8i^T)y+CzFItWrwVjWlx)Pi!td0UoS|(TP*>rH z=A#Z7XsPQY&FicoSu0BZ(@UlYp#>*^6v~^L#7FuJf?5*dIks(J2kZUI6~Bu2oZT*= zAW8-E#P9&w1m5LS$mX%67mLq?+Mnj6lG|BH7+IJ2bhk9-`us=XaJng=LN9fV{ZM$0 zIl14^AyMn+w`U+W54zqL7s4u{$Sdw-P{%2{vH@~MaV!U-{cgIzsCCDu$sNK7+r!a> zZTh}TDY!So=e{}wV~o%MaY_6Rf~0LN`6yT(=~tH6mt@nhzk44KWWb*s7pL_8S+@t; zY#dvUO!R{Dm+GtswcO3QFel_Qxn#gJ^aGPfeS%Hu(u24no3NL@b+s>&R2h0yVw&L< zwhd8UO5Lwxk+_}}L7!0T;{wwzKITocrtxt&zs0o!3qcMorP2^}Xttar>#~OOz8&5g z=-O2SOmqIKQV2XX^RW5!VOYu}D8j(RYiC%YVd`bt)Fo-+b@}4+z$iB)+QJsT zF2nE{ojqrPqyt)^R&0hWw|5R`~XL zp0@E#QodKZ=;7ZSprF{jc3AN08)v#gGa-7!cEz?I*_C7>Bbsm1NG3C^Opl~5xacWx zR8$)AI6;fq$rVELudt8bDlPUl<@<5Q&VjK`x#7W(@|a`^MI~HtinSt zEc{W{f)~|JwVNT;LbR(&vZzdfK~># zgCmQR{ra>pd1pzQ*!q6mxbtxa>?1ROz%wMIENA z{QPrD08lSvW7d6t_|n{6hM@+zA2cO{$oeg+#e#}>_(IvAGT5`cec!NGfZ+g{n*CL^8l2xBWMzhl7zQp zDvGUJzjsX=ob@$zdF<3mmnS1bt`jEx!jm&zTQ}t(;waR?Hz>p5EY3rH`X` ze>(mLP4HY4X4Ew;is*;bgQO@?pGTy=y|`=XZ7;4NJ@n)!wi6i*gBkb`95rV0>ZYe` zRV739LEDCOq`Ci(a~s1J`nwolk?V6P)U0qVvN^QDRb+@J_3-(PyF(#8&MXqpt4g$N zk95nh29(W3@nCpI=V^bw0bWW^Zp;@mZW`@3YZdkJM~y}TX}|8ehY<%*=lkup{g~lr z@xvw59lmwsPqA50UMU(^o~QYkgkb9&sqO4rZ5{es9wZDFZSwK@$s{SjB%?=S;3nW= zMjbIQuR&H!06Pndy-i>)-rSM~dMcJu``V|6DsEf*^;aZ5w=2(^cIQ`vJ@8W)h zac0Ye-9@S!`o9|TTPgOTwK<{aWpQ6CtJ#qJ{CWp6q4rAsKpzLBLi#*#7@Y$26?ox< zT}ZjEG=p+lqPq?j17I4lSJs6nxFd1FshJDPl;`8syBfK6d;?ppV2Qj`G&SQRUJ%e{ zs+3~95BfF6(;ssnf;j-+ulJD8w7^~PQFo5-Af3K(fwcg%mD8tPo-mZ!n@-08RCZTO z7fS$%w%?vRf0QIwNllyHh(&ItM1@l!kGiST6PSnR4UHk^&cX!}>J_h+beL|C(0}P- z&?gTsC!?og*m7NrTOPHCyc|+O?e|3nKGCQBQvtnztjOT1xNjTLBmkDbHzr!w5$l^s zwV{hLaO1C2IAVe~{xLiL1SMcCJ|U0XK!hiLAPuRbHWR}UZj}f>!VUd!U{tEAS^pob zu?3USS4?2#7bFDV?Q^|SpuBM@lZ08iuK_sh3Plrz7#j=%hxtNzN0Z3D>RQe7+}j2+ z0S(|{n_>$Ch@MmXE>TpP$HdL+R|mR0DhrU^;sS_?-a2uIIn|LmDq1s>0|BuRYX9of z-%z(g5ZTm*FJjDP_I=rs7sZ8pPZbPgSnqR<+|=sqx?A7u1W)dCQEVWHO7xw180IK0 z`syA0NAKDFh!qZm*+dWox`pJa_;W{)sD0W3XD%RXP?Q9REIhuW$cL~5dg_Sh73?%D zqn5fxPU~lp^p-c$J8Rs0col6J%ieNL)Mx?LG42FH!{(h91}6+Gqwx_YwcsggK3^gL zSuz2sJy#u+^|zBU&s7zq)wlnd7lro>>uoFcW>{v&BNc@d-XrkEH~buN!TK=}W%fQ` zdC0j{VZ)R3RbSm3TN7ze%}*{-fBvP(jc%S%)d;9t)Uu{FdU#Pwq`f3)qo}I9)m8xz zxj+Kl;8)mkDsbIMj2S`VZ8KV+ZoCYp*@|t!J`etAY=ph^)CCAcYAdvySPlMCFYsnlO5T7Xoym!XVST>mlHHa9cP z-xe8-Uwhlw4`6EkOzvEB@X^5$Pbzkh7v#bjz@#bv$LvbH=6UlGLtj`f^2~=zq;t~( z-q=qTU*WM?cb;z(Em-$%m@XNdjB%Hq2Fa!9%vCMQaag0m-z<*BI||pI76++|;eWSE znI}zlyY*8Jh!ley+{#_FNe&3gdKy1HWsLD4l>ak@Z~W_G&-o@!L=`Xtyp0ZfFuF1= zOaqamVXz1z-HTWOp5Yy%AcTcLj)S<4bzV`opN@~wSry77ozucSC&TzO~66G-bT=PLniWrv>YEv^BYia$~;B@wjoA>I;c8*r-CR?OX%t7Dwe` zjbc&P%wF~#UybqaY2tU#6%#a~TJ32>;&NDJVz%DlZ87< zAkDs|Isg^8iy4Nm*`^d1ur{wI3a&d*iQ0r7MJvj0uh#5o%nAx<0%vn*%v*(cUVXHS zSb!t{N5~c!+}yg|>~dS8|Av3{p&hkb4l(xh1oFMSc+IoS{xYKn-pllyfK)xhxGwi$ zM6BOBf8&V#m3uQ_>qK={znDI%Bn!Upx5r_v`c|iJvO;W?{n;XUzCW(mw?Rj}pcS9b zHvA27YAGVwE5;qggF_3bXG9fbS5$j`s^n)-@}Z}jw;K8bkOz&wDPwA*vrJcc#;Byo z8-v#J7oi?^tr5C2)*G{E1QA-k`EZwKw9o7O!bDt1#LOcgUJ+?H5QV3&8#8iyvJ&cgt0-9G6HOf-RE-^vDfe2r%V#+}HGW5C+IMz8HS4wS6!WWujVv*07w#>6{qlVK0 zv+t$I5IElNU02cR6O>GGf7#+ebe)L%Ps5bqqF;ns-_{+~Z0vQD>f;F&(8+g-ps}2; z9-W=_v8*?EbY8Fvu`;Sh05wA^ivMnr5+6F557GLF7T2iV7+aEgp4)GgQf-mrk0+M9Kc0%Aa+ZTu&?J|;yN0d+4mH|n7 zs0$iP7_24ArlFw1Hu>*ZQN;LdWN{dyuH8+3a|A#*QToJ!sh{ zwhC#zu>hU=sRLn~EFipmP51U5b+#iG7VV*Pn{P${oDG?BFA`?`uwUOq*Rdz~Ykmb} zxU%R>b3pj6HaDPj(q9vl15zbfJQ4DUelnjJ5ZGmBNLB>#2g}qu+Rhv1vmAG8b;lrO z)yL(m2? zG=vMq6!~HJGfvS;C>1dUZGa`S4o=Z1l(LXG=C;b1c`DqNw#f^VE!uwC!Hl)Crs^@hXmhxpCKVdayneI1Hn4Odaih<-EO6heMkdQw~A}AKX*Go&!dj z#sANB+&}uuO&bKky5cbYI#LH%)M+=t$iJtwYTY}!Vr=1KIlvHUIqM3rC3@Iu7l$Q#2)e4@pA0HM190-p@SYr0$@0%hhT=cvl z6?gKpi!Er#IbN508(H`l&Y5ZX_s^rua#cj`tZ7!$-gKm(@*0pLD^|wW)GgNyZxPD? z2iJ6=oxw+Sgh{z;*8JyRLUVVYYDgL5d8(?D6 z5pUrJJ#EBV)65B|aQ=SaN`!w|sz!H4pGnu@FdNS-{y~8R{V&K|t~L}TG%9pDCv5n7 zpSAp}G0!5+^@`8j@cd+@D$Qb3FF?IlK1Aq4VW7_!SI>o7qxO)7wYZNPthy1z6C+RF zLC1iJ!mDYzBhEtaMkm5oepdotkp;a)%pKG1mL@95uG@fYGynp zcK;wP!MhSt4r?r_z~$k*1vXNCdZGtf@$W+>{nT=5e26+)LPp|p)3(w`ME6lAIs-=2 zMn>8GLtF57!?)?3Rs+`Ksfp+1;Ws$a**k6Z4I=)0OM|@GHznyXusN3*H#Bgm=cxJ^ z;Q?p3%=^(}xw(33Fj<;(tij8)#aC@EjbGaMpVCiXFNJ&o!I|GX!RmERh7v}&hD)$C zw=mT()B$ar(OK%WG*84PI%lP_yBq+9N8w3_0mSHthnm2%ryKuh%FLUfR|MM3u|n15 zsnnfEit>2@H6Qq_V`##8p+q12?kM{;J@wy&`)$Y+UIUSDVJpJTqn=T8VLeRqTCqg? zYc5azI5%C!XMgptJxqtth_bud?B{Rd00+qabPV+gI+S^$mah()|ef9 zt6h@btOriW^@x-`)1&$?4J**a)w1*waO&=86v#UV5F0Nao1Hu^5dJNxt0y6)g9~Jn zW0BOYj3S=SbBK5R81s7y7e%&m9LrAB$Jr_k`iaCyyp?_$USvdSn!@@4^%Z{uw2dW% zHp;<9fpow{3`dB5I%;i4pC0{Ua45DN_LFP9+b58XMq*CWlC0?uh*}cQ8xNyx`s(Ix zyjU^>-A+C5OZ{!5S)!oNk=rWT+6vMMPZbW>k?H-bz%o+PfBbTgHt#S-aGP#WaUq!D z$>QT${V#fiar}L=h%gyc7Ex|(SIXeNVQZgI2DL|00rl8D&{&z5Q&C8N?Rw>(y|Fim z_ZxkPg8#xYhO=jZG%~s6moaZM&*L|Bo1ASEfP%GdDjwKxJ^y7{%W^a5>&Hyl+@9nP zwi$>c89q<=Zr87WXqqTMy0iGaR#WpaOz>9ZLr#!0{~*aD;zBf9;DTVg{11md;i&Id zckr3#t7W~Df9PaiJ=w%$hdf{1P^{&6r5nLP1AipTv~bm2{F*UHU`kU>RX*bYoA3;@ zt`BpYnN&*~KDnFLe=p0d$WMwK$;V4tuF>_QEr8519ad{{@N13t98D8x*ydx}4?c(h zFbnv=Ij2`GeqFAO=IdSF(A0O%|4Rw<`&*R!i#R2zzd4RW?ZoYk`gik6oN)ipi+Z{@ z(;a)s?>&=mRTtCLGz7v3#*V!?FOI`CpaW_NyaT)mdHb5_ysdvq2z6seIPqF@NS(5- z4oFJdc-ax<^jCJofy6i?(>!gRA)Ui+lyWZuw-0zkp2*G;{>Ww00oWv(Ak(of5$$|t zkKZ|DOA_RluX)!L9W#OV!`#`#G)C!>ZN}25_Fy(KdRA$1!h8nO<+#8~?v%8LKY7)f zp^)LtO7ei>NCP*!VZkU14@mx5d99_xdn(4ifQ|%@5dRf-mqoImsiYUWEI65u!9Hnn zXO41!Iho9}w*>LfjV0Q~LJ3E9i#Mhv(~?*kj66~@|9I(O zdMqyrQK72ao7R>sRhelATJo5XkhHcG{lwyy2x}Mu__{Mwdeemu+yQK7y?`ytBf+`hiq znfC9YyKlbd->Q|1(x=e=Oay=Gi_0qd&{lhb~{ zW&_hW7B>zevwH|-Xz)Q+-ntFFOtRdoIojO@i~aCv|x$v5&W{6s$`^XiUTNQPQ3TXv2zg&FJ2> zIcPHgE}O&W0P8{>?h-%UMz9qIANUuzXHTO2o}0`;W0=+qxp$>F=49kM+(fYK6WbXc zX>T3YX}2Z$ZHLI)FL1uBvZLdqct_#qw%{xJy3^~Xj?E&n)D2trRemCY!>WSzr=uex zTPyQE%k2hRQR2XBX(z4mi`~C9uzP3I%hI4#$Cx~ORL~e&MXRN4hqFY51CZ;((Pd1FnF{?ErCr<`Plmz}uZM~a1SpVB~C}1L9EnaS5RNV3*itOIvp=n?yqz2&UP>CoD@6kI7*urOaiRYKvnzI_pWj~He9aW<|WCuwF@~3l1vBn^?S$e zb{I1QLEoHidgE8U=&qFf{Yyj>{m+x5`i$j(85I72Auvjc8nXn+RW=KbYdzQAgA}v{@i|9_YiAw_+bB`?)TUOj-hsl5bN1yb0@id6i5ecm!cu4g z&$0;xv+A0{#J$Q!75~_tvp6l9T=pARmoaC?<1u_P%HlQ;sYVEZfh%ZSnTW5Xgv)?^ zR|;-8At0T%;;!y|4Is=>cBh=sBQsGsgK6g~W~(j5jr}C@IoS3O!4fEX4x@HXJ1bUG ze>nlf1+@eb0jH)Jib%Ts4i$I-JyrNU3F+}uI6VY=fXEVdRBcSjx5_@lB|G^ZeZWo) z_hnary=8eat_>7T(t?EFRYaG8;Tn`^i$~yn2<6yzaT6F8$yaCsB-6g?oaRo1aEHXeqqOcrVZ(UX{QiCrD4@Wzyqj^ka7XYZV^@ZxV9Kw;i=@8! zIi6J+?`L>n>r|>lbn?-*L06xBV4nSWUZp%iZGJmsRtRK4ZhI0~nxCBkD61b;@8E4H z%liRSvw1ijy|PoD{Fpy+>$*lUbi}sgyo9Y1e<;%J)34AjSe$%8yX_dt3Qj~9?oZjN zYc_y?1ejC2%#Da@idjrhp~CyO-%ged*%Wl(v8}XF=R3iP z)*$$!6jt_R^Ah9RiRh6jcwUvWYW#AA`>dcD_f>Ox2Jx(}@vBsS6=YL9rBw-U&RUUY zlN*q**Y9tDO~;m7i^JY%dHid2tIpN`P633^5-AvW!X|sIm=-?C?9dwJXU+)*zBht- zm_!b$X1tRzEa8cAOO4FL=svD>u$f1ryppP}qnosqP+cGPEFABn%`s@dOz4=WDJWH$ zgb&!HWk~4SvO!EGHN57l`U&&d0wEtYSq-wOro##sPks6MjS`>` zd>Fw;Y~^KTq#BrK%kW!?$5DoR$R6a10WCP@HcYPMK$fa}dH2psg_es{Tn76#4~2+D z8ucE@c~Er2Ru1>CzW&^b&Z*N;zHN06(C|d&zNYU9ke&8`;Dr6}($`R$JRA07X=pq9 z&x-2vejft?=UbQciMT9JbJ%D%p(2L9lR)0|q?;IjAO1Z~Klei&-X#mAY z#|;g3>{$PI6_UdZt}ir4;P-)Gd|}Zp223^7>2LJs{qp#+8joiwuyIS_5sBvj92kzH zI=Od9*M_e7X0zunZHJ#sXqf=m%$l-x;g>~UvQklHAQ1w=7i^z!b}9NmDKo!UxH%5^515iy|SL31sb zMlMCCBfCrA-=(d7A3AX4I;XY7&t*zplXubr7@9nH!0cf*5%!4EcTS0;IEyCA#Ej$#12cPnHN&ecYr0uR|f7~pC0W9*#wmSLX z*P;rY7CZN}PWvDz!n+)rJQ>nJxom}4>R|I$!Us!lb&10CH<|O1Gt4V#{mg~j72|^u zcB(g4+%nv+!0cr#ztW}B0W+!niuSWg#)gpi?|4qqfj_eDuVm|F6)(fvfHdWQc5dp2 z@!9cSTN%llN=R0%IC^gwnd$;o8wM7tCbxP0JJw)oXEXXME2D%2V>qU1d>AR0{L1t_ ze@m%U))8qbpZ<3U47el<`;u3VeaO(#3{CV(mO05}bFR>DrbZBBho6>UCB%WP%f5y}*6sf)5wJhLkph5s1sHz%NO1aA&-r(6@+s z+eSPdRL;(x5o-nZ@v&ml$I7VcXxpeY9@*>|AUCC+ zLsi;GxeR^m!oceJP(UtcBv*YBvxfL~u~6oi6Tl8hOI1&&hxpSPnT0o7XO8b2qkM>= zIbnU*AH{hz{_)uw!{ES!#LVrnPa#}R7kn4iC9J3Qd{zMW;i|xktC!0gB{H85NC51h zOIz**zrHaQfTFkM55s^s_`UKWj?66&eq)xEX6DY@J>P0J(p^%hiK02lbr+M0EZ+xn zg{G2g58Ac(UaH+}0;z#`S=Y^C4;f)1o#P})Uh#2FtH@n~N4i^I^K zmeM3Vlj}8$6=AHRn)wUhD3_;rjK_q(;U2*}q`?}4fCV~rVXT5ti4!xSh>=A(!7*bd zYg3q-D?rh?v=aQOnRCHF?tm3cup4NInr>3@CM0+IcjX)98Lq}KRyEAg4N~`@on%E1 zA37nR9WtElnN{0>j&`HD3qiY%33le+c`G66rB=1Q+#=bxQXm{Du~F-MtU!k2gK~pN ze``g?n5Y8N@raox5olKK#w5HdXLs8X8N|nKQb>}3IJN(kEeRmD?K4ncJypxQKkjt$Q8e*tBHNR z!}m4&Eg`nvu%|MpxfBPDvHX0SU>f-_qnHzm^GNcq*Mg9^9#ni#X*(v_bA43Bu0fR8 z#FugKcE6B2)nO_diS_NWFuS?O5!pveya{foSFuOw8+N|3jc)`oAsdd~!G|T9ulCcb zyJpHj3hOp^q5pf%w)Z*LCyV$oVC5$#YdsQ+yY7NXzPt~bdjNwE8EBa??}g5`C}4-ctH>KIRA6c6gpC+E41&aK%ZrChR){556ciokDrR48O` zSv0rOE~MxWSKc_uY@{YC{{+3oMIacg#A6u%k4q$e^vnSmaAG&2E3>DZ-)S|+WsY3C zUfMbDd;t=AnCXX%PY`&~ps|UHt=W*CR{0VEj}n?_rO{jk;1l3Avg%m(BkFne_J3(R zVS$Rnmzr63R3EKjffhQ<14bql1Jm`#C<5z5csMH3eo>5PMtl_>I0N@OpB@$v&bWc3 z1@Z>&A+RNVkX&obHG;9_mo7;QYzbt}iM^~$+&5-}q6%h~u^Y7TdHd@nSa6@#=)R~c zce!cCOo9(z4sck@w4lV8T5Y-~&79pfO&hc<1W!1y3A>$T2Vs~PC?P9HC3Tzrx%Hv= z${iCz^tWIs%9nD`>=m$fAYQw|^NX>~L@1sR9px+TSx#?ek2Al%rwuVJJYu8x6y;yZ zbN&rm)#E^9$OlA1$BtIAiA@K+<&(;MRa(WV{nP@_rW{~BD5E6EL@B3o-47;fQB>qb z;69&=AwBiQ?EE~z;`!YNX*c_INk2hNRoup}Q4G#=pZOar z+W_Zb45gzkHbKQ*rzE}lD9qIbhwccJLgD@LuD~*A@roTr`L1EsCL;O{J!}MeA`T$A zFO91UkRp5;VYz7E*PjebOcby;bf5dHwgMK}VDZqCz76UmkbX=W94Abd$W*g%Lu@nx zR=d>EV67rcwfq18D|WC`y)eZnAL#Od+)?l_2v1qAI`k22;`!#SO*vN4OH(Af?J1yn z*4GnLF;`uanvd#V$ClU;Vy6w()$huY8XN6a$i5pv-KY{a1`@*6#K>zBAg*L{ubYZr zY)X#T371>8++dAxg#KQ@t8H7k_>ql1@4>O8t=_>9%R%Fk>>TY(m>UY&oP`nL)EI|y z3S@@XRL>zLRlJ_l+GB5N4!Ig_2$&_<`Qjdh+sLg~?iFl8*LBDy2Rwa#4!1c>X}oPO z5~#PpHk;~N3^!@hz=g8+O*x*<&lG_0tpOKz+1uOX$SO@g;)#C*C>+{)sB1=q7ZZDC z%D#uWawN@36mym|n36iwF5kT?ry-=B7>z`h5c_%%)oq(ip3v|At6ab0h)QccTo%@L zX6UUz8NoVk0p6gOwN$?o#`Be6iIX%5)r9?e`y~pto-!Q8*EL;{~V>|;EAw{S^ zQnD;>x^@E2>@zIp>4?@K5P0pFu+5H9a}8IAy(XL%9i;Qo*)W(pL>2N25NQj};j7O- z70=rd#MI_GjJ)>;aRc!`?Oyyv?39d4jKb=;TaK-Ia5jT9(rw`O9XHvvs**)EY%mkyhSPNVNtz4RT4M1 zX6nq*P3-alk4Al_>HBMKLfShah6=zL$^JdJjNmWiQfLs|`)5*AOBW0la{dd!#d+4+ znlSO6W9EbNz`_ED?vR86FMC~LTx*dqFi;-)D1 z_@5CKjf|Ao1K_oi4<}CENE98pH8W*@UY-`Y!{%z*)R~k57YuQ^J&~pXzp12ZA`LX2 z*KqiteCa%O4t-0%M@2KY5~90AHhKE_eETlWHK0K~3XBJ;V(KJF;pel2Jo zYOp6-$x^sQ`?Y`cjK093m4)EX2qew>^N_exujiAsb7XXa-IGzR5M3|IjyytIGR@rC zn>yw%1jID*VhHPIz+pZlc^`j{$o>IY=`h7DPBjbxqQ?g`zf-JY!6uQ~rPe_s-qoMp zK0uRu0m)rRz5g(8ZR@Hm&sWtP--;w29Hh@UJcF3&lHitV&H#CcIzs`S@fPBojEkfr z9+;&{4Z-Gip|z41bld#<`zTT|%)(ar9IbTd!#;Tm;{yO3=21Kumycbc^+yZeJs_80R$s;!YMgzX?x(R+E_1kM{6_Eg_BjlDW3_^6?4|0EF)j(VpnA07k-gQJ7`Rso~=fx z02hquTIyc78CCSfgbAx;iuk-98lO^R@w9+mBP&|o{g{wqHc#T_P7P0)>+ik_L{+j^ z<3IMehjFJ1@696Oe{9t;f6N;`NA^#&!VPob@TJJ;bA-{(Tw+r@Zj8BaEErUnq00$F zK>2SGJesfktL+X>_8ZK_!HtKbTPrHwhqBW`$iJ50SB~#~LN0OsZjWa+pU}s# z9*-HtqW3b;DC9Y-TnGdOXYwV&e|4)qtMv7xvy$Un0JwQYB%h+!HyHh)taiIR>&7ig25u6{)UM+u)8H3RIf zYr(DDI{27K{|}&BhFm#5G%w1CFh94Z;ndzhpxkQG?nzIIjm>rgb-LA8QyRWpa%@t7@e1V8|xw2nn&z z`HqP#wt}V~)@3$zCbi><4hd8W=aMAj{$JixFgHC#DDffV$}B^JIih$>1pgl8zw}{{l@TqPo|>Mb`tKphZt5GtFCc&y=lP=)0n*| zq~N{%+e0WU^yj4R!t5cbjq@K#C>^;ph|Lgk!c6n1Cn=pkgUq#TJY%m6okT9^ECm>< znjmB*YUf$9LXCBqPdD*1Tdu@?&CYknZA|U%C2fuFl3cCWFC#1JM8Is}mLCHUAl33y zz!r-uOCV0BheSN#)e>z|@4jkSlYtd!dC>H~{i}|yN&Yk~5%~1jp4~Xl8$*?%wc)+c zYdPEl*(Er!Nz;5N@}=FwB;Fo*VHe!c8nwRm?Ea=GGN-6^4x-e-XG4RPNoUul@h#f*i@3FU=H;kR-lML?wCP z{MGz}sdM#Edx3d>NBn%`DkD9-M3Yoa95rYce0)=`d>;%TPdt(gg@W~WyBwP(`*X3% zB#32<20cpc<$w&^T+ml`ctDRHBk~nusd!xjq(guF5Wj++tO397%x&%9+x5_RFP-}E zn2loUgJA~K)fUNcS==pY(^QjY?B`UM@*=o|>_z_~T!UlFcEnRz|9BSClQmjHS7SbF z{xf~PZoO;}c^jnJup&5+vG7-BOSf0OQYft$&@|WwbD5XOQ!E2dthT5dE*^{UjM@bw zQr5sgFMY`Jj=U%~E0g~;BI>)pk7CYPhVGU0n>M4GpyRzqo*IQ^6o-9Ba(*Qk%Di+I zq0ZgvOJfe6JqrWsz)`tr3Hr6fYh?ZTP~w&DfO}@#(ikZ}ya=nW-i)fOHxl$O2+Zor z{y!HC_{-RZez%|jH;%%i&m}xI`fd5QBE>!G%{5;tu(2W$Npr?QO_ll=^8I(m(+;D{ zM2wL7-9}3YXA#i(z&7Jqr+eV`FBvsHBWiKBH||gqAvGj!L{Z5eiRhYJ)evSM8$umR zd>#bPNfO?p05WNXWzG~4piOMPa0kTKn^?DT%W+tcnD%(rEjJiKNq;6-L+TbWlgZ_S z@H*Ef49ecm=73_>7r#_`NI)lJY^v1)aUMeUK6D{fHu{Yv6)FqWQdo#l2Dg-=&z^}e zb_)+6o(#C?s2e1ZL?$n-RL_l|&>I&NtSY4N_Wc|gyM@ivsO3=uW{l9K+(TlYpwh|% zg~?BxLKW9mO-ZdL|DK6gS@w?s`HJMhdgy@e_|G>wNl6OiFWpsvDRm4xg`D)RhL>05 zF^V>>WbfFDBq0L;^z?VR+B*F0&Bd-4fFKmc^m__A3XV2x$)mO9kAJofO((w7S(>3~ zaK6T;S_QdMIqJC`)x1IpUW*P0f@AYVP>2T@aUuiQ{}-FpFhc_*i+*=!zT3BWYd9$1 zz!c=Aj^KC<^FD3V3$0P`0FAIO9xRe4zinyX1)+)B05?F$zrAa)hu$Qj8kZG_^B{+zf z!pbA=yDB}Nh-@%Gd$GJTNO?WcM6Hvt zan)bi;xaASr7R5jt^Fbg%tf$y<=P-y67YksN=ow;_`W=am;iB%4rIZ8*f}PYE8+d) zwn2#u)RGci>eZhy!|t`b%gvf-R>cy+~I&M@6JiRizs|@sE04BOyi0?C0miM)B#6eqvUWjpMjC>(D1z->?&4iw8}FW(&im@v{hh%lsMyrsk7*-x;KA-H|zi_PzL2r9!l+aFA+@=aS2zYza;&X{}vzef}8 z34|(dN$~>!*gofr;9{^nw02=)iu?bN#2b5TXl1lfkm~Y$%b=yH3AoR(Oz;KxG{s{M z+bZ-OQ|W^yit4dmVt!t@zGf^)Z}h_LqXW-<11nemI&zaWazmdx zDy}~v_pEgeIdg1R%8{f+u>d!qGp1B;lQL3C%iVx@uhEO!bT3+t3)CRjS0N}}u6&OdUq+(UXE`A zo5%xodEDxJ(P_V#K=G~uR!!Pku2Gke+Qb=I4U^crh{Axb6#Et9m`|R5$CDu({8L1+ z1G)fmx2@LWm5*f=dg2zYnHne(;M#XXHjOIv7^sQy4wOu2woH6x#%JZxg8=tCynY!i z#tWag{Rc)GYFP&u1n6M*^_QgZMUG>@k+D4VF(1`lx#)G)ZjUXub~%3T2w)os)1CL=m5Z>zg4y!TX-Ge^gAJlR0PZ0|XM`0SnDnp{mC9Mz~lhkRAVISBg^9p;e zJ5d11`65yhnzYtT5Wa6oFPhjxBY2)-2yw&-)SQ8!?_coylyHKqZ>_cZiB(^n$QX)K zf~Ei6nx<$r;Vn|@8j@87CLVvEg%A?zcSv`7e0{Z+gR}J>6f^16p~c!MXlbx-MfBze zf)%D0wF4MKn+*M%46NV78L_0*H8T`S`!8m*w^>lN29~KC&)a z`%dBB3|ru;(;A(V+3^rnVktvNalqMgm~!>_FRk>IvkE#6X-W#30ks#`ECa9!&iPhU zA;`|ycZlCB6T9~awKCh!5g!_u14CfBnlhmFY1GeYD}Zxrxm&CX$D01VyeoB&pTpLH zPirt0!gDYZ6=C+%euI9}`QbH7+TA%@ZQ?ZLgpsI5u0 zgDo+DO}@yeG&peGj;5Kbmca`NO@%2Q`cbiNb+FxXExiMLIwInWjTlil*!wdLDp~@j z!M^|?=f=zwfigx!ogBF<%E0vsbbK`*4{M z8*xoao4AXX)%e{s>m7!L2i8U(SiVVYobgYnfzjPrW7XZWY!LQqL(xxs&{mc$ry)Ib zU&fXQu3GARVKXa{W*=qP5upLFZNTlS_}9iNr^=U|OS!SB9Q|*A?k%`ylq*Otz?TwLxfngyYa=~3-+eRzG4}?z1(7|ozexZ8jy{}SNg0j?p1-MYkQrqI zm9gX4`F5dY?d+b?$;^$x7}?4ft6961!NMg00?JbhswHcD9DnnJqGQUP`1paPOV$vw z@M-HC`yXE8PqRDfhlq66i=fY~ac-bfFj}_jHzT-ozLthp`dKu?tlkfSSdc;0md11s z&TH!s_W4doGa@r&mV9Vz3NrI~G8?TFJv7*X!bT7w6BJwochkX%CLQMUoR`itu*3A7 zd5?=N!c|cLX83@w>Nn8zk~Wu;qEO~-O>f}fbxk&5$%HM{ctVh#rICI+r>h78mTp4Q zy8?l_!+Ym;fUH*>w7k2ZuRkQjxC@wvvnWta+}3ft+QcK`rU@`!^z?OM`IVY_-h>jx z%<<}V@qTdZqsw4`-@3)4^t*KJMuYl8SmADq=7}nf#_OWSP)r^7lp3++ux2Hmao9m9 zHJ1UxWh{>d#F$duhI7b4HKLuH!djoZ#VfQWUBqCCkM0%wR*M*h4_66ZDi0+dGWr&> zFnL)~Jckd>f;Ob?$K)rmGQoNrE+*A5@<;cP816|##tU-)xr0n6nI!}3-i7iIPtJwO~WS@rAbA)edn@ur*vx={5#cP5#QWLxlwF)}u9OD0B2{BVC&%4Q zDt$M|6n{#8oI%`30nodxscMKU`#qK2R!?*<*Yl;5Jc~T)^$_HT4wkwsOqpOTgj#Cs z|AzUaLeL(>qeJ`#+u?(%f(t-YE^cA4wceuHRum<3fe|1_9k@P))mrWZU#c~Plv}ty z89JFa4ves(5ud(J2hlIe${~BAlRs=!aE0iHE;3k&54)u)PU;}2Uc-OKO6ZL+;G)C2 zgb2FYQmT8ge8&*K9MHtn;nyDl>P{>sSBn4XAn^z*E$U41#IaAmrfjabCB(5YEU`h8 z-q(rx(G)y|c-ch!fRN466u(tBn$_=(r(j-@rOekh&$5L>?^y9;WbPRVYE@X4zEV@W zV~AU~QtyOO&5xOjnO%w?$Ys#f2Wf=7l&eb;Cgd85K{I~kKkMkon2#^Q0Vd29*B4B0 zOs~L6{2+2*tpIAxNyhuM5B;MZN9khk#~&(8tVGb9M%idWuwQkqmG~a4xHSAgcx&43 zu#Wte;uiItssurLfyuON!!4v1YW=sd519ymy@H;S_VE}2sJ#Fu7M9b1PG8E#)^$W< z@)R$EH+(f~N>d}GE8I<$3zSXDVw?gQ-hhLk|6++uELPS|#X$RI*c8J%*JdNiDC{TBYO~5VW_qf#ASZ-(Lpo9(KtZP+qceLrp`R7_GIiV;e9^m)tOp z;C@RbY=L%KGAnyu)6WM=^Sml`!N*5vL1slA5d-yo6fSye8jmQ+jV#{cS6{?~k_k!7 z{ZuaHIt@2l_zE5ZY9lmBjYr^nH{fkxj(i@6H-A36B4wDzL9IbG{zAopC;e04zk+_D z76Kolu|Gztu?!*0H>I&Ohe_f>?$Os}G8D0jN+d>?B+XIGRLH_|dpKnf=|LNF*8q|f zr!#6AN|}QS7bMA2Cz9nr3NR|M&aP?Ic}T3wcNGkaGhrL5E>(HU9E*CD3&G-WsnVu^ zU0;<+o`iO{n8209a$M|?+%Je629B7Y8y6mq^vRpaJ+V`|`OZ><(phQxKPJJiqZ{Rf zm420zZEDGs^Is(~ygdyUoQ{G(os2S^{5 zg3A(@eIBVYZfoRk=lQ{jvpE8Z6DswF!xKBJ<1q) za}O68Ha|pc{My!)JF|O%RPMb{BiUF1bqUz#e&1!?j@VyZg@PCiE-0MA{{Wih9gO0| zR7ML`ZhPOYh8RpYSFI2Zi`4g`pf+m~RH>_b;3K1ctr(5kwzQ&hg*+1F$?qG_8MGD& z?aPJZzZbL>==#{F$}CB&!P4~TIj%6sId}*n6Wfl2ANl#u?L5K?7Kt+=`c;&JL8^9s zyCX*atdbVK7mU!>rv~j@ZE(Ar7`|yfAu68vgdsaj`9OtxCK~E0Z#z{#|&m^n^epN?R*!vO;0bQ#`G| zY>ox`WIDZ;=@6tEU0W=xO+mOU_sJ7PQ8jdWV~H-I@$7}u6*N*0nKcARzVsaP+3Vz> z)`Z*|Ci-CoZY(fXm;a^SFAL4TahQn0>7OGBY(Bl6nqsraUcD&W)&YoZE8=4sW$|a% z7Q0uOIO06a4LIl>SoiU&Dk{9CUs|xx_D^%2%x8P^Y>*s~z?+$=<v^@bs;6Ia4PIrUJ# zYe?Z$1yd##WbC^oqfdeggjs#Z@zKr-&rz?gW;C$OK`olrr5)x{0i@Ll&{d6`v5TN8 z6(8JOxqm~ZBr(PHyW}bEhZ-)1;ikl2L}wSuY0O>>lt~(^!awoELGUY13<*$(ZvKTB zPQyC_w-&q6G>DEX42S&s&3?BhZR0A{!(U*Hu@%O$*(@EG_CwZ~iu zY?!=phucnWvHaJl@~Y06M;bn%4HPSbBQOT)Qx??c0onstkyWW2N(3(b?OcT-RS#vr z%On%|;apl^rO&RZIOl{CmQr)YE>we-oX&x2S+NjAa2L!2Qrb=amHD<@7uyV5pmzWj zJnz{wxBZ3wR_C=rS~?f^s+)yzVb39I-m8TMF$qQ?D(WcNn%um6zYC=~y^9kT^e zDT*8RBROwtTo+v#x;9qmnWUCSW7fu8m^-jOr+slSQO0;2!)hg9=KyKEPt%XEScik9 z1_09ygR;)wfrEnd7D)m4GAYTcUUq9{Isi9Kpm$$5RxfF|@gSGGd}(s?_d^$o<`}R! zvb$Wg8N)XsS_(I_7=9p-9vP zKO-U4P~>N<_%`zXD)uEH3+9Gi|7x03hui+{BNGs+-q2WM^rbj+`bO^-hs;^tz`Q97 zS`_aSDI9lY>-*mWpQ#&ZlGYk}L zq&~zP#f0%EVoQaf9KVsL^RmPN(1bVCx<1P*m2pP7G6(`WGnts$q{RJYLvTp zT4lrTUH{1-8`KTRP;gZEJpq4uJ-Vm<>Q%elyqB*Tid!WVMF^}2t;L9;(aXuWQ0rUHJ z<7DdxLt3igWotG|reZ@_zW3-BT<-5~qH0RUGB$}z>jrR*BwGY(*v5*NT6F%UGGBMa z$W`AOXC+QO*~;Le?fpD~8#Ae0(S$S3a*|-#fklm?BZYgd*0$j+2u4E)D|YDcmQL=; z=Fs7sjX}~i%SKRXoE$PNSHhwPKA@FC|4tn(#st4|bZUviS;#_7A9PHkNx%bk@}EoS zVm>T!SwEK-5y}Uy)|IS2M)Ec=a4-8kt?MTY?ex^E&Zh2wFp0x1XElQk^4A7KFpZyZVQ` zM*b>Eh_p3rCfaX2gGlM3ix*-@`6Sg4PYKY>K=t>`i6;MJTqE=3P8R`#a>pIbF9^CH z+cR8rQo8poM|xRxOU3(#76MPcI(BJo=NPQi9jzo}BLPlx&oIh@PrrUx+paWXhJ2F+8ic&s`c17`yUk$Fr7I z3=27T0%WVX7}U~II{X^d9QIXubpVrWe(jlS6$~f<39XHLwCcRox&@@>)$DStAGDmR z+ohxqcy?bI-ecKeAh6fvsNZK!>&(y!7t!zMXw1bbVT^n?7nnx@9i>VdP`^bX+L^e= z{_aq`i#)In{8(o(7Jw&acD~+keP~QgjhjnkQ z!pfT7~5*1wjiF+#{Mqb3d zl$$8=gpP(eYkMBCvzQ`?`;<8o`fMjFH;{i@$Wh%@wqZGw9f1}DXAPR4TrcsrSbb+L zfa#gnd%|RS$Q)7=CNfhu+_P>1InscHFxA%^!VCyu##7#dw0QnIjH0)sM;wMJr=05J znpAbI{L<|)YkABPZ%6h12;EpW#2a&y_Zu@H%Bo-nKx}H{n3)k<5eWp{%fwn+q?uYL zXp5%&-MNHhz-fy5zdwv4i@1z@e1?P;pGu zxI>$tVCsCR@Nm7AS4X4v9QcrWUO){L?%@2?;?ZjM}vAC$7B z7ryVv`o{cs2a*wLm}@m?G|U-u;hnj!2CbLmeoep;<}&J@FXD>>8u+*(*b5DA>%3`N zSLMovqe3<*F|!3PyMc7^;HY~bghjl8yt;_!B5DOtz>*)FQzI_A&^&PN6ueFsDurKLcV-99cw*D*so!=#*iU zNC#?%0(yYPplZpGu*e@Fr~#x;J`n0GskyB(iKMT9ik6Ve>?}1W*$W6!?SF~o%r!=y1^G-y6k5QbB zdYl9TDl$R>o#|-?&}mJrl+N^zUGYiZjNUv#d&+yF8)OiRlYCs@=!{C`7gJX z!mxk!gjy4PUz5qD+lN7-KAC59BVJU{_my+#rVT;;`_2Iw5F3> zuz!y^*FrU3w$75&=tqfw%5z4Z)Ky(YXtx=Rc8|Y6*=bX~&Yom{a~VBcZUvxLwwBha zV43kCFmkthRz0d%;`;2~ySpI$tiLn8h;&{=%1VoY(*Tt>RR%I*qz<66sceJpFmLL0 zQIxz^rwYTk0HHXUYfW#WKJj+(y|6Ak)Y{JS;o1uwb*oqWi1l@egVJ&-{h;Qob(M({ zQ0EEU%F(Eq9`6gq`{%!GwFT4xH_(KN1Ee*)SKs|@BOp%F`d!WPmo7@~3um4L#%+0z zhvqujK4{y7%h|51;!UpUfJZ;pHEV#s(GZE_=NBQ+FqWxF>Vr<^ho0 zV%Bvqwe=p5;;@-2qN+GRU%XM=vYQFX-~~FQ%)kA$;H&Wr1}6E+;h<{9wNq3mzTeIY zZE5+Ucxz&PpT7V>KepR~7ikm}vQz(i+L%8eEF53gWsln))uWH=F*Cpyx$e{t4dE`D z%c*juFQ$D8bYiS!avlxN7sbBqXoh=8?sYBOl=qhsM8FL&fGQO`0<=D~@#;-_w2o2h zFLMcIStj_jLReJQwv_h%lCbQQ>y15+`~nK*SQ|cG1wBA(lh_ov88>k>9kfSqg1>z# zA>JnxUj1~e25E@O`C26eKU=4|K$ARRI~?>42~ise&FV0L#Hl-C3h+mdkZ0;|4W=iy zr2is7Mdm(^Iwma&HdF=FoQ}E?;9hn*FXrbS#pc%(O0<)@NZVj&eHqA^1`h8eWbfwR zo1d^y-SLQ5RMO#_IbTFL#sRZ@05s!S6Hab5{nqd1sE8F_zjpzWDA5c$y|JnoR3^6sYarv<+jur2|u0XJ&&`>}kK=YC17;kTP=gt zVVfF;1NAm#!@7D)0*pMw=a5q1A3;HFRii9M|9;&sx0V_#n`o>LJtjac%^cBW_k^I3 z70>A|(qD>S$#Fsm-vn6aNZIJ6PrB(R38;jV1FusRx2<|I@w zg79|(mX$UCN1+-jo$um5{H#ncUsOtF(ph2LG5q8F<1@tYx9|RwGpwcC27}`NQ>S9KuI}u!^F`=7c@dwBQ*wa)>vD$TUU0r-uy+=FzuFwH`10bd7 zZn>JBB1j^j^pTZ}HO6`t6)YzGVU}otCQn!4IN5sp7i4tbLFQX4sBThCuG%+ke4$~C zT}r|G{Yg~{j(^!QeeDqdeSG0vSomF9pvO9LbpK3HhOgk$oj*!ku5SIrx@`nvccjE1 z^4vlw(C+ADGTvIQr18Zen-B&dKjeCF9oBErWKZZL~>y`<5EGfH&a!N`>2PrSn3I5t>kCq6Cw>BAi8|PsO;#%YN^pbPM%0X(&+2_BAK2N$;U`CIcdMeeocK;(y9R$(Mer(0KU1SnMEQ_N{E7bFzH{*S-XB(e(jMcspi!p-UypbZ}Cp(&~Y z(_qPSRZ}6CR_x==AhiZ=He{#nkcQ84sXWAR;6?)IINud8vrf1!hwTmV`P8b$T+@gb zF5OX}>$Fu)r^KF&aEs$(KP0N44Tk`1Srdrf+3a1l!0lohpv29dfSi4ti%sM}vbLQ* z@~}UtF$TxX2g64#u@kl?MVm#%SA@m9QE0qUm-kmV@4FG+o6XM*AviFU<;}o=sQ^$r-jF^+ej6tU6=j{5rs4cfpS)n)@OzPCXn#? zc|@Ol0jp;IeUtFc)3g&O0ozv9rFQg@Jn&9IS%`mo3ldY~hfVqHsy(87w^#!m>_8_B zAFj}^SqQA%)XaM=ScXCxi8VrKR^}tuVQL7;!rU-{5$>{D@LH}sz9m3EP_kh90QY02 zG9}IDWTSTcuRb__$kOoP-p0NuiTov-Gno7NS#EVmZ_k8~su|;qYZ!~s_q4N4gbt)I zP~-M^7=Ki0TG&OMb*YLJ<0*}{NS`Z?MXjZ}9A^mJa?y%%fOwIB2OWl!&Gb0>Ub6L~ zkfmr?bDQnZ#@t$gmYYBCXD2uQ>_>tza6q%I7cWfBUhl&I7`_Errhv+$-$k?%g#|6c zdI{R|4YnTLn)j4`IAiLrcN;Dyiy*2k=)eIH-UT}#^YkP5%xaST`>r|X>$ejRC%Yjl z-$ZVbt{chWaaXNY64+2$Z+S+bc3V1I(4- zLXN8rZ$OiM>1gCO5yTFjUOV`41w_FdlQj8-=3MN2Vs@=?!5PFJ;rN>=dofBQfUsoj>W#Q_*f%zYv3<(Dqg-HG zW%ZD@5CiH_V1d@sPB-_m8y#L+`5}=m;Fl{-1Mz% z-v&mU=kp#{pJX6KgoP;_7_hxmJM$Mz8jG@A=J+2j_>fmQJjt+2-Rq%brvVmiY4vha z$rHX6H7$vm0M#;BT$3z1ikhD%S=}12=P>po-C;V7tvVHdn}B0&);b^R-RrvC)m|{t}jz!d?^Rdvs3>#r}?yH_D4KOt(89H@>_H=(S8ybX*b8# zc!P6(RlR%VnU!)VA$$1_uyc8H0O}@w0x-ai36*_5D$|51tv4NG8KxS}rOYPfsfazD zF?ti8Z!pS_7wRLH8~ZF3fQclX1Ytei%%BnHs?m$4o87Pi!%X7F6z~LA_$V%$5WL@` z-6gP(x3!fvNy0yiXWR=D)DkSg6L_EoKT%o0uxqxgd7a?_? zDqCR7HaI?178<;iCt1JS*>dts9HKaBqh9wgGIFVv2J4$-%5<%^R9CUUVgHpyp48o8 zt0A{-lhe1IY4Bh9U$drF{@o@yd04gLw2+h+Sy23 zNm&=d3f{Q}!#;d;2d!h8jt+P4+->%__($d;DK~Fq5w0D!CF5ocodobIW4NqUl_8=^ zQgzkDiqF67*LlRL*7BSmcgp=p+rAYECkZEwnz*rsRM>Wv--duNnb22mhl*&@=0W%= zv}B!WcUr6@*uRUXb7`WYxwANO>eaEdU*Fo_R)z=;Q0ZmO| zS_*9Yx{I8r%qL&(dZn|Y1Cp|t|9FQ8>W&Po2yc?1&rSwCJE&dg5@!ydG+0=sZ4>%^ zY(7De2#R-8SjLz20%Y-Q2C{*qZPaZA(wvR)))95z%4C#GWbz)P`DZ!d&&oE*>ZH;U z{seo*GtVNdI&n7Q18i0UMDEpg$)pWPe4W5N^Oh2pNbtU-M z+Tg0$-&FsPL*?secZeI&-RZq9%X0~90>SK!!b;)6V%E6b+HaM8& zW4E$E!6)^jR(!CQhqKiu_nh|)6slo1urXS(kG8(9b$I`1{^(gs(ct>%RNh8&_67-F zd+uWx!GrM^P!rzg=o@@^xx^tdWl&b5`{lLZ2@#u2>zNcr)!!_?Pb20vOM zt+$q_3VZeHQn!KAjY_QSnB39us+~%>6KiH_WR+-D3NAAvqfh{CWAEQegA+Z<DnVI2Nd1>CfU z2TtlOup9^dFx^Mq zbgy|U? zZ1fXQEsHlpQ2fRYdF-%UzasWiOu3`Bf;KZW4H~9Hlzex5cZH&x!4P;ju@Ex2NNYAn z0_|6gkPGW~ zEFSS@siynpkWbHFVr$Sjb+|&S5slz46;+|bd&IP!@Lkt3K*RIXx$vTW%x~FO z&~R@>?Z7vJgN$?TX`MP{mU!JU{F4Ur7FPVT83rB)$S{O!v#%6FbWi_&7k?*5(hwf1 z7ZS_9KHdrYOHAbmEk=>dRjFi2^U;7ezN`y@YqjzI2b2QyOud9hP+SJYTW`fSR^e%< z!(q6Q>OfYr#!`JDxaqXoqZIsrqh>?rd+<5zC`lW1av3i7W+u7cI$r}S*73lnX6Sy!?epR8p$em8x^r7V|BNFGOHpKkrwGGVwIn~}(h*n2j*Uft)k z$yKJMJ5%_!o-%$X!-JGUo{2PpN!b1tr_j}%@lVcQk!kVBHsw*}Vnb<%F4}JEAE8yn zHP4a$uNc53FF+v(T9H%ee^TtPU2mA1n8d$l6`UqCq3s+@Cs0@1rB;Iiw&|}TR?tcg z20u<$mj}y5R1;{11~IR@AELaf4!9>1=V45pD8eQkJh%79H_r(hxMCQ;OFRu&(+p81H@+urnglrykwr|{&}r@coaQx_b>6v zk&2QN<58SFYterc<1W?Eo@LJ2lw&-f)!Spqm{Sgif`mD@e00JNFPk0|F{9D;9J4lz zFV(O0u6foNF=YJMkn^8xP-D~8m~<4(l{}%$+t5ekQ+>wt@8kXHmege_WTRKUF=vI7 zIk71j#z7;M(t&-Kc-t-8tetN%dDO~bna=v29nQyOoj zN2V&W>&>6NuRJg+)oHZvz|?_>8#YyOLJ*_Lj4U@?pY9(^C@vH}*++!y*`h^bc@7r; zNPC~UuY3mOX03WQj;x9Q!{Gm3;&|w64|SoHGZ?M+aW}@eb}z784)&vNrx;>< z8v_cz^*^HgBtbF5a5rc*c$bJRN830BF6d)-R2Rbe3Fu>*(7d0gJR9T}!+S4=8k39v z?$NH7Guj#`+^cU}$Cw*LDY^7mUEBxny{DX|s&)xZGxtVbTb&PX$*jDdHBvqRByIkV zX#=tH$Dm#9@-4qZ?fW?tl#%Q0vnVh)bj8s18(q%Jii=;K$C4}$PNIXE6_sMz&kFc) znEIzWNEtbvqMl$xK>_6Til$jSw}nBm;1Q{njYFBP8!HsVQ@*si;W2n6VCK^qTt7@D z5(*dSXegkU^H5^`D~agxSXA3gH*<9d3GCsI4+}(F@^}j!$C3NT^HV{n2)b4D9o30y zSXcnO-jDEaNxts0PmlYX+TTOXFRZ@I7f}d!XLNBW)ofP1ve&@r48YN!@@9>%e&MHE zkzGTaR%Gkci}b;7Yn-jSG1=w1Xcdi@71R71U~0*yZiwRT>ZFt%`=2T~4iJmdx?~ur zAIQJN4DuJ6(8FqwJ?LeRkR^43ZreTHZ1D9eR9GV`(BmoGgwdN2#wI(PBpXi&Q# z4_bw7{gEk$5j(; z?$E)?u$Q=zpEFY|5w27%`%{dgxW{`nxK*QSzW`*Tk(HAkyGH_jBZW;97tjSgKSxa_ zKQ*v}k4g}%;9^BtHa*|vQcVco2W&82DWrBw!zU9_+Z?25W@Eqv9A(f2iz9WjRY<1E zliT6!O4)2L5z|%9B_ZQ9!bH#OT<_=j#qx?`*Zo>E#L}pprk&lElct*dME{YOYeS)n@=_h4$pno)ITe_>#8q{2T*3yt zTJG(yyga5JU}_@T39HryRtP<=(l2{VZrvJoix3}9oooC@bKOa@H${r$I@Y0VL&SBP zqlSb~$4k@=orb{4CG6^MM|uGrAWwZ5k`#9Ie7~C~P9I5s%7jutZe_G^an*(F42M?8 z^aif<3zE*D9_oHD=yFo&bI})968ddGrkR!(Y7DJ5ZSHUC!cXC($C3-T!lM#AM(_X7 zo(?g#i;&38aJK}9(g$C)LFL;34|h`uc~1Q45bl*Eqkj%$#V;oKpt`2uu9VuiEhkrG zhEmtgZ-`IEb(4Z!6(->trl-sJC(Ak`G|tdj|37W}z5E4ULDCeh!pD%a99MffmmoRQ z6i=fvTxgn4iM`Gg$T&DvnKSkznffSzaq@F+?_|&no)}!wrso<|#7m?^(Kqr>vFRwMe^{r=w3VR338N)V^E@Ra@50b&1$)pC91d#oiQ5^sr!a>5)-IMl zH8A1m)gipERS<4vG-j)Uw2X)HEy z$=a%&&ex`RaECj%b6T^6)TIGYZpa~CE9@X9&PItN`qDV(dLWmT6&Oo( zKY-+TEUyBB#Wf~GKngK9^Bhth*Z?qk@uEqh4G+1h^h;pT{SQK_w5Jg@tbm=#~=9CVAiqFQ7>2UCgQhF{Q-4dz2zIS`CHja`E>EdRa`{EC_p{ z>KZ0rR=yN>864``!YZr35E;)o$2H^LylV1PiKPCua3LI#BF!7p&;?=02IFl0BccXN#>D0 z!?@<-vj_=#xrMi-YDuKJZg_;8h5EG0GLi$>EAk1Vmq2Ib?qd2LL{)wxm7}M!V*S}A^81w}PcC@t{ zH`OPgCh?rINndsj9e1z@IkFWB>QVT+qJA{GjFG`W8M5nc_=Ko z=1%==9h+7elLYo`b);Z9k*$&uR78*S(*DpQfmZlNU^rDVA0u{Cj9eC$A{x(6%=lQTi63vpyiBZmP7gxAp4a{c@flYZ46x zt-Cp4a|trVr>iH&JCJZ8J1v}j6hZd1iz*($G9rTL)n4`>7h^HN*42A&YLVhWJf2MJ z@-2m3i_@d9Gh8bn2W0bEv)iJAgDV17*&2lt%l07xfU3&FO|Yin8Tmt2eB)l55q*FY zAG}*JfS2n=Zg$CES8K*qU1t8)wnj-UAT~7m>RBJ?MLMWhsG-D!kA#*T)Rs=A5XQ!#aFuWg|U}^_2M=##{(rzx7}|2n9{y4*(a=Ag5-tqN$e ztut4=|LI1E`kufJpUK2#XVC~aLGKNpU~bL}@6n6Nu~C&T!`=ipIxl5VbSx zghxd(`EGdbj;aC;Nc&xUGa|t0-N#(Z8m?w^FN3x@>OZ`O0j``twGz(0HZv|nfG8i5 zKNUE{YzA9SzWWO6c+5Rv89*Dz$E;voCH%JSxGw9%zWq_cmTN|$w8L5 z=;x#&>$y(XgbO3|=Oz|vHztjowEWr>P`eMQqJX(}WodaDA{R!ek)y3$NHGkw$|*^4 z%j}pfm+OY&Q?m$_e(t3&>yREQ?Q1hX-D3}j97w=sV&ceJ(T84g9RdJk(^rms)nUv- z4O^a4eb3s93KSx7SMY>f*F#66!v%q+E&eDZ7)+gO;B@e>&lSV#G!Fc9>*FTT*{^S|sbOFIwXF zY13{{_b7R4IfQmC@0~o86iA$rUVA80aA&^?xy&_oxV%;4o$*PLcxu@|DmKm7e@|0f ztRjd0N{;3;ZW4C!g({+oNG$={4Pni>hmtKo&zRoqh-Ce#HaaKi$`X+UG5Gi+#&eO2 z-y8!DoeoogV`WUgqpc}TpIWra;ndhNApfZX@CC`U;>p3{Puy?{&-^Jia{OX_iMfK> z11kFqrsXIXV&{PGC|ijW@=`>;cFug!u$e6rv_!_PBeoOyY{_o%R#w}&JACHmzZ zF_XAyS(cNSttj`C8E|F11mPfkeO&s(`X9D%$aHm9YM zrm90|c`7c!`TX!TAxv!%_|PvgM745wp&D#H4PAdu!$M4M8$qD(`e6Q3@^d0ob>)|& zuX&a{hYzm+J<6|`pjaAO#Mp$EOBx7Z;&X|8q%F`g9DyCel6P^pnHSb}KGGDGAK%F| zmx^C3=}m^(l8Z;ik}Gz=#mfSWyuULKN-1c4$I`x&3aiGGUqeQ3ouQ`7^dv0%;;KOh z$F;rXD+~%hlr@SoY!gG*4^{;t&~hNgg52#@uS;s;@z9Ir6H5?~RaL*P>8FQdha{qf zcj|#q+N8edTCa!B@m?VtWi2b&pTwq?eTEEz*Y}|1;p=!!uM@q?Q9)arAsu&ch_MWD zYLzCoSwG(;)#0?T6|cZyJUCp(b5wO0m7)*rOVr;XwIC!?^4GbWDVWAy6n=Q}+CvWX z1wI}Kj4iIll{n(AELs;6?~HL9+Z`J%VT3DjsXCYnrpV37uq>CWW>AMo8B0;TNCJQ; znM4fNahS+~+Xo=+V@vb)WYF}G5TWk(1q>=ckEbf5$y%17=j|?>Q`oIDZ^!`kjef$W zea+<%EM9$Ae@YWO0fF~gXX7}DOfuHp1+Eo5oItHOcszk!! zW3|GvPW{oeSX3mPXxEX)Zewp7B=DS?2knJRD)=&?fijReO&ibfKN*U+hw0FI6(1%M zq-E5I1rmH$a{`ZkPk4X=-AZ@N04YG$zY^^} zo)lgwyR2u7Zc)rb{enl1lOzc(g`tpKG9A?p;v}85NZ!TY-}zjd`T-VfqRZR(H8}Un zOuB%YbGU*6zBi(UznLLq2HSY#@1?J)p&mIZ)A}xJ17FS(aDod@BgM!B#iWyouG()X zse&124UfMYQl_3CLvQSt9LDeePj6BUFT_jh1b1RqLR8I3>~^&-@cSej%XjhFA5sd7f~3m6wt7 zx8HNDGcUgb449bzf$+2KH^0V>LB%O@gN*J#D_N6vaNY6Ad74 zSa9aj{t6Mxq`)hCjB2O2@1h*J-|WKri{$>%^thzZLBnV~+7j78*ZaT}1I4$EPBVv( ziKLYp!Px||Mv~CT8IlNt7B+x%D-|!iBjbO zc4kLrK`2;F>~b=B?3_yQ9ox^tjF5^0c;`1q*W0=2_$i+1HTA?CKPw5`xHYEHyDSqw9x+1wRXM(#?9 zN;1MNhvVJgf_PY4{fmx3OgSC~#Wa~49&)NobnxK!+$##1r{J)di>}v%qy}PRIZs#f zka|=|xY`}9t5dDq(nLb|q4x`XahQ#;j~u(wa59Uw{eZ$G-CiO{wSSc+5dy7pLr+u3 z!VlN--=({;W2l@f%_sZK?+u%6HxHtVojcuwZcsAUuE?_>tI9?yBb?T*G-oCQ6n9u> zjP;lcT5fWJ1Kq%sja72rlqt%i5xeihrPpAhXX>L}K601a`sjUixtZ5NEn%||s#ma`!VFy247 zwe%>nP_#6K z^Rm3=n7Vo29RP_2oTnH42@=s?yuGMOBFE+&(oOM?xDmJ{uQk6?868 zUr-c=zJpIN`>1>|B{eJ~QAffC%FduS(e+go8B=#I!Wk zY1~F8Hxu_7X~E@D49~$k`byg6E$TBGN1hF~7vcF|FuUu!)9rfcJi@C-9W&eSbEH8l zq8oA!li7xk{02s(sPB|KbDNs4&86C^ldqU79{=bZGT@|fYl{*zb((lBORjZDJ3MRs zr^9nC?9WPAN7SW^v|znS_*WMaDVTz1I}56RgJ_L_+gB6V-*bin@;PlBD1)$8)B;6X zkUngJ0S9oBT&s$5ol*UUGYc$>y&6-V$E@;4SxsIR0Xg=DKTNZ!bm$X8XbAx8n(!4@ zztN6+f5Cb8qREYDhC%Rn_9rf|Z^0eBHCIH<>Y$sOA&9eeLd%b?lzg9dYx#Y(0NYz; z&yAIGai}7Uj&7-3+E!T=V3x9U<|fY?6p?Pe6eE4CS9A@R`>L+&>@gZ|g~Hy0J<}(C zuhW;m6_R_xo#~eWiRwuv=~lq?F-EIp0UCNCZZMcpUdocslAUI6$E9s~O^0nbQg`P1 z0SKb+WYTM9ji>PV1n1s-?{t~_Jnn7kV&iWOVOk#vZAllQF!Ux+#^B>w8;D|rsiz)^ zil9cv9|gOWW#wknJtbCN2%CS=*__QWmx|=KGu~`k7K9wM5Acn5IyfQRqo2RjeHEd! zBQXs(g2A11rUO8-J0~54lHkDMMvg@!We&Uas%YE%MMR`fxTc)=eU35(1FsaoGvYlI zMYr0b&dpj*q^JVopUx`&E_$>Ezw=1~tJvz9cy~hB%Ra z7g1D`wk+U{eA+YwRGm%F;QJf43K0ZgGG$RyketlL7}y4+i&cX!T1UPF?6GdC-Cqyh zI~dt0d$=89;1ptMjar~*YjZnSyWuR`;$757TDM8x$kz&HwsTY)3jI$vR5p%1Vn-&% zTo}uGNcY_2lF@Qb>y5?Y-b~r4Zz1YC;ti7%8*UZ+!|Zkde3|{1FS&I2X!JpZaShnx z`Hpq!Z7d*mY)3W!_{E3A!-Zq_@FQz;O$-G}Kt#E$G@8?!)#Sme-GVOZ zP^<8~|LYcg5qOFm<|2t7550eMvpGhJfpc1&YvUJq-fPGJ#^@9!^$Mmz*g5+2h#Fdb+Y+NnjiAJ*jju_YRC4S zV0{`Et};=jn$P??hJSa5Udo{slX=kA!uWfb{v5*~Biq*`#`i1=8|PlZev{?84$Px- zdOLa>XtIO!;peMQ*~O+NtJM=Cn2`@hrr_iU0L#%=q zzC^guSR`rZPYs(qdTg?EtI`w&5`IlBwn^B0kSB0i87__s3h ziV_VODd{h#(t^Lh=C$~p;qS*KhfyDcTjb%b^m%?vQ-GDhy&-b6Kf-M*vy(*F$ZQGQ z#JZ_M(Tw$=@H#xSi)K65GWANr0|JkNE#6?fd%aH}Wt308(WfzdbYm(&Hbj`O4k&xG z3&Go){b8Vd=K@+E9&XjsJJW^kAuQwa&5mpFkIQ>2apSL=r5-ZGR-T349bHzxUQmMG zkRbEkPp725RjR5Jr0-1_{Wi4-DOpIJ;oQ^z=t3<>kdx&H*u>z(2)pnhl{Rx}PA|@v z^HjR;UovD4H$XhMF_5~^_G>zEpi*Et*U7)3qK6u!WMO6$9}HTR4M)}Magv=!6?jeg z^0_a<%{b>n`t4PnRzMzv1^}>}qSd;RL*plKiSwz|u&jf< z37|?qoICJmRHTJ+@FH-i?Y(^L9!*oe4tGYedg*Tb31gJ0TnZw$L6v%(L@Vy1(Xge@F@Sem-b{KicmKjB6czbC>gKlM7KJfGOW`WExMZlG* z$=uj}1}Z?<>>cs%xg&fJwI*T@aUQ@8A7YnS|?@xM@MNP|N0G zH=v~(9a>0lwF+jraOb;pcYs}h<$hFH}o`lD*Trw`)g6g^Pl7z`RU1HyST)*UXJpzI^HCPASn z81dTkP|*H95OVMO+B+1;)#1xkDrnM0|INrdK2j#_?Uz3cx*XIZvcX~`oNLX6jT0G` zyKW>+myE*${0=JO%+-3wj<{bEsF zGvP0Spt7iE&l(BK&gst^ioi1K8W1ckAVXM|x)>!)PYd`lS}t(3+wXM9Boqb)q5y7a z?Z=i>_D>#fXNk0A12}m={>Pdeqq}gi@P`qRjbJcv7vP7=Z_XXRp68}i5u@^XO@0+% z;O(hhu)n&QdXnSk{?7FJdnLq#fXB4|PXmVH$b{*9CaBR(vqNCo@>$%x4@h30)$cjinw zW(p*srJ;dQkX5mO!Z#6D+qb9=ZvtRvN)prUtaK>%N21O0yx%XjVH>9dSvdtQY+wTc zX`(220aLOq28WFXp+bYi@M#Z9S%<0)X8+sKGr2c7CU*PKm4oZOPuELP507uA|FeW7D6Y*-hT;2NMeel?gqKAMpO2yg@qpHoy}9x@G|ii_bQEL9wTl zle;k2_lbypZq3YUpfvrC^7t?c%N8?nbJN%L!xYmY$jbsGU&7ZqZRklf?aLy6@w)LRUnusjrdh(fApO62-Z4(V3;5Jj%e#x`- zS6G~z;5d-tXF0T_u?lvFji4h%#+6ecS>VA;si`2W6PXUDl&vfSoV0dBbTGK~Qw|{8 zj~%KYVAcOsRy3*2PcM6h;bvx?x^sMOm}x?WhV+|0J#BuJKeZ%m0{)^Z0ykrGix*Ze zO8)my0M^8tB}T6v&}y@rHLloBB`+;+wJ69ETm2leSgcbs>zD29TYv{bxER0@5PQ=8 zP8{%Zah)#+UE`Vdb+JFba%Nr_i%)UF8kD6o+kg8J0!+Bgtc%z>?XhQyF~RXJ9pXA|5aO9aK14_R*O%jq>j8R>f}0R<{bc{;Z{N=+L;c{?%qjg@ z=3Hb0JtG!%HGr7;X)(KBdhh-VrBhKW-E)16p z7;=+tI++cVuIhNP>;@K*IRY0+Z=GG4tEHp~UfsR77c8MxsW z4kqal4VaYi=XCP2Um)aIw{e6_Y4sp4zg)my7~)q9WCeIty@no%c0=HsGa88LKSC%h zTWI#rPAdbP!(q0wDb+?Fxs2z}R^)QNzwZVxIQf~ZvzBg)- z=-xo>CaFe~e)LR9zTY*)1r~w(p|4+a8)9|=2PRS%dKbXrQ4u;N4(aPH5DjxGU_oNa zuu9|nTWw5NSqe}$)Kw>>Xd+@k4ERS_e7!7s|8cz=)7JY4c;E|*P4>y@2nRXNde)+< zu5#gZuG(WP05$D%Lfcz;KL!outaqdtZUx>1IfjZ4q8ifHFU!e&P49Y{wu5q^#V!Dc z_)qEIYk|>K$WD;wRRbG{NCJFPVrgcLPnv-Q73}#~sf&i#k$%a@jd=~RW66ew)Q{H4 zsum6uQ*t6}=MH;e2_K6swi2A~c8p_|e~|w~2lnd=Ai1d2sMj$o)@6oHdYft5E0-;* zU_R$q-J!WV)i6?9Bd5+*EpMLKh-M>%g>cqPfxOOni=V8NVdta2;d5cPDA>@d?YFPF zR60NfyR_d33MkkJPxV~FJbXjmvfmU%JVs{at>;s3cG-JZA0n=D`>{C&!A3JS5`L6H zLzCn*cRYgZ&`RNQ04t(Wl7re_gSHBvV7I~gm%=AtZI(+~z+rU&;W#?|XGE(omiQ*x z1Pzw~bf<~rYP=p3?!m*F26}WhP`3hD zZ=)~dsChPRs`JaPaQGNJG;%6I2O^dz5yii=xVFkP(_~BkSKMbw%_9)f#;7M2ZQ9R4 z@fu?B;v(ma%qKHQPp;i5o`#+3UQRP7KS7_U;bOHpWx5NuI*mxQfyV44p?i?Yk6vltp3oGJrv`&k}IljjTo9;@zC1H{rXEf3gvs zZv04x_q^Cl}mBk0Js911Z5X5ub4ES zVXQwKFsUxlQaEi+Uh<~mbneMD%O?(s_gK_BnASsp1X(XTsBI-| z9rWz^V_#3vnMQ2+4|Pz$D0xGWQbe?p_R_J{891>>8F8?nJ3T8Ji?Vd|u^K`-;P*={ zTJ_z|x_z#%Fy!<_S0i<3g4d}04gyp`4`z7rI-GdAiWY9lY(n_+^5>I4`uJmYEyj@C|&iP}b^i|Qkh~OUw zvHG>Q&Uq*0h`iih8O`p0`6s2mZCsdm{N|=m>MKI*M{t4G`ztkA5O_QmV1`Cz4=h@+ zW^IVo^fc7U9?IgD-8FYl$|8hHM;C(Fdnd*$L}e)_$Z%}Af_`<^2-11(x&QZ6w@Lxc zkxa@}s{_W)d$`qk+2GX2C$bciJKfnCvd||;l``xl>;z>fUTB{<_FpE>DCe}3q97T0 z)Dn$w5cXf?f}r#<46L*qaKMgU&My|(X+#GnE+A1c#|sbx!*P;u8WGxPrWC)rgWy&t zc=KMJzU^KBnUsVI?5~t-X@F8EU15Y!5-0(Z96+MFqOqRP2FQ!}x$XobIj~ZxmH1TC zWku!m1e(Z%gJMz1G6vxNv3T0ycx{i{=9TGkZm+&vD#$&(cBi41OkI)Dale=^)_+|o zBZP92^6#*2WcO7UqJPh@3TzXDr7bMYK6M!J10*E8R8K11b9Z2)pO}ACvqCS;p%iRe zib(ABhi-GSIoa+YVsd2ofb;sZc+eV?S5G9Vy8_;y4^_08ADGimtQhd{^Hb9sQ&xYT z6Z%b${P#K~4K}%8hO2_>yg8TazeSaVb#T+uTMPpM58&I^3BJ-17@6E|WUrX#&56-; zdJf;SOwib9Sur8ABduQMf8j_Lt=5k6^rFJGp-y`D=!R98h7hxYRNG7!E)0B96WpVt zguW=h{BQ)Ecd;Usho};nnj{EGMcbm;zcV~v%eG`)o3t)M@9PRJ+mqhax=}Zob-1G*U4WPOA^FV~O_z&-KR4$+|+Rc_e z@#7alU748oh9(}g?$d7+`2#S*p@QuiIzFfc%nsqi|LoWk?x!+SvpW3oFd%Lpz$zU{ zpc`5enQ?`bN}7|EDs#BBcars}&R5OVp&2XjUHiQdghYC}Dk;&FOPWM6g6t-CyP>5f zqZx_l)v6^M5?)RO8)RxbbXM09PmN$sL7N`&G5&0rY69pzGQv4FDZq!Zp{;w55CYfB zE~{bnPm&e>J7P(F93<>^xZr@H716b-_5)#zVfv0c+z=1T102JpLxq6!F-lHbd!z(p zG`!OGLS%=ZccAOI=>hoS6jgXD*m3HL7oH1Lg1!YooZY6r__pn56h`XO_>3VQR%%i8 zh0SkIU%0CFSPdcP3Y`Ri5t^SjNgn=P(0hyR82mt6%%;&WfO+uWvo=#ob$H3_xH(?S zi#45`gRQGNVU4T0)UE zL(&0SHzw{yhpIA9MWg6f5#>9WX2CfYEUmnUrq2aF%1t)WBp2Q0_6hf*tQh|2kHia1^>T5rB?fe6z`4G{!^z?hlk56 z*u(ykuDjx(vKwxpjzl{WPB03a^%{Ui$XC-q z?GcmxU$gTYDmch%)QJ2|!0TS?a>+dmbpwE5CEm5>V(qwg7IaPxE%78H<{SBSCe_@V z;>#jaA<}SnZ(Ec%#@Hz=e=rM`{~nPNUyP7lD$EGEs${{BE%Fe>HWwUrp2!HHPO)6~ zKp7N9%CkdE(iE&O*%o&APMmS!$nXXs6dGZDwMlcTd~q8H1qiH1FPnG^@@4|~J-zX_ z^&p7qq_=$R+rP8i?DbX^8mC?CwtYiYuwF12#@kq|L7f$X+V6#I_v=#An6-t5$o#vv zoJg^lYI1@`tzyiiQ->mfopMSfVssKGI_i-{EYQFXXOSp&5SG@ixUN4Msw}W!}4W9z35*^bJvC`WhPaR0+7Lx??bolK>)$%?>|X-YVCA;7fuk{ zXOU%R9I;Zl04>CXu4%R05>3?>#t18#ft1NC=M(9i2|sUA{pUL4K3KOUS5rhjT*H^5 ztOjMwI*S7M3ki%LI^eT_&`FW5>tic`v-?IpQ1hDuq`wrtsxZ ze&%1P*!8mYwh3cBBM|+0qcQb{&CqL(W0<1h7w>kx z!1lNzXH0byKO6JC{t zC>M{6JT9S}J%UDO?QYadFh?L|dmk${1XT>?)R`{4s_tirW1g=m{y|%4px(~&U=QF? z?0|{_G(6tzOLbv{N|V?w>k@0JW*1P(@e2MHX< zJ`?0AJ2Xnl>X1L8+c8qVkA8k!BBqc^4efzRlbuv&>5s3s<3BF-%>wGdG#gic+3Ru} z@R&hqxwC8uBNAxwQ3>{UP z%`Mz?L)!D<$k7EzR29xoYd0rCUyxfR5|rryk9Dc!f*L=obHC7ekE1fm{Wz@6`RLT< ztrGw*>zJF{gnD_jUkSogIMCs=g+K)0A-Ep>_)J70R~C2t>+4qrQ+4-;GJPR)?u99g#t%shxDHH zNAth9U9F-(oeZx<12U<`ed3c%x0)z>Eg{!f=I{Ty$_Z_Hq&gE{>Y~#0kejvkSeEvQ z6J-Y36+R9n#=4_57z)6@x_-*qx6xc56`q1Nj!o`uW;#n6A1PrnKnB{Z+luG9mzy0B zIAdsqF&hdeWJ?R3DtHsK%hA2yhINzfzHmYQt7ySnic_WU7W(Z?^@|a(KkTv1;-*A? zD&v3M_}3HtNB6VHNLs*j1uSR|3_a~IRJZ&lOOw^0J?`=5!&6arzh z2Ib@dRm)C__M7P`*)6hJoqNY%XONY|p0BEVVshL`lH4vBJvH zqpd^Z61S(DkYVZw4pN(wiKrTOcv7mDu3GTb@Z=O_XZvphr8<^>=YtuhqN0v5=*X+o zWq`K^KmbDue=&YVq<;ASL`e8z`9W=nXatIPMZ&P#X?4YVqISzkk;sDL`GVZ(1c_f0 zF7qtou~N?@hy66=ri*G{?|$b#`ilSg5x~0DcN?CF6erHsumr``4JVS&)?~>m5DU5a z{8PHZP-qk6~S z?V8t?%X@7)c0E3XA8a(zR}^-)F^I}v@!3Ans8*0cw29ohnC-WZIm0<_mqF&Gi0qOu zGI<^N?wU>Z(`iPPvCd&Vl^Sv57zrI(O4wYY7O!^a6V%Pve7wAi{?}>HrpWqz-jJw< zEL&eygvnz;UGC6?T=G$;fiJR}J{FQP;D-OrINy?9JHOSp>xE#*4?Y??*!+cjKhX=t zke_Y2h(g>>=Wg${Jj)mC(XdOo+WtA34ytJ1n7Luv z1I#ghrV)e`w2z`u_^*J$h0A|#AA}Q~tGRGV8J=>pEt)>>Rr;2V1Mk}qHuaos7J}6*J^mdBRf^?&-0LhBch^Ky5yvZ zcv9aUdk=fzg9J15)IiV^Cg+xOI1a%dVD|y|gQi(u$jOx!rY63CJxM-6{{dL_6w6(U zC2SrRy-bjnYvPgf8dG2QW&#c4fz z{O>s>wYJim+6Qeb7W*$?2>rW?`iYZOYhjY_%pT1K-ZorZ>Ieo!kK{{R?OMVY|1^xfqhNzzGR51d2?VwMx>)(rjLxLqWqQ z)>~bl{UC(B!sz>LX&w@>KRyQoUiTJNjd?M{Z49&&B$x&*!`Q-4 zh^f=~29c>0nDnd#?np49ae$q0XXA z4konR(U3&sZWdj`A-Q=xOnC(wy|iObJup{P-m<^9Ip8Av!0h-g2&Qc~dH?j5B*}X7 z@J6y*(wOZLl=%__$cC`LL(9QUHCG_HHXEEJ#MTQbWvQ_OvAS>dIty(z&2Nx{-k zraqc@{7&VTp~m|b_JGRZdg?+kLo`cEB0c=)yKV63_ZXUzdbU3{dvO*H~nrcX;??zT^nv+pBBGy{pCMaerN0& zPRtE1zS#=I3wx#{1FgXoL}dH&p2v~W7tdJZ@E)yD&R&9`o#{;zv%tkVt3oSQv$a~jzG6|3{1li zh?YwNjybrOSKGx&f=|L=(MvB=L{8b5Ss3R{o|@A=O_9XKd(1=@&=@Jojn%XyGmBNX z-Y#`_aq-6-{QV{P0ax`g9zai$BjP<2FKJto1DLlr=U?G%b7Qr~EAeag;4I7k!BKd>>}+^kA=f@O9JyCPJ> zpz|@rKHpgoU^}(!xGa#T+|SWg;!r23{Y&kmU_4GzzoBp_JF)_0W+Ae>Y%?Wl2XN)^ zyD^Jj+h@#yo}Gwt|6v}YXp`wc4t%jHsgUPAaN>SFjg%c9|9dh5r(V)Rix|P4WTyKf zWR9THor$=4An0WjiVW_X;h`SV*g4)i1_X~=+qB^!pg$37JKdU@ZkH=GmO)YjmaW7J zR%kSJgwx#{aVZqBGJ_%-T0~$ISQ!$6k0Fiip-weroD6L+cQp$XTLR;Aze5n=Q%b8j zqRg!>?}Pq`<4{Y2oZp)PpsFbCVyRuIQ(EV>Tm2rM=%8qabP30JuCu$^e(sAPT5#7- zPorAO!xh&UZS{%bNxrcA{}mOgm=7$n}9zYZ9|!p{fIxnZFwdVzBxBT*A8YM*Tl(Q!R7_=w|%Go1Q|g|fp$Vism5hEX@bOcJlhf6x^k z#+n5!Vc!e>Mc;ctkpU;~{D+}2`%W{Z*Nw`8&dSpPcW0+wn|y8*X-Q`VtR5~SSjQ8E zWYQt#R}i63LGid2SWi*G^lK53{MsCO7g3;3qfia$&L~Eodlm&?Tv)GKPuS3T0kBwYA|?99F=t(w$Ah>sqx zaEtyWh-8HYqwRF;a)!#YXyAd1XUvBfO6}Xr9}*hMho^grfZ;`ksN?%Ud{fY9=xgyU z2M^iC3Krosx0#T9vq{NSgCRt1RW0~;m&vgWtGGZ-)k6Vxv}pX`3yA>j2NWX7r9sjU z#rqkgCIBK`ADV`Ug{~wcR_H{EekDFIM1o5l3Sujr=r^ibY%v$Wh3X=3QyL9H2WlYD-=;NIEb&;t$ z5DV_X19@$4ezE;pw+3*~cXsK?9W2xAZ}mf(62)e(Lb4LDF%lj-LEFCjiM^lRGs9Az zL|>t9=T+GAj&SRW>5<&#AqK~ol)pTc6E~Zf^|m>coX60Or8164N#f9FSr4Qhi<7uE z>DD;iPcwG~lf!bff!O9wuqJLQKD^_4nbPjwp{*50^HI9~OS+wpv?@n6{Q~9547}N! z)^S^9pD>aV)8%*GboAPRf%c|eD#D)#LS{D#J3fI``*R~3_mpm_N@R0|9(=UDIBml3 zZy*3-b2=T)?x>4X7`ek-t-6(JY`uv&%nhkhy}JV8^qXH#FcGY0H8H!aa0W&>kf$~T z9$pi9H~FtW=R)i3cf<+3WI;Tl)^-lw?L~=RcZ)@9NAFmIdNmwK$eqInIR?H2{^fwQ+RoBSVj@5_bd)TGVj8Q z_80qrxqKGC^PjkK!YBn&-S1MGNNfmSOeki(7P|y@S?fXh_(TV;4&}Wk77L?8)!mzl zMU>yF@cxT=XT!c>BPuy(8IU!i#B~{UpA{t zIjiIgKO)!KhdE_}rlv7I#}d18st~L}mh6EeQDxt%bX!D+mxbwJBFxf10boskb1PI? z{|}2VPiRUUT20J}swMw7K_)#^jZCBgk%6Y0Htr4Yti8L^XyTC62IP=E93GhDnR&TV zOs_BnSKuR0nql%=^rfwW#TfWJGffhWWZO5VKXwvEPZ=(Afj{65z44=fpo$d%h{Tql zY7-M{#WjHC2S`~RPm20hLrNH2OK4$4ihH+kV`GDR^2%)ZHrh4;NJ|$l_UwcDQZg&n z#!>2a<}e>}qi(h~44Qfc=`YrpE@)P3u_{s8ie$v3iP-==pW+PhRa?NY9ci3_6__fhBHikSvDHr{8ImE zB~meTqIO?cB_FMaxuM0Pju<<^E``v&STX3ra$(HS$U~5=y_kGrbyY<)rAP}Jh$YsD zn&%h*j|Ig?3n|WoyE7$^>HL|tsoLm4iURlc*Z>!)2w*1X@H5dsF{@B}xD&4}fIdY6 z5;zG*yCxD}Mo==^aIn!3=o?d)oxAzC$dW3WiPVr$jETrU$KbQL%T`Xy1`Wvm!oC@|4gg+ObX4tLd8*M2bEFooNx?cJ|=1T}#10_$_SXGGpqd7kY=5 zCX>{yJOZiF;`}_=(ueUh2oqPG6m6J;GPeCP?aKliS zNq*Vhdmv9^soaqNZ>4qP7EVv#t}%)?^c6hDI!}xuNlkec!zK%kToQ=E1w)E!1aijv z>iJ#j#CJIomi&JTNT`h%`g!+^b)c8UskXg}P)9ys0oN8u(vrR>Rm|!yWi$wNsAEAr zTYshW1>&lfJ6*omgV`Y(-7bjcV=(m{?XM4E=EZzM&$&QGV-$eZs6uG11t$pUyZq@L z%qIL6QJ5GGxL=F5h@z2d7q&+!_g<55NY^zjP2(aa**%$}$Gr2`B-$# zaR#QFx*avC0jVhNI|G>XjD;%-@fk1r^KMX%hGW2S4drh3iKBI_geL+&*`er{->5g2^f>f;Lx`VIOvEH{&7SrMZoXoBx@Xt= z#!p3$YKl398G{PqgY!%4gZ}3cvllEnw|ZwtSs#*PY8X5I`y~$IiRClzO@RFH%TC2O-)e>gU!Mlpj1&gSUU$(OikhrwC}{29b=>arkeKW{%D+cFl|;-~P; z1MgE`c1stcoXP#+FRZ%Y=o73!PqR3w;NKCzKL;(lX+^X+3e$IVOVi@Ri~AN-lI7y@wc z*~0;i-Pv_}T%C>;2ns@S2VoSOL#W+SC&CW4X*LckMqT|@!C#IB2`Yj#P>3mO5tmIV zwHiu@Jj)+?wRCf&EGdE#k~~5RU57RBh9)Z}PRISGX)Af_vkatb@F|gG#vMl&UV(@| zC1_!FXa>+DZS)cfDIwWthf=nSjD*c1&2(wu;p@Hzy}_dN)z69(oOn*4%rgsGOmxfO($mJx0|hm)KUHyTbx$ZtXZ1F%Sq?t%qnQNnmY+a{o+9{Xa@dBn4I6 zJ+VyrR@S?8v)4#exVuFJRvLt6EYz7Bl6?CQC*5}G&$YRF4k;gaBo6U|w-TKmuc#w;K_?YECfr0Him!1`+?j zXXjann%l;5=RR-2*DKA%^fA_k{u0Gri6}J^fsxFWtDe`%i&F)2Z!(Z@OpKjQ-nj)u zt8dZCH-v$Y#d&35CjhZcslK*{Y7%mV~` zsXg<&N{XDrqB;VUQapNlP?$-sYyE{w>ZdwzdZNYVYF_mtzp^WHYx$tFMJNtqQar+j zDbQl^87eUTjQT$w7xDT7HVpCtrKW1n)ZTzyjQW2*5!)x8ca$BLO%mr<#bl)_bscFD z$w+C&cxtZE7W#g#1`-D4Kc~!~7wp3zGd47$n!Jvou*-S{j+R#{32;CW@Oz}-kkapB z0Li68;f3Gyxp3$ZICiR{)?az?~cn>4Bg?)Gx$moYWS zll>L#Fh#+KK%+sSL9v}qUFCIC))S=^rb)S>=`+G|E&irtFYn!h^j$=x4RyFhVfCXc z^#<+h61pB2$p2@vTRD8AR@rxnsYeBBBTc<&iR)m2q6#Kx`bJEt4tX+CC^a(_6>drtWQ$vHVtq>lY<2wqBD!Qs@doCe5mO^;?f&CdJ+f*|g) zuu|i7^$7(L!?;&$k`(q?{9iN>a8cVufogrVNGra>Q-s*3L{;NyFsPg=8;42v;zj2s z53VxVsaU@BqAe(7OPcj?&YgLebzp${Hqi#@emjY)-R04L+lls@MVJ@(rR@6p>!pCN z)#G7Gj#YI?V$ic9a!QG=M7#<5>bhJHZgN2Ib7%n_Q+gJG6#z3>e+}UKx!2ddo|H{7 zy|U`JNjfR7>RN=E$gI8+CTqllCtQgI6uEzOtDa2?K@fOFKJQUgeVk z5!2QzSYMck7A0FGpk|js_l(?#fBtqxVyJqni_FncEJ~_u_%a52?S_9v zNp&SMaEy5Cz>i+Er?l>MORL}!P-+$B%uq{C-X`t zq}RJvoh+<-9{G0Jgt$^fE4Qgc&EkEy6+$hM_E70FnYF6YU0mxXqFm5S=2Nxj zO`7MK0&G*{|zt5oiLpeHHcYB2e8cUXNXnGU+&{umXgKlGXs{R$6W zL4kYnT=Ee{ox^t&L7!<+ve|~+el7bqH(TIx&aFI{|d`x`!4Vi<3}=p zCiE?jrflh&KUQm!`D~)9kT#Q90?4oR6=wOeUSK*?2a*u;Si0|hS{8T3yXZmcz{fqb zAkNL9K#-aE3@ICH@XqnIj%%yL&#fW$0+L067Pxt$ zVhdy0|G!r-8?~H)puDm0ef`Dom zYz!Ev_5SHkcOu6c)}xC7i56yfL*8c&qCt zh)?FlEYJ3nEp}EyK;4mng?dkRTuUY-v`$I9d-dcEzD->Yl{*;@ZWK2+jht({7|WJi zRV77wYOCDu-Pl~kyS^ALfQ-&=`|e&ivGIBle7iMfkb4jWGCT7quF3hN&MrZuy3XhX2EYmYTsjLp3&05_X9zH2Lkfm zXxSysu>>@l>=(m2*zsjvizJQ6K0#6(Q>6Dn&vF&vQrbA9T{dP*IDQ59i{h~8x{p#! zn<=ObJCDj`H~2=|_n8R|*Mi$VlgpRU2&U#8jwlQ}05I;R3K1wk{;}$!SKgS#^c+Up zJ?(>2&gv%t4_&h<2GSb_ zY?Po-JBAHUKRY6GQs9jAW}bs7x58axPMY| zDVuFkA83s32^S{eu2_0WL(susO=`(3p%9KTGgmNg|GKNCsb-U7mpcUZF2!zKl1}NH zo$(j?6m3|enL~dKxLgCj`Kq~>+4#2{h}28w`3yIo$Zx@rzojRR=RJVRWed*d&{-6# z!?q9Y3}&0`R7bH$@#7@vyeSg(d3$qe{zJOBZtr?9@V3#;4gU?(0{txbY<4$+^%fI) zlYt55<=~{m+O4>7Pj;6lv|42`U124_?!!^cEePZ zW4aWCWVG4_g7^@cGX4ZpOJuDCOP=u!0lrv8s-j$mTp}+`(gR+A!dEEfcqi3;^KJ|w zt{AoM@-drFju04y1{a8hLv(K31^)}{^3_cssx0*)$Bugbh-}xIpq~?Q^e89M{JG4C z4vj1`ja6ifb0pAYtcvdw*$g(m zNk{ zVXqdSgniXG;x1&8O8cG6wUswk-nu?d4W>tWAs4w}5S?A0Win^qg}`Cx`1mwL_q<~V zYMygwjv(BC8LaACAIV@bhsWHZyI%iLix*xB28anM6WdUo-w9NxEUa=S)UIe_8qz zSF=fJS*t`M)G=D5K-=8?;S@i87UdwtXzm&UL&Vr$ z?o$o<&yh)Jr`jDd`zr0ljEmkS32sXn7-;3t5`*}tiSxikjQ|%$d;ESeD{Py1J&q6;XY)F+yn++$GA5ck_} zSrTJgy6>yO>D&u4SCdbLZ`+Q&yVYUg(r3a;nBB3)L@H6n0J(#=DY5#8C>|5AjrKMkpsomO(@(8+u^`q=l^^AQgwdxm61VQANNc-5hyB!L<) zai8WgZlRl8?UE`ANCt$z%io5tODuu&hB3 zH5h;qc0-5cZaty*1pSqsb z*N-_{;P;faR{YIzaGr4SIB44IrI&+xdV;q7vNzLv-=Y*S+V&%;jLx#Rqp z=V~l?o|$W-pSzTH?=$e%Yf--jx_#1LQ6K_o`5?9&C8^zm?d-A6AWAyHNJoX09cXOx zMHJnk9oTLkMHj`AiipwJ;eV70lhpt`qoLY-;aQ*{oa`0&HKfV5QIXDZTjpQY1Ot;T_lF7`sHN?0?u_)%``? z%dyVLA12zlw#+I$V+e~OG^r`tbA(X)4rrs3Iv*GNZQglk3d%18#^|uZ(-YQsT~=73 zwz6Dn&x2~Gm#|2-%Qp5U%bq6Ma5Q5dR|aIzx(w^>ONL&gAk8e~LMSJ09UQ3Kv88p| z1kd6pxhyKp_tf_*M?plDaXE6b?vnOn-T7l}<8pHyI1}>sf%dSfQ*uDFvYDH>--jv< z7dKFcdkc31PGUriJp6#n6irg;JPdV|qHGt^Z!CA(ZSddciUKI2jj|CtR z08A>CnA63Ar^J*&X<{MDqPmMk7<8UT?9d~dJlyt>4=;T>s4wSb=+od*F!~XJ=`_^~dBgXzJkq0Po5x8(%mRf(D7XxTkWaU*k;n8IoAJm%gIIDAW zo^~A8U8$(=ZSc^*MK^{VD7Z z`$xL?DD2{?E~oM*yJ6e^9Na0>E9Q$C&>KKo-(LQ%hLo}x+7sU$MR+Rj?9s?@FFa_E zD_~;{!ce9NBM3p*_6)D1_LmCv;6*4{ms615fg?IfMu=$o(21y8?8`y2d48nGqw2G} z7KYQ!jWjRSJh#N(mN+%ai9_d^g^Vcu#)KWE#@S)zoH<)CC}V`CAFpe#7B6>QugmR) z_dYa^*xJb)BMcL5{TgBt7zv7B{tx|3L6x6r{A-~CGL5>Mn}ej!qb)1B)?1G@yLBgF z@ygGMrjyg%D8j2zz1y92m@SS+MnM23oT+AV+D~hAsc8pAPcRg z*1CO(FrSB9gp%xd??d)t;d)l`7Kd)f$Dxs%3q_tM(?Zl)c!hr4@yyk|63q)Ffv_5S z5Y>J$6di`w`k zlH!paJj2&JL`^6O8MX?oBG06!F(lG@y3sYuW+ywu$Ncd*SCNzkYT=Mw4#8CJj1- zDR`MFNjcZg59`hr;YhA%$f;k z&|e$E%i_gi-Bd4tZ-fZ>tkfK`nnRaSm=rK8O)FmywA0WSG(GWe5e;k7f$OiyG zo?k{|?+VeWhUC0x6LcnZ+In^98?Set#58DMZX5|Oi2#&xv7LM&4XPugY7}|W*x3W* zXm}YE7YMG6i!Ya=Bb+ae+rxqBUp0w)GWW`0ti&NQK=~KCz=5J102$1H@0Qxaf+B>Q zHG;?iHhq}vg$_NoOdRWJ$6auHHHx?pKZ_)GEPMJ&St7%?61WxZOp`z&YS=CCQub04QH1M!yp ztJG&CTm??)J6MxH0uaXAr4o9r3ftFu?M#R|!)-MD7HOD~a{8u%+;dAB4*U}){u75GS0s3Z~1aPpV#3XxM)xB$~@IE&CPSnhVaM_XR83 zF=w{Z&R~$7Tx`k*3}X?duxP6QFX$T;{@kF)7C&u^S1dqZDR`X7_Z*SHJopbgYk@>=xFOxphxVWw(skpUrvD03qUK-I79vhWaNRP6S_Y1M%x+R?@I`X15)esoR zLa=zdXPgNUpR3|;zVX;bU69sWX|fM;+rL0{D*EDOKLy0nbc~Dqowu3QfRJC^1ahNO z3K%o-v^ls}_d3~^2rlLD7uj2q13`@GyJw{Lhwdp0csm?AcPIDafJm$sV?zlZNMDK6 zNUN*reXL&%>mSfj-21oiY-r2kFW=od=3B8d*}vjNppNmAQ&yD(V;6QR z#UfD?eF3ok>7>mthioKg8_8H7SD}>*gAk2c-5SU+q+S-w zsq9BwiHI3P_Hr1<6lP^aE-cuDCOA=T)+CXl*F18Oz^*hwL8FiQRfuVM#B^xM-kv~6 z(ApsGC>s!UlhER1-tQo8SlLPlV3y`s7K?^;?QGQ0`yaE2LGgLBu(O%v2{$3+KR>w) zw)HxJv&gv|S)HwcD)NAb#?(%H%3 zA~-`q!U^P*otY9}JX-#?msHzXGRSaTnm`>b%d1|_`Z+qU=e2+G%i4X#NRd5!_C5Vd zt3w}4AWQz4p4x(D^)BYr6wJV9n^Ly&xMei{fE)Hwn&<>L%yB)PKx9$Z+8k;fO!fFN zF84trEFoQ~PQJ6f)jKe5v2+ctzZdc`zPl=Z=enANtMYtPul5rauA3w*=e=h9202QQ z6mDh1@rBGU@oqHu1>NuaM{#c+Kvgmlm#)L!MzHXq$4*XtPS{WPw9Q`-r{J_pjY0F@0Kc`B__pJ~G$ z9n<(mu6l@?{?V*|C1x--=3la=gg4_sr5$uh;}T&$f79N5*cZqxsc=kF8*OUo>lPx3 zkGGReA*0oTr((~SlJyn|wuOq*7^`C_S_1xWoulk3+XMBu1w6b%{kbk5R0=Y$CW`J4 z^KRTF@e3VmR0JlE9st}{88>N+`xgLGgG~Gbna7-$9%J0KciE_WWsjU4%N1(dKx4JW zp}fzVzJ)28%#0U84v~e*rMZjBBI>9N#9gEQFsbj&`i@mFuQe6y0<=8>Ycx_&tnXoO zQ&zRH%u?{%P_*;3!SXI!5<~G0o)#~4&fS9x6Cw`i+mw+jeq>Rhbwyw5rf&FLFBee_ zwR(KbujfK0O%rBdc{kz;q~T3N0!}g6X7M^m7pzet?kL%Y*Oi~^*8JfUn@QUtFbS<^L2P_8DwzwEQ(zhSvmT0su?v(Kq@Vn);j{QM!L9(-N>^s9$8~gHg-d4Ud zsVdv8*@KOYqD_%nt%6|v{?-1toeix|pSo>d#Ts#qEGPQI4hcSJagw+Zi)U;=NZAw%%x1!|fBvbrIT|utC(;0)1+Iwu!lufNT-j zbC6=eqps7WYDWNvrhU-EP`)wI0?PNf9Ggvh+l?b4&M2QVN>Ee0etsB_R3pk{fJ4?c z@4_z|^P6sPYN|t zVg@i_G5mUO-#n$I6`rs=)a92}2cxle%Tsq+D>CR4x3%0en$L70F8npIay~PBADA2I zbKR@vvbsCd?rJ~iG&fJYWL2YWC4K_lCmQJSFy&%o#A%B`z0#OTzK|2_vB(5BafI&fK&C%aPe0-IIPhe+?xNdpDkmxHMRDvlx@bjSX{(=?}Vt z66Zyqxcg}r2&;@e``ksjeXKQGswbX;8uRGMx>Pjni&VfA9zZ>dLkHxc1x5QE6P>g1 z(gt0#;YNd;td4#i>811DA^fQgV4^Uf>~_-SWhp01$hG&Wn4Rn53F|WZq(=_ zB<>LSsrWym^?H?Jeu=aMBi zCnGHPb$;()+{2RL&A3HpTK8mXycOzihy#hHl|{O^dBgyfqliY-k!|a#d$G{AEiZ(> zZc9D>edBUaN*Ki0#aD&Ycg8{HL?QQ^tg;~q@({<6^Z#4-$F!X)#1h)Y-eG5uF{G-g zP0HqBI9hTw)7qAtWgcf;4`T#K0qvhEa>>p`QXb8VIeeAt0^b%8p=r=k>q;sWcn8{( zBh5F3j_W>*kGOd${nInLFO%LAe?;TmB-?P4=*HVp-?_j{KQ!Lag*QE75}z$a_nC*9 z=|kOWn0%R%%V%{Rc&-J^q2@B;kaC5tzru`oV>U~X29JW;3bTC9kmKm{+R0-4SgxIf z){qCQQC~IKzR6RB(;&!P-A5h~i+?bP02!;lK4JF@zeWeG#jSsfJPta6%o&BC@GXm# z!IO4H@mF<)IhBqk%K3MRxsFZiXGZpSg~h z4K-s5n8qU74;CVyl2s7edmB=xhc~<^KDvp~p#M;AI}~I%?-p^27@6@*Mr?&O$_nmC zYkCMSxcIl0IDVN>%Chi4<(q2*-4ymyq?J;AnGMwU3T;}J@MzOgQe_%tyz?k`+S!yv z6!5vcg8{NLb$f2R!Q`IgE#|bWzeum8R(_!0f768J%g8tACv4>hZcPAe8$g1(u3`5m z)t$mz6&w$bM)&a)XCFAJ3DzTPt>pP+QNuNYXL251ztAbJ@+5EoV@(4~sGD+nkohUR zm3v(q-@72>7~D!o7F)UxA!dwi@>_h69Bo5OnJb2|`Mw|O-D&rnlm2Q_jMB8}xsr%o z5I4Rk&(#?Vw$49yi2p2_7;`orUJ$LPk>H_X!|#<*KU_*^=yimk0+I%O-T++EO8pO~ zDb#4p%`m-(CS|x-`X0<*y3HfPEy_zowTv2FxiwWywKq?tc=3WeCfZa@65WOIZMWQA z?8cHu&n+iVQ~Y*ukD=(lWCLbUp;))+)yg$hf|uy>-E) zx6c=Ww?hz>H|C#7VVTj?JqkB9o%H^Ep8PDyB;$aP?M^N8UiKtLpd?M#ahEJ<=ZhnJ zQtg#{79`BGayTy!7NaJ-wnTd}VtasHzZ{ai3)Wqd-t95zhzmwNsRb^^f=?^CB|N!- zv3Leb>*?^VP2^>hVjy)lG65kf6jJ^CB!V)+a4di1W*Q_Wtu%rNd%R>Z2qA~dygXn80E z^wp`f?88Ml07bw+F03S~Cgq?w^BwIsC-H#6(A}0e3VPEPDm}0?^kt#kyMWWh<&%;(z$V5UkL-x5Zh>9$M;O$y$-)RPc@P zaYL}g>2L$ASP@Q5$F*xHj`Pp2AxLVR=OZ=+W93(ZV~Ae|fRv0=&(lS?s;k1vR>!E0 zu?`4SC=QZ9{Qt z;}^~ziwd!$oAulyIKAr2ZNuL(-xDtE0KoV$=^>{ol)Cv1;`I%Lf2g#)q*zQ#4?WNP z+$ywvMx!b$Jwo{qk;A)rVG7DLPcorID=qk-3ZZbk>`rLCgaz>&ttK}!@40}io<#4 z7ip}6AWhFz?eI{um#y;jR1ek6k{}8k3Qu=~$^Om(?C`IdGGBh8-z-|jP*gm>qmUnb zKb(D=z<6ks%kI_Kc(z(kt3OkGY~~tldG}iNknP<4p#$4AwPp*3uu%IkdE!a{s(j}k zuosP3CbxY?&0DG)8Zj(zu=xClFg|d=)CO}O}$j5jgdDtPdnA?=&ORi~c0O#2ZOv$M{(#`1yU=?e9p@AbN$3|Ar z>E_r&VIkV>0F19pvRvudLn#IvbYl$ZNte8mu2kT!yuz=6@14;Lcw2|0^kn%Q(SrM0~i1jHndRF#8R8?L+> zm%|BvnLR1Tw98%x`!U7ur0xZ7jK~3Djg-aCL12vO?F+4HVLdNR_io6%U>FHv38Be* ztUovf199V(=jv zWBj!|=XPd_5vaH_j7~B@^PYKl9A8tE7Z@VqXDKcKGhuSxpNewzXF%e#+m@9+^Kc`(mTU${7h_8X~~2(P5G@tM!~s@&Gzpm;W9 zn<~iAv$;Pq975+MGD?@*fOr9qgwZ~Y(Oo$+3*1Nv`o}b2^SUr<*$pGknz|nB=(#$* zQ}=(Rdi5lYe^^HdTTrcF+!QS3b+idr^-OQ<8W)XnXyUZJd&()WzEx_idk@gC3BnR7 zkdoKI2KVm%uIT2iiGfq|x1&1X9Tn2aaD1Ub@dE#HTz)xFtav@RU^lB zb;+c0E_TPldCq{wzTJ(_T4Xcv;o~_Q8yO|=r6p2{K zgD_Bh-s2zBF^)YrVP`xjZcoef$(0Iv<|^eTm_2vf@Vh#)nSbpOojz}ZiJA%Qx@K;5 zK=Fv)e-!T`W9nKpwwEjUo{-HQ**+FY>TkM9+U9aL+`;FGg4d1V#3N!4@cMcwWARwa zTZ`b=We3o|5N_xvCa*2VwB95DvQtpUQ*?`GMgLc+6lR5~BKeV$8QT8Ym!C2-E_b9(-TtvAHzyFK@5Z8ol!M?X!M?=SQ26awq+d1Evoz6_6 z17tXmK7D@Gp`4rTlG=$i@ld1(-w;y`;M;e&7~c^ zgMg7EOMj&=%Epd$UFNz2=U|;xCzq^gr9-|a*lC>&Z@6FGgW_$w;##yh26@d0XF5IvtE8$_@_gB)?iH@(#FA{iE zk%29(b@(CdM?mbyUX;+_zZ(k}VB&p2#n97@DLV3t+2CKNB}PI5kYS9cLm+oO{3*`m z@C#@aT*J#<)x%<;5ua!FNLu4IOwDZV+|~z^pqIqEP7i=LvK{C?67ELYlb)Dp=3xN{YsH5Jvq9UD~Lvc9dL}2V4x!S^CgylKOTLoytw? z?jCafUe0g6{_nQ{S5wGk&MX%5hBHIEL4oON=FYn%)r>86m}7yW0f3Y4+SdrLq0kz* z$8ET!F!gLRk;408IshY`53)dk1{`umIh)jxaZ#Llvec@s{as=6xz2#a1(wEjbqLC@9Ot1 z%G9o7(2s9#Shhya*6y#U=1|Jx2I{&dNGn`es@IV(HZ=6iD8BO9RM;ULKw@#bSib@@&PbR>CtSuv<)(m!^Gzm0os&!x%bN}dI3(VDYY zP|NTU_4X*G5oEW0JJnltg;5S^j>W#^r~72}Y*mGgvAY?~ej=Z1Zy>etssBt!tD%5P4kRDxX;v|4B&L(IBId>qN3$CSNP-@Sec>Trb^dYBKjz`rnd(( z7#KP?%rKkYg@-X+CVvUDarMHxI*o(=ug`xMK_YC6P$nORTq!g^KV{XgSo?nqmnk~} zVCo$=Fu?hYMm$s*B18%l$B$yc7xsy!=Rjv(PM8SdCT2Acs$1%j8`^ywQbyqCz3w}! zMo~xncl!)qXa6kVLf5R-@Z@@MLkKjxS$txRo;+9>y4rzEWR7)N0@8+{aeV8`>XRU* zEfk;QL?xpSRtbB zqd+^fa@^+H$b&L?C8E&l#70C2h{Z+U^`I|p(1Sl{{t%D)jink&p6{lXD_lEnQ_`I@ zHonKRA-pWFh3QzgJ?!;2DglimTSjItERZ7__5(>?nq0imjBhYsJk zTv{H>1512ZLCmX!6rDu%TZxSD46yDd{RnOvCe6 zr#7$>6)|Bys#p+qr0REZ??Z>MI1YJ&o5W++g>3>V2^N{UBT-{=&v=KW|6EV)pB{mN zaBL&r2mpYPslg8l9~}CD+II|UA6xb8I?~~J6E}H3E7l~Kbt_(5zKX5RMEP?}D)>h$ zJp%WT9J*K5fe3;3?Dc8M+q?mVp;Li(k!I2GR)&r29<=5!SP{4f&mRT3rgk>na~+-f zH#KLY+wvZd$}#ZN#U&RJd2kpHto9mZ*Zp>f%7#8$9>LLUX1+lR8Y>Z()RYF-UmLPN z7B6#Xhpc7t>9-~0A-xV#w5`B@JPq>!FXR-q_SG|^eb!s1`iy^W-d(Ljvfm&L{@Y?Ao`_CEtBHi>6?4Au5L_KxEc0QF~i&0NlAVAoiA8o#o4!nyDWIQQ?$WG+4#Dr~w^`^joyrQUzfrP#Xuf<>+Wd_UQ{ z(_7|P#PVsVU+>|O&b=xn3H!5-atP;HSG%o**~7we zn)@u59)^7WeotU@D( zKx#-HmQ+wTz&^{I(4Sf1Dhw@PgAhcM&h3HT|6RLww>X6<6rKU+7ST8seaYgK%kBbW zj%3QMC9BM;9!nU>2c>D>TOJARDbUO~bWvdUq^6VJN7Vp7{JKaCBpse*&z8G?tHHKU zAb4>IFl&CBwtvb60Mar>gN~-2&MmeRB&?+xV1Cc!oJTnX+PIq-nfAp|quMYD@~#5B z5|RHCF$m*_pFP?4zu%T3iU$3bE1C(A)lh1YpSaia#z6~P8|>qTA@x6?Ir2%TWHD=M|4?Bkr|e>6=qFJ6FZrC(E;7ix(da$PN?q4` zxv@S%8wASc0vuTJ9G->x}d`8U^Q$bSK zXz^&Xu$=S0*%#MHWow@DfB+z);(8l)*6i5r#fjCUS`GWrl4AytdBh?3Q{eBbWi3Dc zVfR!qA*R58P>wcLaNJe*=<=B@SfsM+UukhbpV?|z;^KrDB+~!fZg(joa4sw1%iEm~Kx3 z9Mp1o8s%oRexpiQY%21)zb&?-pFvwICj4LxjO~L5&p;>W9B!4Q-{#0K7rcy6pdeE} zaTSwbbzibqv2c`MLKQ)@Cvsx3KI%@C8yCs!PF_8!i_S2GFen^2*{=8c7@Gj-iVDH1 zV#z2sWDV3LY6FQ+@TIVmvg8D8bteM8B=aFdF6`sVw$0N|lKg;^XH8ezIMTx3 z={C%NtGixWE_smWnrGya<(wM|ut9pad$ykJ-DJcgTu$o6$e|aY<#lH`vi-c-!kk6c zyb-NPUkS6eC2&H$7)As}Z=mDfj-gwpI$Kt~xJ2{Q9~EmLnlPjJ;3sNzbJ$vis)Wxz zzGrJ%(Q(3>M2EG9Zt~H^umD-$ z8#g0(q;|tZhFrix;1eP?+$iCLs10=-m1lQ8NIHrXi68iR@x8w;#N3?t2rtkp!So;_ZL6d-#^~lH7w2!3JQP z%LCVSl%l}ZVc**Jo^nL~)kKJxunvK<{89cvC?=h0#a51DodQJ{&9W))yTfk!l69e0 z+?bVehMjP-%%8J&uwJ+;?$Myr+8W;A-r^RoqdJkJsoT~;iMEMxbEWQ=QLIU1g3Y2l z`kmfaa+^Id1Tey7A3g}6-@5 zdiLntQ7&S-T!7AP^0pwv6*1c$qIN_SkdZ^6T!+LEi(Kcy7F>%QCQ@H(Ic0q@%W=oN z@hZgu^g@mEUsIl4*kSc20#yfAK!442)Jv)L04vV(!_7+v)0JP#WleHoGo->)q}l#^ zZ0rNP`Lr;fLV6%7MF@%)?sqvWVv;kVFCs!br(YG+%vDb0r(~Sap*dH<{)t5_titsj z_gM)RQ}lM~Y$_C=&(~&WfKZB`at5vi6pzzFV6+aJAL^ll>+{|>5m$&wG!Nn&UkaEI z5vIWFA*m~Y&>ypgIbmQLD^lm`95p3|1*jVVQB8UNwjzVEDmLg&66!se;E+@!S{+FM z`zq()`pl%g1N62I)s3o-58-36IOP<6vwc}oyZca;d`kN$X3fBvcc`?}#5kR3E5AGy zjs-LTbXIAn<09W8M}?C_tt07PI~T5anG6v0cD1p0aCh#14U?aY0Eeurnmlee11geX z0RBj+cwV>cxb`7}k(+)!8OGww^R@RegWJr9v$|y#ym*UNVQN~ZamcwPU$8&@_XSjk zjCo4lhyulwmA#ygSo@bMW@&H>=tzq;di7_E-EFE*3$B8qI^?dkR&Lolug#J7ZXSc% zOp3`X#df+zz6j%zvv{wMauo-9nIMdot>0enG@8X>+ca1isj2(X9qXq!?Lk~^K*J?0 zIR&A>lusLvdr>ST&x`{23@fyXo&>3bkjo~8C#I4^y>#HS{&b}LHvtpGA5VDx1_L}3 z+%d+7`8w%8=R7pG4h`jQdkbQZg`o+h2bDZlX7}UQD>?%jh0H`NfcH-}Bnk%Oi5C%{ zpK}BKiMMfai{{*#Rj?-fQu%FMzDdP(IAQi&XHQDKS)z3BrjD5Kwv>>O%FkHpECa1~ zF%84A(AkqS)~}o9?k4XpW{F1o28iUWMm0Yx*Byqw(R0jLtREPk1-z=CUX}8+OaI1h z3(h&GfW;i4n}OR>qrL*#Md}sk8hyj^kCd9`71apM}r)bHc3Pv8h|aOP)ddc*{cNDY%# z8x}yWhwb6f&Fbv4`x)h8ZmK~poP|ICbwT9^3lU3)Myn0CX{mcAFt22agT-bj0JJ~4 zmn45m3N5#MqaP0`M>DX|YA-ks^d8?HZ0Jt9Z_Gqf-5TJ^^i-nZm}gsa2I%F? zx+i1)s6fS;JQ$@PZiLC~%SC_{g`W^O+1knE?&aMIlGa?z`GVQ%$FWhRDeQ)e=pth| zs4mwiFkqqn-jH-tyiC-|VKIBcLJ>`M6yd%QC4oz9g}V*P8BL(j2t6K()epDP9x(x; z`RR4{*uXK*>2r;TwB~)&_-5>K)+rza9loGhDC0`8Lelsszq+!i@y61k|M|nf2_0=G zu*$(=S`#gEv5AQ8q^B28%xleb*12N z7&FfI%&S4v;FfI^3ART9LpYt60#8Z7N#!k|INt=lu>z>qp}p8PCtpY{+i5|%uf!?f zpa9|x56;mkWd>wY5S@93{?!06K+eDY7~!$TsE~hnp%|!)Xs7%0_2-qM5B+%$8bOZ4 ztl-^||6sD2X(pTIuA-5v(xxz~TRFc}d%S!lu{Q5eJ=N6h`sVU?(Nm8&j4!KNhNAxB z6IB5Kmbjp)l4`@jeEpO?6`UljHqch!Bi%u0$P5&ph6=#J}X$Q6qmSM9{Q9;=! z#4+@p?5+}QaG0=&^_`GUbK~PKq0!o){DO>Mkte5xz9&7G75buK3qv`}Ppp6Y@Sd14 zvk6%JgzC>&P8}ukQqo>qy30vW=owOSxr@eTmcQ$)o*kk!e*<;}8_qB>y}OT=W=vGV z)z3&U%~U&|CfBiZvW9;5Wi<4LkcloRul`)~eaSf?L<>SY+6+vVhIimyq*IW;0@8uCR3KfhVPPVjH${L+Q>6t5ZaQ_H4e<0eIz!jK8(P)u=<@a-mK z3=c9Qj}ZcB#G%H3=iL8?-TVACy3ADAtm#*1Z$%QrdWf`8-^n)l!9l-85L0OaTyT9f zX4ZY`^cSh^h)ePH)3QC!=#xgbr`-d=X_P%RNW|_ym^fqXc8lDC*H!Db-IP}+E2G+U z^cmeO!%Jl@XzdN0-6I0#H!_%Pd6lO+i^fy%(Vjvws(mbq6l^v3lda>H+x&;%^ZN<~=5z{n(slama+WQQ#!cnEi_&~;;%genqWf^N%4y>hXOqLmhFwSoXI5bI z1=cM!O!H_3TGBC9kCk4&gq|GaP>txa)wDsT_w2-k#HCXpw5Zd-#miXB+W&k4veGLJ zh-c@CoBrpCuafJBPZlpa=aEQUTun&c|1Buv?tl`KXeM4Ip5Gl|zx#NjQR=BdfBI&8{ff0_f`4EBg%bdCF^Eq3bt4&~>+vNDLovYABlNA>y#^vDYlbXfZwNRr zu)dnDvt8HwO||kki>W8#f-?2cn&e%=|XWP(THJXL5|ybC|~2OcsbCyUz_mk zA~aigGbhN?w6cue^Wl8G30dz?o{K7qmB*3eMt7uAFg(v4gyKzE?DN`tb{cg0V*J+AY^8PxNK+Zp{T(# z`{A-_B+S<8W3Sh=C8Hmm!2c{^Ct5a2$V;?OSxj($w8Lel%+X$wxI6_}pjp_W9ck6Q2G&Oom9Gi#m3{i`$kSnHINH8Z@m zG7^qgPa6-2s_$P(hEr^~a;;q351;urw7ESrU9SfcUMsu$#Oa-!F-l=*h$Q!>Q5LgK zQ#!w@$|W2Dzbsdq64~r1c(D46!O9PpHtic0#?#u$A>g7QyUgOJoG_OpU43%SaJj~>#fkn@?f!1KniW01&`dEFjMMR2{35A&ci$+?uDFlOGx}r(~l2$qXnl3E<&;L5p+mR?J&5s9^jj zn%eN8Mv5J0ph5T_1m-f#JYF$->HyAV`>slnCK;Zw(vw)>N+yy#+LM@!lEbws1EK#0 zP-jMwMf<%n|@gaPdycQKbjX<>5?B`?uRP|2_E}td9DWv78>>mb69Rn~*vIrIK7`jd1TD#&bie2^R znqP;CjJ@_@^Rht8w*6QK^4d{-R_Ru60LvkLPv(#SRze=juY8bbjG451DCBC8LUP6` z1x_9)$PSFIxGyX%{TO#+pQCbAX3E+qh0n>-Rge*Hg<%49;PPU_Icd_t$ExDdbB187 z((rSHe=9>h1f^NVB^mqh2<(k1uS(&Qah{8=u&{i|p*fjxw?ES*Z0g(wU%YC7{KsYz z?rn#%Z)c)4Nin$;yN!XM>+O|yn>GAY_xD7zzOYmKF`^`C!*udB8^cZ>L(NNQ?!;5F&_7@!lOh}5G_{Zm5m_olY)h1!C?w9*%a5d7+9X&{&4L8U;9q5h+ zoPwFI$;O1Q=D5(rFsRR09R&+}FF+4d__8Tbcx469Ynfo|M!tGX3>->lIkk7Ic~@w9 z4&Wx4Sw9+npPDOsRA*ve`%8Y#J*^xR`tGSO;d-0xY0h0yx}1P#o7-C+#SfW)HC9N* zMtC9N{fK#X-&V9H$rtOo3|S}_lxiF^d|n~?SBy~~{hN}4w!dptgGzFkY{32wYB6|) zZoZxO&*?t~$~}r`yX0WLcqL!PN>&aY$lrHX*C+#=z{WCcCUew)R$oawBhlKiiq=o3 zyyzZIKE~BU3Am4ORAS0+g@M5spwGS~BnhS7!xc`iD+(%MZkI#h9F!fWDUi}=7cs8q zs6LZ?lPe>{9I<%Gphl%rNuPTB@_~|8)fQp~7UuVfLu&%WB060Cu*fQ2YKu7I6G`WE zOpK$*=+aPHfDgohP2gyK;U1$Y)JehU4{M2)PWcRJ#Pe{~5HAkNhY)mwGR|^B5SNsld)OXfPKZ&wgMryF_7yORhY*6Za zL>w`lrR9TqWl-?v!2FBAv)k;~2Omsv(h4PzIy4|E%EA1-q%m)KnC#GAc9a<7;>ZZI zP`So?K`P8rT2O%@@W{ri-q%&_gC#YFFKS@y@41K`@V6>$xr4Sxu{VTYt8a_zZ02yN z8P3ydJiAo7rMtZvQT<>-&ZpVbJ8zs(K>``9&?Q5Q5? z$2l=4@H;`3J!N%~xbeOsj~&Sbbj#xnV+2{REKu(@jWkgqxGMkx5;1y-0{^$KzBYjY z88RN!YPH5d5;aG5e*_{~h#jq~n5lmK4B@x+i+FC)&N}Rv&G((|{S@MwXgG&=kYLnl zfz0gthFFDz$2(K78%PQNR4@4o&Wx~N-_a!|7C82$@lfCsr5448>{(xLz3d+q#h3s% zwqx^kFoum`N8w-+4@(bLnsxb<_K%!$*$Oz`i2FPN%c}*(66*{!E&fZW%HNO;c<{Cx?fr{uvEK z1W9Y3bGXG!wupeEOQ)Uxkt51yez-Mo6!RV9VW^J1ZpTByu1WNAW+E?{Kr{> zG~DsHN*rN%cjsB;Gp^7Ct+7o}?;@ejHyP)w%n@jX17Doh>ZM*GfRR$6RY%oSV@UwF zkKE%4f?&hoGjEtuA4(B5H=fA0!E?5~5FV#E1A|o{AwU}$in6`iZ-|ytoUj!_(@vG~ z)$*c8+C7r%s@{7q`DB}I^G8pPATvu1<$hrC`8)1t|5GOrfNL8p`|P3zA+I6v$>D$9 z>l~;IY1x4HwI?68ypK|@fX|gMgQV$oj_l)Pp2=eqvQR=llFNgThYn- zm9~6spy>2yrr760@I-vOW-_d&Ay_NiC|ae&@mSO&YD4|YsKkW40fuA;W4WIdC2Vs8 z^I2?;u>idsOF7k1T5(kx)w3+jKc_!h>mnv`DkZT_t#D(&Mau00-1g!bdccTVUgJbg z#ik6QNihqd&1&(S3WQpS+TzAUYX6lzgbP5DO!)(sg{7%ey6gAyBFO6YL|I^|+qcDP zhEuh9yTifqAOP}H`VV_?=FVt+_ImP2<3h{oy;&f0)iC$5$#L1;ePl0LVKV8i4svCQ zausvt7p2D1;+*H)*ALC>2R7debMil<>jXX+0X{7q1V?f zClwCG^W;a*{Xl9p01gX-$9k1rk15ZTIys7htyhit@$foR!n6FJ<s47wg=0wni!Sym;bCv~ng|st(2?qFxN@>Oo zcQK1K!L!0KJyFP90zEuIHS=Dwau0SdFXMIrP6oUNV{uHQ8L}G)!r!47C0o}f0B6r@!Fy~oy9RJ)HhRS31NtKauuLr)C1H?i-fuxN?S2x|;Fg^oXNNh1 z5iVu%A3C`nI+YnFs)}AUEqrJ5F5K}3>EfH{-D(3s#;kA%`k%b)q4UmzfR_%=7hg{L z30sc=PRO&=`vXX^F(8R{jJQ{ehVNG2iJqo~fkSZ<3jONL9RKo<>v2+n1bo4(b*?m! zoVP1|&@d1?_+Ch`GjMG0$R9wojL%i7m@Da(WGS8nm|P?(O}nqET_2g@JgPnqV29EJ z8FUv*GP)dM?zslsNdDI=(i)Iwon>_e*iYBXOKY#3a2Ar^U4T4X6C~Z2u4pfW?Zu=I z=>-$H(x@gcx54fmQoMl2e5#lp={&w5y^o zU;DibLZ|9c2$`LnIVR7$zEQmq4qTI?+PFVi_$otSve_S7AfILng;~+r$1~Q{+rQYF zN!W&6p6+bKhyy!Hf{4JH*=>PiC#Wa;9H8Bk}@3xLFMXuhjk)&M%|X?jci3|P|KyC2{9Cv+)8QC}!M8wzqDzLZKQ>TdYPQOWDC!}r zu#{EZv+7)kQPn+Xbh}0Kr<2yU__cfsFfmGU3B-5tRiQ8;dp>vQykJczJXp0lCZ?TzS}V-Fa9=BI6x1|(BN1fFjtqQ?Oe9J_XaW+d4^FIz4 zh-3_S0JpT7^qZ*yjtw!z9$a4S{#T#*c`d{nmpo6r7|-e_0lIQ%H`u3&seuG6P_2~$ zt&R~5CUEm99lKpSwrXvi48N??()jXz>sqzpzYpY3UCDp8i&SY%wX|zq#|q50)VY{m zA^CsD+cL8Am%Vr=H`3C7x<3eha9W>Te4Pe*!{&EV#ah-lT+8MGq6qKh1%4A1?*|?= zD&x&76B7^}c6_vT@Rbn=!hxf@UWV;}_7{V#Wg=BWO_aLEug;};l7xnrEzzCThQc>6 z1|TNW=W06jNo{8Fx93x^34IVUn~eEK!!;=wwB^J=rFa7$jTOGhHfHl_6PQaLG*4zj z8jydVOzdR+yc34Db?Rm^sIoGAgko^frUsz($CObT9*2Wu#vbh=4KVX2o^1#3fg&RX zB-IXCcbGsZo}?dwJ#sEv>bVBX=qjMJiu1~9zdXWByIO}ccY)Kwk*D(njy2oajdtU7 z#C7LVGV6eIC$xZ0#!ub-%~v!rGD;eYc~!2oGb`BSx&rsm7eP5M%Tb zX|aIbVM~z-l@*#f;r!Q!Nb$ST{@m{4(R2&-GFd`jn{QX^r{Ivmaq?pxr5L+(Wlb?k z`b|eu&_;W>JmemVQ&+Q!LaO0Ay^T%&D=4fZ41_OyMKHqod zmxuH%=#sQr#|&re|+yjF{naDZ5Xa*nF`QF@DtfSseQZuQ%%Xq1KLYu_WY5+zs?J zTwTSyE=9JnerJM;oXyk<3HK?nlxap9aeqUTJt-L-iyhhT6NGFc%aS>mJhvvq#^KT|4GNti=&!WK8?=Qn*)7abgCyboax zsEG0ocX;En!DY>4v}C8I0AKGGl<_f>$Ia5ugdckm{=7ll>@OGL-eL9*(({r(71aoQ zM;s?zx|^k^pBeG0HOnQ}0EoNBua{`XZqXXQ&ZOfys#3@%=xoMgq3+O{Z^z4>>wbZ_ zWm)IM0z0>D;`J;yLs+%*2Mf30GGl7MS?>ikr1V zc|dVsXbiwe@IIJnO6c;AsNs$Z=dG16C+4n#Ll1DVQuAKcphaGkGS3R0s&vymb4|O9 zf$kRm#{2%&(@Mnf{>Q>X2*hq&VAgE_9qmtTAq2`=`@VhW@|f;AGlF}Bstb7pi67kl zwG9?{u$1mWs>|Vcb>j9l>^w{z%M9*`-ivWgBEU%n6sCPb`mV;HgSKw&3UKJ!13YE4 zs)69+1oaK_;w$ca4PVAdb0PPIEM|{bGXKcM@XseC1GA_&V^u#6fU*&l(F$7}dDy8Y zyd%O&k6u2sPE2{XbUf?-7D?f|Z$C7L+n~av-)mSoO}Twn?UUl&`l|=~N=+}&D-FQh z4@|+~6usw}56pmY`Jh{@zLer?G9+xog#%k$HAUmp7oxLSLMRQZfRo_b<{8;R3C-3f zw=>R3bzn#XFUJMy3z#xFA$QTqeQznaAteAc(GpVse>04iF@*t4YZeNTfB9TR^z%gZq6`SYobKUVCzcloY`;yFN z!b60+Z%_oN{A@2Z=d~PUCELF`5i+)c`F95xN%T*wHT8OHAzW4&K56jV_YIgw&zjx3 z%6>3OQ)6MEaC==$o}09y+awRtEPA=*^CyC!=!_b+@~~#F3Y6v{v4(pAwG`3%5Pq@4 zdyq8+pI*5{7rfWh#BP2Dm8+)5^Wq(yWEQTU(9SDByd_VpGIJm`)u`LgSQ^h*_1u`9 zK2>&E6vcLuEmCM*1WYRgAak9Xf)Qc59MJ^)EoMaHe#_I^-{=0hON7VcZI2XRaC^{~ zXTI!ovbXtn7JKeLS@}I*8Kk-Z6`uo+GNGnp^a~f0Q*{}G8OMTo?r#cH7eQs+>JFNQ z@^urulPQZ3^eT`~bcPb$!q&eVTTo((JF`|Ce{Xb(2?csp$u}wmd`x#W&%Gl`VxT(l zX3;S?R!71H3$U!tfLu|F1J0>201a~9@YGBjvbTKIh$!f9pvgeDjWD#Yxxr<`Qw|c$ z(G@0tZ}4%5SO#rw!JqWLu^Rq?%i6)G=u(w|$3xYOy5CkzqC7F!6SRH)ir}vpWl@j( z=_XtogT3i3*b*kXw$@F+DZb2rtI{1Dwqi+r*Jw@weo&CnG&QiKva#cA>QOrigtN*n z;BMr5_WjZ5^5Ps$h~D_^ffZjfWn!3hsM&9HKlV&*+pzC>6vx<8G#8c{G!2N2@5*Vx zhEMGY4k~eu-ZhZ-DQfd4Cf-75qkT<@YL8nhxpfk;TgncLIBqQ4gnaz-kp(O?{nLBjNz;7cv)8rCgG4qqe^=w=>rc25_hD&P{REq>fSEfHp-M?*%Z$-LVXYN47cKh*m?82up*}<*NiKH9%KrfmRIo-Pz73n zd8kWq^ADpy@$emXY?*G{XM<(a1)AAhaC~Zqs5b85I(JRNHL|sF4r#(VY#_^*ejdqv ziX=79VltJdZ)#&1QvE7M8(%BK%Y- z0}Je|$%M-1qu^~|dt~Qd1G0Dg9T6K32e`@0(-sFcix>!n4_alYxxmn5->je8asB~V zGjx)4@_EpNS^;w|4m0OdilnwZ2r6QXn90Wj9cgEEVLQ@hZF; z&8X{Yy@|MEP=+3I%Y9F5Dwf?G$4@k4gtU~;=F2F3MF-qolYa#Q{EaZ{d0=_*U}^u++? z$`*q#pVAw?4>Q(HlC&RMO9lxl1{kBah7zx!hf40ic+?xo5?<_Kub7BomB&FCC_bYP zp{*rxKD`anu$}-T65i8MP#DVG-PLwGtHz^gk_8eg9LxP=+Uob(2PDX}f2&4lgeqdx|g#BD$BNQDM^B zAa~OfiGG9bX-!?!p)%y0-NDpqZ|tZ3^% zH=0I(PzkXjL;q2&g6V~MiKY`q!B;yMRI;xsd6!)ymn4+9{#mt%?EA`bS9s0jWGConiD|B#DQh}oCFh8>;^9Suu>{I@OR%FMiTf|Mn(j7yBv$?xZoeY zl-fU2@r~HWUkO@0MCAD=A4iEBHuypO0US?zZtS>2W5DcZBRG z|0&bi$~fVZ5?ak~kDmKYio7Dc!_9G6$!2HqDMe(xIdtYyzeJ&h`zso-{Z!t=(w1b4 zcU~T**88!*uU${Z_g;nHUz~Hd$iv+(Q4P!cqNdYFL-#1H7+{ci+Y4~B&yG?qKxP%G z-wSYqL+VcFq5Of)L~pWvP!P07rSnrM#mNU?udU+hE&8l`9C^ZRhax%lGh2xBNm#<$4-$qY3>O{M$Vp(A~yecNc=!?H$B=hU0eprcfOF-DDIG;J)k zm7z9P3*gRxW9q9~YW!nlASNuvVBflpE4PjIlSrRwHkpf|2si~`oWE;qf?l#g4a~6i zJkNXC5#J{{lAN`tM+b&{31xkWMvb*)LP?Vl2wR$xZgT%12i!$3>et3tP~ClX@*i_Z z(Xj|GTBfeT`Oadg?@OsXk*pa4!FNdsH_Y9IOPR4yyFdHbwgbHP0qJrgt7~wxw?4+J zK+7)oflc4IzS1KB@4TpX)ieL$7o0@?F~D6!?8YiqU4czY&?u=6 z`hX>qj}H>X1+ z@1&scZtN%u&vma5u;pP;NJZDu8#eE|wbmR&PX3{s;jrkx!1>+(P1g#bXa)a(UV0qJ z8!SlxV-Hd=!a8c)ci^ign95Fp5@P#%z;NLo!C`;7CKqlXmixa7p`V^k&YUx{Dk&O% z*LyKMxds9`g_gfW5Sl3|3)R%MEnR;YD_$IiQ^CrLE{S%H78E-j)q)XlM*F*Qg3<)1 z|Fnh?ux_mG#snXoF)ykJ&a1{&4B2g?cGoTb$ zg9ktJy7h_@b8(I(vH8G@+tfvA(pGs6jp$1Vsof_48L&sCdbZA=d>Kzo2;nEow5Pi; z5oLa#Fxul-Ha1iYQzUfhe?LZ(bv`f(zEHQVmZt$f%L_3>%}!J!A?h|FbtwLkK6HNV ziMSCzTSk$~w!C@}N=FI$K=PIw zfH$}Zb4ZI{N&Oa>Ge$>kGrbc@**P^qjm5}|zWQ1yydyoz?lKUi@BUW}&ybkgy6^6; zAxn_#;m$;RdeAP~aQtRi3$OlpE*&c}5Z~Jxt(LQ7%@@B$Cq(j~eI7?EdK{c%2w zPWrYT%B7#epzPYa>J;-HGou0I;62L`M3k2v{oTCUi#6$cBCUqz8wBtsYSysUfa5-2 z`E}kG!L}9D`~o)jU{6%2XBlX1MY5K}BN4AIZMFVt+ngiCXB{7c1DZiCVS;F=eL>Mr zdHj2i6_BzpVUCWQtU}0N3RZDi7Dccvq>c*-w+5Ho6A?{Dx~G#pAbLQVWa)>XH;X44 zCm0AR-Pe4dFe+8gz9g$NBIwAWr#rj+MECMUaEhy1Sp^?nbOv%^I|%i$jI(^$5ONi9 zHcGS28Cl`Jen>eH9J`RxhR9p$Ejw^DwsXsFsjy1dl;DMf{>;cfW?c;~fm^v`yIfMu zz{B`LHFTO$K*n!OE&pf9UZexyLpBv8B_-|)93-EJE`PkBBMKGU!Zq?FA?*+KWHK;6 zF%GAL6&?HlK&aOCrQ2tjTB_Er7KimuWJYWK0CA9dgT#YvNHV;Mn;2PzP&r`^QmnP& z$8Ef4THUUmSY7BNF1o+wsb^l-I1Q;K>Ni0J3?tl)O!O|$Djbop8!lNa;8~|fK6_0Q zl;>hlKOgN9$5BaM4MAi zO=KOE%pdPCIy2a1P9=D~r(c5(osSoPL*w(K*SDq&4=Od@Jc@#`T-~SqjDwMd7vvS4O+bE@{eP+P-(pvx|d{Z`-dFafM zzwt+R!a@2*p!O#%riiF49AJPL{ucTldasYSNpZWJ>SC<9aC$HHbw%$C_b1Gu!}K?N zv{I#lZ>}$}*|R>qkO*&!b7s6Yg58s5Xq`BMar8!nG%ke<%0ULz=a8V1*ezb|L0nxX|wKKYj9MN0MU4U-`s`tyd+i-jNu9L8v4i| z*`f3r`DGubOimII)q{qU_ZSMF*DKR?hsFs!q&=Lvmij@{k)x?=&SNBtNEWR$%TO{p zqy+s|F?oIMz}BsCI3R1m^tBzPR0yyBcVNY z@-)(q|FGv{4Pn-OW5gz@!Td-9|MrEdv_e{_=5}a>$&%=#ux6$7tY^>BDmd#tWxf7d zHnK3PzbpYrNnGkQdZgcoFTza74z&;d#12<$1+J+g=-X2n;`_ynn0GJ+`@ByM@e$>UjC}|ZcepWTDefv%=8pvFi+#)Dkllv*5KZB{;7r&&= z;k^oUgv7ct7tUv6&Ig*P&WL>I?N9iySc}GdZXOUY$Pa%$#UtD<1}zCDvg3`<4Y0IB zn4CCb6AotIs^f3KbXzo}&Sy~=tMC#A@Yeo}sPdkkzSVzxlZTx5xB=I4Zf-V@qVMZR zrK~*1rtLb|CjOG_)p%*+M`N`PW*#cFoc#vucn&itHsv%_2JgWP1(r`CHJ6atN_B4HdUJ{+lp)_bquRzJA81 zZU#|Rp?;2s-QZ)U<0y?V>CFh+k=hpHtUe@Eu*Db$YXhf0T>&CMolmzhL|?%`401q6 z;|#1QLSpk{d4^Ixfq~paXAE~@Nk2<@Hs-!Id4=}lG(LTlh#`l#&!vk|4 zY?$fn2uV2_Eih9Fss7#SfV9>nfLZ&cJS?Du&xxCi})$Hp$@jyuscf2+GdQ~nH%3BwIDjc1;nKn z4Husqtp9BLG@vN8Lf}v`DCX1fzEk*XfT+>)p{-TMZqX5zr%NGo!=ZUoTCOr#*pZ~C zek-Us8{)CzDQlkWPG_f~kf4mk<%6ZdQ4-$Vv>WK_aoAm|HrcryI=JY^U$5%7X(Yk# zjO~`vsw&D^=s6;@Fgqe91K&L)4@^QtDZ+PF_1~f{D~f{EyI7BqnwOe@c#UdS;lP_n zBHr+#uaeAg&~Sh+Vo%Yi$RQ5@^To)4ZI~FYX0_)u4g| zwcwhk))WTA;6r8`D%m}k$-LCmX{xlY!kdy29YlSHUU?}c-T5F*>~wwW*0D5jv?SHOtT2%N#7oc4>_X9{soViBD}j{QUXQH{}I5wE6Jrph*oDf$R>vkQV{`I&T9;E#d>%oTY(kM65jsgr)Onn}ozhMT|HR(HvcU4n)C72}7O zc*jB`b-8B*cpr>XEL%i&tM5P56Gx8CANoru7VRU#bOBWeFOl~ahs9+oDj#ejB;pbT zPt?@ai`D69fLwTk@XAHse&?$= z@=?CM+fo(-W=L03U-*Oq+(r|wQb>EHeNPx;9oKb+Xi)&9<+Lv$(cF!Xv^lze>gXc7 zw~?>)4!3^6+yy6#cYI}UyICgXyy8%HiG>KJlIR+?27-_vw>to7y6j^=SIfT%j%rB? zi8JWXH|Yy|w|D5lK<$z2Y%SA=1S_o!MH|~>@SwN7Kpaznb#&U!3b`a-4C;S??MxPj zd7jl6V)(lPBhE7;?{GY0t-Czb)By1K-k`!RK@q9Z0X}Zm8f7TvSZyPkP7~2;4qq?} zF={l)bqe2BlCFLoDT+Diq-R~q<#K5A|Jb1qORkKx{5X|!X6+QrtvXsRF9o|H$mN^D z*pn-EBmQVD4L7O(J~h)p4UqN#nl1 zt?f;kKgWaDm*Q_3XVBuReQm_xO^W@|zQJ*)Z9u?g*6L_$<(bSXQrU;U!SnL-;Y~@b zFs{K4N#{%aKAW=eo&iczhw1^7aN!qFRS|?Z8@V_@n#ozB9en${`#s6m8vK>2HB zgpjD~3DZ^`L2+jrquJ(VyAW95O%dv-Ka}$gn{x+GdQNMo{+1YR^lJ64P>B4SFO<}g z=g(=6klb8v0vk}gmRE5eERze-wnHM-#+#Na?29~pTvFLapR6VZm$(7QJ%@b3TT(Bi z4W5}{l^xP|!bRK!(0`2i3~3gN;U`$`BGf2j<5Ow4zdpm3^9>({6bp!2k2<7_}EO= zv&Xbzy}Q4|q*H>o`u;?#FNtVeCx;_DXT&Em!S@E0><@vZQ*}_IlHXVXd_QWXQ_tj| zcsKsBP8)Cug@wgJ3$qwg7=+QhN*gZ2+m&qtF)odlBW z8DhQjl6O}=vR>7g{rnXiB5#JZ>yM1`Gml9cd(J?8PO6>cCeG|qF$y<#+brs;=YTu& zo8CbdqjX&~P%tI-nhVofSxf1f7y}odu)2#wYPIFE*^oPWiDzfBrBU>k<}9g%#y{m8 z=K457;Nnp<_j-zTfxnCr!k)z*B!CSm>g4b))CGpdrXaDdF8 zY>3EmY=qS-8NCwvz>l0G4QwS9F1m95RiGVYS4%-ooxCoL@)}nZ*oY#+g39YAOCt7P zeELSS9Gj;KeQz1Gw!m0u2=B<;1NCNJXWy2*$+Ez7ZTk;iCJU25pHT`A~ zJYvj9{Y(vaW_1ljQi+89XI)J{g&#$>*wgz+ApiZnSZ2>C@+t=DUru<-_QN;~1?)ts zTw^_0#6Qk6`f%X}JVSp_z9Xt-osVJrrLgi-6k|2f6pe%6z9ER|_;8pZqP++>3`65j zj2rEbupSem3v=FXfbRnJaD+wjvXZ|)L6fPZRB5HvLchu!8TkW?!aQoco_tNQ^Q#1)Ks!N|v$0)JBNpnFZt4G|BGkF)z`sfdof=77HsX4{7#|4PjjDRf> zfO5R-NRV#F|4k$&of}SUQE|amfm)2TdLO)pw8o+Zn^Kq`n}CA{z#*EXGv~h`s)P(&f2yze<8np(W>o5jq)4qn`yiRUajf8&&GQumB-m`q@L7M6-#~9y;>G+_% zUe(0o#uo=>!S|Q>)?Z!+Om9VgMRz^7Fb$wcyj`>tTbSEs+ex;R=(C;57gi9L)C~T{$a_=yjj#US3N~<;RyD zS1AREkqE(`kkU`1eTn^;vl(VZ`}2OjhHK07KTw@=5U1^;(!Iy7v`cJ5svz1*S^4}n zLJ{Ho>sb%W$t#l=*3BGqkryzBy8e*~!&*mN5mArHxiC_LE zTl$|tQi)2*S7i~ph&BGkkO^i}GDrmYR;4w^5rEjl0>YU^vUbDR>dnAZ?ev+j!1U2$ z4TsRdmm^Q#IIYS*PGAt!eTkgdQ1bKMW#2TL3GpFqqDu$3Fk1^%Ts)AQPB;cec==kF zi_;~LYN7MF4yq826@y>eUT7U=XQwWJ;6E6Dm?UGlMGt!lTD~g#>tzl=W$}A;z_yr> zKf=?I={2oiylyaf{rK?$Yr{fyHQ2&@iWVXv`yTp7|g`jiZu?m7<1lugR9pf`g zjD~txJI$C#kE;t+>%r*U8Kx}O;O0u{5%gOo@Bs`;&8DrLH{qWMp;c{7Ql&l*&vZyG zpb?DC6UA##6Q$Gz2!$OtZ_lA6vRYFO08c=$zm}{x@8XyHrdj}}lmutlM)Hux>fyBW z6at|nH#%kJ6qi^R;^1PH%XI)UcR=$`J|qVcx+Q}%u`2BTj{GfXF!0^W3toH=Y<^JK zYO)2RSTNUJEp~>rD_A4K!h{A1tC}62Llw0E@kx7G)_pZI5X)5)A4y$`Zjlg;XtZg) z($?{Y1NwKoK1Wg_2_0&g$ieK#Kc7EJOAemafRmil43&n00;`Saj50o}N(?26I|0h>~;Q^vZ4xK<{;{@WB*L&GYp+=Q~dZDKzZVOvyg3B&k4kmHr3Kq_Y2GWr~* zOYu-jv=5at*xz)~U3;KRnr@1SQf2Cj;`Ad|L4AZ{LAq{WQAi^EUTBXVk2{6UF+lHb zE(>Y?`-n0cBpI-$^Q)**LQ~bHvlmWRx{&?=DQ1eugCsw*`!;aZ59RZC?Z9bFG}jW&S+lf3LQ>p0 zSDY}O;yi-1nk$lUns#l?=u{0^2ML}=dKoh!mI&y*Nkq>I)8Q{LOx_+WmqO50o?XCM zY@82(ttSaP$^X>qW@N~_K{*X7M`Vn<93&_*28W;qs757QIXpJleb#P}Tw+&M4hhJW zAr05K3*lgr==!|Z&=)pvf|d>L;eq0YE6wbmGE#}c#%<-0#2%MSd`LVw0Rb@0OXZdb zi81X%c!7o#GFc-*F0cOfM`36C=60+$&gDivN8ydyp_=6W~=} z0*SkN>k=`(Z^g+^-G*enqiSwbT3bK8=$$Lrq7GVsGVb(^HAVzyO6D!B3b%CEf%Dyb z0YQq^En<-pHa4+J8B=PA&EaG>|47e2;ys}v!gDhd9Um1uIp0on=%bT~0xLW%7aRW; zxO@Ppdp_y8%0@jz!uyqKIOOsPj|5 z$6cl^hc~N6!e$e}T7dz|MIdCZMA2={p7ch%_}&V;&M|DlSRtn=Sezf_?anY#481GnJ z+qM6Ee%>JDlHnK8!>f3aop+pY&OR0sb*c(_0DT2nBr_##c_^F5I1$%*Si82gB0B|X z72x8RJawR@2*3B?KU2M%_N4oN+r_SMQ;J9?j!<4?e78{c+Ak(H? zM8px(Jd}+oOYtst$`uq;8;gcUw^!5)jJ2TO5?fJ3E8=cppm?s%6UV}KEUiI6BCxi_ zAcCxgB8)Q|Nv($fngaaw(f-)}N$V3P`D8c6cH&A$=HnoUzl>ZpLt82QU*|eL+*C3A zE`0#9oJ_~?z>FcN-6MC>cA=^`xGrW&`7GnzmDn{%ht>5#T_`ZQ4sH>K?RyW>k`U1On~p#RB5W0 ztt&JfI`RGTy6hV67XHy5Za$|GWuX#+w${*;+8CnWl!e@mb4tcrD4(ZD_JSxC|t54cUhB;Sw6Eqn* zRUy}))(&VPc9AWR-BGUBZpe8RhK0-=kOYmzZAvF91-3f!*x;E?W@dbf4`oH|o-5;( z<#*#A4Ik|<7o$7!vkpmD#*9L5yQP{nouH4akXv;MJVeNi*^reby?VubU`pRp=ek)g zG}jFUwO#6yptP(XoVl5yO+3MNb9(o0U#Aj4Mp@Xy{UXhYWpQ|u8XepD4q zCbrU$MgwNy+l=a@n91v2w^&)w%a5}h=`K4hWHY{zoy-?qOHpo>np8W$CXVDqP3(&c zOSCHoz+fgJT(=*~QADbryV2XN{%Q8&)rTmkFV?DT!c)r-$Q1s&c-!;z9Ksnv z*j4d_<)qg9=1UsL%geWkyc=thk}AE)bmxXS4j1p~nTEWV0R$XZ*cGjlC?ci?&Rz#w zCR^dHQrU3tQGnZW>bjVA|rNLzkoZXly9kR85sIz#ME_iG~EXQ94C0MXYfu) z6f|P+1K_9!EIRHQz0oX!+dU30(3@)v^Y;jwz%a*7lFJqkxR$Fd5rK$&Fp+5`NZojY z`K!MBMRG*@{Nc-^NX9QF(0kBi43ek2O-xhfI&a8jp zYAmL?PjJy(*Epr@m3ib)cCR`L)F~F=5|@AYThT`7y%)C-2c!^){vF8wTNe&39Z;O% zi4mfQ?A>RC{+n@M@axQSDw3u+FNyFXioV$hMywY1gT&vPds7bQf|o=A2UIINH3>4Y zvTZFsoOMobaK&l3X*#j;{-%V0B-^n9K#A#5uPkGRK3xYe5S$8Oi8_5dbstTFJ1$)P z$ZV)!;tA~d(RMaa<#mY17MB=w)Y^Phk|GLU(!sn|O=grhHLG=xWgQ+-O?q z-drtNV}{T|FU-=dd;bg5-p5Oa^{Wf024(9=z|`{%7dZd}yP7Hnb2gy7yekinKwCK{ z5h@pRyAWjYroy&)V&Pmnltg;;Kkv=Qgok_j=n5{H1KF`Qd5yZuI($tTVfEP3t2uT+ z3J(GKP10enev_){i?L-I&>GQ08Qmd!2DiHm=PcasRtn=Da>r9l2-QTj66f}hoBpJ_ zTxVzF`=UH>OydoW-(43p|6}jfZgZ9tBini1gHFB-m4uo>n0i;<*#XkPPy_dHbbG*m)aOqGVuem(ds~ZX;(W`wu_cucck#S2{G6$*E(H}S2vIt|6)a<8T zrJ+#7jA5a%wx(hN*TZ=`9~Efbi;L&OGFvY=`e~>DGT&*{aMU?o8w(g>nl&N<;T_^M zUwFn=&>+&qGW_PylqMPDZ~oT>OAj~Y=_QIBFvUup%K`J7=ee<0K$LW!m6nZXtHUeb zlB2(7_W1mVqpku-w2ZE|gwMrpy-R*uLP|FDWuRB7spl0>Eau0!6)kU`PZE=2tq%Lz1u?AJB6>0DvfcAq#v7Li_UYxEKg4F=FAHJzBr3mzWbjH zR~FJ#%rSm_kt~atOfPrO`w>A$OcQCTn>Urj{iM)=x5xDm(zO3m1-56>mv3;C21hUY zh=;r}>Lz3(pWPXim4XEuIq-)b6z)o$oIvox{!2-BfAh7qDhCGo7_Jh08!( z_I~bQybL2M;fj&Jh|9DA&*XqCs`9>UOl{9$CE`F#L3!KUef6=Cx=h zC6gP@314Jm>s}aBcK?6PBmMzsS#7#dI)immy7*~_1O-c=@Ams)2u;(`aa7ic+ttI0 zq}JKz+A6IhK1j$X8iV_}e?j?RDkijqaRe9jPoV$KNZshAoP0W|)XAR?><8$@8^IP& zd@yMd?yC?7r1`^gRi$4tS>dPSR^gfooGNmp?Tc|(YIfZL2^T50$9jXL!FI1NJ^WsU}bdq ze<`G69N6gEr1BE@&cAlGvEL%GMLECs>vTZ5+|?MbqdVDHFe%-aOqF#baUXq zf3AN==!l-*e8bDX3q+P%n&a9t1Usyn$5^ngCRZ)HuqTx^=gHO0kRi3 z`_b>l6`T)C^Alyp9)3=G+=?zV_YD|Fg#-bk`JvHUjIj)(8OY7CKGP?7BXJ`EC_}v} zSEUMJ+?3oucP*Zu;Q~=30u&>qlW&+v! z_vUM3Ran~7`7=lM)G9arqnR$oHPn|$Al-+p(aj(N!v!#0?I*(5KMJaaHQ?nh%qFpg zR%stzES1JYQKw(RuzkCvZ?EUJq2;$}u{K{UR4e7c39lncw&|g=s9b33CQ$eP1KY7` zH6pvUYEf8hXBc3^qY&e~N6oH9{Jfq8qs@e{wd!_{o@b^2fD3s>XAVcb;`gZ!GbY|y z;9ExReRK&>^{8tNFqnZw3yO)=xmF*tmo&ROhnZIiez*dT!j>4{rcT1 zK%q4Kd)>10Q@3TG9xlmqmf^Do5JjF?0}?=FbS6NS4F6}y3KVSD>Ju?)d9aq|)i;;y&n?8QMQHK{%H5@&9^0R!eDobI zH^L7roDJ6TlY>0`3Fw;Ao_J??o+JP4w;ogm>2`mVCr|iCK9WE12O(GFo zU(5v9g59Mq=v(4zd)d>yh=yUI01p~j-MLPad$9zb2WU9a9k+D6P)a(L_8vyaGejSK z@Pj}2O`Y(+w^3E6tEFebK_W+pvM31!;L)-F-#}`xF~w(St^x&g4|uV^Zr34D-#YH6 zQF<$x5*Zk7?Js>EH4s&UO}fX$#{Tbr=0Nf+xhv-D_K8GD#>z1N`X% zexGR}5G%C{>Qinm*Qx<0cfxY^Ab|Z_MlTBmWm7gYL3oO5o=e0Infv zuR(VirQyvcq(K5qSPiCAs+qY~bBe#H%o`eWBz5PLldm)N$Q;6!{l`0ea$cen5Y>Hv zy?FDQk-w!h&y1isY}1xrI*Ails_Yol8Qi-G13b~LS2}{^%hl2~$7N6ScMtDt^LPdT z=*zk#la8DUx2Q3NPmUkEympdP6lpRrd6BS2(^;r6m)NV!zK98^_dNP*wL+t4cL6P@ z&6VYLdCJz}xCLqVC)$!8tBrS{aXd=9f~TFHbF{NndoFNg=?iVJJujgs6 zK51DUu9r0}q=7TVHHY)9F*AipbyL#Nkg*n0myyA$7i^~c=X6enuU5|iDakJEo~S5r z!!<=E+!Ln%qdYyte?LOzVo7P8u}~bttQHjw*;cWyECVwa+mq+IJ&hi1A7p0efb<^- zyS09Pblh+|4Nz9DB=%z_*HSIz$lN_PtZVrGDN&6r&|v2dy08NhLV6pdoP9-yP^0bb zDZXH`ij2xJAX&JIj?Ki(6#4x1Egl>lA!=EY_FFLkDkq>ocNHMcjEK~!4)Fw4j|?d` z|C5R;pE%yYW>poUzs>_|!9({0dj_p(NFXGn18sw{wczv$luMh}=Sb-rHeG}xAnGVh z4T^Jqk-!p%d4mO4s?!l9lPZ^dpJqsqU?MM(uuFqL)cUXy;&=j)DPF5Ln&l<$q6t)D z{(HOQikMQbG~3CNIupi2QS#&cz$r0Sm--s*PuG_t0)@eLN$EwW3##_fPD^%#9nPVE*U@fj$RM zs05FRu8R2SW=tN0daI1oQrpp+AoZmFvWj*N#l^eD@PT*qJj#r`4arHUE?_VT)3jPy!p-{ImSbx#m5 zd5k>L2=#mi^Fzy|$_|u?If=-h4##b+$~?q@k~FRsBu!N?j^d+C+L~QqaOIi6UzQtf z|DB|r&D}z zlJIZLvt`Ogz&0ZyO$jZ3Hy@ip*DbCb;TNd5|Eb zyL7p^i1s+c9#Vq@rqgz_gw9q`1pB~+B5IyI5|M=;LHvMa&v&a?WXpb-6A83OiO*o3 zy6X_(?xOo@<^)Ctl}gmN)ie)S=BsCPg9K~TdigxztjR*?FDn5uNeU@LJ)r7MnhSj3 zAOV~0(@d!c#`dCr5B!Hkol-#i0RjDlSN=ZE8Cm(UN(;H*DLc%|yr(_o$%+x3UB2{h z;RYX=H@1Gs#uTG!fW`I-0qd-|r$BX}aRS_2&-rWNh6wao{P#7-QcDa;B!B+%q)*lc zN?-DT!#bVLA6DmYuW-rT7$F8YEsk{D2Te6&5*+3?%PZpNB2$t#1bS92KTzN+FzzHa zr?yp32c%|aiv;yI;YEAGR#v`!H<{PH((^J=?23uDrLjR3gsI@qAdIK+=b#wYAq9j{ zU9NiqLB9qUiECl9GUXw2=rtdgTC3PV@yqME7kn8_PxVATugcBD;uj0XZ8n-EInk4(76`1U9G+mOXGxiM^QjvU5u^Cr7{2B#7rZ zoOih_l5L}7@MxUQ^$9dN*#HGYhh8GoRhQ?p%-In(rhombyrlYe=%9t+}d zX-->0n_~cD&D6m;S{huOTUL&g!>sk5f85v0|bJN$ioBZFuO4B);^Dq7)N_cRl?uZ15wS6ChpsRf&d6R2J(q;Z z#uS!%*h#I8b@zwS@*xQKTuE}2IQ0r2y&E*7f4k5&=F&T5Fs}E&rQYcZ!083@kdBD)>{Hn&klVD{YWL{sly3Wz* z-K&ERQcnRnCqsM|1kNJcVqEw{Gn5;t;9*HZnM`=k zahyHbCn-rpLfP06mY|E>zT;X+Y7jkUWQPb05&lf^na5a?l1t2{UQHfqItxF>JWmsjcC;+L;qd1mjzOV0?%DJiZVcC)rokZ1jz5HsC{=od zD8qCb!umuGq;*NekJ2#OCWkZEX(1ekB}=Geucj0vYc2gzD5Zv2 z5KS{k=g-IB^y`%gqv_9qt?D|#(z)T7!J2pqHKIDP0<|M4*ZglId9{1VLLY%V@O1Do zclTcQi|x56=2o}@UAJjRmJd@b>_9QNXYFtsD{y+;rKeprH5XDcH^mF0dHY>``#C*X zGBu@}-u|^l5$6$JKOIzl_}eCdh5Fr-p{OQ!eHMXtvx)t@96G-t{=z$X2h0|;f#Sq!>k+yIVl@veEKe6rXDupQyimYL*BHF78;3s*>&$;C0KS9TJBbL6;x9afRSU0*Y(dbQ3b)%B9& zI;hwv+2AK=gJ~O4R(A~yu87=xI~;l(CB%8%MwL7O)DvIehR>;)<%u^0j;k5)t;_9W z7&O)`s8h$7(sRW(L2m)vCnImmrXZ73d(^OqyTu?eCfvZofuiA1c{W>+c@vfPu6TPg zKid#(B>^brV^4t!4q=x|KtMSKY(_;&xzH)8)RCaTLVS4WMe!`PgKEEZlvY&z)||Rp z>)-z?P3>snO**_QmIuruiVWVS@CR8hc!S|#KiV#N_EN!aGV6kK>H6vEW+^$v(OjFW zRr1(p@l{%c2J*shrHa*{En<3q9d%;kxNk<~?+ih-tXDMv6xhWU`xpu%?|XXG%OmU0 z>1uu>U}t(^s;3XMj5nmi*}62{MP=FbPN9>ru;J!lK+@F-AX>hl6cOQbK|f0F@U@1l z1IBf$)bu_W@qZuy;HH16?!yo3fQ+U{w8cy>PhH`oXufb$(~g^S$KL1|QNjT|^vLJY z?`n}w$$B8&76yKMiirpv7-e>GO__66-;DsUwMM~EuRANbmgcpdR@0lxY|L%lCZy2{ z+j!UgJdrR}(|o&X#=S1H$1Zz&GB#A@b2@c|C~^D=Tcr$>AI~+-Vr8>G8#1RXi@qSC z!E09P>$)WqgY=kMidjXKbZc6*v9#OhxUj6(%}p&Qi%$J1QD#wO#C8}P2P81eYl5ncX-`y;i98;R^r zRhBcB4V%Y-Q^qZY3zk0e|A+bDs0<2YO@wmq_B5pHztCG`dC8w}$&n>f%1bdM^Dj6%ksBAUs;6zHKPANtrYZt>CrmBeX!de5e< z@sq&Y6M@iUl?d<75MT0bT6`nZ;XL1ZWZNNRAy(@@L?gC)Hf^yK)>Ts&??2OT&RN1y z0P&P~a>m_;OoOpd0IRkioG==5e~9u>?ALwX2&346q3n^GO$dzm{9!;L9@rW2q6QbD zBaXPdLCX4OF?rkf`M~hd?!18}2n`{!lPTs7+t;U(jT@-u~_e0-@!flY;YwF;sxjB3-FP&kS_VALQFPmx?xJZ z6d1=OY&1p_!Aq{$`P-FVSutUG_7QK|ZT1P4>0iX)ehJS+G>UAAxJiQ2tEw)JA5bT% zIneWMYF+}m)i}=`80$H3$gUv8d$SxkzY~&P2N-1G@=4}Y^u8=W4QG%@?FSvA?9>&X zMva_ty2w=3CPbW38AYAq0wh6hgto|=kU%h+tH4hz5yPpuV?_o^1>U!x!HHW9gWe_z zogfiS+(7tfX^Q%`l<&D(cYVd5yJsmll*qchP31NVfGWBhCuE0#dYXsc%B8%30u+%g@aZ@Uq0$Nu}(7FIFqrorHMK-ss=^v&rq67c3 z@bt}?p8C5>pTDO1VZ3F_NVoHP%$2ZFOHhp8V!l5K#CD=iZvoLI$ufkZIzxJ=1^aaC z_U&b1eJz7O2dRZ z|LrdOUsRhksNNkQ29ow+c9qIFa*RorHs&p(%Yp*@?Mv$*5VGN(3gjJbq5`SDmYO9k zOU_1)%Uk@Exr=FHnXDv87K6)^M>Ru(^7@kUenTJ9d+Twrz8eHSRXWKOcvU8-#+p1X{j@M`)cwXt9MCM#IvdkHl>pVQrP!Isv7QS{j zjNn52ZwocX{R|wHmICsM=h;Xu%MeLr<-U)n%#p)WjcmqU!jteQ|pf_)MOa=sfmVD#UBvVf}cHcoaU7&8GeWt&=^-;7ZDJSp8t8AnhM>6F06r?ul-6p$;$H6~}9-WdTq;ThHhAT5hD_{7MjMjJk1FIFS4pXkTy z;)sV;B>1gWb2Dc%Aq8`cQWZ1pfZVGFlHc!d>u=eurg_q=6UuEdLpejNC)L=N()W@S zSkE+=TwV(lTXH@(fHvULS${L)+etrFGmb6rvt{>XW_24#A?biYhmp6)M~o~$R~p#c6=ZV0M7xx2DC$ktL<3%4Nx48G69ZA>-Z5MmWAz%u z!LK%}@^3IWppIa~^*O?_+5a8tPpvlQ9FnSD;&bHvmB{-v0A~Ws=Qa@CmXrvn=zQ?L z54H!ZCmw?0`)@)!FNDyb2Prf}9uk1teIc~n+YxyPnBJ4qkZ9=_3ZGcLMF2VvW2-x7 zisg>ycWNSVZ0elw;<0Y>bTeY(tCo=hZ|iFzakcAS7G! zy@*;{wib8e&5h^oHwkx@WhOUDYe%p@;k&eEn|-HairuiDku@Z#b!(?t>|@wB6ET4i z!Q=E){*)z@HW?{^8pXwhiX)=XZ2r4Q3v#q)fB9V)zm{(b`-&ntPNWAGlO7>Q{_68qW703tB=;LhdX6HZ#HqpCX{?iDPj| zT?)L%5V$UE`{%NAr|4IL(=`EvLKhWb1Qk*o_MN(^r)9Y3x0R7bQN;Hj38v-Ppu5^5 z#bxlC7$%&4A&xZLc|2a^aYbrjhIBoepapAMS6z^qxUmE6D16 zt^9(%QDF+d9h0V_&4XROJP3)EoT~drd@Bx%@JRdBGzyV$g^U1j%UsayBY|FkTx7{s zM|MXJ7A)u(@LKUn+L$vJgneZmXc;_NE0ho56{|1-62%_##a1T(7x2Y5TK|MNfE09f z$41m-Lu6vhkQO8#$s#D(rEZ$t(xw##P;fH`lMMjfI<{c@sgyVjY-K3$-n)&ae_S4c zI2+?e;Vm$k?Rln&h-Z<{QPt3vb zv9~6snn*9B@w)Jl79LKzS`8WsLZ8}#T-eICY8zg)Ogm1)X3H7E${*KVb4_-|TrU=D zYxf1bLZp64`OFMslB+fkv%wlfO9g>@#S@w(UcUBOAMA0l2EZ|ydP^8ET9;}P!E5w4*TG8ut_4MLbT(fXw z^HW18mKH>AN2bQgju>g~8c8r_2)}d0pFVAAc&LHBfooLf#dA_tB70baqrB>%I zc~8BlHx7=cb=MfFNCbX58zquP>%4y*aKF5A3$c?Kz0Ecy3w=qCv9WjQ@n#>A10#EC zNwIo_DzbjZr8Ost{5tkSv(&T9*u-BoNXK|S$!I5)83o z_O=9LKqA|<$a+%^FKX`nbTlyBdQ)cv^qpmWA?Y0n&FM66e5v%`rel;w zx^FUFl?E|JD+kQ?&mE=AI@O^H1H>~osTIH*;Oi+vOi-HxGEFOwOo%r9FzPy>n-v)L z+MoapT0esrNP4m1w7RS5C~=}jkMJ$wJHH1pO{%u@9F?+CD5%`VhTcrwzmp-S^R|Xy zN2Y$UdOAE+vFmF4@}vWPoC&MxjOQd_=p?0SBFLNwv=k8&k;)UgwiujrhtmA)T4t9@ zC-4v3Ep~WpYyj5J>7@{pdCjAerSL)Ex|hEWQZ+;`QR$|*Vr1BZ^RHuR0*lIKwpOwy zyuJ>y&+%o%;fGzUTXM6C#BzMBW8*8GK`^5p(*o$#npr6N<~e1`c2IXeAW|ibH5A@A zc``@mcso4wm%HjNTMQ{#BZIWrxK1C?X}OW=)qn6T=Zn!FOGkos2>@i3Cx&WR?R&## ztR&DMf#kxIf@6mtGF_qFe)X|km7yu;)$785RbX|g-%QMJ`w~{R`d#pU$*%A}Yk(Og zz|m**r!45k+5(pT#RP90A5HB-M~L&X)Hj@KYj-P4*D4+J?-}IMOtQi)LI9crD9Q|- zj{brj)OP2>1gvcIF4Qinc!*tL@KYeG?LrDIM}m}o1fQ_|Za=h{(b-4}cg(u^m14E!(NneprSauXohNpABpEyXY`7l`R+cXG2Qf%C zKc9Ous14Q~7d&WNV7XC#4hVn8Wn=)G@yI3P)Il+&20c98fDi-PVOr{R!jPixPzUat zy(kX>FBkb&{0E>>@|Q=78JZ{EP9Pqg8AOMeJ#isBy{fQ!LisfHZ?9WjDvcpS86lz< zu&jZ}k{)5dX6}sY71_Q*tedVQ=Cj!JSLknF3?Oe%vzZHdg)#b861_qSmNQ%9Zlhd$ z$CfaBdgs;xD zV%Yymv_+WJch$QR^Qp&`TeKy+%^@gaE`cs+xGZmTxZ_68rbeZFq5;0~FzDPZok3LxI z`X`U=#B})aA@BE~we!27nWR=4YFKhPzBz0($-sB3j_)yL9-pSj$lqad))7jG@jMQ7 z4O!0{sVf2+S;5&vzf`IZM$IWBr!)?{1qFas9Kdz4^iK z$=6hmid;a)t2lNvq3gP+YtH5WU|5W>Z`Ry7{w;9F{`@gp(;i$78#61ViF-28@EOMs9pY5x{f)L0FlV= zQ(-3gf`iX{fot0h9J8!Eje~v?t=jCXae`ACZLgkWWhBdda5a%mY+@i3Kg?kmNh9zU(9tm!c+!gE6l+ zi+khXmvKL?&H;o8H$81FohK0StPmiTPKu#eH|_!5^7)uMfwY%MfA9Xw6r)M$)x)9M z^VuVbIqSGNAjK#1qa4LFT6UVOollD*U{yT2UVKD$Yr$@fCGEbsee&>j8 zTjAfI&SKEwfybUO;Bk#=zAW$%hf1X@U}&hZ1+qlNxQF)9ZzIXXd%qC8NcGpnfMECn zH!cL*u96o17r277mb%{q$9d+|gYV+3)ijXty*z#t#3n9CN2SQ)t6C`*spcwo!LaZW z3uhCXq4=#@avic}DkG8bq6elVZ4;ulWVihtBo&wr-T}>|r4s@5k^DX>*F>Ph}Lx*|$YILc$s2>S; zqLloX@#UcGBx_UZ+F}4262m8d#^`E}$6_)sy zOM=Axs&{2iq%U@J!QsJO?oNPzs%jMbaCHJ8F;>w|xvydP{Y=k$ZUq{O6@x? z{y7{>Crm;TwaSnasXhlYmLP8}A8{?mxF=VGq#P$3WZCh5T;098x?ZThiH`W5l@^!& zR>&5k5BLWL=XDPw#SdC(Y}7X8Hs3MVfnLpd@JgC~E-%byAZ)=C<2h(l0zD)Fs93Ph z(<;Vi45qFLDa=Noq!O_W;Nz0vClhm;ND7^Eoem=BS)16IEJ-^;Q+`2?k2kOpiudpq zx8q@Fb*xvGouMk$DFA#t5_*q#89VnJS2brgrdpW-JgIA?-To~gr~}K%0G7cvfoPg3 zJx-39U*>sVcv{?Rc#H)TYFh%?HUgn;AEzBz2A%+w1x=0D5;+Au>YKldbzVOML22Hg zt#*v34PcR%fG)dtGy}v7tFC0D9^)G~!ge~@EI?E`dwv#xtt8b`e3D@G$ zt$W&Q7AC;evj{Bc23(gE=vv&k;p^*%i}dAHd?~DE^}&{ZhUm^3Tvc3jWA$zKzKJ{X zljtDNq)iZTA4;@|3iRTBQv+#7rU%q2gCK9<&SIZ^#h{H37J9TAssvp4pRaNoQyMBd z2xCw%)DkE&J^Z6lRgvs!_yT;j%W25{2xPVC>szs;WCv6Zq%m$Tlc+pKxBB7VIeSU; zx=o3IJ(Ms`jp-=po_uz@GXNtO(V3dPEL`PZ=QI3}#L}$5t+rew+57G#r zmd9QrTxB&&;Mc68{2omXrIwP$ddNM%NfAT^1Y;}#Cj%J5Yo#1Rl!J}7C_AN(*FC|} zT(gcHw>)2oQOsY^?b^Tb3d5S^SnAEQ;S?I3ErbY`oVoj@_tEeR`o}}L@-y-q!KHPZDb?XLN zPR4fU<~C7hj-||juRkzULf)f#+L`#-)Sz=4STM%t>RG;?6d6WvIlHNr0%S@Sz5djU zW1}utEM}k?iy|9;yNFtWzLB-7kA$ri9mJFWm{ZX}O zwpfPGVn1N6rgxI0NA$Zv$N=G}xwzcmY;4#1VfQ&Y^^4#QTOO8SLdP)uUf>FAwg|Mi z&Wz(xl%O#BecAAl2`q&|-9g1Thsfw>_Gw18aG!lB*(&c$8DhJe;X&T~%^9+HgzGV9 zi;VmO=<5;6R5dBSNmT11ok(YP2(BTy$z|znE%FM~v#2GwuIpbg#4i{}s%F~3 zAukYQ@q>A@0)%C6RjaJzy+4bT;VgZyJ++hC%SLq0#4fH%NHb(1Ui23#Fba0!h)jQ| z5Fbzql;FHzAOOt#o@^fa$iZA1*x3z@0iNgD0Ot6Gm~o7FN^s@ZmEh0ylrwxM0K{Zu zu`sj%)ucYg8$ZX8#rsXMVoab5wOJ{`V)!i*C@RSj0NA8R=KFeS#dez#!}zaBDM%2z zspF|aC_Y83dW)k*Ho+VvT3?sttzWUrls^)WPg<^kaMwk_T3Md*8}Jm!_jvO%3!wnE z@8oGz(A-qR6EyxK@jdCqcIpw|_&_h7@TYU2H(~TSsarr*Y`&s{rx7Z_l}mk%@Uf?m zswls*+p{b@hOxZxEhPZJn$1@}*z9i+Fct)lQ$`GH4h+*{?GdY_mQGRggisd>Ksq3jwAXXGUweF07%wJaO9`M5oCKpaMR#Bx{QhQ3eKjIOdLpgDKK==r4Cb*8*i$7P)py(d@I`3l# zl+(Z~DS?Yixwl9m>1oaw*}(-gN~NU763CWa3k2*$y)wbuPwu)v4gHO2K64hZ_4ozB z*9ftJzpt{-{P;s4jzRn2r4k#ll4$3d+l`6K*{(N>Sh#-<$AR8s!f?k=tia2lyf#+> zlY{L6W)Q$ETRA(Td-s2e+0FtqK=fnn<3=?{j+Ev!sRortYXVH;Qx{io<)LpszpuEO zLKnyVyk~my`E4U!cAV2|O}?Oz<|Vo!-Zhob=R7h#=N1fwzg*SmfZ~B+I9^Agxa>G# zG2}Snp&J8dTZI*Hb9nU;EdM?!b%uVS1NxS+_`5#RT4jQj6iP1_;gDm^FPH5`EI|4+ zVSAxo_p*Np4iv%yf6~5Q+BpdE+!f)?eaCq?uoWZq@nfQym`l~VM%Gam8Jy+lV4;JV z@2Bhf7o^!cULArP zF9nD{Vbr!~=jF;D<8TbV}WDANhrh<7;Q z)IH#uH-IM&F!8X0@XK=;1mMSz|HOHLnb6g@$E4Q&aSgCj7yMZTn!DDwa~1yzyF`l6 zM7NVV?KkTUK}Pu0@0EnuN0#=bBO63We*l$_GArDSY)?w>@hpRZyn)^is?* zNTqujEf~!MqyVROL8~BZ)-(v6ZjP2SU3*(N#NL;{1 zsHzota)3=R^tFo+TJITr7(w zZ>DWb{q30K(!r%XaFjCH#~CZ-AHhvJQi!}sxFf6hR(=wK8laVEE+^MPU+9xsAf-zL z&zcs8P_BEz)u5}5g->$fh-Dt}CaFUTAMJ3PeSsiO9hnUVXilo%&r?>1N4yKx)jta% z!qThwBm33!`^L)%Wu}}2YwBDwu-IY0%o}Y`D(cKDL}rf3U+d<5|hIb=IZj3B1jU7n9D;zq*1U-*m;2xLUy0C^Mye=9E-y z|JI9W>r{bp!+noW(}X_{$XtfW*8Lz=ol}SD4d~QZlp{sc;f3zn{NYD?ua%A~czMeZ zz1%oCqZJDoCQ7BN_MtQ(D1OJ={v|?sK%C+bl&ki=2vknn= z%M#Sw6*`%&k`+}83={4i34}vO44>e3jlaKvFJ>~j!A79?h2{`gKbszUgeYonVd?{K zS4nYn1-U)fGZ<@!iDdrZ)Yw5KLI961Qx2Oa@~=6TfQv;iyN)nCjV!^tU8ovT z=OdD@G}#CmQr{i&%%tKIag~2EC#p$@;%eC7;qZT$7Y$G4c2ed!>%R>&90g%V8!`Y> zYl*4bDWa4&+%#{k=Yr++kN^~^cJ|LV6td`oCIch%Q5ZML>g#CZA_%rKSjsY9G>M`6 zA)Us8|4?>@rYmpenCzPosb#Uod~Lz`b#EM`yBeL?;U=+0gbZ8(4&K2gI807BjK!Od zkEPFEhNCqjjA(w4(0lnLFC0&~@N?ZK_Aa%H_Wek?iJb$NYKTOw^mJup-E)>e7~seG zXyIy29XW4F@rJGG5+0_7?fPZx1qC*=x3`Qc2sQP?-!gxv7Mr{*Z|*27_&9 ztxa?5Roze_;>#;G$*Z>Gq-=~na`W$H12AF2(^E@!2B$pSGqmg>L(d8v?$4d}C~h+{ zk8&qvgNMn1xx9*wYs3O+@01%A#B>*avP3%Z&UXXasm8r6vqvd>XRokYMo7`|y&9|{ zY*`Oa(WE0$Gy8!CkOPZLEYzcu#!W1MM!0g%@gC1K3rwtrAtW4rhH*)lH!_}R2j&1gM{8ckisHC!7(vJp#xNVxSA zFeqU}qpJS0IJokf~vfe45!pwz+}i9ke8Uq=@jrMjp~A*TU-RdOcR? zpSCY@_dVmHv1j%5LiX{2W=R=pCjJI-umJ`s;(CB|6-fD{Uq z>}igz=uHW4E|hl+fj^=N}MzkmhOPrm2H+ z?~(>SQDIgW&xW@QqB&v4Ff^pyPSJ2^R@EC)`n!++U?X|9z9)I-u~{BfHi_LcI0Ke$ zM%K%4wG(w*EbFO~Q@A!Mrp=FgqP4ip3qH)kgd5VX#n!}3NSwme2jTdN%!9y8dB0j7 z1BVM-;;PdLH?X-5^bKd^qfgPK!T=+@iPORq&~Jje#LEe~$AyHuA1dlz5OAVj37qzT zyB8R^$rD^l6U4<9$REf~Sa{b&Z^(eyFbfyUGIjp%^>n)t<7&J3DiUan^yn4tJZ(%1C{VMqb`Q zqbbs%l|s>nu}+5G{_=Gp?-QeVa@JNuWDSw3$qgDC*FubAvK6T6$`a>JMxroK2U_HW zB{=o1{}Gj(bQqgY$^`&H#(lA2i{qii4Nr_4Je56B(_u$k5T-gJM;A&;4vPiST#=M> z!9=^eF<45{0+7RuF|oM@@Yiel3M(u=^zI%X;=jkU?kW+GpKPvD>rn zQ}fho)2IvCqRSbT#Nrf-f^gfKm#eu3H-P^-E4LXRW^}jOV>=*B>-4&T8ud=;ekqDSGZ)m+|&Os3>Jg0tj*US2e#8 z)S;sRf(Y^n&DU&Ea?d$g2oDq|`8@bF=i-n|QEG`R;&OJ46n$aL-Z2PF$G3Bq_7~0q z0PqEZF6(8b{#HahFIP<%U;5fr+tCHPzWU-Z%RUAo3J2R4NJ?F)a_;*ufw9q3CAeZ5 zD?E=0$5P_g4f}v8t)xneESGo8+`K=aU5Zw&y!#n0_7WzE)TM71I#HP$-JK^vAcyCt zxT7m5k&grxw9-4J+Z3xB*!pA)C&txJ8 z7F_kb+=tQzBnn%TztUd?WI{@ty8vFH26uUI=1sxGON+D&uDm6@?27svm>6HxHR%4K z>`SdC{dkN}ou>A5j0^;no<3R>mFG7f1y7a)m-wNDEK0tC~9xaXJ6 zj$2vNM;X9-fz@+h@7Cm|#?)jIOlunJFHJMYM~Y>lQtLo|P$aeo$>$ME{`DzaeBy(P ztPH7Vgk|6%MP0H+DK^JFKi<9)l<`cSxWdaBm+wz{CXd?reqeIvx8>WI4;6;_Q!tU> zPB1rLib|w2`FTPQkG0rX>MsLZl1&_6TT+|BZJf`0f->_ZR$##ru{5 zD8xJ^V{F8G$$uCbJ$B~*>N9?&f<7kquj;qKu&MjizJ`9cDy}ap+r)%)MG4wND=$Ln zRcmAqur_?u3Qwt29I|(DfE))$ZdY6kjwQ86!OdQ+?Oc^@Y6JI&Q$rwa#yB1^<3n-3 zZ2Y#|lQ<|fZE;+k&5ebLevVT*gul07UCCddn@b}O6ij$#2o0N2AAk)r{jV0V z72tIi6(M7_Yg-o1pZ$gtg$Wm4 z6j_WSHpj0q%yE^&fR2FVyDBVbV=FQtSVKjE^W)9wg+y#Kn-?TXh#h-uCM(ngT*!w> z-dtILPMDH|rO%3pb9eeXS^M=pnckRae3Peok&H!aGDgqqniySELgN@IL7Bd9VEn$P z=R5}(QQXRz#VAHm3NYkl@uaW%5tqNMTpie!lYDpbp!3h2@{lN4P8-k$za-$K)v&gD z`O>?%1F3rn8hVW{#Uxh%uJ_4fwy}}_u>Y)i?+x9$ok_FQQKh7u%zNu>3fNQaE|U4a zJefTZ2>Wszoo`Kv8HP00#vMzinSoi>{6##V$2l|T?d6zK-Ighk#+c(+??+v#odH73 z-i0%c^(q)&f3Dq(=V&g$`V1C$kNE`nJwGR8L{dmeX*%7N+`3)I?-4HN9KzAlVNF^$I1*&8>X`7NjM$N!t2hOH@h{1FV$87mvlR*N1g{g6(G zBs(;mA3sr}1^hBzJA9Fo>0H664WkI_MjYkRXR%+NnW{B$U@%%3GeGxa01>1UR*p+X zW?fx3gc=YFbv?HQ4S0#{0Cb^P)bZAI^HSvhFNR~Ikk$>qnu&Uz`J~DxT$n8idH`4& zbZ~~S;d|)0FK`=PoUy3=nWR*ac31JRXj1P3o^E z{FC}u$Gd$=ry;O0cF&O*^xis2AHR#D@G1PmK=uO{YhnkAEhSRkelDGmQz?+z}F z{)=$*$M6C4o|qxCha0GWXC$6cye1=m5AE2v9Nh$Zv%c`JZk?^c;A^>pFz4!$KB&v6 zKRe@=yvpy&XfG1?I}|%0+uM+aO&+*rs|c}9`~!~Osc=(Z&wXm6JH>Z6E}@Mg#csfG zMkE-ch_t_(-enQY*y6W?~AM=*qP!EI&#gyftkhiLc2q#{GmfmS+0`o2gHF zAywV`Gp~^EvN742tcg*JTic!63e_lEUGBU&{9(0bbl8>V#Jj%45q(tsmDe>9s{c!R z%mWOO`nYFw3z1xxv>%RkE9762l_=?Y+~A^|H#TDDju5T+y}a%Fep7yY8cxHEvT(A~ zl*Oep=k6mPDp^j#*2PK}>Mk9hR?$b1!bZ>l`B+1q`sTsedua6l)rs z6cfQBo-TQ6R!K5JP)q)FW;Z9*p%xjx|i{t}HEj*32`spLJ&=LK4Mq`p72(1qzFU=NMZ5%UInYaF)FKYir5b~~{{+saP>=!S*L4%}* ziYmnT_(XnJh=!TYIxszExqpsIown9P?#`Dhd^N?)ia5^_+A|OnLX|%7kg~fN<>Iwx zoTr`%0KEhQAWKw(xZKqM5b>{Urpw2j*tmnAkwM7*e0{tOTP8XcXlCJ1@I?dTY3eO< zn@Tzbk-mLMPc?>?JY|_XR#SOhzR~Br?);IUE^9*7i45JMuxuih6LbBDnf>G1bGFO8 z?CJ}j8HB*C*Z9obpVpgF;vu`p^ty*cwsM~A7BEjVBQq+f?YHwp6C<>V{_l~Gi~=y| zQn@_#)1Yf;*^v{?y!D-YEv4Y3oaU6PmKM+p-Z&0uExmpK@db-~5`wbMi?0-+kwI3- z%P{&M5^C#;U;CrJa;E zMo4QqL!AB}MFG00b zXvl6c7;R21ilYFbB7qOKPL(Wp=XjgXbCmX$#hPtW+#MO1JuYbEA^AvjH#!|Z7M4YH zdM%lTD{E?;x<0)Du_XPE=hIqFT#l>xyc;O1p~>7&a5>e z>hsmglbgALoZS}(P_h>hYIC%4^1Hf4%{6r`f(-7ZSZZZAv7KIhGYAGgmaqU?dv^9c zcacj}h!-DIKZUD_vuMZx`9?l(@{3>K4}~4BV*PB7bU|5Eq_>PKzdrv_saSTX%g?*1qrCYNM!g0ClYvXG zUHkHjruS`O-6VT%bhiY*h8u)8@YdIJj@`k^rk9246E_?{9Y^~-P9(rNqvBQ0C$rdY z105+G5VcGQ6ijA1EyB`P2!$=PpY7=*&-@c<<9!hjO>LBFi%wMzJmWXJtPfb$lN#G@ z*|@&$LJfAZYA7jfT0Rag{8GZ8tJSUA6lxcSYudCHq}4W!A$X6e_M^QV$%jYl-dY%% zLQZQZQ)pNc7DCP&{p$oqfzw)5FT;pGx$UR3ikz+!lJ9*7cQZ02vM*INHYC~n3z*4O zGHU^Nl!!dnZ7z!Obiu+8-~P?$_L-3~)Y7?GT|Y2JrSvGBjz^Ij*N!wTgXrCuZnJb` z1c1I;4_63Yqw6=X>3G?)9C% zlkh6_VgVW(Fw-;)hhx_OVB0g@z+jvU4%)=LTy|?zRGCkcDZK>WSnY!y2Wp=tx#iiE z>d^7cWE7x5l&pm1a~%E3CMtRXlp~n5_U6+ZY&AGGh;hy_Imyb3w!Z#3OdZY>%#Tid z!75a~2lr8sFQmzI`>_f>j~X#z{nQz_R{LlYyzn<#1{v=Nz4xhC=NX3}>j->Ce{Q<_ z2p^NOHbG6zNO%C7y3n{8STCHB+Te?n_ki~Jkk8Xy@rE6xtR`ZO0MFy_n#zX*1}+Y#rcp)|1SWA6Och0XlN?|6dQle~AcH|}f$ z88Bxp`2{JnWxZPdHgUY!@R#b*t&5cOf6gycaiso?D7(vRo0-yPu_>naX=Vx0{awsJ zE1Yj9JLCd|s8>+wi;K~cz{(3PvrbH^Sut?dCUuy|g-j*tG61v+Viz0e!kLl|X<|@S zCz^~qBS!8fe0f2qAcvFNQh->SqzQf#*{usoms#EZn5smJ7nqL6gS`u*J;ABDzu@ zm0x}#A9S_jh$aQvC@maZ{-D~_w6dV>=AD%hON9o=IVN5R`M*gw{7uj!7#98^Zn7vb zxBKmM1aD1F6z68+$HC%pzI<$X70eea`ej`C>L@W=HV%s-JAHrpRq>Qw;>=^VHgvxO z65EgQhb%1AlG*kkc$M{vCZtRXO6|%C&Nf>=M>q=b6Ud8AxV!())W(r&AIF$llie(TQ(<$iCU{6$p}I*SrQVKB-y?DwyzU32A2O!7^iP z*pHf5Lg-oqCUz#nauoZCmTL)MNab?r81F}usb4JxP8at^Q)mhN-?rB^666Lcc~i+& z=Ob=JNE05*Rx25GIWj?Tx63piu9kvLCajBh(>MRo;%IEU(z0A;Om)7GTI{%^H}U2b z$wT6lN+10}fY+v25^u`>9CsvEB0tqnGlNCb`aN&63+Gq}>~(3C7ej*Wu(kczVx~uKUF5 z-ugXg%R_!V7Su2{ifcWfLb9hcm$P1R6b_0tI`+BD>9`dIXlz7084**zOgP}wznhx< z$FMbQSqxkE1icC_E-v?V1+SLzBS;`W4o|THM7?0Ey1M~;_GzQZ;#i4YKS^WB+o=;t zZTav%wI#YhI3O~k`b|(?7l3)qUx>P|2X0N&mnVH78o|L(Zi71POXqzg+Y0ZBJh1G3 zQLkx3Z+j0cg>ZqkKDJ03;SC+rBflCrj6)uuaP$0$iLoF_qKqyA1Lqf9pBos)9{*y8 z25RYCfZf)7pu_gE3BfbZB#RvqqB0S(lVM!`XvQ1>V;gad8*5t&JjgBolO zk8JW$MqJ5-H0KkJ<>xCOHVsP(fvyyZ!j1@k#plBoZ2sgTts}G6zdO_B#s=&y(3*}91>1tNY^(Q%rjmz3#8e< zs_$B`&`I6aiNr^%WaRxx%#DMR2WNA;TOc{wg7fbICWZm2Jl!x{iItwo2emBfgBIwP z3t)K?t_jf+Nw||u$}U0;Ku%rutobMPcFXYrb!$>sn*>6TA2@$F^2gYh*ERHv zkT@;#pO1C1dPVk~wy*R-V#bGSgfuZ_SJS_q+?lV8Tf{WL4_FmlAUbGs zX+lHcqEBe-RNIy76E-x%HbF{{`2qRRZ>xx~vfhZ(4H+oRg9inm#<+t@$KY(J++Hy6 zc#0hDvARJFN=0kvS)8EwszyAAGiu+o3O-=GiI}~&o%=z{5EE{Z|HMTADTS%b&(K2I z{GF%#HDc-t-QO9p*N)qq5swDG)!|)DKv&A)3M8;odzX^bk~nZaVOdJVg7KxS9EW{U zEwhl@>I#MI_R+kZt{}f__~4}IJ&@_P6wHC1lsv8&Xv}WN&^~?cZgb=_) z{Qq3DS0sd)W$+pJccCjtQ^y*!XF{66nmiWQC}mkFsT?sc1%P+*I^^gxCK^NVsuK|e z;&XhLH$3axyJl*HW1>5G^?0h$kw!t+YI1%pB$g+5)^xb( zsLXO-+)0Z{RMI2R9(Ob+kWZofq6h(~RVrOGykY0c%VtFo)DR$giw$o#M)tyXcmOm# z!>{i$2%6M3EeSSPS@oftLsyUio77dZwFzn%B!q0S#$;fIQ@3TP7{YH}`tq|LsKNqF z`@%UIq$IGsv)#61KGu}pke`J&h;odC1st7SFk!9-=?|+6^9p#ske`s}H_UYfi@jv@ z2(8~@0hmOX*a#&+a)-9^6CFYd!vUrT3T3jwF70CL&pM3l=#IL;l{`f%6VFSq+$O`) zILmN06fh|PnVw9BUia#HUA+q0M*PQI?VtwvDoio;6yT>Jt4%t`7`-o{3KC|YPlvJW z%~CCPsPS^KG6cUjDo^6c_Eg5E$HQ z0%~k@)o>3elit2uP?|p278?mS?q8T}!qXriLjrCqA)frK#KN&n9$VZD#pZr48xg~F z^#?0D_wO4U@KILFGt0jYShpE}g5d5e^UWr;f>;fO=GHiHqkz*%Ctlj-WhV5W9ukEqM^auk8W}CnLF!$m&*i2 zqJxL8j2@Cv)Lc@HLwGfphfSi^&n%bu;AISd zm*LQ!sMti{l$SDBOBvXnk~Q8v&3sP8_67e;Xpld`LcwL;;eSHmbZn%PZXjgU9i_R6fbu< z-X3n6uu>xrHwQHG(^c!Ua#aDcLs(FrF=&%1yA~}RbJJpPc^$HAn5&JLN`f2qq!MYl z*3tVl&@FeiYY|;Mv>=S%^b2`8_Bg)4=KT^R9>6VI)-{Vw(ZWDk?y!L_tb?EcVl2hE zgw4iiPjtTQyp#sisTC~%B7(6f)$~MSus)9pGl}1k^U#JsVz;+j$tf*DTJw)8x$4Tc z^QeM3P6l)drVm~NxQs4E@&+6tI8mZisq>!&h1Dx!WFx>~*EohyD3hrWy@64of$0_t zn?sV7E|O#)W8(M$up*UZ)~H=Ec_$WCZc2$!su(^KGqLyriXau`(!px7M; zBdJ*`DD1RAI{1))5?zz>!0O~CqFY4^hH1#zDIJ3(o-tqUaVA3AEd%Ey1-HGcrC`Xq zgcDM(>L$}S#o3|i=<%--d*YHkHnZaY8}E3%s14x3(3u=_psi5VuYu^Q3EOHZZ_e?x z_52LOG2`1Cr@U_ZhNR)@11j4}1@>S`N|d!9*`Z0y9&1X0$N;{erSi0dS->Jw)qrfO zUImkn$(7k&6^+AtSDU+jNdD(I!aO>SC-cj?sFbf3jR-}oEEQ9wV2;#I-*ylkGehT? z=dcD7;a3sq_$RRsWeC%PuVirGQiQcbBs2_&NCVIiar7{>)@sF@ z+LN0pS@%sJvzwgmNHXX8Iy;hUNZrw*LNzsLKgi8?ej_E$vg_i<=ep#8t;X0Y&jUx> zaO4kcO~3(hZkbGv?Q$Rmgvf{&PIq+b6w%%28F)iXMKwk4Y<9rJXjz{|Pp`MoBZHlL z(P*gd%rJyx4fMcS3Y8uz1yoWLFP9TUzm8%-K>l!)r}ueb6h*Gi#^GAlTiCs3x(WBo zk(+84lCuC*W~4-`Js;SE7vP8m&ap5qUT%+(bJ4H#+vMv}$qlmLn)B|Crsx)QUfIvQ z8~Q8P>PQ>~76377D1QUnU*0IrkZXpwhhwo>gPTHp^v(*{4^#R^8xu7LRM}5e^%^hxQD2NzS+% zguchyN|eLOnv3mC$*L$V>~fh)0Ru<%9aws%Mvq`iH&y5KKKdl+v%E|M*7^pipFVl% zpfd9dduVFOf`$M8Q0dODeJ(=wpq!zGsGdGxUCQ>F_Dm58myQ&Oa3q{cb0~k)PdcXa zMyKrINS;1g#n*PQ<%kBb_ro~DDM7OyoxAAEx^O#8rykq4Q@WkEj7_zXa~`C5W~u+m zYoZE_+Pj(FoiT5R)pFBWj>Z)qGmB}(tnN)$-3S|v=1X)cY1Jn?>^$MuD1^4;R56^Z zO%BX7e23nB|NK=W~>{uwo$f;0GSy>0HLxnzN zagMos`mP`!!SB`vFcHS1zTI^Gc#fYHlPxH6TPn+FUx=B1Fi?7NzS$PjFuf;R5hNr? zc4#`mC>bS7eB{;&Krae3)GgmY#742B1Xzu|D1(`75FTIrb4x^I7tlprj0}WAe^##o z$*n+2)dlV9#l|rqOmIp23h_pl*I8>1NPS5A@UXM|Cv{!fqYa%z+UiL9@+w?P2A~jh zIS=mu!-zhF8%>mSlMCbt0QgMEWd8G)1Yn9bs^MHkmVZ}5U16*_;g*Iv9&ocX?&L7y zC(8A5B^FOtViftSnfiamUWJ9J>i7O}04vJN)M)T)0Nl=ZtEojrOVN_oE>S_zI_VHLYp4WOK(B*6SS(Ac9DZtpM5<5XaS$zBy4}D&UTyqAMesjNycbtbCxcfH0nh z6mVk5G~L32);c3NB?588vvb1Cco8u#P5edMqO=mm%rAR`jdnbQ6JkJX3Cw6F1xwc6Mi(#z}oD(k|OuyqH%Li&_ta|dE8=J zt5BOpp?;K3AVhv?RWQ4=9YnD~Zp#l?aEG?glSql7KWy>8MpL=A@?5-{!%9k`0&k<$ z1OXEJLzU`5i^U*1zjbACsIPz141sAOe^}(dN-}|e?f@{|S8YJRDX}usIKb1;w*w_= zk(yBd!Y^@D_1QN=+S&~s|3ZdcIl<>0E$TDKQ^2yGFND2$e<#o_Bz&5+V6 z@%BqWXa%>%KvewZB*V zmBDy#WtCz?WK<6NAo}_tvxCv}Tqu?gUpJQ>IbyxnqB<3!(Uh^rmh{#P8;oGds~56| zwUl3ra!68nnv87?fFc!K#^sOxr6wTxi7}I$(-s^-%@d@j4?oN@7yS8r^Uh2X57F4bZqIMOKPe>@rwhF3Z-BN1Xu;6Fg506V zaH_vM$&Y*A4tcPy3id=#b_BpWoufwsGC@%#n)G)zHjI~y4(14FJFoKq)#t@Iqn42! z;BJM{F$O9`?ifWXg}eu$$JYo34nwLf-`ZfT@GqCrDI8g6eYXA@<8vZ!t=Iu60DBKk zcfba>dc{Lf?9f)ywT8jWUxLoe>Ox{KZXp<1k3(ueXLTbwTE=y-Ba-jC_}&kSt~6_A zfSqk&nDSXR5SWX!YZO(|Jv_WChzWCFQn^10+JCwC+Vyan5`0Dcp<@kujGXG`%%G%(WXv>!Hue$J5{rJoB!m!wy#Gq*RPChoE)r%>(6Pnl4l9V47xRSn0c z-sGeBqu-B>z;|o*+##G#jMng7cKps94U;}@JB@6Q>OrD#>^z2V3}vGM75de4=OQK; z?rX!UjuKHoBErwa1jcNNcp~-vmBU!bgp`%C6XF)w9AY8On!d*nm_Ap_nJNAkcRsLq zJOu5oxqc{nfL30(l6S?Bn$7n~)%~-d)_2N(@VN@UNO#@aL*1vB zZVJh45cVonuHCvanX&ChC=m{I6o1)@CkCXgHNhWiB7O~`pfuh9sQpfUF+7Wt!e^)k z!T{zy17OOGwZ;l4epvO3`q`(wCheE9>;UIAGOqhk9>FM%N)+y;v3YXqn#nI!adQ_{ejp{;B^_nuKu%Rz4`6WjC}YNhB5L|ga4xT zwTNxJnybIel5Evlhn53yY41H+QNVBDJIOLdX;2oeL!PNTW4A+#trVQx{*! z2-H9*L=DtLq|;N1sfr*@mV#&7A14Y|U6^i(zd^3N`y^D3qKC%32<)DP8_Uu_Z^2)2 z*rYcyoa~Z#4?RNe#^l2D8cizQ=J3ISg~y3=7F4_ukEt~Gxss3 z`NHND^(~-QeDt;Fb7^=F{4Q#EdH0BP7a_`INW{G#D{MgcPWG&SNPF#x;|7z`^@2Ly({j9g(A0DV5=V z4N+5KO2Z8R@jzT{7|{Ql!`!mTKy??PPT6yrf%v_Aby!3sC55D_$fn*aiiW!oVZqY< zBIBlm_Tu?==Iag;dbf>)Cjt;W-4-(cZ4M^?YfZ^jpIBEUs&mm=&Or0V#Y=Sik3ff* z&QT?y=KMZ`B}`}SZ2|&@K8p|{Asu84m;pl)NjYX2&`Oou`t2`}q5~&iydwzUbDnCM zok5b+57Bdy#I6jZY&kb7<=duloke-8hrmwS^N2!Of+NvG@arYSyM{VF>AtjDf_R_O z#TYv{Z5`?hy#E1*T?oGvH?7F;{1Bk{Qm4Q{nBX`atp{a;h%uT5Me-6bSyY~}*w`k; zI@1EQ_FNnlj>aX>zCh-m5GIsX_2(0;c+<*v($(Bkt}Jw|Joe-x z#J|%8q$;didW-4OU#Kf}Uj^JrALwGPNBEc~pMmcY~gN)y*|(yIpq zpI|)@RtJ+7E5o454ODMy#hez&K|==Af2&pa18ZcVySfl1F`QOz_*l*vd2pQ27w{yb z9DHuA4%487@3mKuxml`>7>na_+PslU)H7G~tN%wGJJQ#SC{y~f>Tu3-h6;!1h9ZA0 zBDf73W1Nk>rW<9-#D)FSZ091(C7U^s;?Bai0)RC*(JFOKbslSB5a$CFK-*g|_K(947GS!RecUp24i|>TD@;R0}E??K|DP@C-4v*X}LR zDu~#$&ZHL~0i}fHnu%^w>$T$yYKDH6&98nFY9!U`!1^)r`j+jF&Bq4$lwt94)>xF; zC`X{{S*yrsdexT;jsoCkg}*`AHyr0_+L}wtsR~j;D#tL`q=@brJ~M-tYK^+>P$>jd zJ*j<7bKMK>>eVU+&<@IbNUp1niQ&{GsPN3RIoA|-Tc&lYPZz>QUA;&KZIiwGiGF12 zH>IYSulud|Q`dQl)kny|7oe>lagSdc>*-4sYFZYi7pwOKF{Q3^q>x>=X=HQ8 zWr@KA14>Inh66KTY2YqfY0>ZXE#sEBc&gaRnRsl$53_GmJ z13LL4c%^$0g+PobDBs${)~+KtiKewa|S+!s^0f)p2~Jcvu<2|4)?ftc_@nZ{5OL$ z*o3cZEEi+d8%wo)A8qX}`6jk(wzor?fpZ=}afO=D6+l5o(NUOV-N+$l zpl8OcCYDZd`;74tL(F$E|I6n%IJPZ;j4a-IdYdg1eOKrhFu+NCS!0F z=Q?(0e74P;_>gf z6k1_{fB_)!IX<|Dr1WR%dfL{#Pf|MdqcDgeUDIgsQ7+%rlk-BT^Vq;5z;ftqcwsSO26>;XlicQ1KMN{%z+*IJM%d`GSnPDZ6iM)F9A zhg*|I_N6wGv3`afbA{sr97n+~?&jpu53j6>+K-&?9V%U^7uMZw`Zop#%4^=_Egqsf13LJ>$eoqhd?`a(m)_f^9-ImdwwJCW$kzP2s88F-!`69*eU_&~2~#fJyJqiwTDi`AZ-q-g$noF{DnrPvC{)696zV9Z zOnO69a`4G#*HhfTsq%g z{3D;X?87K!_E}j}wKRsL*6QktQ8=Q^T#6KhDbSvsp=SAWLqN!5xQygwrsl z9nCH#6FdZVfJQc*A-h5K_^W}OK$!rb6WVZ6A#c#R0_CFVu>$g(l4!Sf;dc`F7Xe#Z=J*{?rN1mME#%84OyZU0@bz!I?b!kqAfh8Z(+7 z{N@>TlPo(CQIrBOs6Nqv+H+OOJan|rnH0iMTv_N4Pxrc1>$G;6*1|ZDn`5eRYuEj!gP*` zM3%iyV~tuQ^X2>0w{Bw1d=PtfeUm;puwtJ#>cy1oadIf|-Op9&!JDm0A4==Tb)8qxGLy`s<);d_C!}U7c~vA#>3MLy zStx2+xGl$-zFL2wHEmE&Wl!3}*$sn4$_axeTmiEor*bBz03CM2e4H#j8D6k>Up%_~ zh)iqx)AO#03lY&0Ae3$N+(P2PerQ~N_x1$zOZAE)fVQgfno&SP0tWa1P8l6&%g1&% zpd%!3|H~LgyC^7@UDXBl@GG*?Ni?FuIS_Ngnt_9{m`F5y4s4whai8K<3ZDYdFF1LK zj2yxso*huGd0HH})N0)CaGYV76H+n(KvhmnTDZ;jwCPk2rWbAKJGfnYf7sn*SR}z= zMfiQ&hPL1MDDE_HA`Kxg!mvw$@jN%&jgT_$x3Sebj#umfv6zCu>Vgo-L7hp_%3&>G zxWR(9$2P~PuS2%aYdfQi;#xG7JzCyU4*C^R-7nb47Am5v#jx z?%e2pBzSkI05X^a6ckpi zKS>mmajc5CDGU6j)OX>~Ut+Rg#%$?gf~yFtVpSEbjO zC|I#aGLYpJ%4GT1-p8Dr;Jx1+QD^1N&U`+LcLtL?heKR==JlBm;qSO@t+!QG`COcI z$Y*unmtt=%CKXOP(0tNJ?a9=>dS6=Z&f?x~y>1_5+5>G1AzH_`l5Z7Mkyo3qM8V9q z7ygrbO`ge20M@_UUFZMF1y)yZ1IgFC?aAb)FP~*kW>=xt_~xmMAmfd_innzBe^l)# z9M&zp8MEroNg@>_8`_OIO#@z%E)j4gohq|#tBJB-0_&NjVs`>aHMg`|d|#Mm`cVLY z6VtiNMFQg4K5j_wO~F%6zE$8!^gNPPv(`lKCRp2o0uJpXe~D1Uax~ra-z*iH8SOLu zt>m9YzOtw*0v7`rAXEMh?P$(EkGuq{8)rVx=|$wgT#5qFibE^fRPpn()_rHdGdk9k zx6}^*ZnBgvanbPM=9h%@VMvPA6q+|G!qNoS;j(6%$qmwsg`<}1{Q0bjr7mO>bL`j0 zmD4De9SuVum!#v{GpFjpC_|(ID5$IHVP((0vMJM%kg{dG{l$sXt|kbb8KVyI^Pcjr z!V0Qc_L9eiKGy$3CEh7cOo*mVC zqpa{=OYbu!N8kxGU=k_fh>noq0cGa68v<;z%Lt;*^8Cgb3q?(b(k3(3>>7IHkXjti zO7tD+|6T}pAu9oCF~ec9;06@5E!o?8j)&9&8-z}&Uye`0?033jVzRa`;~2kCOAWVf zI?>odwBlPJ~g#nR;bIo|M~$Cq2rU=LYQ=B@ZS@t<4Z zW_vxN34x1o(JEdL1mAt>y^apR5wz20k7dRlgyaXKB=vlD6-}vu;B+Ky4?Q~EzPHjd%?mlyw&55R1eRkjEd-i#f|kPg$s2aAqqLXPb~zh$iBw|boK5C zle1oeCm-+EAhoulkzvxnigtT~8O22=tjq!Esn($f8HYGIFIW^h!DI7|n=tXnSOWPM zKtwz>QPgg3%-p)Ji{CsbSeB6W2m$QB4^5tod%p>}1bFj2QKkh?(?g4AVi3+NpeM$o zaV!K|mvM-t1Y=nwJctE1l1PxKf&m{X>`UZJ3&9ebsM>l3ZXR+^3DSDdw$38X#$8O` za`8`(=V?5TZg^O5TOCcLED!Sn{9iLaJA>~JlvWxb2E+3|;Z``EmST-9ZDg?Jkv0W;fkL2~VJ=Sk%B_N!8E6oj;BCn$suwkjuhq@@E}%^%3dJ2G z7lAkiBl30p+lZvXDvw}IAG^+GyhW$9uIEfx`TIX;0V0+k_frsP3EeY7{b`! z5aEndF3;nV0!KqsZ?t7))Igu_qcM3uaa~%6RTk6Px9f5Ax?I zubqweJu06&i<#W;yFKM?DsJxY8^F`(Z5JyQ(TCvxNRKy-9GOqb=C;KXJp|Abe>Ehz z#EiX+7^KDM_G^6?`yjS{0?6=Gdfc@8y)^GIN9`eVbQ0V2-Q^0MXnA;>04U{Vg{FMX z2`8v6os>NJsv-$$Y2>*i^+1>yRqFGfcfq;%bTq#;dvYj+taN3vOsJbBxi<17Vc%)j z$2L6tL6VN@S~0W6Mg)wyNV-@98W~h1p}rA%0ilzWq?wVjMVIs&`%+#2wu&VkobE{Qmih);^c?Ub>{pW@JnB}EFaN8>wiSGo>BDAPB>B4{1*rKnVSiT%`< zsx+srh~nX(v*13IXP(9G@1cPMrDCXD{G&S1e|`PV!71LYK+Kn|OCaap;an*85GRun z3tmO=T7$>4wt&o~RyB9Xg1pVyvHFIeK0_xfCBQ~8Y#D4JGp$)1!K;b9F%toB(jhi) zI@mlsw6>?m?co2WKYvW)4jV$n1r&CP7u-4-Q@ks0LS+~BE~PpaFl9uL!@s&D)R0Lv zc7b6_^TXV9n(Y844o*u!QSR+?1~{4koq9$47l(vsmmrO42jitN%0cvFn}GH_xr1qa z8hsNUdpdZF^mA?Vc*?S%a^5i6HT;%vx2Ze`HR;|GWN745mIqsbDUou6WNA?eUHC|w z3Vgl6Hw)Kug#9<-S;aDo%vReIO19u>O~x7DB?Hhun#P^(4&g)Y-}Lmg{A%~y7`|fI z*4_4j?0hZX`GMw#V3@`dLgK1L%|wY z>g60N*`Lgd3^1k_NUBuxpeGlVE0E|3Uq2|*>wizR=130$u4rRoY-~**-yb?Y3ZpLJ zZT{p@M@u2Cb}ec(tuz7tgXa2=IS=_Pgnt9=;<<|1ggGf%HSnkCnaG_as+294He4CNkq7Z$#&IZ9vs!RIb>2Ai%jbB%Oei3^Ayd?lV4@; zctTb29E=|N?h%p_Ov59y0vnMBIbUqSevk2=N-bY*KZ@dWDc;k&jBjo~>^s5@*fU-< zkHlCsz0=T?4vVCyee#i>VCtG^F&I%sHJ7!jOjDiwml-Z~3tSi|Xv)h_CzyckSpUg! z-^ZXu&fnOu=9pBTofATr79Ed`)KLE_(7-0*2zsXp6VQUPX4;FX!h&Ur#EyOG- zm-K&ISfPdhkEcMe3Xv83atrq}Cdx$9yC3vfBu{3U;MG6)9t z5Qm<^m=aV=AA~ig6dhslNiQquef0+-x>oLPMJ7XNNyO35HaVwDGK>lFMp?<6>eL`B zi-<3Ty;QrHFzeO@W`Gy+UEqw7ihYih<^Gsk|B!q;b`Z+sQbp{5hiQ-(`0Hjr{43oj zyw4Sf?)2Hax&pN-2gVV8Q~0<%#wwSb_wXR_ztzMk>alXTcFe0$z~D0YSZM3dy<*z2 zD|}^J{}8pm53Wq$syEI-=@$csfdo9l@)d@0H7!6#!a#i!bZRU~wR+8nywsrbGczGr3y`tIFt1Uaxae*2Uj--ZdAi5gKArv^vmNk& z(!oR-<*d!}^oA8xXzkkFwaJv1Ir9(^%e~R=D*ZrlQsuI!|-y!4e@bfso0KG?0 z@lkp86w?_C;*#6=A6D`CPgf)$oKQI$_0LO1Ao)BNkj*nL6wukcPDQODBt7796uveMZ zpa6kVoYH{k=yKm!I8&Ui=4d-;NdMD+)bGA1OYUH6Q;)@|6;%@`en@6z8kKedi$TM>GZ2D{P@^^xQ|cc`t?bFuH$Psb7Z z5H=xL-DJOg9>*mCJgSRuhQUD8^wx`4H)I0xLR=OQu9D4ocGD155|DQPI6e(<9d6>3 z!-Yh2_nR75w!5nUAu_9XgUfP;v;o_pN`E-tr&bVbfLY*7HFF+hz6wRUm1?@!b^+&- zW8BZm&Y#~q+V9_EpKUQ4;9NsRhKU?I18GQR;GG~Lj$hfgb5A)1$(+N$Ac*xW0i?A0VNhi?e1kFtHOXishDL71D486UZg_!zpXEL=}L|h_$LoFkt5XS>4#X-;=ccY8u z6=p(B7K$_CkQ@-~s?k?|Xl?6wVS#x~edrFbafyd?HVSCG)i_9}Zv$#PXpEuCnK1W~ zx;Rg4_Ukq=Ivv}myYFO_h6>!ffN|7Gvf>|aE+@+1rjLI+y!{(*r#)uzlHFs0*|Y~% z?7%3+1KJZ(IIc4CU~Z}|zcP4Xn?cQm$9^_KSBoy(r1k@M>qPv?2a20D8D96$!&JPC z=jd2UL(s-#R!YR$$UORO7p#pV1o;XySH%TSOmPJVsLFP)(l!xN?{^V-wtX;-o~?M4 zl*5!wQ8e^CB4#D}gYy%h2MxR5QG?_L$O=VQlRZhK^8-`PjYx_XY9U;wTK;s32w!_` zCU#GYb>&ZjN|~H4+B13c9{}%G&ng11;l?5?Ch9NHYq6h?nX2<88rG%B7bn*DG-lCu z=%YVM6T8NVI0yMU8$FJp@P9TU2Mz6XuJalOL{eu<;R6dzUF01Q2NB4Cre0{{Hi}^k z!U-23gvLu_LR0KpeV*W3kX{Exwe0CEq)$VYyV<|4S?RyusD+6#Axl9It#r>;6SjP~ z(bE|EB-(ReYIx#3Z2~_iQYMyudMQ;Vz~Ye+00=0j>_&5;fe*G5{3BAMaJi=qyd_XEeG;Yu(Znu98me^D^dmILvcS}4yD;&N&#Ko)1< zycM*{T*wh|hCb4?X=9x=a3m;dhH_ucuN#eS%tX#@5-WZ<9rsd6$*tEkb z7l`mKP{;LG(8g>BVAmOA%1d{=2LmQV#6)sPn=8#&{wv#$kT#l3%o{m3Qa@1KRelTi z#|ot~m!K6n^KcBbTmq73@9RLUY+*y@lbgXl_%wkSpR{|5z-%$|+8nOu=g&R~*F$4U zX;H`A$lKs`*VHOzpr ztjsY^<`aoy=`;&{{iYa`vk;k5^}RLiZ>5P-rEQJ#gTQkMNhJh5SUpN7X&kfPjTX3# zMl{l|8R9wb8M9`hAF;f|_OL&KK=41Q&^4u3S;Gp2hgiE#4rR%9R>BKQ654ht=}~~u zBg)%OS>NAgRb(QG(qw4Sw1%;HiLqKgB3ylIy+y~K39!TKP`Vg` z@9co<>{8!q@OA5=y;y;on50JSqY@!WNP~jpt^!o8j>!8VKf&qZzL?>_TiVBL00IhJ zM+{{x>`IIJ*6X`dT}TG9kHsn3^_toU)jM(Z;eZ&i=|X|SIY!r2?Bd=&bw+J9Cf}hD zw`1@e#1yTDT_~oUcs{U7V4YG4l>xd7dWpd|do{MpZOfxTt?+I=FyyH_2`53PU&%S( z%WSY!^pf~Z@uuqmlkzk?y*!3&+n^qa9AZ7LYnW*oe82*RS?iV!s z!#ssr?||svcuK72-|R??1KM}%_h^TagOZSscNbB~B`()1?vA)>4%sro$pdvfrN!Qk zn{4_L7vThYC-+!Ja)3y=osuUHJ;C;}@*xs?va@T(KGjS7APK9Rd#u`E!W+k<_*%%t zw?-f0ObxDMIsI=O*0&YAcS`js<(EKFM|aAQ#k;7w_LsoOW6o=ff& z*?tLtQi+c1rG}G3B9X+_N^PyxEH9)%1M(ZpK`q9``>8uHLFIpqFd{n{%oI!mf;`bp z;S=P|GM;aoWQ3lyxaEPQ9Db{s1GKH^^H(g>0#@1ZztQtY`>ToCiKIZ~{f0p;o_%1z zAjU-t*Z?1r!Z3JjahO@;HoqoPPdXsDqq+f)u=3z<7#E)oQ^2URs4UoJR@|%^hqd07 zjw^xTQa0gCS#L6Y-j6)!<5rBCG1}1>e= zWu^J@j-6dJvGSe>?XX7Pjj9;?-v~EK2aI}n)^*^%UnvA|eCmlTr&q1x8-EUG*hf&9 zU)HBQ)z2zU!Kc}BW52QM4i(q1BMXnB$30CDM)ogRNcyG7uwDwVv||#w_r>Pyew5Uv z*Wc1cM@|=AOi>4{9$|8aGAH`_s(dRs-+@sMn@g1^95jDRhAPD>%&?3Vi4y6vd5e`< z`TIF`^MK?^M1RU$BQH@@f_w+UtKZh}(Ga#i>Q`Ja|tW&)j}ASW6G%X?EUYExZ&f z3k8~SWKA^c^Ox>K>~l_Pdc2%_-z}EZN3ekXdU6P^AE2&PrgDt-195)K6Kw>W?R*zQ zF|XOOH3#XLH5{r+*EZw4zS@8S*5if<7?S$Cj??S?knLS zO198NMsQGT6}}jRq?;si^F&0IiqA**in|Y382mR{R;3sPXf*pfl&hB)R_;7;KVdAo zrK}kdp*m;3NGf3C0UqXA#G&gkO!N4~_<*B*6I!(mD+qez26neCkNPOzOv1q(S{!F5 zz5xmP?`~&b9d+{UVJH6vJqx=IKp?Dx_D>7O6)~0J|Xcvh9!KRoO!O^~C zlRPxq9n6{McIcwPHsgxt0;io9xu318;Ccd(0^StQ7lx^GDO6eY)@}r4PjZ?heMZ=? zAQPu1Qffg(&ekQ2C`p_EH=|Jay*FZ+j5Ok;^Ul$%4`@gyom-lUi(8l- zBBTr8SJfaT1wc?Y3ETMfs-rNxis4zVQ{CW1%Xq-EVQZ;}EZHPXI~U9bN(~=!aax8+ zmwl;d2IMWol)S45lWaJ?IhpgWs(YmIPpxd3ye6~6i@Ha_`%&g0m?Hh(O? z{2x{{WwL(f0~NT53z}}E?b+uyky_T4-cg6egbpZDlT8hLAJW6cZJ*2yBuh!*m=bP2 ze4!H;#3xKP8}pHW46{Y(MGjh!iif!qcw3^jukak`^tX2xXZV&zJtoThgdZ*QI(|nT z+S`7l2WT zA09PqmpI*f$Bt6C7@3>aYN$BA61tq=Ke*;YaSAR2J-t4?bwZG-Cdz1@U_5R4l7%3I zvLMzYP)HMUKj~uuIq{FDSF$Z|{TG1x_f3o+JUxL}{8JjYZi@>y$04s-q_m#MGMHsw z=&8&j^kh`{3Oulrm8UZo2S&xH{L6PL5|=KZcMAjXhH<@um`M`JUQZvsmWPWEz^DuA zf0oVy-dsjKs{nL{xEDrz$Y++y@9FDy?e^`cO9E|C2KUYrReg|beg_F9T|-c>WUAKA zo%z_v5N3TR_gw_b?7|LaSXE$~_uhXsHVx7LfQUcAxZiadpv3~nR*87&Tf0U+PZ3=o z``};Rlzh%Ek8EW)RuPAHteWt*OU0w?*okBwX2zlHXJMIFBiS z8D!qhaneGZ?CGS&UlM;WJB zz2*8HJjeRuaZn&@d1_(uu)RZMx*spelLo=$^)@#DEaL>D1dFHOF%xmIjwQ-0t{VYe z1|Sz`{6WA1Y;fn~li&#>@*p)Lm7QIa&5rxAQFARK+h{?T)V3YZP!|5(vWgj0PKO?7&gPItu~j&jVEhGY zuG;P+vYYuHu@DY}GuldEo_P{mteibf&|N%as=GxbEiXB6A^@QM&tkv;{0phQaR$$@ z2R>X@c#Jv8>|ry*kuBa2*l49Ag~nJgnF-4meH_$y0VP7EOuJjuZPZjgTa__4PM;F_ zit~QZ?q1hZzO(o=<-Y<>NhxLxT6~L;7MAe9E|<^k0ou$j+w!czZQ81AN$PK;pgp~(Dv*r({JrwrzOV35I~SDd~)wUe=tOwETgK9ea|f^GU?e|@Ke z2F;|>!5f&wDts*hlq%drin9z`@+Qhudme*i!H9~Re+^D;9ev|t%%^CqCx_eFCBATK zjiFWn`wn`@^kG>)WdY#$-d@yDrM$b(0AiAc{3s!iy?tRJFMx(XK|Y)4<^x;R6Ka})IQssUxyB*yip3hYj zqRUFKx2=71F!yQnf+6prX)b&6>ULFV`R~YL=ozWQk9uhlD|*o89-NS?M=?71I3QmN zfCldRh$3*35p_nyXSU*RSKYAfIFP=J%5W*}?tD0N*ZkQ?lG9WOg-Ib^4*b zmSRiX|6&0`XuJS|T;wq1v!BWk)vd4l1)l2GkD9l_Sxn4^hIqaoox4XqH-> z4AaUzX{2uAfO1G5@NZr`vaJ~Uy@U*QA!%LVQEMS&wgUljIw24e&v~&8dj+)cU0BTU zs2&p3BYnqPU>$Z!=aSJtLH9Ivp(|Cadm`w)v$Fau7 zB$DF+2I+;&_zbYjJX~-9sda0-7tT^rF*mIBh3ciBGl%{J z*~2ex#{_oz87v(YA0^MoetsV2UzcCone3)GY+vrr8F6cEx$e>ior*oqn2v#0B_>1P zey@zH;7D>8KHdCWym%C0raLYCT4_?+z*8RGU7XG7XAY_zmZWNjn&j?$$|XPUh>2r&o8iUD(%y zhQkv1=1X!!-7@iyw{Fdm;O(*UGw9*Z8gN&kbaXcC_#bxgd^N@eaz#LRNG z7KFym^28o?%r^Hs#SM<3J9T;^&9@DvCfv8DUV`)-d(5c#T*ahVPqo37MLMb~T+LnL z^Glq&G7LnqbiF$ev+22dhwsmFQ;(&ciSbwToEoAFY1X5Y<<}r;y+1HFk>7!u3@qOuO2Yy#DJSuSnvu^z;sL zHQ^Q{Qi5YFMZP_)g#_L0gb3$_bKK(_CfY?dvJGsLfYUc%1_VNEPlBI@rj(*I;kmmS zh=I4PNzfid!#Pcza+vKDb&Gov60$5VN&RN0;*lt_y^SWcd?))qUq+@1hOK=+&F(@t z&k)Gh(GpqXOh6Y1bFxE`*9pzof|Dc3;z8yy{1TG;rkvp^$7Jj|=FTaoZFne;;(RvU zXfWm4!{ug!8Bny!6~?(4eFIqwNHM@nLv%|xlX^j_on?Th723b1SzeNy>6e;!4X6C! z*J~9n0KX-d?(9~6HQ*K{4K=M+Y(QVX#}s5x<=bFMCh;sgMT-nsKTBthj3F(@ z9}>$wb(O@MUldf0cqfDzjk$$)+RZD{ELI>-y}-kew5@^I@8Z7X4yso9vD(2gzb`8l z_C2_adj#Cpc(x zLB)JBPo7eTpkWw5tS|xa-jQt4-*e*vK#@rP-#i+lrWo@0%Y52Xz*{C-jX~1Owfo-) z?mUF;{{^eYPR)PwRx)n_)*Pj0J0H)sfbk_EH)Mg^!3omX1(<-B`-dL(F#!ZDi_kes z^7a|;TxZ!(s`@n~#Qk8{-3KzW%{tgjLY7P}3ooT6%52_URzXmi1q&P_SxE|8aMkvX z0{J+2;y759(4OTjycZj#Fm?gP8Ug=n;gHPSen90dHxZ&-t+2nBxJ(o!e@wXv|Ktr^ z8G1EwOgzUy8hkD9e&kc)#`UD({b@)milF(I6UNFx5+afX4i>SG4ZW}MPI7$2#Tt1D zS3;nA{JW7;&wjC8MVkF}beBw#jH}o%Ox-GSpNTP4{vL`4FX(KAv%WtjYYycROrNDV zN_zDBY|4L}BJH{ZM#=lCE}pU|LPaSjjUPClxKO=VZpAGYS&!`ul@KT4^SgM5y5a8D zP|_JW4>(Kxx>t0z!0Ml7v8Znbkxyln9?X3-p|J|!*$e*%pOF?R^BJaWFv}Tu%$c5n z5+*rHVrcvm*Oh zChXpE9Afg7LmGp4+35F4i6SLcp>4K8^9(_pIZUs}1T+l%wJ?I3Pqi#yO%qabVAN5T z94^LAb69wpMzWSLup!Lr#G?3k%)Dn*XV4U%Q@fTdAO0F@t{iM*E+g4RHK}wx*h9;^ zId8fC3Q(kuI?@qsMl-Kr=iWnh-EGsrn2uC6gPx250F z0B=(4R+MFUXzGCI0I!`e8D7|Qs!JoY8&n`wAPj=JX6%?WYZoOCBYG`U;V18W0kg^(JwFIvA-euj41Q*kvnjQ_u{F@cT(^1oBw2#xO$4IZI&V6^W zdLa{V1+V;|o{x{begF5z6w2BXMXD%*znXeiZiZ)&s)CJnf>u*vA2XvrwFZ#x~koCu+AoZ^u8ne2rv&p*B5TVhYRS zCE8|9nVK(D0ftIET=;ni(mN4cuVh{)lH9LZ2^bHfAwP?1RfVioGYUz#EOKbd#amaX_ApN0%^?&vwo}r9a^9=_t?uKY5 zxEWb=9@isAGe9-V-1!mlvru+lP?w*^oGl*bZ&#%L;C#tGi~1a34SJn(RG@UP1IN*s zsffR^J;TUi?7@8CXpD7u`x}(Z$SLTtq>QDlq0+*zW;jraUR5ID>3R88*fzob(Y4Oz zSf(vW$g^EwEmaUjGA=AL)NBBZ-K_!4=n51s4q?m}+CRfuHr5`O!-F_>)Vcy!JH}jL zmff4Q2T(W*>HZ%!TP)1t(y)G{J&U?r1GUQd)!QAceOmeceSmC@GQat{9xEY)-H$IP zB)t_K{-+5Tqix!Gu^rHS>De8N5Qd z+K0QY>wC%elO;P$bR4_H_OZ78{j4k1RO$T_hX;{%uFI_%TuX~>;^{-)t>20upV=wh zieuMyHX*||r8ge4;d;A@0`1TrKDAZ5AKz|b3asQQ|GyKX7B3Qvozn`vS3JWM7z%T= zZm8l|r)v;F7j%aRQ8~(2t_ZYGVNc!@p#b6l+tuvzxy4&zV&a35W|qVemhjsazfv!G zz;ju8i`KEgL!CD8-c@?$5^RY9)t$f(RT6y|gyojfcQ5v(WKx0{g@z^6wP9x5|MEl0{QqVmeS66GS{CMIh-$*f_tBZ~E*4~CtEi3-+BG1!X13|YV z?t;$9x6MF<*83sVv3R`cSg8>gJq>z3{k(%;=#yrpvWkz#shb0l-45oe6xpXL7m{+s zF7N(9xNQieO1tWb;_+FxJ#eSOLLfjFuqA(Pn_jWAk5#rkpQ8srrMU<>{o!pb){-HN z$HaNB@J_$#tfcPJ73Vw-8;a?>E(EXHRGZsQR`DSSeB-lBUW|u| zYOvnxWHR5nZc>j7scq}5mP-ya)nt}ik_QlcJ;v-x8oFO7Mw|u+e%V{(C4^zPTWq(xEW?Avj3L?rIIP{o zx9fM3Lnki=MpN8^me^?nS|fWUg!I%UX%w^Lg?;(Q0DFf_><<-vr-`)WPF}MRoY{u< zgf3Q9#h^0`PzAn~xJb~Zx)e}+-z5AdsuI2jKUX^xk)z@V zP03ES7xKjdyK&x)$|^P-_1|Trr!!J-R`fQ-I^Z^c z-E^8958anc73-TcN+6`xv-2UD4HFmh1{U}Q@6e_c9pjD_p0xmi_zAP0SB5z7BG-e3 zDeo*@o}uaejeQa>NQU;SlZ&80}u$WyUq`0+L)j18c@YiH{ z*osBbyZM+spULL*Nyafw{8SnkC~WHQF)U$3RLIh2wmPD}2gFTb6O;0Sf0C z)m@=A2U?6Dn>{AGSw7x7XFBCoOfF%^7{$=WBRAFoDSGuU8j9t)!O&U>UhXx3;h{Vh%WRQ2<{i0T2ONpe~9o#nopqPv|Xl2y6e@O#~3Zx*x_GK|w zyV$K*@6)r6^B5fCtiazDD$A*FDdxlx<*B!D5 zAc&{~(#2-=i!Il8D~QA%ek?#7+*vf+XkyDjb1Mh)C1{Gz6g zayxWr4uwQ0J;#y(L+#^^zB|hR!#>13ZlglKzm_vU=DsG%^TouBq3^H*k;0x1~z0qw$wDCc+X)cxui?hu9Gd$#EMlh)KS_De&%1 z<9A!7E1vsh1?&97;a<-H&JNj(whfv0adjc0OeZVqL+}21;fuFHg!WAB7k7`b&nPd) zn>LID2hbAx&?YvtXYrV>^{DS68ejU*oZSCP5>`}JdId$bIv|@)l-+tcqGU!)1+GVQ z83H0}wkDsG0jpAQM0sz z{Z5Ersw&}hNC+#fUNcen8zR9bDAhwgbJ8MT4>$o{p<-Ij81aGlS*mhLlTaiu(N@znD z;XRct=arxUu#FUVIYg2Q5={_!Ecs*I z2=R*`N52M&Bi)rnH7gH^vI5(E%ql{8&8d(Hpk$G&{abe@3|(GNnthSo7bs2u5KWl z0Z*a&!Zhb>!mVk3DA;1ni0*{o)PLd&dKT0K$ZPswhS$&wgpfrmj5SFx)r9z1m|lI)?gHW0eF4^ zwBnZ#U84{So2Wa(6HgO{Cef9jq_!gaSTwUqln=JofLE-3<~Yjha7$P6dLVW@E8A_> ze;>y9TwoQ%F6{AZRT$}YhMPNVXf?+myOf9~oVX_(Rc&Rx$BM|5y?LPka#xVM(aL>) z;X(lw5?zjJ7m@OE$MY7E{2l~S^07Sf;EqPWe#^VSXp>*Icy_x^1e>_QF@`(gn|JG~ zA>zp_&Z~=XkVgb<_gPr^X2~vyKMrFdvt?i$=cyHD!^Y5y%<#Fpk(#r_4U*`GpyuY; zxa4c7b7%!Vdni@q`$Gl%H(dmLqzGU!;Ko5Ywr(nj*O^;8r&;Gqz9lq5l1p=g79?LN z|3gxKYbVr2!~H)aWw{IGlBW%7o)l6SRC4jjlV;zs92xYZ<5~fog^H7rv)%4+7YtO} z{8;>Z7fu3=CO|u-<^#{QWLKh;-VFaZm;^6J!x2*X>}S;^rU*U8rjNz#?RJUFA>>Jr zEk_!#=~FEx);dO^9g%oNOX>X1CJrV9;Anxp3559CgkmHAIVRV7x7p$4!2uNl`d`#N z>9^#nVDzYDx%N$ob%mtPppSx^0+!rP+#ht79VYHj^<%#{W6@qEPA){4N5`l_#=Kch zb)U0UF#*0pP{_PmiBZ|{7K~4wef^Jq!URZ)k#qqxm1sF)6|d1Z#Y*DSaN8_+n8WRR zLCbh&2Kj5TNADfX6tx1iQgLetOiYkPtAhu^E_YQ$jjR!&YQu8mwIV(D?$8ff1LVjF z&C1?cD<<}e?yr&EDAPgUKdFTxYd1C8XUCHOpePqBV1jifFI$WjqEY9+AsAEJ4!&fw zn07Qy4&wVLt6P9}7&Kb-`C@8Dm3=d@dwccU4;}xqelmS{^M?zS`kRo-czo~|vO>*` zAK;f5+mry~gsSW#miy*Z%hj&9bZ_$5D4ib}5&k zF8yEfc(i+fJ9Zi5SuP&;86Q$!B-zu_ zknfH;OAj-$nAvCgvTwXy2i{p6UKf~d=Ba6827kl!4rQrBWs1rum&qs)N=H?%FeRbQ zm3_Bkaaq~)h_{`>2Y#20L*-3JEo*Y*^==_5wC@ia zR(ib{R3jUW2U|^@O$9e&B(IxF-^?Ra=8c?A5o8rOkY9(+DlQe2y54P*L8ERomZDPi zgcJ%faGjh#oS1Cly98J}&c+S6s`5dL%O3&Lv{0uwSe#W>VT<9H&9UIX_ldo&=OY0C zbM*mkjhRgm{QI|6A|C9mVn>!5s}v;`6AL~f+P5d^dQdKbLJ76DadJz}1a71?tV^<8Z~Br{c-AmdV#{=x#C&-kf5N-ZD#w& z&kiK!S2McIF%ZscpOq;BZBaqOyz2!-NGH`IyvN!o%C6`E@KPAqoJ0w>6Us9$`IxeX zENs^;Y%(P#%}m!IEv>Jb9DM^c$|KRO6i3e^rTJr@ zjQxSV2e@;{&!H2J51C;NvSqQCD_+t|i$Xqf@y^3D;5;$ZjC*~NgB>Tc`BUA6(=b?v z^|wzazQp%LwZAp4jKrs=)dO*)`!FCZIwB&ya97pAynrMp8ri8{g-a5x&P|G2u%4b% zz*6rsBDs;IAok^p+Y@%)QKAKL38GvbCxgn&2X3|2cpBAhHjWIPK_BbT3e(;=BG+8i zCm6jt${>w2u6(0H29UP?`LBXTE4Lzl$KZUuHLm#mNpS?P{jUGuKsoZg25!G=^rh;U zZhyol>w-oNmKMy5dds{yo#QpCvttRQg~mpwd=U^^-AGNusLZi3UAS>K$#3pNOglmS zy|D|!pBfz#hsIj_$T2UH#oxlhXQ6@dC9(9CL0xG<1EXqDwB*)R??S$4#{dr2s+&{T zXZKY}0l%exVUj5TCrSu_&V(Tup6Xf1)$cf57{y52FxdBZr*D%Gpq3tSi6A_d)lh`w zcr@&cided>m(le;uM8E8eT2UzyWqJ@NHT&qum-{T0tg&h>q~*-D|U~Z=ofpb$-7#O z06hL&O_O(|^`udQNcrjx?_v*7*V5C$@bxG3P9k(ex0NUwv^)Xp7I!Om~T9Qly;_6Agt%yKybqcmw-*51&t?Y;HC&^wEyx8Ea%aPAt;sB zi8U%vXpVKGjjJ^Fat)9~ahtN_ z-rP$fhJ!a5?z;0f$zbUz9?MBiZ#>%WAsqiRW3AWR_QD7_=4&Z649loCAVn!@-l#g} zfoiJwms&jp8lQD5OM<~2ujX$OYi?MUaMmqynSmyOr9bgZlJNSB4u68otf`)<9GGO$ z*v=EDyoH}L$PzXcoSF!wc`~ZdGB}6RhS*p*IDQ#xr-xP2`guO+lwClE$D$b1nX_|_ z2QiJttVT6%DL&q`sc@9LciQd49tF&}7Fmq(leEf))U3Clrim%YV)jR_RO;+kt!8s6 zP`ALIvJg@Yrksb$Q{3c$_J&FlloFLBcd)Sfx)mb{*u{U#u5xKS*~ZRThE02Q+}}Ig zF&kb8=kUT&`p7E;G+p+Y>aTG@@93&leOmuD2KP`xdsR>ecW6$A10L5#md2(eiC*ce z+E9u$-od&91VDvR3R7pZJgZ-grit+OSzVe10%d0*Y_vWCBZZCLgz}8?BZgbY^#I&B}G3iP8ST?+1o3O!LbVAf3kCF!J{;P|JU%mL?`}9wd+35 z*InWKnj#Iahk`GNi%rIp9X3Y-R}4UBp=-KyZdWUkIzq?B;Wv{-4KP<0D|X2cbZp?# zOScGnhNm_=adr7Bd25M?FvAcO1k`4Qb!?akF1Ydwc7?(B>|8dN5efok7W2ezM`!E6 zxpOM!tBR2$G6yP1N*>ykk0Q;;t6&eu>hwJt6F{>J>E!>;?qyOO+Ed>1Vl z{ypSxZ@b$s{m$9j1|djjMt_L=T?F*tffXDMjRMABo;gBrh|obd6lldZEN4j#x~s1b zwY6r9yS- zP+I^WM*0TCz_-eB5R5Aalg{VVMo?PeeEpzgtIc2!n#^}0)2J%V+L<#q0o$sC4142$ zmy^bpL(J&EON$0wMSXD%&h>i-3U@DIIGpI z9+puCf>j*NWN323{VHl8kO=2W`n;&yv7N?4ua)pV397aC-M zT0E0srVU_e9T~~CHN(4?olN>e4~2>f=OOMZMwSHhg)@-QeLOUsvG>=H$~j8jP#|xZ z;@s~HIt(-M(eb5bx+x32#Xgz<+bi$q>SRMEHud5wgpEO?f+e1l4p1lnpZwouisdCb zo0PS;qnuxHKKf^)N*dywrA|`pqjshXtp!WL26(g~9Gl*T#MZ9iUyU6Rn}%!}?icVwXgcy54g8ky(Sg6+(Fg|BHAjR zY2vn!u$a(j0uCD?r}}QFB?a!4t7%9|SUsRC%~kV)L7)6Ms84@2c3lybkR>IqyX8iL ztg5N)aSarfYU~Fz5U~BR1DeBPym1R<2PAC}L6tym@?C;5#%^953hQR<*=%hx5@EX! zvF6~r)DCFNooIzkYc67-^XE#yv`IWtBcB#FQmW|3zf_#Lv2uB28`8J4{-S)>0Tv!8 zuIfOzS*8Fc5r%nq|G8Hh?AMRvo)Lp8PIqb6#=J^DX0%lN*1qWjj#_4H4R;_ncGQT= z%%SLvM#jYbb^B?K8~s*`SAOk}ARmXD&Lcnls=b+03jn5WvWZ4V)7DV;-BvSVvqs9_ zV~LLg%uDkpfF<+1FIFT|PWCI_l|frlpeulK>noG1VP8&%X1rUqHp0O8))evCyV2TF zjGhiXCM5$E=8S3bZxE%U1%WDB;L@~A)DlKx!qACMdZFxp<{|&^(acr1qz8oR$t5o# zOd(*?WtW&65?*|VlKNwEJ7Rx^Dkx4S6SXZj)+*csrDopL;uRbo^L;u5pM%nU%2v{I zgS$Ut--_s;9|EH(QAb861fOa)1?zEn=D0-m&z8f{qat}-nrQ5gB>WDao8f1Jpr&Pe z^R8rBY+N24SfIV7Z%%@KMgApNG((Pf@B3yfU$~GGMRcJ>Gut!pF&D5<5nV%N+wgxE zUC!Qa{w}_@p@;3XD!}+elld($G_>uWEKu_H!tfLn{17E?>7Sx4;pF9FkrDvQg(Y&3 znEn!y1w2ZNGT%RfWmysT;Bv`n84_~lUkx;cJA|3S+MR3OhKHqWPbmjYZR={)$xRIX zzEc%9mLY~*D#3+S3!r5nm@^ucM~bjT*_0N{rW5~H!)`5VND);_*kX_fFEls6Y*i8x z5+soVW|#7Cb@kqCGLp8%WpB)I@*emBSiHX(fv|^3&7RKNBP`&xS+CFvbO<#I*mII=b}6Ep8f)mGp^%?sb3~1?{CEr*le@|(>8pQ-;H?Z-V{lj4kYN5 z;Uz4lUX>;p%J;XtoR+Ahvj^arpY-qAE0IrJ2^_-Xw4fC6ZsSP?{?FZ@WD`t8a?8^T zx4*c&7_&`tyLY1(V6BCp?r<(Fbw&^hskgA9A#VXE4?=_RRUjj-rwd2gTWkavt*5jZ zH2v%9!#O#)83FO&y`fWZl-pJg<$W%;s3vs`ujg%~@FTji7$q}(5q%|DoF;XkjM|ig66*XwM+pn! z;!KYuoiMA{+^pPRT=G8N=V3U5^Q_o#`x6opp6tWyHD`os{FxuVGKiz!^tW8AkGrc} zlmYC11pIdk2xl=32=$@objg0KhHjOiVf8H#lvUplgkc4b85w4iWWj$Jrwdt$OMK`* zu%ec&o@3aisZztNko8Y@bHM6EwhO-WTD`{If$lJk(vKF?l-f8VjR4$G6wtVw+?m}Fwmt_Zto0xGvyo)wt}APKDx3fzqQbulcit!>ZEo)h z05^}Ma0rOhWeyIAsdKzXA9^-RoyInYdbsNzVF~_kAA`jjedf@A5BJ_;)NC}(%%V%i z8Z(IH&>6&`bw9^F#4>ePkX?7{qDNI5z69E?j8Hb6ICmXvPl5Ma>hMCG0X!`@Q01w~ zg7?tR@b_1Lf@0QK;K~NxIQNkIZvkmTyT8;L^pUPoOBGE8sb+Z=p6KCtan*Qq;bGC; zgPRDn1zs?CbYP1ntSaJz6z78~cHYIf#Oh(PivxvT7U7y< z1J4c0?4n~cH5ai0L@Q_uYbeG%?NZLGI6+=q1Aj^I>XDD_%OT^fx(9vI^CNBs7YI%m zbZGexNvN*y7LG5`lyZxlm%8M7Glx^9oRL3mtJZ!m8UdmJ6vF!cy%tX>f?Bf-0Jw=0 zE58T0CUQ!ES`=1Nu&rc|h7clDQL$h+b-~L)N>!H*00c*psV?)$EUl4jU&(v;3vSg~ zN9tbMk-?o6pg*$?%BQx!ks;pYiv|I=IK?vPnkb;Y>px1j;@h%-uzz;Sk;misxT-k| zpWR^=2gj)`$t{7tW-r+{e++gB9Z4%zy)GQlFCC_t>37$R0qM%6P1P?daB=5g>N;1n zROPOGEVCrOAk1dcr;yuv%*Lz&)Vo8b>O0x3xYl9f6_X`7X>pvF2%`jdz!YpM%5W+7qrK03|z9;2`6Z??(lIe|5 zoik*+)mTj^8=?p!l=8%g8_F(*`lT}v6>h8NgsRrs<%3MyymL^3r{o;}&)#YgJ58TF zKI|(ANvv)=?S`$x3@9Jn6GV*1UJY0ae9N##d5<|fS%BAGK8#no)iS%VkJK^D_77}m z@YTHFQ)kJ*He<@YCNTU;g~%GC2L;mrs9J1SWH*Tn zvbT=WJK%J6(_Z&7;va?10&9yR)0K)`2SZzK)=BlHbGc z+D9|qup7g=Oy~k4gqM@Dth$$y&+dCzR;c->Kxj%+Bw=*g~mjV|vY~l||J=Oeu?WsiMJ7tiE`Ls?#!4M7hhJ6_rq+UHUfr(~zRY+1jo_~|J1w1$wm zZe{07u>wQhSDn*%IczM^A1jAW700ohV$ri)=;non62(FiEmqBL*%Y}a$K2%nj;%f` zb%Ty4m1&LK;Fx0EjeMvwnW4ngnLV}fhb6|J5If1++*o1{A;5`!`nASx)a!Fzpge~v z_fJFD(uju^3;`J6jE2Oqu}W&={PvwiT_DNg=nFoXwqS7fnn9zskH!?(C#{tok90|^ zW{X|Ku7xg$d8r}ofTegBH*2`}fgKAFo$Ar@2u42ufv693+m%sm|ME(+GK2?9whwQ< zwTf!d$IaKb^>mTq7lcHnYNT~~FA0=Ts*-SD3{AekYw=hLAyBjEtSiMift#}ajRWH; zCQ66gD64#@VBw-DAm6pn?j4+bX+g^n%+WlTJs6_Af!f1bg__Jlza~(z+HoExBLq!l zj4(n`vTFkR8+*E8bpoj)_J`+^DH2hdGI|-G&qOA_#7~fl!;Tj!trL75RZ$WjnR)40 z22?K`W^{%8%6AJ+7ZL#Y8}tfRKO5AIhD@76#Tzrr0-Y`h4|F<~vB{?mRve$HwDxkj z6bfQo&BP4X->uZkup1{&7$4yapl=iUI4L@lH|T{i09>7mVj0dYwgq(;d0lFr*K7X=k#XP zjywi*zhA7Fnx8nqSFXX%jBu^KPTju~S#;5xruB;ewI!8+&$S@ofY#JxI|Ut@fv^qV zjh&U1(FO-dg&yCrE$P4X7;y#<;wZ0dil7WV{!Rj9j80orNv?`z!DVtd>d~|Dh@O>@ ztU>%NDzX@4CgaBTu2cTNt&%2Uz}x67pmLh^JKjRqgCIKymz(a(JQ4o0$E19fa-&Fh zDtNMY*#v*M!qmzu*W$Xpg7~}};oYS}X0BN0xaIxSjC~-?((!jGm=OVLEjzrzE_{p+ zL*h{GEgR>=FDia6TBpsg4IaM}Hwqpc(N@M4@l>{KrQ7F@Lc*kBlaa>uWp~{%;22Ws z)vPOu#@Tq4hY9viX4nI^yf*THozNBjKp*Udvp_^3rEdOXI%DQX_yk!-`&!}rKn|?F zF-u&)Ro|>y0~I!uE8`@VLX_MbsSO@FwX}NtG9j1r37qaowAK66-*D?Ur?dRwX>g@LZTQswx z-?Ne3zq&e#%9H3fA9|CZ1BNr&DO@l=;cTObE;6$jtk^>&_ECFv)6fi813V<;$kA#V9GrFb*UR=bRwL1l5s|h{a z>bP@IyR?+-!Tlq!OfuZq2kBNcCQ?0m;DoPkk5n^>Y;fPRwo0Mw>JS4VBcq=-N-$gi z2?paPp_(C9iauL=BKJn2$*aC=^&aj5n)~?f>;59o4jBNaYpL3b-4MMv zVFqoVk77ezQpncE;w3}WC6zHuak=JxAe|UO`|yV)TiHF3&mT4Y$N6VVpYPU@h+t+V zy|cj=E1K7kZ45QsniNwfqtcI-IGxyhvYl{Bg_-&1{uPHQjV%qbR~Y*`KNI5RCLIW# zugFCf5%Y>@pL-{ld5)iCyx=k?KoC`PF%Ov;o&$+}jjO zcP<)|q+n4+LGkR5aA7YV9YSgACRg1?=OFu`Xr{(qsw)*o_77j;rm?i?rZeU}pNpHT#wf-=2TOtRT23N@-<&6L7MZVPDOnH`uzKQ%1~ z)eVrNRj`+(HOh%d!FtsV$}jlmfFJIiJ_vWT#0*q-dU!5x1_Z7}ReIm92aX6T-ceDs z#svw$m_58PI4AG%x-$k>dJqAu5|ew%)VDD{HcUnrZ!Y zV8k+lVC60s*>cfkOC;GbbNkM}hC*bMVp@Ye+rJ!ZSoyupHDD+OWxA_)6)EYUKYj1p z=vbxf78mLWa#s~m8I%*f%o`RR#lK(HIR^wAmU7ns;YxOKB@Wev#+kp;dt|5Oux&Uj z+N)o*NCWL%3eeNo7#sdnD9?a|TT#14V%%tqjNgEjRUe_m%mw%R(g-uI90{>1<(?GQ z)Ln5;*a()R4<%AAW6y)1sR)nqLm9JgZJD%FxXIg8EOyCovXCdG>0a@+O<9EYdqdQ* z3_ZWH4s|^gTP{}QzDEsXC=~%JWrjwyBzjtQ*TRFFqE=MR^_PnE$|YjDm>h# zSw$@39poJBNR3#BZ zUVY3w4a;N6xEA~imBpw!d%rhOui=JH%_uLzD^aehmO4IR%`sb{4z!Ycoz-s7$4>Yj*Q8@J>&EXPXLgaDYUjw$NgVQt zkaJlyTdO(*#0*lbCTZ0&03DA~m2bzl z7fS*ZwUK_$#59yxd~vKbokBVLmnt23{D6sq-JWP~o11MSm`Q!Rc1v3mJ!Fa{tX{bv z^c2J{s~IiP({(tLPYP(~s1s|!?yedlh&eob>6KoKie4g zp*je~=am2TR!iIX1OecZg=pZIawpLAV7Pt}kP^dN_RV<1+06>I-t;tf-MKI;`nj!8mUL z5Ai!5RKm#|X%r%4-wJ&O8Mv|2rq{qa!RvjSm_h11O2ChMp!wWwF+kfC_m+{K$o*o) zDaU%FOm0;G3`I$zsOocSu$AX+$vaEz9^3vxv^ zTrFsX0s!q>-7+v*v#0#?`C$555w-aZ^w7=mGmZ9`PiwcC;n)vxGZaJlkQAk6?iOW(lOxLEOfGK-! zA}lLHf$ueMcQ5HoqIbU~Q>KRvzNIy6{;S&nt%?+Ee@nkSqMdi@YVGXxy~G@32|K}$eVQn*-@rML+s{f$bqE~u>t?u)PY-! zNT0P>JeIknx#x6Z|HL)0y-Dc^TAq?X(pvb?jVvujwIY%jW9w+dILrBvB%h|dtizC? z!q4IZrqbPu!hU4j=8_jyRQAVrNA&!(2_F`b2XKOom$R{l)1zDMfu%7vj&6IUXj$;Dir@ zIt6U!ZG@*Lpf#R88z{n8fN$~G15!i60*7TA!X!%6Byr&8Bl=5qxS1n1xT~Fd0V_z~ zrd}Zd=9qO5*JVYQxbAprVI5`tnqaVjXaT#v^KMuCW*fiVpi9Vtc>OE|J36mT6@&nh z5q#ap0@!j;=BpHfvw z=ew^@k^yCo^(3ogdkB`QU^B8h{IG`bG^~uJ%1Z)(!@=gtrFD?!c|%D1`P62Ox^(ws zi?>RqdWXwGJi)m^U`*eM|l`yX?L9z z%=JTq)a#TPx0FJHu;^~lqPLO9cQP7Q2rlXTYxw~-URHw!LVM+6s-xkgZI6!VKty3x zrz}cY^D?;wv(a$GODD=mj(`#Mr@CYz76;7j_>YKVDv=x48L=5`VQzT$#qdK$L)0*L zNw6zQ-eU2KBTV)L)5Q67>0v&Dv6^xLbxcFiV$P%YhF{un6cDh(FH{Og5q^3%uQ-Qz zd8=3@kicv}F%0ae1tiKu^qi?}P^$ZdOaffQ{)Z~mnKgwx_P$u_tz`4aR*&s~GJX4V zQ8v$&8Eynn8|R%q92LKBU0C+>X+a@Z7GT`5st4@Kf%VGhN3rxzX(%Z=nt@BF6#z)f zmL6rmnlKCiSmk3FsXH}rhf4+?dx)-YKVNxN+#D6T5G84focxA%-^HLSqo-l+LeZo2 zJ`eJmet_thjtN!lR8?CvYiW3mhwndU+lq`r&K+liUEzl@oP42uyNw*O8!AW*XF)o~m|BO&4$1s3ccw3p&k%QB zUFVh6HTPVEhLIUv;GQtaP?i@;#Qv=#qg%%cnwQofug!aPG|quYN>1VDqAtEB4A5UH zS#5MSl~f-7%b-dh{7b{H;JE9|ttxTECNBg+IwG~)Tjl{VGM_%3&Gwre5Wl7#FHTCZ z>?nO#g=M*mP{iZo^v=8X*|>~vuaym5le0>jR#->gHR5u(B6i@rPGFq`_{0hrKCGVR z0@(8YADtsk6!_cuLoP$MkNG$R7*G~$EYFXuN+8eoD5BkWE*^0vhxI-I87$ z;GP&fPs0?2fgMUIOlm(1{b4iGImQ z5H3Sjp%(^+kP2K;M2nZv;uM8ee22Moin^j0)Dolw)q}OUuzK9#17iJdSc=%)K_U4&0qW+KHD`$h2l=#9lwW4MP&T}d# z;DJ7QExk4~!ALqHdtb#;JW84(St142Kh?WVQW_40%k+xlHwCsEC@pdCtRFlD>VROp zD?^CRqp1L`-HDceLVFfI^vnEgiQ2^+IYKTPrwi>Df}wAush!{H>uS)|ersPetPrZ{ z>2|M@h-WRRBc({VD7_^6P0|U5h9BqwICZi)TYVN2tNVl!*H4T$X9{5`vH1y7>utta zk}BH|!q+0QRzWB|{0fj4)38_lr}<6a9Z2TfdSv%`Toy~Ma^kBL-4cHB4;_K1Eg+)2 z+HxbXVqb#?EMM`q7f;qRFv_2xfr9s&#L8uu@Oc}Ob9-K$d4YJKSPV`%7`x2U`4IWR z(+!G(auG;i4U9ur5y7C7lDmi3+~%fYrdPRHuO!p4QtJ zKy3gE@uCm_=8F^h+0E?!Nb@?OXLWd@ZNCz8Oa$xSZdr_jEUPH8aXo>C9+GU-5dz|% zcOD4o`{2l7`PZ1CY607!bWe~M`v9!PK4pJII+ldv;#jQ@F_81gc9JN}5Lc-|G=x|% z{SzL;Un8#5__O;9p5?OBgoLjv-W$4X-6t-}NJ8o&&ic3ng*1xU##Yl@pkG~RF+CWZ zog)ROt{Ncy38s4{IMrDFN+r+v@kWJJ!J@jkP#PV44xqEOk0M2KGc@%X1 zOQ!v#mKX;*tob>V`s-Cl5Ue+3=GbNY5nz|26&+N@nRJ0=#u32`*08J7P)mXfiC-0# zWS?2wt=JD84bVlxmot%gFLs9t4aS>j`{2D>(H#giV#aRJxr?5$6D3y3oN+;vmm)48 z+Hx4Erl1LmdLZ$d|8Q%0w^}nUee?XjE1KQ|PBR*+d2W&o{2G~Z+jD(-eoP03m{zoA z0OpbBO$U(o2zn=!pFXDUC)A@(fi{E!YMO8ZzwAFaH$#lL}HR_gSxLekSM!*wHm7D$O@dzB)}z z?BhTAX!DBKVI03NwY^XKO`J6Wd#8OkPktl6uys^gYWk*%Wm>&p*L=UTtVeH%Wp8<- z&P0#aJ2!ce9o6fLeyDrkPFKM;%hl8iq2v#v+Rqb9ut2>!@ksCxu1?FlRRk8d&nrTk z-dI$6{gGn3b1)8up_!_fU&>Z+hX@}}MOs|W%bU>Fet8`?#X znrS)_4S4!owzqoN-=^TuWSLy)%;Ju=&2n?rF~gs`@78RO2vH!G|8z&C*N^X$WMZfP zUn?3-u;l)snTvESq)vi$7riRpq;JwdU!7n*G{MYh0=WfIY4s@JoCI|{o9Dy6d zV8V!&X)0~N`wmlfS^E1LK+8iqCqgv7Zb%d0TbPyL9ch$tekI@%LJJVJ=rJG%3DLOh z^ZRvqoq!hB7ki-jJ@)noNo6)bBj>uDo79nQUN`WTA!j^-+ZUDjyHD`iQ@{8*=L|{|gw!0?U;R8yF@-W_2lke8&#r1IZ-%{)2m57Q6i%wab zOWl^`QXOsKZiaOCIj?HWST%VriW8}}qpB$wy7fU7yQLyd5W zIO!%1ds2e)fBZB#gNYaF_N(JvE8|2xXR3{U9z>1otBpma!sVzd;MR5a`L+Ocxg}1f za1#s>4c_B(r`WD7VdeC{7hbUkHO1SAD*#z5c&k0}WP0$LA9w7qFk0CilHyEY-5dP+ z3lb0$SbVZ^hqIX^6U7-o>xTJjQ1qj>e6zP-yn5EMaV{MgrTgGw?xSxk(%y3b<;@5$ zFN?ug?B~~Kv}F&lMM9nU@E{*GObK^nI}BaF&9CV?>Vl;BGurt|@nY{s;ZiXy_j#Ok z=4J{cD>zP25dSoRpnQKiS>^$Ta8pHaDP-d(B(wgx`urV?M%HUEbNr|LM%B+>gcNFa zMN5m)vvmzyJ`xkX5Kmkmmfw$dU_q{LeoP#4lSD)(BzV-ktuP3Qf=4aXO|Ux_;W{%3 z>@S~;Jx||g%qc*P9@ZTSe)uF7&;Kw1xz$Z@3WURpAmI=z|M2YmGh0&?Fhy{I~zhf$B+XhFbrH zGCkVDTAvy!*JuI2z427T1ll%6j~FXFAHf|hjCa86nQIU#aceK$2iAAW1rfd)&MSmj z#^Of?uyDPa-k9Xyw?rk#L_noJjp~E?M$2C`!?Vb}2*pgZU5Y-a>np(FzrtKaNYUMj z?xF2+_EoV<1x|L|uk$cU%!mws(q+LYn9*lOT7A~ixa95V=hL65WKi~1EkZ7k-hmCc z0eqE(=(EF}GCQ)=4b#2e4-!}2G!>jX=Z5J)&*c9~KK*)FJ2LBxbG{<*8;1Wm&7zMh zoRHg!S^>%Kg8lgv)`tpZED(GdL%>YEGxr;9zNp{V9Km|Ex8#BAr3;m%W9H!l*Q0&q z8QhLBgqU>mkKpn&D|`9ZD1Y-*!IY>?XRmPCj*OmE>2rX^o-b9cwAWyW!(~4As4>>_ z_zCoT77Ap2T^E?O)N5l@X);36R7?OOAT^F5f+?YX8o#kkJ9vWWekpO?lU4PE2pt^% z?F}u$&btw;NseQ7y_25o@5n~IDm69WZrF0(gRBr=*x6^ElRqvWi1F^@n3D-~PmHjP zq~2jr+2#m0+)54=4D(_~IW}%`PejmG!@-j56rMI7HjN};plAD^DG^|1fp zmS+nO4tkzwRlr<>70W|_0K z0P&AefkBnh@=j0Adbbno+wY?8x_PG&77zmo>Nj5DhoS`|HYE!AqG)^Lixh1SkVFF~ zyv-~hTfnu9JtB4Ac)&y~>2M@@{Z#2ZBTkFmLY`sn3l4!0-`Z#Z!_o?jCe#F7`7@~vh5=&KfW9hJNUjgspaL>{f`7py__r|AmFEMimQ`# zs8`hQ?1evC24z^hS{m?tgg*gps^G5zot(KI0h?MUKT71NFH&5Ef0$lPEyB-EB2S9(nPQPy0}V1KOK0JBIS46F zpv3(ROmBqStcSPZP9SCFCeBo@SnlXVryUPQXZZl0v7Y~C81a>lVTy(05m!8^VKOnT z;4D5-Kv=5QgQz8l#5&_5;5A0x8J#+I9_>h0`=H};^JR_n*C9d)?u@!`VP<;VW2Sw; zvDu!%N)}Yy&rH%;RmR+QBGd0;w|hIX!e`-I1Z&}CzA|%8QziJmBMNHujD=MpK02As zldFWd1k%|T=SuO+uzGV(z!6MoS}g%bx9H{#Feb5U-35Rd^VOtz(V55qBI2`XXjGsO zY;DD6lmInUw2*=|sDlB*SNi!cCw?SXBn@75v*Dk%9#fTp@)M?dD3YYqfu^wbD0t9F z6a_V>Z(3|fu>D1Bqu`KC2MsYwKA>(<=kmZW7a2-?0jp%lsM)8#(yJ5^1KvEFjv z4?l4#%Wmu&kXw`&7xuMTArHvg;%^ee6Xk}SW+a7!X=eH}mJp(fgT6IZ)h7KhZom{k zwh?H z)aM4*L4eg+|DiOUv?w{X!K=Jk`OS3IA$dsn*yY$`LyD6yD!Prdnb+Kz$ygFjLYvE>=`~H*W?!ZP z8)@&mCv9HSkm>pP5a3=`{&_{uv{UTTO_=vr9b%~zv#Qt{>lO=_*l!9sZlE_&qX62- zAm39y{v8CqwNEU=@yyF09Zs03>gD(%%y-{b6USIb9o&LrL|mBYXqbFt!jB@3Vz387`(NQ!>H}`*e~d(Zv~1Qt z662J6iFSPgSGIw{b2###25#1<$Q?(WRKMW5p56C!W_ARb-ReKx+yNHy#cnSH{>5yI zk)7yhRk+nT7HZ{>O zIvX_6HtOVZ0GDG#!P`Q{-V0LW!d%juvIetnMmP&|)x2Z;zR)_s*-w<{DUk%XhxIrR zU@l7G_gKh28%e9R8o%Wn3At=SzFpDds~Jp*_PD3uV7^njer%MRKgdu15H#mR z@ZQgG)0O^Nxp44`1#t1F&>%aL5Gu=*4u_caNdFH|a`ld_Y>oaHY#f+Ev6bTKSU=@= z&b&Rouc|6uVwZ*|KN~D9Woczc@2_kGW7^mEOCO{Xs@bs%tgl`5C$+Vm5ns}HX(zwV z=2D*Gt7$z0{X~3BIE7wgGEt~`0pI>?e;vH`cQ=W?J*=KoBFej|sUdNeI9HTxBNqr! zkQstzV%(u14*+t{P^OHN>A&(hF&s{xQy9_{t)I?R3X~;iEN@N|(cv$^eM!$r%c_Zp z4b9F){vMYT-D15$!#zb`Kad=!>?~j5i@%pDpwoi3HCxZIS9orgOt1mo%&nq7CVmU1 zx)NBr;6fsq`dUjqZ!tuI#XpVX1^J_%mmb3EpY`4cQLCr zELpaRxvLtyHlhLqoC&i*i(i2UuThW(>FyPhZ5{k`h1CM?U}2xMEXBd|m!AtJ5_qZ3 z?~T6=yb4i`{GJzg8S4fP?J~oQ+o3F?xv1{$yh`?miTFjn;g(p1X1G-=5PfBO1t3Z` z_h9|5ppju^*Uv+tjM2&6P%;>4Qb$feN0#Rxr?R}nfgQ)q3kFUgVDW zhdR?XS%${gzbj$IVdPw1g*v2hAk=+BYqRbWHF*>+chy)s%21ICh3qX7F23|##pM~p ze+qt6{-N`tjqmjE#SC7vq%Y&Omo_t@f|vTWuStJ=rgC3lD#UGU&VZzSn@_D^AM$OV z%A&B(uov_L3)VijZ1l;tFJ0$(3gzbgxq5u9{ae$9EL7fyMd!lf)20?xh%jlFX;NCP z$b0tsul?)EQ#PPXOt+P^kV^5nqO|Al1;dQB-vV&W+Ut%wqNT+)_mw`G*euZt&Z7f7 z;>Dy?`s@N$lMrvPnybQddfAp_Ntl`$RM?JyWj~L51Rf+e@b=NmflA{Rh=A_72+<~p zkYV{dMe$l#*;KKgLb(nZ*)Lp@PpUJ{4OF;}Fv|wwA-YvKJ<32bV*@l*NtlZ~v zceeHVPYbUL`WrriVfE2zM#k*9%LY3$#f1HBd4)=%Y=?|SY?1z0?SGKy^8zTn+JXM_ z$SkY7TBV5D+P74j0UbQTxW3v6`1QHKBVh9y$MW@*4z>f*!K{~FR})eiVnlGwrf86) z7~CDr{dN=Pp_R8=Ro60Hg@m+#-n+UA^^bGM(TT_3%sfT{&lGEWeD2Mg1suI&v)ndV zE#X(s!v-)nc#X=$_?5JsLG1?ip^NfVJ9v==1Ept2{$R~WoH9i%6nia+ zdXCqyVj%@ac=I1PBXbX<3O{a6boIv7)B$eAVV7_4F?Wld9+QAZ6CiXz?TPt9zAS+N zxkI#=JGZyQE*{WO(fV*oAfKm2#2>w6?-*@RLAp6$?)S}~v_%+x?|RnTTI*!a*lS@W zX&8P`#f^;kH^}Y5>y>s)6+Jlq_RR{JT@txj*7)xoPgb!}C3JNV0dE-k1 zlQ6^bZLuaiqy8$e;0ER0J|35PG;Q)%tXWxBfjdIP}(Qjqi4zyP|T zRo_?B-~#%3Lz|`cxmBAZ$ohDx_7eY6-v1l^Py??B%`ygt{!el{=p#!cWQleuHsS?~ z{bMdsDI#NE#LT&)Lx2^RXg&jpj3bXcIU^$LAwJ*V({~%yk&8Spp``(Te%ZY!^j@X&&EbL)xBTmeBl5{68%fEKe2x{$_*h@C#F?m|xGl|9XUn;P4jFWG6 zjh7|X*@&@X;aCjZY<`EC?wVX(%(pcQojPhc2erM*YP^A9NICFp6<67Jb>P9A2Tm94 zV!Te#2==160HT)!2%Jm4a`bMZfz~sdTfQ(^ioFFy=*g7l3fNUuPsM0zeNBiDhBu zF&0U$!#uTeTT(pcUM3iKZ%#fbON1CPq1>{6!V68Ss%Lm;4|TQSD+6*9&~gQ9)WN|8 z6lYHnHx8UsYYQMZaYG<;lKmqp^Bix3c$B$iVK^f}*c+=PJ?!H!kXrAg<)wV>PJ|T= zHT!5^=8gkBjrQPeB(|)nudSH|WBKhWm=n?ZGOLGb9rC=&PdA-+zJnlkjRpiOLQ>6Z z@+uxdFZ?t2(lEzkhPsmZRBDhI zmn4~YOYt5xeRjGYPDPCRQ%xFYHTA4C09;e`g;o7u*+#*V!s)GmVh%I&=Hkv&r$d`r z(+eaL(FjRvp!i(KBc+@r8u5Z*0;QhauFy?@?~_rl(f5uv_WL^0K@&#N{gpUJFuCq- zyKmM!f2}(&{vhnbg8ij)NNTikxyP@9(odzL?(07TgU$9z=~0)hbpD+)TU z1If&j1KyRGf%{?<&tCB2L+WxpdwYKpHiRzue^O$LqnGrdQ+I0jNZ$qU-a7xwJ3^80 z#sKF-(3op*!F9}mWyEd=1zfs!wFbJhx^qoiRJBA27x#*SI3?YVW6Xmy5ZV{wsAAR@6=v$1V&2MMw_V#en0K$f!Doc8r@8Zi0Jx|J&6 zKYHFv{Hs*;%=J=Q*nPr&=sZEtf)kSgvLKhHKGfDCHv4J}gY^wh$$(oP$bu79Rl(jj z^cys}?zR7FOLw7>VK$P&-{mS*VtFkwgkbk%i_jf4KvG>Va~Nh)OvxcW2^24gA#MB_${*{y+y#=o5FplCQb%&Mf$ zzhF%>0!FO%^ZNx@v?2O@qomvX2X>{X4;E)y_Iw`2uBx}6?vs#yyI{5O8h376V*Tr3 z6yahb1jv~r@FpYUur6hG`@NDgX!4^3Ivld!d*YGldHa1%jFJgghA~CUOB|ctN*HxK z!TOc;R3>2fvRN80-j94C3mJk_Opf#xm{RLyWBm4IsQJ5xl>QpCFpXaKg1CUsKv?YOCrToVW5*!?Nlb-GUneiv zX%z1ETbb3WknJ(PGftVq{n%2p8}2i=yze63TjZNhu~K4<=*;NH1X{!{lxVC}M6o>_ znaB+A7C>%!X!C!b!rzT^s1!=;QYJgR)7De2HS&@Qfb-~i>UF%nm5Yn!I9@R)(Ij** zPbSDZIR}f-Me$4fVnwGB@|ABpIYz1yM6Yx+7*%??C3VpLPbcOxUzh$I=m@!UL_zYv zcV0@#>@Y1Uy>^e>dL}feFZ*0*?JDcwjOlDfp?gRh0@LSBQYfYvjX%e(mEk>?s#V`2 zXtB5ie5j{_0MBnVn+;vATqqJws*F%5uu}hD>SH<%(Sy9fxs5p%aD+M91S>Ve*J2@y z!Rm>i6B#|_>n`XGl%SwB?up}qZvadWtFnS7OaZZD%hK-#zrRaBEMvVCXMA+}ez@n!UW6E%r1XPWz|>%UK6m9|mmnOeMT&q1ravNz|GFBo!$zf%<`pOu2X z(S`yKp!Iy`_$xaOOPDdn$Y$UVHZhpugcV1gm79Tl_Y9DX#gR6T=yLN06QMrD1Hl@0 zVmD?zmPnVane~nRE8lLpHpTr?3yYghN>T^014%M;6Yn~=VZ<5jQULqw?T|DUp8Wvp z&r?HVYY4J9O-(s%*>6VCHGb(rfCK^^dj}Ugysh87t8qNVsvNRROMxWhv0R;S7R;3&5Brg>mrzzxi; zO5wnsiPmOFoDQ=jqT>`shl26^|qtI5M8Sb zhO=v3U*0-WqO#K1fQmjQP$Yaf$+H|rAkuZTyjs6Tx3mt}tEDE!D1PRDO>< z9F+!4P~S+9{EOMjxk+>NVEwaB`f+IG^G9qE8&!Qv(P;sfedBlZ^xIs7@R$>LpzpQx zH^$!b+1^(%1+pjL>QH7cmc({|9~!q$Mr`S2ut-f;R9j6JfRf=0I{&x6bHgArG)$7` zA1udfW8*#(9_r@dgJlSW9peK|_iPE$apG)a8Nikeg;BSbGZRk(8 z&vAg-G`rT{3EFQ4d@c+jLn)5AL1h#uiwFa$bY3CT-gFVdJi@`tVR6naB+{jKmPK`P z=Nj7&zoNw6Fg%}RIhJ(-$>AjBN9L*;qZ1V+==%WNQv2R%5IzHaS1@j_;`mEJeME{U(O~SL0n{f z#AG2e8Le5CEA0-eIwosNZsAJW%#BLXW$*YEf^Ya5pxg3mdJsMEe&aHc4TXkfV*qXH zv2fGV!#b%U;%$q~P%e#o$}RqCgM5};=!k*0uW4m)x@qbm(uJdO1IYvDo?fx_^cW^1 zWJQm4h{^aPiLI6mgQpC47x0?+hxtC7OSV>cEf>$)IgFKXgo5OPHa4{Q1{D^>F=Vxb z?y3YCM2#&5iY8SjS8o5?$!#Iy^d%Ta*pss!wcIFJ_X-B-#P@Vg(M^=9Nqa0Ul?^KT z2>%``Z1#`LaK)xsYahob%LRwUuFrD9Q6TS638ZnT1$iIDpmTy`|FkP_^-I0PJmIej zziKPQek|9<6M5^5a~k+nTL&j)m^~Bn+&IbxH+(T(IP0aev_ttk^{{F)o)d{<6q8*X7T#na+NpWazF=pJG?70t zWC}b&78z_38QXf}s(For-~xV1FX&035F7wGgfGAtJJo;e6RzD?Z3M$w)`p8j-`dv7 zpi{7<1+K@$AD`@~K?Fw_9*-GYP27xtjVAX%ig@bG5yPpSSP6kMDQ6%ug1$9`GO6j| zUJ^iUNa-`y$2^WStrS_Hm1Vz!3Zn@$FiA(G6_d+;nNBr-#;X`cqY8`fKcl~+%DX#E z=<;)QvFL*tmYq1YFHWFXNZ|-ZdlB5*B>omYB(M`h(8Frw_u}iVLe=F!?PjuUy)|4r zrZR)ZhgX8jz0jE02qu-dnqmd@`T`UZ1{NZaONOia)9(}lyYtpT@HRS-EXo>Rz0%>`115~X_4Z0 z9D)wZj6U7IoKB5=f-UYM$w>SmN=Fb1P_f@Pc2h3`PT}a^#v?;WqA5s-; zBm--oqws}}UocW8su&-89k2{+d>&}-$K z9YqBy#Aqu1`60QT4ICtZJKqwIy(G`rVLIt5Fs_zv@NZbd1)L*l;c~#vPsj|Oo<_FT z64Fz~>4`5NuIj)Y3-*qP1sFPQ$3O%?iTMxnd|5znCHiuJRa1N@vvDKQ2>=ZO0>2Q`U9levkz#~4p^2$jvX=r*f(84`bO_^M> z1hZw%bcmpOd%t0`_~A^V_zJ1?r(XH#ilLknSC=a7WPftJ)HC;x2LL0VoI=kHA^A%F zAL$G_@048bW~4^`78%(Q(=e(y>Bnwr#exEj(y}M=jY^ z?3db}V4azd^@64^6egNZXm{C2;@r8|BTYpjJ*!)B{2R;PZ`-8yZzcwSl4cGdC6v`l zrfz6po@I#{USC76sdy54C{04V52dJF@1E?eKdzuZUz{ob08rFdy3Oy5agA)6U&p3R*g<^M{Dc3`*bCB-WM~L- z;O4-$>!&JEF+P2h{MTk8kRJsV`yQ%Bb#UaXZ@H7JT^ z>mth#i669t`U3Crj?DYGi_1*b7iFYvV{G3p3xPj}PnO*#Mg_J>Rn9G{$#4NwGWf<; ze5Prd{$Rx6LXvaIE(CVidlUm)wi0)9@061=ii%n@yWel+?wy||hmU-?_7;QMnVRp? zVbP^wc#%$r6W_??+wbd>6vYnjVzoy{5@|XTO}wB`fp*oXS#kO?wpGu#eXmb4jTCaI zQ{YrPBtaB@teCEpRBr1&C2;a8z16tg{CH@AZwo3$hvAZmUMboDS|ezh5bt`aso{n0 zC|M}iglUO%sWz7r=g5K`CTqMO*T z6un_%*~JZjy@5JfwD63AS4~G;RxN(do;(m8gWUyj*@2AngDe{kUy=${3=tU>nY(2V z$uv$9VQY!!p~_`RpSANvR=jTRb85}Lpo~P-N9*@!s{9pQcjr(MwuwONrWxr|Yf1qM z`s0P94}snR==ThKok=L#R$r}rP~XZvbiYwMqAt3XlX7knZBH(Nb1ltk8n&3L1dz40 z(s~ZJ*c{`dBm`E>y^yrI~J7-452N=s-d}6pnz4Poh#Mja(`qS z%V~vx?)d2ILrpn^Vezl)s8o-MMn@)#0+F%pP8KT7&!l03`e3{He3kqSF_zST;ZI9v z4N|Ck7@}CccNW;D41`qe)5h}3A3gTkGAya7<(@&C7T7KbO%16hGl;+^Um1f{YCM(U z>N>$RN5uWb{dzDwDyp}2JvTpF4>v`W+@Z?2Fk4A!x*Y)cTGBxHoN4S^ZxH`AB2qyK zmAMEDD^z|M#8a9Euzj6o=6~~3=-}NpR}{!E&PYM*TjwSvS@?Iv7Mu)`5bI9WVU;t7iQiFgYWafF9 zdN7C$OVn8+O1Dxf14yB@mcFf^ukVXhmMyxo4G>U~vX`DlfcQD=i-l{JP3ib|WKzJY zXWR}5Hp^vS+q;f;T(kW4s=7`9q-;h}3`rM&MXi;%409dkqUok$acc7I#SmG$8#ELa zYmsL{Q8sqY;U%s3d`(x40oCvRQ0kMU3V8-a8`O|moWZe5ly~pX&!>Vu-KpByN1}uG zhCCu?bVb%l0*&@)q~EUK$z44M075TGs`#xgR_%)JpV9`);|Up;g2;iI)+L6dk>-`# zjnT0JF#?@d>kwWCKNK9(AB%6VLbG68hx?s>WV6AQ61rt$#*;_j=6yEwjl&R#Fv?qK z;Y{$P6@}G#v?`COvWH9s>`!d(mtoG>yvNIj{I#eBPh@=OYbG|#v_*}s)a8o;^YjV! zqA|*6Q~hH;J95+5ywcSfATET6Lt-~jLcwOHKPehTJ}SAyhG?8njF*3C0S3?n=;+lK zR5y6_+z01~1{jDD5EL}P96%hCTOBlR7n1gf1XZMi+M@d!d&P&wxbt&WFoe2l|9`y3 zzPJD`1*Xz#-I}jwp9&QSF#VuHvy$&3q-_pgQ0uWR2Sqkl|9D4u&vAx!PVQ?GnRL65 z7OA*8o`(p1$iQ)Xy}a@=)5N4FdIy;U{|YTRAU^2j9%Lom4}tOfx9ddYw$ei{K+$M= zPi7+vSEBQNpGlG92-x)|V3u)lFp370Q^w#ZF++!3;X3{Qb)O9R!DnE5u+f;m5C(an zU&J8lMTPi%nu7PW=Qf?MUQJ#7XJN<(Vm6N76U8DkbHOa9Nrw0#OwNbiHv1_Rd&N`I z4~xfrjoZc=oc`diq1EM8Mab|C&6QVr{y%RK+P(x|ob7iI;SG?{YV|ErSxjE5F?=Is zlJ^@1`Dq0x6&I7%&=Od@WtnHR&Y5GEGA7%49<@k3f!!Hg(|I;qEAR)LBdcnFR{Y&U zdAPek#QfK(4Swct@_bvIe+w6HW|xBq;c`?}s1x}3ZL%q>`r+)|yLc1LhH_id+F`f@ zJ23|t7r*Pr5D(GJ7{=WmFPa7JV?53ljfZEKG5ca(f-KK=p#C~5A2 z_3%1McyoX~nA{!MZM#W7R7JrCjrhd?EyZiE8L;dn)e}?;DqJG;pb(uP- z0SN~*+9Rxfj9^x(5>!fpy5^aheYgb0SscE2?u5BbL@J&7|1RU+Jr6bTi6TUmY7N`Bqqsb#>v1$ zqj8C+@?y!T~P5 zlea(oT!|Vy;qh2j3H5*)@RrCFUHm}m%l=N#85guW4@zC0F)9Go15dkBOhR4JwAY`; zP}t`;Gp~)^)+@LbD}?XRQ<8)(Ai?*HH@5#1XXcv-T=T%)O1(sMb5u64=%k>9>&@R2 zY$8Aa>r8jvo|%_k!A(8a<1OnuX@iwv$HDespwH057mAK+x56EWziSiJBV`Z5Ze5DX zD?_1R7iQoea;lNbzO_*P&fu+H=C7N4a7HLaFpkgth(}es0pR#8Bm(c?Z|*j%cHt=T zc)(v>W&9(64GRO%Qa{gzJ9fGmwPe4Yg(-~SUw9_*jIei; zT~0fqRR&Ums@h%2aGwnHQvNpO_%SdESeRKM6j#TYo^Q7JRCnnqNHI~Di4DXuQW2pd zuoHY-N#@(QU$Gi|bNy?Pvq59(uV)R=gf3gHE1gL84jIBd0P3TQnCOaJ8l4Mjiu^zy zQuLu&?ze2w5#~{?C>##lWJy$`3jQ;zlqOh_HP_#*^ zvg)CM0(AvQ=DwGr7}K|y5xv0B@;Nc+Y8_h+Xj*=!lS* z>lVbsM&eff4o9GvVV~;iLzh*zu>MVn_Moe&dgujpli1F+Z)F?A>Zd@-y<_a(&tjN& z#kRQ4G4ewVoi1-ObF=LH{rvoQ$N0+Km+sA;E@+}#Al1gbl{Ww+X~unj1MItQ#E^c) z%VH-z+GRl-ngUKW`)NG-HiN=jBzok4tLxCXq?IpNZf^o;$63;PxQuVvGK5okq6U`J$(_mgSOE5N@%5FMC1y-QNBphIcI<6z3ScUNswrq7e;ySC)lL;(Hcnnp7 zzy568#nmcHFyv>t&`{B7dF!aa67QaTJ&8i-{iLRa$yCNNpCXt>jU zjN{PnT3q9Eznrl@$X=$(6g@BHcBX4r0Yyr!mW1|xb7JR084d7VD>2WEdU0rGYM4VS>^NW{dy*hYTz z!~U*xs7h&D{=L`yru}>>?(OiOudfbTnDW|aCB8nW`@A)fX&0kav@!ZJe#KGJvnf!()h^%uBDf#VynL|7NWJb>PRYT;CrX`iJ&fE_PuXX{b^B!VIM9WCE?;$TKz#lxd}9V`-aCUlM!m;1m%+k?K zFrd?Vsia#m7uvpxwq;dxp7fCR=}Ujks(AgOr|6tI!ad;an4k%`oA9n+r7El5sO{*- z7Rwz}lnv4~GMI!2Zs7rfJrC@r>#oSFSU2T65fZ%bAG~JlcU(b2R7`vr`KZ$?bTlxP z&*bbhN{6a?kB$fKd}p9{?4yBwBR+mwC)KDD3P2#I9H8=l$fZvg8ZREfjgh5MkVgMm zCd-?dT`mB$N0f&R-V#V+nVe2;E*(bbMz#3iY;;oKIo{JTftA2oPHxS8bXO+dCLrrQhoq(5HQQiJ zyMT>B*0ia?E>y(>O-ut=Bb&JeBR-W{e-M~CC+H*k6&m4bvfQh|ha2g^zmJ}ld)A&@ zvQy{n#u(q>2=7m;2nA!$1Log)6zTI}=h|UUL_heaSp>L?TA_V~f1JH7cIayx!2z>dWQNR7;J$Slfab&u>QSfx zyV%e9RbFuCq?RF*A?=MU(+44)u9V{lO`Vyv)J^~_imr1xl7L4$9qNaa0h(tq`8)bj z$1=Uk(_&m8fli< zC~C?MI6@OQX`jp}M|!qE&!3$fX-$?N*C}`m!?*a0FG3(HnTrsD{~oDCUg%;t*GJG> z!f{YK#?Z$yEt;I9aZy(`Qn#ICe{hMW`w5+E`yjXtr}S`!upZ}$eBAOdbkP!9(C2qI zrspe8|H`*{Dp{ukM^}$Ndy@@%P|Lh(tL(p4!tRjxZ`|8U=o4EqWm!%TeYu6YOh~BF zFW!o%be&XNBlo8)$%RQ7s21>cq=uAb8Gdv3Y%;ZwVYzBX8ks2ORE)VP`V3fhplc&4 z7j|P6l`yyA!Emu%%>@n@$SnLdIgxJQ{7!#c`6&3RKiqT|;iCt?M6~?F&b(pNzdGdM zGt^N_ne|V=d*#x`h4V+y)emnrr8~ye;5)5B#-lq;) zCke1qT-Nr9^2P@)SX6e&llg7zD+e8UE+8orlV4xk1MiVXs{+eMr?p=ZV0)a(wi6vG zIRGwm7fB*l_S{|<7qD@Z?M+nr606+PLQCQ+kG+U%uF!1rAi3-gd?Be_r8L;L0pLk! z^N)#+%moG8kM#8|n?pMOf%alzL0OJZY!CCOO=X>cCyCae4Z()}n*L=xOg1RGap-^{ zu3TGD0J|I1hc*2>5Sa7Q{#vGb^y!sxqSo5gT^wzC4`ZXmNRZ`NtK)Vom!PUQ(tMdZ zj^U9*@HwEyQL&>n4hRDP6mI0Z4|`SF@nvxDAkE&+ZTXK67w$sY*U%8q<6(*m^c=pR zL$}cy_qafsJZ%b;-_q!ks0ceWWck{)GL~(@nR>UwDN%V~#VKnb;Z>HbK&6(vf^U9< z5`30z!SI5XmE3ilDm6%4p@J*kOgAst2iSP9DLX!4Xm%Wk2MM%~=5OxDt$B!Pf^aB< z8c^u`+EgXdF=XicQ61kK=T@b0{TQ z>#^|dt_ajlKPRw97$yvNG)6MT0E^CaK-khW^mws|ell>EJuxU*)2O}iH?Rkf^toL| ze|S*lGYi3k&^%T_vaGM(k{8LQrKR8NE8k!=3D)1%wwz`pZl^S!?cBl z_L3CQoo_&EipSP=h;NwVvEMNK2>W^E%|PAb{g6H2JR-5(c4{QGLcPomm5}XYUFBcw zPdylzUeWb2!=dq}#tb;?`M!Co-W0YEU{KfR>?#Zx+C5w^NV0PqAVJ?|-bwe%OZG57 zrfJ&O_23i(_~uC(Hvr}Ij8jh0^l_AU38tDTNS&{u4P9E^>rvv#4jQbQ0<@Az-<%1t zrRiJwVp3^w0e874p3Rm7nY@^8 zvV$X(52bPQY${TNSL^uFgp-!bjer4-1&RPghXHhZjDa&#V7<^kJNF)ac5-8nQduH0 zUk@A>Q7hepwc_0d4>xrzWMSGR0o;h%jgjf&A~>I&VJ6hs@QD_@;~*(R*Ob7zg!u-l zC}*F~Z_Pd&?%K*BYnMq3bq^pMz=FV^4#S5$*uU65rqdfS_6Bqv@9m()$$%2QOQsgw zfx2H+g3#x>@iy3mcACkG+K&V2HNh#d6A53>ZWTRN9xlXD63NKAa}~2oLIrnb(G^M7 zL3-Yy9LeL_Lcl~@OQN;~ysQ^nOF?0%T?H$@X|RdTm^X(NJG6SP7!F+Cdc?KXRBu$c`VmaDY~z|blh zVWEZW(kd1V0)?bCW;q}hp}r;q2_HKEuNd%~E4#mDluO>U3(3%e^v)m6i+rm|(C;30 zff4|tAQr!ji?HSA@K(14Ao~wYM}!?US8bq4_%hBC0eqisk5P9)Z%1A`Ld1kjQj;vr zIH%CY__}%k&!Wu?%jMecZQd~YN1D^m3dzM9B)+uR&srnN^~!|&)n!S8EHjh+5}16S zWl6hOOl!AFpQ&v8LXyFS?&|y)ApQ zAAb+pi1tW8kug`$~4sR#%)Y+I$ni8Z(t3dLp^o^qB(ds?Na=s{LPYDv}; zr2Zz0Y>j%}pviDJ&HRvkro59eP(?7{zWp+MKy`so*9K64+w#|BX8E&iHyeQNNuLd5 zG@#5PVl`{J$`k~|vi03u?EZol;3)fpyC^T&>vhVd8}b_j=zOiyu(>?A&`&z%feffq zxLRl1saHI7SZ+GbefK$FBBX8W`0)EugicP;u)O4+lU@|YUuv?~=V8(?!JFRLPI;mJ zCUhkDxq(*@oj1>n@TOD5>cpqs8kPiixsyALh$!D8tpnl`+}}Pla7pta%3G&X-oTZt zyb(ugFwLFu>E|S>yCj)T{k;DVc;TCcWJ|e93QNpNGALltbK$IVO;aMcv;HT9`>0E{PATNr(%AUDwwkzeYN^*S^!hIs!%NFEW6Cl8wk=U5dx>gr4=*xxK_PaSIcMyPb~_Qi5b~$i^XJ zxoyfW$dweX@;pb``f@K)>da&a4s!8;00Q1WVWOOM+JfLY`33&M1;UCZ+urtA!BySDYN;ly?Z|58_~4#17pr6*xhq5osSH zCh_N4K>j$6^fjYPS6-ixSR|(%3M6DT5m|FFG1np`r3sdbI+lV(%woBoN`p6ndQLQT zo+aZwkGpaMM46AyOiV1kTAuugdj`4kD2sA7AGqvijT^c&ceZ~SS)s=qdPoN`BwXy%9D`{#wd0qzF%w()n=N+t^I9)-JZ@++`wPB9h74DKUB=e~UZ zOZc$SPep`Thxb30v~oPCj&uHh#oc*!%@D*@K@bB257Xuh`cQQXP^XI^Jxg#V>nuMS zT7f5cqJ6iv*pZSRz~9uVb>=Z6y}pZCcW8Qn*>!+zsUcC8AbE++23&?jPyT1dzvN30 zvf7FGYH%x|>Ai*1HAUFkCo6BqX&pVrEvRD?K|Pm*EHqAyG*7m7{N5dCt4XfbRpXcw zm25f5@60ej#BC&+ykF!+8cegg+UJ`K6Nhoh$sn0Z92@^@lWr><-$~Gxu#k08iOgU1 zu|ZdllOw;F@+>=T0?hFBXO0uCL;TzehE}i*vxZvni7WYE({D9nGT#nF6hhYeY+V{~5Io2vP`7>K>xb^>tgsKe6iCA-l3105niSS)j8`XyFJ4`9|XA{Sgt(EFvH zOi;C`x8$eWj=rRHLe)-;TeAtzn4h+w4l-7yvvsP$m1is~y;vq-N(t+3llw-at0H+f zNSqtmI=qx9^@=F01~L}(16(vve;M27M6w z5sINZ9m6eDz~k;-62zWNm`BLC?hY|jed)vugZf|QRY{cyaedqF{q9)+6>TEm4X=M=!4!=h6@@5AY~y%Euf8T+t3-7f8A9#Hfe9s@SIM@ zTDwO6qC*=*PH8xCpoHBKleriRRDyhVGA0uuZ$)8%q`b3rd#G94c@25M0!c#$?QZCb zj9CrQ|8?QKu}?Pl!(5TvhbpgLKRLJ&!fPUZ5BDjMrxJ0la_ChN%NQ&B0G@$BeY28a z{FTv{hLknHbuWAVpr&9m52p{Mwr}3BEQf#5&}76Yy)mMVi*wT7cE6_^Z6G;if-55E zb!2p?yw<1UA{hoxU^tzaYHuwRxRFhRw?$2hSZ{gLf(oL4Wi=RA7&1md<)$kcS-P5@{_&Zy_?xsg8% zv)UZS@Ia^WA~ra=S1@&LjPoXs>yI6&g9LQ|MCyvEHM$!Bh!Ot4GB)lpcHk7Ffs1hx zirT6RIg9O(yTR=?dSP$&1a7^%zAq1+;|~#Di~M{!GAd{i5fgvWOCaPgOz`SRf3+Mb zvu#lWVlH$d%UsxRSh#osx0#?cTb$I4+rG5sn)Dy7jfOJDS`sN`ayj~A1*Lkze0TcjLTAfzL6zb%%3X@Z%F5nVbS zm&<#5MWojb@~a?8B&R)adKG;jvNFr_WL$sV!TzGV1it+Br3qUiS)swBvqBgfseP(} ze&9p8uhEyRaa-;L2^Jh&#FxmY3aXeq4bpP9%kL>wso52g7X9xFqIV}Wn zU8X(nEKW@-|Vtz3O;rmyey*3XxvP~I}bv3><;QsS%@T+DcEWL zI)on|uJ@2ikBK`SHSLFGapB{_IZ?N}eE0tx_ZU`Hi7?LEV*^41GTt`F>4UwUaG((z zGs)Skykx-i_K-o5dpV<@_f!Vdw=u>tf}`kZuK^0gk^J$Q17*te0`iJbeE8i!w ze>TsLI~pLPus7XC_M}%?Ki!=te_PUy4jF$-hO&d-i0A+-7Jq$;;K{ zkEBAgtUB0&FQV9v-t48)t$d{pH3F_&af#U0DuZNMt*22DB$&X59WwRtEOO6F8T{`v zW1H{<%h`2``g%)WUmy87N35RlW;>>`>Sppe!M3(Yl6b#|2LO#P7s(!1!bv?xVX9)s z`KLem=dMmq{UF+3{?K-dQ7c^*$>3l%Mw7hsh83Bu-vz{?03!+Sw4djBu~lG|1uZRd z22E8)`6y&HFRzfQ{nUiIRkos)DJOzH;P#ElCL-nyrKajXoiVAH{Qw8dmby0KtJ9vN z2LjIc;bhu(;~o!Q28`kY&JQ?-#U*XBn6L*z9UQ;)7Rb8xMLhy+#03!`FJ>+irCT1= zXK^3_&{TipMq=#|(?qX`#9y_k(Vn!>#8I-X*ve`m3Gds`Je**g$^?W5>|NJDbRPLA)Nh&rfKT$|L<; znx7;SgJa;>ZB!8L=vSoDYQo4s8x4yJLTHTiy<_@ zjnZK&yZ$RI+EVfTro=tGQ^Yt}j40*CK^nR)CUlHfxx7*Hp5z^qf+K^D=NofNmv%{g zNo!dd97NlP)Cj69EmSG5V#%k1-J}arbh!NHWqxlSV_Jnzt-M@r;<{8!59fGoWQa`# zf)yx^qugU&jFR)i-LBz=M5j+VokrOxwy1d4vEbfUdm!BpILfYesteYI&U3H@s+T6G5--sNuK zxa~+J(Y_kX2Iu#Sk&TpWM?YZ)Ca;Sc(QJe@HsSXq8%oe0tmKXoI2cymWGYZkqdtx@F9$2{Cb!s^n{}`fV;Z%K{gN~@# zx=yY4uS3m79pCdT)vY?>HPWAUiqSMX&srYDi6ljxcc~CEQg3>OKqi8oIz!u z5E4DAY^;vWem+yk#s`@7RERI%o&e`cRGS`ybye}t6e2r7;C0Pcr`)iMR-cd)YEZ+0~!VQfA~u<&OPap&C= zVvCx>$Gv`x4|<>Chs~8%(|&p`W{XnS-WiyH(?1}x}xat|s$X{vpNfcM) z>V|(o)XeWGT6Mx&ZVj5JkW2A4R?*}*0>#Ala2eb<>K)`LtaWQp%-m)X zY({Yf*dm)}5$}?41wEC68tZ7|7n96ag|#ir74sYru$*p9}L`sdM2^magtt#xI0#;&XkwqNV>XJdfrFpp8wQ;#DFyCB9p~MDYFrWKw|c z$>kfv_bnw_75a8#PH#|S*N`}}d(d9jT4HNM9p6rkjbWcz`dn| zTBY|94wNFIzEmI?``W)J=(tJ3HwCOKk=5qu!WHGm#TN|Irfhpi&wH3N4JNpjXTs%e z2~zG3fo*JJNAzh5+Vz+q$XGNXYtbF6=+%8CDCPnn_2we{@)VT8*2!-qHI3dDtDk>1 zvMZho!ZI7SnyNHe*q`Ofu_E$MXQR-OR@DmO*I8~MUCH67Y4h}$UQb|K z`OD#h+!A>yQe~YE6UpQlX=PKyiHwZ*(+&Jw1#bk7dfEn{C892N2X@(Qnr&>)B$)kO z)JL>MrVWS(WGYb84-P)->wI_O4{x~xZ~>8!B)$BS)6s}?d*7h$8$C7Sc(SO#R{W=L z^u;PxFTXHCy1f9`Cs%ZA``s8C2SZ&jZvot#W-MY)Qb#<_wBq`L$@Ot!D>}s=>1z;Z zGaH)BK`>{J$P6@(R6hqN4{5C7F%mtBhaur!F(()MMm}Sy_Cdoa442hpMFJES= z3Tk_N7KO8}*7+*Guz0BPI5F5A( zx)xnAl4A5tr0QPuYQO~Z7(oOwXfF!oPSV8ONlj&HS&4nXhSkrjy0;9{D|uplR8kAT zzE(=fwhzMnmrgCaQUSE>{aY45f8;9>eo6X`y&&psM8L7-1_G zm&Ky9S3z#1f8mlRISxU6w~L`7>hlKXL!oYC3`%6CT& zZ`EWGzc~L7n7&0+-9#(m<7w4+!N6(2l;S`F}FU#yEzjklcSLmiQfmSJ)irC=a zk(P9D3S4si&u`ctStGkHf>dLM`c@MvfiyFFxJGb{x#>&PME6iavO;TGxt`L>X1><{ zR-Gr$b_}NyFOy@~qkga;bLitO7tLbQ28PgIkn=`ZH46UHl|oB1vIv=1=ZF$9`^b3P zge~xjAO8(ftn;LLEe8Sh_NK^BojKZ`n^bt?osSrWn`dwH|50OYyR|LQ-vpgx3BolRaSAZz zw;8+dp}ZD*s!)0Dh2q}hkvj9=wJ)8WL7pcajA=H?#eh780)8)I=wD$Hx-9E29Y}vL zOf0x86_I07Pl@0!#KC?mN_NCGh$Jn3OA&~oTdE+)pk922E#!^g;pr_M*TCvBNIwCx6*XB_<&mShbh<~oEnk+wnqD(@_*zm zx3PC-V3R|= zJaP4H0pLy&3XnEbR1Y)2`c&a>Rnh5o5G+y@-^$S(d&a=++q0hW23xnJOj_NZzGz$e zlFeJPscpPv;vzj(zzZ@I!;lT2TRRYEmbh(&+n4wr;fW45kUmBhF31Oz_3|gIYNDbQd-jNDF^z~`^c2)jUd_yB z1j6^53NoLfU8RLPS{-%T#P>=R6Fi6PK{9AiFPBf7%mCc;2nks10At=U{Nf%9c+w%+ z6%Ot~bp&3ABli^$tlz?&T+@&HVE?XP>3eP^OJWnVxw^(}%cmg}6$-A0jVAOCC6`@x zq+&n->M|q1LFl)l(7J zO0egtu+7I$QLEKO0Mgz-k{@PRM~Qan)KOS$-1Wj@n9J7j)|B&@dZ!~#X+}O;oTKBm zZUlRt9hqbcB%BaJfKs!AuN0oe#iIGU_FL5dj<%#$nutD8r-m6kd6{*H*Li>xSP5eK zr@2-cgA|pT)ty0)mvve5%8fqh&C`4+rP?>jBDKSB@L4`(<6lZhXl(b=t7_cQiF3f( z5Z+nH&{Wwq1ew)$+}(kza)nM9ZoIu%uM7tVknG5>pvVr*Tit8p&GP?X?6qE?q*J@Z zwBAG&yfUbB69bt z0Grh=>f2n71KILnU4>voo10dk*PZyOZ?dhJi{4(nsBR?GIE5=o0`i>vTlP(oK+2WZ zQrr`_&&Dr{5Hb?87h@u5@reSXD!JG!78M3KYBC1jWS;L99GrKh4IPvmjwMAn5uQj! z91wXyL~MV!Wl{L!2ZOu9zl)(#jBRNX8jbUA$saoDwx$RDFwK=;#<);YSz3A@+fh!9 zM|nZyWe`kf3CZxi#J#Ih2YI0h&pbI7=8*~rv9yZ+i!cNo*1u5^B5dBewho3RvjJ$- z1l2%U_>NNxLj8~8Q{(0*8KWoXc=bOVm3PCzrOZt`^;PzlCg;wPc&bRXvLNld1~{6hU>A#7<537l2ki0*Y$FB8;=vQ<5J~H`MX`^6KhDXt z!V}NQ2W;9gJl;02={tPlyZ;rt%fVus}TcCzYSWBHYQ1*P=62=I}Nz*n0 zlhV#%_R+^f4zmiuN|T*zxAusL$XM`h&0u^R{`5K1#Xpgk{EDY%7|F&>A+{5eMQrVL z0k|!?HYIAYAZc31Nd9$i(waCCX>jAXfa;xTvGipjSu*Gl8$#IT;DQWYskTj&%kpzg z>nqJHM>4P`j4_M3*FHrSfwFAUnMgDxHDu~ZX&z%St1b=xh&_s>4SDrX$T&0u(xhAa zYLcwv@fX*zqF_|_;`BY}6aPH%ZgCjMbLTjhw|>RVPq+2gC@!n0ohsjho^@t*+Oi<< z&+nn%o<6hC06Rd$zkX07%a&p_j0=^~&NpcT*u6tTN=Ua)NZa_>Wn zt7wD5-UoQA^E?wSVe=N|FTp}|V&P{GAHjjgLZp0S=#X`BnJm~uSl+KS(tmSz_ zYVg`S?m-oCGKnUlXC0X{ZE<;ktD;|{4OVr_tkpBwbNZL~`5`Gj;S-!zUm9nf#3>es z!T2Zba1s%1EVMBYJ>jB!4S&tj@Bxyvyoyjk2FAUet$!f0(P!JxPpW8FQm!_B>tdu9&8h^ zfdgLpcs!g=VSOHCfi23bTc@kXSK%Q`xCgjWQ8*+2_z7egQT!S|SpS4Qq<+IeOcO zJ3`xS!UAfA%5MU8LHRk_j$2*YsvMDKzBCu;54kA)ar9 zZwyi+EzsTU4HU;EHwFHUFeUJ<`5;Y9-isVLH0NQg)w0v)1wRyypPzQtECHOVUm7YD zZ4#-{H!(lwZ9tg=at-j*=j+Tsn4Xp|ej z4I;#-0Qb?2Wf|61W0GE07B6gDRp+mbt*miE29H@W((LB;Bg5~fb9yH*z}XFPFfRLt zahyH`98a#rkzj}$h*B|hT2}2!Lm#*r8oZ5%osVri5BHC=xaDd}U7As!Ub3c6T=Cox zXE2ApcAVon&}93t0`ahlRhuV|gljmO&B`iNT#>w)7#OIf(K4EI=ytPyy)1v8c+67} z=nr9)SN(JT_D+{1_TvRjpgLiYLw#9T&Rt+Q)>-NDaeXi2|L2^#h5<5*Fg%t|_UWbl zrNh~loDB3W><`HBS`zzN%`UKpO)B)q)N)>VDy)|O1j5v%kmrLdOTq=gn*W9y1a3oV z1T>N@aiA<_>B_1zTC@sXghbDp%YUcrwZ9a4%v)C78>w&7oCuC{D6au^5@XSclr|r!0eR1i=|+BGBjJhqJXaC` ztRR+^4xwJ5@HD{Z&S^sj5bj=V@8fVh1UBg;pL7q+55UVlS`_iE!F}rRZWs$wtcm#j zdxzxyQxS(?)ykez7->I$ZaHcWa<*!f0ye({V5KU2njm$ToK8udaEFEm-dq2Qc!MMu z#Hf3gSm`Xs{Wbc*&u{un$P;UXh|1CV2}SPKK`aZ&LWLVgbX@Cy8`Ob6hN7>XAJ2NaOu+zn^9$Rw;@UXna52Cj#o~h6aJAQY`K>Ew1bJxyTu#UBT$nE@ES@nVEBP z(oWpTQh+G>p`%9WzOO~b3Yi^ZLU(+l`_dUX9dXcvgKiVp{Ej(M6`t2cLIERo)pam7 z$$5(!SN}_iUrY_ELY`Pee&LNOV7n9C1?DKuN-2-p4DY2fo^R4SY+K~Nfty%NZOf=a zibU{7fnM~V%WL5)yD6GLUj+QhkFkw*TTs4N08h&5b@7R`3Yhg!DE_G;+O{;tyZnqg zI#fQl;-F3LH%`^o2d;5CL1q0Zp+~|4>U#N^dx>=y2aRbj0qtW=lGdD--vF^Xr;(mH zF&op9qqDbk3wo2U$PC2p2|6qw6*gzS457K7pIVq5!74J#b7#?_SgMEl-#2s9PwF%Nd+$G2iw1-HQNt1Cq=~6IkOQ zZJ7a-E1Xf3DFm}h>H;0%sJ(>>{Mhn?h`tw=Az5gPggi$ZU1e=g&$+t*=bFurG`5YC z@m@pQ3_O9d5%c|K^Nv6(60$u^cUP8cGxbkW^vy?0%Z`n<%S-s6rkdqP392GpWp9P@20gw_sH2`FsnNkzO z3Owp^BDlx>Z=z!I6b~_!tlFxuAxM4X>a_ z)k^WBOF9`4KUuCsIv?syHRe}n7nNkgQ8_XEI~3cVoA&Pv!s3oezAc*?*O7v4ksrhM zCJHt)wK-KxRZm+PA=Q}T<{Repy}vtqKqy{6?~r<8gNk&TU*)f()n=!Y5GMN#et33P zVS9=?E+s8#4*{G9S|r$_N8Rt+<~o@qLAj!1KK5*4E!h@@Yj@*rX}in_9tdiNnuG6jk7(@PQ$3&r-QZ02&q8B4K3>Bl2!yj=7um|c_;OgTRR#~*B=wV zWf`_o7rz^QyB|nhznZF_tWWo@WOb3*_guxvtq$39z_^qHIogBYnyzBZd_T_Efgw=p z_5WXbSA^+Snl{}eRrEAZYtUaM9u$}c1|h-U1C-aMY!X!5q=UGQu3)a_DL0H?Rf*98 za#}AK9P#*4=q8P%2?{je)mK)lQLG2HuHl`_nh!1_ABi6PZoTJ0_>A8|*{og6qB9GS zeLw(SJ&SJpOfb}dtWhg)7$~Gj|3DHP=aY~Z#NB|$I(UP{?o-Ay6CtBL!2%}G8CS}t zI7@sAh@%Z?q%b*VOiijiv#I0JxC;_MR9jMuw~26|T_?z7Qj?Z?*=7)vs3RP9f9JoiyBSMbMl{wslR>zX*K4}D zRrly%%hAJ2Ak}LJp0MxiXyOP>+l{u|exM*vh-+K!&(SZx)tO>kaOADL3L@L&&HLyv zi=kk2)`I1U&$pA5*hz1DYYA#SO{Vf^L8@Xv>8=oJhoS)E)v)^=ReW^;70llx)!4U6 z>?=Y&YW*r_Q6+%MsHj2C&c7Q-eIS#T8Dr;qb~-<*jp#3lp>`lkLL*|ZB)4%Q_s(6( zUC7@0f8v%WqISy!=>Q$mM&|Z{E`}(V6wf6=*`Y0i4kLug?)6`eDU=e|Xd)iouR)Fluxy zTL%ScVfEYwgad)!is#1SKB9Qhk{0=!XTIb&(cDG3i3v0?{xX*vLd{LJklc5cyrvIW z1`i%s#($T>&z1b~X%#m`2X#fmrC*t@-sZ^{PFddl%ER_n^}8h~5-?`Yq4TtU4{ z<;o1l)Z`*oV^-8&tb|+LL1|y%rCO+}iTS)5uAa#~F41vY=-IymoQ1r_u%mOs&0B~D z1+MhPyKo1g;bZpjei?_oSgw*=V7*to_?Ntd#8PN=RYT9r_k<}U_pTl}L}wf@Ox=*9 zh!B}3-L(h0f|z)2bew&Ah@NgKdpkds)#Nw8xH4>%m*)BR90GRr%JlqPf>o>fd`nnF zO0)!EIRxk^WWak(soGpXnQOCHOlR@={FlCq z5gGqNzXGW&Vu<=obD%bjX-HBVumAqV-097}sD9XX(>EqQ3B|g(2MKT|Wr*@RuCL(8@Hn*ofp#anigh<#=2-Q} zN-}Y30@<|(fu~mu+_Sa6<`BnCpmckU>Qs(=+U$@OwK|LpyY67F*}@aJ>jWH#!2H+f zZ~j<#APqk(_Se21?)uiAxsgU18pDa65bq}?-M8`lee1xoKc;%69KfGXb^rA7YLikHZ#8TWU#gCyA&|Fs{H!}lgri44 z7t}#%=q6@k;^4@NUdPm%6M8i246BjENZ1@gjkd}{kmo7RiFGS?1@mg6>cX+2Oopna zPZ`>YXtn_<2(eq)xhs$5{g~zIu@qr%G(y1jhZ92enS7LSvx|Jq^J9-`f05 zhYf&};h|R>tYzz1XE905*z-~dNCuo>i}xTJslEi+uq8DTfvpNn6DOnmVe!4Ebn5r- zZg1>L6c=Lc#&8PZG}{-d*M*mC7>EEqMK-*y9-WPOJ9$pw%ptzVXu$N3e3R*1J87gU9NJSq`Kt!E|5dGXr#_)sl zaBW1e$GM;4O8dl3T?s;i+NAKG$`?QTnS=>tOWLW17<%i3ia#-@UlqC`x}L~t2Yt89 zub#vP>c-Txy*-m7Zd)x}G7!VLM>B2mFkxb1)N@u=ywU3b&cw^sNvq00ODZx#9BWfi zw&@DtkNUEhbuS{qSGa9Tdi$#>!iYtNx*P8!S9ecBb1XNFj1l)+_xon;w_!LhQ>cFpRNJ3h&0f*Kp_TES{ zZo}w_N*mg0!q1Lc7O_O+QkZw9QO5Jos_R=_f6GuQ({eG%%+hPck_6O*lnja~unY!x z;x2qsUGAoL>=9`IRl|sHnCW?84!%y+ z*39j<2JDxS(0yeEPRIa$cZaP$dWs>%mNI)^pu=jHd|B<$2cimCuF92 zUvp00STaEkdGOqm@Y#b`Q(6qh>_8d$*Ep=Ic|XV#*n>yBlmRK1kW)Mdg3sM^iQkRu zhzv6sr763N>O`0@M8PFlu!opi}<<84xF*1Qq)GX=TI#QeV|@y0@tA-<2nW)e|}gS0*QgAV*7g9Y%|lNmw<3if8~*U5i~O zDps2%a(pO3N76qu1a{mNjcfFl$T!ikr!H583VsjL(yVV%2Fj^jk{T z6DhtPw4ye;j0(3g7Y|1YoNP*FCRqv^RpYBmqvElOOk} zM1Cb3Y&8zU>Euc3zRq1gw*E__W)bCJ9&ztq8WRAv(Ob#j(=X$r!$ZQx zQd|pr67|by`ltP_#uLHJ4$Gcpm?zDP5TxL7dKNpKw4K(`rC>r8Njrx9%PwS%ZdEKC z*Vr=3%kGmj!c2xlc~J0pVUEbWIX!q5toJqBGNqr&PxU~*Tr2X9>*gcmhsVXcjuPZ7 z{w%D#Oz$~xRyrn4*?ml;`FRfT2-(xek*atxVYFFXG?@uPz{z}-vah*a-YO>a3$%zR z@%!cE1y}C#GY#YNb#U4WOCgT(nN;zL_)c+>bRj8Y{$ z*3VuJBee4hKIPl%7OEF8JBy)T)}Sr4h=k#TUCs=6s!jhsc&BwmWAwaTvYlGlk%tFY zL;Ngc%@_c0Iyd&WBV;|Qvs5&Bg02iuTxemcyJvv>Rx?pTeRpT&!T&wQiE7l-;6%OM zjaAQRXM)3zV#9@xVP_0~QncRbIyGXA`!;oi9w5Q^9ElORpN%q4gui;roMA&mpw-k= zIyp4Ee3?)MXsjFWu2$(WzpuX}@8luKYY0GIvm97Gr=ZRaB7;2eBi(f*6>kCd0)s5!dbs%Q3|XWsyJS-J`Vs&oSMMbWAXh3Os?I3LNJAi|wxkmM)fB zwpoQ2?oQ%0tWT8Lx6x0C?U!?qIn={i%A|Y5KFMn(Jb4@UAIV;(kzQ@Dd`oLPkvkus zN#m+01w!)EthUW7P?6QG3(}hNpq!b0tk>Lx)BOb-I6J`zd(J^g2;-RIqm~Jaqg$CF z;lLjbitj4GcR6MyQp8sWx8h!7NmQ2VSs=T$WP-305>lsr-6PO!l8Pglnv!Hg!5xCgvxUP&ZDJyJe${Rf~V$)zR+h)kr6xXH++|N zW2B)c;J~CMl;rt5U$0S((;?uLQafsYnPDMnCKy#-r~4RB z#Z_O;MHqFZf9#j3^MD-e4V_<)V?#!wFH46Be$)REhQe`LR99DV za2kS>d}^ip|Fvx`ZOByCPMoDRp@EwKW=lV6+w3zspfVMK!IwrAR_5*HtW87@ z?$Z{TVXngga=HQf2_nJuTsm?&LvJ<+a%-9uDS}M6oQgTDD~GN^4`2N9L_x57afP$O z)DTOFjg=Ix#U#*8Lz$U~)aB7cDR*S%bQg;mTo;Kl);w~tq3m$LkZs#XEAM))p)G9m zW@pT8r??`_`*f4gP?*bbRO1`NC&g**0HXSRwq6q$KXr?O0rq=;6(S{6**)Ec@xHhL zdS`zs)G$@xQu5!<8MEVnz{^-A1IJaLXdADH$8niJ(_-WYaR@_Az9%kY7L_jC1p3R8 z{+Yt6D9SykMgzj8fZ8tv5>fV&f(E3zR%NTc(p#86Cn!Rj%BhbW^j~Ho0l}_|jQV8$ zB8scnnX~aFGjml0LZa~`R4%_HoNiLsyBbWrYAM(6HoOSNCdyEoDCA(Vb9a4w0s`k^ z7i@K>kd@zw<(Sr+HKdQ6_H`U0>VsZF(Q}Wc_!y5UlAB^qPY~8`5=>@1YphqsgMf~f z_R&Nb?yr|pUGcLXR|Ti6AT=yJKVUf!a#B$ks$*KNA7txU$_Km>wLLK`H;iuzbqIKq zex~R@fZvT&296&0eFj8J+i^vKw2t2e>-#xen-)zF$yU-FIbRRp2$V}_blaLusd_K#J=#i8|!wWf~1CItH-=)XF04y!pXiGT(7g& zszuwtk{LL@`V!a4pfk9(TO}}5owMLLN)9cibkgY5LGE7Y>~f^UU7y2SKR#L#d+3Tf5X948BhR<-v>ZS^fEdMGd@|=jsLom<4%5^a~*f3MGlK+j`BpMadNO}3n zLfX3kX%%m>665W^;NfM1E2!8uyhlJ6%Xqk6j3~_rX?jW#fr7e=}GQs41vO5&v-I+ja`9n$Iy9%>W^oWpedL znv$P>;oi}A^$YbB_UY6>X(<(1gMo2%X6pKW?K1iYvyLKOJq;DkD zpC#hZSaH1G6rWgN!hYs93J$V+8UzQ>nXiSs%O-(7YB!u|pOa5a689iO5 zaPp(^!6f-Qx1=+}n23qXUgJLSz2Hg>&67px|FQ-Rz|8EaYhA_K_t}LgqZ0|VU%sen z+V)R-8V)BX<~_w`e4&T*ZBJYK%*ZpeGy~D7dQnuN@-kX5ZTK6t0_q27`7a@;I^-Eh z$H3o{&F#%y?fbx)_|C$J#Kc1e- z_&9k4JVG!7@ZE@4$cuHX;dyOu!3(`7&^iSVKQQHVhn`i3DDNr~paX?fq^$KO*s;~( z(bPio>+7eHp!WtV_DQJ3yE#yyyrzLjkAZ54KG31%I%Xv3(QreI`^&d2^ zpLkp7kM{3ulv#xU@=-gIl^70&S*^7AyB=k!BB(*9A^%F!;)1*xw;flee8_&fF0Pau zM_ADTgp&7%yXN`DSG7q;segByAzvhmWnTE#?2Q|aTPwpHsTe9;oH3MNyr8}QQO7VN zSa(+OULyRn&@YCr2tv%OddT4GZDh975o@Ii=V+Qiau7`wShO`aX7XimBYOc z$0w=C*BZ$A;axVR#ymAb;#)tZ+i$})$dUTi=uxMTl+|LgbNJiL5Lh^Y8{V4Aj<{$Wz|x zLp4qs2a>Io@IxClXAw_;g8-+#Q%J#8KD!xv*JBpdfN=alB7k3FwjP6gxn^&vWNm%&b&R&S->CpT=S+yyChSKZy;R zA+Vmg0KQN)KlCW7`4w;nF0B4bAu7Q9CjjrGWO{`ch-$IAJ)Shmj@_oy=#6A@dGlE| zmeRctw#F?6u!pFeM$rN9LlCo{#>_1@x(v+*Nb$`ufQX?h4bs`K5!{Wmlfbx&!w&EdE(_HC zhdUQez`7l@aPw8|`j90a$VUJ8jCb#BS$Wxud2x_21C_@^Xw;9+QM{Zk!fexdE(n80 zq2&w%5Lz+0g7TYPLhO>OB;I?Oq7!{#qL`-~*aN!WxR}HQlzXpLw$Jo)A>DTgS)a*| zf++iL8Ue2W5F@&VMMk63C!A}5+kP&MTLkd+2cp*BsABaDOS%O}RR;9%9tr|dfnbQ< z6Uq`+^&s=S$M3bqF1duq6U4W43_!d}bUaSmHqFIFWsuUKqay6pl@gf@rnL z*&o@8oRxH^XBHC=+{*aeK{&R&FdD+oMZZ@2N060qN!j8}P$Jh$oRmo90c&|rG0bDXF;c%VoAiqdo++8cF&-N)$-wTXK!q1GVzQjtsqdeGqe~MA{ zqc_@-+FpYQ`D82>)s@GMAXuXy(8o|t3CM?FpV`__bi=;&3JWy1#~%knuOj=rw3XYK z*83?5&nju64Xa6%%2qZ-r}H3;+fjW5weSpg$})kbDrdH2(WA)O9x*aKi1MT zHGL(dv_>gOP#KHG1~vcsp*nLwq&O^MkGVV=V+|L^oZZ^+VwcTC)c2b81ouy>@T!g> zfoQ|y=_kE)3pkON+@~)*11TH5$yACg?Yda!b}hDYws4F{f{Ezdbl!TNG`$$o#b5{QQpgj;zc%*1&CBszwcj4XdP4p4KNO4<~q zZ|0phnMK~DtRF5282}}1*8WOiD$p0@M=PTO={hQMI@TiNXA!fn@{}F2$RhcGSIkOdF3QSeDG2hC{TGc5yQG#T(Lf zp&-;G9-vGpf~X29rZut6=oG}M_+Xo&d=~B?d3C{niHK<@obduR{PNB80L=x~sJSU) zwpmXqAeIKyTB672Av$`9Z{|DlbnK7cC?z=mf%s*!1X7F25pd5&83SmF-xV<&u(=3Q z3j1p$qgFry3?7YuJAj3Xb2gPSHppoMrCS%H4)M=#`ZKHLU1kl0<2CRgi`zuQ736H$ z>ZDCp+?DccwVyC0*u3{u$@RPjVX9UxoMCz8rUp?@ZyqVCj2zpRw}w47sR|<_A|E#X z|BST6l7oWN*^yfZs=ercMH%DWh)(&Ke)m@r-}F1G7@w&?n+1^gUQi1B#hY#Evx@00 zVEi8tP@h~+1{53cJv!KHfOZ$qF|7Vh-(%!ChtNBx-I=m_fIh-w(0$vuPY1v#m|6Z$ zoh{yd&UD6q)hj$I*W*^xeMy9nhhN*56*o6@^tI+e@2eJghB&|%uk4- zJdYD|wxHTOa-ht|M0y^47VK{@t(Peu7x=bSwh2$dX3FYr)cqMkvUMm{TEy)P@6S4Z3IG3StVsON%|5sbM(q~)c0J&(2D3EjDy!Y-{ zdyBdut!A!XIHQ#XjY7w@1hp_I)9TLPdFeQwxHjwY_0Z(;Czf#cYEhZKU;4MU^&-@{ znQYq_qIc5N;|<-gCd#ljMVwt2MD`8`qW5?O+j#8Dn6H@Dy`4SeP?L6m%odV}9K92( z>Li?b;f+W<*sOCWdGm}@tqqq=gRUA{S)>Q*S?7A^q%VclyCFL`>p^QEZmMa$mYW}( z>1+R<%FyJl6zC<5*_>`=J4wdt^ny34AwqG*X7qgpjeZ8N|fU%~GT+_!{>BL3NH!l6FBOaJ&!qcoWN*mYb;C43&EYfdOJX&peYip4(OuO+;)1ygpFS;UfX ztTOrx1mkG4bhe??j3!Oa=sO%`T1WJrH9PuMm@8v{eHQd;iP5NObb0_e{(X7uBtugv zcn6sK{8`94F_vre6G`ymxp_M_pA+otLVV_`RAb5x;TPD_aw&YTF{RkG0$vpd@KTrL z*Gz-nSbl-2m`H%BGq==Dy8%0s$`q;cXyVt$UZY zB2(9el%%7iu`^#BaQ4fkjUA8dOxNpRol2l*gr!fLEPs~t(gOhew1p&dbMB3rB0Y#? zX<5U>kUTbdLMXV!&JJkw7FrtpFpLNS_#My|ih131AfQaWB}7kV_1;;%B)@g*9Stcy z^pvIB9?i1Urm-ah`;LJ-vUpbiZ_3@*%~_jvFSSV$~fzXhyI!=ex+oO()V5 z%oRE{=ERMn`9l+C{GM1J2k}MP*Z=l&=D zW&Gue&hU}IN9k?yQyc=9ML0BaRG>KEJAab>|B<*1e@WMlDw)U*sVQAki!^gn9&=7O zu1f}kfwlgYTu`AgHL;u193|IVs!(qIyNu{t?a5?VcMe%VE{gg>cY>oAR~cpb^_CBi zAJ8k6L~=rvPsiPMw?dhy6YLh}efr=2Bix_<8DS1CdmQUhK^44MPX~dc;1mxQ4#W{F zdC`lSwv%G)?fCn!;NiLIWaZCeLJOr48kV(5*Z1s`J+Rmrkk(qs|Fr=R18`FRE{02{ zek`=f#$K8X3sKUGDYyYSMtDbpHuXo9TpJWs$pfrnDW%s&Z*G(w)lOo)Kg}4dvRb4z z^{QE<cnrIk4Xa=ZrE9#M zph#7*U=uJ#?og|$ms>fY@BZ!u-(5##2zK)2*!Gb_j&)kJ{F@*+?YfV-&!JAKia54# z3?#`5NJN55^ltp0KX0?f-30;E%yS6%ILN{?Wk>R#c*TOyM~0@`-c_jxJr%LDbS8N9 zpG01`2jjq@<;Hk@6-poa`?V6Ky#2YuqmBZ4TGR>3M=FkJZ#Cu<0c}ZzO2D1UskCE5 zJbT*x7DZVXEJfqQg$>GHwm+0p zV!dL;kNba;o{oKuQ(`|zP{{)t17;|Y^F}IM4o&#S1l7x+Dslhx_E)$K)>3xr99V}0m@8&C( z_pO{AsJ`udd_)^8%l7h6aE#pru=}!%g8x44xo=i?gMQ3dj4H}`2}s_Gi6hvhbqqqx z*gp5^k!n_Nd{-WaiP7a?nhc^9P)BW9}bD_b5(J-im+oMieaD1(S!F9WMj}5j?>A^ zZWVldQxy0bRA7h{NX@SIhTnWMz|iM%{+-SA0H}L|i}6`!u~jI-znWO0m(h3FNGTz0 zq$QkMkZ?B@qmFG#kJC2UfN2qqiUkFp5T2W?$g?a5`gzCh6b7RJL2S3XG~S*E2Chg) zvKV!f)G=q+>z_e=sh$iRjjT6b>Z{`Pp}0<+G_3NpsW0H-0)*t38^M3VeJU~&n^)%* z5S&*2#sTL-)2qpzk*)R&nPS(-O(JNnCMG{Nvy!szh=Cl@(>q&_#`2j5*u@FGuihAYYT{}3AtA1-Yr!|hv}0QAgzUf-9#rGdTTt@i+8q&E{xd)X+ZT$0a_ zmZm1iLV`Fcy7n(h6VJE3t;8kcXCrb+Y%+i7?^O~mJT(^kVus#4l#9|OwF@rjGOh$x zht}VP5%^|wDpP?75jX>fL5O=8Zf8*f5V;+{S)Bw!W9~|@}S_4Mq0kF{;U%)5T5}b2VH{_o3%g!qNITz4*y6_;dwKg^~Oy(sum z(NCLYmbpVOZ*M&3@4*_{uiq-WYayblg^2fjcLjr3xB*=n1eYAYKJi{@hW4wA(0pUz zCtUN8#hydIe#^WE38$ko#K5=Z3y*85Lctyd6F0{IB6enUG|beJ@-lPtEY9og<>%k> zugqz_V>d*VP~_3>qO;Ab)<#BD2~Uz02q9%ArXB#vR7Sx!$H>?*2(@3`$6Y^qAQVUV ze7oi`-ajtJ1g{dK2ZJ=XR2faz#TNMEn3eRy%23vhF|5p2i}|9UJ#`Eogv&i|8s@BE zy6vnqn7g&!X5WYWxqfWtisjv(iGrz-vwE;xXcr|>W;TIfn~)fEf8i<%4&b`$2L~e0 z0f3bDf6xKqGzY;gv4ua*RQaDEGa|-6K89bB;lSRanJBec9#Zy||Q5?JkDUBt9ZHE_yda~W6K~NnE&w}Ze zqDj4F!Dtb1LNgJf8j|!(G4(4={q_U&mam==gqg=%2Bf!jxnc!;pVzb1?8WDA5NLk} zcEA6={XKg^MxyH$qhAOg=CTM6H$jfOkpATxTShKtgtC{|I5XXkXLfJQb@LlgqsXOB zK_9nwld&4YRZ_S12@$zc2oP2-f7K!Y6)u29V^wS6v^^+4%AvO!S=l>z$Jl{+q+&}q zo~;e`kaU`P$BqM;t~&^@z)!)iDn@47;!Bp^JlBJn$C}=MlWtdHF!R5I%8;L|kti^B zHSzPRrf5FAc6-AxDZso4!Um`J{YgS<18R5a!qR#W})EO4QU zd##y@ZVX#TB|8MpC2Kr3t~n{YNAGLJ35f^e32ht_$oTiA{=tb6oW4(Z$)5=6jspI| zuQ(f{3Ck#SDz589` zcM|()JZ8#n_tu%ZV(3q^u3=_3`_jG1>pQ1Je1mCuFtZb+zPS3I`a)j2r$G6{`GrAd zkG0YRSkRx5eVgH}#XK{!`&F17a)d^)^($M=yH%pyvlcU6EyhTA`mWD$$a5F2HK=yT z)Zi{wKo1Yp)lCN3%XB7yiKrNq3~cYcO|V;oDcMpXJVcY!Txros6J$5i!h3@8Hk=NW zUCirxCStgDeihU!o*X@4x&}vn3q;Mgw+#f8R5?=BjQ4szL5{Kso(Znlcj0yHGLUKC z;#b&|ZJbK$IGoUbpA@|pnFDs0w!dN9;|5|+s;nsuMa0^7p!9TsH`EN7w@E$`@JF?rd9Bm`)Vf(j}ao2HQw+UT?rUug3gt(Lx zKoC|_5O9*8&O%HHT%LQX+Sb(3xPS!G?Ipp+5}TkM`3;JO?w;vEP8VQ#xbip)9PyNZ zlbU8xn*GIzlrdXGlS)h}iESk?XSDT<@h95j;6SFEZz*{Ysoq;Yx%=7)8cyKO9xmaG zL>c){4S!=Cy`8Exqi&rW!4BJG_ppTdGH%GU>ff3F&BLQUOc05xyl;*HCH@!9MH26kGsZRojjR^`2hapNe4=u2e#(>P0cW=>O)t8dTU5MY z`yRp*n@e*K5HaZDmSZ-wa={!cH)Fs-!|;~U`DcLksOVfrtwnL^!fOj|78`B+-#lu^ z;?4#VhKhV+mjq#WawxJ3V_^G(Cv(Pdpl``0b~6h|TYUm3k@gYfdK`oZU=H}ja;nBp zMF;ml>f3F?oSd!12+j4TT&=LyG0>%@TBHS(Qxf5t`_GEDM=7Ws?6Qiw;ttmh2jX>h zv4T3*yiuaZ%+NK{N9SqBe6MeEymEEpraY1Q;jK7k@MSnpDSj6#d$d=GW_-cjjLZcc z(x0+x19=Kt8+g8fkr|h8_Bv~S@_GmuoxEf_t_Z4czDKC7UXrA!vPIHD2v;63?Dd6c zq*i0Kp8)mqSsX~*sHefVR#}8F7LCVFV?2h5>ct8&F6SB}-0=LY8ADTGRPFd)XDOn` zdpDNswjwU|X!d9h!V%$`=c|K$Jw_;mavv-2kVIf57X1cwJYNs7p2n8%`p!EQynI9F zGjI_x5pzPxc^oj)B#Ck|<`AGAz9znXeOs{Gzc~RoopXWA%FFzyXJ`BIXWsZ?^0}$IZT{`BU^jT6tIRRE3n;#yWf3S=~`h-rS0?LxXATTBiZ zhMx1d+!Ch$;LUAR1>nm+wIhZH|0_n4$4arYUM0S%a#gyJ3!Eg=Ki!7>>%u0ha=B^z zS?9Y@xK5UHL)(SX!gErDBb`&{R1gLkha;LH&v`qwo;CK(6QgT|m+RLLXU{_ydoQ;B zJLV?`<5}ci=npEKxhWFMK^i`~%{e6^4YV|V#J>m5q1fDZ2zMa}iH5aNznV~HiH{#S zELIM9p#97#>J>D8KepS@MC;`u1)iI6D8N+3tjUlNDO%em%Kvqxnc3x|E|gg5{cr|+ zEj2{tE`h&>qAX58mn;=GdYqqT;H#uq#RGV6bUPEi5#0VKCARiYK{X7aHi~$cu;WGD zlk3QQ8y3oU%Q>$k#g1O}_!#knKtMyDotILTpnJ3Kr+`PEa-<3xP?F{==S_zUBe+^b z25036lsuo!j5iE|gLbcawz4OInK#MCO580zSIKj-moO#YSxr7G)D`{#zRBrwfFUk~ zFn5}&2)Vr<`gaOy%;1lw5QoxO*uV}ur=4K&5AV~;%9-fXDB&JH>spRiTU`a`@D-~H zJV*Ix{DiRK@Y5|!@SB2p{NO=xB~|qOoKS)+wL%bI`PB?Svf@kF&Ms5h$W|S(e|za9 zEfA;4N9z9<>W3L{y;47DHN74_rK(K3VcFSNVV^aFsF!?tcijSJaFJrU=c zG~22V(%`--inpYru+F0Ma1CwZI)&pd;xzdKzRoPY8@x6p8kCF<3A_|wTRyj&i|+I8 zGf7roXf&C^emr-FZUP4M<$>ATy5k0tn9*J?oQ3Wk)0Qc=38f5YmWRyTeTn0*PD+Fu z9oBV;fCyVAU2H}Ap;}L?GGe0?g*D10RN4FXg0xj%Cd-G_08{7f{#{PF#dGWIET(UZ@ycR(e*=guk zTG?Kr>yyCO)Y5)5#(1r%QnyIvs6V1H!`Ch`Bgd(HS1bT;^=ih)+%=nK>4O%N-9r}c`$^_{O-T1F@QP#+08D<#!F!Acw!Z# zW}gw02KntT`QDn09^rMtp(}kLjO6tF?6gN6XsW+8`IT1~l}N6kSOHx>Nq}GxJfgLV z%cHC`rHdGh`T4=_Y3c3GcYxMIH&kB0cc$ljKE*|o3BToS6PxYxY1NbzL*XQ~SDe}z zGX*(-9i*dqd$p{gkl$R{&|dt8E$pnbfi%RI-icXk+?)l%-3L;#C4~0a4o|f1tzIq1 zJ{$k;8^~~v)NAmDx%j5Za1u8A0+JHOeJh}(IwQzHn!XTBcYH7$fiF|znuvKAle5i= zK$hL`p1khfVV9j07{>xKvS3l)?T1b*H^Q)+&dlR3$U&*f=D9PUIs@TaGnD#seVF$2 zO_qJsJUR6oC5lg)-tDFG-d}osvYr~FkaGxW_ zLMTekDQY--PsUpW0p14{JpTbUSfbP@07*c$zh(c3Lf2BaC#_$&zpM^_WgA@{#78b8 zMHQQ_om;vlJhu_ksgKDd?DDT&=N-YXj46?0K^J&4u`UBwN2IUAK#alK0#>Fl4HaV? zcYYj@tauTpaOWYyEe25H*P!})KW+A}W`Axw5!sBD;sbQxD`oDY-3oOdAO|OHd)m8t z%G}p4ppSVi8^VHr8NmQ{8Xg`bnciw@(!$3>=)IImi*ZC+d9B!3+Eo>f(|36=G|p0I zG4R-v#m21a`qrVVot#gzcr;o{iCG@kgU4HYt%?E^p+fPn4W4R2O2BcSs^OZpN>XxSlClyEDh|ha7$=} zK2Y@AE0p0X_~F^U`sTRuVI2eQKG{81j-~!rsHMBVg+6SL`qz5EPR;rrfFPKma>dfE zgh@Bid_Aq?t=9CM_q4?^3Rq6`f>)LLIgCwYPHg#-B%5Kivq0x%XeAK!%ufM-lq=zF zWn#G%;PD_7Fw}=U4XI+1>O`AbTaY^^T$8|aY>ix4PPGA}&nL1X)^R_8;#a2I*9Bj8 zr1E|s@IGMYTBp+eGMUrabbRYCic8XL=FZiP8HyfnZ|tV$KiicfEu0L@8s88RIMdi) z3t`g}Xo?YX{y0S2?Bv)J9P*~GIZVy;{)#gykWkV|$jaerayWNvbgvL{8MoAbXxX_< z%YK5-mO|UeE6ht4(oJmNPRo+*Bdi)`AJV3y^y2C274qV|vV_AMp`k$qM8%i)$27VQao}>PgA7jPpFnSRH zZ;=a&Zvt31-2Igdn{*$X(PxB)>AGQQ>K?a;>z!@N-agomM$SH(ce4MUOHPLS_cghh z`+oJXH9mm4H*{t4G$Iv=EL2ZcYsFDiiE_J-eJ+B%wgrg%8jZ(~ZP+bDW05Nbtf>=t z`C$X15}bas>l*KJTe}v5cuGR8c}-hshtl+>29Y8MN0j3sir2jy z_*q$SnmhSyHqV3rmydA4+qs7uczNx(8@I%eyW8ma?{EyoVgm7)A#HteYLeqO(bkKs zhv{#*anq87t%a&8_nM$X!FG&&RHE*y2f{@LR zoq2eER5Wx<3+obxHUb*EYs^e{B`3Mj+vC+)d4H#0CAd7vm9^Atme;E(W!=Df=24%Ni zBg;M+Rfz_jDTw0+5IKWrd1xVJub63`u)axX*#~s|&m)-%MTl+2yBY{KvvlCW+DHI~ zJax{aQ81CAMSk*-srt3#V+M!7oZO$L%j$9RNL66TRczIjlurs1`=oVYZM8*3&*NOl zfqJRw=A+bmx6iKgBBC7s7Wso%b!~8jF7#%Kgh{{X;YhNPS1h5AXagL|) z61vyB#$a0l*qF|xBh7d=gQ3xv|Ih%{bL}#0pDRZx_Gb&fau<*VHXn7uSSIi&BpP zo0Nospjf`klD%p8KqN5yqVd6Hy=`>n`7gd%ce>nJp(O78w-uTCH6}gIdEXq<0Gq^g zJZDVOg-B`7>z-7i>j9M9pH}5(^9}yhK5q=yq zI;3d#>U+eOLnrVM;9xCDf~2KxWd#o%-MDBG+iOmTl76I8W6IS zOP8_Rf1$@=c*C2l$kb{(loX#O?0eb>FgED8Z|S_PN03)qx7p{qz|I(BvY> zlzZjs_XGru%j~n&4OlRmHN|Ng6jwOr6Awcw``#mPg#LM=*VEL<);b~kE#Jz$&7Lz& z*owmMp_Jz8Y&cUd8N%jM?_R19M()X&-lbs;@vlmP6t+$JU4n;Pjt@?UdIq@P`67sw z?)O6b?~$g8!B$SW1K7h!X|SHwAr-e8uwhK z8U5%AJpGt*{I!PWlz;1}4nt9@xam`RD>cAtBkwp&orgH#7Y&9)JDQ`2*zp<3AUD+%B4Svl!2V z1)grOc=_IAX>2hKMEu$acS-tyufw_k1y)-Pcqz{zH!s=3u4e4EiNticlcVlP5{-^( zvw9eR$))Lye>%s$oI+wh-qyIOW-RSUgD35j!n1^u%|8A#{m;M2Pn_dtfSiZ*>F6v} zBz4>LDJqdh?_yVj#ULKMRJSG=1JayKQ-H47jQzC}g-z#R(@d{U4b7Wmx(roEVxLks zOYA!?%CAeBUqiX)fQAmy5>2cAvckHM-#!LD5MV@le(zpz$yW++RhT)HFVqgLASF^D zrPRA=;Xc+=n)t$=HB-9K&tPs^-afcRvA&43uc%cgqo=u45%aTIB}Tmv(18nUBrTv4 z|1l3~%dFi(VNKh8f!6+yhm1X&^4n3XYA}>8K49)2Jbo>}IDO+#s2^+R%e>!!YA2e5 zauY#wLGAQv-i2|voQ_CkZb+x%W;DOVHmBhRAnvo?1k&)5y%u84x&u9jRItsksdJ;O zrvz5aryTzLWMkcyuGJoLiGNxb=JaGam(=`61~L#LBS<_+JRtMsmx>1t`cyVMcZ>iF z&!TtolLL3wmWr2LR5h9>J{b>XHl@2dp4e>6Ok9_Gn%LDPp)6pGEB>X~_Reg=91eHFZUtKlV=TN3` zl*&zOE*)^e;o_ztjxIf$@m1Ykxs+^T>#;iGL@Jdq?+siMccAYaw;NIdpcgU4%FFs_ zcdB?(N3P1tMb9LCK|~@mgcPdNcXs>JTmVZNYdQsChR}7y8&Fi1KDjQYll)!$;VNm2 zbNdTmS9DK>!H0qGY#Yee#1(--ekyetxK}cckEDO$u(bkxI6>xG{dQg>%2Bqk>M{r> zEgkq{g<&BxQBsBRw21J$I^IGJZYAO4jE>Kvf^oN|+Le}?jNfA5J*_Q_)qCC!H;5w$@#jRNvxTCchU5$qc@FTrl!0gy4WTO5Ieo)|u?^w-yF5Pt+6D;Dl zt&}&VTSeJ%GRpN8w&RZeyPi~P=F#Ach&P_yR=%-B7`M0#ZE=mKyZ_*;0$^D40EO0! zq222f2B9febkxnYgp{UyOs=$F>rT?jg~0`=2@#i1&vyhJg(xQc@LzM!cA<=6J3^>H|wChv6%(U2y~n{2P7K)Z;gOpmB5%pG1imlnYw%Gz{0 z9g~(><{)tmn+Cr}Z{qFrkYbo^ft72hhC%x9si-RuMd zW^T6Fmp4Vf{CLcIbemw1V{GYbon~-5$^Y~#3=QC%>cJ<^ zdOCgVd6A>dR*C8vkM(E$dz^ty_dn!CV+yjQ`?CEXX2k*9L1U5uk=5p)=?R9_p$0j= zuzC&8uxDCAIK(WVZs~G4)+?u6h!7Dz;vlcA(Gv^dDYju%H(u8OaejJ<>eFLm)PuY* z#z?JVFjDkB`FLJPPDJO}(#%j_b2(N<7zc}!@zgIG06QB-lkwNFLHTOhryDo7+SafM z(<{pzjfBE>L;uuqkA*758X<=%t$#Lx8!M$S1_P^Ob>qQ=+|1bNXql83%hnUNK|ykP zOWnw-^%Q<5Rx=ileB#^((aNOOcvhS_idbxW`4#rJccsLzP=#&GjZom6OSG_9xzK3JF;$y6PgknHCo zSGg?gH-yI*9lGWD^xA!L&w%-RhV=(a0ekboY9mZ)wp6Lvl;jFSQo&iv$u9W_)Xr!7 zCj;}W3tNtsDES~UCkC5}-m(T5d#uZAS z%B=g@Y?oIt2fBTbPFC0IYh~ZVs>R9qBfRF61AVk1+qJ~ymIohF=%85Bxnhd-i9_-@ z;AeIgs*8{v0e(Z0tCf}7i|wEomCY+o417}4*Ufb_!@X9}XNU?nKCDk8(HDRR{9o{k zD(s?ibmh^COT~Vw4d^^LVuC4IXdPWwh=Y)t7`REaRAS-~J$~(?!}nFP`)yda!T^g^ z(V~~VN7zIgPoab3gl-nFk#riA=UYNszGm{ClAsYNyBPc7T|``Bx&E^s|n#!mPM-q>faRsZrOEZVIPvSX*szH-_!+nb$X>^PSfn zKNd;kYgKSlh#mIjx4vvsdJ95vTW&m5TjE@sy}zw#SHG5&(Y6j=A=7(Cz}R@Vk7elW z8M>VtHdlt=B*U}ns@h-3G8@{nsKlSza!~5ZTHEf$7XxO#HwPF}G)|m?fvlX~whiNd zZtJ~kw;W`&f3YUb(}q3cn~R-8TtD>xY(@9r?cvB6jOX*c`5@2nLnRL;$x0f|KdN#* z1Ju*a2XyS9drtAF$V8^0AG4vChgRfpv&*+mF$i1k@J3ah+^|JoU}y~colK2%qt@qM z7bHQd`vX9$+XW#%GXK$?XaaU%)9IvK8Egj1IKdHm>)r;X6XN5F$eoT3~g!WiOX+Q6DiYTEdgI`>5L;*bE~ z1qz(mh1MTv%H=lXd=|bh1$@wRHO+}>*Ao7{za9vN@Mn0742#fCm@#`p<1js8MNaER zFU)_&O#Vow3&kNl0$gk!XTtO!37Q9g076GJphkRMM`0t3I|;c!LE@7-|EXzFMkLfL43R!%@Ne> zCf`mWMYXCA<0f`5&UHt7Fc2ap-rKNGMFPcw*KI-T!W$j6Cv8Lk_GUXU7fYg~I|g&p zwq)3UtUTxz31^7JumK~!`a%L#r9JLbsdr(>KchN4P_lgXa`V!Sy3Y;2hEP}>hfr1Z zSA5`B9r8YajI(^0qE?q58$D{X;&R1vS;cYwBvawaY|G}UkrF-S2Tlpua9*AL5;d}a zZh9FOH&Y#m$`7e_Gj=;)_rQ+(|C5)ptyZ;Mk)rrjxp6(FOeQRSVbFMD(DPyyn`Kr9A7V?JD z>A(3?&@~a_Ff#;Lw_>zd-KiJ9hr<3dCZxK4?2`8yR9B?eV+>E{iJZE7M*+(DC_hmC#9wwLaF_l8hly!&H2WA>aH z2Gq~ze#*W=aRc`GdGvOs1*035AU$?z6-SI)qYly^@nb!LJI%t5;OchUn9VK|csCt4 zEtT*W*u{2g@c-u&S6|>@#Qlrw1r0np^uOXo|0mn6nE6&*^-L0hRQ4I9AY6)ivduUu zhDPuHm!p(6V60zRcAIwGqWnWM=a|j-2Mfb-(a$9Qe&urYaI_Up?>hPORl&*8bh6j zv1{4yQj+#w-#vOJ#+a^nzy<$cD$pftp^$(5CU4>(N6qeC)d21drWtMI{Mg)KAETy zJm*!HO%y|sdJc#YS$~W6a^7srABXC*i+1MXiOt*x=8rL_0J(~IVD6=MYWEkL{s+CS zldx*Djo7Cf?T=ZjoEw0CcY6M@r@}-jd0Yz?Y}lia931%~Rx8^Os03rMFCaYj+aiDD zm+x7g?+zy=i?$!(S`Yqljj#SCrj02--$n!>1191zm*bE`AQ;g0fCM&}aQibq%Hf*fQ=nt2E`({a`VfW&^>|i4)o&S#jp|D+SKExz z)5l5IlIxBC{!E=omz@eo0!8^RU$FlOva6#!NrdK_EnUiJl^RP%WKyVff`0nn0wx18 zk(bL2Zpv9{tZMX|0rH?q?mOTIy>KD7zlcoLADk)lWB-`KjxU3&HJB7ka%V|E2Kuz3 zm*mpT+6VTx-Ss-+y=vma*l`R$1H!$Fc)hRQd;1{XK}Bsnd%~i|KUhkdO$x;`bf`VM zqrq~NLp`D)MTyxxe@+>u?LpxNURMk&8wSoB@G?z+3N=nypte$K;Ruun!9U5j=E4~T z2rEG+dZYSuT5m6&1p~3e-8Ux(acySxi6#qae)vwC)lVy|VYxO&T^#66xEdX|DI5hddZDo^?8ViiKzpkr(9=D_3g0&+vGV8u!TyQ4rtG*2!P+Rvu! zsYIhOZ8NW|S^PRa#}EuX(oFB^;J8rnEp|UMwWJ@WoO|i1Si(dzz6P*VZ#l|!NWBQ% z8unCw+w51qhW9ISjUpYHqsDx|?iDLa=|1DjKhVWD2QXDkfHkg^iXI|h*S!%`Cp9dm z$L5JmvbywOZ5~A#wWt2Sx4Q${T+g7zznf{CEMlNKs6&&e@6|5VAmvfx?Dj{{_-zZYXCm ztYRsyjuCoVMb;le!)XZK%2%YH8$delXEIMrkGPT;siUO;m3`dz6zH9IZ$$1@vb;m9 zhUX;%ZLMkxSw~A7Y!HwODh;MZ7(M$LW{GU|8AEk8dNO(W7SB8}8;rl4x!YjBOR7ok zFoaPhinm@|rUH$8%$R(mGE%Q=AJQ^)w8_feKn*}XU9N>t7^zN~7#Pk;dEMx(R?N(TD-Gbv+l`v-yuUr(K-adb$u7023a%N>3ByY#^eQtmQF}>XWd$0> zo?hxR@(0`Vxk`Twjik@#{MU19^d^q0guVNZn2;e>`O?*-f2`kvMbVNY+ zNK4g@A3K8grxW9NsahD6tO7BTQpe9KNY1?~6)Ydt%XR2@q%0##C;%#tgUlk#)MNoQ zFSw-4&~!2}mkzSC*YMa4>z)*ffG)=fj6L+yG2_e8LC{8u$@(M^lsFX|zn@R@*^HO) zxob2V6a8$YyqV@b7?EwWufYZnbdG;UzluT9m&t{-O^;Dum&UAkV?4_1V63H zkOXx8UnDw@(k^?~LqsQxJR6R6MPl9r-}C{8;4%fw{H;yU!1{Z0&ru<3BNit5PBg+R z-`S&el8nGiaz_9Y-MRb=?I7CMqgXANoeay?V9sf3I0UCz`=>`p0u?SDZC8T&5%b1z zoM97*u)fL$;s5%8VBztx=7)XAQ@{4NHbuUyC_iU21$E^E4&!6};r^r4pCf|8EXzUv zJv2j0Ii*dwNtW^5QlF0_hj0qK-EG&Fl;59k;?*d%PeqlU%XAg0h9j z3AkQkp>Y#*sK0;+b?zM*Ha>x4JCDq*aZfn`CT+);^;%`uw-Znv5w1`X%h~t@IKQq7 z$QxL-ntSulj%%LpGghK8F5@QQk(Rjtt@?I3})G`L!92QTc$ ztVMNusrfky0DPCqsiU@I!>#QICM*`XfuDtD(;E-d8g%*}l1gHBr*_EkmqxgmvX zD&DnLlOEEf-(N24`W=dW&RmtLqOGjsF3E&KVZRcIWqc5fQf>jEW6zagAl>Mb#|QLO zkRx+q;M{@@Tz0f}O>j-+;1jNs6M$(s#x+2TPthSwO%Wwp^~x2v)zl28@O zzX~3=@%tl1#f1M{wAX_xhpie_cXu0k0@Gd@yted)I55e%(t7ThT4FWx2T7B_5O7Qt zs=|!E)bz&XvSD)N4v&xowg!A^AJb2GQ_g8bGi>|xky9747B5)~ie4gAzhumjS z3vRnB^%Xf&_`8wdo*ur4X{`IRkYz=vZFC}SNUM~dax9;~QX$|fkEy~#kb>VcTx(#D zt>RT`Sx4`Lq2%xASn473LDD)^<7C#QpL}@((1(tNt$iqXzju8VIZB9T$h5M`;s-B* zpPLZH&YjXRX)t_OUX&_ILoaVj2ZLtB7k|I&79yJ1uK$!`-?xkn2m?oUXeL^vJ-5MF zVP%hf#!-(}0C`Tc+^IhVsn0SVCicV1>Xjy{j=)WEgU6bntjt$${m6`;;W6cpgX|4G zh*7WKdyHOwvNIB1*Mr?5bHQh-zLV<8OzE{bt*09=p2|pC0T>yK#ufrTwqk4qPHxVt zS59Qd!=Q;YXc0BZ zHvjHC5a-dkD@%_UmgL;t@#>|h!=iM(1>CkSW*}FA5WCi2&5>bso7Q?wx@E^F-0MS* zp~?kR=tM^NKI2DiK;O4-+{w-56WgNq^du0g7F>W$XI$ZF_663%u^@tcEv-b_<&h8) z-0V~3KLx4yx#*B9@66EHDdYm9KFHgBHnLSpL5Y;`@t$ZUC+BzZrp2yz8?>}l;NTqe zT#TsT1136vrF6`$A1B?};L2`<1k0oJ$2j8?BQO2b=nNCEg(pe2Y{{C>r&)ipJgaT) zK3qrf7eNYvoNB=WczzWPuCt~#sZ7&O1k9aB(-H#|K%bDrl3~39&HXxYX^0m_M~`P> z0@inOZNA*5TjaBc@I%|+*TS&=oXfjTJe{GG}684%EH+jz0>U% zpi#{0H&S3&IQCmpM@%0jEhIt!X_V29SE#g$Nm-gOVxXrd>D5Gvv68m}F&JKnMF7XX zGLR8KiF*EeXDI;Bi6c$G@QTd{0I$N1>*n|H{x2Hx`=h(#ry5}V!I3}fnYBNIrM#65 zpOAxu`_|}6;z8sBQP$Qw(}Shu;%VQIxs90m^w$Zqm_)qhv3Y7#wcs8M`WzyaVmw=6TZGc#dC|JNN5Kr$&kqf;6` zDcdg00{_8mFfTGCBto$qtzsU4+Fd)2I%g<7$cD1dz3i394e1+U7pEO?5BF<4s_icy zcdG7M?op@&VSuhz?*>!krD;KrXT~bRVO_h5@P%dS6E^fut~5OH)A?{}8h3?!H78YSza!)@y04ad{)+TYT z^KO}ewwWQDljG7~wF_|FYL_~z1>GV&-YN3Cj3Wx8ooO}gQn}FAE%3PG0`CMB$p_fnJ+q0AH9-egx)n8gP34o&5+wM}KoV{aS2E=r(KxbSI^Js9|zZcY9!T z$nt6aN0x6GubOnpTZFrR=Fc1i!5T$p%rU7XDlUGWZ;+}D2~zF}w4#IMQ6x%8(^Gpy z(2t=>P9y@)lsrAzEBSP259zq1{*j~FH2VY}C_+5;HGUT&sp}8eh5Udd1b&S8QXGtti|>7m&w zSQ%_;kiH^8Zx1ejWtebSI&7NlWzMcsfaEVU z^d@m*C{R7DZDW$_AQ!o4)hRqG>TCCVk&Ii{TRe=~i^A0%>AANN9x;)ZgLIJxpaG`|}e*#~#e zp=yTnqRN8>6gYQ84>?q0uXqbX&~p!8`T>BEm%n9cCP%C}|L1Ap5!Lu*v-U>|Y6w5f zCK_Pa-9r|ljarBL4$M6a1$lGWJEanHzB^7`47QFCO!*5i2-LvyW(Z922h z_zQBAd6A3juJ6gf85s$A!#ek5iu@#lUG;~e<}uw>tNHQpdse!xagODD0{W5j7VrQ% z4$D<+49N+c+rFBd0|MjpvCXkWKQ4>~67{fI=4Y)_VEaOq{@AKH%zk-c+I!jV;uJdy z&1d%HwH5}n_-7ux^g0Dz4Cn&K0*aFH_@{QPaO?q$ABL7>59c)MS|z`eFH04LKH=Pw@Li#RbVCfc zi{R3k5WvL1x;9^GGs~d>@MuaLw^75a#+;(8Al(3JLFmB zgnam9Wz;42^-%?Jboc=_jwij1SqjX5o|ed=ooG7CwPNu8e@{IsP3<<`%jG#xvj$k1 z^|T^4?j!zh76m-g@0@K#@&$yz=T9#lmZC`h0LQ}@N5&T=C(AxD7twE#M%))qv;??! z^eTYzBm#ifh+P2(T9}XfUu!#@NKK=&d?ZPdp>#KEg6vq?ajN&&AAdU(i!)v0?{)*! zn3`115jrp24WqY3h?rhr+3~!A(j2U@k|(77%T%gSf^7JuLnU%lfGrb9EQTiw(?HJ zRm>y$8sLt|n^GnbQPOYf9WqCmlK4&1E5~|^p5H3`NRYWH$;b_2NA&oB2;-8CX1hW% z`GQ#fJ<=C7vzsQ^%UFK@2l4C;9tzqOAVjr8kLBT_;9vckHL{>2#Eeqzs_DUB_r};$ z3Amh694}$224t1u6g|k7iQ~U z|61Q&jRBqXjXm4OLfRFe#RT8o`5X$J=}@^ro^DQA`20L${4Lw7Y831=0_nMP%pq)y zWbB@@E0`&CC&$cq`A`D+i?4M5yQ&H(auSP`ZREyl6x0O%Y_Wh_gTrIcTm$osdwjN3 z`f&9)!Gw?2&9-ZmkPh2DRuc5&QC(Pins%)O_QbDur_aB{m-wr+-d}7pwgOk<=b%1S zgr*7;Afz?siKWpwaT+zI687AOOST<`UAeUnhFZ!);~$n*%d*ec3BbX*+(^uLw4Uj5 zy$Su(z;wa2TqjW#;`ifu6vv-q_gd$YV6u3LifV?1dXp?Ucq3K`=(ul9dU?0TK1SiB z6ED>0t4i1v_c}o+9$CAA=MpqfG;vi|{4F8993F-*rX3acZ#{{D(~YiNPjQ0SBv!89 zA6cIWw0tp<;L(Kj#kERxtrCk+fN`bIc-fGxwhi=Jl+i{J$W|YqASnO%UkOW^jZvq_ zS+g#;zVk*u7N+9{By*>kQU@8rBO1h%sNO@rG581bM)SlE^qJCg6y`Rm7#P)3ZqzWq z0g0}mb>oH1%}TWxM*g0q_~OHA$hGGy*0BUK%yH2Y)2+EzDl~7}pFfh$%NAm0%VLx1 z!Sk4OXi^y^_DWo;N}WqXMNx>+jELc(KHchIdghff4{7-$%GWT6jKOI!ab})&$~Fip zdk9q2ncXr*F&-Uqu(${0;ji6_mQb2Ezn7!`tG#Z6=eJ-rzzi3iJ3=InfGUEDWxr)T(|TOxgi+a)nF5z@0^ z`%-k;^-x>S{B*|#-u0i$qCKf-C<{z|?qQB7oze-~x2gl;UE-4^1lsSRRDea}-kwz= z=yNI6`}_uJ+;aNNqwze!b_cEEbv)H*Qq-IBv zeDSOHhJ<~+z}N5mD%!+ns%!^Cl(tiX%yf=r)U*mG&L9U78DL-il z9BJ1ZiL=8|0@c2%S!=ZHRpYc`3>2xGc2H%mg~n-ks`r6zA+VQdB=I4axT!qNW$#Rc zKAbshkF8c2nV;4m>IYg92vPOy^Dh0Zi;p-si|K#m_Mf}plLg`C1^dmhly!}aO9A0M zc_UZepa$?AKLB8eJdU9uBnzjy4o9zItLKsR?^qQn1YG0l>#Ryw^_-ZkGUp`K;7TL8sYo|h?M02|@MS;P7|l+q3(Fep-@vRE`e^ho z6=1PI$wtOR4y^|t7!SJYKHkt4vKNH~gF_tJf`e*s`hH}0)Xn=?|4n2a0 z!IC>rRvj4WXSHP4_O3Ifvb2w6^b{DO=imIbRLqfYq*nzRHx&|OZ^2P?cJu{l z&SG$5jej=G3Th;<1Go}azEP`O%cgszP$5>*sN6Ik9A9Nh&*nBkoqh;Gp6Raz%d%wj zG$H|EpvOceM6Ik=c6gO?Ig2J3^`6VpbvAT+6+4yG)ovdpyt=_b`GD~_2@u{uTD*zS zzYX4_!+UY(UN*wsZdW`0?`ulpHQYlxiTbB{!MS7xIu#zMUFmv7}74cASuPNsX$3F46}9 zR3)4fY23eyZeemiR-?P0URaRIROHpqiUE*6R!Ka#Z>DAgM6eb~AI_~Abu7F8vY)dz z$Lf80?*bf=^z1$8&XWUX1eRITwM>=fJ#7fLXVv+ID>)}DQz<>qTA`9$)8jQ;>sIZ& zgxSSK`x}g9yDa=^ULIZj535O=_dVgpI@q}0g&ZMZV@XJw>70uGMyVq5Hl;b^E3kRC z3RK;4imKt1lylSZl~aka{sa|@2PvWwFdIOI>-sc!ytLF^aj}-m**iFUj5=E(5)jS8 z%Zm_bUr4gyY&iROqDo&V(E#eH-oXx#_$#G4X_0`d6qTcznsj!$1w(UyYkk~j!}Ss) z{b6o06R(CZMZ4lM(ust4M=dD>W`a|8d-F!M02@ zICv8p7KWNa{_@vak*40*5dk&_8Bo=5U-_%*!LIm{a4Asf@cdi_PBZVLN-F^x47D=(g{b)l^<-c^XQ%`w$KmhfTqRT6o>BjM|dN;j^C=m6x!O60$KI$ zG?SP8;@#wD(g-%hRLIfa^-H?`w$W z&~;#`@O(0xGa>4aMKGK=mf=EyOm6+p$Cy1C&R@(pf$vmuVp0=I058ts9 zG$&@Cg8yU;jci}`c`B4(CbG*1h%#NGilPHFW53b`S{Awi&cOFNcT1F&UW!2jSWD3} z`ki!Pu5}TCD6L_#i@rVW6wbzNiJz9`)%jX!z}((tJ`Dfb$e`geF#Zl7ajI5yCh2iT z8J_SJ;XMSok~R_vkd_pCPa{=mSeH?=LBn%Nhj=3cBS(um@wnw}Cz^jkWLRLjj0&BW zHh>WKHEWsUIw?OS@7X)n`g0#OdZZn-ey)Qw{@fgA3r-NO?6n4n^`Z+`d+tWF(vLlUoDqhS9b3gKm*_TkYt8xaC3~op(+Cz>8(!Dd4KWP zyYUvFrRd}6VzMsg8H~#+RueGu{R-*84otgDSOmEjKD-nwI@U%DVtJc_Jt`A!Tl1~p zm>ilm=Cl%5*&DU2U`c3k#oj_~LVKpC0DW%{b7{l9KzbqD)T!RM1h(i|oTQP^6Nq&Y z2UHcqzA4Y^k_b-c6^}B>tLpM7ZMD+DX*}G)`~yKTWrTzpt4(jE`2y>_)Zi6>^6(bF z=;wEXqKE|=0|g+!zA~R~X8Fa&a_`;@t_k)W8F{}E>SUs{M7CsO4$QBry?iL(`}a=` zegtf8D>XNGcZ@`F7dErHpCB!d=5$jcd0{{&&GJPVHpD?+wP}K~#$1-RHV+qh09(-t zLFJWjEZG13ucM~J<0U9VUM!rpjYRl>=Tx|7(}AuAoYeYnIRcU#M=Op;CC0n7@MWYscjrJ0mJ=V^DL^tz%R9#t%Sk3Jx27z3&Ea)q#m4OCQx4 zsAWL17D)#My+y(}N2RCpG&!HfgAWoI|4CF(4dJ>%WaSYJC)X?5Y+_qWW+QD{zV&aX^SU=wG|&_+ zAYFxwmE>AVZ3=v7lJGsfhajSNS-R;b1bGe$zdJARGgj(H)IP?36Vmz6bJ6qU5KLP zyQ^vSHI0kh>XbKu@K`5ueVqxJ6!5X>L?%s4Uk=Cooi z>~6ND+mA_(@Ly2eS|E{3Gxw}r*+~oa&bn?7aN36;+&c)i&(d_sVcff!rGgOhtY3Uq zhtMNibatC?(%&;nn4z9fG-XVfg=iOp(O@l;tp#NDq%pew8D}h-4 zbiE2H@P`4x^A$BB6yaD%eA6{RYE?J%IRX8=?auIqW{T=pFOxR5j0Aty*V;4g=ARXW zw1^PgawGHRNEe3Y{UX%KJp_Nq+UB$gF4?4T#$FWPmXPR1wu0&$CqpZm2wgzg5P?6F z+z72}x8x;00dxDfvMVj|Z$BK1>oU@o$R^75?Sw+@)%s z-oW9{(s&-TXNcK`%Gzx4RVs44K2YG%bB`6Dii1A!c?a_j0sxGQ*MBb~Hc(QmXpduVSgrj7>5501*o%2_4)l-x{Z0d!RAjY+{Nz=^fHCmt5ZkhJ z1oFHPkYK|d%4d=v?p@HZ@{)Y&%wFnLh{ZFaQS-8?n_C>aj_;Kluw6W)Z2#_X>?7}Y z@GH(1**$-h6j4enf;yjm)b|tu`1Mpqt{L$GR^i!??ydg6PG@CGw{c>mCd!S7T^3mF zweL0=m_(z4wc*o(gKG(MP~Mb?PyUuMTpXm{1NpJXc7xc%P575gv zS-BUmLnJ7{GTN=gdby0ta~f0$=-G4{XDdspmWNP}Z#v~`{^H)|&|pMSDG0Q?OkxNS zi=f+_K%Ni#C9eaG?kKVXNQ3^8^qq)BW@b94+Uocsg4br5W*i{r=5^~vfO^yiQQq5Mg^FP!0|1-dL;CrRYAKUY2%nf3ziW?2h7Wp2CU6f!}Nv44(NER{Y& z+@D>m2qNenNSBYD{kJ*tHc=llF(4K#T`&JGi7-g1O?Lr(JYjSlhSSx0CX*nFeME)7 zoI_1xso#Ej_j%K7Ve%T9wk~XpnQ!I!sx)Gs{xs@AZfA}YBYZ2P$BM)-Wk5CkWoQ-m@|51l# z>^a-OOM)a$avgp=L%>uZOgIi$0&b(jNI1^?|+JlIQ%U|`O!1qG>s$FHSUkYE@v@Avp;^+n~pA0f^Nt0?WS+)E}@D0a{Jku84skMr5 znJc{kOS>oD(UjULX{Yjo_xi4OI9-2fagz&-k91==c~9SKlwxt^qkG{YKXK`mg)Wa~d_lXH~YU{j0Mv$s98t zK#-bkY0p7mnU?=`{(H28pDf6=xia3N>0**=V8s7kP0Hs`^7f`P#qjkFs%KYfeZH|s z-MVL=+goo*mo~+N!N96xZ$t#I-y^o5Kcl9U+T;l1Tl9%11Yh{dacsw^_ zJB=eBCbOw{n-?Gt_}}_Xlpv3?e!nAkj2~k=x1KlMhW$noTs;5(<2%yWIz&}9I%%vz zMDc^1rGBcPnp?_!p`%8Ji7Vlkq8h|xq@8JAi8^g>0d`Gf$^#}NQ#F9kRiew)^@OJa z)+N2}+Mo!T_9!8Qe!;Z#v%T7VhdXf0p$l-@yE1VF0aPE4}J>Mjmww-i}aAaRfRPao6KYAk%)cb7?4m zfaf&FdDGz91&wn$o5T^6QaDYIUahjUcQ3WiMadYn_4Q zk5ur{M-ojLJ5{t=?vVJl!16{)&pgr=2Y@lxX9lGmA{ps$lmEZf6@mc!x>2~_Zv(wE^kAj8mOG67R9gOVIJ*7X zln$}FQhWlT^|dy5&VSeH{7z&)-w z=t!_CTK3xmRb|D@^k)omrXUc4T3eP_vqsRC(txwF>xPH(nyq=Zy44eb><>%SE?IH` z1A2n25m}N+1faQ(56z+2rX#d463Y0|WwNbWu)De{L_hs+I953Ab@cazFittxxC(N% zy+VK?>3ONA@qkFhwztL;LXj5^AqLR^5g!65GbU03FrlC5R*~8zP}NwV(cptC61=E` zk38bb_B|zZY42`B@D)Uati=KxMF(}@tEA003YAv)fA1NBphdYWdO<<8cBX|$E$H2* z6kR%W*BjRZ)M!PTpzUPp*mDf@i$*alv!1oMjlQwG_<=q zI+PWr$C3fAD*JOf1IQ`8vPfRPo^ZE4A(KZe%+su7!z*LZ7}H*yKgvkJKM%yu3o`5$vL#F; ze8vRBx1^{Gn}DeOO^C;g2d8C^?0I8ev6rGzBXCw`VY?9N!WI;qAIx-dB1t*#O;sgt zL~t+IO??oh$7(0f|Lpg!g7RM4a+xtZvJ(D=Z&m};iUzRadUH`n^jKvQcs?^!^$yU2 z_&q_U$ab zUJoQX>wlAj#bNsS`oV=Y#bj;Bn74Y5iC%%AX6){${uhqG=*G#>?w)w0Z#LWVD%_P| zuRAbV3>Qo26nb`*JGhC!g97dXdgXj=808SrQgt6DKiG(X750Q-8rL={w>Puv_JqVM zMg;bW1pw zzJ$dnx^#iL#YYvyUTmkFklz#xOzz5F%ikcZqUG6X8>JmEdN9M!7 zmKPt9fnq=oo>hu`rw+=l+$4G+vPc6FgPHHwSA* zT}W;r0%i$)YA9eiEMvB3|F+b9(bF2rS$zg{u#yt#`ys_?!HqFq1^7jF%AV@cP^jRc zM-jC&^2}~3*7!gjXpAGx zjR6~?dWN2JFP?&?1aHt65hQK5Cr{cKETM@M(Jy2MQ=A~gYd+F;gDmn(&=AR9kzFBp zV>`|rI77irT|gZ^ZASO@S?jN)F|Rg{XckC{h-!~-4acc#m3krTKe%(Sqx*&R^Q#*V zwHcM+(&rxY}Z^ zR#^aF0jbdteSTRQ&5x5G>Yk=W6p?AxEet))8i+Qp8j9tY-4t5Gj(68^wI;zUyXDC2 zG!K}a3f80xVEA^|lX#Q@7_mPJSQxh2R5jbkVN!lUTx`dd z^I<51BooU8JJ3v&qlnD~I-6Z75(#t5*9D0>8_%zA^2h5W!zy5wUyu+YMpTG>pXAK4 zus1~ZHkYVnsK7gXSdD^3nT+hoOKb#vaVTSy`2l-C%Pvt+R_HXOs9}UaiPj1fU~>6Y z7P2mLDklF+J5SbhD=rI;YC2tSFaq-#r+RZVL2X|7KJYNA#Ipo1pgqjc{yVhDdK?&}8kknmyB4d=IrLIDjf9O#Pp731Klxy!`7SuVS&6m^aFE1qLgX95_e_-~(2S4aw} zWnWU4C9{KVg^n8?!TdnmAgk1>b>eA7`nPw+!Q{=22)VZ>o06fy90FcG=W z*+z?e9ELUu?_0yR#eKoa;?eO#@n2bX`8KUDb8`nsfPs2IidmQw#I`$grv zlYv11M*5@}{Sk;8aI=NpS`ZRiy8hS~tIDC)R8d3s9x%|ZG!gm>(Fm-Y&m5yhpNlkM67C}~gWe!)9~~jh*4b2dhJc#Q;z;+Qhb;(TVP2|yT^6aA zWNX{Ue{&SB!8y{!63(YQz>!>J7voa-Bp90bLHP!UceumgQ+=9uH|6bR9^qE>F(Ux8 zS__t=O=+$bQs?cpknP*?02siA=rT%Bzg!Q3+L^=v_BF+d2w+xtsxf7Kl8uuiL#me85^$m#wc07XB{iGm z3iUAfhh3Hl2F#Z}KL=D@^jv~lPPK5#O%+&R?6y9}O>85Nqf|*HXvI(9eJ3I#yCO(R zMjm2&V($7n`i6s^-^{&jVenAZzsmaX(GCvwfbk33&SbT{)}>)ar9_c9kdjtF5)CY= z4I=e5EfW+T(x;jQzhhi6ecsbvKQF;8QAPT@;Sz#ML}xXA4$%e7*rQjN>KX>vXXNyH zIq;0hXUzcNWv7qqHk_SGIElVcsqeZi={5@Gq~&^Gjs}CIj?1;(k0P(qj!%e_fwp>d zL1jqEME;bVB5GF54#x`hlGNvjWAQ;#N9M@k{t0XYXP-D{a9=#_vMafsJ|7>OdLk71 zbP*>_@6p(r%#+k2i)!F7M9e78v*xgEY#_$EHD)A<=NYojfETH8qO@s8-f^hf_HC2W zh}h3>Gzw^Z`9Cp}JMJ>~;v(RhwX zyAN*|r`XA~a#16mI7*(akMm*sY22nZ(Fb>SvjqaEB{vb`wk+Za00;ARR z@kU-AWq1C4KSY%e<%-ZA!1+~;Hp9%t?T=weQrgG7C0;M7*@no3mT?dwMG~+Tv>L(j zzP+3`35wkC--}6&nwx|>rw4vCu)Wve(H&B*)>BJU9CB05c$Yf&&{69n&?2LE0=NNr z+R%Bpb>?Q{$jxv2&V*hfMOe|K#R29futwGD zENjX0Utir|A<6eA0c+Tiy>buoE8ZLL!a2W5qn6#pKGq+|QDVEy-RGGabKF)55B z!GUf#47!s`1V+)mglmRL$BYsXbnPTrG%<>^@^eLty!*-GfoZ9F;%ir`OrcsbiNzKw z^JmZR=U1JFU8Vw2Cb}34j(=$y7@1?i`?PU(C%dFx*tZ{*YjITV51&thn|!2FF>D=m?*lr8wx zYY6fHwkiyYD?+7a-5CUr)q?;LaAU(txi$CM)Q|HY*&d+kk~im#30>_N*4+Y4k!=l} z!!LO<%~NYSop6FK<1Vu&ckDfpPhZ7faPnm%jI#c&TPZ*X?ti*jPPRMQ`6BbZ^!Q7F z+PCIuA{Xe3jyvnNI1E}h)mhNadl!nJ8WhNMzp$wX06&6pqPUPqrYwWFX{YQNiRPpd zct2W*HaesZdgY z-g7PvypE{WnM|lP$33B<-BC?iAEgs9)?T7JQOI{&wjiL9c=#`b^r^jLG^+goXj`o} zkv}64EqZhK_q1Q_m-08_U;{-p3b;oYDxvbaTT8TTHuBJ9g&hJ$|LdqFJ09tsUN8o~ zW{GjTSDgsL)PWvHe>mVY%J|er1byPpIhD?3W(N;gsQQXliv`yFLz_(%c>#z_)`%aa zTe5r`ue57b^J-+K{T|!xRLOYr8#uVH)Vp>|>-5}O21$4CIRW39t!jBcRotU8)SPQc zHX8!?&zMdRoASuqHvq|l4@946rIc3US}vM+`e80l>jsw16k|e;^;wi*wL(>TcD=}L zzpi9rEPcN%sCJaSGPjd%+n~?q#U=UC-1)l#Rib6&AgL{I@3NN3L<+Y5@Zy#|y#@ND zaj5RS_)|U`3EB@xk@%w7pkIcVx0T)Ax95D}>!unUOS+AV^5a&Jn&|vyod5N#^5bM=&}FNDOsvaZhHa zN)N5DrLQQoJ^lPW{0p1%kBP}D@I6OHV+_?7t5g91DT=m$IAI$;lol`wZC1ztm_FId z$N~ynVjNhP4Tv?`G!*N*CqQbEb3AK4BnHd;C1ZCE9g5!Cmq~5_V>h-kU2H3u?BRWD zJH5*D{QyKH=B0i7Rm)aoe>Yrf@I_QuC*5~AC3dZelJVhygu&;*pxaFaeovy&j|G$) z(P%`N{^ELWBgrbDejJ1nI51_j!VniL!_|EZG)8&l5LQJctgL{!LzJaR{4~$BvZ)3r z{2sv@o15ldX$~^Uu0orGfLJTJYiHXhi&-FaK)=uv;PZvc{I`cbI;)z1lO2xeVhJn4 zM?9nj&!|O@7m>_<7*uq1u>@vnm{lFkP5-dxyXc5q;xdZ?^%lxWd2$n~2M{C6Pofcx zHwK}_VLplAwhouP0EstBV$_dGIsGymA^gzyBpI*hN2#^?i!NN=dD?`c>g zH)p2nnrx#jadoz2d2!Qin2S&fIG=T>xG~ejSZCC4the`e+2Q0+3@9Hv%_(TNrGWm` zFKJ}{`qJSr#Y*XRRR@luFgj-h^eb@+;FNOmUjGcyPf}Kx(n44(<_UYF4L<`5? zUx;9F53b79oC*i5c#Zcr`ko3Bl6~4h60c!@KP_LfAI0GwjfJ_bHTDh*KF;(dUKCNT z*auF=ZAjZbLI6MvM`=EnJ7Y7SwsDBgCV&v#(VUiiv!eu1zS~zgc~e$hbB>iZg5D#y zxP~fQ8~K9z^ko1Ub0;Z6ZVF>88QtqVbyOY^gMZ0#5j#@^ek7#D!Fk@Wrr6-^g*C%%U(v$?;pzB6GrOi=91&}gt^B8-l)T({tn?l5T3Kmp^xe}6A{Wzt3n1xUD0^#_5ms|B@XNfG z)6a(vakoOTwq;x4z^k}`L+iTgjX`7 z^S<~`({(AY#Gg9EP7ugQ?d+|gxXj%Q>$+BOWBti;S?bO2XnLHfYP|}AyI{43`XY`ClA`eM?Kmh8OXNH zIC?=zQwfwy(cJ8u!{6cQv8G05{Q>drKT5HS_I_fvg({}Eciqi+W9EiPwjF|@o1E_A zamxGMg2^WoY|UA^32I0eT&U%ev*SqF1E`wx zVG!1{r4&^(M^LVYZT0+%A3FxRIA>$24ya~}m?pma#)#CZdh2F8a1{S+iNNC(DZM~- zquFG&q4|5bQ%Mx8n1@hn+rZl>n-^24K$D$@(KB6JlZ2ZxY=>Ay(tDNvs;n8dWlM>k zCw3S|h)sY7h}Ag{8!A+cQGjQC`J(RZc`MBoRg(x;aFN|)S$>nLBzfip)IDr#=lJf- zoaUWkCV+d)!1ks{00L*Or1PgyGh*D16fpTh-uHH!wTxtk<2UyxebL8MOzd_2Q*rmny{DZ7@(Whz1d$8)Cwvz+wtc1^ z2?v){NEzX_!gE}s*^G(P18*hehO;38(qTio$7&Hat0d7#j&#K?Hym(2o68#Z@&m9S z-cVbse?xUzhL0(i3K_(X4}1DVHjNy&u8yAMyfUrr+PN}&V~9@%JFr{*&~&h|Hy}{4X#QYw=JFsTf6W{ytg8G`)dwq0Y#G|=+K3#Z zw=8!&i-!vV%&GWZ+EFk|^_I&T9jx4**<(e6{v+v+=6=9%e6aA>IP0Jh*FvoSromI}*7l#YhAI zjx792=l_Yx4L-6(VTkx03YajZstU?Z{tMeZtnh5ZG=3U)bji!|IvG_ZHn!ICF23=( zjn1PkbbhYq?}d!eJoT$%Wohkcz%nL>M_y_o<3TwArS>~LAwgH&SLZEHd^znIi{oj^ z)uAj6*}L3LMKj9n@Qgujf}VR^@Xn67>$PX8!C=Vj)Gc{X5JBDa;+n)(iH`jT$GiGA z(f~JWh%ug^o*|DNXaxBM-a-z>@Kxm!^S|Elr%QpK8-(eh0=oV3~{8QlYI-5v!r#ev&*cyC^qbIc0{> zDKNCIeUBq!l5PJ#f~dE?K{sdKTasnRWta26|C9V@)dC-2IBOBB-kN19TwvrOt?EMi zJ_!E*5V_u_Xn&fS=~d{X#*Y?O{47c~pC|UFS(Ru8PihI?g*y=oOZmz&kImy^E&xtz z4Zw}a&y$hj;jJ7~s#(UKr)7YuPkfo9NRD^eB2yZN| zj{xdggV1QrY0G2ERs@r$#}lj~UApup5c1Q)kyy*eL09Zqj0mmX%_hcTiXY0hUVmhRQ}%*5e@t)c zuTMOI;T8cwF{oVyoWco^5Qr}JPymWa7W;+=NQA3d>(U0F8olu(qnseKC>lVvarfP~ zuH-|b`tb|Xu^R3iANhEU$p-PvNG>kuTj3;g_tDr!gSZUAX+4}#%_j&H5V5jwYx5R_ zIV)9bM|zx?a=<10P1B{bTaOz(MgPz}gt7zS7v9uE%~Y|YeTe5wdghXu1jHY-s$!{2HO+3C2}^@s-XTE+j0yz_V2$m0q7 z(%A(rRs0OaOsKj%b~depDi=?YggCQ|S)M{?H~5)^owg6>TJ(vS`{EV$t+BZs*S zVdzht29VlEV9BCA@PQ`Rh%>e}-j8bc`uH`9V4R$wUD4KLOb`;O?$(j&EZ>G*4m8 zh?x5^1dq74230kt)y-CgvlREnVpe@*Y7eKPn%+{y)c*&|LOWO1>Vcg6-*ab{~Xy`oio#phqOCH4^ z6!Npip1h250{_s;?zKSgxdCU?X&e&Ne2CGY>Qsd!PdOS7nl?EyeH;EgQj90#iubFW z5}m1-OEiWhu2fSf!RNz}2{5Y86i_~aWRlh$> zSrNFL?2l}<(Yt&N{p8S>GLkP<$|Lk$<(AyxDM%~BLRa}Z^VGAGbCTE94rT6#aQfuV}_z zT};=I7Kr)4_)jHjFjp|5tlp$!^xJ zivXzc(t)Jt--b8zs!m3+o6&Os~EfO zWH+aUv)E1PVa|%1dgY(8?yrp!Uw^W6{hbLQVEL`MyWf!oP>RmZ`~vj26f);Ve(-Fm zL$gX3I*FGBRAmeye4$0$N71>=JK{<(l(3HR~L?&EgH6c+}v|~kPGCS2abI|pLqAmK^JGs zl2BTgHJbX8jBW3a;MQSn*NbfIbj+xyrOqsL-3IImoB@J=S;8nKZ zQ1M6M87{l;xZ!>XIQO+KMbGqrmqC1NY~q8n?f62Xw>wi8z}4Llg4^!O<~Dr9s}nm7 zR7A-!s(43P=T_8&C>!wO9uoJUpEl&r`SGCS>fC9ExGGFE&@5Zw{tH3ze75soorUjR{?96-u2z35A--d@K?&~@xX*v#KdE3 z^oQ#Sjo)dfpDATOMx;=;i!^_?z1_-BPa;@@?113PB1y~fvWUff7YZ}81dzZc5ry6S z*ME>GL~G7`0FDb#%YxJeKclnSIXoSBWB>#$G1+W>j6dGmVuK&T*q|`Dk*oo|kW%{b zI5mq?jn%@?t;6T%G$UmWol?GxOG~7RXn%`bxl*SS1sq`i@CT;N^8yEdEB>G3RghWt zv1s(2{3}GxLXl#cZCqi84~TA1@1k>QH)!lCh(=BM%Q0k0x(4`4$UMs>5D32Irh~!> ztP-gocq{&ul)ot2MVuz)$VZlX#()4mma0l;&f4eHizUP=oYC>etW!&h#;ENzv^Q=C zG{(mV*m zAnd$*22ZuLuzJk0!tEe@)DE#Y{co$}fv&>*=i|${IsxRhif_Vwsy9kCEtDsy23oQB z3`#(M6l1EjcsAu9{=o>?kqfE`#7pYchm@(U`l1nxZUoGT`%DQYX?#`qb~M7kub29C z3=-Wyh4*oQ-q`2sHf~gXvcjHs?Ce9j+gzCi1oGy31g64}>ZHHKnnUWL6B_u}%^J61 z+ahw1sfyey0Uf~1aR1skfQVk{j@RB3&{t22vt2%6&&U|9P}D#9Q3_I>U!#n|SLE|3 zk=MjGwF-Pj?tKSRI+OiNY7E|@Pu@~xjtX{*6}v1CsCK|*cmtagYiMR4wB{>FI$xCs zdLld&;r+v$BV8Y{p}^jw{|lUOY%wGrp(~6Z$(xiqDtG|H%hWHQ2!wzs!m%nl>1uxQ zzY-HP(xHJ4`j8LgEuXD6z)YaEvkq2(BS##?M6vxrG%@=7wu4jhkl7Ekb$CF-;&| zCg}!h7NVKKcbK!J=eZ=P*>MJr=x=o;QFa zAS|aL^?Aiur99pX7-9h$5jFC2RQ7Sl5*f0Gue02>|EL>^3SwV zju_ZUr;W!#8l`a5V1H`qD3rbgZV)a=y)F*Y2-;_>1xv`z7N%%GRp^x%!auBgU)Fet zOk~-3V)MHelc79`Q9XjdLws8dh^F#Y)Z)WfO?sYRY@ckk+Oz9?*<5!n6a`$oe9a+9 zu3*$1O|z6xmgXZSFgCOr$9@&@%{WoyYq^^6=UXa6^n~0ku9Y`|fYinNC5o}6I=jD* z^|^DKmVq$ceCATvAc^nxP7YG#oL*%_7CDJLvd5CZu`v{cI+~F&E9}1!OGN*M@o%jk- zN$^UTU%9SBQQ*_B;1s{%7$=Ng5*(j%Q#m(^lzt@m1=IAlD))oPfHEaOX5@ z6N|RrWYEF7&qgv7G$nQ;fFMk8!O??^-dN5~Q($|M_^SopU_!|>#)1P7d|Xk+`?G8D zu!pQA&SHq;BcsDo;t$zc6ck%u=>h)vd%K&BZdrfZU;~?5GX?#6l+=CJA2pnd%7#a( z_uFOATe2_i>^cV%jZ{7h;u`_Ep784aN}#12PwGDK`l z@LGOCo1Rn@E*YZ6&}M(>qmr{fMIhZCAnlaCOknJY4dMWHgNYER#%h_i*(&`aoFeiZD!j9R&7ij;5?hg8 zHG!~8%ttFos2lQgArzrAx}d6E;h=+(Ybbx+IC4?Mx7b1pZ63pUyBxrgoPq7^!I^#L)NnK4G z0@)i8xr_=Y(^iCY-FOyUU8sdA2;0crnsxnDONpxihZBs!YUe zL@Kv~^1P>cVwGtH5zviN)E%JrSzR8X*p}8Elf^vY4XG$0>cA8sR~xy3X|BlUNjFyz zUYEHU1Ic@;DKW*`RKt570t(|s$Y(e$8Dzz8*35V@w}%4&De`9IIRhb@`lWUUI$FKO zM}ai$h%)qp?h;*aS94|xB33n0dFKc51_yxI6|KsEuk5G|3MA-a_H^7h8MwKkdIsX%Kk0`Vg}MER_1hN7w?&{4L`JES zdih32$#fMp$>RVO6QqO|T2X**FEx9oBFwDH2FJHKT#@a8TxvB~lni1geSrs(akx$Y zCpk*Gj4ZhkRb!ms`mY5r)xL(ozRuT|eu$d6<0`wLB}sdLXSprmsK!%wTd=oV(S&Dh zJh;s(!!}$DtCya*gvlarW}k{Drd5T-#2}hzue8Ip$dtvgqfqRIpJLsB?G=h7M7Gm@ z=SaIAeh9k3vZXIVpL5Cdfv$EcX+pF5LOv7nT%JygYiNWR_1?#<$9oL7g%qs`g?&pE zTVwK}qPe}~L3qMf6(s2r2DhePEAf=5TYR8;R0zYal@A197g6H0Gj9aD@b8Hiy?y}% zbciQ|Q%Sh`ofpBa^wCOdVQg&Nx8Fb17kQn_{J?=>BtTTH03gl*XH!^>kUTU!v_=DD zC&48h=KhuWXZp?ZgMD4k2^1t?V(z?J*%AxFnawpUgT;m-`EOiYiO<97z1f&20(A|& zg(-u){AkMNM?{|2d)FR-xstGbh`$Yu<=@A1jc!zrA3C2?v_&W!>ojjMo+ngAZ(cLu zt{qf;+)pk$&yePTNnv-ZjlVW4aMFqXjV52&2AaZYO88do=dg?q)7%mETdZo4%p^L>#d>m z#5>FuyJpN0YCJF0bSH@MMA@OKEwcjJ#=CE#qR0fv9}AiMm$Q8ueqQl-ncvSM8HcnP z^L>nczXb4Wm(s~YUowrhjDrM_ZD`ia%hQx(#XjHY@-GwmS^{wp7kpbY_xGoLIfW=Z zq4Ay4aQKycPH2E6ekllQiePOVe^B!8jX@JFaYPu8oXDO`h?+@_e*k~ACb2lA+n2M+ zxBh^!{6Y@J0FBEk&yP{pD={~ct~DkWY9b8_*&N%{iD=#-4whg|@61Xz-EpHNm4yrtX3QdrgOhW5!Xux>3R}@fmEs5C!h6Y=Iqj*mJPe)wQtI(H_YhZHN|eT z#AJT_k8!FCQ2>aPs(642&DL~?B|e{4{F5OrnLd#!AQO4IK*g7Q{5A*4EKw_G#DgDQ z>heSIaG2`zex9mSckn1Va!~jCNS-G>w5FeI#C?%H=nn# z-~U_MPb?dFAa=D4K*&;U`sNQTL8I(!IJP0$))}5N9vB}-#`%YsJWbqD;8V$h<^NAD ziu%@I+Z$3EKamhm%f1eb0?w4k+IwnV`iyx@>^q?y)2WPNs4XB1DR#rF#Kr1DQmU&A zz7%OGS6x*cHV9ex)47KC!8_!O`(krM$WbT0+H-t8<0~GT&gH&zVbm_=nc{ez79~|~ ze{}a5TT;vTfM=_Sqs%ROkWv&LvFB29~e_-3#pF*9LF^m z$p>cY+f1IqKu{BN>Q;iweL6-WLkjEy+w|AV>0%{Ool^-)7(Cc}B@O@96{R$t!a>eg z|FSxPu4Ld7eLxt#vj52e-h zRUgV0ZMhNVOe$XMR2iS@Y`ahwpRE0Ek1qM{Dm`T@OKnzoV~&^NH>!m}^qg{Bx9cS- zVsRww9w2<3R;5767^L#FLkuip-OxJpKxE1UU6N!rInSP=!)^F+o0Q>FgJGD^I_aq| zlM<+AJjAAkxG>(yrW{fn+CNrdfLM3)@EI;vZ0Qc)A4k|OL z*kg^qCT{E%+j`nNsW1Qea)nZ>7HA+KQJ8+9?T zNx<)c4YMs=itO3)7Da+ia~E3@n3~S-xad!a609WmNk~<(MLRcJdf?sRkd6$Cn$$H_DSqQOh@A{Ty08H z``3T2oF4&OaIMh)4r;k+^ zw6tH_HqGA#&)?;xIA7Msl=PJUf|<ka?24r*22*xucJDwOy>p)ry=BIWt^-;Q6LduP!mn zMjao2`RTPNav)*d-th^ZY>6!cHN{l~WXgnA;l{J}TJWY)Q#>=1Z)?r8!ISs8Q_q2( zRkw%`;=q--g|Ju~>H>T8v*xJWgE28kan3w(nNI$DZYx9dk|y81M;9ASUatS=BKcj< z)rQa8dkEux!{PIL!!s8TE)>$tA(X%#vjnpc?wEQvp3;}JF_kWAXVSkC9IaAapsfaQ zGeQ-4zqx4WP55X|w&MoO0A$0BDp@)(l^xjs{fCUpsz2U?%>e(W3B|{}^lOyaa$}+V zqw8k{m&=AXzF^AL=`^K+Ehsh0QCeWHRHyh9y81^QbnaOs<8DWG&qC{&1Wr5Zsjs zJz(PYKzQlKRzg@%DU&*}8S!a-1z#4mav-Jw++*v~Iq@MhQb!w@Kk{+`ITNN)i)V-0 z9V(kVovi_%l2DG|1?eSdt*q?@*r?ob((1}6#|~&oeMJ~L5$@!c5rrN)cJo*lLJs}67|J?g>f~xQmg4X}l5(ly5 zS-_XVWZaLRk5!9T#C&C-o~4dzC|^^U--%V>pAcdWcL9vjNv>#%N-AFe!rLkwaDi|g z8NRv|aX30boIsn{^H?@q0-Hu?EPn+{_ zUt0_87gDVw-gq5OC~FkjpxN*ZFKqT9c>I0hR^)4KZ+oKp1`S#b1#U*o1j=70dQ%i@ zDH(q2O~Akg=8QL$Cpnyl9RrXlyP1?n60SLhxU$jx5(qe9xEr_^d|alYbDM*aThaY6 z34{V8EA5#vln6SRjl^CJ+AY&eHV7(wK|o@+8Ai#~1WRoicUPu;^W5){Z|8-p4cCvL@t| z-b*Bs=)1+otcBg;5j@r&e~E5nrAp?xlB}fK^R9NBCY+G8QU@vE?*Ks4#;{&8-dpQm zb;fWxiXwQfLCxvYJ!+|e?dg~3nI>b&q8w5+H=VU1KNOZ8w_kCkGcVQ^f9*}^cAExM zsyDu}CIZYxtQvD6iCQarEg5M^o-z)!7EhM9$V}l67F@@vs!=86`)jegoi1&q8X?Nx z{-K@%@UG^75Y@kxWFmFXyQcdS6z2%vq1cj&3_x{)X@YL0#7gqQP+dLdn%|m|Ax&bA zt}`}-7E-R31x@gPQy32cWe0)^kCeM2r5ug7NfigZUcpMD2;*sXe$iT{<^q_k=B9oU zt{4Gfgru~N^yYRB_wh_hN~j%X1_!v*C_^*PMODBAWY`5Y5CMR_`{r;R5|4X{0(DNxBmBAyRRk?Yw)B*Ym4 zoy7DQA;HO15=q~VFqnrAi|GylR@nmUMhyNBp*ks3bv$mqF3YILyEGYE^9RHG+q3~C z8AFrbsIAQ0N(A;WGl{H>ty4m1(HY;F3mx-&Us4`HA55gEc?Qy{rgVHoF4fqx_=mFs zI%2h`%tp9bzO*7dkhGAEO7lF1&yYo(94W3Zoy$y95$_o_4){Yu_QDIP_?H0nB&KC5 zho;*M7E-1pR<>n9`X5=wizf+D?tdSj?COK_CT=`4>j<|iX2w|eb@1eSMFr+tv`xn{ znNVO@H>ID`b#nia);}}FhLS_|@*b2`qWokin=~nO{kYn?e~;M`x4SRfx8&rhrlaBg zCjg&-4?;wfmHac5z;+bPiYkY+Ea$wuB}=QTWfg5>Zn=HMjYh;jul*TWP&t5$P^+-T z{&6;@$Nznn$3yJ__~DB6Y(GS~x44mFb+&UWnLkEj%QY$Imst6kYwwp6pm<9q^fp@| z3CGvLBfd%oeuo!T`0`$RHE1_f3V-%M5<9$1_R_-}05xbk#6kB_%OW6UQ?T%@qpeU* z7T{v|pu3k&W$DE{x7ld5glY-s-^T~0am=>(H_X{O-|k5%6d>yC8JUJ))Oq*thYw%x zCXz`vYn&fb-?%#vo5^BSw@@M*;8QFNC?))7Ko^8_62wVkAySzUS?tgXXc5GdDfA*F zlS*s-iAI+%_jKbU&ke!@ruGml^ z$$axRy4qw~3o$c@L((!$PFFrlSNp66O9`NEULzv2U07xZ#N2Y5g=VeHaX z*W-a8Qc)dEk3Q!lt6*Bx)9ltBQKztvJPZX#1wDb}mOq=BEd?m^&Tu9jE(J~f$I-$i ztNe(Gj~4!VY2z>;hsbtBWOq0U%A#k5FDl0se3n;rcXdmE-YS@NXUIsj?}?Yx(DiXYe!vr3k&^t?}!u0DwY7uV0<$?4cIa8^1fgB(6)#a+<_lQuv2Eg~u++N8c| z4+u?RI^#_t-Nzd19=mw^%=GoOP8t==9l+|kqae*kv0}`?o58z7VzNv zYr?`lw^ZUGdyX>z{p9S+td;K^2My3##u!_i$pwo3tRv0P`z zOG*Fcd%>*N4B5DJ5jQbt`j;%MGMr86UH_Ol zg`Jy}QPFCpcNu$qiGRhS1yig5ML@d0r^IzF-K$LsJ(EQ=@zvq|OXQaS!@_57s)^2T z#hAUWZF5wwbicYqnAHdG#VaE=3|HTyg8eP_5-8vyC~0$Z;+lUYLe# zY+4%>q}4Ri1W==Me5Bo2^3_THdVv8D&Bm1W+bEyra6nmPebt+5*+TZ5& z?qAR}8Xu5*10Et`!;-&zxabV%PC5iUD5uAz3%8Dg#yAxymQV4{4a1GGZDl=UNOMb~Q&O-;gHzT7g!&*8#7yne44l>^DjZh-O~E5Dm_g;vg?3#saA^Hf zicJPb|G`l#^296V42yG+0FmlCb(e#C(+eVGO+(HgkS4?GuLOI16?dZhB+A2Gngj{u z9^(HP_wz|Amzeog)uFB;raCu~z{RRWTuAU8X_}a0965d(%oB)A@#s3dR>-KDgQ@vR zsq8`{u@0%Ht|1pprqwIsPj9U2pgX8=&78sRp$mEQqBH)eMyQu{=4y_jPkz0Mm^l6X zt;`aC-+jj%Z9kG-SE0o%Rnu|7TkkJ}^25i{9N?Rh{oa5|3wd1u?|*}>JY$|va#}G= z7kaXhIGLzf$etMD!aSHY&DB0{y&Kq*NV+}nomB^PEo&H+DO7){$mz%yMa?XN@-M7^ zbpgLqL3idw9)7yUwt-R(4O3D1aL1Kn1n#{#UoK4jH%?DFv(jIFt|okEkIE%e^BobD z`~GuSzr$)Z+)Bb?XYTismp>H=xidO+5?lgwOrx{Cd!f@o$eyii zCAM6WC3X}GEg<@(Yi-XGBwk&a4$?qoT!19vZ5?-g_KKo<*ny)SQamf+7 zarLyw7*qL2I_9duC(CVVHq9A>GiU)e8Wo1reBMobxZ6+9W(@*zK`@NB^$Zk?ujwk^ zI{W5)-{&UyR7gXUIhxJU_?2mI6U``Ij9vuv=`mA0>Yk+tTrNe+og)I3l~nIYIjh`D zw;d)sOHj*rW?_^$*d!!LRLgFCPG*5hdjE2>rg4RyF1mjfY~8QEN3;VLBcftxNdzvv zW9|4m$|0I~MH1cm1Detg-|HGkk7x(xm=VLq{jF=3eO`JX0rnrkf?Gr%)q>G#{A_0- z)_n4i@01a)xHxWOGN2D=X8R|)yKCgnKWV&%c`feHRQ^Obb27g^l($g<_%)P zH%4IVuiD$O7M>TWk>RDl4UTB24j^!MOhpYzN>+fEy|*xC)TNO&vH|*^kppv#ef|^L zDxB#VcXiT89Z~V5-I(VvmTDJ~o8Q+;#n=DpzzI-3q>&!Fv+iCskO5!KD4;0I7s+59yVFyc9FCUEU-I%K#+H{&8oZn zCchegc+6*H93THtIW(Kb5~Srcdc;q_qht_77K-w(_g zsJv#wN9)|Eg}b16%DIDyWnxch1@TdVXA=j^xOH_-4#$eKVAGI0yCS{Jb8$||(mm6c z>x8gQR1{H$06;mXDA(~;1rNTD=R*oG9RADeU3#ENi%8LBs$*<)e4KVN-dD~ruT_`1 z`_^Ex$HZ5hBF=M0FMdO@b-O6gv`Klf9OH?V$v#9Iu> zBdw84OgH83aBv>*&chZ*^DdQgbfJ?0sSjd(gbX&q6poYaGxG=dwYuZ28<>YxZl%Xp zcgJ6zYGvw+X2(C0GJV2YyTGx6dg6Ze&+kUJ8UW_Kc_ooRt))}8fw!<7?Ie~ANVLyTxY+;SV5hk1b#n#7g_U&lZF z*dd2L9L>K5?Jc4j9UrU@^lg?4So$TG*1{~yY=$ZUBR0TQ`E@A;Rc?J%1l2HjnOOfh zO>}XIlX=gf-c27gjIpgCvHt0>p8|>y5*BNpWACNQMh4wh-x}#k9D5v9AKsESCEi`n zH(5$!-X=@Dv26c7zA6K4MZ4h@QHtl89$nxo)()gTIAj98F2;Tr-c7;>S6a6-~vwYt5CGILVj)(_xE7c%?UDJfW5kpjNH}e-^F5 zM{b{FQ0c|wsY5ljy`Da(BvC23;>p20K&K|?&TU)gY6NzNDt!fe&6XMP>}@C!f-3Ue z1!ZrEf~>2u38cmQp+dl4^XJqxQ|e--p?@T8bl_FO9Sx-%jYCf&4J=>1>w zNLaXuceXhMH+2?4kJuO+Ud}!mk_yWV0?+8A8}T6dAk=IEz8@p%xRe7abvkX@wX!vw z#$*V3CSEa#eIRhj&HF#r@w*v+hDg?f|pBv7!2EMxs#6 zj)m{|s=oPV+mYF4wZCBCe6xflXWCmi`wCPqsJMTa>)?Ko9jYZ`Kl?GDdn87k-#)1R zh;vifr`qGrIT@niFEtn0i%%2UO!Yi<)J#_yVL;G8)9< z@_g0dhMP)A#{G~LUcLU%z#VSNUpE}=^LnWk$?}3#;;BkcWWd7`IB*7dRBZa=FNU% ztD}IFurGxxodA#5!)27oYtw7pYzPPE zsS+UM`h_+2CjB`wa8j#M!K=1T`>ZvTf7yFLz2Ig9NtdlW>HQB%B;DP*_&}K|f5jBwFvP){;{UxTRMODO&y zQ0aZ{8R3XpH_GZGO)m3~(S;#{b)G*F46B!xYbRA9i~ufl&hy3a+`>dD*j1E64K zy&4H&sp-f*mZOk7Sy>}$o61EpEeO>m*IC~RBD_@QNCrPvi7?8f>gL;52&g8%Us)CBO-!N*1lwWqopHmU7lFG?{i#fN4Pqyd@}`)$rim_T=93HcFs}D}>2Iv8 zI^g_{UldLTDvL@^U*pBg?`8Rs`82X)m-T*szF&*#tU6F%_wFrTAw0B50T(Ah-keF> z)&-WtfT!Ex8N2l>c^P&4o(mCdJa~JC4zF(>)nABU`qPae(MFWsv|u*5!0uGy+`NHx z1`hv_ev+E_R6Ku6=Bnozofd8o;U#@cB*Q6|3w{>I`y&Wt+Eed3tYH>YXERf@lB>!+ zvc$+zF>c4Z^xj(8s7;;_2k(dpkXlZsTsC86`(-2reA1ugwFF$!?xUP&ENoM4an1eX z!W~AkE6uDXx?U$!t0-B*LUoyqalH&?Fp@e!yP{5?H+VWbdZHhW&h)~wtF zOc?bM5Uc7hMIy9H*$QVR7Ae(%NYX_FOD-p>*XjOc?6XXXy&Aow1ONxhq20avh*_euuTp)wF`G!ZynyIP$;J#3FfU-}4?kD;4?Qbr)T=VYCb)Q{J^0~> z3|%}sWY&BRS*m39C%fuRM7W0H*`_>t@aO%?smp0``YS>cCG5yVz0 z?aWv!#1?I>tPQp)DuN4!Dm+Qic_l;@e$TgH{+E~or~}Z%S!tpQ8eR(02E}d7&h~pi zsMqRuIe9=ECA+^~2}5|19o}NUyk#8fWk(FtqQd-xdH$t^#=Ku$K1AjldAW4J{WY*? zyk+|}Bmdp=7(1T>RW6Z1bDJ*93?8zETa^1N?>c6b(v3tUGkpt8u)5S1gR0Yk`Z8by zWI*>iz)7CSO_X%`8(K=M|IqFFwlw^kQFlN=!m_YUsVG*IE)i3LZa!JHnuxKz1QtEsB11=X|jE2(bg^9h*m-V zUkQzp$M3Xx&@!t08ydv`F+!qX?H`(s;T-b|Wu7OK7knjxpbKd42Ql%lKs4WSq$I8i zwu#q%MZcPN6L3Y-N;qBH&SR*Yl$8STH-M4$6(b6Fg1eRRX8nIDi1jB{C%=^lpaMWb z4jRCrLlDB|WtP*YXMN)l_~M(5H+CyjV|2urS-fLSQM7>3~H0unZ%`n5>O)LnPrd51B2I_BHYBbw|kYu;L94 z?GrjCo6MJii!)3GBxdqYaFRc=t+Z@W2UOuR?n`Nr=QDa6EFBu#pGwg=IHc8rOn_9MstJsswr6<1tDHL<3-u^i z%Lt0L3y(O?50*-jh%lu$1L8ql{n#X$VZR?YpXFzv1Sr%rVi`_CD8Z`3~ zjWU$#9AWb(>2uuhQQ+iR&k!vS9Sf!?SMdWw1O-K^HE;3jSgGABGH*2}pi;8@3HQ0! z%nJGeW_}^|g`0+mg06x*>q^qH#i#&5ST00oTAr{A6DcIBOqW$)Fh!tY_W)8(ieKYR zI2TzNJt}?YD8Ho$T#U=_365IuaRZ9EE-FaCz>e049YhP`<#tEgXg4R!OS>Y_hV{6s+MvH1Y*uK>QHW`OC}TN5P5Zal>~4qO?3a|*#9rF z(`!@dN=fZwx$OC2QfPMU^B{cq26kMc``n;-==*4GI^p&`UB8$f%wZ=Mti-T7(AHB- z;%b(S&!0h-)@2e-5{p*O8(WZAk~2Os3Md}`ZCCv2maKx(PL@`AW`^ zEii1_NEt+g&87b6J*&}#aX<1*O2*sO7)*c@WEu)UBpm%P=K$?zwTU|UalC3RQ2bf? zYoxfSz6K!Si@l`lFXqjzw~CpDSIh0~Gk*omu+ezKm|&fbF)W4!i?jvEZ}Yk`lvGib z4LwboRff~*vVcOQ*#xy_6C!T}!}Xqbc7dP7x)}5!e~2oIs$^1u4mPUEzWHH+7ZM>w zJgzfqfkp%Q0N>bdnXycgoeuPZ3Bca&*JL29P}_9E%9eRTNWN|8Xs8J7WzYaaGYtu) zAR{$LRTM{Fd!pczX+#F=WchAAicu;S8F-;22=3^oB^*eTKe0{)I4tx(*FQSFG%}CX zf$F^fKcg^V!k2*TPR#I?&B%lHNJh@$MG#Bj4>nE&dywR=tj@NLnlN%~1h%uagFpP? z6`z@D&%(rDwar4B+wZ5ShE+G_{M^^MQqr~KSEehfbeXyU`~SRIIRiE}4_MtQ>Oyb`slS=K%GqgFB*uJ`(d7Kz+f{HHaA>{@n*7|l4|}(oUx_9 zL~jMxPSvi{#Ii9w0;Rlel9$|du|n2)>$Be>zBrKKBb3hRUjOx0anQ+Fq@TF_3-}P# zqZ}|mP)ybOZwc(~1v*>i>EO;^^PeMXg-L|hH8%@kFJ~*iB`OdIngDr88mg0Ims2D0 z#tC`qBmIv^Oec*-rGFBPKIwuw^Z*;-*DmCcIKRvcqEd<{lEW_!nYiipm3~S$(OCux z*y6Yky7t0CBJ-{@X~Qvq*-ClaxI2b^Y{WC_TjMxl5G5Ni4U0nTREMO|?vR?Tx&yL-F!xK0x|l4gwpsxUZ- z7|Ka-Kn4#`r$XhUJaYhsv%xU#)Bogb$jk|B4-vnT*=iQlEwS{Kr3YmQVGR2atO|y z&7_AO$6jai5qdSUlH%nkj{xA&cuK-vjxL z#Ols+!WFJI4*edexnLziQoaAXQHmcQIx4g0t{P`|7bq$^&z%Z$)cwyH?o&s#V2i`i zaUIizpvWs>%{N=AGi?*0v&Nufu#Ew95kVr`-fU868o@{k6CG zQtuDNu_*q-XOO_BstbEO#G1bPkS<$B@)}O)P&c;Qw)hHG8kdc0msO1-2T8Mv>`V8& z9kz5fxcC%b^mtFpXcMZ~yYOdg(b`u%!$Of{&^>{MF1>~1)?gop!SEb|=SJ=5O~~WO zWb?6sMuU+sc>VU`1(jm~i~60EeS-yw4@Hxaahvpg3A(a2C9YdH+%Vl61(a$wx1xGz znij=AO}57w81qmx#fu2EZci+s;u$WZ{!Tw?)5kt~hUZ4qy%irufjPqObTGuIaHD0A z65S@6soqq4J8Im(?~Y!*az~m)yeg4hznr4HLjHv1OPXjyWwv`Y&CZ>`8HNwX%jzNO z$7qVWc+30B`0TYb^%YurZ=fj#-O|E)7qbq)leLg-un_-%+)B&8-+P++69lo6kQl^R zMV1v+Y*V>BOxH{$sr;Tst+qWz{MlY~6pQg}`jE#h@?t(wU$N+8yt=HtYOMSl;Tyo( z(UHss0v_L`aZ`MS0IezKpVT>b*AYif`vRX#wdMvOzyZ&I4aF*lZ|db8u~_aTHVNMH0}t5hKE);Lp)F1NiHEM@XW@*9sf2YigVbf&62X*~JqBBL- zk#;r^@C6j2T{MJFn+R$0eDUNdCX>|^u#9+kpT98$t}6YeBg*H4@=?dK zfkye4;eCb1L%z>eO%c9ig0$^m3;llngQtC}KB>UQbcUV4BmwXy`8LS4p{4WQ0Gy?~ zoOcPr7acT-Zo`i6E5KYNQ%gs!?b(4zM_6x`4i~(rSph zEa*=lSZn*$8(HdTltr-xarA66{lUd644mnwe*3znbs@*4D%1{PyyW2Uh$Ql!k9M=5 z-h7qP^_qm6UzqqaQ0{Pspxm3;wdGAD;f*+glmZ3Bye5E~B9`uSm%d`n4sHRD;v1U2 z3r1*#Yf$6I6MLup67XJ{AIs`0W0DS6O2aY5VoI4MyaUjc&0<2FS`DRU(?g@R&f5CN zaLyR;P)698YA_+Yn)V2^u&APi&AtDcd9K~JHHY~)^EW+^X)1fYBPOM4A%SN3!5?lk zbnIUdLZKmp+YiUVnH0>JLb!#IazIku7#1VP{r796zngn=eq!JefmxH z|33=`B(iR6QShryjX!TPPd}Q;<$(wQ+j8PNEkEGl3u1&UCuyd(y4KH{M0G#r&&>N=0+U8xoD&J z?ebsyGJ=fCDW<2#TnlF7H+p_XnG4{Sg_%3fyH$w6fpk3hHb@2m--41>wK&mJs1c z=)@)FNbuMNwpD!iHUw)MUTuwaUOolDMckJ8V-qR%+AZuzidKO-SLT&@s~nw4Zu(8Q zJN_TN5Z$96_J}27XI$rO$s$yG>pUJ*1A(OSJ7))2+Xw(eOSGVaSJ<_T;BsAB1qB=QKGbD{h zKTDh^*?-J=X1%ET=7Q^7%^bYewRLSU+StZGIEOdd?V`(vT|Jm$d{gUpeau0MBJ*v? zAH9IBLz?-|;R?}XqBJ?;Hb^ry;absivVW6K#PnQX3rHo1F)T-_Kg@4X6edVUKn^s_ z@;bBS``HUI?LFnQ8|(v3~midcOt2%LxTMat`Uo!AiX8$Imi z-`aStcF0U5JDIL#=Fk3`W>Yu`F&`h@#I9O^F9o2bTWBB-l=KCw4X*wI<^nJI&p2?sjXB;jUX94`&6>EgQs_-(ZBGJ&Uv}1>eD$dti08F+J%nPnwU1 zDCHLh0c7}4jt}I+#2DcIbg>bw&UcZ^F5$}(N&Cd}?JBGLm5R}`*dG|8w`rh0dAGJEYx;kGY{Wu zqzy{3zF1D|4eH8mV56J#Ata@tf7y0Kq3P=Dx0h)11QAOqlri3x`DplA7KqaWbT~DY z#l2U*VUP*wr^K`SRd`TLy37;4zIjVa{E<;wNMnSdp%?p*)39*ZWsyiNo{WtWEKks3 zn0^|UFEc+n!qzQprv0c1=kGxy(kx4ujS|n&HOlhQlU$p0)7QU5MgDFlp7B*EAm(1u z{eSO?O3 z+47Sl*Z4M*rrrGrz~aKjwO^xn|1810&fK&{&c*Fk7}infLIk6F*+RA50AOV*x1kjk3q-EXDJDQ zj1m*2Citt#fhK4?sqd9cDU__E3NDm3WO%K;3iKlfr3XSk&9J}7Yl`Fp$mY6KVimhv+Cu?m>zybj`Y%ujBKJ4xSULyn;W@jzQ7GbXt8j;!$N=@} zSZz?&;LaXQJ@I_EmgW--|J6ov3}0JGmG;@Htl}-reVqha*l~5igJ%oqU-_Q0&~^LU zj*;o840qfs(fvaF@zB@F2fmJYBF(&> zBN|1$^?{AEG4!T9dtRD-{P>dG%jJg_FgU=yz94WmsVcRUE2sf2gwqY;tYGH&L#tPm@mXHQ(hf$zmA1m&8v-9{|%FFw+)11DAp~9(Dl^yD7yhU@k zjSjpRbZ#?-S()J6Qq|~>wm{tX5bXP8gFHyO&0=v#`)6I~5BVRF?acoo20mM1Yk-&l zxniyb6OVwg_TT+i+Y~I`9hfVDC*R%jHpgwYW0Kpgxh$(V#Z>?9+Fz4G6~L{4lMJrS zc8v1wK`uzYWcaPkzR5HEkGxE2TWHmr#QD4`UA)Hnnced^ViY8dYH9S!g@hcidZ=b- z=aLpv?1U52%Z4&pxYU$nJWgta@@N&Tw`<7*7^s7Puzozg&%p zlnsjCBxNJMkVoA)1c5u(;r0lEfxm3^xr7LaHh)PqD%!dZP_xp6iGJ$Jr8+_Q*0?UL zssVAnE#Y~NLvtOn;SJnV+h<|e7(SHVnRUIxn-(5c7a|%l9(hQ{b(KfRsTS$5Y_e{U z*v&u`W~z8*334<(3w|JyR_<$L2C}`h8-cp?w9fEk^ZEK55l_wncThX~3e(h**5Fnh zdCKj0hm9eZx_b=JWv>n?y+<}0#K6#sRl;*Z^5UcAM=|)Ox=xk)C!pS}TTp;JE$iko z)WF8h!}1e|nkkD8tB&N20$TkmW68!0M{ohzD{IuT89125L$#f=xA)Zl3y_cCEd;|~ zmfxW3&vA2kG1CU` zpR|PoWpFch8|R1 zedK_;eZ2ztGHAo>r=}3_8Dy%qGH3+Nfe{9HWDm!kwJ+I&cw5clG#paF>ZGW382IYX zxjqqftdQq^K?G)_-DAB{gU6-DE0%@DGj6=Z9tz9=Z4C!XR_ z>09zoEf?H>kp;N{O3e6uqYr#AF*1M_M^moDzD}hpukw%6>1TsN6Gg-c((SpzLDLklx2j z7%l`j8gr~Q-FN6=A~!lENdro)qGx&#GieWAxDB)cvvd`9Fmxs{P3jHa7+leqU(RI#Go&m6SR#5nSo7)X zL_G;ZDRSHT#wZaGe28%#_w(NJVhVr|s zGj&yPJ9LE$KqlTiE05;tA7c;A#39-%&WH6bGLTIj^Zl-R)1UnRU#6PYhP%`cW%#C= z(}S~z0fLYV)0)^QYQ-@>?CXfC%r^um>1IyXcrsznAw05O`Ke?!dH0#~>io~RgQk16 zEhjDQzenO{6Q3X9E7nN8gG@HYLTlmfsP3hD8=vsB%EC*vdoz?+8b7ia^|q+dY5X$X zsXoSi4X_$P^SdJzc}@4%tY1+l(O*;G-YJ|L{)0fj`5Y=6OI3Kiv#VU6JDPg#uXE|} z#oZ+b$cL3OBxuTaD2pz4nz{iD(TJ1wQ6P}aaiapxIaJr39-q@YS^X5Dmg3qv?v&%= z{I6Q1F>AI|0VT_RaG!^BOR4kDlTySz_Ri4qy@*gxZqcRkciY0Ib;qHg<@%%pl^+d_ zAJh1~Vk{89UF5h0;l}i9X9}e|+<_Tn0}V9IIm>)p@Y(q*(p>JDj=$+BksJuiaoXt< z^w)35FdplhZLo4w`X1+anV~A|n_kl6W9vS}AVQxN6`&1_OmHC{;j*3$e}uw(c*rK3 z!m~A(vzqF7YqBc~^>i22bxW5PpN#RRO3giEk>EQo|LzDjql*40)d(F!lb0xS?`vOD z{|S0bue?oCx8R6g%I=ynazeNbl1}c8LAiWsLd~nOmc5fb4JO6ZRTF1zLMU6Xnx9CSvU4NJ72M=hu}=KR2tqbXthBM-g>RzBf46u3r=qh<8nE7G)fbOQJ&9Mwut+Mc9}tD_E!8 zs*78M&Rp6)G73#QK>BlFD^!91uB+c=T{qRa_yhb0_L~mH8ARN`t%`n4q@Ho06=4>@tBwNdr1ODb7 z(dN%D~bO#K%kZv%Xjbd;0fwom(N}BN)=q5ZS>iVn`C+>Efx16+?VV?oo7$sAHYBm&* z4a#=uwhf$usAv}C7DVnUSDy12MS%&%>slZseIX(_0(%O2_arhOhWoovJ@}=;mGN0J zh3!ZsAQ0r~LC_>%=0y*Z2@u61hQaE#xlBM*Xf=3l~ z5#^4Fo=w)a83HY>T7BFB=A+f2f$>GMS-y%$+>rB`8FAxHVGjq<-MVnk#4mJ&&_ zS(#}4PWefv>Z^~^zi&eEgjJ+5> zl*V)1f<~-R!Xs$02QGEsbrwz23g1ev&XSlPvoKAZ?QR5acgIv0cJMI}+QP9b$zerg zSd(6lDuXWpLA_oBjS>?=*g2QCK8^VluhHKbF1Coq93@}i(2ljy3xk9hIXO9#-$^cAzAE0CavQrZV;kGsb44tEQ&W20@R zr|*hv`AKBS@&xv)$JIll!Bd%uXaizV-Nql zJ1IAx8|W$|fG8#%Dp%LyCCf@TqYYLm%}&D(us|IXP~@J|QH@9ns4^uyM?13u>j+u< zdUSo(VX3loyJ0g6=&im#nIM-jrJQ80{N-LD*7I(ez?H?;NzgwXEZePtcb76SIOsm* zj9T436oBS1&l8r_^9-qGkTLUuYyqRdLsjV3g=ev`1g_9EZZo^}{e`pe`3#?Rc5N9I zM9U%oJO*eW(kEBTN!NByMC-5UXPWu!Zd|oA%paSmbkUuQg&9t``BqbN=-rWxjFN0L z3QGh1U{K!4pM;P;1&6A9#y8DbB*bmkV ze=3;z;_}n~zVp5b#K_wJ<&-38%9N1cv=DLl~3eYt0@`%MV$idH0Dh`I&XH>X`4&K-SK)v5WFwXG%tkrgj5=pRJQR z9iE<2%dWdS94Ki}AYI2V9On}t)WYkbUh@Q%Ee?%8kX^dvfn!ik2srQhTUca@?`2-n z_zmPyoHUCNg-gwm!()bFupu1S&98Ja3s-@c;*q4a2_N)7{Fj6Rda*v(YGF-|r`ISE zO(Ud-m?`Dv6@w%6I$oN6n@Fcfy;{pBXOf3$*`A)fzzhUi|)L8O1IxgJ5R{ff8M_TK`)lxX*@$Jn4Dr^+(7ajIP z<`Gm<-P_rjzBbvo9k8!Igw^jf6PRc#@JY~dDHIXV5ROdyj5>XuI&WoRnz1+}(3Ys%Ea)mqIIm7Sb0(fL?-1(~ClN zkEJri0C;-!Up+goznV1BJ_ElL>b4~dsh{z>{XB#&nEZam@P2^f0E6gpLbNyU2ZVkG zMJm&)?w+SS8OBJxIXKeZYvr9&1`~Bym{BAQ%UsONeSs4sMb=D;hP` zR+_0dxbW7*5_IJ^xXY_;cvUc3H>w(s(yP<4{42XkjBgRi8@wUFm`~SC-#P@~ulzI$ zQ3l|>jc)@81xKDqYW#~Sd-Mb5pH&R)Vj+Ovh-<@M{qguyTu8DXeY1d#^wA?xi6i`x z&>O*K461KaUSNl(hbQgqRc>=*rI+N3{D}Dha9`^tu1z=upi7CJRw|_0rC=QT{ zuDJMI2Nrrl?17WuZ&V<2^U#|mv-c@@tOk{oF>1A5wm5dMwuH1uJ>mS1%*QLIr5g0~ zY?`oB3ifJA!+2F~MX&Zy?1B^k&Ig00zQb!Dg~JpOqKijK@s#!2DK9Oa|Fu~34c!6u zf8w_@LZ}V%=>ia|OK{BRzJKYcj~{KeQdvmB0Jyx&-e_G!Gu+WAe7c#cBw0rmOPbN$ z5-Ard?MrcToVSRSf*q1f{Zf$w`NIyVABbPb8y~Db8H{u!pQeppVu8%S$SbKAA7@)JBM#`uR5T&#U z%yJ(v|BQ8br%(@VTosCb_eHszfBgr-*KPm)*~PxVy5C5et)+R&V)|X?`xzQx=*29V zzrdteCU|}c0UH7{z z5yVQ8C6zd{WJV#-0L-eKgrP5LY}EK?1OVS&tel7i9%EAYm5njlfU0E7mOv%CACOnJ z>Uu57rj}(pYOCmVQk9yyBvc+NzAC^)nit_^roM+cd>%;{YsmMH?vNQ8ZKi33{Wt%m zAHe#p+%BSHfC#1Z>JTxjH31bcPf6P(l`vvfA>Q%;0kwu>JW}%?5+VdkzuU-hWB7#y zCL3$6nbid!X^icxzm?%QMak$L!>Y&!rRFV%Qewx?8tP&#|?mdK4bLmnqJ|Oj#gl}z!9|%(DI!>87N_^ z8isc&C5A(OorQxoaTjOC{Y!#tO6PK-V%+w%pmZw7k`$5mr*(xqnr%f}LgOM-{F=#- zGZ^SAR;>P{iCtTb>`?z^hTp!+3O5>TipGmFMsPZ-?xZ+8uj#iVp`L0Fuk$E(~AKh~16bK23#h7*GjN)xcp*5o?*F8uvqFLiB0F6V_I9sSzVOJg*Ncrn}g0q=r z@1;Aw^jaL)82++4WltIT<~&{0UO!nX&3lGO?Q=udzt9KR?44SeB6@Nis4+#>LH28d8BM| zLXwacuv5%OmpMjUyZ8`iqACiE&vGb9yCSNtd`F#G3te>zYUD<)b3LF z5Nd?wa6aAbFJ#bDtMTGVns=WsjmwremSKpWc}AwRa9HI=4L%rcl3^FvBTi?!ds5&O zjzUMVmRQuFcFOoI!SFbI>A@2@60ezVyuU(k> z6OdY8(JV{+VyvS(@@Yj|^p?}9gV$?h{_MUcZOkaFk*kURtp>r>Kb9QGjGqoEI-Pvq zM#L#C6Rlp6`X%g2HT6UzJ?I{w7l%QO+-582vLvWDJQC9FFT^Zr=Kk-2h%{-6Dkr_A z`d$Cbxw3f`-nU*hXJ0N%3}Z}Qgw`@;fx(y zK@jh<;}UfbeJ{&aZo#ekNi4unE|_bdGzE&Zxv|fMLdhRSQ6cahvwSBFE?OQLh7(48 z;ppkQSFU%_W=*V~vq!#G?7@k$R;mA0eGI(I-FP`W;e7tS%6RL1w23mAhE;GlvxSHZPh>^JFq`?Eo=A&cCs2 z7CRl&E*2`n`nLK1T-zoUsAkqSPG8P!%#5MHcf_;D|8}(S)N%-#OiM@v+R^oOd|x{7 zKIF>q9PERxo?z3bagy&-Ox4N_I+ssX^J~sQgE&}O zf;2P#E$dD(sobejN-+q0mt_U$699Nf4>>p`Q{Tg&Rr#BTEB%2Vnca%6xHpc-;}W9|aSaIH{)0e&6+Qsau5@n3U9^Cz1q{bdPH z*QlMHsqq2{zx!x!jWD%8A5^HCPX;rrL&jh3x;@P9tfr5ahVi3!GN=2{oIG%@<`qDH zZ}$&+Q^^PsxX~*cyt@32aXlrY+{KjiR*}|E9#On^94Z=4|jd@btosQB7J)dTZor7JmxJ z?D|V7@+77jB79CQU5Fm}-fSm`|`|*8!j`qE2O}Xx=sMZJ+HxzPZAgfvg$!k|iwEQ9svvzgw zY;KWV(3oDlT}WOPR|C6*z+*q5$cXch!J-SyE&Ws@q5Vo-tcsExD?K_q3KucAW%?sa zmuA;QIvYtUQBBu4pKjno3%x^JZxiU5amsRZj-2~!G)H+>aCn`zQX5-n6ftClq-h;$ zNaQQrW=+r}-Q+2+Grz=UX~+=Az7uu(KNqKpvJ)vHwgp~#4(DB)d{E<*#cQSE?`jiZ zS~&L-ys;TK7mQ;t^t^A*a+$K*z}d7`u@4`$?m(?TinptnL`@U}iT{eJPxV$hwQ*Rl zv|+}kj;a|{%M%Yz7dzL!xzK_v!zJTetAQ@Mm3XHpySJiYL%&bPCY=j3sRg@h6_Gq5 z5>XpUj0EXJurZueRDIOmK#2}5pSO4J46WGVo1~p@M%0anLHCWr39?=@#DTEz&HQ^i zGZV*E#b-rt=U3@T095T80&6gFwNEwI;;xd^VL{Xk@ubjpNm)uU>8mKPoG9*`vDw`O z8;23y3D|IBYkWK6aJn4!FxYMi3Yz*@1Q}0kJkF1j-qHsGvxAReu!Ce>FBTVilqIt> zZ|AS8NiSHA(sMs!8?>XSd5P})hn;-kJT>Q+ZiK)XT29G1nD<6_o(e!bCyP&Kgf(h; zM~@LLd7ZAk`q=63#z)~hikI|*$lz#>&w@c&9=SK&RHYBAA&noL^xQ9}lE<59J@fB- zHfD|9>);rv0|iaXcWht*y(p9!X03~#Q@Z0=wu!nC1WHX$nX4RkifaI?QHYGSKyPyh zFc4z%7p;$b{Yh5+OMn3Sn67Js2!{xQ1}Z6a18Kfh0|^ajbn*&GV`a=?IPkV3KrYN_Q2>^Y27-p-x`5p7);(5!X;Qay-1r(RLq$Pg+5BV$+AyFAyl)j*Zx zU)zM{ihkl_-Xj$BQiwJh`-l=OfT7>Eh%7m%NdAk44Qrj+uK#RN-MkN4W$JzeDR{DN zCixoG3@q-{O)nklba2ItAG+IUuUWB_PCxiBIN<$l$m&L+d0(!Y>?z$xf%nF)AX0%- zkYKJYo;#MlRMBx_tO1wBaHX&xzOpPCfzpUeO-UOmF9L4}xkUbP$Th2&%uDBlygxh= zj^bUx@&vxa6EX(x{b~3Y<^@2Or3UQtRd=mlNw=-+hfN=#Ugqjii#N?=n?H%G;-Y2p z7%BbZc((}M%o?`D(ZHy*FUh(7;2?@JPORdt&-Uh+XILxEa2|WUV0%a6xT3h#TP~E<1wg>QN+;5>hmntMY`OY%Eso z(oJQ4n=ipw2v_D?%^#5Kf3Z{LK(M@1pUZ{#ZKaOXf@COd-voCR={|zeBL8Vp@tPMDA%jlo#DObMv_1(oqtRmXhX;rE>2$tp`12VJ8!iM3=MZX_ z`~HNXzR`aS1j5{$YP@^uP+#8!-wD_C6$B2AE=Ozlk0cdZV71tC1Ens#sCq^3NjSb8 zXRw1K+S#R}@|YU}up>4;&}D{_&ye-wh3h5Pvmw>qTabmYq5IY5HA@qmo&OzwLI_v75gX4XyF!E?SgQp3Tq<0O;%xJ)QA;( zaFD>^LWey7ubKbh(2m$B*%q*p?~YaTBiwUy3Qp1n*jL1M@@~@?P6x|vPN^)`Z&5}> zO=A|{dKQBq$|KhjCQMDPj)ucl@&8ck`Wc-YkyDS}P>dmue6%yOV-`!ynERZdk<8y9 zt*1)6XHd$y{Ab=P_S|h1jX_s=j39?)86kH~p(o71gG0b`KZmy>^q3uN{|dZ~JDmDz@KkOpbpF(`$IF0WLTOzCGC2t(%ZDyV znLisS_V8VlmMWH%>-~)~Nw`Uqt4`ni>>&52SSJ*a**cN;BQ>8cXZdOGilPipyU2@f zUoodPK?Io?ikYKF16wQqS>s=^o=`J8P#f$3(Nawe=`uVlyZph=^Ny+`_$zbHWezVf zX#v_7wcWnrC`g*IlX2+8ePuLs_mux(T_F$n6GYQ0PVbQRU^bN1CK*l??7 z(SYJW`Y}v^UM$2~38x3F9KQ7F47sQqJeel;e`wmnLBk1(G?R<~#XC9wz8HY~~Fx?&goRE>YX&>Rnb z>A5*1CLPm>(6kx27ALx@6nE;K4)n~R;{L|a}O9_Ao3j54Rk91q2Nm!T64`cc(p zn85~tpoPvv_TWEMf0cVECy;eU6u54%f(BnwA?CefDXP_o{zT$q#3-nYL933yAsy~U z-p9&m80{Ks4)p^eFOhH&^SegTjE?LT8rn;$&*0k5Vx(TmSw?0h-elsj!?iSK$bspG zN)Gh%; zN=!I_x{O68U;-3(5^plG)U!&0S%#YsT%@^7q9Z-ppOE88skldWp-XIgO%(LQpT4+}KiBhKwX%Qddr z#Zcg)kVQll;CuEhWoY}SotLclZuuKtJ2vqd3i+dVmi%1iuG&;6qJ>#731p(N$-Zq! zG=F{f$(~=bZG1XsSc_TKNdxutmQ2RaW2-59MXwBk%U@QGO=B`X`aQ7BFd0vazcR0$ zwM3Ph2egJy4jN56XTjs8L$2jT4iMH)4Nn6dPL!Lp0nAV6OnbHfNUF}(Il1$1562Ay zBk`&ECFrVirK$}Fsv9I^m6Cyl8TdlUkT^vr=o0}+wW)z(zS1aIB-jHe65IY%JOk0Q zu)$^LLqCRrjRF{xkZ{olC?}UEA6K&IqdVqUp9QXE*@C3PaqwCghfnv?jXlOrb$O%Sqtu`JtRl}rri*>Z-3fb>s$M!Cl9 zBW9qcdP|`RH+ab}EW`m)INQTi1Wi>1ZL7Zy669}Dv3BK|lDq?GnuuHl+M{apgs?NR ziG`VPf+#oAYoRygo;c;#Ih#r^l>|o;qt=Dm_7)?_zqT+I><4P|IHkR{hco#YE<)b) zF*B6?L=B59yLln_8Fk@7HD{~NFDPvitYzXqPDH1UV>tp zhI+lO&%BLE7gJ@Qf^V8-8I>=#Y$RhYXSuaBV@7FW?sZ*T3Jy#(fZPspOgVnXF@>wb z`NPDIaQd9ahW9-EXJx4S?5XPY&4^#eFBd++m&9^o$?@p-(@g#>1k=8rs#g3R5NTC# zkM(*b`_R%wR_SB*2B&kRJioG51=6K?yd+6CR~Tn_HQfaR|1t24`;Xd{}EMs}5wp4_M)2%#*~Dm+e|eX;kv4 z@i2X+=hlZA--F*ZK%t^R0H7=2141wS8Uv&G*BJo7?w*fjO)U~%QxP9TlNVL#Y#3X! z3*Bo6_;QoX)guDXvG@yi1 zeHV1(TGSr7sN{2@ePSz5@gu%!zJ$A`Bo0D}kN7rWUe>Q=6 zn?*pENaGPj!w0nv`$2<}!=n5I>BbX;bhQDdf2vl*XR$j-mV*^;oT;Bqk?{#ohBV~% z(KYmFd{_D}f93Ar6)VTnXq%ymYw}Uv!{)Qkz!Hc#h9G!cY%vV!R8Mmo0-`AuW+>hJ3hxTA)OHflZd zjEDrrGjr8nBK6F;iO%%*=23-b1-U2$%mPX9HfRN2AWe$|iam;5H^~g$NX<4}yJ>-{ z1l#Wxj^LzS_axbT4J(XXZ`@{?>6g0yZVMG(=L65kIH^ZG71|*4==-K4&2*4^vV0A#d)Vm;jRxbd;)S zf})vgl-nrK3;DMc0$mR)R!Sy{ECcutM}w2H_A#y2}~r`>**dlDAo#t%LMsZNkW`g^QEK{MCw%bnWX;@WTC`v zXdhmne_@Dg2>=}&q6cFz{d-LTXcF9iqz0)L?<(E~p*V0|cSF;X=6#zyC&eGSlyeORj%} zQwIV9g}zysC+-uG%JN2nu9As~4RAR&hbtNF*JBW|T8Cis=Leg!Zcgxh#^iI&(p<=u zneoLw{RXlCJRB~_9DsLt-yYh1;T&=}A{g3d6ef4e_* z5=}ahPr4ycV{20gR}UTmgCB8f^%Vn`yxX)KliIj`gAJog2O8q&^B<>e{2tdsS9R1Qsy}1L*#ueQJd{0Qw@- zs&AT_m5GhsmqLg~gV_so^Mm|yfs-$uABF{5IwjQox0f5LP{Xx}ZtTW?w@TVRM(+m+f#8vCRfUrNNw%th7Z}}L%_)S zQN+R%uZoDg^N=Sd>+5SwUoVG{Qb}5E@6y~na1MC&BKT)!Kw{G za&5c(F(k$X8yx6{Zj&AJGZW(_R3Ib}M9+ulT_|I+EFi@0`xTQrx;=>unhugpL)Wsx zZs4l-FO{a5fs*7Hxh0vdnvoE%qDh{i|3DBM3jo?`BtMmov#1%VnM~tHj_~+Ql2WRq z6=G-ag%@K4SG13b?^A19&gJJLuT#;*-ta-}bVJoL;Y4|_Av<1 z`RC&^m`|EKQ*gSRUumBFAcqQIqR6Ls+ScV68LpQi2(i29zsYqaJUr(05yIKhx7YxF z-C!z~&A(Kzo^CntCWHTO9JWgW$KiS7S)lu%OiN0+3;q*meh~2elz1^xy(Ij ztp+)OMxIJAz(bL5^XPFU51&jn?YwT$Y&o(ZHx@^2-Gm;8%h_Q4!C6%kQMEjp zI$cGl2BD@EDXOzHcThA5@2)&Tzl|+4Ke8BAO^REM;Yas!<#agh9LcgStAY3cdMp`L zJf1A$Px3*x1lb>4*F4Sl8kzkHy^1+LdrnAZ!29=@@s6h%>=TjoMY1@H*R({-@%`d& z%yzR)Z|Y7x`q-j3s0PXV`kLb|t~hvfm51ASdu`f_2B6alUa6;q#p0VWj`Y1bj*ij@ zFLL)>EHCBExW1%g<{k*7!;hHK1OU^#YckTW%z6^HkLBFy`20Rl>JDACt!LCrk09Hj zqX<3)?B&`&Z%u{z0j-lJ-%f3dU`Fi;vi^+uoH zwRSRe85Jrb@>G^^pRzTT=k&i37yv78j}BdSdF~6S>Y1=HvtMv!P64Xw zP*-z5-D82gt&)Fc63^raM_Ytz%Xq`w!W7^$4R}uCi<>_C`9^9<)+xV6^kO)OmkCDM z@uW6LRPn#{45D+q?9o!vdz3pJeC;rh4)@|o2(-!blq}`+w<_1ab{Sv8L?9aJ#5v4~ zdoP&%t$-5aWhw4@hstm3Q>m8wMyxkrF6_-WU@qs^PTz%UfQ_hg*+gP=`@_+QW!AnfxYsUeddp?j-JyQ{NS!g zAET^J7lks)v+E$$k6JEqqMh$jd*>;h8!sg?$ld}qgS+*R(dw`Az4ePGRuy=6s*`n@y~xzL}7=`3?GvjDE?4xiL!^WPg2BgSupmxg8%Qp3Y^%_S2bLrU!Ff$C zQ5J){w*qmkXxK{B){eoHc#mnr7ig2v7G%JstT@3oZgo|9i5z ziZBunMGn^jFZ~Bc_;=OxBEu;fGMAV;Mf_FsB8drFiE}+h9~cK_i8;~Q7pS&p5P6eK zuV5S3D6}R;Kp3X?ZvE%mT*dFg0;zoGbwzQUF%lOvDY!u4uf^YmxP8hl$?RIm zki%pjm3g?U%rjOercHbmwA5|9bM21u`0Mg$h~H5?Gb}5VAlj3cO05lhd!6TAr@jx- zcPk3O3?Uczr{I+4H=0CQEFL~I#6pWsAUyxN-p4(T?i6(D+{9#kZmC*mpLf5D(Rw5A z=_QZV{7hRB{!%BV>KjDE(S{P)R`LEDLRUod5+12u@RCB3F*x;xYW>tWm-GSlVc$2yFjK)3^e9z-5+KZ@j3U9&V7k=*Bh<1)X^zU zJhqSWz(@8$eO7;%4;WFkqLCp@JGxyXTJfvUcn)QA5u47e=3-A;3e-Ek$Ip(?e!Op5 z840QvHjN~WmP}y1Jr?;qI)WHy4E||VzyO0qTbq%VURRGb%PS@*km>Q0b_(V_CHaP5 z0zy3LDSR2&9PGMD9%DKlTdsil(PiG2f8jw;iPOS_xg&Bl#n406gQCmxw4ip*FYSz@ zQerSztfXk`+B{oShJ~^{9y>NMW~IZPRz4i@RQi|o9wOv_wXN3NT}vi%EPJ?{0~v{JE-WK@_qAE41gen z=?jL{>@sA52D$3ACeelou}JScK?o!~4*ie2VpESowyg522^)LNkMa0Uo%CEd+eCRwOpSd*8mp+LB^ zmfnk!CN}Pf3*T_hqP5Gmp)d_&fLYl)t;m-5FT_I{S>42U{!~ap!?axPrzQlerjyl>~+WjdpjSU1UmSvgdG^B6z zUSD-isJ1~9Yc9cg95mHwOSvKRXh`Oz{*b!4gVqq~?V|uIEJ)C(gmCSIY?~D?b@=uT zKj53o!!;e4)*?D;G}x_9MnpS+NAmr)##xR<1vTS0diB!)m}2IvjplTZ>#r`&Ju>vmQi(bm z7)gV<*tuVAyXm{9i7HIsmO4#*RErB$GZmH(-lvfAC1L z5Pu2M89=K#^STp>};Q64~N!(x6 zZ3q2~$Mjxab0!;|CQ0gRdN1{sUB1ToaR*(BwiWid!6bsl`ZSjLcF*AbG!sU^h+ak% z(K{7uMj{r7f}}pKo-Saq6KW3$;#i zl#StY0fxCcGEjfEZVI3?w_HL*fX&(K@Ndr(!re)&Y{KcQ#7qCH^u2GuLwfyk-yFgC z31!Y_BTX2-V)_#SecGQo48=Qk+LD2#idaj~BkG^3VHtHw zEp%VrD#P)XAFN)tVS)7nS-l;M5@k}FfBEJ!@od;I9)Bv@DqFd4oO;qMj>N?>UT(`Pe- zx14JEynGIzwZEFG#Vup&Wef8BbXV7AhTq#x(;#0m-K<~dPs#C*=cGHIMmC&ZS0mAl zizc$V<1Q-4g%?LtLp;gwgEJfCqmo%EWf+vG{WEOT&e{V8H!7Sy?1VdBd`bV03UE)) zLEqLJjO)HpTxerj=~XOlA-&5nC4F_gFhU3bbYVj_G3Zp=YA(v{5-?)J_0$l5NzA+@(0A!5$S$jRlJ{N;s)2Vcc*S-N9fB z#Tn?lTTo`Qxl1+Dn)2iVO$+egVcBFc>6Zg4(nRaCT=*+X-9MdfZ1|4ei~WFQIx1Ew zDB+CMs|w|3qlCEz#%f4*lSiCT*q1)W(l0&3A_$^qbN$z*osC2eBB(s+KNr)#j!+(T z6*!{?{VYik4X^9-XdZv?R@!GXRm$FwL&Q6>AXdae=&gLW>)Dmt~Z`Xp}Ku4{Z`$1W;XDYE)X_u8t67B8o*d10h0g{&H0WUqGS|$HB!zHsghT1OT z-|U#yptO}<%72jtxQhGMMEgHdb{;LpL_~R*81Fd2pHwH&c4_UQ8I%<>Z5dlezF9Cv z&Y`B{6IAhyEMt)ix-h&YnNiazsD?rO)?$fkcKDZs>4;Gs_Ry;@OL@+K$>Tu-3G7J= z=bm>T<(9TJOXBkb$|?|okBS+cf%iI6$DmVkkK2wK=}~R2;lojg>!x^>{w+L46&Y#4z|OQL~=FJZV^>! zH(GYiA)3A27#_uk*qi?ztJ7355XFUz|$es*;yH%d79Hd_dL#a(8jt}c%FaP1>w((J+9TGT9}=U4dgz+ zRC?GI+3ZT0>3K%}(#7l|d@W8ZTpCITH`x zaEW*ntDjmoA@M*s4;HYuF5LRkNmpI^?tx$uJigZm7wk*64EJO;#A_k#f^>{^Uv7Bd z1;nZU`Etg!2pPwoXnnF<%R1?Sf(9K1VMCmP+v`UDOaq=}B!6U>nAdK>u_3+y|)5&2B9P1$C2#fdN5Pv;W|wJNt11Gz;d zX_ch@V0CQ3_FHUceHwo@2q?HgQm^vRgoJ?Ta4iiWns;ncDEMw-k_B=G`E=(VbLrL;$@~Qu!(lU?%NN zjA-~?vM>s|yN99aI{fd(^rDn3_l(baHE#pV%oN)@Oy*y;IASt(= zJZO>UTQGjm!>D&G`y-P~OXoWR#{nr`-64l&w&70AK6JS={IL(4*2s5IlnPu3Xt9F1 zhD!aNiz3Pcs!uht>5QG>WQGZ!E%`-NBW3#D3Px`E7RL!eF?o$ZD=9HqC&y70E0|tM6 zwPz>A!vXNuCPeE`ELSK1;XG)p0WBxJ%^$sUJ+|7Y;APY3aFXS}SJOi_L74M_UNuB; zO3S-XY-NX?Y^HtJ=(~9h2h?KJg}wTUyDOn#Pkl~p(RX$Xr{!|b2kb?wfF(P{@0E`^K(LQ&^D>K3?xkQV>; z@++qZRBRKMB3EWd3qA7lH{eI%als|A1ah7xP*ZVZ(66$ohM~^csM&G{E9HOzKhQz$ zy7;j25B)B}Zz|nI{DVSv$BOG;FUquD6J$X92rsad=xwD@19Y<2w0_d}9LUV9B^Wx& z3IxSRv3!>f&rGa zRmU2qMPk#ksO{`-rqy-to52;^e153Pma@I~!CWcDcTkaq4KpP;#OV-(3*#2ZtFhQ! zbRC!Yo!UY5wod70(@=%o-ZH3Q( z7yAWeqp021$#(FyC6geSMOF;Sk+jtAuJsa_d)_4M|4Ve(u_e)NI#yMw zTi^%2sbn~3HmW~8Z%@0wh~8Pe;oh=y^ns?xR@bEr_8ot`nOo06c&OK=bFj{^H7%Vgsin$66tTRj>j3`IrG`AP!GkxIry*-{w0HIBg7 z4^PfdF>@)^aoGbDM7w94u<}h5p`hQ>#9zF9q^jQ3R7tU0IU)wZ1=6A|0e7zu9u_Cp z3TYER;#6*Gf2U8RXC_87mow;dzfgtDZrlN@sUtm9apYQ_d z39K&XQL0=3770@=T&w<0qbGqTSG#xYJg(2Nq3rayM6@i$P$bKLV7qM7IsKV8UOc_- zC)Bc3D~Z7~QJ*+hmIUC+-8btGQUCt65=Qn7Od>gW6bQm;ZeH&J_3L zs?iG+rzJbmT-TN+<(~^JR$1HcZkoM6h}n8wuNI0fEiTb!<5<63t;GV}hOHY=5 zQ$XC9Tb^CCR>mA2?rM`*?W*mTSq{tkZguEhDMZ=5-}lmGzeNDv$J(firANHveu;zG ziFFa-F39#dC74NY{KkB8w{Gh-^D$(sju#5^&vf{p!959sejcijL7_tpcN2|^9tCk5 zWvSjc+#|rP487(+?3VXVabSqPn4VY>?OD>eh7WtF-Zv!iGivK^)B3{U1M@UeEAE?^ zTFPg97&$x@4odT2Cex?iY7o7a@Nf3T3cj5Kg($p&!N=9c4My6i8GEPT?po623oGFG z;-VlC6)av3#l9pWx5<(+!AyX{fuYB*-q-HAh040=Ycrr?0he&&w)a%wtf|rIuaPs>P+8|4WbsdgRH2cnYDMg6$ z_IPszIo!8y5!A>IX{QS+`PE$Ai?m8n$a`4REcU=+`2j_6p?t*MmT7Ci)bF#9xzN}+ z{i|Wy0nVJajZD>yTFHW|LZQnu#Wm}zm40GJz>aUC3E1$Lp31-N1Fy_|mc{I8e&IRm zSM}rWD%C^73mWZ}(z684x#Tu_o#<79PXK>+UWWPzW$ z?;HZ%*73}Iv~RY!Z>yNM_-nB2@HWD5r(t>{u~TNyWAFXDnfKcanwn8T&<0<+xW1ju zV+GzE@e>7xJpg2zrd}G1GUBy+0}RT1AebAGlA3RXBUk7ZFm1Ho)gp~7EnGI24Z>bW z9;?0_#V$S3AR1gLeOVx{5?S<^$3a~+9eKR)PrBTl>c=Lngc>XI>P&l?Xn5r*keGjURr_iv%d&LV zDPlZW+iv?ro#r9-nC!jI$^?Ef#VnLi%L(~$*>zUZHJZjYaCQ~O`TBq_m?sfK8_dtt z>ly1dbyfIx5eRY%DkM#t0L^-&KGVsThQ`12NTieRA?|o@Qg+9d;uNv<*NV#hqF7Nt z&C0}RwhEBbtFJ>4Ll94-#=`L>YE&LMa+!F~Ulyeh0azYmCx85H^U7;pP;6-tZC*yF z&-~Z(WDvqs8OMuqYQ6)4p>efrGx?5A`FFQ2Is%yjqBTp}BG!F`Ep@&w*NR+fs-JYf zq?2Py6kK~FtjRp;N-k@sjJ29Q@MWfp{P?~94*KtkvHxYb9`)JKYLpe7!}6fQq&R=t z#j5W=f{ropigqI|^1U$wo?#d^6P0Y;!)R$6zW$i}5rkF#Xos^h=pHNtAilo?o2aM% zY<>U{C33+e5X!J1dudu_KA5$!yXo)zXSU}is2LzndbHHi-^)EATgT8N99q8{yRe>2NBHLNvJDVv{1WPb)_6;&!Rt_*zZ~@b zIE)0{tu)1cj-c6|3Y2y|UCF~LqXgztx(4Ze>rf(gqP(>Zns|SglUY^ONuI?@iQTOU z!S#bksAF=d%KAS_$;C8YOmnkC>x|})1eCDw3cxXM+o&{zk4y_IsfzfWsebPh;5Q80 zQ*PnzlNpK}R5O<~Ct(->_a^u++CX6tPX~c{Fe75Px;#7@nTxb^J|kE=v&hbwusqYR z>vm&g9oaA}cX?e48>}(<%;=(g>&XU4`m(8L*dk!!wk=hAIF8|M^g*}s9d1@ zS)2~kGON{m>Rj5l6YO(HzR0!q)mb*jiIml0=sduS><Yu+VK=Q)U2Z&7-GYV3V};}8Y1_^d$8p)80j@&9ZOrQmtL4>$>HXnt1Ws_{FW+K ze~C-ve3#E|-C}nBmRSzo&JEdf>Xvi>P3Lb; zZww*D0OsznYn`TIFI3Lvzj_DN>pnepFMDfsG{xD^tTD3#)(21QdQw+6hy;2VH7*MWSUnLT~ zjG*s~3qgHiViT+0xGH02T5(t~@T>`# z)h`;;_!i6?Ni~KkQtyE{ehz1Y3ooDkF@BSrst8w$lUr&EIn0c&9I>Yy^u>fZ1!AdZ zLaPT@W&!oK4Dq6--))PI3VV>($Ho8?isDy5XPkR;m{gl1R)_ZE-o{ub5FJAnF(nJu zybd(DzW+479qyb&&?PUbf&l{dh@=y)MR*c7)U!1QY?Jfcu% zHG&1dCn}ku5XTn}m~E+Urcr(LNF1~6nc@#AD-9N3@1*)>sSG1}XO6&vpiR%n9NaT? zDS{E#=+97Btpb3533rAI=anGlIBmx(#-+(kypTh6I4b!0Y>BdK zG(6~6x?lakeY7NLE`a!Fdgrdf4)GjbjfCR!oxVA@UUs*Lf?`{P;Uy>Q1HpwYC_ApQ ze{#VNHFfkgBa;u%WeEF{%YCJb%v6f~nG4uZtbsUj+Nj8i)+NQyn?)f)$nSi##FD?% z)dCj*LBPOq`;TpAI0e=7r#n`(b#T|WS1Nz0D45nk;*xd6~;)W&RP(c%pG@nxt{z)!bU3==u>ox*aCz{ld z<0yk%i#cIx<41ca(c3)jE#R1$DZ;tj`m{`3}v+N#qjR-3okU%RcH<`uCEOG|90JG zGUKEZC$^#vfg8YZpBdyu%!mP==MHDCi@`YDaAi3cHi${~ijw1**7a1*8f)4~Lwte*^y_em;)v7#xl`&)U`0#$Ntak;uf z@>4;>FYx)r3T}z7kV}qvSST6BVgfIaUj5K~qhTapjIfRLi(5sl$jWgq0%LPZH*3vS z%IJ8N0gH&?VJg8ZJmWfca2mxG=>A{9;cl$5+v4$mUv>E81FEbX+_eL_2X>_In3f!vbIbO@DYE_XX0x*lYO+Y&918#)P_n&9-`BLc()HRkELbn48T0 z5@n&fjY2?;f)$I4pP9{?%AeW+HhXx2C)}zY={&YzaSpW-(uStA*h>T(2Z22g&ps{*uc9!2(nKGRr0>~BM=1x;-1@~;V+nbnO5#7yB^$;**7&nGa`)VQZ|BhlV_HHR+ zlrR(bX3oXEuOcNPWw)0j`J0IY1fj_Ku6<$++!nawi7&$TY~xA1qzOL2!2dH(Gcx}Z zn?u=neMf4Y3DLV4Cd(lkToYm7HT8WU=kqhvq**ONUaqrZ(_De-X9?Vk{#%$;XS)mU z4mo!cQn*18LH#^n9!9Vz`yOmj~goqwtewG2ig@$okUp>Yl&;L|?tMLSDr z=G2FT%Y@&2oCGp&>p^ZdBv6A}3$ezHJa|LvcAKzE{~6 zS+S(o-a7~p!AM045RUj0i2f60uzM@+{~z&SPq@*p1d+`xM%yRuz=XB+jn22SQP z&*2xMMgvdgWAsXjzdNFF53Sd+;{~UJ0uyC#X34$|y1U6C_rEFOxwIzak3{~^4jAjz zabT?p>sLlQ(8`wVb*d?dU?CXtPLe^84eO{wQ-_q2mDIk5N8e-!#8rPOML6Ns_I$=x z)MmO$Ftyp%fqmCzPwD46azZQz91%7;Xq9E-5>P7A+U9`;mr+%(rN9j}Th<+r4eGik z{>sSrcygqf9%2uyBkQmSWGSWfS#E`QZqyu8_=3w83%?C85`w$#AjyW@)eJ{wz<8XL zd(e~rWyDx_*t(}j=!!7U$;tMm^%q)MBdq3WyYZlRb3(dkB)tw<^|2t0fNuI;F1w*B zmoHS=1JC)qII|ZLaDI&-f2`Hy=>5{~cNs1wD`hQ3jDx&ZhzX#{DyF0Atq1o=?jdOD zgkiK|Mt8XGpphV%EFm}}&@5M_5KgTfAklRUj#K=v{#5w!Xd_=Zhp9#vD#w-vfJfx9 zp{9RxMr9&d{#i}BF>ds6FjP!E(t9$XhxaQo8SEW=y10?&GyzcM$$SL{Os)OZ z);H8WCSN&bxnr5#l7*APk>_2+gkFZVg@N0|pbaUt1qYOMNJt1{a zSY4LjCKSehPqF6ypNKit7dF82DA>4N_Uf?6zy6cS$|AU3o8EI`n^sKAJ_x*eh{Yzb zhkp*Z6dpDK{<4~CO+DL%vzBR2x+o8$2w2g;$Uf}^d*u#cT;ol=)2X_Y4NxB%Q)^G- zl;l77FP20#Of?bRU{z#<*ED>jS%?B_xFj=YM*H^?k2=c=gM8)trRo-b3BY+ewI8_) zZ$%`a+S!BcX7?^ClFg`O0|_rcmD+0XULPddr+gC`)mCWml{-HkK) zF7|DB%X56y%}KUg7x!Y4G%ONq3{H<%F6LqGfoopR({*AViz1(i!Y(dN( zPln2jZ2fp&Z&)!6;vBA7j+9*4v|oWKgu@%TVKIdp``xFX7muFv>V7x7m2`kyeAjAr z&~GdN_SAUup&QsyI-_KW%iDU8P^?}7S#E_QE7PF{Bqhs>))5Xuqp=}Ar#L668XP$x zKgDo===VztPmc{0ve@^7ax*}O3U6c{LJgIS7LqW$jb!G#Z}5?g|ANJLwgeuz%YX)u z=}oVqdepTKI%W^yW8=*hPjva4_#IfXh##a=UngyHS#qd%A}!2L8A-=<2YlIVAxRqN zve23mI?|u3RfYOO4ftxP;Uw?N?oYR%*m`X!O6up^LFdSKkrZNgugg}-`H?GCfPnZg zJYD7vmF|BiH)RNlgV0rBzlErbQqv9Omf30Cg2sV0PO(E@k%&0u zU08CCRmT!Y4zY3$uu2D0uhHZEEgQ8`_s(|BcgMNfA}`j8A;+&6nYry$B&u0Jx@-Gh zj0w~Ln)J6@)=h;bTsZRgVm&@A8^_lI))1v#!3-L~=49oKGlkJ&feGi=`+uyg!p-f< zp*ANRZlZ>1@6FHY`gx6SwQF#6jqzt<7sB+A9k`es^G&Qscf^?hLxC%&zKJ|-&<~Qj z%=}6cDVG5&dlaS#5Lm)v)Ov{`yzF?&%;M}L0*{x&i-09E-wg$E7!V$OUYLbti z=wb@ac`#jwOq?2(AAz67!<>*)QzL|{abVudBeh{|{0X)Y^1Aebba6(#TX z2IcwxV`T{wJRGrzxV5ZdSFivJF;YGr+Z;% z|2MR!s?+})yvrUuR`{keysY>@KX4hlEis~wP|E8zorHa1X*0iM{S zpZOMwxQjt;>-&2@UN^c(unA!H(|~EZ22m%9PLLYQo$XRtJID+XxZp4>*`EUHNk@Gw zHFQ8cY5eUa7^AMbuLs#u5HHmDB_gFn>Ucn)f#Z<6NML2xjqJ_K22YSrjH))XcP?ne z%&zU%T%#A@?jm{fT|WPf2V%UsC^l3t*I8#7v<0izv&S8oXZz2YzC4nF;7*?AJiDlwvVvf$h?YALtDvzO~`oK)D)8Str~|n0;>V>G}~dcmluXy zSVj#m;;ZE-h1VQ6 zMCg>KW6yFTgXlN!z^0f+k z4m4z4`xk+0=h^FtW1=c)X#$9rP>nG0R4)%)M|~?ft~@6+ko0%D=(`F7#ui$>B%>g> zAKsH89FQ5IKKOnd0b(BI1_dv6W-x#U;BxI_oH{PJ<^V`LQ6WM;7SVS9>f+4rac=IF z+Vz$JdR~CXneAm`ehH*n;~8zojmWykm?**Wsp8${{wbh+gnte+vukijT-I+lD35RJ zpOU5)k#KRd_sQ3`vWYNrneerB=saRM6VaqTmnnanm2p}lIe8dgbI>{1sls9b{*Or) z=jKzGPyDziv+l{h5%L1Yc_LN>XtKCcM!t`spiI*>iD+k7cTqsI3oC@jE&AZ9!Mn$B*no=E zJ_+Sztvrcc@v~?#py$I|W$=Ui=Erxa77DS7^1n_%9yA!j34BJ=%liGshq7tj^$=ECrKeD4graeLNtK|8w>%S*+_5{Xx*MaDGJLT*C)p) zaIiEQ_rk5$W7eGO?Qy;MQz+cD6=Zs}(iSd65XW|ws&P}?7xwqvtpW(bONUtiG0+Ft zu7AV4KIvMkg^1)-RLrdGE26-zJDfPPk0t|-VaDFBMAEFE8z$b`r>31J0iBe^CaFAz zpG)|8+xb5l9dUTO3Tjd5xo}<{>oScJKx1z}k_e_~me-2!FA@zQO*}frrO>auPW4e> zG0xfJv_L8}O@3K#7QP51t!Q;fWn`8n+T#8=18>Ps92Yergmi8j7P(>2q}`zPa`#B- z`yQ8Z(915?eskFM02a1yrp_g!$zUxF;m{YkuAy^QB)VoFet7?eheUz%0^=wWThd&F z*qSa;X0p=$wVtND792aaw6j(Ugvg{rv{-w%a{GIVfJ6r;BvYo9b+rLmEzZ(8?ogT` zrW4Fv5+cG}L!jL%FE*ui;`{DLTol4!05>hH!!W1Sg$hxtO8w+=aTpBu^*grC+Oqba zUvfH6fyHnqKb|EA|DejF`PDJ-vvCR=AJSpvI0*oE#6Hv38L>0ral1KM3JMA;Ig+>B zZa5WWKzBo>-h;=C|1eTv;+(W=&mHxvxv#w(TI%QCzE#C!v$^4E#&7}ezq$qL1EA9lZ0im~s{+KFof!@Efwv&b;No*aatz{o z>Cwd~(-EWIy>38TMDnDKaP^hLGNotu{tHNd<`6xzU!xx63PG!WAb&B7|kXj*@9 zf71#_5N(|2)H^?Ly6X={P_7LaHiU+ouL6AUH)wtAygp9>4VN3roIpz+SZb^LJXJpb z9TS``?hnkml~B$VmSKbN+TTE~p=k#4u&N>VIF=kYX1Iujgu@Zn zWM9#=wV&CT^;lY0ge#-q&UdFp2N3^s%xvN!E3%=9Z-(o(h)y80;c9=eGU$)qiyqgD zo?K42oriGQ8NIt7Vq5-@tDN_#P?~48+Kl};fYKpA;5BSS%dk59wV8@TFzjig6s5hw zB&uXzF~MW)@T_kR8UF6yclu`Wm_sFEw~GGWIqrUnSEflZFV)a<7kDW$_yOo26_OkxSo8Y)+i zcKbR56(a46`f&APq9V#!?1Pg5i2ksly+HSPqe0%CQ=~6KJ7FmNyRFd6k&CP zcT#PG@$c5>@+QGVcN1S7Y**(e^7RhKiY<^Yx5$PoIUA=n!Qb?+7IOlb`xB(nks)H} zpZ@>apo%Q~c4cZWM!8nI^W7lDFGLhtBMDeC)_+Hn{gx?3xm^YF_EvCJFXcFy>=$2< zG;&wKn)$EbF3HL3_1EADLc+N=$1QzQTp$i=0U;UIwOw%EE|c-fihCoG;kU0HX~=}# z5VW;3rx~S4oZiaA=?Tdoq)+Q_1XF;$MTFaHG^6 zlmk!;7|~Y1(?mG7vw~i@`8b_GD9rBs;#J#(=;JBAO%PYag)$?Gws33qc)E72O1d*X zd0RrElkev3kZssv24n{EX#hL2#Q=GZu7^#JYuu%j|2k91PH=Lkl%3cq?0`R66m14b z@&vD~3qTLwCj+6E+uyzgz;iK`rn@2|oK}uC?2D}^- zv=a3Aq;vPI#- zhq{&TYjmDJhIL6&_&}i`u6?n>pK|fiaSQ6^SxiM`LNev`plXHb#+4UHL{3TnrCW@q zsSi_0GOj-&MjWvXlJ3_nWUs4nh%5k0+8^@|JJc*0uHac5rJ?R%U`2nThd5N&Xi3{OZO^5zN_0qO)Y%{V0<6*Y zmDwwf+!ZB8c{och*RbH^0kLMXi}5KwyXY23e{>zI;SC$wQz z?J@n))%TA3TWmzB?c#rfd{EaXf6=L&H#3R>ja`rn_R^=c%n8W&<#g3sn1AXW;!-5j z1lAFT90p+`pbt5%S_ggfLvH*}HgJgU%lLw@#>k9UYzIWX*&2CSWy}3w66+^syNus{ zn(uqs(?lN+HH0O|=m>byB15PMKo$Ou!^(6wJ)Ee`3vUlh2q&{gefz5Dw4wtP1`B5i z+rnmNf4J4+LoAHM+Q`diyceaydE@QNy`nioByMK;4qrvMd={9sQrj4@i>PY#A=HI| z)zC~;dXq@7zCnV6OZ+}Loh3gjEpG*SXi#I1&V$f*89=TSzr0y(tCjhO+I$hb#)jxY z;~VfeL}#6}ZtZh|o)n6+tDRfJqjBnLKzl;r$J)fwzq>nSWgt<)JoD|rv@SHX6dkL% z3=mX$*AafeAZAVJ0z`mrJz2GRfD?(L#3a$P{qPIjWxV3x)_@~@(zP+ER#|E19Jko-^F#e&W;EKrr%X}(6V&{(Agt_Jtu zg5)N(%lnu2g;)54o^JorNE)SEJ&jFjkUDVOf@}H>U?WK1)W9jt(7o#0-Bnq$q-7=-UM zrv*EnUxRwFhY&tDI+us3R5!(fGz`h^$?p6jNKpB}MpPFI!)YR?FYFVsah6TQjsryX z$TtAa`epOL3S!O@$41830ZO}mW3HeQAu@>My;1in9p7PuQ>q|52t(wzt6*}GY8n7@ zPu*rGWX9j@!d={G$s&ntLvF`SAO~#pole|LANV&}#CI3>Qr2!oWx+(}#(+^Mv{q^S zNT)bk-_Mdt@_tiKThOr9qOwOvUe`Rb!sJAPiQImp0>PxC_9gTf*ygk&(e?M?RHW?Z zuNe?lbW93Y{8s&Ce+2qf6JA!oqGbD#OYu~rmF-4@4a#nrPC^~5@PwRQv>pm95I0qL z(idf>fd*YjcwYiTC`8fr$0)^vt)>ipy5{vQ{WL|+&=7(DsW5KO11^cH0*>kai{pmN zexiCc$Zsf~C!jzTfXoPN!sOnaM4Z_GPrTwhdsHO(z)HPO^d;8ZibYAw)e~eyAIV>A zs7UP9PW8-~hWf5j@r+*)@j5kF4j-KXOT<;_Gtd)xCjsVoj8U${Mv`Jb*O61hEl376 zaRmtJOubu&&Xj(G)*m3cTF;K593GrPfvc(LrP~naj zCe5dXPl6PiPkr`wNc&D?9J&2xT6tn+iWQ#5l{WBpP671umAdg-=^8hS1|d~K#_@LvYQJo_kp{|f*lK{NKC=Rp8uy=%ENz`+F5 z+lq`5h#kh}*a?H@g4V-c84atlh;i8(L%S6gKQ3q5N%}(|w!W8zM`k9$Gdt{}x}MA< z-Yd&rCqsyp*DM)ojt8bQ+8l(1ci!6sex1suUhX-ASDCjJ2>>-@K30v+LH(_lt);7o ze6E3LG3x^o8IEC==AS6!Wmw4@0b|JrB-9@t-CFDc$yZ7lCDt#KlDFzAIziC1%eL{k zn8ZXVtYKPA&}k)D<|&c8gI=`okaux!jC_^GJN6sILp6+Eren}2^Jm4kshs=;u`TIG zFsa$0RjNqH+Bs?D%;fe7*_t-}xs2GmUJHigNdSe$fd(MzW9Eozuk8%jy@_H6M4xbA zv_qOb*63jsN)(7YhgTwsqGm@^DXSm}BhXq;zV=X*4J>R*8Xo?juf8~I#`v+=facAR zN>dVZ@LYu}t?nG+%L7A85W5>_%a-5x=~o7>&!OJD&U>y&b|Ijj zL}YnH%nt~pt5*FWXT->MOia(R+)1K-LSIrx<+;jew#h#QG~G-m$u&8~P5xTj|9#r; zu>IHx-)Z@Orn8lH9S%P58Tf#2j`vRD>(y$BL1=h(d2i-@%RRl}+4sjaj>O<0q`UndNnLRPlkH&5d{6sFfr87BGrQ!q z2PDH5Zws3*T&K)gLh;%$mgLpj@t|)-%k>ncInvsPN!`>J>qTiL`*Iy_YeYyLHFS!o zy*A$5Xf)GY!fA9^N|8uDw2cxS~s72BW#T9r`syT+t4 z3Z|}o^`Vf>!Ol|I3079fz@DAht56p!zZhR{t$)B4mU&mm<>-L+wk0PjqQ_T7A&jNF z--g+cEUS|R)i!}10ie#uucx)8G@!FsAZ-H$P1qImKFwXs7LKqtcjUFbAAnxQ+(;UW^Z{x3)4a~)BN{2>0+@R zej7M{<&$qtN%gp*OCgG(Doz%j=*Xr}m8m{fQE;EW+6Taq;sr128MyAf#EW{2z&JX$ zw~lB415+P%9PHm>9(z22URfJI@7}s&Eu)8(KEu#iXfglgZGC`LP`J2i?#YcN$ryq= zMh7=DB<`~s=5!rVUgbii+;L&p&qNyZyZVNFo+|0J0CM`(Q0@XLxu>2P3+;u}!<5G2TS)@w87L z=JXz!jw!==k=bIjG079qSDI%-tDP(ocA}|u%dIaqcNV6NlJB8bAusX1h@9Xu$}sh+ zc2B7MTv+I}A3?Fy z5aGG;C;bqrG(VME1i%;yGTdSd*2neHg5ND1Od#xsBXfk*0Ynxlov-~HNv|J%0aw-T zjlRkAmGxcAK*mSGGys`lA0GX^lOzZnx@1T%OL*t&1)HUu@Fh?wg!EJ#Gn@fhNSUV5 z!PrqsJs%Q9KHgY+hx8EoBlOEUul=q2GSz-1t3M@dCEPGEnbA)=h3pSpjX@`{i#8T5 zgTfbxfw3fLtHn50wpN6s{H5JttX{scC=WYuQlJIF z)kRbg@fChQGWG;Ra}8!dwFP^&7t~Z|@s&&m5cM}}5xZ^WPeT(>+O2PcY`520goNG+ zGD=Wi1O)%T629j8MPJ~uzBZOy#b?AK%brL>8r=vq;|De))D(J;>_jjV_(MWU0lV?I zT~Chs-Ueu42?^>ORkQitaoU%=rf=IiD-E-Iu^70YGOTTmIgR`^`iRLoBlf*_Wj}C=y?@MgM&G2$}Bv{&`M$b^4 ztSCP34&OO`Q7%tniNKUmU&nut`9_b*L3+lu@>ezF1#Al+|8jp-QmQUw!ij`28IIh5&#J3f5`%GU1&wbZ+woh@jeROpU4oxroxww<}f6W z+m=!hjF!=E>uz&+`Qxiv9Qg9RJ=3iGfJeDTMPZio=oZDs2L4r`gGFTA6Pqv3q|VWz!2E(U90JClgZG(oFOuz#AoOmB?N4pI3 zPfSNTuKG#2+8RWQMLIMgglI@Rm=SpyHI=rc{gt~8fxl)BMYI{I@9T0O*zWU-z)yma^j+W4W7~vd^yTq)J9>ddVN@>P#eiWMz3_!~^pXNxWPpWhuK+VZmh5N>DKu zylLu~3GYxt5id0C_Kva$3&w>1&JJ>rRL1DNO9dp3U&;a2p4qKUTj*hl`Kg};)*lJl zSADuSY-*t}EMb7P$b6-UMH2mZv2zg@_23?bq4r?{X!*v`7S@U$N!w83gqpdZ4)>;} z*CzHRQOPoNAG)R7BYzZP_r7q=1Ob*L@7CtVyIy}Cv=IyP572k14SHRFQ!y>koXn<{ zz5}=UJunk^KF+giB5KN#iyCpZ()G_7RtWBBGr|26G4bYXqDbiN#y(EG|6PK*t7?yq zKn+J7o)Xf~XI;g?mIytUp-l--`u7P7Fu5WMAq|}B<-2hk4%Q55*Oxb}JW*APg3f+j z&VyD0?Z2`3-PM#GZ5Lm-P#iZA_6L6omj~uTkPb-}OHyNSQ&mu|bZ&`rOvhjx%IfC^ zf^OHnudj)-7MZmc1AX>(8+tHvO7!eW7wFpdZ?=h2a+}+o-sIzyJs}R3s&KKn{WBya z$emBdreQ^*yusE*M5Lc2JrN2v?DWt*XpO#x9&T)<_G$WunLz_kI1$+9DScN;ZttBs z(jySv2ZZt#VY88%+aF5h`Qr?od5!Xsw7#$lagv6skx(;Bmv?=toViDn1|uGUJS@W` zLYA>8I3iUsStHHhC3pzc8_Y~F-sg;Y0z-%Nl2Y-FnTs9jf{r6(cUI}WiIW=(QblED zW^tnfZhh?I*z5AvJd+>fIZf2nH}BDCR}_=V8O8whS`z|;U<~x*v1T;C*i_Ft&#F#A zO{s1xCH%+kvjEHMiSCPZqi2f1qFG^?v)R1J)u5r#5r3vw0#He^#YWZZi*YXrh_;3` zCyCw)wf@_NF^y(1w|dH~@?hhj9#ko9f}%8-vy2kl#YGTQy^$V3j;eTbe+ z8h+;15HE>mU7a`a?ANtd$(&fImzK zTEaX+eg`VcQ~-SKjd{~^O2s(|&|`jt+hG~psE?mNirp4-M)~nPnqYFOjI;YAQ=U(U zTpg-cNO9grTt9Cl%627R(GLU819Tg_9o4;{2=sPT8Jx(uHNXYx9cK900a&dx`M;cB z*LMT5U&ofTPSJ#(kjvUKQ@|2{cw!16|{zetziiw8CXZ{j`jU=V>0iDkJd-Mza_4@!Q! zGp61o$mtAy8dDP-tEk}szn;sI`y;rabEtb>M~x9Jl9eO{YN_nuF9Y~qe!yy#XWwXc>zZqIw$Ng*Fj7x+8eH3^{N8h@;&Vh<@b={}dF~f8S z)efen$JaeXOcSE3tO%5@A2wMxQ!@Xt=puVRrY^aPAkDRVq~hW zV-f&Pikcs&mNv@*E{N+FORKxZKd7KQO<_ZaKo04?mxaj+B;Sjm3BNRS6IoOF_?Kl# zXyY6TXfs=&*XdgeL%z3#RN;X@7DJWE2zH=nA(u{YusThK04;Z3O2a#`s(uiep+Tf8 zk>`sSSf`&e$60f8ApJ*Wpm6qt@D{26ZKK=&O6KUw0UsCgaD0@b+p+trYesWq@Y=DS4-zp+$es5}(@ zCCT>rNt&{4aa0G#VGJKM-MT(%v?_$dQ%QdIaA~>jogIs2v^pQ5=Qk1R3YV|jfQ|)3 zXT;M6GtxJZL@LRbk)L}^1$u}4AAI9L5yyz;*lPWU2}#I^{vT9TeA1fX!Ofv2W%Je^ zqNoHf8(b1DLH!kKQG&3zP6p_JCZi882CL>2%8p|&Shy~{&?2H)9bX2sH={-1mUGC` zAaK*{frar@POL@B{Kg*j8>i<@! z_d8ElEY;sU`WT#rPynSI2`u#sy&Ch?-=42g*hfJ?NdyVko;6y|*@0SaJ4gQ^11c>c zqLILtkSBVWMiF}!oPfB&=$CqTD#d^2Q8$(1fAJ|*-{S-A-*jOaRKC6SFGa)Aps;IW<);d^$|gxR8B!)bJ%;WLFImu412@MvU{r>JY$e2O zdi?AhZgb$eI?Ja(b_BoS5Gh`$y>;p1x1_pVZy(=vq1k#&G4C4@_!Y^D}6{n44{yy*~*)H^F&Lf4$D1Qsj!klrA~&zF%F% zUO-%tjAbbFC`sFC(d*XSiudFF`ZFh{jtD!%YtRSORIad_)`;fe1eg!2STDJYp^Ci( ztLund7BkNPs}>TywiSt5BP1=8B{|s%AR0aWkyjN$M#TUE2f$UMSPTGDHVCHzycJO? z{Bne$AHJgy(iZkgrJbi~X6LyHu+!;s*ARBu-N}Igto<+``@*-L+yQ|5ovk_`yzNXJ z0ZGqwP&5ZuQA@KlcfBGkK)BHGTHTJm${&cWNbxL+om;(#F=3lV28m}T=gMh#$wlSm zEw8$vj6g=gQdIA0sMv%*TF%r4Hhs~^R~%cDSC2ho!VgY(B7*{~Z1y-u0TIao39rdA z>Kvd_YUkK}uqcn?ovC-wYugD>A?mq;(q*X`vdvTbBn4Y7V@kmnuik0O0Y$sY2?uQ| z@xkxXqzs%Bt{yy!YX38^k)~F%Ry(8d9iy*taR}xHb3Km2oicTcxf&27AVqXvtS*bu zoCt24v@Ae$_cJ;?(`w)>rl672wSrwDtyurm#&BQQs%O@7eigCjHlYOWs5O9~c+7K& zIve~s+T59Y#&^5oOdjLqE>dLSsXAZLJ|xWkD9a=%gHQTC)a*^2t+K+8gfyhyr?klu zqdy=h)skM;tCW~&zb0HJeFM9)C8K9PXu-iwxx}C^jbO(&9)y3 zV9Fc9&sd=Ou#Y8LTdR=`mJTBYnyG|%E=)j;M=N@pfz6d%z1NetCmTvY69v-!AX2Vc z1xrT{s7S$e38rqQz6-IFd1idme>@x}oy(p@Qq)o!1QMp2oZ)Fp=3W41+UzFFM`U(O zsX9ML;1F6BOha2=25kdDZ{Fg}67Vl5Wr#1^Q^O~k1_#v8@qspaxK`>zfw}4gOOFf! zNjcQJLrHBi4eRzi*;P~LOFzzvbG;*0=FW0-Gtc8RE!ba1xPJ-`pP#0gHdIV5&frqc zydoRneKr>5P!}*Z(GaECzCk%!B*M0n?KWvrJ2Yg95_q20{dtq-#WQiY%BQ;bK%_|C z{g)VA4;4(=EB$l1P-EMt#{KXVirt}tXYEK4%^>_iw5|fU*VZsQeHcaab(Oyc={4y4 zRfMu23VDY7zVbI6Kb*NF5facP2$8u7wB1aQCh{A7anTcQ(oyDKRu7AHHu6lZG|kNP zg}Csm_JM1BwDnlnh45a#BL-p!uUBrkZSC=(5&!lZ8lEsTPhR;y-pJR5*@xf|399^{ z-jC31?-PHKW7Jt>Ln5B6MG}4ssmc9EFcmTpIyG3VGKb-tvHa3{h0^?2%#%OMzZv|U z`eAwOAktg?hT_2=N#r?8+MFb6{u6XY@>PzRRr3IKb|}gIbK|fOAB^C)G}YujAU+3V_1fw|ywj;`*6|jg%tu{td3t{d~f|z4K)Nok|p# z(uRtRu&a-j1a;!kX432?SKxbVSZ-Pyiw^Y;DbG*aJNYp0NI&))+_GQv8t2<>&xE$u z=4_T+Gw6e%L*Lb!ULxA6% zN0ao=fX>F~bj2J^y&Q87g7Ta-oYv{0qA2!hjXv+7z&vpN9H(r9KQ(r})n?s+zq!9l zJB(SsLfhZSPNkqZJ;C$q03FU$_ljclD#}bp0QsqU0?R0Z{uBWn3DIjjJdN2bE-^G; zD`?B6Tq*1VwkQ+@-8U>cu57O&` zT>RP4+C_n_`a_xQ?XtuwS6~0GLn>3L*QerGVDi+kLMm1q%Ha5$4$*+Y>@wj)DoD9n zk@|E*-Jry{EtE!&&i-?&6Qy?HD{oJR7ZmWIB~1tqko!)n7fG?NM}%m6|5$_Fjhoom zDej*ENmGoTN3fN$0qpCV1yi@n1CT-BOpYfCh_T%+)pwq@TXdm9D2@?y!jYHK(h=)j z-!^uvBtK610HRof`{Ap+i|Rq{|Ec_#AHSuV*n$nONKXB|X}S!X^bElBV844)HE#}G z7EuFy2Nk}e&{y2ft)vrPzmJk=1kKuI2ZZI>IM_L3`NqA4NirO8)en=HikTy!qsj3*^~mo@gON z5I*|;R3P;MiZ(PkHC^tcXiis#cE;?Ezaa6g6B`sbG4M{%49AhQLoZ}Vj*rHyKHk;c zG8}E4@_aai_!*pjwcL*Ahd4!4{;vs7k?ZN($ZD9rlyXP3`+-U;tgt(nMLe3~!9|t& z&&{4K&XeQe`WaeCW=KoC05>_eAhyFkD^8d>^0@=w6LM@fWyax0{Ybnrb3>Zu;e}Wi zWoGK$5V|lzUa%+o!Wb>J@4e%;m?nAIJL>a64#NIl|CdLJHV(xBaeKFSzR|QNV-qx*-U%^ZLP^v5Pn3qx%=0GiC z(H2n{nemW6`PVOtOusB$kf!lpO+Zs+4Z^LHtWP`pFVk%;G2Bd=NU1M}zOwd6TGW9O2qEE7O29kqi@yWV{8Cri_V_k7)GS2t%;KR~y z?ubwFLFE2{V5B1TLHG8?E~1dKhW;U<0fBYrVD$AYT4KFK`)hF;#l2%xANqr~64SfofW$Fk$kt z(y?07`R4U@rCt{qM?!!qFXmvKyn2@p@8vw4EPLP=Mr*AF{|YtJk)u4(YDtD!t&R`O zwFE}rbsI}3MqWl)yha8z)Fd}Dxqvn9k_1=SPDt32I?WX%Jght1a4e8Obu4<9gnG*cAJDgeX@|1X>bSPAP-b%=OHrCq4{!)&ivr! z&-?{8C6~1!03Ho%Mbt*Nk9yQpDRA3JBPsMUluqXRI>DwoAfcu#>gBxl$c858(!*?3 zy!QF=org^BX)Ff_&^tNB&a^|`%94Nr#wRjrRKHnV`sICT_jiO({*YZ-ePUvg`J7@* zs^XZ0QKokoh|%=tV4!Q;(pyXNt}(@2ebqo`3tMFJOnGJ?6o2zyyg0SVMz%{jY!X-i zb9R6@`&gwx81Ytr1gpQb<%s<5!h`wpKjikt`&4jtm__$xO zlnkoj!S@F;JGs@-aM4TaC&r*4#bT4Ey1s~Su|y%y9}C?#XY!VU27E+2-He|^gyqx- z>WF|P|Ng70tBV~S9VOg(OK>B687|#!2Qwk;893s-z?z>lHo0fFvz0+kqgDr3Lr6HS zYd!tUrY=juesI5AmHZ1rLU8|QM*$~J(~f%xodUpy_RuY}%R_w}4j~xG28UbZIJeP_ z6n~<7`RZyj<2EGWd4iOenraDg4l+j*wpI|F__71sC{M8o1hir7NCZ2i!gerQ_X25C zz;g*PBLo$VH0k3O*8);epue$9eKPHpq&v;Ydv~(iu$JrBffq0+J+KTD20L;Y_>2~= zeAcjog}yNQ{rI+cevXdBwn-Py7#BhDFrT-5`ax>lvtNjQ0Z^8~ zI8bH3+BtZIO_;k?rN3{c>9$>)*@zGLV>>EFhW~F;htUkNj#hniF0dZd1N87CY?h=J z?L9!Zf~&y#N}xm}cC}4hk^?

8?g$k19YM9~3<`A-v$W7g|MX9Zx@_xgi3lT?+_9D2JSACVQgB527V!acan@#?mUI%w5+ zW<%RFC|R(FeF~N}g);QTpWRni*XzyHl~|Hh_|3Qo=#)AqXM+qEU43CMLUYir1OIiVh`?oS&PNqh5=CTH0+@x#X z7p)Sq@c8^dCAh8FENsBw=h=>kb;$N;JV})n*|~gMeax?8l5cLSv-1_0GQ9XxU0QxFYxcOWfotcSpk%iqKFncXnDulZKnxJ;eC>Vuv8NB#Fb z6mcsO1!V{ZkHHs(H}0~|6Ub$O!}G5r{H4sTCPVW2JlYBvv5=0=vE8r5#Kbm_hGYhMxuywh}d z=@t>zwW85psx351;Avx~8z7EPxfw#do3Vu#)(_Ur-(b+lRi7+-g(yK@w&e?fM9^`Z z`w0{yIMHKJa9AQHq{Z%pOLhwv*om;6+7UQTReH<{IG<~McCZE1m`^6{{k5F>|HW+Q@>!=P) z7-zZy9tQy?gq9;`TF;ThJ;HuS8%WRD=CY01Kl!h^~2Jkb^z$a}DUAS#JONvOXXf`~wYd zoYY5sfE2|0hLIC0+56++*3Qg_NQH*3I&4~1 z;y46{V{*u4La%{fR-~|Vl{Hx!Z-K64#oRHCnjU-sDQI?OhEQv!0!GF3kNae&W;8kB zilU~=3Z&~8vek~dQG@A+8^5^K{nb!4=X5=7wA6*Cda414=t{^1%WyyXf^n@2iB*N= z2m>=0Eb~U;?M8vW$?;_h|@r zq9K9~;S-WN*}!egJO`vvIc5nqXF1}6%!f_KNH*y*fW<25z&F3={|<0TU(V;yDQC|v zp}X7^c#@sDG3l9}M`_|q>>e8Jk`PYdBCx+?-pAy$;%G)3IX{6IcK0qNr_f%E|0i;3 zCFHiUg8yk>)6PK?6uV25G!AImn^A^3#T7@pwt6VE@T!`9-s^S7 zqc^+9lcx{=eF5pqjsaW6#ji;Zm`7tWq0_>lc6f6VQr9{2;@Q5L3FZUj2sp_7t?6RrGP;pi3;UnNqD8q zSHaV9l)#V|z}5Fpi+US0e^RG%?abGbY^9Y(iAawCJE35y(dITpfFY3%jhf)FY$eB+ z1eqC|Mt1;0flj7O(yzmj;~QMdTkmXcUZ<9D<#Y*duhBKHbVaplvlX#|o8&a`92TW`&zm~w_Ih6h(P>xcZYNTv*}lbPFEaR07}DJ$)}y#8_9!38|AX+zDsG@S`Itq zUluuN-SMLQuweIi>BrJ&WC~@aZ;#Tz^3he~Ydu$PUDVF)X`9UM;oa4+NY$E8IOg7f z1183a?;B&)CVAEXjG!ya#T0*CD83h0yS2*?)IlqIIDh@$>~d-a1Hrw9D#At_QPp(Y z6vKW0rC&l;`O@_wpg#}*KS0307L1+k@lz0GQ^&o3YIQJ2o-YV)6T+$dv3H$S{o5Uz zUj(N=! z!){k24xQa)2&dRrse#&!0(_zxFA)FRD6z#oZZ#!_&Micr=S$M~?UYT!W3N~5-L4!+ zG_kegBn3W)AhV$XKZa$l;-;e!M3$n{Fv*pb^?mO8#n2lzc^h!qFHW5`S(Ty|Szs7q zFTsug+Ag6=TLDsav-R~FUm4iE3P1W`lpuy@w#yH!Hl;wteQqGg{9V9B~l9y*;1$HIb2}rETHJ6_JmXwr%D$z@)4! z#Wm2_=NJ7mNWYq2m6c?^90=`bXU+0BRa}gg$e3r1l&z_wqyG-FQErSZ+NE1@ zqh5Pc*0LLI@K)9$b3;#G zNy^x+38?WdO5iy{ZdvB$C6v-8gDg=}j*B(Ck40{=v3E&y?fNV6NKwuT8@_O9%sPl# z{cX#(=F%vY5PKf=5GXZzAv`G!tMiQ;1{7H-m}j{xsYW}4YCyeLlUT40z@egl4$=MA zj#XLBNkhu*kfnE8xPo`x78ym!TEp!pkw3MOH!#%UK zXgifZu4GxA#7N6-OqJ%Wn3+0byU{dQDU!168-da~loBbtn9GMi!C%e?kn1s*1|kj~ z4nw^cI`A}Ul*1s%IAW`oBt_z|Biuez062Zw&Qli!!6DEXAj8keapuwOVW|09fU|5u z{JGKNnc*t1{;)E+*b($v81p7#d9@C~uh@h!4w6&|iVv&e10gjov4k0U|1Srp{?ZW( zGnx5&XsiPkR+maGvrz$L8xxsE2u#O~GbFbIYg_i*l^5dA%A?Mmwvc6`GX(PP#6_BA zwkj^)n2AF7g@PW@MPtLBz{zF}9I#He_S|0wb3Cr+HWn^E9$*Wb1l<*d#}4*Df7w@_ zBQ^oYUk|_OKWJX?O7l(1t*;`zkC$?uK`!C(GeL8tpf{Zp{@h~b^E5t}&y}=)Pcpfs zGsXlk6QV=x5Hc_psQ3ifQxLiVmuJk*GWhJ2i*JC5Kagd9IcLc%O+AV-U$ua$ zM1^a8E75rSTh+4c&%K8)<;EI@dQ3~O!EzA?04-q^6^I|Ve-L(?pdv7VU*SO}nE@lr zNszPi5_jF?`4$tPBLoU1rwV@Mk6=TeNa0p2zg?d@etwg(_FVA8r3!k?y*fib0hOzojV%u1l* z*pW46Xh#e15vZ3&u#*o5(zGH|F%dVUod8k?`PiX^5iJ!l@c8FApd>LmJk7pRm8r645UzsR29wb~#Xi4nFRl z7AG%@sjlZ%5iMgt;7QvbPx+uRtm}@tb)pk;N|SbjSZ&QY#P)V%#-c3dlwHg!Lr;E~ zH%=WsF+F5^gr}##1oncg3g(i#2)V%eF@l(0YF?^iD$e?91PnpfIHDjMLNR4U$fpZh zGQb%G#%4%gsy!;M3>_PotM*_YJiH`;QgsfyMq|dK-`)N{$(KR1l;DG!km2$T=lwFI z9}?Bp$}pK;Mz^E}*S3)cSd(8xQgjMx7~kFT)6x<)5`z;)&h51VTH1jDlncS63SYIx z18tDOcaW;|0WesYK!F=uWT20XN-NLPAALmJkI$#ThTNWou7?s{Ab3ZRfzYUA^-_(I zW`oGYfzz?b4;#f^A>_vuz#3%V<<*RB?+Qh29P>QbyJNW6f;WDxH2JWjN80|yCD&)< zc(g9#V%w+c>on~ESOS};w=TG#=T#fhz~kkSk1*tStTpelL<1)pM zBD$d`dtj+jb(Z||fk}o$#0AI>9Zwh@U;g$J^1q(wGHfU_fYlYzP?kDLH;&6p1CyyK@5u@>x8V!0;1(}gM_ zohK^@m(kdZ#zvF8e=ZH;gmp6>h}Lz=ENOA;FM+;Db%1Ad0)fj26H=G z$&C)hB!hf`G4AaNUdM%j4hxEIejV!+|1HJfys5ENm8~B&y@}59(S&DgkZ^OQV@^S; zBYWEm1u5F$U&o{C+bQK!g)cCiQfKy)YpP=bTLUfR;XHeu0Bv zOlysC{KxG1FH*D4b(fQhyz9E@IznYdavDhr98h8Z$@u0rw{Yo_$B0kx&--|>=c9Mz zr3b|$4eBt~8MQX&Lqt=2uUZ|flCpgTL`EVk|EsZB)MIuYh$+kou&oiF_2+G9kSd;g zUAvGbK&E2kczI3YDuA6*CLM-n;2c4TiAMsA`d&tloTxmIy9MAQvjaCzQ9<^_C;V18 zN_qvKt9N+a8EgO}FLf+QxY&`+H^`%`Ubfoy+HW}i+hKk|8HOWbO}CV1zXpcK4@Y@M zX|G{e9#=3k=)(gbaTm7?PLB7#Aw!D8b5Al4=h;7bmQ5mb`Vbatqq|I9bhAbcyFtn@ zbN9a~YCf`Zh{Pr7{%fhH1e$@B=A6GgW4C*p-2-k{8**W|lcwesq@5O~w%y6?nlOkr zivm`{2b)QE3O7b*SO@e{Z@CauLsFh7H2Z*W`)F>gJ)w2v71jKBUk^wQ7pv6UjVBg) zTLSw1Qi#GmivK*4O5;B)IY&wBLXam1nS=Lk-fvim-7B07YP2GZjSz5SbcO%LpS5g- zyac3X4dvyG+!31Y!FwhkWIRYBsy0tdecUWwUWCG)}7Y2cUf3TR`kkD*W4^q4nATj32jbq}2 zbBbv0ljf89)@;4)*0q$(^zWw-`gTo*W=Fw#?a(tmZl8l-VW--7BH713%v{dE(cC!P zmr>JpSUJeN8mQ}d>lBUYHOoHto3^S96yJA#O z6%mP(Q61|TuJ-dr>6AyO^k96AZc9^a27IWy@9FC%`qOp3h#`nMR{Hmx(I15V(IUCP zp^H=)qH8p;CTFKXo+TV3J&H1&qX+(FL&2;Y@x^a#!G|wA&{~duL90xAfjzFYpENLm zE*vckp!6qa;(6dPacfjT=>H(r&ERH2PN?n6_+80rtpiToV0u-(1386b5Q$8kso+bW zpYbPvnjA9+u-9idj@n=cvWFjMs);68gzs!Qs!R!8)sw$p*nX0&%qR}=bDEKE6dpv^ zxG;TCXXe^n#~Dx~=L4R0sq!7)sWy)HBG5E4(5avTc4KotmxSj$PqW*`p;V)bmQ$6Q znwW7N450mhe{#RcYmEoQLwFE7Aa^WKH=-$)$;se$fn{bRqGz_RsLl>^;M=DIV+pIl ztLQMCx6>eHQZW3McaL<)-Yh+DkeOsM zE$mpyR0y?1=MX0WtV3R~hyMgTLNW<~A3#^KRq1LhffKnY*Epz=*-22kRi#bN=Qrj{ zN43KvjUSRoYcwREf^$(wP>L9G3xAvc^G;od0KJ6!k{Chk?6YWkQBF`cUG%*b(!@G> zic@WE6M5Q!EhA?JNs zJ4(SZ?d{UlZ;8_i{uunTN`jFHEs3#^{}Ap$=;-Vvheo6H5pV7R@W9Dqp#bm(@tqVA zT?kzT0J6{x;LN@SQb?H7V3)JWRcioet{B5W>oPxQXD_h^Qrbk21p+JazT?=^kx{RS z2M76rRr&Ju0pup|!;aOVJfc>RfP*zjQ8arP-!LcW$K%7ukiRPQ%kMQ{j@yYJq#sC_ ztg(ZV8yh*{PnYIu+?g6sWJE>A=!=q%lC?(KHSkT(MLbp?qh+D)F+>{ zi+E_TqOk$A4MQLMF}0`qPI@@pbrFlu{_HTM(=nLir_w^@Ke%t3)>H?2FLAhQ-lJAC z7fyv4k657}iIK>v>N_aq&&BY<3iua|r`P?b?$AsHq@*ItwFbD#{gT?-agc47a@#s#1%V1i!$#glBx7WPb#T`6EdloCOtVi z#sB~KUs(L8pEkp3&G_qS(_e-5s?e})ecsYCx4#pju8y_ckz3(oYjRK04MyY2mW1!f_V434<_fF@1)4F#f36HSaQ^`SNmbCz4-I^LRsqKf9WKTF=)u}qrTlr3h zS6f4>CHxL4?Wn@)33QM6UK&K+`|E(%DRWEr4&liUIWxXfLeYZ9Smx9R;cs-f{K16N zg&LlrttmhK#^|znu_WsoOGPxc+gztG55XwthLTdsl)7&;*T(#iZ>yRxE-#;F4oG%2&RC25H$h=` zmkM}0KZ(vJhVoS_=xG%1d97F581e4vrGS?ss<-f`oogFJ9G)qonvA5FeR>mEEukQ z+Ppv22)P4ZwGYSj4OrSLcQ;HSWuC)qoJ{q;UUws&G96Pf8IpCbj2ZVQ8H?_=aQ#3D zJPN&vs7$hKhOa{$>pZE&HC!aLIy71Zr4#uD>LdX)_UUaE&UjqDEnosl(%MJYy99x7 z-HRfXwY9(45)Epe)|;@oC6(xke2xsNr7Q#>5A#l8Md%ogOQ68tX4#uIT03q*ErRHL z{5l}2kGW3c@oA-V`|UOZRC~eTvfzvtgmw}l+EV_E?tgr>IN>T_~CBHz|EymA3Pk4xfu)+j*l7i zWp}n9Eqp>1r3-|BK$|UrA&_sC-jd=y!8p?J$bqO+}WHjyyAApLwGv8EjrqMqbrP` zpAxfHZj3uDd~7~*rmWBY^vkBzcH5M1#Xhw=Bd*HW*;%{s0M36>mG9YsZ2xY)Epq=P zU{={9myRqg`L3rPR|Pcdj|)Sp)lbL2Uot=cgOqY!ygRLLG1FlB^a2Eo{uX1UG%_;v zu&^^}(HXmv$Pq?UM4A;2uO*-s%Uc+VKmSkmJ8^~*{M>qPIY2*qD!XLQRf7o+7}7&- zD#|;LtWKkiR zN84BWq829B6=BoZIpU`;#1*BGg79uiX#k}T%Rt>ew%3aBzyL7H;2k*##hukZ2A-uW zd}$v7MdK7MNhJa8cfRJ%QzjZXV~M;UH;NG!p%X-fT;vwe!yZAxqB|7?_3w#?Lhd_0 zl^A>#ozGsGq?{c5|7b?j%RWl%|1f9ACD;(-*xCH)l|8TE^#ZcCH!mu1# zQR;5(U~py(-+UshDQmvLu;&7HSnq#|B;3A`!(y5=9Z0YvHmmj_9Yy-2b{|Io;Nbzf zFh)WD$}j^e&yq`Q{=W`}tR%s}flsU3>X3zO%}W|DZ6pyl6^cn)(wJCRZf}&3rwbyk zgPWfob2lI4%pw|U9({Y4TbDw*gdTkdg4 z1k%m^v6I*9r-6wldVQ0c+xYR#6yWkTIayWdRmXdFuydu}Hz2F#vLva;nZqg#UfbqJ zFx%j+${w5#27XO-!O*{oPg3YiT24%Q7*pZLW*}_?Oxr+-ehiT>63j*rPYVIy)iaUG zN&P3@dXQiGWFuxVurI@<(1D^_M#3{^^i%-9ZTmQeoV~8FuWVlw7M`8?j-|#iFLqYnJ-bXu-H{%ua8d(RN{a*)j7YZAgRd zD5s8M`N;5n^#v@5Awf_Iz7zL!TN;Y z1xcl{cRn=vP`UUsLFIf(KqdWitjn}s9uKPxJ-X5mPxQb(Sl8wn4e>>XGDB_QiC89M zf7KeDbhd@PA~Ny999NtP??P{-x@uEgl)!1c%eC8}m-GhfZaIVtH_3f}Cl-LibhYO& zDrm^b=Ayc!qA-RVTBnMxuwSQ17}5TqpBK3TI`i_2^K@B%+IEfLO~NL5^i5F|1P=ML z(c4jGS8k=OhWL5CyroOhx}0{#qo1pDZ}rO#Ob~c?zbHCQ#mW|1W&xm^&YRTVHO%Lg z=0b08{-@AEIp>ACtt->#{AdUe7I}m&sJzMWZlp%-nn1Wc&SN~N5{dr~Q!v|{U{>(n z@xx!;GSwzVDanJ@s76Vn+2c}lB!l@9eF56YJ|=5@08#*w zOh-4<=?6BX9Wq5+DQB=&wHBu)i6+YCP;0=M#z2hKNYnmsHBRfnD8*E329! z)`oo$8UxY`;XsvN4VMWkjh7`AA2_TKzspNqvO;AiI!xc|ky*;bCf<7ro^AG7HE+WyBFOy12Uxo?SSVVyMH(zb>%vd|zb`dVR^5w*ph_m&{7`~XddkB*_vmp9y z@N(5xC^q#$SKil37=8KJ0=5JV#TPlC+BUu*DR2exa+IP=k%u!EEpY@rOn4?ST=%*j ztg-!g!LP65DF1ias-<@pEA?E{*XSFu4gYVBhgK3l6WRKOhr}WMc8-81l(0u#o>-Dl z<4m)J&9N$+wp(%^k&HEdAMK4bpT0HgM*LM$w4NfaWQL(n!$1+uSgFI5&K+|8jbYS8 zY7(+2MV0WP`u1IB2+g3YvPGa<4i$uD!^93A@%o@cjK92`YY5_=)N}w=dwP)U_l`}; zEZPPXFxSUHZue&bl4+2!Bo3@8TPgP^@eRD$8U*Q0$ErZijk)7xhBWVVa(wiEY`%Y? z;5x!J+^gwX+dohSPadVPVU>ZySmYHVqkmwR-=?D`v4$eG;|5MW@u+b4A!xT#rdtpQ zPNelYwALok9KHZixSi`aM^A{FmXSa7l>ykI6dRg4tC}KA?A^n^0IOGMVeF{m11j>!;1jXLF<*32qz?P#UDf0DRk5 zTWTxBbs8C)bi#by6MNzM$ES21=-OIe*A+FBx3jO&SZ2<5EcJec(Yu zY$w)G{u=^Xqp{{+6`k+_4ei5XnI4bfN}=`A7Iq6ik=h=01Rabp-Vvq_FhMbn4`~TT zlIDxrT`H4sr?R)|ez3Ox-r5f3Ewx*qRqReNp7+rvM?LfqqeCmLpH5@z!0KL!Z2IlSq~{Xd)bQBOx7;QER{;86SGmCR{4wFLz{mI{R|QIg9`uEA4^iS?->^J}dME1HAUT_w3x=-J z@US{z0t4m1QmWo(5P#n1L@Ry`uH;?Wx>%sWG>!C-jly+&U)pDYcF0g(Pl(cNz}^73 zApXtT3^lKr7J<~f#DXMAi;q3S#$wm=`04*x#}OO!Qc2L8)IqiXK&&%IO-Nzmlt(Y)>i!T7_~xJ;*1hp@%c z2lsE-mwPPVpLvX7`?=>f5Z#A6rYprFosL)-g-a%T>iOPf!2DVf%SL0BzV>d=!GY2W z?{GT2mxpHn$Bcr*bF9A0eXvUj!Sd5+&Rf9fH65hmRE$9=V^@4833>r~*MOD4m}fbq?>e6B?VFjr26 zt9GLw{rS5{6u6{@Z3jZ~z3doglpmd*B%~Ga;g?7xoHk5uJ11I1ZU?C@j)70@3-XL1 zCHz#gjN96-EdF?9^sW1H9v>XmHl7q@NnY@O2eb%XZ$^$&gff57K&l_a!Bv(yi&MoR z>NcuLFzM}KP*EUxB6^D}bbu*fI_tRT4Df!p-bj6=tB#)P0VR4-9Pt-Kn zqmUqNOEIbCs;f?@&c%#n`DM(lJHl9&QL;ma{;qNY7<9PV4awsJu|Iy-rXt{pfp}nJ z&1(Nyf?QnVvriDPaU4QP4FP~}GvQhHSW)Yr%yk~Ae0T%CDoLqF0zXWB2Pc9E0?NNt z3F=!yNRHhOwHOz<`+t>XmRJaBtVR-1=7p{R2o#?$1XUmuK3Se4(1 zOp%taFB=Xzy?OgFet#>9ub$E+Uhv@J#az@L+mdkRmY|vaeIxENO+(#>`1%A`A0Pf- z?CQW?_P~p9lS8zFWoxIYGM)6FVOubhH&n*6J*h63o&G+jC}VkWA^a6)UK|zk<6L)PCo^A*QS=ijj^|ob{ArRDAtQ7nw4)Eq>?rJhY(cEY_ z036eJAs|^ye7|(dW{)|2+-d0EZLvg^IZQ@7p|)3j8^NKm{_!wVd-#G8O4enL+$1g@ zbYooC{Jsh5^5{9KT5Yya3KDS#CodwppETer;fNjv)~6F_BKtnQ0#<4~y_{<6#9p^t zIj-mL15_GmFNQ~^7_OqlfpD;AXxvq8e|ZF&_gkSRO5W@BvkE(YZ*moshx5H}Z)Y)O zqMU{B2-E~7Zv8~NH3NhSTIt_wt(8Q23fHs%r~g|Y~5|?<^MZjSm8?) z9)Y7WS^uD>uScxAx7(W_WEZqu@E|9Ixul$ho0Ut?bK1X{V0s4K`<2!Tc3!xI(!iS+ zEkpS;)w#H#x@4nZw#@VL9_23ANZ%d%XTb76lh*&WXrQ}ZZnUEUa!KcmNfhdq0*VQQ8Z#&d#fIR zqyXj$>e7c7B@U*tr;@zIQVmieuLh!a$4G6mQjSooM9Dz61JZ_tb~7!XHcmiL6GJkD zjG$58%XnY<9DXO>kwi&pN`njims0G*$)|YUU}8`mA+qd$fBGo3Znk9vHe+D1Wnei; z%)clMyn{j!8+zD&tF*`!G;^8CeE#Z+4jwCgoR@jaY)F6K-rGUdl#*%kBpG}SGpCPW ztq3g$b>>J5f{s5C&(p#cn&^y2a(ZcwlNF8mYU!Nn$G^h!-NK#abG;nkAj*&r(@F%zz zQ37mn$9gS8Lshx%ku%y3s=a-s8K9H*Z7H4sf4E_$+o%?u$W}uTfBp zzq6cA*=*&}J6tx+8weQv_qC3${C!H)?$TGUizr@v4v;Bd9*yL>99t4B6_S2K2hr15 zRA-T14UT>zg{#MO822h89@BCq*VT-mH85_`*`OJl^iAhem35aJSgkJ%F}++f1w1`9 zjVpO}&64J?HU!JT1KJNF0??8wxfCN3Ov_wVD7lo0>oV6W~SG_i*)ad-jAWXPXzKY&sA z0oY`VxAUhRZ#|q9Ua&o^fq(K)izps-?Wtye;R|m!k0?06UEZvqmsb(%_ML^R^YqW< zP09j7(h(2VA~vqsOEXh1zZoNu(>n0j+%rCJ>W8X!w*Pcd|K{~-MU&OQ*P~PS!`^v$ zMsgCoFCNN@^Xz$9hHtt!|DGB8*@wpHMva|KA@fF;ev*kw(hzN1-2A;~CAzy9FDI6| zCJctlrIsa9X4WbpO=LYPl83ZJZLoj%BmN-47WXx zLz22?Mqrj6M`$@X_RF<&8*g7^rduYB<_b1-(n8yxSq^51f~V(@7eT=Ert$S?-S& zte~)w@%WVR>9s~t3>pw_-l}aQ$CfsHk-P`lcHlYRBQSFu;}CV_jhUYDkwN$!H;|^W zL5-P$@BV+_QBOD*q++w|l#COy0h;~`gt1VZfVCnH%D6mAFUTrKOU0`kq$ngP_gsF< z_(_{?r{l2GcJgH&S}Vto$@b#>3Q_6bxoeWw$+L@b#0o9ENLf@(W4L*{QjzsZ3BkD~ zr?iZ=Q?V&SZ*v4AXbY=nPriq1<+t0WtFI)%!StSK;ro+Q%0Z@p?Q2fwHnR7@EG5&2 zMl?Ca$eX*YjGVceh%c$yt}<$S;FuNhN9me>+k+AB$-`FbXo`_Eg_g|<^M?pgX{dsG zk$F4h?|g<2&V|G)oj!l4d=SHctdgM zp1xF3e570>f+&fc2Jkw!O8O}0V?)EKL`b1H2~x4KViNNwdtDRM;(2>BT(ebm-D-AO zqk>^9cpxZnQy6zdz1Y@*m}3Cbx`8O_hKm0Ejg$}?MHdf1a9;56mm4w%+KutUyNHvhzrACo|pHWQLirW3-BcT$5xd z6>gPU6SJNrxP1QV+YnuRsA<&25p=;KG-&coEGtx_>&2c@%>s-Sd4 z#y?$0)tOF>g0<98{6nEltQaUBc(kWI0}`N(H;kD7%$8R0T$1X}Md(_UMs}Jn%f;oWV1^!2E$Rg zsA{JfDj>uOgv={lK~&2d!UIrQ98|u!h0~gpx}X9IeYu^oqB1{{zqWJD1a6m#wtjKf zG*G;$|EoafWBf8U4jeqkaO=l_Hi?cGQ`G4TdpfDLU)t#D%WZ-RV$vq=ohy=vg{8nJ z84yQ;A%K2(1OjFH`;YVjQ~^m0X9AtdA1h7!Y}zbaNaqF)b~h`>+>m;UbDyWmeKfF*Q~?3>k>v9|$v)jEoz?JO6| zD*w`)#-oRE8<9=OedX-h4axX(anch8>^?i$|&l46h0ezrz9T527U>sa%I9so+AhjF9WW$IT$EMl4H-9b z?|L^`kgd(*BTU@~ebf~r>L-g}+I2bDr0V0GZdqaak>{u4J^;eQXfpNO{kB@RtxO zCkM(C>djw48H46%eJw*P;?M1^dj}#=L5Ts#oVU@@ z9^CJ2uo;+V1SsKxEaJ2A%TE*uaVE+HJNGmISi6B70Lb&cYAAEJKQqm~1*jpFg;w#z zUCHO~=*~{;n7=ISd-#h$G8N)Mp?2&Kq6WtX*u@G7Iv8YPiV9lQW}0KkBJ0lcRXtv` z`E7uzHQWdDtwiDPddhi;8=dO6uwz#ek$F@H+StT96lU1Gbt>2}6lEZ90R1kt3p3M7 zbgTry3GxHTy9Wjj^2-&qHvH~+8XHu0Mpo3~ylvK_|!2-wb-WbEBv3tN=|u^MN= zcX>rC7u@Hma@vqGDym6J$}4|BtIOAwC{QV?-hn{IM!nh*AaGzF5^z7b+;H`uH6y|g zDP>C6l*J8VU%-^GqpL%Fig6;17Z#9)X7thCW(mxgt%=njOz@23Ht0hZ>;7Z6AZVH_p!Q6g zt{r!KXWPrJ5DI1ejwJk0_oo24kl#ApdBf~3_aK|0lL&W@KS;#iYd56gg zUAD0tl%GwpB^hjVDrM@#{2Ksf$4!V^xKiS9qqbL5MYLM9(JyFExVESWU zU%)V_Is-EbNkj+hwUoWN!X?nhtEV>>k3diT@q&HIvO$;{x&;s~-m@#b;b&;=v1no3 zo>$=OJ1RKu`1n!QpMS~}THQp9@}I~rn#xWMYMH<+xBme7na{hIhBZcehMg~v`^5c#0QYBVWTFsEuK9w{P??41nQwv5!IuS&9J1k}%s&N8Gn6nr#F^5MN2Fp?65Ui9RRYIDCyJ(%h0lD1E*ZUiX%?XHB5mG z)6ofg{Wwc_9SpHgP48(eIATGVPA;yFJW#hPCEEwna^r!h3;*}Jx2n7$KACTQXS~N| zx1zEDx+Z{~h*4CqbSH}-3l2j}A$^RVFYOrFH=(+2_c33qYx7vrwIGD5gxNH0oT19L9=v+-mWQ07<~$XQnbzB$#YU7hl9iE!9?!NqAFQsdhHhI4SW5Hs)3? z%=_Z$G+gkwVo3wxksECNzWn9-e|0Vzs;&f#VjO3VyN*27nvO4Yfw zN(Xy(c>H55XE|pZ9(u7dGv{yH<+5LulmFe9VXqP|wcRW9#+NQM}r3$_K0SrPM&m_n;; z>JU=M^jxO);E=f=i@rrgS16D()#5NM z1Zj1@Ij7i-_77W2s}6jVUzYXJ1I}#~N{=mz3IdUGu3&n~Tk#apV$Q`YWP64qJXDVb zd(e>{3TlQzs9h~RQcQxhP9Pts&QAiCFq#+DO8g^$;)AEVt-?{1j*awN%LRTKJsnVH zS{x(>=rOvbuvnKxfW@{1dSf2Hl)`X9igXW*47+h@ijR%1mLJDkS;;V=8#^i?B0O1= zy*qIn@tq)hw}40O?3kkJQD($-Nr(I60~WYiD4Y#v#MpPGwKEIEST5X18f%tz2K1}& zfP_3L@Gl)99&6+S;@%aOTiEJTsz;ue}3~YgsnzTK`&qr;dc8%SfM@67;+O~4?#Rn$A(tgX zeE)}&gDOGElmpsoO#frbMA(F3s5MO&Nnp{%rSvZD2v@<~6(2u^$#;W&V+v?xk;44w ze>j)#Abn6x(pRZzA&XLLo<>#1xfKbvwe(;S8c7NRg0y~I0EHOPfYUQOZFCn!r~yzf zIzD-0M8LwF?UO0|u4L$Ntc$SRA@dpll!tS~X_5`GsC;bqP?El=D#-Q6MQ@~V>9n)U zkrTV@PFmZOB0{CaqWF8easJ5s^Wc&gJoPCgD!ouWN{p*6JqYiemuP`xbw=R?x~iY- z)$sVvV+@J@Jxu( zh$Np3GdAo`8~W{;w~l(iKTjT(%c=pw-k>Hwf$4Uc;+-}pFjLjttSdN0bGZRDlfDlE zZ*EKR&ig9XE}s8?888);rV{^XWRGm3f%V`_w*M^#XzD5`r=8vuj7NN1z*lyIF2v29nBeN`O@XCBev!g)#B~(^r?@dRx za4-+kl%QT49a8mDR|sbLd-8>_Nz>Sr07a)~#ykpFZ&I&6MPK*>WY;kk->K^y z9CWCK?MJ2 z1IeQPXjQ9)5)6eLqK3O2dm{z|oQX+rOq@lCI~%C29+ofLgN3Io7IADNxV0$v+dQDF z0-Hf(+Wu&G5+cn@HOQk;{!8B#O>$FT1P5V;#FPWd%|*?@zCF)ayS@PMbKozjwgp4}GR+U8FRH3nFgpXJbwXHKv%D;QzSZ@N^7mN)!0?p; zphncC29Q?OP^hOfo%F(K61QA;*4x4CP-H8c? zALcVhN?+fsDWtlfx6yHu@+oCJKmc8I7coGFBw7AVw ze*vFi0oWEwO;_|;rWVHuddwmxee*l^Sxu7*JK*S^6$aOF1Svg()H#Zu*F-<3F`kwC zs9+)>O7ZtS(XlAWCBy-hJKfz((u%!=enraNzjWM8$ZSNX-|N* zd3#j^6qR5yQfNf^9ll#2SBK!fHD)yMrlGW6&B#pficq2o0*D1CXkozKsX% zh{J=9s6yiC{R&P8AHlJg9$mD`k}V~xljgMM5FM2-N(Zh{KQ~S`+KQm570P`)_4Md#8z;9bQ~9tgG@a9* zbU$Il+*ne-?Zs5$x=HD)@=dT5x0Y3=V) zA2=VtBNlmm>$hT7(2QTXjyg9R9{{?Z9HO06I6niqBbxZ^3xA!7=j>amh)|cg_fq{e zc3#CL2&u=`7Mf9}HTWB9542Ux>Qvj`x#Xvrimdhup7qpPPZqbex}e?O?!;r={Jehc zmPUIKkV@GaB_eJ1WiP1f%6WghliGhMH!aZ<)&3NX+gsB#OhWp$%^NZFCM~z`JnIkN z%8(@w;OwxtVbmUdylLGSJ=MJ~0_B$4?q`74`Zb-i>p2>OXp>vAFn`LGfbY!%HX}?W zCW#-nB!q2(14|*L-ikr^u?p>x8?l0?r)<2`zGo~<4a+7unb3zUQg+zh-Az*IB(x5N zaeLC?BP5uxzdM2QgaDk=cxhV(2Vul|>n?H@1FL=!7r9tB*3t1mt{c425H(7W+Qimi zTC5ywdS`(-mb=B^Qh}Fja+#gcW*Y7W^6@((wfv&rf{4dV+qelie@|azv7!j0d*NM9 zhjW-CLUj^ugLdG!A%oK~5 zN@ra@w_*psXV3w9rC#YImgUArRq{_dl!E0$K&#AwD#G-Ac&)%0qGN~cb2I9%mf98- zxZG#@(u~w5bZ67agp}*?u1kG|*PhM(ZU+sV@q!^oo$b}ZF-qS#mY~%pfYR~A`HI}8 zNq6hC)|@<|$<>3frV2TV2n6Nj=&}04rQ&y2ZFBIjQ!LAD)6nyAnHb9V+@Xhq&2>53 z%RzlGkH2ukvuiX}q5W0%HPg;ZY5!!MZpM4AaJp72NRQKp(iBeo5h`L7QSw^nH&PK_ zV37?_3Q1gbzL0QYUQLLA=cPLi-t4DSElDJ&OwH-a<5XY(J3z$0M}sY0XrnQ-$f{E8 z1I0^ij%1t@-3MBFGQE zx0PvKln&mkFkXeKR}ZMRqL*90Ui@P&;()%Iq4&~=N8Z~rP++^^MgZF@nhEE7sabK` z7yUZ5vW(ak7GRNh-c}&c>ZjEy1o~nB9C+0m6E#2=Q5TObKPLQ6Ew%ZY*9*1auGCw* zVa|*H-YEpR=VdQH@h-~*W2IIWl~g~_YN`n#IeQ%2aPoZk6E~~zB)o~Gs8DUKnOwsS3Ci+e-ppTPT+l=AGG9^-O`W55QDu%M(ug7><%_KkM;mp%p*s7QW zy4T=5X(AGNq~XJC%*~%YDKRy&0T+BOLdKxooNR<$9-dr9Q}!FSk>1uyWhe>mb?w^m zd_KX}QS6-L*X-DH z<+f~aTNSlxVcGC9;q+(QMs&K}7&~;%L{=@x$0IacBW$Ec6K)yaRGkj2(e4I)orR2_i=!xHi7*pxVFDwL=y8G|C&<8p5${&*}Yaj44kvByG8W&ZYII3xiX&(}fn5~SAQMXF>l4b17?%<~NFuIEw zMx9@~DU2)=EBN3eEMX6nZ!3Hi=?y^7$RfVD#e4$Fy~1@%3RmJYsD@iBh;E6^xQv3} z-#FMTP;`-AvF@~~b1&77>*U@tsVOY zug(2K8b;W!pJ1cBsS0dQg|@8%gBNQ&`eXj_Kw>`<&%w*lofN}`5ZCsj?V zbqPY&9D92btI=~l`8Y>Xpm*+p7`=d6q}n=6yu*uBr|$$U2ktK0)AT)r-g5FBKU!$I zh4chU648e&>ozW-2+NIi(brPAirYZfWDU9`dleH?WQRTcY8XM9$30h!&&58gUD zkP#EBTWv)#CJK6x{Nf?Ar0Ag-R%voiAjnWBUZzQYA;_*Oc&Dy2|w-S5#NZH zcR{O5%f8NRQ`yED8&d8i?S{xPb7UUhMmjCO!IQ4*h^JUlny4 zeOCH1<(OOZpM+vz$usORwIWB{ZYMVT+qK$;ov_@Rnj#qm4=6lkd;1Iw>D3Cl z1OYpMiNPhvK7zhnn!)G^0XEkQKR7U#ek({amA@zHpup6vSp4aKSumJ#W;_I<(t*sC zx2ZeVvKoB0s-L%0pMHv3Z`0*i%<~@S!VS4$lgJ?TOZOK)E)Rv`-96-lAN$G7!R~Pt zsQ~lIE74jpq+e3~ugUt#`n7_!aW$&xqV5>5+5Lnu%JUP z$#J^Oc`96C8+8U!@xA)Olqdai@@rE@`Of>8aEXaeS94>5;V1r!+4KBns7W}!{!?*1 zPWa=yNv4W_S~p#Cx{lZ1Y9@iH)kADf9D+-_SOj+82MT;1m@){kzjFc)dR}!VHMOQq z0n3bgCIPrhb?Ft^S%1IgI{TDM*VAdz-AH)GH2Pw|s5`S`%@cJYLO87zL#d*oQ59%c zM6BPUrOon;JowA(V_A0U z%i#ER>gSf#i=%*Bi`30Iy`GUYRWJhS0F2F|)6XQhp!ikMTqe_;KvmgN;g^(!zTonIr9qn36irN}`?9Hzx(Ja3>kC7RX5*Lk=N zTZiire@b*@J;T9di9RK}0RN~7#C1=)6&D4bG1j9nBqc&MA04J7>86~8Tas}ovk&SR8Ww?@wV=H@gb+_=t7-Z>7glYYT zxipu9()gJoonht}@VYus4}X=^@P9mbeYJqwL)Ux>Thn{2Xs2$Tj8AD6vta0}d>60k z>1md=oOv9)wx7jmkUVI;;yQD;M9>nwm6)T`IV;yn& z;*{$BJwsW}-g=MgHj}d9T<3)0TyyF~il;_)+;(Uj?Rf(ZN`nan4JmZ8wk>)098(r5 zB3`XY%ZhJKspZPNX;A&XBiB5vJtIQ8O60yIT5FEoDt>WRLONDhc)q4kGWV>b4BtUx zC;2TzI{!`#A@Y;Y>7yDRw?WYbJ*ysY5ROHs&{diC>@4E8V$Poe=djR}DYt-#H-AP9QaX)IhIR(@z*%~uPyhuJejwYi}5zG zw*3*h9I*%8MhgNfL-6_AsQu=Z1QKFDeTK+iY zI)TL;b}bw2HHUlFAiPNAV;$LS#*j9nvhLvP{y2zd__qR_JlQZzMkL*%+ZE0KSIOjz z+Lr|JYfo}Kn~>|fBN0fm3#M|mU6LQ@53z9k(iiDU)SQTw8zn<}GM(eTm+zt=6?3ct zAJM+>3w(I$*#y5RWjpTOyW*TN%eF#>`9F6Q@BB^RIPr(%Q6p{ImVx!fjE{@Fh7^Wc zfg1dLG3~%? zKl{J7EyP+bOlM7(GPG1@?>Z{#;zo?TL#poS@sjUrht@*1xUzPi)&fTH(Sakc)l__SKJcp2Mb6H()i5bEyWu?4k4W<(gwZOlk1{;+4i`v$evk?JJH<5N!!VJ8-+)vf- zDVqef1L1TcIv}|C06MPX%hOmY0K}%ZMxE-vU$wV+8k=lqpTU7eQ9#?uJPK|J7%!NJ zNMh*oL(-XN?D2-}PEdzhhDFV04jbfww_Clsy3icHbI6Sh$n|5!I0_@3WOnh58SFH_ z@wB*)e7_gOjm8Cul8jNXif(5?8}rzq`SIv)6tvhONqPGk{h-CX>Z3~pdqN#bxGK{U zx6`lVUxSX5)vjw^e5)Q0d`Dnye8>jQk&%peS6pHnq8zmp6U|mSS=qBLD=*1&6rmtG zRo|%Z4X}hGFB;X+uwR%)Q3pSg%!S{{EcA?adG`e6=>1CtoVwAG2+JS+An#eqz_H+U zH9QYFj09_wkA1|p!yGm#D)C6g$wmE~n1b-nZw8{Z>aO5k1gSv2ibW^HC!0!seOcVM zlx4)XeZ$2!vQxoS$FV0LaE+#%j1njugZg~f7v+#5#lp87g4i8AW9r?rgO6y7kNL_3iB-&hgNti%f}ITs<19Tix8eatTjxO=0J4SJhp^A^xCE!ZFaQ!*zP@;6LhyKQ`E$fj=y|##vrTqq< zRoy{WjA7Pn*z!y2hbFYP3)!)&;M?FodE83^fwpDr4PQy;hLqq#x<5NTvvjfyCs4S} z)IdW7S9>4 zpvqNheO|+)W2QiekhF*vUHJ<4^qO?6C8jLXi(@>yKV}Qiodu`_i?}ES^%0hb^s{Zb zj(Z-xjO!mJX3gz$2iOhFrn{F|{fC_N8P4bz_C20c*si$7e4t;Dsw@4`#}RLguG&C2-cy}VF)&_K{8)>o1S@p`kj!_0)zxQ zlQN2V`7=vIN;C5nCy6jEjgMM*KThs_LEev8SvTlWll?5yFFnu|khbsVmY#s(6fi^) zBf~l?yz%TU6QXv$ON`l#Z3lgBwJ(-5TWp%HReYhdcI;q$n^2BZ8z{0^1MpNFIKH<5 zWkZK#*R23}7Dqb%G<>7C%gJ>}CeKCr$Zsh&3Mh_gjg6bt#<$V?Zd+sAatxVT(i#e3 z-eNB;$OXPOu0Fuv_$5C|sqlcSlKa9R>H$jFPg59(5c9Pp0!{FlZR8-kV6JrIXPB-nCd>BnBn$a#> z*}(t^sc1>ZDCS2ii7B13{w9UpZ%)%0xKW5!r{1jiF|PY$kf%b1u`fZu)DP^wlaax5 z)zU#eO~8PZW;xPKfC|M_GW-uHdUf!QjN~0Ldf%nM=Kg_DKSX11*KD&66*f_Rq%&^M zBuTJ>1FS9WsS+LN#_N`MX{mx5cF6)?oMH=(w&=etrX&iCQ*mc!l8`*d*lmaXk(<`d>-K4JB<#aK)UV&jvSc`*nvV^R7o$EyF z5%UdU0mp!s&Lx2yP0C)x-w37#jhm@$r0)$Q>DK|Js)CwR(Q6OEK))Z7IfJgZaQ4X3 zPm-i*BHWf;Fe_<#Y7l9-8E+_)|`O<4fp>7TUld0(FH1E(Q2Nuwaedq;E{j1-WzD%z5Iua>%j2r4tr>wDE=R75zdYg ztH1NGdq6ZI7E!D|Sox*EVsEbSAe?}pn2OuU^#`>u_6=YRugnR&@$E}T*^^jfzk?N! z&sn2e(2FP@%8lJ~$l;$!&Hc4DdPkTcSl(oR`n2EQdPBH?BgvKSL!f`N;nCfuWQ^&n z>haTvPb;1O%a@a@6D18e%B`x^ll;#^?zFBf!^P+L@xas%6auJ~ws+&HiSSf$ZU6;; zXBJqCmpVJFl)izwvYmsVsytew-7y!h5nMp6;>}aCRu#bwxrjd{=XuH^E=BZF8LWLc z&aFHSt0x=>rv+r;GG_pPUr-}>bP{F?fN#Vir2_dh`FJoJ@j=TzscsoD@rrZNX1*4s0i56V>{*)heKK~i%CM5$3E$0b-;!oo{FH=l2vhFbUMfVPzaTU&29M~h= z3d~?h8TT$&(5x_J^+e*J3k%2w4&_7edfn=sSW+1X2IeY2-ALPTQAGg$e)vndvS_R` zpR(&BrCeZo*J1&`fsJiiU;*EeuulCzQp@26F;U{V+edS71`9s*^c59)S3@(bT#n&V zmiQ#ukRIS$l#E1vU#>pJxK=7Pk#JgsowkHlR;m5Cn5mfMCznJdydTEr~#TB7!nP{s6`Fce!JBK|8Le^L>L zgs5&!dxWNZAB(>PSeP#sn&Q70dzKuEI25AOXW&APiV@pslyDVRdWB^~+k!yKI_kyr&-2e#s!kx@e5RDm3~5 zoU;mh715WZdKx?lXSw{=%{iSR>pB%;%0tXZ2YY%?DUHno8!O@+rCtSJOFY+rIn%F6Nve{VTD ztMiu99(8@$U}>>AX~ZNLq&pU3GteD5)Vz2A;DUC<%wimh32|O_D_ABTS)PZqh4{ar zrEc8SAbrogF#`izXPop1eG$zkEDJ0V&kYbSY?aL_sYe_CSCDD$nf)U` z4?vcwcjE`XE?YaVna4AX+uB0FUXv*qLpWSVw?%u`NL=lGH$>fDY@>GJes=!Y1v6C| z3oB;jMqj-sgv6VRl7>j_-AG(m+e?1^ncS#zgS|bBb;4qvX|#5{Y8m%i_wA|1uqoDtEN#Q4k04| z|99aC%dETC3TP?(MCqmA*U6(ANgV|V%r_$Ec0tYg0lS{$5tCRKhIz5jSU<`R?8THC z!Zd~iZ`)O+ZOt1Tt>)v@&Cp1xQLURw^}mOUDpubFXiwrlSj8nF;yfxHg=c(>FzGpw zrtU@r2c7s@m1PG=Hv4Z@E0a4)-HrvnG(}x|sM`YknAc-_2eo#|Ri5`wGrXkmZ&DrX z*-b8+ST||6d6G=(fvdug{s~b8l?bMxyE7*+(KS;S#u`f%UwgHFh2O}WY7wwvzumUm zTQ>VHzw4m(`(p(;e>myhKOb3Ra{^<_60%xqhEeku#fW^IcyIlKXpaW8bF}4L9Rcig zQjMaN{(r=%+KUY&x60kAERF(FKu%Pc-xB5E$c7H1&hzL$9O_X9;$6v$p;5T}Wa85z z0Z3)ZE8JqTx!UlqMaY&1LAJ{C1E}J1A?=!ecbS^IV|x+pya5TUqoxo3$M^ETP?Pir0)rva;NMf}Rgpjs--sCH85rGFfre^{rpz3;LH;?H zTs!PIBqEI2ZP-;dt);nHFJ$60j|njZrh*r5a+O6#y4 z{89LIh+htHaJKEv%k#oj)L9Gv+~kVUxUik*VCtQC5VK?QzqqYgp7dgdqVB4gpX!ra z@n=HM6=o>_MMvN;>6%8q862dw)*KhzxuLih55bir6L<6O;!&}HO?v3AV&30=SncLH za{DHR$R3u_vw7`GY^MT2^VLPkJA1J_wA; zSbCwq)^qnVKhO<3bc_O>dDKH6%%5{7B#Re;ML(!qz<`%FP)5gF0?pu~%U>&Jt(m^2 zArW#2w&7qx>DT%YzqZ-trV$2nZ-V|cusJSfq+DVhg1?52SjKtFnT<|+kZ7hr*- z*JE++BE{G;0~kky0GcIOQGkb>*YY2}kNQFq<9QN$pLAp60L~t#_9Nk)FoqrLqC}Gn zID3xYxodWL*0)->SqhtB?o)ic-|tEKV~-0)p_4;8nAD)|C^bIF4?G^PWaJ1d(d6-^ z^GFzO^eoJ(6GtXCru9{3Rb79(A+*b{Tj@6%GrE}ZbQooTkn0!cVlA0(!Zk#FQ*33` zvfT^&UfJEv>k2+@qi(f`U>fDQf{2QDOO(Dasw2o-kuZn1tvR2Qq&99$6Zt(%E z6i92U<{kD3nUWcvjatg3^TFfK@nhO^5=)l3zq^G`x^+k<;T>2ccrz;2xD=|dHYhYg z5+nOHfy%R_^X<~cpidyQk5>(XAz*T^T#asROgo!7`Q6%Xmj!4LF@UE%EP~#RI2Ebf z`!cx*TKZQYH1~^i@d^+a+P4wKC?u&S4$KAIo670lr#^-rTF?sSA3r&0 zJ&wL{8MJOqtv`0J>wsLFH4$rJPiUDrom{#a&;4UHuEw49R^#5dQ@dP!E%ty#Ld@gx zxfz4L(@Ra}qO|zjY@-gs3VdC#c(>gEkA~`);=aG0d>*eO09^I9>i~DQXG?8FL|pTi zY0WUcb7HqLx!0JSqB~zVctNjfYv7KdfP2i~jdf#PHd}K!cYn@!H+{ax^C)$?59fDR z{ujU~rT=a4L6biOi)Q@dedj)0?_?s;I(F7|PPZOJjBM5>Ar3_OKL4^`t){dSGPzdNt4f8KF# z&qKK1w*0FiqXnJD_8>}xS)&$dfEbVRsJT_=9#D3wzxU!g@cG4Pq~OPO&6_g7y`lcw z_yPDcNU4{ml*!||eOIiAJ;sJXEQT6oPOb0|Z0d}k<@k=>wB`lTYqR33Q%T-_4#K12g=MN+lr{ag zSXMWs(+N?W;x0m{>`kB@GW0m8P?`cyXn+Wg$VA0k6K1Ox^AOIfyr557v54jL?4CM4 z2guB&hSTZ+bAbs#ryy;yY|17m41%*Y3qWW~cIAFStatF}EsqwXCpyRNhpfA50$1ae%q9ND=2-~)e3RaERi(Wp7n2v$Z#d}4h;*_keoVnw zl#+mByq`p0sUFOzH(=#29Bn4Q)$^Z4ys{5n$$z@m-oSbA3_dqCG|U&wUe};2f!$@~ zc(4icQZoC{owcAd8WX%|N(&PYEaunAX8ttfwhqa9pzkyeBF0`~P`QOTIjA1L%$~zw zPzrYR@EgW_N@tdYk;JJ5++Ad`_QHN<#j7vFS=cy!Q{;_eZKul}txm zKY*_=>6T2$uGbCqffpbSCr+{TQmL*w@?f!o@{N`&;rWjxiC+KWFfh?^z;*}4V0znh z=PE`0+UY>UBMNjFW{M-Zoar)@D#4>lvUo1y%0l(%1}?sOq1Y^-TEl5a?5FLAxv!*T zH7(#T<@~>241H?Q5v^O)fb~;;EYe2K)A((!J%mXw=hfsi;CXXcNSOi;RWVlFFU3|x zjyR-XFHk=S|NLhoT0Ml|g?p509`XT*)62dT6o4k)k#((`&sQMWBP67&ouhopcvq$! zpgBZ*>~X#~_;~}VRWX)eDaE45>D^4RT!PkWA1hvoFNV_6UXWP{v%!&LPc%nX&9mByXaX5%)dE`@Plqg;&RpHU8 zr7g4!)vQo7fV2yhwwB9^Oxh76%5-`NdZfyX{uQ%{9w8!JqGV@Y|q z6jU{5_L`mF`-jN#{{(l7wfViO3O<=|x?Y@vlyn!Dz879lQ$%??ceoHuz%1qqKnb_* z=c}HrPm-UkpSDp^ofS>8(BG~$$Dk64EK58YWA9q`WFO4{rppgZ??seVaQ==`+czZK zSiD2xjwOb|Z4F0#0jYhf<{^UpD=$Hcx{s+-KkQD09{s`7pu|fWf^QLHyk@G1{tIj< zBv*RQ;Cxw_QpbD(C2{T(WnOL+;w*E#^k~!1vqoi2ED_F?4^ON2d0a_^iw_KI1wai+ zmHgvPQp6f|xj>g%jIilFY?mI54>v>qu{qN8zlDmTK5Ua!u(*Q`mDh`xC^XLvTad!V zj;W`h(R%iRdOjmQR*pepWOY22YVm}4IDAL-G~ibWSfe8f_CAY4MGMDSh-22f+{^sF zKWZx6hdPF0_4sR_12Z5807To`_xH0(40yHF+uPSqiTpG$%~;%JdEZu&Z30M6?R}tU z{L36rvz+_Y+#Bqf&+S$^TH`okzM->&>#&(-i63f*eSwF&4Qf4p4Q$n-6@P9h(>apI z*rsCgYojM^XLj$UDUe+0s?LkHJQPCA2e)8W1zvLg4hp!w1HPV#M4d^xAXt?wVbg-K zbqW6!vVi%KQ3}1e2K%|}23?)1<#iuQuLUVApt>%@%v4u>_%?rI$^S_9Ul#le#GAKH zLZ^_9tD!UxuS`sD3axYl2up8Q@mRTFIZ*m`SR=f^{&e&!U7A~9CxKt4d`n(%_(!#K z+wCR#^-xdu1)Fb>3c(dom=lf~TiC2#$70zn)Lf#Bj{3l)TC(U39nrS5la+q2CVr@d zsa|qBsxucy@?zY$x1UM_3@SDFt5P{D1dvVTc)6T|kZr0}JSnbGP|bob~)cy=J0hF9rbcdyk&Af zx7sq;%tRoGyUfiRky6i#AYFiYuPoS(BlDhLs*f^vAkh+kjvnI1$M`wM)OIYtVQW(+ zRE7P(MB2;l=jM?&KMeIMierZ%=9OZE0$o89+}0PC-Sx=2otYv2Ckw`6jI6i3vz~}7 zO3|W4C~IJO?Wx`cs%JFN)5S~OQ*M1aivi_xNn=H}7^c6&p?zW3>0&G!H2$l*X=QkQpeXL4*X+@l5oi>KYhuSAjoKS!`^##b^$PW z4PSG*;)MDjf6vxjZSQ3!0taQ|ypbWJ<9j@7jTv#F)L06-fb5@!^n>w%s1%6f$z+5x z%qAU&NiMe1CSWjGDrs~6Oeu~WeTDOo5vdZc?sfb-t+Q1LArdJOvIL)KRJ}e=Uv6Iu z!cefEBw5>eU5e9(Z2Lo56wAfB;Wisy?58{GP42Q8Vdc4=8@ci^Q=<2^YB<2>gVJQNb&Cfww%7k5z zduU2iZj_EZHR#BK<5y+5uE~>jR0cD(TO+7=R;94X;svu0T(=oE)tPLIl_I~v(NPuvVZtu;ZmWCeD%GzV&E|f^xrkW--vtN`tt!%-$LGbw=hCfYKohn=4Ls$Q)Ew zDKqv$7l-}QOWXja6(VWRdqHrG23pzl>W&TEfKAE) zAkp0&Ce8>3Mo`9XQF8;ZktND9|CKnh_&oLXo>V-&Lf3v^O)D*CcOo;S}A6$U>#rXX({9hPhvhAm57^t$$vWJEyd?{7oC#) zU0y^MW^^HPW9>o-DFeR=-SLK7g)6k6DdqKDtvnBLgO@aG;g7GM@f!P#zj5e-M@8{q zuDTdkyWlf#z;#SCn!Ht1fRRWs!nV2&j1KFucf^0o~Qr zuTP3F9EPK zb)C7MPZ?-w&bmcu>6|SPOCEp9$&Dv-;Low|sLwB(vo;g28mXE;fM1p`z3{0+P7wWD zhWuJ_W2~i{j9dW!c*IK_(}FAei#dW-mz2!5IAaD9WLQQjm{+JJcM^csdAZYtk?-UJ zXXR+eBnw&+D}6eN*Te7PXyhBl>gzO^)8%GDiM!t?5#NhX^OhkO}OarlmK6@)zS2~n%;utrZEAP z*;i-*72dOIP~k}8aLi-KVOX4y_?i56k@R-e_C8|R^yV?yl|@NSqFe2IR3+aVx38dj z{*GIb`#9|Ou=YbFJTy`R7310PdO!zSmAWNE=*b1l5wTWf+ayfb;o!0uG)6OkOts^) z{2-_!7QQ~2Ec(0oMkIQmA4Xu#DK;~}g%9(8EtTG;Zh!)E}U^u4^}y(JTxhFE`RHB*#VuBc7i`wv{?_Sv{> z6GV5YG1E@-RO~7V&$3H!fr-Md|oMYoWti>4U9hNej2b0({Ylk!r({25Z;_7SL8w z2a^f~QJv_h)#VG*{wHZ(OcmR637Bu5viURDPYs z*2QnD=drak-vm>9jf26jhyVG*pHLN0cBf6d9bxfo21yd=v?MwUfu)BSvo-!z3sJ+v zFOm(|ydsy?VnU$lfPKhyG!c;*F&T+XNrKPpJF=4CCggW&=Xgh#A@b2~{Ebvs46q)eG~(m~Ib_O~n+jZ~WXnT#c8* zbPi}oz`hmY(PraGUQ_aKV}`bTI3HBmDfs8j-PCRp=o(OR?hXy%1L_~ki>p{LpUeM| zl02qNmKHfPl)!=D7KD4U&#NDo6<1;}l67b4=2TT?q!Z^!bE)@* z|M;R5YYK2-2vJUWO)VxHhm~ZH^kHDNkDiBW@hoOFc#ak9Ap}FNkcAMtkkGQ;i1IG= zcg%9^wO6P@Ro&!y1JnQENpBW4ChAl|3UU?^pK(_Z*IJ1RR{$cPT*PC=#ENub;gAAOia-^p);Qb6E zkwe5DMvHb&pIQo&5|1zvf8SKNyikW5o~+h+8$Ro8^z#9i)E}ea|_ehC&d})qKq-twi0czuIJU zRLqbGfXst4Q1dgHH7T<&#-qoYpHa)w%OBzN*j${+eIZZ6A%id)m^2zgYHsA)sz)fMuER1~Vc(W~Ih zvavs5$NVSz0K-R{d$^;JpYn`+HAE!r3qlwZLET1O`S=#Eb`Fw^m|M{A#Ov3?d*$*( z%w(blGIR1&Ka4+5&>@<^D4*)wV_*xUg`7uH$uhCob4s;Izd*WGDUXCgR{4NPD{gb3 zPT@F0#s1vLvHxpWGl-cC3yJ@CVpIQ9irBw%5fi?YhYB0YAAE(?nrcMdW*GXmn5-av zgOPEDM2PC+?*?^}7CB4p;D1QXSU+S80Hw1`lx&78dJyp07n3}0G#b)hIV^_DJB*4~;;_I?<}H>8KCp5jy%iIX z%?G*-5UZ;&BBT~Eu_6F#tMK{}a+f3uS7Hrlw%QR;jNpnI)ckYz$(u>BhdtAPFI;-K z_?~YNtS`Z`)o0HT60hcH-slTuQa~bKC~QmzUl_Pwo&KyD^NI76rBd)p`LN4s@F_=^ zQQcA~-&_r8pmFjv`>=UfQ*Z)X* zUh5eM>$w2i3(fYnmm0N6sJv4mex#zTIoJk)g+6^y8R{bk(?k-U7A3tP5x*1Wh)Y;# z3y!3W5*^4feG3=0-7N^1vAd75z6?P9V>2ufkN=$_epgQ|HD-Mcz? z*K0g0j&TZ%`?WY|=?NG89I(p>XOHrYX&rhCO2#HY2lai+ykHXhqKsyswD=@J*bdzt z6cGxt=CWl&ATR-a9^a#>vDLFp@B3|u^xTQallsJdhBhH&-95-|R<)j=gQZX^d5w8^ zR=VNSAT9b~b@t%$vTptVvUI82?t2lku-XXv!l#4VF?EL3DXe(ryIH=;i@sw$Cz^_e z#GVUOC3mtZk-^QAspAe5_ci)q7Zlzs5Q%GA5oy0%Y&3n60AQWZS(#>hpr2mGI!m3H zQK6W%=Hl5nO|mjTURY*XRPq@Z-EyU9n3v$DvV7_lsSiF~BT9=i*KC^c?vz=4eg0qw zJGTA&sdaXT5^O5Z-!adx;h(cAC0o>)J`1k6 z+7iSnK;52szAi`bKAwc|1_e{XJUieMdqUrF%cp<>Wj`~JZVc%K$b*D}0y=2yB@)_` zj0yQB?9jie$T@d2#~I!NUK24b@R@5<)nJ9Ypq}<213r#o9!I8KD&k69-kxZ?Em`c8 z_Vy%)g!ih~t@-|Rp1z|Utqo{)}!Zm;*sk5Qd^2bXnoPV%pxZTgqq8)lc5 zYDx>AS{f&?=ydw+VikM(V#T@>Q7JoEZNH z83-s#kl&PF8SC#4p;>7{UY9CTzW;o?0mw4VpXkA`qnk7NcRCRaz6hG70Yct1v)&97 zAr)+~(yV0QGMtKQ3^`P93P)2|_95-d*Lv+Z0nEy*Nb@DBF!O`_>C&2u3xR>)yDOJd z3^@5seow9l_TB4d8}q=f^|EA4lEw~j9IPCL!#tixOTa|3x%ChptoUfeqL)Kbnl_o( zEI?9K3>>!D$Rs-e4SgQ0*>!YpuQ@@2L6yubLv#dC@BZX~lIrW%i;Xs07+ z1)$-O1mj5>UX&@Remlw#C;~rY=d*L*Bg~6xv6*g+?HGb10dUS!GMxsw#LVtsJvSK* z0z>ruL0_fyT@!{hIe~VyU}{b0eT*CW*lew^Br3;nEpKhQreHK=*VnZ=C*D0nZ0~n{ zM>y|z%v>w9Diwsy??*8V16EMg_Jvlw;`Y9C@b&lbphA`?HTsHrtR(HV#NVna8@EPOiGk6MJyT$= zxKr_trCKtY)HP>-+!Hw5pV2X9n z7~)t)8m7xj92CgS!+s3j67ClWOIinh-oRAGy6VbcERGXQUN$mJ;6j)53RR~l*g&#U z>V8%F8~A?!h|ww<+4ZYAjgJ3k&Yv0?$cio^pm~7q;EFcQ%rc>SeH`28n~HT|Y(<|9 z864wgK9nDCxCkB5BAHByIj90uDTRKD>-ibSdZ2FUNE8FEprWr?uUpDr%qI+@xG2^< zCM$i$tQ8M>o{p$V6X1fn!YR2cD*V?pqhyWi`a9103MX%B!!QLm$Z=NSqQf?5zica* zKG*-2xcDuuY`5NVt(e8QbYtgvgUB-5=|nzwZJ?R2BwIrUlXxLsL5iv(6aZ^79Y-CW zy>Di9Q4=~Vvj)G?`5STjQdxq9S^G2f3q7WA!8_=m<0>sZX$6mBfD3x~GoaBkC{t7` zokEO`TaySe=tUH@$`!Gux!(N={FNNJ(J?{%ispu;Pv~8<_zu}~ywvVtR#S&Sti;ca zI;N8=^W3A_9J}CiL_?%i@@KtJ>>?K^HDOcHx9^25#_OqXRmj;b6TnY;Xev2QY_^!PfkHszl6|;2X*M^UQ35iql=3#v2&bcoI`3<0-Ifl(- zt4KQi*HYP3dDaU$v%9aw34*h<1bG6su11ya=or$UywuM=Ig^x`5_dMzZ2w?T(EFB)Y5Ms~13RatpqUIozq<2jR;uXn~Tv-xb zA8p{!>WN3SKJ%rZk1$XIv~}F($$1t8RuY`^m2Z}B~M!6*08RfGO(99yDyBK_OblvWi?e9DgY^+ zTsCV>>u1S92V`Gu;O;Gbn(5l^Jh$~*l!$DM>fF11ztPI^wKh(WqxLP-FHP1LJ z>WQCJztp#WNF|sxS;AfNDM+;A9R}TDcpo|;;uZc&{E2RstTw=2bAcEPMvd+adj;gb z|6WEOkVi_Dv8mssK?WO~KN_iAMdol(YtW+!qbwix1-5&wxJY<_b z9BpSkAIk8OWc#gT<8MeUL;1$Bh=ywTB7Yfpja`XwnCeG>yna1g0i0xLG)Q1LddNm} z?d9I3@LkBEVbbE@zuM84;E5KmIVbnMDUt z9JH*BJ87ex{1U&t`N-!HEQR)$2Y)dcsm<0vA!Pkws_)onm|PaMQYLh?ej}*b14&C& z>blALaimH`ZNu~u??7A~l$(>FQ~(9@`*FVyLu+mkj3FA2DKdVn17(8x1soNmU@S1i zQi>;D6o-^icwmXE=nmyNKLWv)G`jy(aiMJvLQ}J$RH%YV~Pwh^$5na(XC<=}QsO6iTMI&8dE;&5Z^q zTsM#BaN2Ft{)(#_!<{sADXc^BAcyX^6Ww6ph@|pO>G9vt{bT+GF@6VNQ&{HJnpb

p>4T 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 KFEucbPu2dIMdn^{}n1_*MPFzaX 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%0D?C0E-`(@d0$ni0LOQ2Mib&*3cbli8x@R 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

GG;R?Qgx{ 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

a!pTEcLiovLfou--lf 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

#y|mehG7CA%OGk@j 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 V zDkZwy8@MTy`Y2%*ybPfZ;SRn?Z?E(NV(Af`unUKge%^rgo{TzPN_OvdGZ=po$~us7 z<5zYO(05V6@A*)2XY@F^f``(6S!~1G^WN<59)Go+m}aF0oGILQxgCYvTI@ZXxv7}1 z3qYY`Xdn<<U>xQeW!0U4M`CZFg=Y7Qkt-NBDkFUqqq;o z^CT($J?@4SLnyFT*)#O=Y%+r#-K~k|so)nX@-Vt6&MIoF*&!cmWr&@b=tzwPgY}>L z>~LLkrY;&B&5a3VsnVu%4BH4u#A2BLQv?5D@$L$pVqHZIOhMNYDJJNh!^eC;=7a7< zyL>R*qK^e7Hnb$$gU9EN)BgBycvL0Kj5hkm9WroH;;-q5?rR?Nc0j}xuhunO8N;

}pySU1iXR$~I7A)P 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ⅈ?2+Xsb&}xTR_4 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

6^a%&-=m zD4hqfviv=%ImtIhZjkzemK^vN6T{wbqN3>`2@nx2Gr(*A+dvnc{Pl3PUI03`yh0NO zUqWhvAQy=H9Ag(_1hAcHVl{->ufgr%t0VaLH!xYb|E~sBc(EP&{Yn$HBRRQyEyDpW z@>>1nm)6=n$kO4~f7bzzUR|h2sW^XrHJDT6af}o^R>ClFM2xaM z_XmPz>R+to;TuidNJ}N@b)aiv7P}2K?h%_-N$X3xWqCXZ<)nY&BY(7EUq6ftJk|q4 z&x!&YxdL&UYH-HkJcOz1H68+>--7?17zafo*OtK&tyd~8SUpDv*L8Kz^)){&t%Y02XQYDxAwoOxV` z`;hA8r(Xg&koABQX@REwQ)9LlK{7XDEf6-~fve)G>zObE5k2Q^+YDJagZe2~r`dNu z@&`=-18|~xMiSUyi&*<2*r!(Hr`S&q7+K$OlCTr4*!mg963#+~qxIS!JH$q70QS}) zpVhJ}UwQB`7P^iTWN{E;PZCmA2+qeb8pE7L-oAIXblPftl@x(IVV;3esh^>i;;F7z z^shFtM}+~cR(#>|K&1}RNRk;zKU&z7?Pd9n6VH6&CI5zF6>i+Ib{fk&8e&p$1DIv3 z)Q$UkxZZV8It-yEMJUoorcif<#?!M-52_s(LGg>p(3v?SiDRdaX|Skd$i*wG60QLp;&;dNW%3$ov*vWqiF9(F9%NGVEJ1_b zt{PNMEVzVbV-QX4p64c{)+LBvjos=^Ts42k)v9I;@T*GSA=vd}H>FhSr4$y==xZb{ zLfVJ8RPV6yL)n16PvxzQuVS@Q2C>^eK|7%}8y9WjkK^3oV9i3cZ7;mv@9IMpu3^O*V@;qdT^rGa`?aIF5Y+ zG5i-+RrDHlWq@avr|ODSXo9aoh(Xk<)epCU=}?vLW2r5FaHcV4C~_%|E92URlL<8> zv;euA9@b@N7W3B{E>bMcCPoQGUNi`U$y9_-o)BKX*Ju z>*bp}0yWgLtBa~9{-Ry7m=oRmF|C+Q+*peob(X8A45kcvc);g#?f$@o71l|t?!SiJI?jFQpO{2>sq?50&QUp@#kQckHO+Or zb${a_U%4$}Cm^wnQ4BB5-_})XxS2u9g)~Q!8}$_zki7J~E*yskV3K)}ts5#nx?XV# z)hpB4Gg>{Mxw7Pop&RQ04$a%wKe9ylzc=KTc^t*f{obdWGaGBs@v+C^j~1VEVBTQO zlO+6yU+Hn)VcWxJa+P70b-{E!cBc1ZZoe&h*~NMyGX7Y*HWnoPd^>Xg00u(pqo*Dt zv(Jf`N4kfYUoe+au;?RTlb{!dDt9`yBxpFyQ>dt+#N~KH2jC}ITu>R17QP`HGzCDk z9qnln+zgmS2^G5-uJ1rDUxepV=_u-yUc5JBkwl3``eN!XBFl%xVMoX*^ zMlN1$1sOdw92p^iwxA)3!%Zj-f%&8mZq4dB4bZICu5UB+^Dh)aHQ1Y++Gcm*=HVJ1tXrJ5$YJ|vs>%Sb z8alJNSEP}|^Sakh7TN%oGQ6Z@HLOFysw@}J5D9gzt~f%RTInrHW#CU$hF@dGQ%*SQ z9>=oIKzq@Z*&*u+tJH(f!E#}v9*^cn;R3Lu?V-bz4jv&}_up%}>`>o5x8`fzbT$SP zzQp%+=mO{qZqPt~#|MNmhPW$dy`D8A5&r;XL&HbbLf1#`&hav)%}N|LYb~;*LN@iCJoz;M9Nbs;@$$ z;qm9A?2J7DPqP$g?}q&Hqzb?+!A%dTUd2%6f7qx%tF16ZILqT_ib1K4G`(F8VkNo8 za%w6Ml)2Cgl7VD3Ds!#i(v81)9d%xGGXSXMB*bZOR?oXbs9=w(6z+H>m%U)mv_XE3 z8QwDq7?68zgooGPMh-2ux^%Fcaa0m!@xqNY=FIC9*=Vr{N){j>21yNSMlJlMd|&^4 z5Gd00Ym~EvyS|(3TFZu$j45Q&hC08HggDdlCrKBY!x)I1yn<2AA>w;Q*3Qa`OWh!} z@6F6m&yO2tKR-x@+R5PB>rNK|`1FHeL`()jsPONTLh#S8yB0nYJt=tpqfn7_Qc$+B<|6HVBOEcFFOX8pNwuvA?^hN&0e+i5c z1|c({s;#yUV-&)e!#E_{O^9%Yv%j%_wngaBrxqxQ<1Y z$*x+`-hQHyxJKMBpAU!W#Zv5RJcM87VkT8|Yy|040Aj+MM)W=#Us?DZEQq6Ai%GSB zpoUIKxyBmf=M0f#JkjQ(Hgg%|5Mk{X?tWH&QD3gFUU~nNNOyS3W>*Sc^V1}10Tj2%Xot#7ssX2N>K-r2NYj8qmZCeL_ipPI;WiK-HEEsgR>Z zNxaqyS|W4j3(*W$`0k{$++!gx_mEIwR_a-Uf0k*Sm*uAu2*W6Bilunq5(4J2C^iCy zKEgzLO0lSA;4ot~fe8E567TIhzyR2w^=z|Q_OVAENf^t5gUFMAA{Rdiq>}$11QBo+ z)yT|(D6)=&nm(@|0DaJB+cNXCL@&T&9$2CL$LEIAb64G!D6k?$CMvrjLgI5XrWtdq zbKhI%9_S-U9=izJqU0**k zQBGAby$|=ppr{S6exEDv$op>^EkNY11RU9rJGZzT$cYk=yZ31Bev5a- z%{ON;RqTH^W-)e`6oh=Yi_RKxb0`+Hk+e0Gq2j1Koht1gVZw^eaR!7<&4RhTj= z{NUX>b$MvGj!o*>9C*fIIGi~Tv0Ni2uSHi*`z8`!UV|5Gt%6OU=d2q0w0!YTW&T8y z#@_zbbxJKa&hyE*oinB8PEpMb(e+_1J{{D}Q?CsbSfJUGOIDy#u9VmiL&c(nnLq?I zkZC6iNrZz)X)5VgMSmn6b1*1I9R3@5dQJ3*n)QJS)o{V0r)9j4!nCqUpRpycv9T2; z6nj7KW|c1lpHGXh)w1i1M6``Gx}{r>>S@+uKj$#!s~Ev~RhHiDaKp}r1Uwe|Q8Z#4 zwskvcBGrE0W6?`M&&b9^9MR!X;ppCY@ci?g^j8D?~S#wy?Y*}LL6x3>PuO!$ezba>O zy%E$uk?vrv7zI>{&cp6&KaD#f@SMmJfuoSf(LeN~&mS2fR5K%B_ry2w?86-j_#qoX z%kbIVJU}a?*h})Ilyv{1h^Uv+b}(=uwp-#s_w3*+Urh zOi5Xo(PDGjbh3e)8NHk*wVjuo0y>YYmh4CR*KC|~>W zSKg>_5y+rwU?JO<#SF?`;;LOXgqfD*1|-^8o`CD*TukLv61}Im#UngtaC40UHbhWx zht$KGjz4CIwzkA4f=wAVpM{1<#QP+0a&l?`fjPyoeQ{~Ti_J|hQ-r&cK za-A4!oOzN6Wxdf+GuU>>cN3g-b@bh;396})h8me(3n)Rj~y3KS@ z9-1Hv1Go{T2w|+RA8Nd|y}V+)xb0>6kv;5{2su;Y>oC`Z&nrAV^(e0+jk4M*ysEn@ zjdf7FeqLS1FmZ}~q7oC>@4Uy4=2|0+ek#(WV+D85;$5INkVI@-IQuN6+7VXY03_Lt zB;$v|?&9}3CN06dE_VL7bKWQPS4A9qYHp+rP@{U$*lumJ#It54SV;7pWy3!HTyX|U&9~` zT&ECq4o%jJe(xHoCQ(97TH`DLa|>HjPInqcT5_IP(=YB4Bplc+J=!q55;EjNG2%<1 zI_$Z=Ynf=G>DI`OZG1>f((<*_%3CLWRyDBmUMz zWN#!psmy)f&E<{VL#+eleA2IcNz6n>7jxJ~QGY1P{RZe(o^C7S4HbcTMIaAPr@F7G_rY}v*L_zQo zTHS;5gvq#!c9&hUGET(78)$I6jK4d+QcI&evn3@!s?J#ZFL&cZ0H9>F+^&-0_19Tr z6MaQxjv1@o76O5Jt^xWPuq5(%vF&&zZsJ>@R*K|EPmiiod1cv5B?YHuxm6iD`5blt zkqahtL()f7=&3_;9Euv{O-b*GR}TvtCuI9-Ndt};Ox;QB?UPvhVg@uwC@+6Ew;7c_ z=e9Y?O!NhQ7A?CW zFx!Zm(B9rE!m?9r`M6qWg9JNG1TVrbs)1xwbHJLfrx)yJVWGyHkl!`2xg?O2?5?#xwrTe*{b z@ISQC5OEtI7BdQ41=~;rj>rLRCbp123Oy!4LZikg?f!NDkiOPVS()T%_Saw`J@~@U zJ}ym(B-O?qoaw%Yg4x}8Xl4_tD>UqF@}7i!{l#DV-q1q|utni4C znmTbM408ep3M7!3R1*o=V+@c=@55ac&%Js;x0&7E{wputH6}f_F24r3Gt1-FXPa#F z-b~OLe`t1$KDZc~4zB$aESqL^M1<|op|%>T)lZZVUI1i^j-5a*=@xd5UCa4J|lQzRx(09(!6QC{f8|bOUaz5-|$}x+SHs#jF>vH#6B>ezc zhbrG(R^*Ii`09iANCEkTh?xq+Ub1lb?MYDr-#6OQXlj}sMYnkycJMIIby%MPx(1wz z^sDYnTo{aIo?!l7Di@UT;e3ERDf+tuDem5 zY+V5rkFMly)q=V6nY}EEc8IA(QQ$x@uKi$14K)oxAhF~pwz>(X&334q+FNCZ?n+Gh z*yw?(;`dvAg6c;=W~^eO-eCdD6;wo#k~n$pU(zeMq>zVupQ=z{bD27AHdLVrcz(4Hltydp_kEwVxmeD+&vCEI~`|FfX@rvSX5ybg(OVsXEWdg`QJ#Oye2D4hd-|4IGLr0nl~- zlQ2R?P~GytP*xVq_U!J3Mr-IYUksOG4axSqWZ*R3>*12_)b}<=V^k@r zM95@Hd_=nib4+_2?v=C|V^po;hKg%eR>{O=iZkqSSDO|;x31jpr*VjoO7@l?4%Q|x$E8Wc_g&rld% zfq#~w4Pll6J5cT4H!$l6-6arrj|qsz8U|znJM7SFC1K&Ry+l1NUr5S{D3mr$u*i4nQ8msECFtLs>IBC9}c@ z)Tc8TpIu#x<#CfH?p%0LX7@>GPr|mMYL5VKDXJHjUr?i@i^WTrt-B6ba$5&4hsgMm zn(Kb4*gaz8W9{~iaoC)H?%Gw0TZJpm^fFiBRA18Rh@XTQ1%@Phb03bRE%jz+hB8JA zgBAIP#c^IAqjFFT@JS5+pP+ReDs~dLpyoml+m47{S_a4ROE47V3>Q1%Y&{Lfre{aD zo%aRL6AQdd8!wu@XchR9o@3c&K0*$!%1`Q`E#boM0dfN5yK z1_%1JT&g@gZIAngYT6zkE zc^;0Z1a=y(KtfV6n^Qq!B8)*gUkBMoD&4sLP=156-M^5zQ)tk51n)zr$*+j*wH^ke&GZ%iqD^&B>rrXzJ%kf;48!< z*sd6(4Tc)PvO!!%#C)Mw=9^tTuo}3f-Wg%&59#vG*H4VihERR$!l7iS36yRA$(GUL z8#}6wgjcMWLYMtV+ENIwxT2xxWjSq;S?D#6*XnIit$Th|@ru+~yeG0^_XKFZlYe^i9#rfVlC?w%b!6OEmy1A4g zAxTRvI8S15Fk+n|pyKi}lCu+EmRY)>3r>ZIc#91HtReUgf~@R`s(j}aV)R>p;!fib z{pA#^RiNq!%Wm`Vvsk9rG)wE#vJ}hwxYVvrUy}vsw2HtZANy{4D9&nP3qd!1>Pls+ zluWw^v;qC0`VBToD< zlci{ks`OdGS^7-qFPpstk!9TcqDSYY2WbkASJ#s|fV6J~1>UVJcEmctQErnemCjj6raaZ+DWQz^<6s*G zEid@TE2Pa$b#F&?L1;1t){d{G5RhsU+YI9I%gw6M=U^kY2xp7{3tukBI7kkIr|4x} zSebvqW{T^x`z_Np8~O=u7qeos*vFBWYho_5UTIsjN%Oj~X|N!I(v?7}{ke<(kFwsV zG~f{oVGiK|*LPl43}1&q76H?y8^ip>?dphV)7cAN5l9QLF6OUWK{yG)t3lG7&JzLu z^jIV;RdtL~WVp3QxtoGMW{U>}+hc<-7m9Z6+3l#MfvK4bmM$~PV_&wloIRo}OANXa z@yFc`A19WDF=X}<9ykX67{W9}$gsuwdU_9#iR*uOK=BqTeRQVgjZc^-GEm?FLZgx} zXir8!@j0LT2nnm{+z8ixBSh~3R>9F2FCfrlrcuf8r$vOviZPSfEHDYLsYp`wOUbNn z2k{N@JN;wc;0dOjj2p`i;{#Pe6gk9sImKHBxx(pk9&%?^9)yJB)6(c8G52?A67dJp zj!$Pij)dA)8Ym1CZpOsWVk%_EI-7K?z8>OE5?DYSkFf&y7!m*N3OeH*?O z2)eZmNhe9BnLGf6|pAa6DQ>P5D_8c z2Bt9&5UB??DHcw5@K=IoCvYsE4UV>H7&VN;sVte4N6)l@4)k!vZJu9dVtw3b#(C`j zFFbsFfifvm>FeJ_ky>VLyD(Hp41*pExB8_oe&t`{?5S&nH9DshP%4NkZsQ8A0e+g)3IzpT05Z%|W%R9QLk$D5)P2cN={ciqKdmuXc| zF4vfnrWg;Lo`TyX7(7S7doTb+F6ZnwB#{gHYWHDKW1=NMa-f&ML*y(CMBQA`4L*uB z`);a7?wwYp#bWWM*~6nG6Z;Y=6}zixa24?D*;>58QxJDj?pI?z`V(@t(d)fxZV{&; z@T_D?Ef{lIhXcAC@ri$g&RD7(rqcf3o@6&&$_PP3FT=2y$T34gCWjRDNs`!|U0+s5 zbVq~gd2z{By#kRjs~X@@QB`W1%|`##3D%(g=HuClJf1vs#f3)92x7V12Qj}$O$2CuMGe1ErUkdoC9Fs|qhNwt=lO2M z%`;Jn$r&g6|Ko?vU8zMCmiI@}ztt+6W|@+V?s5G0CeD#<)&im}m1>Ey4i^wx#Hak> zpM#ClXsNku{ZcIaNrL(#bnPz zyA5=oK~sU4Y|2$UIwd$lDoq|p@xd-@l-^lsxClN`cRtdMsQX*q1osdXAOpCjYy-dc zlz`zBm=g~ha$4rlf3X2V$x4yD+iA;}euM<`tr^SQUL2d4ZRmtb$|*01=GI&YtFO^paYnLqAAz{~eJ)`CQ-TiHKZqBeCY zby;!tUc(UG@Z<7QZYUIsR7_f59uAPbuvAW%khus4Sm^>mtSFv>SCKn#^SI75 zu9rlUta|^kNxSUO^5ne4KJQFhT`nW-jVC~C{`LC;e7`>{aZ!OWGiYNk!`Nb0nj@S# zqR`)iMP@gPqX*~<_EpE{sipAR`p~z2AGK;lrO|r0(>BNm4eU3t@%FCcxH?cF?g(E1 z1y>-1(S0Dj7Kf9A@gBd(B;mA;XO8Dbi^W<1xgp09HpuP=>w1kTUET>rGnt1D$<=ni z$~(D|4DUK|C;&vfJz(ZRh8N1v@-fby|9r_xU7o5WpxAm<3Oq6j+B29u>B%|MGpsy9 z%LF(4I^`8>UOb2vDzM2`-I>zfh7Xn;e>K+rnW3p+{>tsH$hb0GA9Jc9tGi}G9N1*E z$Xo&!q*VAPJs_LvM{{+83lf~vX54lpgP=+$1n5uBWVHkmRtdxfn6iGpcfg(&5sQgw zNl`yLHuLq!!Mw2EtonCv@<98Ob;q<%#&dFFa3!ogCjYdix-Fi>tWrc+3hX>?dsrL> zPmy!=&-R;HpaTV7jT(W#pzrgPP&tL)9+{YV(Bv9)lN{Ivp(=B@f_~CHbO8+_pc1VVRi*V=+vM%ly`Iux)0pLwG?)@JdQ}`sv!L)R4)?_GG>pS*?pKn?=S!WX^cLB0VyME;)sDI|w7% zng#YZs!onN#t13l!IN}> zqHfm{oc?R>ItG(UWZ0g*kHIawN1)@;;-h{VzM9ZfYsd3x=KNV#OVlISYl(U&UN-@bgEOOy05!Qpkp=B`?x8E2LEW5 zSDJ9jv4ziPoVx?_8bcdE`l|k^o@;N`7rA&Om`qzA)rw!~Uey*pc5>dE>8v*doylte3WBHo0 zu%!CFbn(Y8ij4OTHW1VQH*sC>Sn2keYYLD7nD6lHxCjFsTponzp=Si@uQT6(%U2EC{_S7kc49^2U=V)0 z&$5xC;F~G(#e$jZL@hG4wkZ6venN$1rKIl`%7wXuV~Co07x;?sEE#GX`U${6(}GFX zbA+0zd+|*WnS`T=AWRDh`52e`FrhIm_xeq|6p=gtg{xa0~R!&^5jtUHFzfY7 zLanB0_4Rjd@Jt&3ad!E>l;+jZTi~3AyD>{Gv_5m%W7Jphu254Q`2l&Sf*r{*Nx=V+ zPumoa{3@`sPKs;jVAPsh9vS+3aZ5W3j6~=RweOU#pr;bo5Ka_vMdmWe1s=4Q(igxK zI2s3{1Z9c(rzVW;Koc-==X;i~nLJHDXdUpaWGK4{)-z6Hn|*QDzTkP-UEAPd_PdGA zY>OLB%`9FY9RWuZ6d0?tozLRpudg zY1pU3Zpp4HZnOkPrRGC<3~5#uk~f64U*Azia2O_E&Rr~U7a-;!WFR-${ZqtBNkJ^k zWfUTWvGRqffe&acIT=|XaZ4DPy1!S;I1Y_ zOivp>xAek%ID^mkgdHg>D9zR2cYZ3zQ(9MtcthS8l>cR}ndl~_QD<+D?r+!2`*RHz zoV?w8UvRhcszdw^92}P0ILRTihlOfeg~aKosFrUEjOKQY`|2mS4$ZY5tDSl7x$u{Qwn47WSU~$AX1X8YuqV?b7pm2gStWr)KM8t zVFwLvnQO8CX}`vyY>7wd%hEFatwzYAJL>|Vn|?U$OR|AVFMooX^s{M20^ywp0@ooJ z!Mr>{F2z?&9ZUSwzVxx}lqL+1W+%SEDy9n0uLHzUg z>H3TOS!qp`#s((UpoU_-iLDjY^pj7g3aYXo>PtB+yOY}6XEVl3^!RXJA>?=?oX>>? z0m6@K>7ZW{X>tbqW%^7K%|#=s&IY>@ZJHJf$$@<32V=r0*wVgz9@i)Hd!Iqcq4!qMuj>iEdTmnV~=84wxkvxxjBBP72I zNey)!3h&hE8mS5!hN0NZZIYcp8JC}E%`{9L14kx}_dlCDD6lPVuATe3Wfw9yE;vl4~@Yz)jp5Al^ zYeY_Lhi;n8u;9{&*n?@ z=3T_nZh#P$-2t9jo52fEUd$Efk#y~*2WUSP;%X6R{%i@lbhg(nUViT3mC4(QyvaiPEZ zy1HZlSTywQ8u@;yHe(CxY1**PHu==zpgB_GIip*kJ1;&@!N32TL?pvB4p6?&HZgNd zMxu1azfjkt!Q`N64MMl#ZvwMjxjNG<|0%+U4D^3%^aSpi2I( zT2huy_V4Baur$mTX_-x1Xx|-J7KYmw(SM~{uE`BII=`9|;}MRi^&+tkIwmug&`q@L zh2Et<>C4u;OdYK1S$D_ZZ49|gpAZ=1$eTR;hiZngKFEOw@<%&kD5=BmAD>@lk`iL& zF&1?^^o=RM8#QkGO9yzjIT94b++blu$Pzxeq(ILawE8eJLJtmLvb<;BH{VFh3K&30 zZN0P;{VhVw`$RSOWYf!c-w#Qdts0_SB?7F{SQ#z6h|&cHmkNZzV=No zYjX;*a^mTLEnt7)FYf`&OdKJ!aNye!=2jZzwkh6(HGeN2qZyv=u!b5i3L9Do=Q<#5 z;;soIs_}Zx?zXfX206zj_HE@8A4NabbdKl(cUM_NXQ~8R;wmN6cG|_OsR|qMy*A%G zR&N-g8b;Tmk|GxA{Yll3pADsZ`fWC6qo9UHyU20X%}hBwyhX z26GGEGa$XW34tXDS>hURV^7)tW9&kbOT?G)$b8>)nZ~f=uX7yH9)xcQ__L;4rijE$ zXh(Fz^W$`dN)JynTw#KlZpz!T=1E$--EZhxW;dt@Cm5%GYoD>b53sbuh|^Kx1l*3> zeJeNCX9~x3Y_e>z3jZ8G`Eu^Y`Ogs#=WEzlaHJ}t?r68dxP1~tpJl#kIED4ZNB_2_ z_nuJ*{rEet98}0aH)J6WkpJHf=*9x(kK2Vr z@<1}qxAk)P2-7g=WxaT0EG=54E1usZl+Ryn^#i-3MgvV`*^4PX@aIi|h`eqUxZ9>S zMiyvyejR41;}(TP&&B&8$VUdrhM49ih3+&Ow)ND4vk5ovrQ_ACKRLZ!vU_oI>@hg} zSnFb+!pMQjAJnMU zTi4rdPIR5{y8MlDwFh2!;VqvDXmtr3t^0+2abP@{tD-?_Xz!m)6@*?nfU(Kl88v;1(msBx4%< zJwvT9y0G>b17qpE8a}WYt#;{ZJEJIWA*o~jm|slS_^+7F)~f4vOENeXWr)ajoD{hV z4;V)zlZlCSgyf2?QCy zrW)9Jh;8`tDZ4Q{&hkK^XW`P32E?V<nU#X8x>!H>l`9+|HXZUX} zOhim})FuT)wcWlc%@?2|upA1B*|GBVJlfIubce#y8(*?e zEI-i}?&0CQ17+40+ms;BL*rEc&*u!DZkuTzLl6$r29+@%*H@jc(z+P1F-1`f=#tu? zQQw@sJunFtSy4B8maD|FI#Antsv!4%+M&<5QL4K~OwT}h7kUiZr_Ofrk#q^jA>*i= zASZIRNS_P{fyqtycjlw0YSK4n;C?KGcx0IKt5K?;=X%M7Z4Ifx1x~oaM92yYc;$A| zEMaRB?3C!~FO77MCGwaQhuhh}MG1}%2gea>1zO6c1OE^4p_TdAzo~rVujV%ELUrkY zF5(I3n?T2Yd7v}(?(IpWGB#WvDwkTXNDg_7nTAr!O>+5xacwj4!a8>DA2@G1q8w1Duq4k0z@>; z9WpR_b~|PwCCm+eIY1r3`iVOEK+-R3dEu19qHxv`?rJ^FD5JKIC^)a$Wo{{e;@Ib9 z#dS#?15hyC%9a)2RB(C{>;A<~JX%Yc5Gu<5`B)9}8a8xNpr1wMhMN?23_6MuqtN5{ z7_m>ql>dGjj`GVTTAFL{AtXjPxvY%&uj0^Z7bAvxiUmcXl8$da@5f&{vJtdU(iRJ} zLiWGo5V}s~%3Zk(s zWn4>^@lo5f&i0_o%&>n78ZCv30vTTzcXVD@OC9h;8cElj5R%zDJ!ZUx5TR2YOmg`B$>AOP)+cE&gSl3n( z=fwdb{&eXc9K!;bPkO2U75hl+Fd#F}E)~yUjY1_N?Zw@(-3o@*&HE?uSxm4vA9fs3 zO7{&sidUwbN-hQz*?H`M)9fIAK4j9r=fZy}G0c+yrXZNQtjFdo<_yS~}lGFY; z$e2p^{#nqQu?yl9M~0~TK3E!G?aUR&=0tnfBcM<9P(;xJj$7d*G@ly_Vr+|35`=j% z7H-DW5343$Nix{gh3t9p0QQL_r9%ZrMWU%s)r4RUM`P9mwCO$-7ogeJEA%}6s})h` zi?erg`KV^YS95kdm{L)9t&|S ze<8AM+fYS8XMNcC*sVa0cVycQffGdE`A(pfM;UpRqGxQ_Ep~5&y}@syK5w9U3LP1{ zeLpvF)(dt-RW_|hcWtue>QXt#gJx%Y20uiNy*c$uz#3HS&9v>9)#4Y1s> z?4?HfUCHz8v!*G@<_ZiSC2rq7I!viNTJO<*y`A&*x^*1&9ky;hzhn>-qF!H!aDqw& zX`3)?+$mlM=T#jr>lPz-2tH##2&|zjB{^-V;@S8C7nwDxw01=}pA#o%{7}8fz(tE{ z`#T|ZX~!#5E|7$W8!hqgj%#go4QA7FpZz4A$PjL>%a%Z$b$q%!3xMz3B+It>|H7OY z`Dum`|9KohlH#P9h4;$_N_YYK8)f{I^7Iu5ht#>38A77`pRAJ`R37DAwSA%aO0yE3 zt&@{*?1?AqR|JW$`R-Pf(1v)xOIcIvUnjPg?3s+jd%AmeZZcgLlsRBy&D)kghYxQb zT~aT1T2Itlnm|`*`Yl+f;=m4o%iubMYlb8gQfZ;e>)M7?0AwXIG3l{uPS~2?IfR(( zQ7b3r9T=(6u_iKsUUwDn_Hb?gUr^m;I#)B0-YR^7^Q4Z(oZnSHP>UMGHv^-j)8R5w zCA2uMqySMjHTQcx4FZSXR(5r5_Z1a#uhH|LTI>XDbqLuNev_&)_>UW{3%a4LhX#UD zuj>UK>*sb6#FY|WhIp_-OoE5#_NMC4O@E_1V>_A>JMDFgd)b03uD4?JKcOD<0!(}! zN_S7vdUKJsY8$AKTTUWQNH!LV4$`DdlBJ6o(|iTFkK3XL!tZC~^7`@?a@cndq^>5T zqj_c^%hlFctF1a`yCo^g-s!^5|1M zYL%jhAP}sewB}%kbGLVWIk{Swt5U7Fo&1841vTi2b8a*<;uzvU?g^GKV0!diCC#{=zu?%V^QltOEpQAd@(JcBfOBBQ2zC4!WiUQdL>rx(h9rof ziySPac~U{5Vv|9=W0-4phe4meB@p++LFsfTOv0(lu^n7Fm&=r332KitAYY_v&7WN_ z8pbfLck&E95^Jy<+=PW+Z3X?kr+D^6tP4dPpNY#T!5=e%? zu|ncaGJd7thmM3wRUral7g#TPye{}4S$+muM|$&1e(x^!epRp-I@S{kpMBB-=n0bH zcj6Y|uFQH4-dL{#GS0WH;i3>8^TbtlVayHcvReB_2aGH+4E7(~tlL5xvcV|0ny>vB zdSWb3xb=%soEJn^m^?*`oA*JI;TMto5^p_$%)iYN>bLvn#YG=La#*8YP0$io*C4S` zcZug^p8}ShuE0mh|%wt_-6~_tL>giFMtNJ?cDzG{k+Abqyh};D8T!P>xg&gd!n%0 z%+w*%AL~2ZCPI@aU*WOH_8XZCLNWYK2^e7ClES5;`Q5GAv-P2 z+BdB`dF!MS-QdDz%DHF9B%J+fx|2`iyXjL%Zm|Exhy4%Ze4SD{PRNuw7ncaQE-%PRL4p}jCQi3VO5Qy|_`jPjpjO)!jJ~4Th32oYcc3zn-9U$bA_R3o0|^sn{zp^_ z9$$|HgU25+_T7jhFs1o=&Ku&}UQ5@QPc~HoBl~uAd{uq1rvD~)ARVe@LV9rHs&FS@ z?Yx`goe!udNGiw;y3*Fmu#A^>5QRbH+1`pgu20{RN%@uZ*O_qMOIb)NfQCQ8R22BrA3CJ>sZe;WS)b9AYwOz;& zV<_hecwvgsKSJ6}9lk(o=6>@n!PwjCEzB*XBBjm&MhMI?(WOAn?h zrQY^t$YU5Nx@`fpNva9b>}O2o#@<&7ho6!%u!Siq^i=eDb)vZ%zt*1dn1 zrL6@LUeT59!M^|4HO^VLi_EHxp&JV*lh>#(rr3&+U&EH%5)wRbWv+t|YA&Fe%?Au| zs`CkZqJ1M}k{ChJpll#%jYf!HM~!1y!cICJRRQWO^-N2zpy0YA8@yBC>J-TQ?Eoi!wVp zE=@5X3XgNgTvPdgd|pB2V&mOpx=5LX@Eggq_?YM9n%<5A`QcX|vZh5*Z4*zV*SKy9 zQ8<0bJe0O+!uF-6+M!H^3I(V8Vg3oxt}@f8ZMww~kXihZFH(X5!PQrwr|~Se)?Sw_ zz7X6|!`{b|u}r>8vYdS7!+P!c77m$S=!{(;7_>_EDbktEpO_@&1@}VX-BP8Y2A2xg z2XP1rO&s3`kw&dtIiWb8iEFj)y5 z>2UQ2HoYhGxK$h*28UBJgo-CowY>e>Bx(+-eg>;RyZ~*uKIv?{vTUg@+hcBFIb2nx z(_^J0trz{BRBmC9MSG+Js%H0uB;>CteBTB=e~PWIOU0Fth^OeMqwHjIz|iMppZDGah3Yd<0O;N?`;#4(H`AFkt!h~9xemHad-=`n8FXLU+xAsZ8|RveLos5@i$(yvoU%2)mu@v;XOk4o=6785pn(k zwf6F?qTLSELh=D+RC!3G?uc}7cg0@E7%>sQ0i())8JlouUs0bfob~c|8bnqTk-(sq z#gQ5fK_U#KC-b+584xDl?eQ}7TgpqUo!^8sVbFU$NeGIe78KbN_(H~aER`v88R4kF(ZxD@};NimP7 z9n{O6u9%NUvuGnoU>eAPk;2wqiBwJW6T+?6o(Z%n#(b_?xv7j_DsIlx1X%6I!hb7W zA5oQ5KDq~uc0I_+^y8lPD^(B!%iuQNP}*)Iyq!1q8eHZT}o?|y~G_uheF&Xir{0hOg zyJTK^zfv$ojANg{b+{iP(;SglAXP>)j+*gdkP`LaS0C<@jCa#DOhv6E-2JYbzjyw} zM!sJ<^8MO9&X;G>V*onJ{}kRDqT4H_UlCj>(v*OTNW9U&y*B=U%0FZKEMnIa<)vu! z+O#l&oXwdK2NEKA%S;>G_t@9yGN(N3u!q?+zhB-ULlElcBQiV#0k;fWm1y7I9vfsj zoN%~M;!0>9Bm`HTjpAr!5t}0IA_1cPNyXF>nkCVqp+Rcy8CzzCnL=?QB(yq=Dltui zUr{goR!y9Sti07OHlbxjO1%;cNMk+AJa+3EdtCWXHKo26(WrpR3ReXjR~C>;9MIl; zeqgyoC{2x~O;Z**lU{ZxYNg!C^zlL8 zq%xRHB$F~Zxb-!OL<_%pBvRMA|HY8xe~mL`X_{r3Srp*P8MGLNL{r_druox*;CT%z6fI#PzV8!pW9_UdDN{5mlPMzEOT#75(ha+vvJ`9 ze_K`s3XvqC2Ke0T5Zg=&GFl|EYqohuwno!pq!$4%5Nq^C>+X3jCM*sL`EwflmK%s8 z6Pc&WN%9<%d5yP+eo%C=P5$fTie*+*Bbo+lC~@O9Jv=) zA>y9_M5RcTVC;;rbP}0`!22S`1%up=q`FZE8$V-l=zpkTYxNAVBdugA`j2Wz>p2~? z)WGm_#leSVXJlZ45ZJopRC2oTK%cEC@bbIn{Ti7Qh-#l8V@j2Seoq4I$pZlH5&Oc2 zo?T<)(sLtB0Q9bge`oQ)1)pkh>pTGM^w&Z=%DjH=k_u^f1z}eqX7Irgs7P=h*57$f z;$CvKG|o~_zitG zYLDnJkd{0PINS4YVb$&`76D$IhO&9uYy~Wg;Emd>!C3G$>@cMjwh^OE+bqgy&pKOc z&FP+3ggG`H%m3@(w*EDXYW@;T)!Fg+OwBawISI<+evLq$>tJ)B!Mv?Zts>(_@R&xw z3KR=`l9@B~U>O-VXGVB*=UNMZ#Jj=37fO>N1p*qMFpCC#OVo-|$hdZB1>{%Z4A>@}7<4HA`5oH&Z zUzAIN_j?RN`W_VR3oD9~VsQ`sk1i9YaJvrDi+r>qRTN`sM=2ab_NQ=A5E0isKgqI5 zK9@jTZ+)c}=mdyCLh+*8Xp*C%C^ZM4SZi=pLAhigOD(e%Rg824zsK-OOEtK&*Er!tx?_iI7&yXOEt->Zs7CA91Ke&F4Stfz(4g?hu?mEclx&xMQ6oZgns$b$FHFPpyXLg}baT_&8I6P71 zq#grI2^ux6ayVL|4dc0*sox9*l)?2P@9%ZujtU?MzTlGU7l-uN9(owN`xUP)u(V$gyfuBx2>c?QS zIrkxh>y)V%14o4CKivAakJq7K46XsV5MDXZx0a32@y2myDY|5Gf?l)$HxrzX(*?jc zJPsQTeJ#Cpmn4o^m@o!2km-t{AIO%M_{Wqr8Np4t5X7MUm7tAA0eVvPAj zmVK=k-&>Su3U_^wza4G?M^;JX3QPd8+_igw>ZB-5Qp)S)@E&k4Dwp;X-(?^revJ>T zN7i`At>TEgM$KjbzsEprcS!`_IaBE=l`Yp&bE}oOF|ZAkk8s@WH($@j&KmQq)Uwo) z*PbUfSP!5)cJcR2_~1V4Tln!||6Gy6=tG`_4DtOZ$ihYk>u&)KPGyU)X-z1r$081c zGlJ*C4lJ;zswwbMIQ*<1ybhc62Lcb7o-7E*^h@h8u-ry;*j)&UbO){Zbi!FWxtu-+ z*~lWFP3DRHHv=<`S7~fqMV#CU&m|-qciWu_If`HCS{wQ~8JSA~+l=qCn-){O%bID) z@XpRXX=5?GVJyLf;#mTjJ4#PCHI_W%tsPwMDCazhT|p*H{5Ye5V3YpV*L)HE%C;oa zDo{}<9#5U46ZPS>oN$RdEeQpz$?-ikqaCJw@qaXuu&ejBe|pV(6>vGS=!jC~#GNs{ z2{#|gy&qx=Ms}doDd?1d&c$1B>;#FKft+r&L8EVrw5|6yfjZRkv)9rO=Lv~FEI|-J zKw!^xqGrIZ5@_ev&8WVebxV@tI{P-DXBg-j zjS{45lKftWJXSK+-~QeyF-CJ&WsY$}l|$50#X2-=HHA}@hPPQ@6$I1+Py2+S`EvIH zYE0G6>owHQ-He75y6j$8mFnk3ohequkvn_E;>FRYfauB&*~dM#!!SteN{!g>ab{Si z5PIwb1x)HK-R^JeIlrA4#uMj*G=G2yO5l=qD2|94&lTh0op!;HFXp_aS5j?3HXToR zHO6Q>;ZYpO3Q9jP9*i*RV4>xbHpQ;064c(ejME6-KW z(K-91^KEXRXk!&g3yEcis-Pl-7!+ME2IY&{COO|ZggxK`ghvewPOx^+@bVt#xo?lb z!}!2YBWAf(ZtP1UUDxSYPa<=~pQYuGEoaC0ly;~?D6TJzHFe$w$1zDiwamq#tuHh$ zdHAM4EAu=XfXF3E7u$*c5Y7v<`;Qo12D};u1m}RsW~{5zfqs4F%myq9v$4X;&@SM? zmGaQ#_nP_SGwmTwSopzTV&VyFEC*do!K4)oWkc|>_(%?r&`NqPcY9ozt6|S| zux9c54H9bd;Dv3|9z0=xv&*3?W(32vpyJtB;ucgNl6Qyd>5!1WY@V09VAh^BC^p;Q zhfEuo@LeErNmZNEg^buPfcrnrEAR-21`s@v4NI8~nm?As z49tPJAV)IqVU`hb8pm=gw&<{TF|k~TBYZg}Vfv&ZKAG;o zZ$Q#9U<)#3Ftr3@^P=uiZR;cq_EgxS%MTK(Lcf}SgpiM-h?3Jsu?FMMV4X;j1*Kr! ziS4fIWBv`B{J5OH_X+=yXRo^VsS8GXW!G38gWk5BNyj;9QjAgGlBf)Qq34Ld4SYIh z(-Q*YT4l7eU0tPdQjNBj)sI0$)hAjC!!P74Q-&8$=#*2}+6-Z-h*)Vu+dVC+NhrXG z!Jxy!=ePou_HknJke*S-8`mYTTr?ivYxPKZv7s4k3`1B=zeMy&uF;y;5}aN4t-Zbg zj&5zvx{idg%MX4S6w>`hggfXsK52HeT`P4VQ*VPWHg*8=607|CL4_2Y^=J@2v5}O{ zddU+C&qXE7yA=!KU#%9_z@N}^`=v@ge?V_A?T+;gb-Nx4auCrPs|QQl<#-)XJC7xA z7RcTrQHB?mI_^npM$fAs=kp)up^8f=m%|Pg8~ubD(s{V&mh~QTMbuCKYLVCv6@b{s zsQ(odqDtl+xUQB+kE-AJIhK=XMnIz7Vq)rBk4NDtewh>a5Gb{@%QduZ^WhVRNc$_X zz6$m-!zm!Tdf9L;z?{_I+f0b&t{}0i_aBp5;6b-P1Q>W zCooTBJ_CF?!c+rB-Jp`xZg;2pdZ!vJCz@7JX$bXiQdudB&)}Q~)4=CwQW$vP@Qs-` zc8YR-VOog(2yjgEP>^17d_~ZeWW{(S!5&$a z`geY+fLj_Y_~niX)D@gK0M#qdC0|x>GVC}M0W;cN@h32*5#qeW%C-(RpVv6&wsL@CJel-d*Cu0CcDrMTUmo`Vm3MHY@#HNoI?%k=c_|q8<=(Y!Sp2 z+`mnlW<+R2bknfF7j?BQQ`@etK6%+nn3QJR0+`b?vv(fkYSOyj^8)GjLpjunv-Y|K zN&d#BTQzUygk)%tYNxcO|C59mRoFAm*Eau{lmp-p+VHzBOf(#Is5L(uK0Y*_@1#U|2(MVmzBxfTlJNIskE|O9Q#$XwTW07_{2%%(yJ6%=+a-1kxcBUXg$28(c3Qlh3l(+UCK8C*{QGbHZFe zO}OoDGk56$@l&A+VTWCmLn#`gu0oqMV9O`)w?4cZTasN?y{~5zJT2^rs1(h z2cD`^rDj!sWafX{WksPPFkYLOSKeg$#Xf{Kp^oBi+GY?t8d+hO}EPDpuIhlyA+v|lVM*K>rc zueEkw5;&U9=EkWm1BYI;lR4 zgh4fW>iON;vv>*se89K`iAPZ$0+v&H)Ly?R?jXhUslAk4jeCP_nT;>cWlAMO;h6yF z_|$Vt_bIkq@2SdrS%<>?$2u2T@xv~4Q$wp;gl!`|#QG&5zIT9D6-`Kz7DhnE04!M9 zh9Dp4VjG@N`ePk39Ui}?EQAHs25Fe-ZqsWuMcz6F*R`SYSpM?M&)?~h4P^xs$it?n z?+rN%{Y7a?Q3>MrktopwtrG*xFf>}{wsmugc{9a>9~#ktG*PhE`!=;iotoJ;h^AtX z=0;Uc7}~t-hZ?B9vcNgUl@`Dv6Nfo<%REOMhHEx)Cr+AQ2}YW_;%G?r4O4-ns{Bl8Ii~Xq z##Rmn3C{@u28r4kZ_2;Zrt74f<;&+0{24E+Bl#aU<#muaW9jDooJI{`HE5wEhX-JQ$^L7(2__;V3$Zm7Ogkv^Q&et~K88))9M2x}3)mN$_vFRGoa}M*`=0)) z`Cxs!Zhn4g@8a4bFf6Zaa}V+r=SH0S9N+P@)ZqOt^WuziSykQD3iJ9be}uTwX^H(z zGZ=OEzC$_dTR+HyIb3dH%pyIOoG?S0C&Ku1pLORNRXC?)pg>;lX;{}OPYrv6NuRYOJh1-TueQ^7E7|^vWB>NU8ETB%l z)VQri{MG-4|MNI<)25yXWhTx*We(#@gshkx>13NVSTI-JmtSAk{7yYUj+x0pkwnWN z#X(tZc#{RXiKEb7*s*M^TgeYxBkrB|&LdL!QP;2YLbW9lWZ7O~D(jTNTsww&d2TCI z6*gHWEz+pEWdS9yl@|0q|kqnI^BvCH^p)jvi+}0P;Bj!@Mo~x+y9+smn@;etQlECA!!bFUs!aj*-~wC zdh@cUe#{%|*LOKXx(fC+ET_oj&D;1}7szJV4ANX7C!u zYHQ@{RV2Ry5k)t+eqdz56})RBJR;E-LSN~H#fR$zyy{bQA&Q~!XOM{QuY4;d%l`_P z!eDNkt;J>)*0?e?sIY>!N+TWq0wtW@8|cSW{K`Gv3}=+{lg#WjeBqu#jX_tMXrjcm zp2JPDarNemolTu=$NuHo)7#!8+b-dOc;R^l)sf8Wit-- zYpd#NyCi7aU5to14^P4bXdRH>u6*iClyx_83-ZD9V{65N)>*|7u9-%oo8|6)*Qzwrw7~D11qc@_P zFKz>gB!>-DstV;nuN#s;LQNVFisN=aYd(zB$~}=WDxXl(Q0v6o$tdSnA={>Y8>6Q> zTwq44mJiN7gcm0URfT!&VQsJl16zVCLt<$XFO7n5`~Sh@)+8PzKFL;6Yb`4jUA28b zzE%H{X28cWb$WylvO$g5l;oO1F1ua5=8zakZJ6 zx1t;fG5f0HRSG+NV7E#l*(@pgxy5rHi@!?LOShFi633%^<6$bdtePjURcB~gVUYpg zeW86|UdWQ&2;`JZK=#fnRc32WfWg{JH575rg&1$v`6(E|>}d3J|PbkgFjbs{fQv?Hu(PzN9EY%$d;KTjlVkEdB zqPLcv(c~?8nQ)SUv6o6-N%~q2BN^0u6?=LX{1Zx?jtO`Mm$;RTft zj0tobr$U`{(Y?Ybh^gp?0+&900*E<}*pun$U!s0!OaGpFfzVs6KsGV7IAC1Z%z}K= z9gR|u(DI3*gSJrH;3@(Orq7()%YoMV&k3?k_*bV6dqt^|RY91=_FiioyP74(mV05t zMVx}l2%bjfMMXT;Dwai{gxV4Go`H0Lxt1fAp{NB%Dg<87R*DlJHqB*?_{xW;*%WmB zQ5i29O2;^#4eAQ7`KlF)x&2t)<*ITsK8)M;WpU>*Q@Xpie?hqJ5oIdw6*DVQABR|g zAp6D(QsOr(p7m3<#_k|O#q$59P4o+y6`pp@b#y)WC|j#vqWUk%Q+#K5x8_O#^1f4m zY4g`d>@C`40`G1)_->c(rS)~Qq3scc?){L>aNZjU8QWmJV}O1$fOmA50b3w-1na4&%tdt%AS_xxH3i6$^ZuInK>R;2nhZue5h*-D#P)gzq` z-havyZ)?(FqTHa_S{=G-czqU@el&;1ZN^)8e$%>mbAPtRWj{*^*jI&kPm;3oj=bf@ zLET4%f(GZz*>XEEvsgZaA!c+ZEl^BaJ8K5i-{40?!0nz0NvPSPg9m+MeC$A;KStvQ zMjMGyhC#gT;n#6K-_vY8*(Q5Ud{VB!8%y;<>o|mHU}YFnDnPLRm#*~t9|7FJCHlZ4 z7C^ydh7&BMajAB$!#)!#&1PGrz*N!(PK1en+z)xF`%4k=qsIr0m+u~1fyhC8vub6d zX_MKTiYFq=+|&?|GX2_j30(nONT)FDy+DbQA&?z6$8@1m?ZiE>?}gL0Q@RZ?r|JrQ z?Yn{r|2>G>l(KK+@#!&ZayQcR9!3De7L)e)9J|>xFRJL1QzzCYbT+yQs(?fI;T z48eb}zniLyE-#eLXp`7wS2KB8UKgLGxyUM8$42Z>xc}Og!M;3odwxG-iKA}yf>3{bwwBlPECiL3fuCYxJgiqPrgOM5;ldwi8< zbHBq%mC_%m@YU!!;wo=?M|FkkphQzDjp$V{fxm}(8dvgJBl|+t7sJ&9!pZsAde{Vl z{^hN0a^VAo@qhGDd{vx-OPUHGQnj!3J8HKj1cVNswQY%GokO0;e*bcpI(dWniAbHf zu$#i^O2FqL*7V-Hp67%Pan>GIL?+%kPk@7Ccg+fPA(1`F23r^nTjkn<-uTw|U#yu<0o76?jE-vHc5mpp4Otvge)In3SaW{vhYUA+9LeE&BH(c4`^*&32viMS=0I zNFW@DI)Zid)8Pu$0&f_hRC6%J*+k`Ukxhg`)__j1XcxsJk5z9y8+BHI=i?plT^)g~ z73?zT`LCliVX$ORCa8vBz4k0{-UH=-YDPTKMUMR#nb9N;n_VtxOkz9y+tBcQQwN8u z@qnFT&@yp1h+0LcFBl88Kd&hTSi)*`m zNwJ5%Cq-NU%{cdwvp?;|hmuO6h~SR~fNH2c%eQ`H0xG)asWlxug9G{#aPKFx8?Zx_C|bqL`!lYV*~Ybj@b1UlqPu zaOXopd)e>afyh;{q0$Pm*|ge&72ZZYN%sCtryH%)#G_`IbK(A#(eAJ9{`FYN9@0-k2cMab*?vDBNgLZbdb4K9amgBbp8Bo!m8X^^J zGtiSEHST3hn`bJ+I)b+UN}|N%%@^f#+?st$KvFnsC%%F*j?!7CW7MkeAyXDH^Na@% zbDY5cvWYp75tR-@qBK_nGuZva;w?*d#G_`@^&~f5XPeV72$VMGZq_29N=|woY!1uQ zDLYOYzH5qC;wST@n%>%;b|K&;#Nx0v`8PGHwTI17+FT%WJ|oV(l!45B5r2vB4H76(*9ZmUvV(rZ+2`gSQ|$+hL8@KCbQAybfLWk*zH0 z2Z18ZmL@tSF&Dk{7`0C7jqwC8NgwK$j!|{Mxv1GzcX(`Q^RW)}wh??YAakfTE>ZAtpN;dp5)2*$^e4C9xKaV7FGXw) zCGtbTRd6Vq7%OKb7v+GPeQE4vWdOOor^g-ar-U$IijHz3AH0xj-T2w$zSR!{FOnLz zpQgNB^$y_vtEr`6-XJaol*w~k1$0|*r}`EId}K{U!!zNpv05?h)HjCy@&PbtNd=;{ zx>+&MN`5-D!Vw$9dpY^EBR)UIzGw&Ci+>Q9>pmAJ2>@r0pg+ywg;?KgV8IMy0*{0x z*>qlj1fEHsbczga_m9BFI8PN~-&Z->hFoINQA`Ehe0>vC$h)}&T*TLm=s3S-)ShX7_t*Ah-_{>}orO%(*jM7LmTX1|-Q@P&&|W$9x~1S(PGBr(+>K zQgTkn)Ze+E?KToJg#Dg8u3~u41CCf{z^L#~{DqS01XJ83&^3!`IDY-w=Sa&~A@?(# zGy~9K9qm3rm)G#x&zC9a)TxSO1dnJAU9QZL<(`jk@j~RETb|2P$E;h8l=JDGNfD}(UC2HCfzdnLF`Kti z74CH&qM_Da6JD-zAOj72X>7%E#A7_a8uJFt6dr1 zlTSch$>#kHmi#5~ev7jJHg}mp6?-v2uee^e&|}teQ;^S9)ePwiE1NnjeA;170|Gwt z!F0dugH6)()^~smOz3-7BwH{vx>Z7x)WwHxY^Us$B>u@@q`>a%iD_m_crE<1yUUt1w`^^Y?7a|FM^F?G(y4+0`aDVnAk^p;ur zF=WXriK#KWGhZ5nn#zAq!Xx3tmLxbX;Y?A!&xExK-?@qL=@{M)m=7A{aG5-LArpXA zVQhXN6yRpcxkW9;Y-c@<8F&t~oK+j?(Q1tu`y7-C1LY*w(-nRKeOt%XBiz&T8QuqC z;o_8SMrKU~H&Oes(2vv!qdBa5;t+WZkt}XlX%zAT?>|ntZCQlblE!$wXBc6q6%leQ zYE}|F;w3a*HKZgRc=fIbKqT$ppNV|N#B(ZdJ)j^6Ea0zRkse*_gn0-HvI2hfED!Ul z1H2nUb)klv#U9nyDwEMc9UqZMwKH&V?6Mj0fvo=BY=iku;{dCN13AWUa%a+q@M?rV z0b*hKJ9n|%=ynEd;M7gU|H7KA*pO6R@2pvCMW{G#2WtM)%}RK zQ_juMCC%D0O~uBxbC+qo=*=XP3u1_%9^8RP%bDkRQN^r8sS;?V?@W;Fve6`dqt_%& zLq<=Ta81;x9HGMRwTUMxns`064`_!;by)8wQV^21o75UN2c2!S%;#2(QkR z_LOtc364?m2Vg8clxf1zLlOfW1P=#6^r z-b>t7QzU%vxvCyZ@2g8zrDLooYMnizaE=tv&@H-qzS%4w4v`D$$b7Oeg$@~)q-3$% z<)#M=6m|Fs`hKe<{k)1l4kPt5Qfn8i(gueGWBY}yEh{&rJY3rB-hbq%5faIpD|@-Q zP2;k;Q$?8f<;bT6i?tD}EifO=Q?Q^u7Gd3Iv|yX*?erTOt@Sa4?#b~r-zsjJE1A9k zu9T|qv46khx$^=NeY@thJ+_c$7pm}kR4aL<2?P(|C?`U#HbG|DU-WT5lHLc-GHHrX zVCM?0X~H{xu!E`>o6{IX=57(l_N2ffJmEo{mwbgbGKumDD@p#2puD*Q^}>3XJ;RXp zxcYQc=Z1BeC2}eKKcN--5pQ)xU0?>)u^uvXRH3JSGd9J>90y3s5sL%qG=NglT2z0( zP=PtZ?sE?_@1&33U!z%9G`vU8^_b<~;N+19GGki)7p5p~PPntPZUuES<6=q57{@=vabD(u>~x3{YEYBg6S%%7 z6D`VKmtp&109j^=nQ8U(M7~<~k*%2+S~Z2zz*AvKuQP?6i^_f~Hi@&Vf&t18hF^Et zw|?asjROJsT*ehDxbgP8&uYuY?a7Nglx*SRuxF}^)PE|6mTY#9gEwADYe{21F(OPn z<}%!=fz-`v0Nzixx_@aregT- zXYBylvAiyc<#y8%=0p3e+Kb%m9p7cEFv@s-O_x!f^V6>{M?{y2q1f?3UUWVUbYFD~ z-(#I?eoR&7yF}V-Pn*zax_{Q*oZ8=gaR{&Y(?7#3=+95#U;*&f-PaFoFD=E0^O&~n zsX?P3Aj7CQ>l4u)MX6=me)tUC$A8a>U5)$x;I)G$8&~mrXPyUAXHKhI<>;gW3j=Q5 z)U1)#r$ORJkbh~OcamChQ1{vALg@X)lPQ(ODI)8Wh}vnYVUPvFyfY6&Rk_rH5o=&V z9BI*rmHcN06Ko4f$7l3VrsK$@n8x9vZUI)VC1Jo}9KP<)I~%vL>XZkh6*~F~yRA`Y z0=n>C@0Qrr#N$N*AV4HEU5e-H9I0+;0{YnCEYB_&`d zH9e<|wL{FF`wWg@m0mWVeJN)yi2_IULr4p&3SnGvooROd^$M2Nf>aLly-4p&y=Bsv zYHf$d&-HEeBSwveoH55+Pb3o<4P+TaY_Q^J4I-T2?v z+qp=+RN;N7M`s`^|xs>w1rg}ZDz z{P~F?_)qGC`Kr#P6?u>lG?R-uySGN{6XQu15k^w+z2?oX?u(JEed|qQ-m(Ry=VC(o zniMY)b$$d&YhFQG@PH0jWRc@0F$D;=JT_9SIH9?H5ofAVPJZUc+L?@q^CU0>c1!Mkm zJLt@I4#l8m%82>zCdWu#y`NbZwdy}Cu}sJUaa?B6wCJZ6ip*&cSrG|2(B&=rnl7h> zbXSApLVOE=IDpOc@rNtCpXZR!GhF-nd*z+?j3WnLXYt6|&kTcB(aLvt3<3YdmDf4~ zab`%5H9QEpDXgrt9=YSd?}7Pcy>c?ylO<{oB!&@D1bn2--M0><{M!4b1WIFwA)Fg} zF|=KzFY_EgKH+Ff<-+J`WpI}_QYQ}v#H}@CkX`=Di62OQ4t-sv!(9qmsQ@PZA!kLT zXeVa81qJji_qXW?V32g(W|Kk9=Uq~fj*-dI5#bXTg?l*tYE_MHlc0x14wZ{ zA*GkL63O(S+#!skro-%AQMaib;c$#kKJCFxdS}0D`wQcK%Ecnz8qhXWYy!~~>6j!? zhPVK;DrNzZW@F(k`ld6fV4Oz^Q-mP6@Y;Zq+V@KVC@IN2skt$=BFkbiB1hmo4E3Xi zuJw_X^Q{fyvfh@5-2iK)QVc#0`}<2m)OL8r#d!duv(3_OZeM73H%x7M>czg{S3pkl zIc?S8O11T*jwaz6!Dq_LV6R8w=I9f=OrtOV(x2u{Om}erp~MN?N{BO7`vhe*U|wBu zPf3_lWbDV=Sxh8(*T9;hnZ3gpZuR|Q_@8b)a)&kvB+SDWSt5H%IlBr?&n^NzJ2|uH zT=aYGL6jV>zGDGSAM_bQ=oJlvL_i$gM%9#Mxx*P2__J$v4BZ30;qEM__Cuw~b<-`l z#W zDha=|ocMV9u($1?s_1K=c19D+QsK8cXnUfk(u-v62-1scbCm{J z6?DSrWq+tvndzp61h6^=R5jt0SG)4T975Z(_U!J3- zgrnzSRdgr8RF+d+IeQqI9JAxo_3Nn4QZ8<7*C2hG;#nLRm(BM;vwET0TP0Cc>pzS@ zsFp~r3}r;y*p>b|m|PEHYgvCf*^Ph@l=kF9uZ6836aH=sNH=Ta)sE0`4a6qCNBb@W ztKrwF0b4~Vu|kfP=M%X|+h155;vQO?YX498JZBy>+?W;@e^W+}p4@LeZk9|IIzMdu z1c3nxTzLtY#-we6sXN7eo#S?dFF;y^_^B6>3Wf6@6Kfh);|Kli#zRTz@0n9|A#F5w z7MNqHw}kl;--xg){9#y0becT^&=PHq2Q;JQ42gBH^;gHW8wjQ2aylbVl8RdOU7lG0 z9tVxe?AYuFtIiqrE)|E#J#{Dov2MR4{(<2KElJ!o*FctUr;u=uAWQcBb~ z{{=3>lH9#_W?)2U1m5B+dMX^v{edqiKYNaazh7jex+K_|C(0Cb`po5ZNv5 z8PZ$a;AY8fQveuRnnHfAv&2%RI&#vjByXhXR#w5HTm0$jC`JZQ>kSHRis`CY1xvPG z{|HYkvr&;e{+LuBDzi1ce2n`zO@H&px~8})niaD|U1;22Z0;h*c$9}Z!WL?yQ)}*l z+Tsec-zRO~YdoYuk+s%!%G;a?U^j(UbS40v>@wpnRlS^rP*SHC)o*#;EBn2E#Wp%z zEYi*?m`^jcoFwpQ`8tc-*JI$U^}L8s&>Sv__P7F4SCw)^ws+>nkKgG zioAoIAlGk8KPs*T=}^9{Wm~a`8&Tne=GxG%OHGNiG%Iaxd;HUEkeKRLgdwPeC4aFG zM!lo>$lmokY{CabF6U3WF>IU2ILE=8)Ea(g$3jr8s<7FKySG*jE$m5$#Xp=PfBk=FCC#?0aooe zsFj!%P16x6VMOv11R8BGU9?uKW}j}6*(*=-R%mS|?-BJ`yO-WP+rY-qds7EY@?wAy z8GM|99bSv`qXwin?5mll^WZ?){@>@QeTtXK-8^V;P<8K zYrYfMX_(0LQOMP*t8d^`yNn(yqzW)M-^rnV{Js;;TSwh>5i?__&L!0fx!3GWF35Ug z#T5u5RCt;^^ab&t5&)=;7j%v#aL;JcXTK0b718cJ&zA=6{{1Pup#NF7|KoJ96+_SK zufc-r9U02yN`vnRLFC&G1W(G3SXE;%d9+bU4^L#4@W_7( z&Jd8PH+eY%H`mEO>FjWhqy-Dv$B}o2;+ILh8sRt}Ie&T$X1gESe{&-LNFBwJDSAlm zn1Gz4Z4e}DmVpj#Kr<1DC$eD>KYVC~>_asQ*fxPZl~^QMi!yp=%!dg3N53^Ef<_c8 z3KGgRzRE?g1qx@d1~4e^RKHtn4Wcv5h5Pw{;|yL)U075Mc_#C+8cdU2Q(PkZoU&&4 zI^H3JMl77gh`Z}lOm?2Ieh|SzC8ERYY~}h`v>T3c1oo01a4Qi)>(CVc^)%c99NASK zV8w2Gi|5sBk^(fikYgoJ>fsO3$|_L>hD|y%O~K5HD^ZZ$68sfE6WI`MtOHQ|0koyOr?7y*P0`zR`9 zpWZ6MeX7GT%*?57D0?#-1b}7VENd8OJvPKl^Q?Q-V)H=CaeR++WsleZdE5vDDm z5_>cf5^C|fc5KdP^+Shta7+Ck7KH=9^nZg2`NS%b*h-zVm7@2wQ~$ZcqLO&r+8o&_y;-B_3tK?QM}OVOJP^4scDP6aeXh^1yD? zr)R`v=Cpu5fUq}U8^}`vx`rPfh)nn=LTx4cMrR9f)@>#ukonUa#90Eb({_nqj0~8K zBOCmHRt)Y8zqB@5y2Smfs9OEa)uioq6s2BEK{|W81wf$3_ux$%G6FRZq^@w??P-^d z7a*jG!AmhG?3D;=orT?cId|bDh*>4d3H^{%DsH;+tEEr2kE(;bcAYee^-BXc9>LmY zN!_m^i~t^XT5XN-R3#AI_gGLVuaF2CeZj320jlQo@EewAWj`QXL=@(ZoPBB=7FS zW}|4=(cJMQP$TUq3C|gibX&oR3?K91ym|DDm3e$`?V#8^zO`;Wz{1DPIMxFCOz_9q7k3L|E&YAT zQ)}t+Y%T&xuq1CKZCsqqa-Hg6Li38v!r|lR8$JdOj8PId=RmHYGiyRPuW9H461kh~ zU_(bVWc4UppY1ElyvGki2rg1d2({x^^PcB5riivDsB=IVcr^ zu+JN~`hjl7rH}xbLu@OJx@`*+HgVA2#>SvxY^XkYJbjU+Tr~>P@wsZT-t=ci1v?0B zC3M-FSY{H?H?`a55!$Q8p;Q)G7{XsluA`_n8rd$j^BIqbTAP(RpaY)>EG~lCX)cX% zsQf&o=4({17XHXf^(z>8-mDf_CBA=lD|!JhWhVNc@Ug8uH*qPdlBF`~5=E2ekv~DV z@Er=722`{BHN8$YS*w!%P1R)PqSJyfMIXNwJ>7M@cYX_z90y7nR8MBda0-Z`F?}?r zHyypjp^rg~N92llJIo|+Ghs5=mbmQNCG&Rrl=s$iG8hV-recxZO5t%-J(1OLg&D9pD9QYJk@-P$odf2 ze(YEW!_Gh_v4Er8K;SnkEOO2&CxzNgjI^DOLn`9<1Q+`C`@1`~7KsscsCEzloeO|N zFx1g8f_7COo-e!RY%DRJ;oQfuy20-z z@}EU>)9D0wA_dauG?7eP4jlW?o zZM=&imLLG%eKyug;5YZKGQUtP#t~43^fc*JP+s?zb)$}Pviw>aOX_in=GXPV^TBF zs+$TUgM+~2x6|Mv_C5{r=morc)i+2kcJ|rzIyh(6T}mBNOJGvl?9ghh`u|M(_70J; zxVgh3uT1VieR2$p)2eKxmED^<26oKZ5gFsA?>l`zx+KHzAjj6Yq@61;KtSy@Se9Ay}FFa3)%yDj9;G;67 z|Fon8rV|=@*@G(<`C>;3;IV+{6IJS#F{Z^DzULm7SWWs%PjkPIKIP|hVLhsM|J`zN zc9=w}0cF{8Vx9No0B$QoY6Ezl|5UZ>CSmro)91w+yiBX`I19Dtsk!$Sr&b!9#nqr{ z3=W?+(QpDW%EpNS}a@>y@MjQ-*Y#X+~u@h!au@zBJColZql)qj!PoN_}x z?4bX}jyYFhX&h(k{N0+8zpXH2BY{X|XN&)70fqJK_^IHJ6#=aa@+(go&kW*Sb%~Gw zR({J@{P+It00l8Sw2dW z6`bOY_1X1yD6T>0u*B$E)0j@QC{<7uAj%|i}Hxu zZ(~6}GoC5un);5&4b|vY!K+ z+N?Rl23`hDAAt5e^TaSDroQ~eZ!-DI1UM;GTC_@@V4JiH&_s81o4(Sl!^h?>v@9)F zm>4dKHq8@=g)+cq2h;JQ?USzuAtLeG(a&&RR|Z!JA5Yf2T(bFhzFxiZ)ol;CcL0gi z(RJ5g_L*9Z8Xl&cT5C`Sw9^4YefoGYn?mMZ_sGr={ztu$MEpHMs6DDV<>$g0)PO7S z=SlSYdb?oqqwh^w@hVLJh+;?J9>9meq|Fn#tnjLxjc1ZVt-Zks76n`P-2Ss~pH5#` zpos7rX40jI#md(ti8XTW3YR5BE)*yTcKpP;%WNO;`W3D4CYwf?kfT8zSuSTYu&bF! z5W1+N4u2Z^k)d2`hh`x~=A=D!@g?cgu8u9D&e`Xv1dq&)Pvs|4;F4n~ch}H)b@q?v$7!t^ z0ykn3>$vPsnMrJ1&QE*a_`G)8(Zkzd-%*v zzXsqRKK^i%nZDAA7`Tu6NWd@gxj1wLT*x~SJokE*M4RHeQiFAV(ipHuvUP$(`rJo( zo7$`S;}@Hk_SIyHP<&H;Ohpd=uTM7Q9Lp4Crao;n+%Ble^fhU``C9D}v`iKz@jd&( zW%ISwo&)u9pU(o`=>_j-&chCjXMx%(bZWC5rd{IZkUGwF%vz7ll@p8}+9%tt+`@W( zfyiF}rp_qJf)G2a{=OCz%Z%;rYc9+XZ^{Yv|Oap~{i>omS$8El=SJNHEJ*1me%$~Oz%R3VIu%+n^R zc4Wkg2KV5Zd=Zvi1o(Rn$RELVvASw*b#j)#L9N5*A~K<4C-$*fg>$&mu|*VTj?5Qu z+;{XNglvn1LynXg?nOY}XB>Qw+~es~$jDP;a1ACvbUlWQA)n!NwxUlR{V07urXoqvx^v_m1TdY?+(W(4=Sh!DmTyKR#!%7Mu z*qPCQS@hgbvbp?ZXayTvQALddO--zgToGOMuTbN$N--!KdZ4e6KI6^)y(_EBNO)?4 zll~cS9SQXzaf@(~7tqcf=E2I|56}z~dH7jXV%-zVu0RQ!c~E5l1!e$!xuOj(YjWKd zafC@In1a5-(Im%KB@W^foPdtjmEf7jA9?62VdqV^|stYMxaluaM zQLCPuLQiFB-o%FS31L&9uyU%JY;^lmrB+B?_Yd~}uU%9RVqvY z0o;}N+*S)QwcXFa5o}#-mDX55R$K7nwL?zRq=Fl>0);LfMxbkVSJZ^4CJ%4v+@#@v zyhz&_!(+)PLt6TrHt4^qk%U~+n*CdOgb3o2HFe2#t>8kJGri88#g^$V933mlS9&B!XToRQNUW`%UQ{PbE|mV9M~tT< zc5$&&T=nvv43x-`i3-#GVzv3o9bTxC{z+;|a|#}$n$JdqY8*c=hU`Gd5t60etG$5? z1|v-2z*0jLPaw&Sf^g^=2o!aFKPEv{rj3w(oZ;N>sVvIRq#(OFujh8xsswn;E;o75 z&lycnT+?Pi6{bRHn88YE@#hU}O$W@-jhUPFl&5rxG>ReTQsdz*8IksE@rrJfO@f=> z=>!htA(_bpv#*|vz*JVK;%6#{H!$&*DCvk_-{H9Mu@5P!S7hu8)$DidQe+)13wi6UtgQ1((1W7 zAkTq4l)mzyTZ@<(#}%AOlLXz7;PHT8w-RqhmwreothzYiD%{&mkjlGWV1Xjz8>eJB zjT+l?WARjX6W>$qAz?ANCU5AgVF3M0)0pzrD(c|%32n_${a z)pl1kR-1f2Z6-m(IAJe$4qsSE!`dU+eaK>=ksi_?JA95uvXd?(u${dy!Z*i)<3%$= z-sk`oH)NJ$*66h{?|k77md9)zN3jP#km+WPiDF&;z;Gh9!20`$A^Nn_UhmIbW+kbX zz+rsrQRwmy1tAm2VRhA0083_iMJzIi@IIm9)eJ3kksZlF+MtcwN7ywt&X z|B+}F;%=?0`J?^Ay7~jsfzGKR!(^hzm1ChA50e_T7ONMjj;=%s3mU+k3{kJJzU8S2 zv>d&16TMBEPk;<1HPiJZh^8AdK5B-LIX}B!#jGRJ5!x3C>N#y&xkX9<*OB>=;NO=m zG_dYD=}drEV%?)_%sEX@#poOy)-p((IV246tlg_=P<;74#0+fe{pt%?%ZtCT8)_z` z4i*b*qPac21h_o8f%)0{m76AK6JJJ%p!CZBhgVxMS!(rt>|W2mxb5TM7?PAJnewpd z&7ojzwJNxbQdzl>0xnBv)^?MSL<*&PdGv2Hm#1&v=o*sblXcp3fH1u`Q*M0^o}EuE z5XMEi*5pTZa}`d&`?q)Rx^}iONQ1~@lYpudS|EO$TN&pA`=hqisL? zMx^Ek7(lbj;Y4lmy!aZqvc-Z3VL3=Ve|#FIla=KEBXFV{cpcsj9j;~@(mnlO`3IhH z+3hvQ(0lvv0y8`{7d$EQS!p?*;XT({k`&wP%Wdz{G0rq z(eN4*nDS?_VGqxLSinGCb>9NePChr=?|i)-<4wg5iZ{CCmjyY@p41;YQO9CE19An& z0?a10$*F+p&5nS->q16r69PZQltGPdbcw?(k4Jc?9yMfXNm$R`A-CKzIltr&ff{%U zwC$@ULOtz;6LbF((7+OcC+{qKLn`)VuyoJ0?E=C$KSw__bC&R((l zyPPdysBP~cul=-tb@)*Rxd=DA|9V9=o}}}0L3$feGp%G*o`H@S{T^;InCR670n+>K zd^jv$Mz%CdoDm;Eq-o@@E4jnIE70Z+e6eM5PJFP&<9yG)EInSZLmB)P^oHn|Xjo7s zEh{|-dliJhU_`#(z$r>63|}~x!oKgCMvU~WkE->J{`bEY{_$LTPAH38#MO}7AEsUQ zL|tReD2rAL-Htie(PS7{SwOAG-m!`aM|kSxo&GkH@!W6hpj4d01AK}Ng(k4QE72@C z{6LO>Md#dMUE8hA*eu9)ltoDu4n{0Z;P9&t)fslrju~Z_KOJb>R4*z$T|P9(R!Al0 zTDZ3^xBFl5^X))`NMMWPgbDZKf6Kyaw)mUL1&dDMZrjKR7N2!4;>IH){66HGCAoEE@CI zl?1>(t&_T}ImSg9w{0nE#m zDVBc6Xa<1j@A>h>F01ea5cdbBuWcDu1Nr=7QtwW;eu2<;UWMj$`_KT7azvTAgG)&L1Na|7F9S1rkxr=;Ns3)LZF=X?4;(O0xA~MmKejkPWwEa3yT42K8-k2k+ewOc*xJmDhM2j-7${;@++?b6)TTv z?VT0Tg(6o#oG)S~)NtOB#>}h2ndr%6!SLrpeG~ z6}+U3DR#AguA%T~k;?CMU#9Bs5#67;3x6pu>7}SGSk&TXGbz@p#cpuUjy`OhD^(%@ zTpG;Angu_;6dv{f-*ygDv+-ynWA-e-qCuw_su?{LM;@NBxD_`_MDME7;)ZKJ=1B>l z+R*3}MzMzI2I`u>z_pMh)@Da5axE@n0uA-N?(Z$hDmXRqKIN3ln%&;o&%UNT;q&dh1 z4e3Rcgq6#iX`+CQ-C39NR0;dDDDU=;IFU)14Y`1HI|lcuucp<^ggM#SahDX_{h9<9 zqt0T*$K5LIYj$-10w|ZDvC3_IB6v9n?2oXF?Fbk>(|tH=`P$KK-iv`4=-J?AHt0H; zh&jm_PI3sAmjQsm4f_E`da)LBfb0HVsy6k@xPxY4^ReGxB{`xdh1FsR+`1ui& zCk_=vxq&QWy4QE-O(=-aP}(-F4+DP(x*~rSroC^zi@oqUI+JW6YBo4j_K4pg3ZW<^ z0uOUX4exZ^*v~ic^0twP*D+z6EbaVj1~KrxZlM7SnZL#eVg&ULN&pZSp9)#MEZC^r zm=XXo^0Dgm>`Dx=WYtz>i!B~!v+ZN|DInm{V^&zOJ0m$(zxHissJfLH-)mgIgW(SL zG$j*@DSvQX)t3|(Tdv+(Wh?%0-L0GO@Y%iDo!k6GlVeYR5AFw~KLH6Ql zOf&UX^MFKOkRMdXL9{5q5t^d7$x5Gf={ou7(`EQyR#)7sFwa63D%Ik-+Q$8lBAZ7L zH58*>Q5s|WAi;Le!CXZ!9iEVu^B$)$S_v`-;sU6K3Q-SROt@p}bDJPrX9bMT1j%6% zbevR9LcHWsO2o8fb-Lo@oIqN~`krgo#BAGs|~GgUHhij~05?CF846-DjKo7c8nrtzJ#U`osX zA@*0(gXbVpyCj!}C=|fsm9MqS-zuWw!r&X$TJ=O0VTEZ1We8jkP4UcvZ3?bVp`5Db zn+h3aq3@$p0K}n!4%z@IYVi0RiVcLPYA=KSMVhx@@ba@#g$_`OpbRgQBEsxvRMG1C zp%7(&lP&JTR*oGI>I~4+H*UkO@7`&iBI0Dx&BZlK;qr%!!Rtx7rzIYF zu}gM-APSy;D&p>8GGxcjs{3;$;MYgr18!jnF;|?{I$fFlOS@j^9^?4WYyNmP>E~xX zCK9M~?fjM?8WE!&J&Sf58A+fp<~rh{UUc`nqeqO1SI8(0Pu24`bA^iv7Whq;*iHQw z$HFdo)#kX@FA5ABCLVnF00}<<&7@%^N6i}}rDE$uh=;tb0Zclc_<8pbbq*?BcPlmn zSs|}2LTNcqKPF~=PA}v`vX-g~qym>f1Q}qde617rS5_3F#C-X0b%k%bODm-xiV9j;~Y6;0Gc8d93^5F3~^p4RhPkGIbr1or%>m9jZ# z{A575)Td)IEgEv&A40P4q7LQ$Hg@*@*foO2l}}n~uB9JV0$Vc$WLDGOsei z&;&}bvR&JZLfY#qxdM+1XbDJSqM=Q5A?dofX~Wz43>cedsr-~=z_n7QM4Wh|9mZZ_ zZ9b-?()bYY{flMV+v*|DVd&o8{?qMVs%wx=O&M#M_?5;yG6H@<=8%LUq%}sLx)PAu zV|ZRDKGzJrtmO&S1vHpIS#}{mvuj~ppEOejgT8x0po@TU9&>Xj5+w$0)@e?Z+tqZo1Sk8`e zP#f&?E9ccM+3hnY1FXe+DEztnbpZNEJ;lOjM)0>#upkHCG@IAL-eoNfc62q3U(RQ* zFwhP%oT?VLm~8TU;bYd<$*d;VXys;Q8KU^R$xWe34AYN^4j#}Hg&4{H7Kn<+OX`}g zr$~@sw921fx7j)Q$}!20tXNiAZ4=lu-(ngQetDuC#_li=m+4H5B8-W&@+9OEqHM zF;dc+0`3(>oAFb>q~d&Kc}JZzVav&4QhlmzNnprp+h*x$*3nN*W}z0Nr*y>w1&;@F zRR+$kIaNUiw40i^cXJ(!)0OAGi#}d$CL!73Fpp*L0CYNuL830Pv}4hbcrmxea+piu zxtNkwYn+(_qGU1EbJLO`SYFIK$-xx?-nhf;IPw}6)*3Py#!!^*nRk;9{Hs^Y|I4nT zNuLD*f^>@8XXlQ4MH~)}Tw;fTzIQOMvHIM14k1>NS(-~wRebwOb#kE7+q4(lFXu^1 zmU$I=eN(D__J2eJ536~S`qauObIm_( z5Qw;P;BP3|VhPQFk$?(;Dc$q)Er^U zXAlB}VnPf{wmg2|9u9alb=;m5&W?#u0oUyXFC{wzc6e1w9q=}aUtdYjpX@#nz7hfSOF~HFyCmIQ*YBm6 z28Ptq=&x>rN|DEY(v>_`^w`V3z_jZyK3Jk0Se9_9xo#6?_Ns7aOsf0PkkIv>_LzP`*F7IE=GTmg#E(x*qhaJO6L-0C(7t$>H+mbdaB#>uvR*4hMsyDG zSW|tzqDIr4VQ4$`YO^^0s!~a0OcbXIz2zsBNa8U`=<6ODKULw>_21P?cp~% z_K#dyd_T;)#tuTrI*X-SrLV|`AKR+gTbCh7dv)Uid7|n%?W`Lad<(AyJV1YFZa?PD z_&Mm2cQ1D8 z7)9g2xQD+fUyh5(xOqy~mW{Dh2^T&_hdiWZgffi%a7&x&NemDsS%fq8!7X&D4S|l0g)y(9uYqvOc4<=2S!k^z)Ain%VVj{Y?jmQId?hKT^G(zx7FK*g{|5m z73Bpd%5wXpA1BRzj9sN)8R53R6s>&%qZj-}BxHB$?$2l?i?_f0G_-MACrOO&Z@4)@ zRm9_S@=%H=u=`a&vT5KUFPr9tk;!ivFzi$HL<@pSNG#tCVLOP8s_3*xca$0NF+U&oCH1qvi@O(Z0?Uj9m+@R#5va;MQ;cmXS)O@j>5Z zix;SGjCz{R^;i89e47R%mxSOQ0C3IT^Qa%HY!k9V(k&YB4Zpvh-B;Hzw=fPCX+Go+ zKc!xk9-);*+tl`+r)j1|MjF>!Rx}x87s`o;dwyNTY zi$562ct>b_$~*~3<;#*chdA8py}?$!l{5)i2B}O3PyII1%`x)z@@)_W?&U zlux2KW}AD{cUgrr=n$rPkhGs#Bde=FwxThR(r1}3h^(_M%E88&h{sbL?(0*Qk;#We z+5DfDj7L?)ZTlsQyN)!)WpEG1zi9ir+cNl&UF$7CXLqw69~S^7{4NU^#LNyXsAgZ@ ze>}P4l_#g0nLdjSTAXo;qRe#83`6X)U0UMn2C$#hc5EgtZi9(EUNKN#4hCZs<6S!< zDrOnNC&`X<;OUgdNg|Zry~!esj?@2 zeX58Q+$-PaV0bHW+N5U{EHhEi_gk}SxD{qcDRhzJohwh{Mc3VN)hn&R6|Uj8diKog@}iDi3s}L!VRj6StjIBM+O~uG{g_g9-SF>qBxav zJ>N}Y?5JP`B^nZ!+)G_&o5k?(Fmw}DHcx^1k64WLzfm-jDVnczP^k{zMfDjRVu5Bz z9k@hI@#`95`R$UCToArVf}o8i;f+*Duyzb*I4gEP4=#=it!k5AQ-$a%!?XV@o^3{= z8INHHH)Y9PH^bv5Sw-Y1@|n@}I{t-_6c5o8xMocbLjZq5&_633dG^^;7b|!-12_QG zTCAR6>urpNVQt|H(ewYZvn8BhV=|0p$q9brs73vgihI<)aQ8ga8g~XIhTDVno3Ts{ zSLPTczN&eXDlel41Mbv`M~kABixC`~eJZGRQSn4Nbqnj?8dIz=eriFRZeV89%x-)e3C8{&ee}Ftcyz z%Fq~sJ(*`BPpg|x68rYFyS#=dH5iG7QB z8c3rbq~S`Hr?lgrJN)uH-de)4kWJ{NOPZ%?ZrlyRG^+!7Bw-^1KJvHj(wp+hzeevL z1auCpG$06_n?3;VUA#1g(THt`ZGi!xMI!Ted02}Xt$)z7-1(jTlJ`bGWQ_gq)LP^r zNNOQ}>taXNG&`N@rg%;^wfE?mzu%<+dMNn7<%rOyI5>$8)8O~pLj=sflfer+6`_dt zQKpGY%e9&8b19F40i0DSc#})b_t|OiD$G3~cdSWWRRpaKOc_CJVwJ=kfF@Lg_}P_P zj*B{CR0_Wi1gwQXx~j;LchgTe(l)Iy1{k`KTB`J1c5`QT=|*8}jc5VDB5FLtvQEdE z5~*YcbC7Z2j|}0}G!@-<=9nWXkSUvksFgB8STA}28G zI~fb3#ze)sCd}8nrU##_pHqMBT|`4=`5U~e+{Y%37#tiye$RXn<)Omt2e22C{Zsju z%+me$1{!SiI)6^VG&mr$ok7OXz0daY8fTA}b`Rfq-fKG70j%9DoQigSWlX|caUm>dM4)>H2d7hag zL0EoxWx7Lon_t)dgFt{3f!+brOYLY@P_cfdh7qr9$NQb3!G&gkhz_5>%_e?JgtnM| zM{aC4MrtKGWZj&Isu3Pf9-R3ez8l4!z5*-do72#bW;CskFpx*Ri*n~%(p^RpNKjyF zyviH-dVbs*-3lM)^<-2#)CSChU2gW#>0#swB+;Lvt`A~75jKYoZ@ z0{yhWsa%-6tWM2h#QPPSG3gSR1_(dj$lGO$<3Wnvc)5ZmrAb3OO^ApUJRFn}a#jb9 zdy+2tuB*muuX?{HlpmJvl$(lwd8JpKfN`Uqt>FRIVfqtf;l^7eV zzD{oi0CjoLU;E3p+3U(qui=|(m$o;eGIAg{5F{;KR$5~MmCq7mXH~6r7pk}M*v8t* zh>3JAWDVBa!@3a;O-^4LyXU^hmhiXw7vHbE)_%)NC-~s&-xpT04av_`7H*ogfQLeA6a)1I=CSp$~vbtid54nfS>k$oHQ0gt#zzl(AZun;)kx)VaNX3-aP>7eQI3?;NHi zW=&o?5frxUBT?-Okm+H}p+qPa4E;Y1fzUfeDSHCT=nbHNQTg7%{DEXZ4BhPM0UO59 zYT;W>UpC4$C3@P~m#DF}2Kmls{OX19(swgO&+LdsDD&c2jMKPVc0iZipNpPNo?;~t zT^Ieu%&<+{9(ezrB4%{SdOf=+k_3(gfcNWKq%UWBdD%ps+IFFKt^2yyJe=08tSCpb zMw^K3b(Yq;wVL~%OES~pv5kzlg8lIr4Y=ywNBSZ58vQAR&8Rs`MOb=TP6z>#b9G7x zy57$43%mIRW7h6KBd7In)xoT>$=2w1CBB^7as4T#2hlv5@fWC!0exQoqz}ZC#eecsuRxYJL_h^PNASF=-yz zR2^hvi}@u+&@GiyaDQsePp zs|l*kUcP#*Ux?%xIxkD|hWjlz#~zl(j5@75p7R~=$`FiOr#g5?83@si2RA+mKkz53tW>i95e<-A51V(uDtqA z&ul{>qykRF<~fTIuYqEN4Ut|mG5qgL;c*9Bvz_f}m#reEx~^~CT&J*L4`d{Z>CEKC zgUw~5h!jlz+T+uHCdMTc;z$oyA=0mvfbu8CJw9X&sEK6e9{And<^^CqPZdY-dl(;> z!*K2;8X55$gY#yWyuMFS5agMR-o{cCPZV0TS?Wu#Bd(hHwW9s6vfsELWK1^{rm(Ix z0bxmU!R_&#UW|L&<=*baNH0|~loWhI$_uO)EdW74zQ30o%VrrILz%-82o40$6VZ8P zVAS?^QJTyjs0xdBVR)_ic7$ijFmqCD-a47VpY|4SlOEF^!y&^NMR{}iTgV+N znE*7BLDh17Bbp?H&us1`Tf@qR^Gc`9GG=M)SL8ayCBD0(i!xCe&aa1EnY)QpkHLL7Kt~3$=%JY|-&TaVkxDP`d@w=!jTOavn>5ifl#A4hGIHr-b_r~jK3H#dItg}tZL zYHyZ$#7I(us#st@T|99F#{b$JvtHJR)JNM#4<3#k5@5ji;bghVa0)>SiDehoXJw+r z9NUA+A2tuwpoIj%6l>WCaE)N=~wc0V9%xDmTv?a7u0Z^9xqeUPfxdmf+d!A?605bR!C)1xt_gvUg~st5%vE)v~pj*7)Y3Gjmc zjgnkn=>7HbQ6W!m6iu*`nc#*+{FTWe%gU4=+JSHMKulvBR;B$T<_?!l&XDqCoOTx` zIqgs#D-|c#jXsKRv?Iur-zQ;xCrzDJFnF{gWrTvBLSPefeDJry$fn6kmPIAf4?mCp z>JQ&_Bxtgmk7LQ21aN4Nwy1L&0%+t{-Ch*XcFZrE@*Et}UNS8=L4)k{`Em^`7YXnd zwpotknGI*^WN$RwWJYrDs_$9&;K^-oDYic(|@l-uq zz8ABQdalA`TAr37*ASIcz?c4*rEa%(oWP=SdmNZYk$rm?h5ESjdFi|PApivnhgeg# zJ}yAy5X*}Z1pGa$rMKH3LE--R(Z9{6I>JgJfP_GB&}^Ptb4To8mOgh9&!3&@zNX?e`!*C)p2A()IP;$6!r2||Y3ECoG43R1tvxT98rDe+x#noaQz$lHZQf}hjEB=%QgDUuAoy`W2~jg$?_ z2Rgg>b?0>ZPO&U-T2LdB^f}0@ntLs%{mg5}38Q`*v9wpi$0+^vl^>4|AAyMFRR93n zt=BZJbi1!P&7BsriZ$z=$F)a=GRgJ29lcg0Xd#zw)(PCR#f^H(v=>#oWww3;L)~-; ze~exXk#+?^(Nj7eGle*s)Py+&K@rF$KT7d$(}C$=mfMIz)JCNnNj&vez1JpQFm7aP z&xlIY6w^vj5gWF;I=pn`C4~K#y{A^YA|^rzA~F5$48r(End(oB0J#I|Z-cQY;;NCQ zS((kWrK&#W*E0lc5odD6eWf95EN(w;seyGKcc~-i54@H}o2wLH%-a8Rj_5(wixG=1 z5%{FWZG7@xhv_|Oo_8I$`I`z26jtl#R5}2-na@sLORh!}hNq;Va6*rkzxd(k-ni|p zjSKwS)IhRfVUq~Yg;XN4I&^{F?eU&-a<4E;Bi4KO6P@4QM4xC8@1gwOk-sX=mn)(2 zYNn$3OUW@f z`wfVwAKji4fTr*IX_PoS`WISg1Q0`!B|L7U{pJ~})0p)0txoi=VBRs8MJ8HpqEDef zM-P9FjGEGzyT8Ai5T^@4F->g#V)#gL zw4p+{*NZ7&97>O9byT8R8-MR;Y;3E^{_$#l%2=5ZG(`LQ(Y2Jr$bOzSzqmiAv&m4wV%vy6H^xZnZsDN1D>@e$YYCzrMWa zDQ=ki(T{CopIt|1G^OJ{&I!;+X0lY96KB-kS+-}S4QQ>5(8L~e`5F6zC-qhdKtlih z0ag%|s$!-sG>*PO(5p1upK#IlIsrY|f1!NDK>jI z*jVMD0rTix#4viFKpG7{t?k`e2C(&x;G6~fE};hSV&Y_(R7CPcdC63+WfjVvQc|=m zjxp$Y&%=#WE?gyb@tGCe4s=G_%NF^jyT-K3v&S=0Z@=g5vzi5)b_T;^G z6njU+eE_b1ss?;6JLwti$(8ngFN{HxeeksIPOF+K!qmvzhlqk8NZ00;NZynRbQX~i zAw|(aMBI~0fA$I*02roLlV9ed70lipS2KSwnj<6S2l$~Qlh z|H=~;tro4$m30&q44@9g0DxdcrNEW)YyMk~d=3qFMv!?8_xJiC=Ygn`*p>i|l-WUh zfWY|X*+H>a&gVwWxF&l=IB1M}7lFyEnWz|$Vpyx<2o-Nvxr@R0Q&(D(%Y1kNklXe8 zi8q5!gS9lfVBN~`k+we^@l9Pc&;iI3_K7v&$qbuUjs2#1E6YgAlTNr>R`%z7t&Jgf zilz2La{fL&0;zLGdlm@!OnE<=9-Xb98IXYE26{j`qmm`Z%uBwWE74JjSH<60p4Qsw zj*bu!%9^B5$7}mS;kOU@n_oNvS=A?H(#}Jfq%xMm!=}RQ?i`RfnqypHblaWVnC5I- zaAByu`BamFj%au?+Ql&^Ef zabm~UuZ{U?Jk4eibswIb#1!$@2Y8+*LAyovfC+@r)j$$ltX}o)qZEv>ma=pZ)kH9~ zk7l?Nb$#6l&kGD{`SPL^VFSh86D{zDMP6*&M{}^*{2^f~Ykvp}%u(sdLTg@GEa9KW z#$?&({oDcC5m!8(o^UCi3*$B=dBri=wu{uvl#bd+23=Ak{(8M&Q>t2GNm^kVuOYz8p=nM+6HC z?)&tKH#3b6Vz#gBbMENsp;=v+(AGSIRx)YNx;{u7{K6>>@N{lhDh@ciPFS8WHgX>y zIkw-pMF+Y=fz;13C#s3tRH}PM`RCImxUlAYv_B778h$#fhRGBV95#5s7N~42YXvvC z!o1W7{)PljoH$3$_3B}@_ z;TXN|$_N=PQ&)LQtbGN|Ft>S*iTL}tLzN@zU>`X21ZS`16U^GE!@67yXqBIMb&$TJ z()_ph(9H;hzz3XTlPwrpy0TbL=uZGg9DQl>arVb7j4Qlg)6<3#)Dr}q6h9ZYYq`NE z&oYE}R&(9{wv0xP!t6+UwS0?a?&?5bD2*h?VC_W*vVVDF5H)&7Qu_t82hCHj)gdyI zVi1nb^d!G0v4s@ALcMoO?H`cxBT|890v*@L6z@*8rAD20(fagam4&^6@!R4UDx|SvmxN!qB#~Hnt(R{kx4=J ztnbdjTJaAT0QU@mcfaH!LmWF$B1=6Va@z@&L4w$ZX)gggL|H-|ry3%cQ$Z}M+!E$< zM*(T&r(Bf4|vqqEcBLFj_P1N%JM^U$z;IQq361QsoG9vs_PZ7TH@_0fxsV`B_1g_A8aK9vY9<1h2 zcffieWwUXBtLv)00LZ;ha!+%w9gx5stR2A5SH7n)7tW7MZ|sFKP_DlBQB)#^A~F5{ z);Qh0q#hFYj4U|+durkg&J9Qe#4`*tH?kMufDqgbvr`tq?kB9cm(-w6+<0^9k^3ow zq<7mb-q8YQ+YMxw!^1|ER0KhX9Ag6g81#PY=MN#WHD_B0z+ZA-Ln8E;BxZWJ(bQ_? zNmQ~$iwcEpY0w>3QMTb*6Ue|^v}yd^p>j5(Vr(4((k6q-nwN$UB$`(8wN{R%A0@3a zR%rr9=IH8T6S7;mVF{mQVavHkoy23)D+s#I+l7!)X1N*Artb+S?d`G| ziQYm(pI4neK)9v-dK)4AvPE8-yX~TM(*g}7(z)CIE$hEQ#*?;-{VPouq5~ZbWN~k} zuW^J~8|zE8eA9KZ6*76vccoT%A^{K0&1B7z6xjyiAxC;-A>o!NwKbZ(Bq z2P-B@zstDZye>!;BaNXTh@!Ho^II_0X|hNrHn3-c!aX7~h&VRt)-Xrbp*l|LkD&X0 z6yp}YZ-rO7)sjlra!HN#X$2^<-Te%j{SiP6V<3n_*#Si1&maZ;!&pwaz--FLK;dT* z0zpRQK%W$@9{GQj>Clq@+5EB-=1a!qRvw;N1zB8AdAupxAXa&d?3E_|8ZH7ps<2L& z8KEgMuzwr1qg~*Is~0}#!{@gY9UD!bwsW6@OR>Qf(2BX23Z~Bwg?urz$IFc~D^3Dd zt(mV^$sk7&6*hT0{=_5YV~yZz$v~nyxyItwO26#DP`Ihqc$6q)^o14jf8hJ-rrrBo z6@F4>9c*{|sosQCU0fMhbJBm+U4@3YDfQQCE_;5w`^id2Ypf{Sa1}Dbv2ELyeQVE) zNADx|29ftSlP$IfjnL=0`4WAf*wlf0N0~CGY8m&OtUI@cWOx@5Pgb%$4}$(XaMhn| zqI14s_STFq5>{*34?ya*=uOHnqq+7Vt8=m`8^|;K)y)aD0NH@1$rYo*Swb-v53C=w z5MdPiXL{|9_ZJ73Lu!)7m>i50d5#tpzMycRr#>BBu>~x9Qs3d86@yRmp8sFJ8qWUq zw(k&_w#EcE@OAiz+QR!$EhK)Dl3gSG8USgd?**EWu-W7brjK7cK}(2tA9G^z!a3vS;a6Qf7RSAha(p4{Nb+R$7q;UuJTpKb z?e$+Tz`MM#i`pM}y5S(mK*&Bs5UDS@Pe zA^Bd=W*&xM6d`fg5Hpr%CE5lYV>QF?3qB77zZdf&?XsF9JU0yaVphVfMV5Br>@<$C z>Yk~9V97alYDzE6w6rQd3k2AW0UW5BHZ>T0Hp9hU+e#q8w-@l~h9F=o_-#NltxIZ= zTF%{uZg|6hW9{ux5ooR-`&N+L;gRv4?+rTyi^N zFGfU9-uwF9{eL&nOdt%kEwG^*!;QnGZv3-9>8>J^@U8~JD&KFZ#G?QE`>bO&mbVyv z;GqU&!>NX7t|r=nIUfeQf5}`Z26@@9bKAXXV88Umy)h9D=%4VFzogtm3+8hlKnx>T zPQTCLpRl-wP(~uEtjO`Sa$plQVxHR;9l#R93%|O(cE}MsU0^yJ94d>#$+Qv`q`|s` zU}y7DX$&5!k0+yQ?t00vMo7cYYZ{yQ7hh_t#f)phzK!a{o~>?`Vjk(Sh`k5ovpe1- z^%Q#Hc{L~U)@~3GvX|!&N{(IFiqqaYi4gd@(dS4J0eJk3lW2l80ipu2Fy}4U44CPS zzbdyfrg{v7FXLOE(XRD4GHbtQ8ytntARVw#fA!z2Bas??1gyF%p)U^)5Ms#uEt&2b z^vY?W7dtm3Ulisn%p*UkUH)fyY1Vl0iSrOSUmvCsp*YK$}UuTncOa6pP~% zB8?JG$~EmZ(aZ4y!*pk@ZSW+So^zw}y^?|%OcBkbm#iRfR7$B9we~|#lyr=&<9b=8 zkN#_wrdt#Q(hl&ND`tjg)w!<%77?TI6Lb`iPt`B0kP7?IWZ3(TXYc0AT+O^j8^t}Q z9D1tR2hmjO6el-UJZc4@QxuV#2f&UpRPswsMcr3AiSk4;+c26aAGMu1yn)@*Tx0&a zd=qEdOq*1B4GyYgL?en*&b$H)<7?RU68u4tUfpI(?f1~f zTD&O1RRD&)8K%!+cG?FUZ~%E*(NS)+Dbzd5Utm@=)vMq*e18F}y-FFKQGkJetX>N$8!=4&qtZsA?X-sD=ZworbNDq`moGcH@An_07Y4e~mAL==+% z|4P!j%>G*ydcMKu9(WjpI>L7Fw=-IZUPrBv+?kp`iaedb_wZgRsSIQlZa12>pbQXQ zX5MnVDb5-0NIVeB5U1S?lEks^UwmZT71U((0T7P3ap{+D@^{iYFwjN>lfXl7tE$i0OPA%uAy%sZce z;g0>6BZu=U2NXUXc-;@O_)}DSbm0&cDASs#B1YxMiO7BvxH!eImNF#t;2Oc3!C@2G zx2h?_QWmB=Ks$b&CSDgQi7ec_4oNW^G13P(nM`$~$a+_Kv7>U;KDdU|WtqQoQ-Hsb zkyR7E_ptZJ!I{9cdHu@H*Gxrp%}$>^wO^)Hao!G+D1K>e8LiSCWo^X1vQDLl@-UR>F@5g2xyfrtT-7N}=;a?s`ZTxPZ~ z;0BL)ely^Q^#VS+ZMsYYLYnw$RfAsyMO3l-fEiL$u`~HJT*ttNbYS~>SFfNVbMvW* zvn!dG0B#9277Ae3p=aT};wMxCX+nB&MnC4Ek#$ieapG{x<5M9}kQ%~CiX-9A%b6d! z&fG}1R4XhFvqS+FN mA3`$VRjNvL6!d-Z3pzP1=M<<_8k(q-?rsXK<0997eAqyr zuqMhL{_8|8O^YH2Ohj>H;5BAOY$)p69xX{5E5<2SN|OIAf*^Y0s)w}&VzecR(5f>a zMOg+rn2SuVS_{^Zw;@PdoLQ$pp)7kUYf3m$%rG54Nzyhl}MVT2{}yOH|DY^T(CqaNQ`)iWz5%} zLG<~0JB0`++zaN_;X;gJ3Wq#n<*2f~Hpf5t6h(>QUhhQ=yN{911ehj3luwDa3j>|C zWOLFV5{#2y9{%Au9uq26)CCIIDIR8J1rK4am5O)dubd2^lpp1hh>oV0ZtgEa=w^J`IQh8t!aNKR7yKpu-BVA*8wVib+)5G!Kn|JZP2N(? zLIWij^<03kZk;&7*?2mxQl;9?N2_U)+((xoPu!t!`iA|$ zj-TZDg0-bS&yDMcD1(^xc_7iRkc8>qi!v{)JtC_bsDjrL?~|uXQUbUc7tq1D1lXy5 zte<>P82g@naoVOCKg0ZmH1@3xWWD+=+_Vuu-@Bsw3g%wy~*h*rR>}Y%q4vLCZ8K!m`>VS<6_sO=sXg}!(na@F!l0LyK zD&?fphTG&zWIOdACC)IcvYz8S#d|kyRd!!FS$@C20{24YI4fcT(W+wqEb==szcXA z#8D8E16S@h6&$EPoIFrpnPf8ps#S~t$OboORVgX2i|1s@#|ee*43NKv<|(z^guqH~ z#Pq99NfAB6FZqcmOMFY3ZBp?!Lhz>}Yrod2EmMm4Wy~drx}&d;LyfP;WHEGA3CkSe zaQ>c>s2mF&0-n{O)3*_^IuxyiClzC^r3s(-kFnKTQwSCT-K}sJh%f4V^LpY+>jjoG zBwVj8oHRdIOjeF*40-trB-Rc-08_tK%HBXP1GXuBs{K5|Eo72aoMF3tm&2K3y`wv# zBUB+6d)XtL9@S(sVVNAZKs!^XMaZ0qbkMJBLEXuxwoZE~6$0x%`eO>#{Mx#I$XtJt zu{oaA0D=QPC*O(mQpgN!g?eWTx5ggk6B2{xEPzO=V*`Rfs{$*bK%M3J2>(w zxy|XO0*Ok$w*T@mNlfO!6<>Id^N9VKYK(DJAXL5I&sVmeI^HF3%i(fDM@}UJCpj|u zrMP|kdWR<6a-i?`zktc!uAKkejM4u!kP%Mi`#PC_NRz$$FVTY>oHKQA3b@+$9p|c3 zm>-NPI5u+*rJUfM;q*0rF;jN3l>&M%1PO%9ss{Mllgi{wu~wYlPR%B4!McckK(-YQ zpHEy`@uNk@eSimWD#iTK6MEvki zh#o26kg5Y!j$K)B_~I`KN-79^Kco=n-Nz`7hW*#SdTWN_PX{+3#95(-N}Tm%51CW~ zIOzA{O5c0{<3>1tDOfjK{k1kmtp-H4%@W#$Og&8#xY2Y9AEvMLZft^EZ#bj{Dj}9N z*Td{=&EIY&9%|)eDU&yCik|E}vAzBUxv|9{^O?8{qo`4vvuw;0)*<)RINFtAx8z3A zvlJwbu20|x|3i6r+Og>SL!vD4S>XtPbO3O|0%VgAs_gl2Dg=S?sJ_}*}^ z8Na9izz2GY19dmTT{%tQcgRPXP;;Hc*z$cZKU5-fVFGBz})w%Nev4JDM`kij@G5>-r=Y7#EYWAp)H$Gb`E#x)a(zsQp-CaGXkB54=hx z70FZ?n9DC@t}YaBq%5O=F1blI`F5^ds}ik9SA(CH!FZ%6{u-dF-$6;I!kB}fu`NSQ zOr}_J?%VQUIs|xPI!#D(%Z%O0YUdGj6us(%d{&Hy3WAUUDC~FJ-l)qpF9>wSxM>(s zDQ_MXa10`Jk%0GQb76c8ekEtYG%w|2XuGZQ%a`P9BZO8OPp%wa*@?0D4x71q9^~TP zes7)BJ&BXItC8#DAD{c<`!5EYL2Bn4*+RM*>z#Q5eWUisVWzfM5VA~57VTPvXcsIF zqjUVj2@}Jahx-?EHuvZ|W58vA=33vXaV4m%^Mu}giDSAnTozYDER+{8 z_Q*7r1=9yTV$q0T^+)O&0JUMj60B%$U(%axq)Wl^Y`H7E90evnL>)b zd5AW_0v&or{qWG#jYPS_&PlvAep@%T9PZ8O6@{D`r(JU#v_j{Kh9pR&_s(|HoAm;P z$hHvUx z&sv`*t&Ra()vj7sn4v3VhB%v{)JDlec?kBZ6(Aff6&lspn@6nSE}nCt#-Y^ThLqya zeKh}rX$BYswD_Q59gMhEM@!Gvn;f?}Sf9g&PJ6MBsJDcd-{`W9S5)SALZ<@zSy~y} z#@9R3EG?L#R@g*Z8_(Hnze_m&&c54&fesLUAc^#M$SBNBBSD2qiIKVGk-Ejf6hh}L z%_#VMW>IjnlPpKHi#)Li$2?@=tma9m{C&Bdms7|Iqi-zB^f&ZY=h9&1F1#aT7cRf zKV_x{ww=V%>xUUXOYDN0f{`%Wqur%uW>52t6v!& z)$4tuEXVP@4_=Qt2ps04iiCugQV1{KH@Mb>RZaM_Z#j)&m{BvZng47!u&q6KIw>_F zn|=_dF5BFLDnXQSbcmohiMq)!dVES5iV!l7O6{wcFENRqoe6KdKK#3ee0Xl#b9c7L zX>t`b;rv}_q4f*hfD?0+PrTd?m5()y*WMbJdb)vt%n~vpWniwxZ*+&~4Yo_d_i`*s zlprU$Kx5R+4Fl~ffSJJXsyXYHZ|oH`8NErttWhcy_w?c8!^KGj0#?Sj+Tw0EqidB^ zFW#0j;u$+-?g-L`*NVuQmC&u{v?#-A2ioCSPcS}`fPZRzw3m5z2A0XA5x!lMO2tWg|q1 zp$0%J(7o}At3ew_wBEvL4L#wsKy<`txc1XW}$^cy~L01 zO5uW;1t+0=(r>>;3$|Vwc&WIW{;U^c{$HgFZ7gwDBcL7p)Z;>mctk}mKM4`#@b1<- zu+)TOVJ;Uj0-|y!GI!!a!-#Lq-UueqBig)u&C{uFQ;~$5>J z^l%##sieZwLQfMIKKA2P5ln?v$OtdBe4b@R(0FIlv*qDhmW%U(Y5E803nHT6@5A0e z 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%0AnD$=J@^a3(wns*=<{sF*rpI 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%0D?D0n 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 Q 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%0DVGG;F@p7mp;9E`9ALXI7!heLd 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

%@4Faz<5ZC0b0_!g5n*SL%iP5 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%0A}Fd5g$}jg|8py{#3lt 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%0A#_? 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 z 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�v_ZNhvpX{DR58)2AaeF}VC&%nrSrkd6 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�A>J} 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�!I_Akhl;+XcB=XWU| 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

UE|n} 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�id@JY&&%PO0RW0E~ZkR?bnDVeaEy-uf4)} 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%0AF=o+E8R(gE=;I{91O-Vop34rco)>tn0O0b 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

#R*h%0z_rWoolg8pv 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

(+B2s#c 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%0ANd(GF_z`31l0b^aIi~wBfld}z zXf!}_ufIAWYyedWcT@_^q!as36FzPR^4{*v_>qK`0Ab%={ZSmvaS!BAc&~K-8KMfn zXGKwMJC$7W_nicq<^7}?+>hu`+oxiHB_OsR_|WK2WS=oWLgRFnYt~>-qlZ}B>_CN} zpw6?=b5=sr^M;Qs3UV?|up}fedIk;@+qx56a06dE;*dN<%*x0CbS=D@K8cj=iUkjn zBPXIf%1916FPQ*=8UHFEx{v>mhoF^O+2L&-c7 z?mWJh2j|^%6Y@oGr`I0;Wt|7@)UBBZ(!+MA?}dNUkfi167^`WI%5_*&RaeTlnmAmA z#x?mwOE}96p|6s*=%v?k6^{>XY5lYYeqdCs7ZlU}%*tH`gF+W>(p`$>{maw4X$y>dmf!HHF+wyuu6UBTp91Bn z4Xg}^O`z!YR)0`{e$Bb6vXoj5>NJuKL+KL+d6E}>M!^HALV{JMV&8cmFM=kn|3*Z7 zy0nLgdxJ}d^9(T@1L9tNVMLrTtP3(}<24%7Qt}Ead|2sCPi~vmzs}v!tOX^!4?R}i zGO+!orE2JisXkyJ<_2P;7Z1dH0As#v$?3zNmwx+Zo9m9YTspPcxR~A}rfj?m%uT*J ziUd_-SX~Vjv>>g?)1MW=Hx@LvtBjKpXn(A}?wd4e?;Qp)D~S*bn$~S+tg5c!1=>yL zJLvH%e>syW>Gb>qm$*b>9?x$cpcSV})g3cYR+>dn0d2-8;})8DoCNO(=HP^V|i|A9Jl8y(-p(2ap(#SN-Nu&whA zOL;d9|DFL%&wW95QOZ>_-8M}rBjIs@=70XX#?xXcIFnCzQ-bx|>X8kwVc1_s>?7wD z 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%0AMa$*!`$)a9{ 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�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

F?agtLsXjYtov`1Blg`rc%WUQR(gzj`C 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Ð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

BJD8Y#0>u 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�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

{wj80oY|?~X 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

Hhc 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

pAs3AOWSVQMAwp#P!`ftPudf9 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

I%fSHItLaj%b~Ac--7v}L?rt!cUY{%CcKp3o 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≫y92?ODLk0LPFjW>&FB$E&aR4m2*mR{n$Wi zjLQd-8gZ``djzDo@kM7Djo{cR}YDtUYamA}FIK;&z49IzCBntVi!F;-c!_i>~uOO~~qUJmo#dN3a-Y&`@Lq;af5X8}( z#I`unu(|nPOWi74cGI-#Fm#VzM0mEo*i;6I9ZLpZ6SknuB}XhI0(+Y0|Ix1LUaH5*B`GU+~0MI7z^@D->#eZc8~v zkJzVNy(<8UV0rvg*)ON?=ur%N!ED(JU(0_|O5}r+8hK+$^=!j~xU7+l;pBlFnC-D9 z46@pY;rI#KvhbXTE$@o6aAY`neJ3(GAVHdhC6p%QvKH*uj}4Tpq*HyhO9EzLA=d$Q7Nb4v-Ho1qG-0A1D*&$mse>ODex5ImK;d2&3y2G@ zo4JR+opHegNHGWKFrS44ZyZ9jkkG@>`N`VZ^7uj+ht&4!-7X|QluOQ{koaKXBIRO? z0W&XoivRHj#x?uBqco=1!&~V=ba3Qr{={8d`0IXW>BNZxtY!h8hXNMvE!hRD@V7fa z@|F#n(!rOCOADSonS6C2<2Nu?MT+4o0>1qxWjV>rON#$b@`rBRbtlY=Ql1C|EON{5 zRb=+SZ!2y=3?~ZH2m#S=Ziu6&6&Qgsp7DltoaJws^*pEuDY$!GGhl%8uw(=F(Ppf# za6NRbuw0?Xz*urDPVNs(Gj# zb2}#e$~@enT;}Iuh{)P#4eyS;q@m_v@`s_E>cquDn}*4qPG-3#RC|EcxM$hU?rf|- zS+h|^QWO?LR}Y&P%$jZNbtMM^fCQ`X!K7+>auh{Y@KYiXhfqa8itTY=tBqH0xyu%U z==YO3(!DNwy8$b5Yo2W?e|)x7BcsAb;Fk&Y#Pd`P%GzgpQrC_r>Ldl+A1%E`Qt2~O zS!r|R;nyBxbDuKU40NNOGQGaw@yRkCBg{2!s}Vq@pRsF==~H`9@8`!j`gL%~hAm*{ zr^v#c`~yK=>k$HU$ru~rA_9E(=&ZjJ@^TC%SYUO(qqmX%F^Yb5`&})!$%E@hHF#py z_<4sB&RSSE9J>41!UCA>@1*uI`)yZNiqw(mZRG0eL#`fM7BZ3iQ?f-~x!U_m1~d53 zW)ea~;9e(gX(&`Rv3@95Tb09aia=lZ!-QuWNw?V&b)_pkEV*p*36Xn^uc{-9`4J1% z=dJLnLpl50pp>*Uex=|QNP9p`+W*MtaV`JeQ5AS1lb1cUl!f}T;i@zP@x(^pz){#9 z*5!r9{?R2XOBVq#Y34DLa2c0`YsiNbG2ksL5zRdHTqX-!VS)-AFw-pq;ccUMKe*kLe*AmfmLu3Ee8j{m8$3TH zt3wkL37W-n;rk4LP_8ew7nJIybJySRcDz3{^f9NJ$&V!Ww;jdPoN*%0CT>Yuzgzv= zXw>E?QpBb4`o#2{r|YM1+JVqD1mXBe%Yp;r`LYCPg0tWw4A*xYt+jAXtK8kH7AS3o zCWxuh<$_pKI?_}&;~1y*0>o{V-HWkYl@?x_0XNeKhpvxWF71(iVrBC}$gFbpgnUdj z@7;h!X(}*AxP5IjL^A`XiDB6N$YcB``%ftwk!hn>hq+$$Fyz6-6OCI)5lO?l4LMQ&zjcok3xrEclC^eB7t)@R5>K6(##G0bf6Oz1XvKtHr zXp0fpK%OrAofoTEVrS{F@giJ{PU0 z`F=R95)@m!|NDXXBG{bdK%#HwghDb5#ttz~So1=>z2#*%Z4V5676w$m3^qPo=pi_1 z^L2g3pyT}p0;HZY$s_B2TC1!~M~2YERc)Ea=rx&$xx!rria^;e9xOJIOx}8~6v)`n)6-#hom#vj zXFKScbWb@(s{Lhrub8H*l+3OpZ?;V%140l|Inr3+_Nx;08_pMh+d)A#P}B|c4B?85 zZr+XG$q(%4KEoxcNK=TLBX~3V^$|A&G%eaK3jQOE!hdVA4aOGK0(3%_$0oXymgy{o z=%Z(O_+>JGA*=qikZwxM8I>jn#p{sryUVbeBW zptUE5tx%P;BVa9n=gBMFIPMsUbYN_wZFX^aHHZF!(GH*&XKri)5=NVL3PLnjGS9$M zc2#N%v8fIb(oIxrJ2U}})yABD8H3xXVXKsP-_Gi)Rk-0BPOYSEb9DyXC{0=Gf!$n2;e`h%RxyvHmR@XY-2<$40-Zm zqsE-t6d7R|4Ri~La-e2ZOTu2Ig6}skiu#!xSvkcm?1;%e1wp`Kj>d@0!3I*NDNYyw zXt@@d9EToI(6;c#jm3YQyzWmTk0dbzLUX8;DSM;kdF0y51NB$6OOXqIiN(&=T0vCU5|(WDr+(CIo3E$8t-R&D~$ z!YZSH0c}UThq)&aGZN4-ou0nb*2Mtj+TKW@xII_`WJK#I?W8Q#)6yyeuXGLJG37`M zgIbtUI?+(CD`PX5Drl@L@_xD`G=!z>yGja|X)Pd#$Y?+XggbR_wJT$2LVqdzcq&y@ zW1Q1(mqOm3Is3~$2^>r=XD}(y(3a$FxI?*C%`p0ts@m3z*cw}T{wo^1BHXatE!0Ul z$QcA9xI@0p}5l8?9{ zeebU_e&Yrcm_J%;x-T{F*WYtas>c2;BSZP|H|M#NbSUyKudQI48B5!4|L3rNiAMMB z?U4>^xkjZQgo#L6*!0u-`FqdiMB(bb&Z&pJTl6J{4)L95z)oFNxj6WS9MQnDFa)}) zT^{#B2~O^>DI@%IqwQU^F@5~T8{Ke#t-fBq4nwhrdiqZ0^4R~@sZPwhoR>ZV%(VQj z+J1&PjxJIhlv1xq=V)Z0!MIK9sLSetTCVrQnOD`N6c1AGA~<*tp?oMKte6o(<6|30 z_0?i)(zi1XS)s}z=X1j35SQ;xLk;t!`8rxTEzMMufB~w&s%IUZwO-`E$qSfumA?n4 zegggT2-BeD(Kmgq%Z1lXbxb%ChKO6L*oq_V?miOt{D=eHfousx_2fn_y^6i=wv-p# zu2gv|+s+)jM0Y9Obife;I+&I{VA=3RbBCoM_xj_`NF;Dj#(YGJeguA{AXYqMO@iOk zErmha9w6eYjVJ|ycOWJ#!1A;<1=+TMfznbCOP#K8B7&||%D`D15@Yq+1cDx#j>b8B6JrO__mMS`0*nO)dFD!vga7K)c^>I@MNUgfH|J;8hAHvH zU&z=b(sV~0UZ$%xi{}~0lM|#zpURSMn#2fq&RaBXYfh@$YsqC4jksKT53M&UCX<_w zqldoQQu?nCO{aWZ$cB@hvp$rQh@fGg4_cccs`#Pk_o9-Ni`!|WkxjfDK~h#rrC>V( ze?q0z8Q#@hi&=E{bDYcpJQO8XuFh^#BcQ4nc{3Rji@F?}Zn9ujptumUVV4{DKiHc0j5prnvD#0=ck z`r;%PXHWkmvx-1rfXoUsFXubiRm2M?eQzsey!ns7`VhTjFeoh?xxN#SFl3H2(GQ+@ zFWx)%G3rXdV1M_%ucSgf@#z=MWhWR804d5Kt2r=WIqb+anlQv&B)``1stAn^-F^a@ z-z0*cv`9*g;F$3rT_x*d{xDj8yVK}Jr9zK-K==hR`UJGJRekkEH30M{!0y$(xs>P) z%k0yY;b|uxFmW^gy?^*ZF^((I0LHnW^zRv4BU;i(N1IPW_Pss~c3lc3&eF9}KaT(M zfVB3K_ntZaY$@8uRU_RSaCO{u7P~AM9DugOm<9jo)Kw12>L|W>J-yRX(uB;(S0hJj ztvPf3rd_|`Vq#pH5HVhnS4$%3%bO*rIs=mf*6osQk6! zd-n`u>~AWRj%`QcL52;jySP#J^lXL@#pP*WBfh>c64s5AD%af#2 z@N2GS8aAPFo2Mix4SPGEFeM6GkiMB3-*i8OIk*$_vwWmm7j3igPs>tu;{hBB0MN*Z z;lUN3bdQfb(it7Gn_ky`N8VY4G`1lf;@J-h3S6hpK^}LN=4kn(<}ZIz&i(sjPz`r%ezYFI?9yhl>sk8lfpRss0!4G{Il&BCU8tMBCznIM zD-*4EE1ii!q^%qZ_#M{3S#`Tv0_IVAIO=yie9*~@8{_EL%c|L{r;DfbA zNS^v_6%jWpzA`1C_6KtiA%eisib7SMsfK^Vmkh6k{pB$;pHb0Kw!iO@JJb{d!rpv7 zJmtg_EXT5##f6zgMV`uG1lgp-jaI4Yxny~3Y8yImX`uDED6davGB14{#?e06G8&gC z>^>dO^7|ZAX^^xbjpR9!r;J;xSBVr;8XiGSMy(90vdQx|h=J(+p6tP%3)jE`vQE}B z_3%psYHZdjX6V{x;_}rM#uoq5t7x=9TcoSin2ww1t-t{vz7TKhAOS&|&xDBs77siB zU7}rmr#YWL5>FId4W*?BOdj4bo`Ld1{P`%Tj_kd%0`L0jGnvmKBQRvMLg41YBIKx= zUfcK3ZgYI`N7Zo8G9iAP<(QK}>@U=VhQ8e)H6>Z4DAWiSbHx_FEn@Bsg2gVcI*0{_ zhJi7~kRgg}qs!5_CVX=z5znZOgO&hrt=9>&by>7~ zh!D5$RVter;Fx17S#=Ou?EOw{iWy&EoKxNM4PHG%;3;1xl)4&v!er=b6`YrTde1!8 zMuO#risaM?u@x7S-&~epdTUDfwtEGq0uKjuCX#&=iTcB|=`#Z08$rqOF&fwRais{V zzR}NZq?4vh^bpHGc+{m3?HCOiEDEmS$U#p{>l1$^K%a{v(+ zhTM}AoV4nzUfgdY)5^<bJinM=ZTT>2=rsrS*;{cQx&(MX)5!O-` zdk(OogT2ayokVmZ=Rp1226mqiQtG~toRiSg^B)8!J19S1 za+=rWtX$+q3d>MFEq`R5N!gtNQh?+>Sd{%ZbpQc$++^JhTgvrPF7TEtA+aMvk>=^O zstn?SZesV_>|CcCF{iqYBR&I74gWieENU`O**t#ke=Hw#NQ@i%p=G_&`uS;5__bap za?k+a==~VX(=U5lV&YNbY81AMEd5ET6jpzh5o~}4L~svtN4eB^8L0E8aBdv&VyPy; zq;FR3SFlA91?%miNXZKykGNLSG06nK0k9LeLX+l@KVH0Qf3Rg~gpZGJjtjdD?yJb}oFatk7s6(uws^1Ly-bQVojT zMcq^*V&%nw?kxA~$4c3EBC6R=suGDwu9YTAoQuXOBNicwpYa6M%Io(PWbyoQ8gHEE zj!YR>dK55k;zQxLLvD^R;;gYyI>CAQhtYw8@W>OCpD^4!v^3F?u-&BH3HLpSwv4t# zZ|UYkfs;kaAsMALEn%3v9K&8zy2fYmL*FIxL?itGSy7p39$J?)o zg?QMl62X+QxoT#ihivVdSF-g~u9fxXgOG3K0r6nX%>9@)q}9|6CTSnRuIYSGxyA1HP7i@cplkVE=oi1#U4bSSC*y# zy9Me4+IiJBekt(==_J_rQv0(ep71w|a9T_?%AEeP1bCsO%U+`Xt`_=g~BLmng&(SaeU9%bNPH zAcj}z zAm87Nd!OnNACG)X+%HOcMFpf!94nkE%d`w6wLcMpL3rw5c#WC@N($jo6DuE(>H_Oh zx(&Dw-wN*aR0zzXgW&W(5!vZK?<0Ip)oO5J#79zNN`~z4j51>4gv*t?-&X{?{?gpn zhG!0X%K34~1l(eiH~zO4if$`hV9d)m1O?iXSH)F^wLE?k`Gb0&8dNgVBh9?eF)Y&8 zjQs!F#meGA1m$JaQZpa-;IkpOTSqp0WLaZ0_v2Qa)=9~!_mD>dm`%V$J_GM9Yg)rb zte^5bQUGLA$~{%YGSmvDeKa%FqH)m`A@e}VAw;zaCsELHb6#krnvyxm?7DQb?j zLNg-k88?P?La~$5>rQEs0p*swqvt?RFCe1jcCH6QVHElJiI2_^!?JcsDh-7& zwx^l3a-zrgd99OJsw$carNMR7$==`oauPM2yUCP$`+DypBE2L7V}pmDd$ zjYH3c4zDf+^26A%mgK&62pE-1&?3`q6U2_83&@QS$RF{S670?_TTp>bc1LQVjj4nO z{3J8!J@S3*aYU^ShE2Sy=!3t0HPKk0On6pk(*WWwF*2NC?b5wUh$!`i*i)8Y)^&E{`iH1T0b#r?{1va@62Kgq&p zU?&bhzhO&cf}33Fa3UWaFeJ09WT|2Py9)=80_GJw$IFUIhCyFYGwX-#KvAOV50|*HVHJl@Z>55+dIj2Hn=MO*JZD zZLhM&U%)sRXFa8RkgjT6&nA|7`tZ4S=ee`ogYg4O#_!cC9sxf*1o9}wC3fLPse>W5 z%o;2hJuPtjZV zGs9a_z8e8bbeJwm{*c5Bt5JmYv|UM23kUKY80IPVKGTYgv8o94W3>$*&IL>=ubR~I zBwgZzY-lSZq71^+lt$hmM^>&*uCw?A8XQo>7X_Loa(;|Aag3Kpz&>EBuwzh)apL%OY4gu}U5Eaw#73Du9i>YI-JI7chi{Y`Y}nfl ze3m`!AElVmgr?}4MDfR^F?8C);<6~;MPIC2OYg(gEk?_V1s|5o$e6@2EA0~-twa%_ zQWP~lY`ku5)v@$Y@Nzwnsk09gj>yE-wZk!kqC?D{0k~w8MbNUjGa)0u%Oc$q9dVw- z5sWt!AUp(m+!X9e@ONLy1i^ClH?77qMt=EkD___K8~TFW2KruGm`k#zmZT{MAz5@m zCeVm1m0;zPf+Q}#5I%f*Ep!uRna_23qhqwh0XqpP?g9u~H7TmRjWB*5KydnSodiRL z8annX+hy@Pa9&c5wc5z;`$+;!aBG5TASWBK(*8gEe(rh1S^=2;Lm#VoOZ_4u*%$MZ z>!K012HELP)6%!~Hlb;G+HV5PH>y$@o==Fc^K<9irJSeE;7>!I%sFc3=pN_Ws9NU$ ztJ~5?-^R1i%rxG_~w%mL1D zlZJoH)#ypJ(P&U0@HKrI%xeOR?n|nim{%uX3)>E7@))IJNcbNQexRebVp5%O;H(bu zi7^$szYDGm>tA}EJ6P*g=#??e`NsgA<_t4iI3lFnd8_xw)0%tcEc6G^IEr2X!YN6F zODNnN0RG|_x?8D{veML0tOEo5SM#L2*s`VN4ca|szb@9V) zvP#$a+IKwcGUHkSf@fUaTr<+Byn?@C*S{kU)>5#r&(ZdB&8!^CW*U^GR67Lx>n@#X9#JSiOTE7bSKCAD z(R@o}-2p7Tn;hnsK`xJg~bXo5Gf~29y^yxngjPY$8i-{$sDVThY zk1j@S-&GsD8=UWW502wiKn$H#fiGRT#m0B*hb^xHj{~`%b0w=T}2^0aWHW4im zPX__#zavs^agA~7TFNmnsElsJqi882k6-+KDjw>dPwC`#h_T0m(o|r(_%g^EMq^!r zeP(4H{f7&Z_G6DGYwn`TwS}twQ#sy z{=3y3x^+a0EBB@y=CY(6&)oYW)YxAfZX{*rsFbO;~My!yq!K&mc zEoF&Hj(%p_l%GNJ^&<8U`YH~%Q9$&`n!VilT%ZdZ<4sge-wT!>SW1rfq-(|1oJPLX zy*Y{U+8FAUQ%r>tYY3syP{;prT z=;WUGgP<_lx=}lQ(v$`9w&X27gxpp)v-wOsQgv-x#8K<3v z0+|L@x=*3IdhN!HB`GMyNmP*~MOV-l*g^4pJO$80U+Qeg6Hh~qr}41@8_$a08VdFb ztI7g&W^|?G>Z{TWY?=hui&cCs(N@g#oO7`JwAv1MkUym7Ojz-HkJRl1!~&ECSNAKo zi=bqlQzy49z2v~$M#Sv`9tZv*`f_fl#MkHhAanH(GpG(iHwUFd7{sCL59>&bm^ENW zchJ<5f4BF8z+sC&0ca1`JM4xP2Jwt*T)qYs3E5aw;jA$48Z=?VruWZajW&5MIv8|R zxpj`GA(T}w353tf5R$Ylu2i+CJ41~ybI0Zv0Wn7|W7bM=^?wKO^Hxi$6J5(t*@*eC z1Fe$P_X?7|xe`=j3`?Lj%rl!!qC!(Ej%ZUrp_Gx3RNHC*43au#2nv#a_0ca=muXc? z$Ut16#0e)&x}~;&Qk_wI)6+_h$C+tJ>MAI5(vJviSuiL?XFWFwmAHf%u`3Um<%~q8 zpF!HR;r!kBYi+>#$*PubF#F)D_IyBErQSo%#P@aQ3z9(*C`6y27iDw3n0@G~NGDlb z#Th|7df#Q{0m|xQ>2Mx{tPYsvtTK!v$|JQQ zN!V6s7-~jHf@pZ)V%J2O07X@?hZHEEcDov@uUj98J2H?iTo8H}qtcXoYm`xVu(csU z#wp5Hg*G>_)kn-Y@spa%xqN7OdYNv-^Y$@ttSzJbyS4?JTKFw9vQ`W|3X7=S#T@`* zXSV3)Q})l4vkrkN44I^vO)+5_{gZYvw1YXLg?g&kUd0+HvKjpNICyF4uwomxmF9n#%&&bLwpKGX6A>EDnBHW z?lknnMkf7BT$}3u2MV!hcnqK*@k<8o;?iH}*N|f(9*a^S)md(A!z{MTZz&@)f^E6i zu=(Qc`%bhM*@6iV#7w7AjgEN24+wO@b2ErAz(>xN)4&U^;n&7?$Q&?50Zod4 zWqeDFG6=>W?!W}T#BO{q25)1a0kwjbB|cg0)Ms{&;Rw05Y#+;nDo+Y>Rou45rUpmP zo%`K(p$YLVa8Fn!uN5*(M1)f8y5ik_)}faJsfg+QP6zJ<<(S%hLySHp(8G}! zkPT{F!)@Ez^#uk?m%9>NoIc0HH8c!kBotk40VJt9uE9 z+KmxaH{2b(I4}^}mF&hNYQb!)Ek$OSetCUi@Mcc)%AJ>^dfNzcW8s=SV&o1C+u0@c zcrJKGw_;c)U4U5|SK_uC4C2vtoxb!c2;rIFgD4nfY0@BylzIKBV*r~a$aXcw%+Q5e zfRFdN7i?8t!rxdA`OW@7T#s%--Dda&J9^!A-7)=aBwJIeAil2$?- zHyCtf+Y|8NUqk!jxwbuI=^2HaJ^3^7f4QeXX2gRTQF${MU+1|2r+SR;Gc&s;i9 zlnhlfPhh z1H;_eLr#efJ5i-csSx)+npXE?Q#8j1*rG&aa;D{^PxA4Na8!l~Y_AxEXNCvDq?*PX z#A19)de0(35rm>%X&QV%YDq=^pqeVqVV}F67f*dZi;K#wT7Gp}#Vp=?1Wtj&|JEh~ zUg{FU2-N)8QQ=YlCmNNljjIU_3St!g5o}lnzKP=LHev}g&F^BaaYtr6aLWo;UeAO3 zRO}{DFT{7`ua6}V_{>RxF8;FC^Rx7X3B?PZG8!l33Q&@mg2;Wb8*+Qv!&TzB7NNP1 zp?Mw2R50AWl3e6^ARt$hu7>ltAlg0S^V2+u%n$ouQI_NgbMT7${2p zvz3grosC!^83}cXRF6$ zJR0bz;Og69fw%UGY&#-1gOGQ$HEJAAw22}}+pz`+$UqMv2AnEk#i2sGWBYZp}L@o#+*A3++q zxIv_AtBWC~AhK{Id;}-WQ@3I7`wCy70F93TE;6k*JVOj2gv{NCP1o|6bzP@T%V;Lt zdIk}szBIdB|H$4dLto^krb;XnnXP4`x91*DfF`+55^08&nH33-`eH9l zSKyEO3+<#ka>Ik=4+P$x z67kI#GIU<~Psw{VlEyux^Zs;`8V<8GVUoQ88BS1U-u=EK;n1_PcRI_j`^Eu*P{GtGk$h~Ae)2Si0Off! zXXcztkVIo&ap&mI1FZUrY!;|u!&G$Uu(DBex~sVaDmJ}9tp|4#a57Jjp$^ z0(?>PSx|1SVil|7c^w+bZ^Z2FiZpnjBL*k`yo{MYd8Ot!Biu1jFYYv4tc-3C^G#o( zd#Dn%UvbkoJGfAh&lH4L%(heZ+jcL(*`T%%)a`yLeM5Iwef|wy!^y+|be&XB302Zu zlPW!%JMy-k5>c8_mo1?S?JJO4Zn+=!E5yZ}fx#8ADbwrO@FY~a`6bc@=#Z2dXci`s zkV~dAZq;;%1mC;F_Zd5iy1%y2q%%ruRxgu@`p+&69bV}w8>cWOTm&HU!!Wu#p+rEY zDHUX3O*EoR9+DASLP8gOyxhv2mGEhc)-DGVlD;~ooCP231RfDr&F zFfNz|SCJGuBca**^7k>@SDahpW#hJlxzhVkg;@=3-nWD^D+cs+j(0aB65rU)hoQc9 zP}AwB8T*UM7gJ)vL4S$Q4En#8@S@^o0*PUg9%Of8UOP{ri?c({!vLDKc6MT8ZD(5a zw8vQy|pS{lV$Ha7qv0K(InmU;_Y@=makbLs*L(GP!=Pm$?@IUYJ=i|XraPYzFk*> zYv|bp*Y>-y3r~PT#Y=k;32t$>6A1-s7Sv-Xg8?5B#eE&`I-L0g@ykFJ6}HtGhc@3E zSZ}!et)?V4!o%+3-W-!^O++lF6{|sfStBR2cHB!4f49&o=T1Nw8xM!QbT1;Fa*W+C zr`>%*iC~!twNgn0az0F#46FFgE{{;34lUL&T-Et^6a#@?Esy2 zVl?yF&PYm-#h*RZbUc?@V#*h_GS_cpHak-?4~9cf25e^(lA4Uk!Qd!PN&9h~)uw44 zwDheQVj;T6;0g3_L<;>K^SzY0`2yHnY0lowTT?oVKuZhf;UgCla?ltiqtj0aJ;;RL zhHPr0hpZKvK?{dVtv=T!vtPTlL!_cAj6I1;KOwz5N7mTb%_n`R>OqWZfh~dui|+na z`J}wfx z$ezEC<1@H9EdpmZ7wlH!y@*%L0Pb+$Fu%hz#aiCKEaIbrwQ=~TP*$0f@rw9hPI)}Q zg44;=sq_nKC(c5vNciK>?)X(kmVX=hH$_$xq3Hp)2RXQ|1K{Vvif`59Qfh$V9zdj! zUst{)JB==Icf%8hnjw?84Ial2py$2qV>>9QGH@7beefin(m-_rB5|=PA!L7~AMa<@ zpCA*_5=!@$pVPYW8 z{~w@5$Q7f2{Ym85uILN+YqftzYNRFSw_}*oQuWA}GQO)`M^#*zfG((icpDv;{>*8U zhfdHXqCfU1uTTS$T4SbxZ*!_*>^9v z`AXmeZA2j#-Twn@HO+=*CT?@rhaur9|5cDfYVR(|x$WnuCxtHxd{9d$V<{R2$5F%a z5>>rj+7PQK_{EFd_l|eAHrdpURLCI}#W0B}7XVpP_kiv%#cQmF^qxtLvJ7Q1YtizV z8&j$WSLJfbt|RmkHAtJoEJ9vdXt6PM#8Fv~g3Zkf{0rGWTXy#Srk9Ai{Qii5Vtv9X zE0~scdVOyE1Po>dRu8-guQY@AJtaGE^+*FHBu9~hwHH{mqo1HY_0J$j9-l&@b3WN> zSHOw2_x^IE&&MTd9yU(T!JmNU^^(B7TFJE(gjv~F4pVGR8W($d^D0Z*D}yHoX0_2Z z)88N44_0961#G!Ncv$>dEb{YFqF5PHxG0~{{6B$(>aPi)zW~cH3sX>l44Ai*u>K?< z>l~}oI_gkK5ujRQC9Uu!IeMkv&dpIbk0W+K-vc??`9QW;UB`3$EgHJ&*p|;_rD@lQ z5s(&>@vB_HS&%jf2NS4*E)_Fcj*1-or6K6TS^D{{7dIn*d=rNz=9JkT7&HD2%HrGM zXC+p$odT1F4ub0Vp^l=dbPv*0iDGbtENFumJIVF}q0m;f!c1IDEnV<3PKI!| zGjV%-Q1QS95p7+1-@2NoVVy!`fj7dfTh!Gn<2+hgnd=k|96d_% z3C5w*yKLXICX%{1zwAMFs~iAn^w{i%HOdicZkK#QWHgyLEB>4;Q@&|9b|l43^g=9< z&y>cu4DA8I%x?>cvd&<|u_o$I8~JZMLNWc`)xBZe0*m-mgBr-vEh@{M`}N(`*0?}E z-8neO|erbZKGbu#pNAkGZU7_}&)bX~YK+zls`i*({#lr<$wJdm*^_*k)bCBN`(_82X))V*O61XH=2S=SBU?4oQ!y>L=B$Iieycd z!j9(AA#`EM--qv3@D<3WmKhn4gT__kLCG{hj;~2ncp?nkBtAPq>$4b>ZQ}&NZ8}+~ z>m@|plPH;NECuch@lGL!SJ9nlw%sf;3p2)=*Hg=5i(Y6gSXsX(iXW}LV11x?b;M^M zVNN!>D0Z~8cZiV5kj+VlIp7{Jrnf#O`^sUO+s`YSg;xA-6_XSUvAo@?LuYla<`wiD15yP0m!A?38Z>wU zS>K{f{C-v09-|;fgNu@q1LRvLQM`rfu@(RW1)^4a4K;~hoWT^G_NO!zv{#o6BjI!5 z`&9Oi74*@6#*wk}8Vu9O_(aSwX*bw5k}$;8Keg6y9FV8*d?KTR4P4yMJ?h2n2*G!b?;5MiJ7Gh+YijJ(^1Cb*DxUAz$|HSrh{l z(x(SKy~6VfYwPUQy37tIT; zpw*8f;@g1SHeakk0c3poWI zi3V8zaxzko!jMNOV|*LWO4&WrwiYyI?-O`>xrnj~ZnZ>%U%~^}0qz#S;!Hm;&plyr z=x(BbI9#tbwq7zDf28_vw>1^jhMu=glZ?Udf13|k3_dC^gRMvF4bVYX4@&PV$e=(x zLkta>6w(aBQ`|79T!8OdS5?TJH=I}5xXmDkJbh?Qbl^+zBt-pys%yG6YI0tv2vro{ zQrp2OOh8iJ%KAAFKGlp#F>84ssI~-hmp7ub`LxU7r|6z{M&JgxwZ{)IQ(0kgw{w?# z2MfDhcu1FfIDD^yxbu19-jF4aLrXYY?3$!AQ$`-pzvvCWS)#ORG4190Kv$$r{B`4h zeZ`wB<93+L66RXlXV;?(!0l-0f^r?#TY)eLk^+H?vor;6eXM_sKtLm_&fYURoCw2< zB+l_XjaQ=!K*(mFT8DkI_|16TWQI8F7nFZq8Z z!^pC{`FyUC(+Hyo0GgLyZ)H#djA)Ys>iQVqqRls|!{%-zpubY&DnuiaO6B3w>G1_y z983NlE$2#dt9==foX$RfsIf@P;LWaCMBV>Glc1d(6lr*${Mr>Bu7Bl;`u#CyEQuMO za%1VK0=F5vC{qyhEj;Ixo+ZLH#`y2Mgb9BHKpfM-+E_$j?oJUD>jT3xTQAppznbbf^y8@Cc9eeDw!br26v`G z5ueY~b%qH7O3?&3Tg49cSk~_yWSyg0L|Qj2TS*P0N1>Yu!Henw!6Z|&^86yhpwJy7 zh`L^q)r0($R_6X>CJbq1jy4MM4Y_VzUOUfC{uhMhk*RiVpCE3YJV7E>v$4cSy_;6T z=4x|y@h8xy$pe#mx2L77VtxiEY1j~mc65Beo&7n1bHr0Bg zaVBBI(j|x%hWJ%Ai%d35^3f1aFxv*}ZdF)$U!%g+dT!ff(t#{vj4|mH^aWudK-{#M z4d-g5s|DxXQ4^Y)3=%yJPhjBXEHhx$eEKu+lJyY>&7JHy>i9> zRITMOM36DhVt98e&#GB0Z&%6-cb2B!bn2^W{bow7$4L{oUCBdMTN3!Rd9mdAlG?k zHM{2rkoI*yrXae3dhD8^#1`(4_gR4w|Fr{LZRQnVN^bYZGa?Z`7h?)oo8eiNk!`$P zcK=yF(@#T_rZr^LDf)xi0)2b*z++?7J17OI5!rBUuZR1h>Tj!&q~$|29kyL>P%hGh zht3;1Y*CuZ1@*y~Ru6#IYI9R*Ky?wrI=xb6_#<_dja!0!STj~V4R}^E8iS_kMSv** zXPhk}UN?3irE-Oe8M}tOExoekO>-p3-YLZVB8N^~uB^qFfV2ddo;Ot8hDt1*+GP?6 zU>nl@Ue2iBf4Uu_fzaV=7uinb`A@{kI#^~78ft{S3v(-8#=s>x9oZgZ=mO5vG9Re6 z3a_uc66lMnZ#}9Jy%0%#{8!&a8bQPO(45=?Hvt0OSnj&A8pSb?T;@L3Z_|Ug4t69q ztY`dv$IsF$LA~N|>fwTX2-s3%Gh=s*;TI@*!^YF5C16$?ZCWrvb>+u zB6e(F2As%$@)3d`CmH-5=`)$6diyv>5BeL3pgKvpEh4p425aDQFO=bPW~8>NE5ksf zUSQ?`pI|0<`>W#C{QhQf5U3to{&|}A+%%{=FApUADdca^`pg4;l$ACnJL8fv?)dXK^~7iG=UVjD$;_loUWXgj<(MeJyCeY4 z;{LbPi|&b?7x1pj?%(q~?zr6GqYM3!;5akdSjXN_P8RiS`lZ;L;*7AF&9P;r2IyW5 zsc_LQf=E-Q$=HhB5Pg+(`{}DHD(z$iRH`tH2E?z8cBua=08I^X2!L_}$T1ISP3t=u zAKsYT7!OFvPBaB4az>b)ID!I!jO*7&wzlM`rN+{vc9776Ox{Z(ePb_B24e^>J{>g* z(=Z>(7Zpme~ku(>WXkJkuJMhm;^^sO+q(-)M7cj4g*+63+ z_VnGZ&lcla5Anz)+ZSgVp*)T79cvpn`0SepzMw*yi!_Grq@>)piArrid3NZ;#6jnn zY0;GHa~8q%>;0ku{soO1il&0u;{YKXg3HJO#Wxio%}Tn1NFnjJS+y&|eVI8e5uq=E zqb?MeRm>ziw!X=u_(H?J^MWF~5|;|HlR{fz8>dEH~9(?-eqmj!W%O^ zj4jRJ=Q#+hD!%X1{GiOUUp60URgHJ(Al^z?yK373PyTObbf}g7yzV!&0DGd0lpID( z{$o0;U(~uyH*NPv`*i5ndT4DxxhjF=;bJ{x+&K2(l^Ad={&1>bntQyI8^el+3Ogc8 zz`AUO73)SrvhdBeTLV^RKtMf~B&dgHKj`L-H67CNBW|m7hEl&z{}gzLWMXiMEY>qt zJiCIv|8K-I_V%L3uNCqi%w6pY+yXf$iL>2n>Fq1lvd2BRPQmF<-n)njF4chVP!<(a zAR#hAn*|lA%cUTa8YEPB@3x!ltpqp)F~g36nU8G{OCrw|4p}TJAA~0i_YQx-hpjs5 z2$3;!s{40{V~GXA&}RI0;Zm3BkQNAAit0+`lM<<&`AtC zh_kLym;jN~I&Eb}FipAogCvT0AqXT&ganK%kJ7E{la%twT=*BVe1O8l5MdsHjTV@X zp1Ie7;<{0*uU>XqAvns)4ekr_AsG3K`cIF_N{7gUvi+;A zG&T&p+2So7i>}gY71cSOp0OyKtVJ~mX|aE=O%ywu##FhM#0Mz=dl}^G$4g<_3aJ<} z^(3!KioO=**=6@Yb)l|MtbSd5jW|n9VgO~xAhGCLecsN%v>EankCJ8K@--#DBrk(- z3WLRi^qSc3Vqzw2mcs?!5zIVjmiQfB> zsCGm*aI#(Krosa6wy1*F4orc?%Ljqs;6Vk*X4XJ}YM_S279@&F(E&eD}(E!fZ3?+>m2-V6Iui ztjIl~MmyfYEP0T8>NSq3VC(Tg0AR4IyIq+pq#%=XF{9tEd1LKmMUyUTx;* zh+N3fNnF%mpC-2-GhOiDR1YQR{0$Whe@n9?;vm9J02k0;MJ{NQM9J)MXJ1AU8aq$< zNV|7M^M@f~SB=)oh>^_@vj)M%6XVt(P(v$Gd6nAyc20cyWS7@U;t0@9nhDu#vY%<# zW#TcUquDZSCRkad#YOIN|vh&z|gK#w37_AZD!ylS}NFFCWng3Vo#T6yf+`j zxc^8!#4$_@YcS<;EG!lT*=gkwc2>3T*)d>`n#yCQ_VR9sbdp{rW*bA%WJ0%C1^!o; zY(2O=wUsMN@TxZ6rh@MZXShV+#C7L1=Z}8CY{_tMM;{?Ft+ZvSaE_@_;K{rFpax|A zK3B@2$MmKI4``m|gVw}4n<{a#O6kO>32=RNW#e=vmS5BVn4nmrMjQ0XI%YrSjJicU z96nkf-K?{DRA=vbdr^S$1KlS3j1&W}<6nbsd7~7)DRENMZh2wA3wEN|oSWBZ;O!|+ z^JC2)>+nNmZ$`}jo~tvtxUq5g{&&JSY=G`}AK+ATsD(5|aiAJ`C;MZAg_(Dit#%kV zYDGFNO&Yir2f}Ty!tA?wTsQ(+pxR!pNqt(4_(z-;IrGG0R(AV1SSfG32&*a#?h_j8 z7CNuySqA}^xCK@xUJI3Q+e%1SI2}N>m64(3?*&q=87^-h>E3LisuW_=AeJt~gICzV z>a4g;!fa_BTXogQayI)pZ&tyC_h?|$#jGx`+7$tB$%2aikOH5u4T+jX_LU-cN4Vs| ze)33HH0}2%?af44aaAei7>rHLURruW5l&JCqL|yn$IJ{oE&beWGh`P5(`>t$V+%E+?LDuL16Mw!8=3eih9%*KlFQkz(Vn_75%;w0(9nsOjO7zN4H>2f%)%Up5 ztRA4yZCk$_RrklPNe3&b*G5|DZUGI(a@>KJO(!vJ47s<}r@pd+lBl`L1|4U5zv6wW z-o+;8$bRqoLt-H@KFO^ssMJDDidm}2jP4Wwv`C#%8Y_lqvILX_!gt6)cplQsTg&gP zTMYk{{%vSM$w{7}`a&-=#q5)koeHy|XK@M?kL6g48%}dgQ1-@uZo@h2)Nj_g?)}s| zLu|bjEgByKrk#h@hnZr8)HC2$CXPIq+D$H-#^;Dp&7w5{{_hZr855GSxB@nCFHijH zg7mbkS)r2C8?&WnLb2WdYiN_r+OQiVSJ&D6U~l~ih)ePS9v^RA56l)i|Gdtl%goG` z&ef1mN!AS6pEj;Xg)i!r44v2Xxx5w79XrSR%ZFVoN*aLxJ=SW7%Z`l96Dn$s-SfnT z5&-yBaVEGhnD@Y(id~ZwexNv(3r;VnXNvW}wqoIoi_&eG-$zfb4q#Rx zSgb%=Btzym*BTIoT$afuM)hM{I&o(Ku9}wVEn&1-2(B3tP71PsGWNy}lYlF7WToZW zjX%Q{62Ps;Fp$6TJn~~ltj4J#praj**4!D|_uz-Tssf{>L?tj_p4;U_MTWm+-tdG= z9j5Lxzrt$dBf+*#+xrP2@x~AZ^VbI%A7wlw)PD z!OSJhSF`^dVbbZ#@BtKPkmF+y;%p#q!w8w(PiPN|xn;L63M|V9!nmQu^~3UO0TQf{-XCfO3#+)VY3eH| zs6L-a4TP&xtK9wkLj_E!1oE$iB-%==SeL!X)OWI}$R!?06ydyC=1~RL^^bao??&91 z1;NSeOeqM@3&Js(kb+%Cz6@^;F?=EK_5J`VYPW_DS8x1rK!|(7R%RfT8kxie@AWC| zEgS_*X9t4I6_(=)ORQe6x?;hMxF6L&=U;SmokF}GRq9|z@0=VS67jq7Wva)sW?w)d zyI&>Si7lP#325;&na~oAs2fm`YB}icHg`8!00w8IF!#h8&lDMx3Q)`Af_4I}7(4SM zEoWl!7*Ep>-an)CB`DmE5-y3*wy%YNSa&iJ5S>*~EEvZh459b)GaFeXIU6+%G$H`i zC0L<+xma!N8$UuI-_sXS!D(&`2)|O|gb(xBWluAPJnYSE3O_m8jaVQ--z?|(ATsXs zU6++M-R}F!gpV9HG48b%mwFvW<@5z4Yqf0O>3Yg?w$<%d&mY6)gQ|WHabrdX(xazv z%XU%1w3}AfbpQzK^P_jm=^<1$k&55WH@(mW1U=O-xV=f5sB~ z`Z-;ee9%z1<1Q$0@_aoAbLF+U_3=8@=f*K3Zu~g0*#d_sP#I!PqQ&Dk1Ij9PzYFFK zY{M5amf{gMmX}9f-o{7&9#++SQx0LU18ljr%`(ucqNX@v(%3`P<|RgyjiUt=faEP` zRrE6AvEqgj6A^rGIpp!#r;SeCB#lqYhuq@4z_h*Ky&)#=K$Sg#_G5}YgJ85Jf{r%H zVl6T^^ilZ`1{L9axjkv)L2d?508uv3k1&OQUN;7D-P_o>s|D3QK7m&Ik}~AX;^Urt z11b&V7DjH##~_>n^A1WBu+*clK9ieJ4FejR^7(8u{*a%o=+0S;nxu5q68JS(c0GN^u|{4;dV zADS;*EL!DHbZykv!AFUEyV~yx|JP$!>MaT9%Dw)uvoT-av_%~dZ@MI+nfPNjOgxnX zZVHkohI#&q+Aw7Puhr;WCby7Vv31CIiws+f$n+0iVxYfctP~vMe5wub{i@3rkJOKW zv@2R@?_dq4RXS``68{f)YZU?Wzfo}mU^M%B5>O_)pH4m6JnKXKTIHHa?oZqnwZI~S zNwQ}Tl~n3+U!u~d=@LN5rkdUyydleUgcE!T6T^4Q=+84R;e@cklu72)7gD`bH*MLA zt0Z8>DQ_6;E9xrEGe6SILN@oTxBPxV*b?ki(596y7KX@S)}+ghgyp}b@k+e?Q~>C( z#uOus=5z-0OzbC^mnX99$ul6>O|?ad&WmFzm7<1g?@oPN^#3)PE7&CX+im)65ryfk z=9eP+C)$6&z&d?1=oD=fzLH%t%1G2_&*h~A$&Qb*tm*@$+K1_~bCkyQ9%5iJDW4z0 z?%dkd4bnYB|3K66end4NjaplmVp1M$bXV^%b~}C_k}OLL`b!H^9^|j94%|mrT{9FM zy>W?MIl{jtVJ{8J5-;RZyBRhc!pW$WypNKe7;Sl#`p99NV)aH+HQZlGFC9L`KPEHF zQ}6P%N5=yv$k{TOW`3bOw0<@>f6A}~R_mITq00C6#w%NZw-Jt7)i!2C;;6uBwC3qe z^^{!lYipC4jxpZftYe2Qj}4Tr4^=ufR0)q8MlB|qLG_AOkrOVuuLa4pd{sgUr_Si% zz6SeBQcjI~87vjHIV?yaP+}wC|CD&hn%U(0OD%tQMQpC7kxMC$y(Uf)g zfRy0ju=AI#73bpBiHkw2=Gz@p`r0$zSD{V!3^^4|ERKNs{=`fu%;lD@_RCjC`}_NF zT|M{Zjv-Rx*laJ3?Ot4QR2tHA0)Ove_zj~%w{GNlni+tdf4T;09~X-MH7k!?mv|%X z5|D7{9qB%~1iS_G$iAbH=W!QCD~l3m@<>V32~(eDE*>Mb1Bo)q9Co?^5q<`5KA%@Gii6+W20@3c{HHM{8+Z|8Pq3 zm9fw6Ck!(83mgd`Hv^2eBpv^P170h17NKiP7=ROTa^UwS6AUWCiY@Y`vT5p{Nh^|~ zvE_oAsN2x2?$ex6f6GQCjaBQV;7i5Q-gzSrJ72kuTI!6yYC#xD6vjB)NHVTP3M5St ztK~J$#jo$y0^E5NGSsr^wIVmTkSwy4cjuG?+O7ophHIUqvIYK5+(cwb!J^g4fj80g z24L_>+G&Nj(e>{Boh#!5ugHb;gi~YpNdfgwq-0}?5z6!!F_V9I16+TT*g#LmU2GV* z83GIY`p8knT78GTeIVoy0rJdFV)zktpbmT{FsA}i$BaEF#HN%$UXi$knskafy}2xW z|CFb`db-2Ta!s;9{EU)G)#Q#&9xZ0R00l@fNTDsmy`mfpVttRl!apGm-#$6nI*d|V zX}!-P9a06*dTYv8RS!Mu20MGD7Q5qb(?A)qkBjAgh;zdINQ-5WV-rtg!S>T(;Yv>L zg&h!Tcl4#=g+Wehr=J!)yiAgBlAuxzh5MgcKD(FqkS+iF?>=&|^L;*ziqoV1-Lu^g zACwrWUVnRj{^CsRK}&YI+XB8p9=W4CpQWD1MKq)Rt5%cg&4g~7R%x*wK~!>w>dH4+ zr_4TY>fujU{9o*Ro!pBY`5Qbe#{F2O zPJL_i0aqlZ{({nx7Ki28)i|-%x!IsSBJA5SBIXp61T{GDW<;18W8J2qyly4_s0c`p z%UQAUdq2P`c+VB2sRxusg9NmI}d_! z<-?U6=@UF@nIta;4riSDr5$(X@DY_J9WksgYa=elqKmFYz$DdRh${V&2?^n1P~^$F zg&Ad`<#-~iR`vl)Q|&B4dmQv4|AUABa&#`i+nFlGEn$lg;I9@3@NWARb2t|Jvvdsk z>!&Gelkkq(k9G+pU1lLP)+^1vJa#xwaQ$yqwYfDEF3Kx>lJ?oB=rrnQ3aXUQ|mUx-AKz7g?(*-t{uD}OD z+)6!B;rzzXuZGdd9!OfB%zRV~pCitF?#RI1Z#t~IeE5ujVF|+9Wu(oS>D~EzGa1d| z4r)!Yb7^xWawwnvz55pO^nF8pRmvRy3~m5^HRYp){agO>DJrs_FEyoQom7oKH&230 z<){)jH0re-qz+g8Fv8I5E??NzA1zCxdQf+HXuRNmO`Uc}>DO4-0P&1Xb8P+|nWm z5ar@%aljT7YsJw1)1LVAm`Lwgd(GLbalPK!qVhFj2|zIriSH{&C&m~<9$9f@1cvfY zOgF+!@(C&zusA0CZqc3QT;rZS16Nrx=P&4Zy9q~Ne5@QQf4(aRB!WF;e`Q@>cyP=r zUoZQc%^4bolLT)L3fc0^Yvg;XejHpo^3rJ>u`@uAk{RaU#25Mn4x@`E90zt##+>U} z{T}Z~@8f{4BoxQNwqJmx^E<;vBu-(_Z@lK)o~%yKLAb*YE~9c0lETwz&ERP6WGSFr z1`H60%PaLK^11^LK89$R(;D~j)#hVi60@-uRJPfmdUwl>Op~d}4_vgdWj&fD92)%5^r7Lb7$Gp#=UXFQI4|Km^M~KI#o8 z7Nw)+d1w{`tys8RY->K2(C^8;w!USy3oIhuLti?%Q>8J`J9(XaFq)+$XH4@Uq>#X8 zk2AqXrm#k=GTVl-xlO#k$=;EQKrc2GdFXJJ_2y-)ZpB^4e4C?qG+FJlPwG`Yr!j#^ zz>lHAm_L+!lY%J2aU8TWFG??tGAf4;X5HKTF*ixiUlih7nqQz^18>BFMfWAturge) zYRl_qAJG1wMWWI*IZ2-3&IN{$RfQc1{$IpPV%4v#cARLZal);UI{3@St zOX#NJpQ%`PboB&$nyz3}r;Dt{n8}KnuFz)nZDlK=ida*t%eAG$QnS}pm0zGaDiT1+ z3qZQoJ*!ff%c1TzqPWY*BPIuOK}Nq_HM*bUBUTUHvQE&kn2K%zW=MXj@} zzOqy+K6NPAPPkmLciP4j4WGWb^-WS%Pq~Uzv7Doff9Z>yV}phRhl&X$!bfQ+u#b2w zf=_wWUEEGwI)(R~l-RszLf!gE#ez*PtXKVm5>myYP_lrB8WLFyDFgEAC@V$;DeJ?lQ#>|wpd!ik#MXb4) z9y(T?QEfMKrLRcU6ESWWEBLPW(up?lg}VoofM8iBZq?z`ZKdkk`appKGMuE7^4Qt&%Ev&akw?iT1V)(qQ%0?)T!asx}UP|mHKg~`>E_#L+>9?g7z3P(53h+jGku(_V5Fpr8OPY``!~IahHKc@eOVCH0#XLtkqG%S}&oawToz28& zyuovdMHcL#z!*5oH>ZR(1(AiCWJ7OCA(Z@8^YaOctPi7RG2_|u*sBrdGfjm6+d--% zu|~RwrA^0zASZMzJJJ?C1{jo>d-j|HoJ5hmRmPQPQF!@I)Y_UwnW+CY-Gqa_1kmg9 zfVP5ALdaexjX7bKoTDG&kM2Uq=4gRErrfRc3jVr>dY!&ia#y) zc}UP9-W^nSTWs}=bPx6we+87mmC6m#+UBYx>c6|J*{p@saBMK_%|y4m5v(5s#uG8w{e+$Gc+)%KUsR#GrzLamfcr@3nap1l*fD^Y?94u> z>CAQ029XtrF8e{ui#w{MaibEG!g+mi^RFoY^mSXJ%kTyyH>V`@`>Y~2E#OqImm*Kl zi*D@CD^bd-;8gW6lZQl-nS5J{&3C)sTHaMb)&g7ox+Zw7(7E{cKpYrb=Oepw0&%9J zbxCEOa0>2iN3E&#T5wsybEas$&ww7E`J{c6JXLb)d|be>tOvPJL~ni;y8!qw!o>R% zQ;6D=cCl*1nMYkwGe?i^@`kWpv)pE5opFqT134;4h4DCS2W30HvxpIX3=A!F6=^o_ z%r1I(MNGthou#fzDHcJsheT|`gpH9kR!J*`WO@v}hkwO6^!HdJ7LB$_%UywI?t! zi&Qz@amqG1s_??=_<p;Zfvy}>YPwsdgb72X(H zt9Y9DOz#rl4K`qpc5RF(xhGp!;J_n z1W`_}^Mzgouw#&>9jNeu1OkY9@ehLkX3rZ}y^+!SLC4Hpbitw25~%soaWJFf%gH8! zC?j_|;j;cKCfhAIxU?x|&q1kd$vRa<-Xf*8QF7f$EdsvTDa?Hx5i9*o>s2gjO=Eq0 zEn|j~B+3lpM<@skF`!s9JiBI*{n45um6o0Nb_OAGvmEk?%Fz<9*H6<{rwUO}3$qIB zNPZl;9171`K_~imW(_QOO^r|U4qU!=j=tsN0u~6}Ry}-6Ipsg6b4l1X4XVY}5o+#@ z?pq@ljN#YNOsUqz9cX}*vn3Zd@z`Bbn*6y{hd_L02_M~@-#leGJswlaFe$=YhbVn| zRXj9`EQ8HW(qOxTxGO09UWni*!7^KggD2dB^(hzk2unU#5M7}@-)V6Ey%{uG9iD{f zenT(RGy!V#Zn2hmYHr7-yt1UoH4%ajO(CO6Jp+nZ!@*WG+!R5$2HguU4jT`m#@kd- z(#Vhb+b0IqNuFFROW9{#6hJ%N8wN<$HjWE(O2Y5eWC6zhKO)`5Vt+9+}WHKpW(D|(=DRD6E9l1{yBEU(ur`XL{4sK!nR|C zcISFo<&UPKL%To`&f@SYSVwn{i^*fo(I8M0#%kuiGjpdx%2V2k3MjGhpH5Q# zDI(Di+|6x5zPAi~1vkUu$;aUp!g4?OtWNt%-rptEr)ImN3c#V!o^mstgrz1+?tIfuj zI`+d`GM$G7xxfW5U!sKrEn9uDQamM3cj1GgPifX-4M{@>S>0!NtMJBY$SUG5 z+_hGSx4MY?Dzq~R=z4u7217{P1j!+>0JGOQx6oCMa&a{pI8;~VAD@vf0YemUW$Pf? zyaW@Ryd60Hesqeboa1e#v-2K#BSKxGfK$c6J@EJf%*nnNa4))ty2#un2RbFo56Vw8 zqXz1HyvmU=b^{E#BuSP~5|h6VXeZeq><+|54y&l+iN7F(=T<$VaqwQwT2E;sE>zQr z?-cDj8NV;k$=TJ!+GjQ|ahUWwL}@tOf11|0MjE_S-Q9-B4Fv`Pfb{lq%#6%Af-VSA zu!LO1VG9lfygE81(%g*QWf{*DktMBESq*R56IGG-=-sbCMACJoD<6M~F0MD%c5`}R zVqnuTF9Sj9W?Z@&Xz1V&KW3VfiQ(v7cP*-Ji+m!FC`;tjZU8?(z`qh)L1yQh?W|wB z5!i9oy3GfITr*0f(|W2`2GU?G7*-NJXOvFMlq8gW2uu-4{;p?AH1xU zPh)HAvQ0IpZv;!uVCE+75J8k7s8sFneEbT!d5L8x66514m}lFxpA_94yYb`u+ zgWBrGk9HQ-T$XzrPo4V>LLD~qG3A7t6|3?VD;dc^Zw(06$Jx5Z!GXD5^DFfva6HqO zlW11km@B3#2aE%A!!4%%ja(l_%7;PaK1d#cD)HS$k=aIX&wjD-i1o^P^`Vq8K(SQf z!ZDzk7nEnDn(0pkZ^Y*79uhmxRCdMTtcaYBr5>PtM>FN6ym`&qwkAhbU1mIf~{*v?3q0$sn3xBdJE6OqCCmC)|J+g!A-C`x%9AkAtjSl7TVS%HOYn zh|ap41EP#IjUf*nfxa3Ia9Dd4JEG(JPm>3InSt{CR0#WYlyj~uqHuf?D%}TGftJP2 zVwa~5f-}ixe=IJ*dTCX#K?M#} z=My-;FTf9ppR73m*>vW@f_AtgH`-#%5QLtlW}u4MsSxfYA#MrY4>#sDsJ(&KbZP;t zBUlJP)fYto3P}jU6fjUifJ>IBHrrx6#&=`1@J3-4;Ds3foBd|z2eA2Nvsz*+2UTH3 z!%!5LboJ5?+eGQvb@>CwbweyVhW5HT#GAVR4ONIiiov5iitEQgr)9K|5gz*nLq`PjtRwY~ zIibwr)Ysna9M$mE7alHvg2dJ-QG&%FT1qPbl+zbW-yn#iu#truhu#m+>tDbNkEIb( zDE_e#(!p%+#}634tH1!ZfHTffA*0lL^V<*iSsbSqE`c30bd21ZW(JXswvD=8|xO!8yw4Z-gzE zxW~1;1f|!4w%VdPB`7r`^ZHzabjxv2*6)l)Mf716B*Q2;clgMIs)TTqHv77XX_bmE zpX!uez{Xx(9TdYq2m6-3KE`|I-|ke_ zO?#V8g%9uq@Tg8IC|hjqaEvEr=r9&*j2YTV*9%AZyI9)f~tS}&y& zP8P@(-e<@RGTAamWQ24jua(hzoXn?%XR>r;`77v(gwR?IudI6$Dmpe|!|wHmN!~M3 z#)g7r%G&=G%(Y#U1xq%qQDqt9!{RYf6)59!bA&ZI60|vFxC?4wL=}okA8e4lSkf(_ za%Doeu2kQ_{ZI~{2sd>d`pug$`zztUy&;bHWZc;&_|xs4K(5sdB>x)&mx+a475c6I zE^%^jI(b_$0bE`yke;A{O!_MfTsB?%0A;JdydP_QZkyzb>DZIAFFR-+02mjRGqU)) zWJWv;zn>9!{9){E1sBb7JC8}^v=$!;MpD_C_|_YX$yemJ`2?Y`)q;N{zBcjVl-!fo z9k?uuvPiRU@FuWAP#di;rt4>N#AZYAy-Uh9`g(OOzRf_AVpSp;&Py$|rSY9@Fh&1L ztB4{{y!{xxOb%_~gk%iqCt$_nvTiFABsytwA|DRe{sYFL-Y}3@#ub_|Xw1kfUrv5s zF*Q)HP2RoHoGBsh1V;Rk!eBM?MFT%*>S$E?TEzVUA!R_je_bsFE#eJ3uy!| zY+pXS=n@D)d1WRe1O1&gOMu4xi(TbT2SBHr(nq2R15o|vOR^4D)8XzsupR1@O( zqge6bL3G<9q}{NfgaaneD9_&4n{z_?|778(zVA>O@X42@o0h76hvpUQhA3>&k1p*( zzz)Oa#_&-kLw^dvRQIl(t1CndVK*0#IPZMOYJs<)4?tt^<^MQ_i2>1p75#`~DhYJh z@^{63N$7nSlR;jar<8|bV~)Z8v*G+}#!YWaHkCpHB9GkI_k$7$9++*-x}1bQcU7i? zY8SrTo_lebWnO;*rQkwFnj^a>X%o#Z8A+EsqvvODH;qE(T>T+ zfP#yj=L!_QnWq<`06Kj2i_7#V7PB*;2D_8v%L~2jJRK>XZX*h6O;9PUQ%_wSM@lO`|x0INhcJM+PZM$2HaOd_KQH94XSpI z($mGRveW~965VlhP#n@Ri|_q%=EoieAbE^z$cc38BOfe zS9cMipPti?c_%RwCKv`}+T>-;G2U!D_Sc~IYSb5m215ea_Fn8NSSUuI^)f3!+ z_Bho%C7_h{6Jxf*bX7OK$N`d3P%g`i$)6N|d*)TWMVgR8ne!>-&uag`fA!O+f!>%E z`CWhGqRQ1F`NKmzzkOibbZKC{v5_HC0K@%ZK<(z`(S}jJ7vYY~0XsD;4i`oQjSn8R zq~@&A->%VL>ZbuhB>ehO&^g#iux*@6FF5Kz?v)gKe}v{PVJb-AQz&19tNaT@cq+_b z`SNJ+oVty-$7;Mu-o~g#)eurY3JLU1^KvOT{3}iD&wgK*Um8^#`RG#S zT+9OG0A)CO^ZAP6hrX^zJud_a-ON8zHwn_VlLOFZO&!#?#=?L_ATn*~sM=yV*53aY zk`7da?Ol1__cGUR0HCm(2Nz2&1MVH0y8Y4uuGfR7;EEO+K=0*%ar46loAfKs-lCJ6 z&C&t_kSsPeT|^DVk3(I^Cx7d249s>&kUu6aKT{NLJ5x{$_*0G?Nr8azatGCV(`Asn z`pOQPju5@Yb=qkmN(YV|s%OBT2vIjYcRQvZd@!~uTYdT03o{ry-&?tRdYze;2ehxaO}8UrJcrhv|$ ztn)$KZEw>_znvL1WhIBr>iLlD5Pgv(m^P_`=VwdZjRZS_sNwn7h)ZgDoYJ|xcB%ao z>V%w%y{-q6%lwSs$D*g@NLvCjbJU%HOV|de-zE$~qXIHS((8i*&IQ{Y#4#?Xa6fBy zK9Hw7?FE(ZM*O2wG!)6#b15vqb7Cr$y1*Zd;Zaj@)zWLz&HHo?{tAUL3UE){xXx6y zz}XJNt(07^<`OY?v9WspG*gQhLd~-=Vq!hJmLA-tY`l%Udu9fG_y~^8@|hF60%anh zn198Ne<8mr<7GM2O^XXQBDZ7FYUOM~jt{#@B+C1C6HEhO)nw#+GM9iGDT7Y1p@v;l zg5V-IdYjw_!uW2Xu7l$M8s+-lMl(0z`Jg8B8bZ+61%jNkS72`IdDBH;m)8<3HKOue zD9>_G+&S+j8uEtmHd5rSbV1OPW_K*V zdJq!6=#wBHaHdaDBDE$hCT%Qw%4E7)(sV<=;NvjP5D65cr?mgmVz#wYvu zoE#*-?&N+TzlL`SHGm15D^g)3>P|vILTAD0_aW4EehO`3m-shCxV{haryo`0&3-tq zv2cI#TSZLlO+;9mzj7A_Z~!P6X$U7h@9{0fVth26J&PMQg;S#+6`76FNe**E9Y-k# z^Bz;%gglgi#F@$-QSeoKc;vrEDn~nZ7Ceby*F;BM3o!X}04Cv(Fc$1#MJfgBkkGz# z!y9L9COvzf^H_EDGwc7g*){bhn99mMVP$#?#cN4r5pSQdy3p-~Wisx6A|xap^gDK{ zP1_H)P^yjui%w{6vru!RGGMGmH*8Oz3u~=(LttbBW3&FCx^r~P!q!|ET$tO*%vb(8 zkl!Jh765hbLLL0WyHUsMT>)QjcD}*Z?_gCQzNkeLTs=IAc*vJhTcTm0HJOpdfJFn)_A-E@KDzm$M^L zZU@|E?3QMK`N(#98%4M@D4$-eSa#bQ%|El9*0gIhjQLG(Kr)LGx{Ldw$CuDxse(YSFj z&i;C&XSMfeT-o3x4A?gl6Y16n_i6X$P7xO6VOoM180W2w4yd2UF)_Zi0tl0E*|0`| zQ^^aGvj$#&iaVaP2#oJ!Wzw0RxZS{?5@W z9X1`A-GbELcU}>)K3-1lN4p3+2R8jUA^fzB!)D+}8(L1_@wSK!n)0anq)<54prsgy zrP~6eWjK^x8(ex}&tJPrV93>FvRlJU5-HH?KZEpBiTFE4dNUWQ;%O;TwB3flCU$Uv z28_Za1e)5HRC1=pSl$(WH|pjtIr-GzR8W#HDfOyaera5j@nO+kB?rI0A;r#Sl`(-% zo|t!FT{!;+MIlg&rdlf}oIW_y-2WN2xvD>cV+Iww?*1_gtMC!a^ch1yzRAx#NT&sL zotDX1HY_3GBzT`?7KRtM5}EwtTCu0$px1k~pScB-l=}N_>#Iby+z`|R9+|rpc~W#7 zRm;Y}a3@y2`-P`M^hXR6#D&Eqn5Qt{Nt2%`P6gSINRqr{=d=p4?%! zx?hck3;yt%tH~~-HO>z8;B;m(tOI9s3w##ExEO~e@(sEP!4L5~VG!KzMBZ*GH9g|S zJaC{lh)4p>OMrI)MGMK4GB+&7M2>E!i;fj*!>PGX6QE1 zQNu#jcT7qyDx<)y`?-yeQ;;9hP_n>Rc53brJr@NuTSG#t&J-wL^bqVBdtk&=r0-Lz zuUpnWj)7{N>&{kUu*n0*EZX5RGV!T(P!dSP(z6Z2v`a5S#nmfp`0#AP6nT01^xSi99`;ZUzY+cMBh?CAOkrQZR$2OkW5^1jqSgQ4(b z!rpSR%(a0nwnBQQZ?mRziD}TOFNm8#e&m8CD_|{ll|1g$h4e_+C3gwj*2SsK#yPnq zX`F2{-L_&+WHYOk1;GKre{U)W1E+jM9zL_mE%=&VYn4L1MR%xA{Z;dd{BD7RP&rMBBr)WnPB2#1bIIEsGRiIYC4OCl;k}WyO5LSCV5=8V$&fCo~8C&78P}<-*_IE7 z?;C2)F9jOQ1CqE&lZ#0YS*N5*CWVgIhx&e!EF7fB0dQSS1e!x5>}WV`_7gPY*v~Sh zaGqtTx^M)5dhhlcfqL?W2Eub$K_9$+6>jhi>Iz#qTxVP7Il=jf_Yq#$@l}~?Tn4t3r1bp&BYoj%cm5p=FZ!z8B$Tl!3cDy?thm8 z?SYov9P}m&2_K*eOaZ|fiPpdr{!imcS&tlu4fRVV%QJbD_pAMRa}nGzjdHGu28f_6 z@^7rk+#sU{D3U?U%7(Z~U@QbVAX2E)&p+%>2IUR~V!P)M+c?d%b|fQ_0_WZM2JbJD z+x3t~1Lqw14ZKWwi)#L_Lf1G}5$y#}B&oIO*&#`aDAXI6;8;|gBgE5gy(?SfCCQGJfM^pgN%5N%pgDy{a`60}zfnD`{R^D`tD%*0V%lb>Y64?tG1LSPoFBKyh$GYXWadlL3^d zl{TaWM0yLKK_?;9v+4k*MD2pf<|uS4ZSj9TgIPu{d!WR2sdcBxZ2auFL0Dv0FE`G} z|CJ}xc-~I_8AEUp?MQ64=*dT;tL|OZqCvP~80Z<}4+U0RVKHO}it>M@)2bf_Pi)(F zS<@c}mcznjZ+dui`;2$tokbF!obeerZt-n9^+)xsm`aOH$XJdK7?Lhc^PCCYUpod5G>;2 zXzl(d>6MBP%OwqtG&xQHJ04{7Nd5hNuyLx7I&_oC78ToO@hSTZnGT~$aVk-IO5=3m z^6xHedk82?<=n|X$id2r*NI;uz}Oe12`aqKV>p;Cuf;*B))ga9Vv{v5un38Fxp^TQ zB*<_0&9DKD+nEs=#&glv?T8+NY;XMf=B83@T`V*p|=xuZgHiX9;!PPOif8b2Sl8kbv=|g^EmPhovJJM40`#ZP35GzEr! z3@2%tHTQHh#DPUg{il)`RVoHPrgD8pZp|}%pyeyR%wGWwU#d|d?i`!vSP&8brunQ? zvBy^B-=+mBfW+0IfRK3Z(=+#LY@Ls|Us`&-SYkanDs*{v%I$XVnCFzAmxRBS8MQ znN5=o%!3pt&$Ww+Jyk_`-0fH6fkfQuI5T-#g)bW~SAR1`d5=%{<5wg)Ge!JP-OwI- z-TA!rzTbu9uaV#qEonY<-xkzFkyY(rrzpp1U22#C!>Gpuvg4&^Frg-{+H_~le@8%p zFeWTQxYd`Lq{V?DZd`IvU@#^3fZ+evc2a@0Fr-^iQ%tL}6Y=wEp6#;UB(Q@U=8gx- zSB<=N@A|2f73{sH(&ymVZn3z1PtiYcgrOMUJ)It?kx88@MEgBHOhzZXnpY=SoHo6| z$j&%Wi$v^q(=u*T3Amn>2fURnA0;+ZF++@Ud^W`C-FHCzyhL`kazb`%!T-QWhN7?} zfZ4r4FB!v6N0AxowX?#qLph0%4(Xjnl2en#D2XDw&4ltKy{k7`0W8^dmyK?hG?y{0 zddT$VzR*+L=;x17?;j=5*^6kMwFP?l8#Q2p5YnqL>iD_dr|w6AMY~#>tagK!N6+EB0CEv=1>sWRlv01|KB|n0uFN zXa+5j#=QE|g{rDIQhMV%6P4f^EP&eLYm@(P2<<}|PFpJ>%6^tJ^=udf@ZR5UYbl3Y zFSjN0F4YM}R#C;=06Fd6v#b_N-=RP%e&;!QM$fDAg2VOiK_hhOb~HWuwJ;rBfALXM z1hMrrMA#E{E}*tYbM0ZWyNs?+UFEBhKSk-F_df4?&qyjm(|&z|bG@&D5l$h8Q9aDs ztQcCoUdE;V3{&x)hYHFY2su>(pEk_&v8wC4h8)?QHFI>? z<&2S%dJil?O@I2rN*PG9%nIYge(B|kwRz_5<#OFf(+zouyee7?ggw;mpPE2ruV>F# zTuAw&ZNwF{TNv1ZzI%ZNug#$!KVnUz<2)L%6B1D=tT{H3q-!vIR($w3QOvVlF0V!? zX1#8m-CrZI4SFDUc`WfZ0r&mXaTNo+4|2Vv;)ZGuu#&IAbC zAYc-X3bWTG$1m6|J9DW}RBP7*!o2sFuNhv+)cG9IwOXKFuU?csVt~U{ml>L1HTxG^ zL)^IssT&<0FIM5QXiLA0Jb9grvTof`0hSwNpHo>Z_S3$0Cr>Cq&=YP{L58(=XO9_c z{`h-|IxHTZ*lLP5olWZ934D^?$)rc6^7tBF_p>oA#sl@Uf|g9;*H?Rmx zxBA|3HO`o(VfeNGpE5ZVNLu=jG1AO}MvV#I`4GE$&9|0%7V_21B5VQr-<(mrJXYAH z@jm6M6z72AagSm)YmtLOfAg+UQ}t$ps4%1_K@Xfe$guDtacGY>8KQiJg5g>dwL!V< z#2I7c!FtWp1dk7D*EWs&m0HZt@{`_AF@QWjAf&&7%rRUsmwoMHhj#%H&LaYs#Uenr zg7Ekodp1>##gZ~rwH4cI_*=gzr9hdBoXVl-X#$m>Y9)JG2jok+1g0-+BY}sa1-bo8 zJr$g=!Bl3AUgCE7cIQ27_gtGAchnt?nB#TaD6;H4`rvWht+fKz^0#TOa{xjF3Tj#7 z^5qOqeF!tOvFAG@iGjjycO0aLKBP7FykXy~zIWQMxWtmOfQv6*&qN;WGzc-YdE6|A zzOJF3s}uh{ow>(JQ=OgBC7+dc(%VkL=tr#IIs0Z&Kyctkm7Wk8Lf?F?B+K<(oCTEug3|%&vC|dA z5Z-|-!x%GVHB&c5Ta^NZL}2H&g;}FVeuU4{CMAEoV%0wL_rJ0*kev&*Klx)V@14hP zPH}`!hrCTGTEm~ojz^7|3HGeygWBN4lv*HXMTg~M=$Lu;FT_$|(arVfyCgHenxvll zhAO8qh=RJvvIZ+&{Rbj30DPasreZ08u1`YD|4s&CV}m-*NcrsFL(0D3v;8!rgDmjs zDMEbs-dDfv-v^v73MS|;jy?rwtQgtoaNkf|gP1j>;qjF!|HKkUs}v=}+*}9}CaK9Jam@mjtrrTDPge=aAVmOo&=(!l8Iz7~+AFXp zfb-0gQ}A>hyRTke5oA(^GoddT)Hl^fF(4-rHIt6fN&a!oRCQA{OW=fLr{TBOV5Sc2 z^w1QCn>8U2yhYYS`Z$g#GYVjx&@41_3?%k>&PJsdWO%P$g09UL7-gsx2v}uIvRv~O z4m-)p<%CijuR%4I`@U!`G{ssI()kdG(E`U7E|3h{%JKS-va}71p((;@a<&%o9Ec%* zM@KEy5t#0tw8|0Rx*BHakS-e0g;@@>y`N=A15iQ#v^YU(!ke<1Zs#H8Wx_Ods!d+k z1yUN+qM-62yia|>ROivtDeBHJi)Z7I8vXhD^luaWX^IeMOg#dIdT?s}a6%u)?SYp5#754h=kk_ijG4*g43LkF!&vd-O zPHBHaPr{eFn=~p{M4MY_IUBX3>%*-5*a^r##Oxirw=V!RTJU6lF+zmfh_Vq-cCAC! zRW^4Qm)cGW@uiY9qS;Ph<_Y)K^^|=gbkjgIk$~ONe?3)l%V+pfp3>^lP~}bbKetOV zS$17N&0!^g!wQ4mhvyPr?3(8{Btu?}&dMGU@$^|HY|Xm87qkhWSkbamS_yYWeAj-v z?u^5Fvg#F%lm$b31#QV|Xb8!ZvlZJ(TB!vsVMT(tAvnyF*$+&rYvmYjY#T z4QnI}c(iUq|exTxtEzcFLOU|k?e8G2c_!JFx9Md76B>$T z@V3iW93Gu& zYn@|Q%@vh*+`>OK!KP>u|5l_>8)#!}W*^=F%wlL3eEMP?7FLCrEKZt;!xO%q%8o)A zIWG&BL@kbdCyGUdIg@37m+=(D%Gqt0;X*F^fjlHqr;Y5h^aehqX%6O6X^~G zM;ntnmMTCTFQ2k`svhoiZP6?V64f|q8Q=blq3IhFXZD{t-{S-4(A3v|d$J+Y=sHyD zum8IkN}uN&Obp_!g0WZ$Olc0iyOvge2FSyGKdxif=^Pq9eW%1(9?iLi;?gh@wY!&@ z?EnDe$g3vXr0d3aI#~UCB5rS3SYaosuNI#9Cq2BMD@1bf0hk|f{^NLF-}=>tv{gdM z^T(#8U?ze|GYU8n6uaW#wW1%})0gHh_+V}hxHD14U}uRm(K$9rV?AI+X>dwQn?L%Y zN)VJ@RqBRDvOET{$6t6PSSb}V*7z*&(X1uMcx<1nmY?tg^T~Y*l~?^x(g+i!&Z;-y zI-V4gp&Xu~l71$|RIx!Png3J-2mWqV{6p^bSAYbbxb{B(!Ngo|A%51}__@cR0Gt#^ zJ=w37pH%_)SySb0V2+Nb@uH#JuXeJCri#|lnAJweHt@&;fJ!ntiel7w~R1nz~+mi9>qH2gqgeEuV~kloW-CbRlVk10o?WH31Z2aHp5}@l~n~=^1zL zy_0r<&FYR^WwmIOwvxDqlY#9t2j$?ZzXi4x z_xM7JE^~4gzQr4ZY4NIzs+_4}_JPzFjrel%&lW!3$t1@bx!Q*&*a(44Vc(~xTf~Or-FGAg0sAeWkwY4M9XRT6Lr!P zsNaQsGo-PlZ)z2|Dq%z>|X?z(+c{zPw3BVNQi7;1)M%kdxJXxn6bD7z9FS$ z{IQE76?zjU$PZ!wyg$H5Nb+wlVtUHjbBOV~Si_?PQh>ra#PP_%738#v`M3TK4*DFX zXta`qf03z#s)v&2Ia2zW^ddA~eD{Dhrgv^h!Ux_)w2jRHGR6y*C*XV0@STRmhF*Z8 zOAD_8thd7Fvz5j1knMUr&kls=RP%iQh@g@f0tX+~3EY?)2gW796!`9D5bNT$Rn5zB zS%lrrX65V9INbfd=71q2@n<7}8l0ECa0H1J-!X4?o?tsXwXk6c^mBNQUn8vjd4Qk# zr6E&SyNk?E{ip8BoY98qpR-Od5ENg{Ngg$BQy5i=DTWz`ZA8WrGETxyV=tdGL2oR*7?B?y+0L~F^JJJC++G%ZmE+&`Wa~h<@kj0yY zeo?7;S@yZh{C{JrY(H$31;&P8cJC_YjN2h|OoVP}zw?>P&T;I;T*m+&`&o9+q3mpl z=UhQBFe#t5%W2B(!N+{)O(b{CbGpz*?2MQDKB5U6lBC7=_n%WWZc6v5MnL|~TlqBvj=k8?srlc3(_e11)b#NnwhS(1kSO2bEzw!b0Q_d6$VJ&HfM-G=Okd>E zKAsF+_R;q~umS2G2q$vT{5`EJHQtm6?abj4bwV~CXT+2%d;laZ9K7f0;`;23E9F_z z@bBLm>`;uxk+4k#6=)yP^H=&LZhXY^F#Srzy}CpfPzToM+8h1+yU1 zpx6i6ptX2RzYe}q3m?6jYt*EeE`jpCZ0x|rHs{;h)?BxNi+nb%$4WpmyObnnRnU^gF-jvDKitVNP7-#DC#-34 zsp10g>8lUz6z~j*nSC)NLje+=aW04BEWGUnSnoRS6QB!#M|}^z+-aF=5}*!;jzv*? z*Kr0}w`a?@zFR%z1+t=!xg0E?OfglH-{xV2jBcB_;OEhEfdgGbawSyM+mg^iJrvNI64RjTqxyLMmK@enNe?vqBD-=F zZ4WBX;(ArNHey6|v{DO=_!PSnE_+)3i;!ND-*APcfV*~4ijb4%r2wE<0y{?w#3GX) zaX&s>vdBqFf!noQTAz_@go$9BHjSuCA8%t+-09j8YW6|AN2qlyaB)%8o81X^EY!N0 zN+5gpE!}rM(GZC4moz6h#6(y>b&Rm1T_;Y0XbNv zp(6I*JS=kma2V>S>00D*#6rLf^`PX<#HRlD?a3F|*_=>bBzQFy6Y6Rs@$Y-IKfBrS zo(RZ9zaMpK^d$y#uoP}uK$+I=dtgyB&fgoslzmo}v?8@GCvA^fM}>8QN6)|9`9tLD z8@15ZnB;5bbo}BhPV(h@`=`b7C1P)2rAE!7*4QE8O4*VNK#U>MSW=mW;NJ-uPIT@* z7ow8*?~82fPfTWSM2f3N)emh&Hs<6}md+Naz076?j zZu-|dL$O~g=HlndDvDWjbqgg4D!`H6nR=H;qO4XvL6}nmg!nQm6`4~5nqQ%l99Lh( zD`I(Hv6|jWk2&tNAnc_EgI4VcQ_f@#s@d+D8$6*R0!5APLSdME$=ywHYdm;mRD@#> zsHN$1t%*-d*=N6)jCdX!8MKp89mR~bB3A0GD=G>ns9v!FIQ@v@bVZpogc9n5yz;YD zTdY0OJOY~nWfxcTnGsX6j)|S=Pa8&3aN2tl1P}Wl2jRwe$0f53dgstET}RgJlG2!m z&=>j}DZ6^jGZgUOu2Tg%+fh?0c$Z^Q!NgV!6V3|&rtC^SKJzNKNRA91p?PpW|Jk&a zZzlJu@K5k|Ell9%Ze$Y0k3@nI$RwGhHHqSGo2t;6Xi-MtZd^=aYSOncAK}|W>EhcY zy%pcQ0x3pj4&32Xf79f#y24(G&MKa+@BlUqndO6a4xin}Y$mwce)5SEtOZ71xq3)S zGQwkj6G42u(!Tpfzs@2pfkm#` z%V%oucxd@s2eOvyoOGvG{Vx)IZ$5Hk%K^LEhV-VM%K~y&-GLseiF|TC%M81%L>(^; zQpz$;o`&Sy#W1Bp&45eF>Rj;hpdi^UgJbW-GrB90x+KZnPZUtlM7uIx zCB9pQBMZ6gL-mPw3fYKbRSK_~$OFjbbe_{rI{5603aZGcSt@_I@8w7+EE@pg-vRxJ zQiDgAt>Aw!E`ns!n&fdzIxGimReg9mgoalA7ZXc(Rv7Xg77;?&hsO?sTyLEOEhSCM zJloDpKM=L4fB%;B^_S%sCCqEaILkf=Pa^Q)LTHims=A%f`DVfFD|c!dT&g>!p9)I? zZq&S?YzTDsGtr!KXRLda_~_}El%R4kuXM_4o^jEWi#W77G0s!aKm9P3pp5w!<|&9c zbIPU4m9(H~<6>|gy`%g~Ux9iZTHFrYab4TC6Ez2#mD@@Q z?U5Smys`!Q&(=}N5AfU=Npo8bhsZ+9m!=)GNJb4b z*-^q-2<2&@V-R=gNjB_ylbPl3cWvjC=y4@ToyI^Y@U6XGugm*fZD?lVIZaC{{)&g^ zPpaIFMk!6#%uY=C_;)*XEyT9(|3pvkX3>q83d=K-HM=nV0E#d$(z$G)x}=G%TEfAq zH7FYbgBA_+c&4+iv&VLgz;^E!M%Rdk%lASC@|aw4B_==! zz;9KfT=;xTuhA?}-j+r-KyC$5Xv)X#>Tua^_AkM{#8tPX_1|m5W1s{cpG_zBN#$QX z>>5+bl`ER|_nq@+Zn-8p`?q&*|iZ}k1h;Zcj|I8p7|XOvML&`wp~W)m_jSYCN)IrkLgJpuIR&NjF_ z^kLyT^@>PAyw5#eh{eQDXr11Q2hUZ0K&p_Mwm!{4k4st zpl9zPd(BT;7^XG)^cpYRo5MJUEelZMwiH!N1Lf8|dx2Q;vzI=U7`;r1P;jio}7U3|$zx(6q{8{r^Kw#$^6m z$sGF}RIb1W-elXp)?1ly`3at}2~#XHV%grl!Fgq^Hb`3iack8@aKZm0lj1AtQI}d9 z%*t7Ud!70Pe(21NvO*~2PcDMzTZh7v#}Tr@7>|*4O^fp0w}tN@W)j4Y-WL#bQ4H32 zBL3X5Q*?msA$U}zR2+vDokxdh7)P6eQnSJAfifk5;7D9gYGQBzMAhJ-svMtmh<|UgP4N`7U3}SP`6zll1*V6NLs%sNR}Ch1 zimb`S{XPWVl=Q=2q*=v_5|iWut>~qkthHP{Eacw!LUP=(E!@; z0EBLZVc%av3>kw?%Ztkq^Izdn!^#M0D-*#h(q4TB%2(>+`_?F>?KL6b-MXjz=Tc5s zKAm^hilEX$pEN3=e#(Kxeq2WsP~O)hNdJa05$%&g;K}n;pqjt7Aj9(~*;mjzBip=s zRt&&fz7IxBZU9%_9CbYj%ZR4ia1Cq$ZAEPJwvoiqTA{N%Pi*oQaF*J2XN2wkW-EGk zobis7KO;kObe2!AK_eBCCOD5sy!YZR>2rbo5%3(j@8`lj>+e6K<4rJqGADbH?&kW) zaOy15&PFlWTy6^MuuMw>!+F<9ZrBNfsq`b7W-i2xSmv#Y>Yptk(5YcKn7sUfp=}o3N#!%$k&y`M`tm-5X+oqmQ5ecyDXy^Mqqnc!5MgR zNV6KYnGg}JN0j}Gkk>#uwBC6PEa%`%VvCQvB!}(iIg0qAE4tD^%@mC_PE*qT_Tl+b zb`U^iBPM$RN z3r(W53uzu7McDNQi*==+Y z`k>aR{@ob_JC#|-rCUmh<$OXXZ&*2Hrpy$5vwc+oG>N{*f%-MQ!fkN~Pg>wH?Pf_}8cwv+ zQdVEgODaw#A=+{m653G;$G_h71K=u53J8g2M2xZf&AQ0fsrj;gJP*S>$(py-PC0~b z1a?&5)?Nnhw&_kuSskkh0iVvRDkv4#1f%#nB3o6nq&Du<6*hlZVHxwoOreQR7=F>02 z{|a=qw8NJpr+a1|2x{O7KAk)K^gbPtgXm;8XzbReD1L z)Ev;njH1Px!T@$Y|7d};e5I9~xcEppTF z_-{gFbYq^)!nw|9=4_O%f_(nu^mgx*)Q_DEm(y%*DxDA9&|+6SGYg?=n_Ny$6Ut^U z{^WM8hbk0N*^Juu2tkyBAfxDhcvOZhBZ~spfDU+_Gm!&cq3;}v8FHD`j&)9f+S&V} zT4LKiNp%O{`CcA!xs$dC3R~`fE+sKJYzP#Qp=wUtD!rlf&PE_v`wGxyMBmiR4Pjzw z3E15)hyXi4#J?B$2fCH}Vk^1*K0}sw2uO+QZ)DCA)S@;GuggQ<`W-zi96v0I?72Fh zT-ww-@Ip0_(=0MNjA08;qic2Qx~FENqufc}w+45P?pV##9W+bp4H10pp5Y>hk>r;B zZO%MHNdTJ?ef+c2mt1a-09-XV0UM!jnU8BSbL;kwcT_U1hms+Tw-$}!ewBf5W8}$K z9i~daRK6}K8Nr*6~sO(1{MFaaSbX}w$&IzLS4;Zkj zg*XEndO%qbs32lYTX27p?|)$bwszu2y}3VEgp(p5pW=Jud}@hr&I^^Tm2k$ZQ{_I5 zBNLynMd`Jvo92moR;3e_*%H;s`Xw>imr`#<<=f=1V-z~*5k`Y%+T+kAxNeGdoR$Ap zWtQ~g9eDVx+`Clu#D|uJqWPx_x#bD# zJpeOJ9pX2e_dhx%8*p|LS4qk>__~RMT*v_Dc_#e5<`$Mx;Y3QuZIF4XVi>P4OZ~(| zrRg1p5sS9$k*)R1YYO(;b6S7dh^Qvox>S>$QSl23ggMS08(jwg!9Dd0Csc$fil0*J z=VVm{p$M=6b#i5I9W`xVT7lps<@XJ1|CYObnfRc6tFq~XvLcdlJRw@xDrW9=%cMt! z-?j-w&aGY(@=y_-V=bGL7W~Cehf&G@!To(1iqhu4@#GmgR$`;k`}0ou}|Fnfez208IE>jrR`6Z zBYfer>f`VR2p392u>uR1QjD4%EDuvf5K|mgy_IBznn!nTX{WnQ4r_5kkydYZ$U!h=Jn_nwA2ea)|$KSX?9Nkcu^-3LNyzJRlL}7w?xK-15A$QpZCf=Z|YxS{cJ49FYt7f8!jqHrV!Zhs?nx#ao<>U`BX5- zx z4$@j{N+O{nXc}gN&Czhg(HaR?5KW%Ncfsy*oHh>?GDCQX-K$*R^ky8U?~25-Bsf5p z_Fca_tMe?9xvZJhM!CaR*wSTc1qPrZQk1~xC%SosN0I^>zd^>Hy|BS@IbKqQ{MZOG`h@`>&v1clp=(}}~CtET8WLzram$6`F4b8`` zOxBkk2zKTLW&VJOhS%_Pf{%rur*y#NN7wf&#PwpI)cF=?QlBZ{5}8M~z9Jz-#kS)1 zb(n-EY|`&_N%y-9kG~`4`s!SoW&R@ZsFEb+BDIDRd7#Wj%`wUOvYd!X1DJO;E)l8Y zArUuYAXc&QHX9Bs;9KL{QU|6J5ESYs)7_W#WG>D+5NjWHt)><4(G0#-LgkDYVWQ?; z$IXPf(#dg9IOfg@tKo-KQ?j85eXtPM9Lq~ObE1}=K@=BL|IWpR$Ry>e6e&%SBfNn7>TF^|tCl0GComWM2cl{X89oF!EQVH*aE78X=vf?*OZzS{8 z^b7U}Qw*`qcVdUXrgfVHYg0z8F?NB*kcSEfNH6UK$O7;~ClAa0gGWC;rk0PIU$?JB zs0HB*;%`_u#$vqikEUQc(G+N^47E}^;-;fNM4#h&I2us(hH=Jymcl+jm7^T+k<=o z^_@9w!MaOkinZ}cReI|w1_)dzjxm}Y#T1R&>L5r26f->X%qGIk*=I_Sw^*qY{!G#frP z4K*?|KXn>wH%06Pz5C5czpnIQoh4*gzGqOSfT)-lGwn;x`jA}Ms zK-MJ=1b#;Ukc=fMMeJt3XE`j)J&d3<`x(iwPhU)sjWWR2l04#sm~NO47OK22M5fl*U_=h<@1fNsBm z2-2E9#eOz0h$m6XM}m~AT$ofw-mLJVMBLf3KsD`oR2|M1&>Ufu^q;;^0nnvqnm6B7 z_2;rAa=^vr{WNHaL%=Mu`D+++pssB+wScA`Q5f`G|3ZUgRcPsTT*pd+C{;(@)PgHj z>k~`2M3R)SJ|c8He?~J(CKkR8xA0cb80sPTUr-flz80Sd}$ zu^4kEv+m@y&-L?j0;lQF2RieGhKW2TWP@O^A&<$-=#a#Z(ijmTGX1a~`-PbK8Wpu_ zP%N%k*~Z>GubouH!@);BQWXxWJl4!Kl_t4iM(#o42QyFKPGg z9g$1e2qYvs0Ot+@nwX7(ra&u3IySt6|HCWJTg7Cax_1?YR6a5TGmoC<9~$2raCrFp zWH(82mnbu9cS*OU&cJ*}E5x)V9vKTIBC1*-Q7K(f>>OIpnZwyKC}@vd*(+}tg#t{cIqn?WdfiH#>5S(0y{s9I;#^5ofx50)>T($^ z^=dh!XP)jt>4s~HbZQVN0BEe>$lMg&lZN#1YjGFaIDQgbA^%t7e zdVef7l4bDO7CQ6U(P`zgTW2Po6xW=o{B5B*mD~NDl3p@=L_shSUx!p!82Hs1;RLko z{K`He;iT$w;BT)@s~%9as}InKxD_vfkUSI*kse*o>H>D}EficGIH;mNI9Wd8;Qqnx zNTkc+s!?kg$KTw#HS53tv??20DABhPjywNJ?3?30*{u?-oj_45=)R1g@`1I|lPaZR zJq@DN;;i$5C~Qi=*@;3yC;zT8O~p>YgC4>=kXAIMrr#>d4?nAJfTN1}C}7!w@_q{9 z@Olfu#{=#8409j5QDN$xTWs;7VVqJ?8VN%vH;Gi}y6SnFGT9?)<|IKy$v#?C2166X|@$A;u;CI<0^ zm)HdSYgcQquTiPb3fb_E6bkO7JXs6eP-O@9PnX_q zjuJuq$K&4oaEh9Os)J=e*uUl(#}dT9x66poQ~bquKaJyif4)@rRlDS;Jt^Wgm81|F zY{jf==2V#XTDj~G>i;+njMv+1O?E9eYq=x~y+oga!)$9{o~J9eGW&^U;GL9Xwce?1 zL#G=`H`YA6hkX40a@Bl%w zhG!9puf8@JPn0_gx654|c(CV^6%jd|E*qCOWni8gP`Z8~-l7DtaMpE{dOeffdN*j% zZrtL=!C%NFw1JWat&WS)MT?o{=nP!et%}~NN;;9X8B16E+xV4-aChCZDPL692qu5x zU8kJEJioSX2#ZJ#FSlaq*Y3euE`I_tXPcV#dWp^1?Aj5IjB6_?TF2NUzm}vy^~Gaa z5B`DUt{W7tnKwc`#Aa#It)O*z`PoI{MmE6^-)o-N%tGdepppJz;tg=$^L(;m@M~P* zMmHEvfL$3`v(K^4(-AF>#+~fh@0%i@EZRK_88hg3ot2?C2Ofl2Q6U{I?`-iv)>nJE zGw?|j4j7{t*2xv^P8WX&RWhqS<;*srm=*(rMx;28D1jC8Tw(uV_D3j46&MezW7=Ny zz|bEjFdpMRCwsq?l7R_}e7_@?@;cMWwr2M1s}t={m82t=rK1TZSSnbdcK3f`QW|e} zET@iq(f;N^lrI_}WUTS32XRDScF=clST<=;RclA61v|?1o^X=4bG%7qsV%xa3f~F< zpaQV1WC`ktTIw#QX{+b~Pb-$n$acZ8TR?ae)kA#GVv4c871LT ziFz4P+EBTTf%>d#HR$UnjqxKRw|ws3hGi?*O{}U@Cbk?th=$x!?=g zcEy9VQf+)z-#adTc;13E&(by`?s|t%n|&}H!3!uFHX-_dx#_vKPr1ajt9FPm2p?2A zJYlJ+SQBxNwsF)0cNhL>Too$W^W3a;JCZ`k3d|&|f5YY6v7J5e64Pfsahd7+K(&yr zlG&iyavdh-F3nbu&YgD@ZNAD) zCo%%7T~f1gwMj}$Gs)zEG_CwhTqW7@MSambUr&u}a0*$43*B=Yim?NGb3&DY2*sZj z!Lz9@@Q>KL4qR(F`UQ(xG0rbi;#m>>pMsj+GATM=Z!^XG4KM6}Ut`@M$CcOFM!>yT z_;ae)cB2?!WNf}vJ;w@y#W#65i8h*F4VlQTmK=rGFqLE|8U#cbb>7zK#8eFOISup0 zAUlVg@;Dkx`sRE?DQdt(mZ`ep*ycG07jq0QwOJ88cxit7oM4UHxhV640tIVy&;fxX zWEQUQFT3TL*$jl0AK86GsHcu#AY{rvpF=wp^e-ViitI`<(CYsOvYu1 zAWez#sa&`>ONoD<8rp#j{K-j(1gVpq8JY=(-WRybCVYQeBVqSxNysS%sQ%+>hYeH| zxH>c_VyM2aIZ`ofLn1p+i8%TogZ_NU*^5sGWQjFR$}<&=A+))ut9!((M z?$N~n4py2X%eosIAdozG_lmb3p#oPAHeJ;*rftZj|27EO)qcGh*uw7vhILo*GH$GM z`&MDk1V_s!Gqlm|EX(rqLA+b~2+0bdr`kuc`WGA?O6n;z{W#%FJd&AbOLfxA&3CQ7 zDDlm4J8gC;+jb?4RUNR~sd3}re4ssf69_rYboQgD$LTwv3V1>={>wRqx)mv_^(8l* z>n%_yxl7%v;zRLb8Sh4p^9rj^eV9n}m#|HZc^y?20`Qx}k~d};;?DY&eL=z*%X-#a zSib0T+@4_^+PGR&v&l<%qAflY-tA!=du%^{lg(#v@`@DqKNelcmVfG{pBT>{!9D{y z!&BUn_-%9Qf)BRE+UEeW^~3dmxL`cj7Y3*qi(!NSp*=Y=XqQ;uXe>`*oeuijdRpYi zmt7x8OcEGuLbKDvJbrg6!1uOmezGlD|5uz*kYr#6D~zB()>F9c%b+->SCZDeIE>=} z71;{x{!OR89481y`}77#*X1mE0Ix3G@NZLvICJ0wb%kNjEpFK#@*Sv^Mz6plCOl@Q z#lecnr>Rf}4|F2VwGnz(5e?pa?0P(w>-#tpb|=$_;vJ{Xd=jz*Rk9W{t#c?}tOc@1srgMFUO;CH7uyS*|= z_;Y5~4N6P}^r6iwfvph0mQ%NIhGp?s)jemtd9^y&Z?!TtzU zz*~D_yF8R>Vr2GxA?+N#qqSMvKgK5hH3c~CfQtEA7!C%RHe#BL)XQ!!LdNFTv7MRb zv-f!huM02)aUfd%a{0o&!MfCt6z$MUs9^1U0Igtak{Aqzimstij8H6(Q>Z;+v>8{q zg+uJ1u7UN*oOtMOt@K~LX28k8IJ-*dH8|Giklg1!f-jr+pUa9j9o_%t)-%GPcmvcw zgY*3uWT9v6Qi{ARS9@RB8kw}LoSs~RC3Tw*=ZRD5j8Pf3mA2+@z2JW?Ld?qi(*e2F)ZhV-Bj)k8A%JjRJfwBHq=&k z@$wS8ehdy^xK`OP*d$tn)4{mB{Iw7D-&zy`FRLO6^ey6DTgjv@g$8vg1sbb~ z5!Okd^?8vyXoon#uOwB7ftxX>+z%LApJFqZ)ygJ@9OLnW{BAAuqez%{v;E5X zkED*#i}gp}+b@@RELRZzvhDgZ^@23Ca~7;K=U^)Wl}fZDO=Vh^opQXx*|Ym#vag(H z6_pO7ZEY42yIxP3=Kk7`=G{7PCmP|i-W4OyyOKP2Yt<#(2SzD-XqrC3LAW|-*+xHv z6eiS4@g!BLDb~GH(`jgzgu1uC-?L9-P;8+{vlX@|vIzDe!`#i&^;;$^(NU{kkKU88 z`s&Ygxcjvd+U@_F71vs;% z#t0(;A`R;5Axd%+IQ*dQl)kpFV=6bHpA|P*N}zd!uw1B9HS8s?V&4*GM<8&tRN{}V z#@{yJ#%#C&t#WhPveL1Q;IjQ}KsfkJ5>ASnct=abyaQ`d@zeUL31=rSpM0}pO2u3f z2#)rQ!Y5vGYp7q3wTCP0F4%h@+tS>qeB&}83WAD)4udIzl^WWCx(+go&lZIc0+U$l zEB5zLJUJLqMe)6OLFe@ADI>F|^F9KaMeCO&_2Bx15l&s5DbNxT(?3B7{v3$+rPO_| zV6&Xyo^}(qLN2Y``%7%R&`rRsuMHi?38%PvLqpQ5QOn$2Knb{R)9M^V6`Ir?)biYg z_^I%@K*+Jl1D*WA5J;fx@uVzx;PG$E0Abd9YURb*Hq2oCbaH&Y_Z0a^D6RweNQxQ` zR-~Q-cnTF2#<78d*pJBii;gMS+L9EdprjI z@~Fq~TkmvCj0y&!4S(CsMaO9}jLQq+Ni~n|%f>LRvNDyxRt6?W>w-`Tj-x`WM~MBP za8{c_>IXX7x@dIY#rRcf`}soG`a$?wMb4h8{DEh;<<~O6`g83Dt*EL!tut*O03f*; zXR4353{w7-HctoSua&q+wUH#IuxKIt9B=-fhJx15+&|rg_o;Z+A-tY1m+1!z3r9j( z2jAG0igaBmMEad8%tlKNlLMOBN@gR0v?|IGo^u+aef1(Kov3AoSXy}gqKAYrtTB5< z0ka?8bA5;1$aW)(>poqy2l`{j-i#;9t?#^6)|HehqAeAT*3c415S_4g`tx2eV<7N0aK~UecAjEFt9uAuqLa0 zC>kT<^3MGFsh^QYF6WEl-@O+a0Gel?QHf5Bv!_5F3$ekA8bKN0 zZqAmB)5QVKg6@wl$7Yt!lO0j<26nw%?1^&p&SRPHDpD%+$S+{{4&gUs{)YhPmybYW z%jqc9uz7+*0i@P8gs)4i5DPCrp8_`H;3U3?qnf4z1@>A*i{~W&syfO}zjJAcyEKkW z^5p587mrLIjv&XOZM|SWuZGE?+;zvm5U-fj$YVW+jKqzTqw`cR*u8o;ty&5(rLn6r zIq7VRm=AIH#QZx(7=dI|Q1_|)`oa&s&I#sBC$17D2fi6P1W%TrWc0%d*3xf=k&>?r zk}koTxJDveb|x3eyN1x5A|C~~19;C*k2>YQ^aElVRLz}~#j$9HqH6NVULNw!3 zehpqW_mU?!dj}>oWO;?-hh0wnl3uYsmeM2{UGrGZoPHA*Kru8Y7(Uf6=D&QwQLrB| zBl4I{=*CF(eF9$f_WfmtJ3p1}y}VE#MJ7d+o=0^9_uus$MkKP1fSk=16j~DMI+7zua|q|(qYiQxHUZ1&+obb6tE*M433~@S76Qly zS3XS1%kz%2Izf965v7{kl&<9h1~bRz8 z{qZEwUi6kgw}e!7bKA8;oxFQ-A4^A_WHdlb6GVIm@~mLUz9j?kBZA2I)Za{jaM7lx zz*(~iGu6x&j=)Uo1en_Vs(>B+{;^13Gjx>=!tc9;Ay%9{+pxF%RB_Qd*`*}%#d>kqZzA+59%E@wyg!b;>cG3#k?q{Ba6_~H1Xb5u3(q;3kEa@cbfE6V zy8sk~h47vKgPr$=I<;Hy@xI=wptV=->asb-Qo-O)dQS2hnGs+_Tl{O6%Jc^wrwX_P z3sJA52zo!W-G@qd@b~(;R?l7%f&pW)o~$5c%!*Q1nrx)vQbU^3tx%Y z^#4J(RTd!RU+ddWU}Met4GlmgBV6wHWirlDdy6EqO5>e{4VprS$X~32?()~;+2!&u zlXBn0y)=fkU__riX|r--5GLDXzxbzJE7qcOHC10DMQ!`j2ByZa>zk&gdkBpL9!N+) zQv43EP_2ubve&eF;%<%8g-@-H%11_#4|sr{9)B=k8K8=q3%w|S?2 zjwVFfhis4;I#7tGvEbtSCtE9M$n@!I@eHYRT=I8=KkJaX%MtTOJaKMK%oTa1W1 zfB=Uw(zXhuv3*Wn!~8T*_rR=+&N2L#sYU;{JA;<(@ca^N82#q-F%#vzJT~ zIX%yJQk@k7s;J5yzM2UZVWbpiQ(s`CRJR}C_h^rBE(!BQ5XjV4@sK`p?m8}guIxkI z9|LC}M1;67THcnN6o;6SZbnPKA~MVdPI;PDv_tO}Yaro9Z$Aub-*&PaAsZHp zZM?;Yld+oSJR%aqI&4eJ7k}-OZELVc;OdeuXA*D1GlUM=T_LygvtTj_QTH#A*ot(- z1GlePI(Pcw5)<**n@6>g+q<{8t}2Qk;l8rBFvq3UArE}NrL30W%-fWsf)=T8!XeYp-)Ns;ay`&i%SXNJhgKjN%BSWwHb`deBS$e z;zECKpnL_`v+sH2|LEwEt;hn61Zk z)9iS8Jm_{_)QCGXe3=^f?_tJ{85BRtA{?eY1BH>oaNNHRmUZXzeVuTuqSi?aim{bs z{39{uu`SrelB~ruoKLju-@Sz1CO8co7*On3)Vo4ZUdZb3!Oy1T7x%fj>9I!6^slb^ zJQ^E+qtpsAHCDai+|$9+8?^iEVlh5_Ev?$=RQfA^YofdBX8Rh+M#p{~z$lgGou`W3 zr_Os<1$uo$Crn;8NbuI$pX~v+AOt;q5dFd6=i9)iZaQx}qa()-?>QAz)GA%D{C{45 zxpmwTo@{dy_o{N0d=$VQqHR7E_#lI=!W|y$2gX&K7tVIFxgl0P5p-Du44s4y&F+X$ zM&T!ftUGhx%J=2}b*phyJXB>@&2DMrsq$g|7K|M8FJXSPqUSx2T~ zwlBUXsavfF=m=Uv|32kwl<#ID&s|7j8Z<8F8dvQ|-w2p-r|cAkFYr}Ltf-*&mjdjU zbLRa^s2B?~ab{gzj}5k6UMfgDPjzGaO1OO*+>g@7Y4mVcdzM*(HCOx*apm3RNKL2w zL229*(*J8|27gJufS6A?{1&xZ(X<)b!yR@5$%W~->8Iy+WH1&I`o~^b{iTYhOfKL0 z&LG)4N+hTuc3q^-OH~@@>_Csn!X{G3IkWo+8fWT=*i|G?8H9F$m`C+vap8toKHAI| zDyI(r&5UkZdt2^Hgfbhw(92Xd?*#*Vh4!4Sw9>KL`PT&~zTEScrRwYdLbdfk+Qku* zq>nUe)ui zZh~wY{;ckX9Pw(xt2{y4Gf5|WFNh6$zj9sV&%CInzkVZ#ixn|WE~W3!aBy3~%AP*c z*>)cOB2UJgR)@>!&q1nPFB}SCix&g~@RE@~uSQfz-}#R2HIUpw*9E|po-<_`#`(0o zB|7MmC-+RCab&)fe{3#9b>E`E2SvXDZyb@GnD&P^D){&iau^<8mcBTALtQ085~Lms zhSndJrCWgb@ql1HsknL~j12Q~lnDiT^wMjv^L#KQQNDsO@q5Q~sm#J2s>OW#NH)AG z3Zz2rH1@P@(xFu7Jm2zWe3dC8n@z=mfq3py;Fdo2J3lW4$Fy|2{2-z^g;opAaZV3P z1TABQ(=o1fFjpOKLVwNyCk+<$r!3!2`u-{^R|ynf1n2+Uz7D|o+xKpN9YXbNFuD`~ z?;bD_C>tK6cpDrUHzR5MZQSUZHgOSZga49^%wST4qB*8fxnXt@NEwZtdE1r-V}mN| ztPvX&81Kj*=W9rTYi$r$9$OXXEP`X@+-&b(R4Im4Qfq54h(h;y(`g0Ac zEWv;lz6sdOU9@bLS_?weTUZg2lCOtrrxF4GbFis&F+v1YL;oh+e8&JNzSKDF zjfPP^V+yvtQ3cd5+`<%%e7Qu)2L2)Dz~RYucja#x6B2vTI9T0o=~-+5Q(fvNtviKo z+kKGWGBW4&HY8$tt3%#QMj+Ck2`SlO*N`3bq$zOECQCCv2hg7Qh*lao9Liy{S2dY| zMH!W6CL*H|b*mcyF8mlHa2!|~ZgDMEe*(|zXYTIG;>~R=)z0D(qj8)idEUqRh-^}@ z`Bz;5zK4yHxr>LhvLB$qTdX)ED`TBXa{vTcJp9ejd-m8c;m8pZQzBfSRUCE$A_}IO zJO+jUKa)U*OQU?AkIXlxMzuA*pY#^FIBCUkionYd9G%Tq6cm_7vZg%Dq;->3v=yt^ zMU8W#?{uhgd2p}mr}#7&+UmT!E_wB3RC~d`I^dDVz;6FCP`Vkt^^B`;V6cTQH)#6x zePTI^7PfHv>9A!*0j~aD%(e;m2=%az*_#-bHWW=yRxJ5&P`?3h)aeZ!jJS*$ZUVZ> zBg@H+}|epBC8$-=LX@Wd5^j?UtlY zwz`ln-AM>meQNGq&hUqp}!Cv{Cq@_;rkjV1rJO-_PdGY%vz6KYa5`&i=^rD(IswIvJa4C+`8) zhFK>&pqe)1Kl{=n(pQv9$fUDODVYFELTWPpK%cQ6(kC972)Udtn+k2DP(i4?Wy}2^ z!7raS#mdnb`Z6r%OS%dYXrgr2vxo93WIdpQU}(9?=!R71#|Z@go1hipmTylCth!ob z3X?gYOtCV1Ooon@1?_+*xaTj@k}M&m1(54p63H_dYmlEUHjO%PO~&(w=Wz_S-u`$j z8*p~@i4n}@Rjd@GJSzi{SeL(1TgGmyptPgyZvi%_!^-BsQ!$kxyhb;ez(j=K5?Ob` z9YUz6_X5r<_35uIEV0B?RA-WLQK=^-_Bk0MWxLpuCtU2Y(%%a7<~O6aB_@vWMlOfq zZ-ps=Umnmq!?cea^665^fT61zBa~*avaHuFgGUz`IP$P)V$MmX)&vyw$JHyxOLXly zFM`V!(xYV$7~wx1MEP`z6|FbDf|QCY5I?S~zJ4W>3rn{@zB52q4S~NICPa$eWQ6i> z8zuIz+Latv9$M4C8l1b(cizW_>f2q^&n&kiKxFEO$f@FM37J1REu4kmP-jxe``vA z{?$C>rJc4|17-;DE}kPqMHzZdXBVDXIr-3;(D{IM@Aw(I#>sMi`s8#}11|v!Z#A0$0WTmg|CN2#<~o>l06=s_SeDbJ5jY@j^ZJ7KK?jc=-^H zq46687RlySlA!gqYEPDzpUk!6qotN~_z}20m3-Cak{<*@FeGB?4TF5VQU~qK*J!-K zDhYucV>UsrL zJSgTvA^a~&jIgSv#Z`S+q`9vLc9&#`wH#j@*dV$%d_D6O!>rYNKUVhYHRWD`Z$4Yd z{JO;S%z=Dk9Hp2r>oY`RLgu-Z6j2;6#G6dr7|_sW1{8Z;Y=ceD|5(Ff$>6sC#|@+v z=%|*?ChW-%&J=ITyoRiCv*qz;VW$Pz6%B#uqRUgMz&?)P?DCvu;!AKCEgN}L-|*kn z$M@p}Vqze&)+{_Jx~-d?Lo{wpF@6j62U3iAF{OvV3XWxxmT+?(|18@d&K;iuT_dg* z-o|cTeNin3vj;nhYyzHRya16>IprTGSrdPF%`=2_YI(jUc0_5vv1JZEhfaUOu2Y*F z`f^oXwE-qUrS%22%QwSd2UAlxU8NGa(+B!huq+_BGEo~(LBCuOIY-NfUh?(>K_rZf z|EA+`$ZuTxhd`l-RUB?cWtla;L{@yznW~)av^)~@0II#`P6iHN97d@&%I1ah5T5ag zx10^{)fCUoi5_7vZ>e^{SI30{ss!^semZa*@_u4oLadwt`SuK=tt42nQi>kO&u)qr zXy_}{S|G_9(4A!b8PS89ZWkTKpo1;jtt^Ojf%4q{d>~8DX7)pw9guYV!WbIRXbFmkI*V+F-V0f$KEXEl|Zp?L*8v z{0$n0-NktodP@vG+0MhoW+=YdmS{7B%f_rX#J(;QrA#39uIUr=G&zi8lnE?y9(k=u z^`arO)`VFfFD>VsyZnW5+@G|QC0mKY4p}|*EU{V`Xsd?N<X*6$ zHTO)8D$Digby=+;z1-zMXe#CZkdeuB{*|GlR%7yv8dY+x^y_V8F_K9gwLdeP5VaV0 zhBB>JAPZ(;;b@Y{%?u#eqm`NG4|6F$G=HYKofxx})}+LPzEXnJtK!_Lg<7F3@Eo^mNf-j--Q5kM5S#{;YI1 z5--^o%Rv;(Qt67KZ2?5)U_7JWX?F0L+tYY52M{O35N?{lYoXIno<-ImBVrH7J@sS@ zw>^Buf$$F1nN{O<0t;8A!rbhqK*N!1*5I$%U-sWr0i=?-$}R}+9P3;+5q|a7MH&F= z#rr#!Cj7{9=O@ORIiEt&tcRUoLFH$1qb2j1%rDb4)~)JRuJpUui0#_VXOm;0p$osB zW*+m)z1zi@|D_y8bBpGQB$)|>AqmW#xY#V16w-rZ?yQ-PCCLc3><51Z{X506`cNC0 zxj8ux%xTCkX@tC9dIzXJIHYxpvlb8VI0u^-@*Ip~C)^A7@wPb;TDlFJEdyN5srUM( zl+lEQX{spZYtN>j07jTawW#~%rG50g0N=Nu3Rcyz3ay&jSk3&7pw^G4o;UY@#V<=t#ijTK45-1)v*pQT?43-DrI4uB zRcVr5hOhX_8+)~w7zcJM8YWn)STp_8s>#4%;*wTX=u{_D{HGp3Sya_(Q4QQKufD~L z2aukY=?M;0ykQnNXblJk&5wLEQpwb?@gyu4nG5x6qwNf#Rw{nPjcG`l_Qe-a10;SD zfy{mA$wQe+T_XqgC2MTdw?rn@kob@07zWMQd8?dI9W-i#Y)gYgg+@#-+cMe)53q0j zqX5EetB3jpOO!>jE0_v+bQLivl7lnllRRdH*t_XLwR_78z)j(50!WmZ&l+&1npI$L zH03#?tNv9eqLHg6V}8OJ;4}>ty4p&o-u%QsLFt@ku%S^2`nAa0WM{J?qlaWzB1B~k z9~U(il5xfL-Z7XC-q_{x$mKppDfjV~4hZ%FQ7^i@wF(SF1OW2Q-^k>;Gfo@is?5*z z#$RSk21qCRiBf1}GYd`Ec-Zd90i}Zpj8cgCI1EAC?_g>Am45O{^vKH#Lm}pKt;#Vn z1oZtYd57z7oH#|rHp0l2xnZ72n$`gQvR= zPxr7Aywp-P<{JEMbLKLE{Gpnt+wW~+DJukT^n}8Qxw|rVlRbY9gB=-+`1nfIVaw=( z19Bv5%xFK05m&wh7AOFyoGWJj8Vwt;<$woB?v+A3!yv$Nc5&~H*&)$bU~1WL5K6=_ zY>mDq3I=ys%|;SnMK`=jxV4ZK*)qTX$9Yhw?d9KL^lajGnI*W@R<(IBZF21r*LntP zlT}?QNe@0#a{@Kr6M-0{1Mg9DjLNKW}+(dG~K7 zKKQ-;;qPZwr^XT{!rY>hJjf>_Q9<)xUUj%Q1;;Z(iGdP($GMk-`d5Joq#=c4$^{UyjZ|nO=G9q7WKQbMxOs28IZlf%>tIHesmad&w0t@^wn|O|I3Ws zL>o298DAz^4_MefOqdetZ_fJ(a>rDW`{!F4KO5{F-1{e}Nf%_-d>m)~+@`REx=%f< zBzqio6`1s8aA1D?Qp))t4Kev1m{yTnW#6nTw9aNMCkW6x^dIeqt`^~6Wu&lVO3p)p za7g7%F1VCF(5rxtyP5q^s|guY^XkKhXcw-Q%X{kmY2njurKkx3QwV6G)W9QoXldX; zC`w}_bcF0)X{KDQ7$IgL^<-M6Fu`g+2j6y_8|9H~%Prb2D3HF|*bn#Zx5>v;VB#85 zIqb3vpld8tW)lje4l5UdwQq_&vi+)ZPhQa*G1jgk(2wL@I&WwZKjsVK<%_hPZ$c1< z!4Gu!aoDtkOM*hH)|zNfyW1*FO8_%K%)d&5xde@fBz!wbbcw8le;vW^Wu*zqPnQD* zq}qbZl9&3Z`_c0OA=Vm2oxQeg62jo4EVoB~?3a|d6}*#4)~ee}Z~plFd$=Js34p*ruIt#3*^-(u3o6~Aa0dj*Anq}Iv&%Ax74yo}(wkqw z0ZO2$0_vd1)7W*-Q0#f#2wU74bFKu#^I@wLC55^|2@r#3p3&_(PZx`0$>7OH^~1gh zcV2uT5x&smu@!HX_E||S2;9b(N^%u57w5OIEEJX*Gqq$Kn&~d)fYQ&5m^exLMldHHdzKsn*e|T z96dVo)L(BANB=Dq=@6xNfO+{(hkUoC{>OSb8{`wkm>CYv31Qitm>=2!Z}YW~bGFnx zpT?dfc75oWCIO5|fzSh}5BQ(w!g`n<^O9%$dDhK2gw<}eZj*b|&;&FKJgtm#iU5B! zvf=po7;IP*e5;NesP4-GG!5r`HD|*k3e#M+7NS^zCylznX?-Su;m(uqhfK%8i<%LK z`^=S8(MT8(^Y!j2|g}bmDu)_5sf&pn;T7B;7ui z=ep6!=|kX4h5iN)zFTsbrKO%bdG*B7&X6nNQC&fx2)u`nq-*D;lVc^y>Gd1DQO|!Y z8Pwa5DqPar%T+J!6Bdigb~A_+H%lGPnDDv(bV>~+ifk@$<|!;WoNEg;wkjD`>rKMg z|BqNBD;M5cD*w7+02Fu*Sx5_6@Tr_xuhVC0#;TA>>Kf2u7a$08u>tjSn(OZJnQaaF@hXX{>@kE83{4x8HCP=#)i? z{Zmu=^1KyS05qj_WzS?belzN$lYLo6yMJ~ZB#bCB63lAsZ7JyFu5GelwsN3(Ou zG)b0Okis+Y;j-ThWg!lag6l^og<}NqB)a7Je&B1Jdj8T>(esG!BmDgSHH1mM)j){D z+zOrD(`@IdAI=5=BOOoK8xEX&fmB1bhLizZ*#OpBb^0zCnd<^r&g)_XY#9uKxp{Q3 zsVj$g;*|D@i8eRaF9eW}sV5rzW^`V-7W5LtV-bhKYfs&tqTaAtR2bO7)+ z`-{!*vcYeN(Q$`~_oas4T_8YjNxehVAhNxlCFKs6Q*}d%z&S;VU^41D%VALuSD-Vw zz{rm*GzSO}w^$x&{;VVRWy`EtJ&Ksyn5xz!tHh<~Tn|y)t|U#BjAORpad0vk&9P2T zs}~HAYuuaj+QnHD=ugfT_5D+8w>GJER}x z?#t8uuy9|`!`%QuUJeqhgA`5BY1rM8ZrK6VtV~>L59aBcJy6|ozwI1KXWRq0Y^tHI z!3UQeWVI)CJ9&w^w=@$(M?pSLQBI7~2k@NZ;fcrJtTE+DnAPa%`v9uespc$u^`1Lf z$NjaeZZ;q_u5#2$Ry*e`4r2|aH+VEz@rP_I5lZmJ05@l_MMmZVq}A?ZrPc(WvV+tI zSDk_d(oJ3J3uPy z8tjhCa$^0Gi)$DoeK%&k(?Ax#&u|y;i%1*Iw7aEl*D98O6Uc|LOusN>cZNa>=d~l1 z1jjF=5{-r5UH9$qBw7K_gRTnFNe8F{gUWheVYZR$GV1QCY#k1cdblPbCrC0D21K~@>OFsStDsIk~_RY+lbhyOM zbE3=;ZYqHQOW)f@iiLvLW?Kd<=hMStWy8Rs4d`U=ZoG?6FO!{O__+IuDJRU6fePM1 zFoWH5-F(Q&=T?{fCaJH4*$#1FGq%SsW|WrD8oD$@z4eI#h4y1Biybv~YI4lR&dbiB z_wyWHkblmDqsp3HJbPt`4N(U_QVxPc+aYtBAdqU*Qe zqS0@1jUEPm(MoEI?<3Hbw_p5xuk)lMf!1YQb7q!8aO3j)r}LS*-&${2VX?1Ty)D}I z6nIpIF63Qnq{oRX{fwci#*?XE&N!z#%ymHv4U*iPi5#wW?&6@TpVuzep@vkYr!{z2 zJ#SX7?UD+jE6@<$YM^$lKRle;iavY^8jmxtRkgvlq@PA_jUyVjDu7B5LH3UIozWjq z)x%AqcWzoTb_ty9yPcB_cY#W-I>^jsWnj0|B(y*}Ojq>+^sh0@xvcV=5VkoQLpS#m zS+Q8*3+_g>!8wT}AY4??M;`6aoUvG@GUKKm<%rZ83HM{jCsB?=0N$Rz7)jZqqUqr; zDoO@_r_O31m~Tc%J8PmiF5-|WTL8|QMVbTkrhqcufSRJ$WN0Z_?EHPuVy|#nRMq?UCRdg__tMk+(_ftC}*V23n?!@b~qs= zjTompKxkpn0?wYs5yDWRVHJoBvy})0dPy}JSBrh9#b8>%$i|p~qdyOv}6uu^9OLkS|;_{n+0L%h?d32?!d! z8z!L{8AX9YPl{qE(c@G?Gi1~wBR{Qjf}N%R4ud?IK_B3VEve>)ps-fE(32Nl0jY{I zBGc-(c^Kr$?_&=+a_6WHE49CFa?3`#P(#}(Gd$*#=Q@aIndKgpKS$n|aQaWwfZ&5H z_Lad)UGaJVG14o6Qnz3W;n*#Dnu$65S*VX#rsq=$^vSe7CVnGUx4M)EogIH`Mi-y} zFk2m8zynaVv-K0LeKhlX@ucwNAN>Bt=}9N49I3$g5$Xc5_2y0}75G*swf*UqUO1+7 z$V^Jnh%_vMuvhtKCfc}O^gP2*w~_z`ieB`Aw0s1p&U}7?<;;p@1K`EtN!gW5r1F`A zYjsU%y6lH=+OA3X7N1s^L+c4ZD-(A24^NUe7%UPtc1J%Oh>ngDP8p?jj?Ho6Jg&ha z;oJHB?mA^#GQL~V_FNMYk8$VNZajWwcN^lEv9$q^i^#yzfU4}3jPTTQrxAv~g^E1h z@&o=nqBfh?{6z9A|A7wuk^^bKz(~pV9DHR>nF`xsioiPbQOMy~(x5D3BX$ZTrXb!H zStPsPDaT$Dp*y_lkGVHQ~k|{r%EL4~enE(X~GNUYDa@lC_@%6S*5zB>c405@r&+ zGZI&5Ga7ggwl_y7Rv{W8C@+>tz1j|MyME)rT*jp+oL-IhCG`}Ey>J0;l0RF*;r^sr z$9@+<$v?rj?D-h@1qY*Kb5+s`R|WGQ;`E0iv~AcLBjxd@Q=XE*Vpv;kJ|$SJh7UorO4q~5LbxWF79~NenJ7)C|49YSrQ2pz>GP4eB4!% zO5fv;>2kg9r6^SqHd$4CjKna=G;GhzJN%TjC_uFZf>U1}Doz)Q?d}}`#bDzUo*7#w z2r*g=3^uNnps3mT#PJ%9HKu5S;ag9_q(8Mp(cSY9I@b|bfZIF?Tun(F5m;XhG+0n0 z7K<-;Q*2KHqeA{uFIQWL3zZ>M-xyS!hH+ibNu0isrz;bWa@hc>;3KlPP1t-Z-OLHk+mk)!hm!d=N`>q2#*iBT_f{y*_25a`}@k)T|G70(YINA+x}eb{!@aA=y}qP;y-&lh4a~CUp^JIecL(* z;8!ao8CiG5Wq!?_8(AW6+%c6vDxU#4R^7+K$gz^4(-8OlKded@=)BB)bJ#=K*22TU zoxhPIkK%imnIF2nn^HsY0}-ci{I)%s`>P6aGv>~15tUh%!~o6Yo{6G{o6wL6DKg$7 zHlVV+ckBa;(F|26>ufh&pDYSj->*zP8kZw9CFCruBsV~ z7sU>jS8Qf;uC+Vlh|VSlvTAz7%MB8Iw;i}KPf>OB2*bC{3izzJl!m!vF0 z>dP6iSW=c=J`2OR;>+`h z+!=eaUa0vvFZ2Y`f+&2+#hZ4b*n8*L@|Nt1hm|$i<-jv;A>F6a7$G{g(6`o>Hl%++}WUba&l1RP}GK| z2Y;%(L_~Ql^B9-&_L1|$WO=d?sp+4bNWi){|5ocHq0*Aa+a60dWZw2t&3MiLL|R{% zahkSOAj|#47kAy=qzd>LQNK_1j$jJ$DeLPj%%x_M^fn_FBvB!h7ST&xE@07yUne57 zEZL3ycECISxi#-kIUCV6xSM5vG>&e;tv)`g)SMA4GaGMzumL8UN-lb0gFGV`AB4Gm z{rWE6e#%RAzFh1}jBC!-wL)ALP0IbDZGdZWQ|9 z6R~o-1-LJAxMP$VDgKT?##aG_&Xv|}6AI>6!RpzOFG_PVYOpAEhfw?bT+pxrqa8gM zr0^1N`YGQ{#9AC#XBP|>V8(o)=gCuYdC`z6!+sJ5R=|$p1NTga8>40$03W|Q8etCd zS?H!wCaUe=fNvsuYYwbCnQG@9T@>QQ(LmAbkH%ykv#B}DlLh?zXv;PBy?OQL&b=>J zAUg^mag_Bh6znOE`v3|vT%J)%$$3#KDog7{@_b-ocMyQ#&%jaMkBvH;iFp@Ks&!U^ z0qnomhRl`d4?B#{ukO%&L-;uwVcplX8eukn2cPV*q%~@iP6T-rZ(BsVtmJ2sz1Uuo z+wBP@&K!ti*SK1#>je5r2f^8PU)@~>{?lnJ)c5Z5?VhHm)g`#*yaiT-%Rsatd@PgE z6x_xI!RhIjj>W?>M0$8cIq{uhOGt2``$-sLksXz=XMoVc$m*% zJ018Ds7dQ36**G}PdImc)r(aWi~eMk;$qa+nmnk#Kgc1M9UoVR7nHnyej+6DCbnxV z`*#cNjkLfNsJ{H`Q~vjVI!H$5SE3UhR|UEN$sJ)V-`J;bk)bGDd09CY#sqp%(7nIYw!?1a!I-ks_G z*NeZe{@7Ao8cO;>b!Bz-JWLRa?lROQr{XM;oUPh^KE1g)U1%zer&b@#<+crfNwE_@ zsNA?$EJ&sk&1@a7zYeMaq5*k#Q=^J6_=5WVz+$gr{N(L zC>SRw1*y#gD|kFNTu51s;-7OoCJbq*yjG!LWQgNf5!XOXxN{#?H$fMVlaT&E9@o_bl` zU{4vWMG(?Q`wJSkGr$<|43nZ=Mmw^8`TiUxTJW5_u3H}1!UG_t zpZqv7KUrAA_j0T9{R+54t+HX|z{U&LYqtal z9|P3KCuGCiX7b8(LVzM+3Xnbn?fbPG3w+G=X=tLS)z(Z`7b>TZ za}HFSQ;+MC8E1ChetrZ1Z1!8Q8VW%xWk??2ogLUHZut)sS}r6mOtE9nSl*eM-|{Sz zI5q7M0YQSSqc2A#c=cY-j?>`0WXUKw`^#ayMGt{)gx+nN;!0QcBm+j!2{Fup3i9Uy z9%Xz?dsFBMmZCSlQ1SdO_+8t!tm;w52-(Uk$$HAoXtsVr5q!R6^r_ht1kNuv1syFl zKaMJp1r2Kz1Hl)`J}~>R-E6O1o8dMqPlO~di#jIQf@VbcSsTZjfu6(1tTMR$s&qqe6 zFDwuCJ#JsvUbOvMo`g=8&%js!cvb|#EfIkXJc!9~64r=zfltzS!knBhuv=Iks%z;f zlrVlIc&+v#OuoGmLf0{UouDmA&1C2XYOATj;#I@k{i1h6u0aAB~N@HxD zU@LZ-%H?Ss;WII%&`ZbJ4}jlD!d|E{3cZrm@GjPwkqDm&8t*0r^Aq~EylSIwxuNqj zMFkZpz8f_4>E!os^3<%0LW+;V&E zeX>2gM^TS`vLt0Do5!e_ujMN3Th$P0A*2Ew zD!JCwgfCXuph6wyegTb!Qa6y_XB@#{^3JZLILxj52L4&sZ0GG4s;&MHfuME0*!J<+ znOkHP@$CKNjor>kU-%W)nnR%f#+?%k}g=GJY^TZI{2_ zhRUgWbT!;K6gP=wr>ND#V+FrErPJxH(X||ZS+ifm&%D0!tE>s8@U$~VIcBhid)Lrj zW~d#DuXGeQrcr`rhZio0!Bjb6L~CJms7VLbj~6&kL&H0y@6Vo3wLsqA9IYz&x64@K zWUi&&Jn%1G{Y+@*|L2%?7xv^?;i?5Ae?)P+xf0!Iy8ut^{G9*8-esNLz~~Th8(&~> zT2MORXNj`U4Y_^+;ZCvthyNwY{speX^`|m$bZxDy;zB&E(IRx#Zo(8r#hLQ#{m#ES zguo%*$tHkNu6`0M4bzx*+f{{^2MQRYjk2l`s>zgaM$-)u5FG~0Z7aK|Ccfb3cVFi? z33uy6w@giEgvupTJQ(ExUwM2^eRjY0-MP{2-BCnm9tsw0m$n|+BowXO63gzW&W(h% zszWU5)sg%!FKYzZy}4OM(98sa`hr_i5)yJ@uTxGGw}Tf}-&8E^Q{z-6IKv`sSY6xR z-`Gl%b&0`-G0{ZQklS{S7BVhRXh{zvr(WqVMU$8qw@9xC$>bKLa$@h4R&!#mzKjbdj~?!S;U+pKx;ot% z@O(WquctH67V-liK29PiyUA%=H$e$|rwQGAd{3roFthOO)Z3Hc$$0BWyZjAe{@6nOWhoDS^zzR!psV&~9cy zhau^1bMqQ}DaqO8F;M=y*NItetSBG;-D%p>b2#yrv-=nCdc(J^-yo6roYfj0J9Fn(!~fC06aUraNiCmZwWS%D0?Ikc5^Uoeniqa;-)xGsQ{ z6zUc_#{i;_pIp?DcHgFNsToznlmW78X;FJ(iqJmhCksGZA)@oMQ2|+8p<8Mdo3Ovg zB^ZKLidwexNMHR7dgC0~WGV9j^#Pw#wBi!c1nqc(K+RGQ_7DDY3-X{ebgL{OBQ(rg zTggLP2furiH(mS6_U1&|!)rk)kWJ;Ro>%W)hIazkLKH0mIiTI!U26H8^ne6}IzsVeX z)QH$#8%+aCyL!RNS=P8R1|8QyMGf|&oU7zgLL2BiBGb0$w(1w zNj`B%veqp5KzJKhH|?REO{YmLXBMa9)T3gJQ2wy{VxVdV9pu9D;PY#xigt5D1)WkB zgDj&xX_ewlmkk z%^dl&CD>}5C!FUHKbG)s+R$7+e4nLso3y4WNJm`fmNV+(ez@IU&@iVrM|pp)du-h* z_u5e_N1UWJoksG=gO~L1(#{vgHZU;~T*gPLp*ps3@|{xoVxrMervP!$W&`52;2$5$ zq$aR2P4rl<|HO?w^+!99no9UF1O*ykmw_rVC*C`C^|ZKA>AaXb2pe<~s5G%3nGYu4 zBI?%=@dBrD!^P)NJUCp=K$P>Iwe*kglFOF5blW~Jn|4oD(@8F#7^3*02Jy|-TBWwZ>|_d5JrfI zZgZ2V{jfgZH4nL%*Amr_{OOp$y2|IjY$fAn3LxY>Ocq$;K1)vsP+nM$DSnI8St!DI z+7$+~(p4kd6-TYEFHCRk5OcG{Q~|m~euqh@Xh!GJWBewPboU7iyL+H|ucg&hAan- zR$JutCjxSmKk%X}I#*C%TAXLwd?Z>+yV)qD*kuXMTp1HGh@AQm-1Zf*XKe> z`(+nj>k?IQ^NqxoJ^*9_!}h z=tis<*sje(I&==T83~YSj*O;(SW$IH+80oz=3G!{bE)HQDkUO3-2;uc!7TtLrYeC7 zd)nsdR-~M7w0$JX+Gf=^E$zPu$+FCaxUjg*SrmjQ9>xTs{xl|M*l2;$bg!lm%#D;b z-XvhNf4DI!li8aVW56s5*9zT3f;^Od;Gu~jznxX0PQbKa-xa@(ijs?GfqBt9vC2r=|@OqsAjk9jzj_52wQ5 z)VK>n*0pd~rt3)m$tgFLZDM+n`Bbj$du;7!?y13y_UbHTP)?62k00R=Efh8C=Y#|mT( znR?oH0An;lIUW+ORV)`8ZYqlE14E52UYC{ERWe(`t7Gp%p%vV#n(1Z4upaRsntsYs zxx?|-cflCNWEqgTSOtK^r+!H;iUCgtrs_`?D}=xK8B|W%JR)M7W(J~VtKG@VSX4## z#Q-8qVhh2;+SX+R!pn4C`Ev)|;j;-+8WCDjscWlxu%N zLFZNBr(O61nDWmP%n^;&msEhaM(x4wq5BPCtC@~}C(V)-H905)rN?$_3i~-~7*6D0 z9iC{%WpOvV{i#L`KnCl=P&{=-kZ6=k(bLdS`mGX4Fk`mF6Xj3&d-kD+@Djdh#c;ez z^7|FY%zdXgnp6PoWCDB{q|0>5q}zzQc&{SqUI7++*M9Ux! zUPWXNJi}r9`xz0uJRtpA`w~rDP2OQz#!?Fbob0CB3>)X|wylOMK2j57Hg0!+`A8qA zy09CbDj2Hxh0e9U5#To7(>#I~%!N1#I-ym^v_+8jCpRyt;j=1!#H^vi3%inHq#f|) z`YRQWl-Q6o!f$$#UIe#fYIudB#H%0cUFu)n2vU@4MQT67VsFOJ^zqj ztilw11Az7kQq?J(*A$Chs0kLivigt4Nnsh5bRBzs<6k{t!$>=Y0kT6sTF5_-A9ZwA zz(tpq0`UJ2ZJaB;B^#RRj}*rwKV3PbIG#tm+&@!U7hA5gwcyu2&1=_h22CH!*36)j znDGQ7(pD8m@Mk|(Y5#qYT@~{u)^mjIb`0-8Wh^1a1RL3)E^{n+M<+r_(309$CB3oi zD7LjI2Ktuq)8x9oj>+A^o1LZO_X9{N9Y} z8&9;*nv@SzcmA^Xk$;))uXsVO)%x_s&Xn4?zl5$29x;}}zZ3xM3Rao6bE~UnNzupx zu&C6{XDXBq?kd>)0wabURtu|%*hZimFSi;-!?6@}tHrxGHUZcOG@_H^1HSwt>c=g% zw!`EaNoDq$be$gUBT(qgz>|lC-fgGstB6Ap*ArO334{xvyUMuP>qb*`eRi1ATIt0K zOuq+QW;HMj-*&?5e4WYYObLyc1r~k_zxZ38Gn8M_iH#?Rh! zMokuFZ6%sDM3{3xxyFe}oFWjPpK7$C7ugxSc(izq023=Vp69I@%#~uoZN?4i3ZV+P z*@OuYT1Y=}AaW{9ePFVnyqYTvf(=oXpUj5-`$VzSgaNTXW=w~Ca6>+Y3bnCWJbAYP z!=1)ft5QhJeKUMj9TM_dFNKXP>`agAMT>qN%bXxr;N+4v3(&4!{rN@6U-JpkpX*+* z`LCS~0{?Vo4FSKhroGvaMDxp;@?l$&p9WqSU3A|ejSTstJMVUi;g*ta8W!>_{r?bs zIdQ%3mWe*au`goW^njD{ky+-(p>7B8T$_8IRmvXv3Xt6!=V!udZE~dc@*+pivo0&r zuNX$^FR}o|?_o0+bNVpJ784V4K}T{33`#%fwWW$Cr|p?~71&aA)E4#~TfAj>)!;=y zM>uO|0pelziH*zdQj1V@2?-rD!L+|97Xeur>LqoI-MkM6SY-j_rWg4bVH~ zuZ})(`Sv3Eytwm{yCGCY(S6?fC*k13IxD?mV>1jkhapLv$L$z<{5%LNa;Q;{44)t6 zgk{{Hv25>b@n9ww$0Vv9I>XaRdqPs+ozbwrjM54Bf?XWdySS1doV8S z1t-t-Ahp)*&L_qP7x?=4wpm13pgpT39JptD8+!}mq#!ZKkYBU#46W9A0~SvC_~*iG z6+B;xrqfwLuYMaKdPAOcLYKcS-FKRnxp$9&|1LDp?JFJn6j#7XXKw3A z3rYJKX!heGp;x}w+gFW!D6uGOQLD1XG=gzT^U~X1p<9!X2ALB+-*W6cie5I6kWh8; z?<@n-;u#C&JOr%P;gPp!kX9~oenNg%tJ?zhrCcEA+yw$Q;t2&@+~wBh)a@vP=9<3P zM}u>?{-?{V>;EV@#)Kzn3Y9jyu@rZJv^bNT&v*ey6vn0Qv24NI&%r>);_u*t6>-Mv zu)^)v>hzk6uxhRA1JiE)EsIei++bm7BMz%nIQw@%(~0-Ay_M9(+{l&6)4n`Hp1aIm2} zdK#RiK=sAcEl=Vy%&d->B~ra{U`m+U=`d^TjZyt$Pj0Mif@6)+$zK=t6)z#a8#}_@ z1;%sH-C!c$O0i<3C~j-Dd&9R%<6zJLrIF;gGM~gCgu3gg%7HE_d_SB7bGwnc#0K&g z@=>PF;X)VNZ7#U#ia(ng^h>Va%KiLrQAccX5!8nUMGd=yccoG36f`&kttEd-#7KM$ zmdhkC2hb7=1>%~n!F>}I@^lvleH1-kAJnm*R&kHRj_K#PG)q>@zMmIFjOd>V4d`Ro z=*s9m5}9#>xu4+*U=*l~I$q-wTpa9o@T-_zkLJ>k4+O5=^Zt+0Q%;xjl(E6fZ%xNT zw*<+a$F3$gFO-6H`wZ{5McFho|LE=9@k20bQcw!0=*;suJ37hJgvI21^G?Zcct^cR zDXvW`w8YocONP-Ksi5Rssob2g86kdM5rGHCQKEKLiqKz_wj!8;dt!BYb+mfLA8wkV z28O|9x?&^zt|de4j88VEWN}{tz6^JJ1c&BhPP@{Z9119>Bwc8i@Qw`pbL^V9qQhFH zjP?B01a#Mw+AAgZd@f{ zIY~k^;-GkzN6t*L>fl=0swmGE9k1Nxyt``{PRbz=Oj$}*7+Y$vNK_qUP>n1}N^Hx? z&411Hc2Kg-6gFA6IYZrUcZrU|^;2?qHy5aVc^p}Dyn6;L576Q(oJ*wVz-l+r$fISh>EdUF6{X#v|fqtu%`T}{E zrX#+Oc>q7a=z)F`0UZ3oSo+g;w-lk9vA<(nSC$VUHknaZ;ymfaU}`AN;>mTOM&*C{^b=y%fW7q5g*8nZFDDfdC4J4 zq6nu+);=P~``_o>-XGhpmqe1hq$F#8t*ac!$q;0}6_|xFqi1QIg@cX3RkrL`_PWv* ziJ44a2?JRliBUH-mr<3-z6GOK?v3d_{y07!{UvsfAC7*Pjd3_m}>hL z+_X%G{#%jiy+V{Z#UG7kZoaZaO1(iBEid$PuYQ2&LuI0;6pm?ku zZB04b$c=}kOr|n;LPSB9mbsuGRNqbCTdP_qPXktxb#r?6~W z?`kvk5H?UXG3g~E@x-Nts=MoJZ9AJlP!iAlXj;g_fbPzBp%HTX41MKsOQyyF{7m0&GS*m)rUFVNMqG&@pWjE95;GV=f;$0QgAsIUbcN96%;cSQWF#OEu>CGI2^oEgRf@sORs*AcmZV+5 z3GDDrjH~Vvr5#lQc(MY_=BU`7wS;#XjH*9N9IB{v!twFebi1$^oBJorTL==bO3Q?$ z1b@!siW!A!gGlMS-0hSLUS3i>0;St$!2H#D^1%s5Ep;iL3^7#diBDesv@EvO>bU0a zMIZuuG19~BL1@wqGN8$rORDEX(dM8UFJJs|b6959D#DZXAdBEVfHdc2<1aZQ@00kl zae+tqhz~*YU=6W<2(wiRh9`_TM~3DK?pT`|U&JuSit>8g-s+RdyyAn?%^R@ym);;J z?Q>pEvn#ENERahPng}fMOj^r#L8p*Ho}~ghv@zM4A$MmoFpofzNi?H~ZAyDmS$Id6 zzE=k!l*DQryM54D`@y0+s?L~F?cMwi8rbh@eTGY(VusVIg4m-N>euT{-0l~2!LcG6 zqxvDmFA|0t%@I?=0!1+LCwM!=ZtTFT2R7Qed^j*cr`n}q05Qj|LG2vfZ=6OY*Y-jS z9UD8w4{B;8r|Bk}*|Y^wX&A2ln($!xAo{-+#KZxsT$alky{;iNFDA+uTOrTqM3s93 z-#F>Y5r*@0Pf^p`7j) zE+FL)iqW202Qm8%pOR`4xHvp#DGRQMV%y!qe_#(AQSp_OHbVjZXZb<-S6 z^%`!hsGYN1?H%e|GOTIH&JdXD8cR!QeB0|_Hl(s7X&~l>^_>_Su|AieFZto_*S}cv zkc`U{nI4{NI_N(b^(LAS;QqV(O7G1kU?X{;)U+pa&Nq&I~ zXE_%UiWJwkm74?{S;BD?cY~uBMGwZq%ip8q7fX%V(zBg?3DC)hBie=%{Mn8P>`g-N3I(#c!5nA;@FfIK`*d3oG>$ z>v-?9O(uN##S#xsPE}dgZ$k^M62$kV>sc5 zd}c4ob@iWb8tW%?Ak?u`hZav-5GI^l5AxCdTZR(BY}Yc+?T=T4&VF2X;MsjCefQ9^7~FU*A9q zX-YX{-|5BKP9x{7Hmabl>z#q`yW}i`cY8}Gg@WdPx-nti99v}xWT!pyeIyemoh?}+j)K-;CCU<_UUI~R{R`pYy82F*IQO+FMWE` znGPZw*U^59_4Hn>Y1c1Yx~yR?gwP|oiyePR^ll{JMxG(1Nsj+6KS{y`^%6 zBa)U%k#zM`*$%i?m(Zxfk^CTZ+Qt3^8u8}VDaOvUMynA6_yOWYXxh9ED6E?`TOT3Y zy!Ws7X9qvpW~iN2k1uut0MB+EJ=}ukFYzP64kEy}acc1ff*T+>;dae)EV!5~v~)QS zk{&{eji~55s8V}{=u$;Fx$+@vN87>ogvF6y>46Kfo%vnRj=IH>$CGBDmi?znkq}Xu=;BV zgOND^R`{%=?5>ySqG2J?W?#;7VrMU4pB#gA@sqvzvr_!sS5 z2-LS)sp?;pEighH`IIqVMWJ2wqD&5cEJE z3^9;JF?J^$H<#NTlI;R3KUWFz6Wc_Lhs3A$MO{ahE+}JIywf7czasVcjm+ zy8?;KrD)twBG#yC9(~?aF@84Oc$$C5Z@;kkW*9TJ-UCCp&NbRE$80S+I7y+ZfkqiaU3UUm1&+Px(LswQyraJq@p z;SZIzmW-2jBYYKrv2WYF^D=5^D3kW|<)1l@=6Z`_1T?83>5Hj;#Tkaw$;0#kxT1|8 zH}p1<(b$_H)myZP)&GdlTh_+I&r}pmk-ri3H1{zw0kQD*B{Oma`VWm3S8?h? zb+3K4H?NgyaVrW{z}{asf#rl9^`qO`e?)L!(Oani!HDxZfkTM(twjY7^_*l|wT8qHQ(w7!k@4^zLm3An?A6{%RQ``|J;srK&u@~7_tm{b^Clnx61#+$5)#NYx(bVQEsR4t z<#%r)uaK2~regj{MiTKblQ0g(RW8q}qPDD~i&bQS@{W8KHwxiRp?VGTo|qFAV=Dcd z_6g>Q*R@Wi1jT~lmUB=+W**ev`x$*GYt z&CWWp^b`O>SM`;gX4}D5_8F3kl38gKxug{Y z=hn5%%;7Bdh3}-7p{)0YA4YS`S|Ul~?*d*#Sz}y=9O?`Wrt17|So|d6^Af)PtSD#U1i2uTJt4#8BrCCexVbftMRxEQ6TWhl3s5!n-#`RO@cx>zXypKmH`m zuF>2_(OHGw6{E%jqeLGU|DSbRf)UH<8}UG$uOdFQL*aTx@0KyHP0%2qSS?!}fP3b| zRvIkY6(;&EfEo{xeoo)(~-XRfG00 zA63(@>rbR#+BiQL>L(u3a+^^Z9RU?%elxQ59SYP$FCI6=dZ~k${6B#`HtUq0P?vKE zlepN(!hczlh74;}#}Wj2mNVzam8;klCZ0@KE;o*-YPs}Ncbp2P_~=iI!cwGs56E>X z<1&^Q2etN0MQjIDybnRaNiNuL9XWj+LGXub&aC4!oGl?p#^YbSzU{U9F8)*f-C#bE zYO#(^oA1LfTp-Rb(o>Rn@?re;X8{~kmhl?BFT%M)=-~JIa+07R?X?vzjND@zJQ?&f z|GA&h5Qya|y4fMRcP=Tf%8?8KEuZ66y^D#)V-M|+DlyQ;WK;X;r0Wv7Cu>fW-;hoz zbNN!<`g7oMiEAPqOvnSIq_ivfu1|Dilz8^ie_wKoXHE9Gz95bMOp?dkY=JiY?7B4b z57N@>DGG416G?>ue6da6MpmPHm$1_cw*%4jmgj0w?Ffw4!9YB~o0U6D@-GFGCW#-H(j$+~`wICtv^RnE9w{xui`nZ@L0sd?Bw=bj z`Uzd|O$3N}xjFRsh@;bj7D~a$e5b`=Mz2)tqwor(x8oC4Jndz46ou0gNP#n^2 z1rA%g+e~n@(V$_MSx8&5JqKdZ+>X^RU!AumOzuw0lV8$-l~rN*8Z+iF>(sX+bur3K z@?ro264$;}X_1fPy6>bu?F&nDUF9urOiuCoL--VqNetggCCl!M-yBE~+KSH}<#O=; z^TD(_KL*5xSyKhRjBz_+zx0$Rcd*?yI*Slh7OxsupSKNb4f3*oZPM=6;yaP{&n;H{ z?Kzhqv}U*GDdq4eGWVlWK=eSGIDzHt&&H6oZ?cIhUO|0OK|zU^)fv z@~hNByHc-RnJ`*ER~QMAsijr~mrDsuxT;=tLu%4+ZGUi)d9+26<^9b@?O~u&uyc~% z`bPVczY(j=zcM|ZGxg_65OdM7aGHjjKL)zI^_!k0APrWr_mt&GKSTInJegkj>7GL1 zUDNi5z=ja16e)$^lI|Ieg=etDZymf@E$NIjCaLv3u+>R*JfF(3z0lB7BsWN!h05SG zSqhW3%KO=PI8QwXN&Zd}WJ_gBbD1yrK4!ES>2*BPRSI6(E6#^hv%;U?Te)4b&GG+tJCHd?onKha2 z;DM=YGzJ-0+1T8e0Kh|%)dXEVt5}H*o-w?}F;q3THP5w=+Z^&fJFl%p&U?;*Z1K-* zIdxE2)}VV4DI=Hp%3T5YStyO!OmSdz9gTtk^Fi7wm)RHZWp=1xXY3@>S++Z=Got$x zb)3MrwGpj7aAD-}EMP=NhN%BYL$*-QxtkuwT!^UZ0__)KY6Y4k!A>(itm!4h+Bt!J z4wdPXRSV7JN2e6w7{xpeX%)J?7Kz`SrRo+Q?O}kk+f{fT^+v*^yZRAXo+f%tU6Xwvhk$=}#TTS&J}BDq^zQ3T651e41z*N+VN4g(@- z{E=j|l{Dty?x&W3wJb6ixla1$@UOcHv~C}PR!2u39xo}8RDr%NHnx2To|RCCAaGfE zV(OxQ30rxke{3Ddu1kR3=B_zG1)77~IkJA9OqsZcYH%b8yv#mr?*Rga4M8>>D!ZJTO>#&4G}?V@AAy@;m3x)*Jh|fqBC!mgko(+-PfhizQ}9X(1B%4?$TAEvE}p%K;}2=Jx+}cvPAli@ z6zVLTXP?TJ_wf)f16oh~f<3rk!nmpBa$ z-=~6@`G?hIZZr&2uZhf;yb`9%J2pO8Q!9|FI}`ar`cw}+_5k35 z6FgNG4)(IfI~n6n`H=j~2&5Y$)#r%{!l(VN?OkhTuPxS>j;ToG8FF!uLcU#q%52U;it#7cloUS}FpPn&@;Qc9%^2aRd_F%Vrr!!=a7bIxmFHHp zEVeWRm~Yw0k;2-DyotY%;`}3K)LxZOTLRRwL>;W&iKv1sf&;g)r z{}u`Yo9Ts3l;w=|VbCyAmA$|dx9!Tm24>XawS4L|fv~5LPg{mY1F>!j^CzLRtyG$B ziRljKGq-wV5SqcwpAh#~`0@>8UzNbSg%>7J126tI!Rowl7&Nv28ne65qni*wiZo?V zIE01ySLD}id9y#RA}WF8zyhE^RTw?gNVyJTr*LCQfS%hhw0Hc@H3iY~hN^dZfT*Xp zVR&P`yt;~DM??OfbcKvIC6n>}p3p{$A=yPf>##shDN|^?O~X_0(E}p)5d+Vls;DmD5jZ#g`rO zL*|^kXv4xo1vto(8wLLg3{{6$GWhoyyuqnQ8pQm0>fXfQeo`1q8qg3*Uepy0dxX4X`t=A7F8dlB9l4nsGN~M1k-% z);hSp5!6RKbSq2cf|Z}~O>TT#6Fb$qd>wXY>g#mws$-7m4JW5_3l;O1yjNks!3kfc z>k0c83eXx+t>93KA`p+<`ZKNS0@?FgJy{NGZvP2!wKJq@KX-1()MOW)zOQuFgX7sA z%hY>^7;yM5)AhM7bx;Iolc(<30W-#e8k<02KS=jnBQ zRWnqF-(p?puw=Z7n*9`GHop^tY1B-=f|k$Vv!sJg3J%TD3v3R{Bm8{Iy(v`HbvU&J z?axxgOw4Y#OQVkjdz}@D@lk*qE7VLzHD8?jMYs&{jrH*>()*GQ&08%(qk<++eNFo% z7stt*`hp!Xt6fsH^bTx5Fw6M#&R&bq3nAQY26hhIpbDVrj*tbGW*#A?v~mg#!^90& z4az@+0x0S8Buu^XulqKfI5!+gLnJI_Xr|beIPWmGV3fscnP9Cs6 z634k<@|xvw=)g;575`zrzm#-0i23ZlP!7OZ-qz(Q>UW9@qF#4ZONPA-zdq}QHgtB$ z@miC|3J2*jAUSkGc48&iZvYA_DY>_Dq{|m%ud;zkus<1p2(A)C`1OO|GvXsRnA{A+oo|vY&a!;7l zOmxJnkAF%9fKY%CMX!EXIf`TpFdMp;wI*uEILnQz-Tuy&F{C`_hM7Z1{g(N?-&faLIX=<$SLAa5Yua7UaCHk;+h zv`Bb1Ef`$de=B45DkSHCvpGj{!CJOOyoz1_%)ueY!Js*+q?3l^s>gByO+T{6<>b^)<%pyz9KdQ?4tTm81k8TE08(7mq)i)U?W1jXS|$KG)s5n;VaZX1*I}H%R7+ zdzTGrX!8ARCXqHjUEoJ1F-}nezpb#?R|V+mSbL%VXhXzXhBQmhQ>Hqo*MqL`uDY-` zzy>#s7!$S6lp~sw(H{T>yDBVrv%65=(|Q{@OpUu>bYpBc{l@{^PPK2hQUnJtEZx>E;OhIVZt=C&k(!jMsUb4%UStlxvg@Lw&CFBQJIq{`2 z>;T&Qt1MjsN#Ve4rtJpA4|?-UMB76A4qvhaM>Qa54kNHjHXdq1KZ|gw4Be8+@@kh9 zOk3YlX$j|!$|&z@wL=9x#LCv=hOmkFMX?^h`k$ak;l^^1iTEepXAC(SeG2 z-lWs#%xOVoT^f+5*&sf9w8QBLdf_`KuRoTt0Q0fyVBtt$e6vN0ryIZcD1DxA z?gqb2O_zu#aV1+h^Pb@B&>Q`gs9jHXU-1SjYMP-h6Bc76MZSniWK}5`9862oD4{5(+*p+m z>T%z0Ot`uM{=#xnz?|{Xi?kGQo}##cmc=qA%Rlh-;PZ#~wXx*bmSi8>K*Ug-lN&|g z!yj%??zt#nmkgX!^P6a$k8kUun(;Y3OKMxr>TAgg30-T#&h_&l* z3wVLMR(sM53pE05hr zd6|RZRm}hUI?nU6`;2n4>)P5}{+_0h?J|v+M}O2!A3Nd~SXxt}+n(?F^17dX8LXYh zvMatfq`sbRDxukS6ECEhoI1osk8J6&0Kus?#}*D--H2zoks5cR@u!!W(teF#IL4+L zZg{0&FW~q~kIy2(+({R@0Q8h`4CRsZ(Djq=JX(Iz4R!8si{uqjP-bw)PplqAAW5V+ z@L+9z#Knj~=mkpEh}Wng6OmJWINouTA@G}uVxA-f1Ax|z&^m+J{gvr^Cn0eEJo$w` zZ@qa~sT)<^m%WwojD|9N%&GwXZd#`bccb3+E>3}mMcfZ)Iu7uvJ9hs*KfPhcU&!5g zHSj2to}ZStvi5>QmaOlPIuVEA52C$$yEZ6FwogzHwM3RTwp95RPnE@13`pB&H-bmC zG(XgG(?=q@Wjq^gLWvDmtx{FBW#U9-5El7d`jh&k$p|?Jh}Znx>DgQK-ffi_wz4{n zc~~y0$=a20jI{Ih*;^kU@TgpsquU|SGsa>zSWcA{ z>aPj#0yY>({h{$D9F>_(R-K}HD36AE@Bd^gZ% zq4^_4WuS|U?&A5Fx}u&#Y>RYc?V7&a@ldk=ElOLG=Ba&bNwa2&$AN!R+r9M4WIqB_ z#;YthzRoSlKmPj9ye(&{2=8ixvt9PgT5>IK>I$Tw*~R^a@6^gh(O^vP%8_|1xdgsk zxKc7ZoTqblC_IT1vn+70k{8s0)7;oD#nL_DL_0Bgm0#tcYpPUfVY&Rp>}J*dTb6X0~RU@W(or5`IF4yos0f#-R_bxh9`2e+K~P=NNy2m!I- z>5c)J1*04T8JMF1ah4>!b;HK;IbF<~7Hk@1mz*mziTs`v3s{{{^(Sr{Kh}N{Pk9Eu z|H}na{oFUfDG-N7MOBaaNq{^@XOfLgS^SUJr}n(h=#u>rfD`bYcB52-rz z0mUeK#M2=F-NZ{-AZ<7*pTH0XKZpGAXN8ci*c`%}_XxI`-3PB>nEI)q_@t+kGm9*0 z=kFf=uB5rItI-n_6?NG%)e_|!D|)@vFofmjH7X%UiewW1&BcVAEb#I;{f{=nzZV90 z>iMe=NTozDMWMAahWY`8s=-m~i}#`NrYY#82gvdMYs#k)c?+w&YBLdLEnZkh4x5Yp z3+`~TuMF%-n1&AVJ8bvi)n7C(R)IyZ!}ujL{2!SRf>Zw=Y3(JDguUL~ZK1efvn2q0M0=OeY{H{*Nx zFIO#P)Ow0P#dyrmmngDmHaZ~iLfZ%PVN<|>0(~(j8M&~}J=ID>&~wN>_i<0tFq)P_ zyxf%bhh@rT(`~Dt4DG@Gyb(AyOd* z7m*#)TQ?5YI6Wq8ayV_eFZT*}dDA38HbyHeSFPX<;2Z zHkJBs+9r}}&4L)bpVu#?CakG?N>$`6wx39!+ec_=72ENNTa$h3+~-V)L1B#)x1)2^ zIuOX1;LN8~SnD*4$+Mp{bIh$PXxx$v)doQA%igoX_%-U^9>A!pQ>e1%Bw8QO`Z zi>Q_yhr~8a{C$03vRs^PEMO#RqRID!2-hS)>Qoghaqi%OGud z*z%tFw}yc3DTt!zU&QqK z!@e9)kwm8=lSvG98UYy;4T;DK5LK-$8qi-5FcRV|FE;32wun*2;Tn2xn`wJX+Bn*? zg4~+f!qV-&@qY#3X&QQKy?! z;B91GZ(Nf%2=Omkw$u|c_`Sm}V!0=q(A6Ui2g`S_C-Hkx!XDs_a~|7=m)0X$ui7T+ zuXJ7<%oSW})CPWQn4ED}c>jPu6PTp)Ocn%(QW#u#R?hQ!d2Jfeg2dw%10)fQVG_h! zO)7Es?^H6Ax6eh}?<21~4hpPhRQ%zgBOrvNU^Z@?0RxmAO)CMtkFyK&3}-uz#Dl6r z&3>Eee};N>d*29JC zbjsxo7FMmPrw*2$GEGfl?>Eh~?JSR~iXVAWfWcCvadu&!>JbAFD8@V6Z>f^eXKeJK z7*KJQt2_g)tfyAUxn7?H; z$chVQO(6eGgOROD-=GVOZNfG73`O0+8 zX&O~89aHH`u`>rPat|7dt!pV)Dx>9f{efPp$Q&s{0S%f1`0hV;Y@RQ%dUzo+cN4{b zb{I=&QHLUbMrXcef+!Xc{bs>|fXr{C{*;c=?%&yF{|8@#&gV7EoE~_zcW^mO-D>S( zzLb1pJ5H1%OCx2zF>2ke9ewLQMf#%HmuaMH+6U;W)V+mI$hwCDbP3S1rjO{G<%L@g z?M3SDG^4sz(~|1Q$|N@{X6*8%Zt4UmqpMW*Hbg{ zN3#GX>Rx6yA8CkkoUN@HVxr(Ah>K0T#OxS9OBIkIEDrTcej?nGy9$oI@%DDzM$Aa~ z?0pQ<-(q08!;}VRvW3`~rMZO8t~{@=R%c;uW`IrV4v4;BIBiJjG{(CZK+4^dHE z(ZHJoJgy&H%_^Wo+22#xifgqf-w)l#P<4?S_}mrYAcO-G2j44~&X^l6f8Ww|)xLYH za{snVTNVhbPj+@_Xh4husf(eOjCAg}J7IsC5Qf(`X~opWgcCg?Y^&aoEFGZ9wCv+6 ziT(5-B0pz;m*8cMmMu=#b=h zYweMOwQdmgo`)qe(F1_)#>$yfA|%0oIrXbw2w1a}N9_QNdtkyx+L(kpCA`Oz61@>{ zsQMO`pkc=3;BLM(ge#@KLvR>0+wrNMUNsSq&pRwDk3veVV)yRz#raOumryT!XFAQs z6@K2;11(ndoN{l`NZI*ogx7Pf4lmEcF8?#YHZ_KF5UaqzTb?#NvZPNQ zlG4tmz>R_)NJ63eZW&S;ClWJh%Dl{dy_Pscty|A3ta5-DPJhpKnl`6M^$0OI#(1i7 z%({B&;Gq$3XQO)sUa&wnF@R~m*35Y4!V;?a z8n8o#Cl&@p`pXnS*0?7hOP-qxtV9_$PGE*Le&g6p%##{$_(6&3C%e1~hyEc}N8yTr zr9BkbN?}44z!73G&wb}eqqIlobkqm<@408%Te)PY-;2XkT`MoZ=1pjRBTEs|qtEFW z3qLHZE>R88tlA2__7%*64AxD`f5Pa%y`28h(f4u#Me^(IwpybIJQowhrgl?=+HyD{ zEnE`|dJ^i1_Xod8RcpP_7Pio`7c&juJ8ozAjD#&zxU>N}e?y(0S*4pF8(QS(Il}_^ z9SiUZOkAL#OeIyE-DR1)TP-zp)9;L1NJ+1ns!_czW^OTRgPZ`)N+i(QRk^?gLO)+( zhg&o?ICMVdNdjHz(y_F4q%qh?$Lo)}okp3Om^LN|=Rp=y-7i4^`CYoC*OPDnqt z*{i@=THE5~%_0AOvoliq9Ot|XCbGNB- zFBerEu*j959|}*W^nDpi1e&*8`IPhUmKvzmcu?fMDEHqK|6nIXx>rnm^&jdOnf_xw11yt+ZbPeNk+PlOr2R;LmF7w*QVyOWkKDkVe z1aD9xZJAZZIx%@%=q{tqa^??De}q;*Y(Tm_a}@@mJarM~J>$(}5=Hs!56HQFMK=yV zZ^`wu#uRH$5vm$&(NA{>T!NG9sexE7X^T`w|9nkww!jkKz_ds-`!pP)oW)n@{0@cd z1J%i0gXl0|>X}PAI&i3tpfcN6&aJDK$hDY$OYloc@21Dt_s^@ za+}Kclgp{WypuhxYfk_0Q%XpqPwqCz%hIllJ)^%REA2GI4Jk_3 z@CqPNkSz^&m55arG)3rQH`?hgPb-G21mAqLRi91C&f~4@8sV4D^uC-*w)OsZIwM@g ziUJV{2nh903|AP0g!7w^ba7tU z#>3vZ9L989l)8}+sJ%!o{<`uV)})(wY%e6Se))#Q4}}h0P(M&9B!v-g__PTtxA~>K zl}m0YyU=MPZ1}j?fx+2txYtxbimVBtJmwool?N|4B zJO0vS!AtSW9(5LW`@Jg|_e>?PO+Ht4gGNApGt=Wt1gywBc8UR)M$(z+yHS_ciIoqv8yzwdqL}D!1 zkeW5yyF^9B1YFmSEqq%7+sap6TQ=jgA1pz}vA{qADZd@w5)kQ+mDNO>Mp!Be)+r^| zbIT~o1an#@0?$C9fDpncGJ=!c{EOS6f?K@z>p|Sd#4$A0=_Nw{gBFxlP#`!WVR5fmFUT>%-FezApzRg`f{5A?e{6`IyM)hhPc>5# zW}{O5+zqz6GSBpryN4R!t-x44jXO8>?srU#b2Pf&giiVoiCg_MiwgEo;lI%hP{#)t zb|n1`oEFppGdmN^eH?zj|i@In4qTf zThTl#jE!G>>}^!44#zx^HFJ$tE!^nmJUMO!0JA^Exx+`UOWecKjw1NI8pl5lBC-nn z%XobXST;_)Trq~UT%5H4{$=v;J2YXHf!p3p6k~RUcJ@r#RgL&CBtBs2vJ7_`Zsax z|7G#!B zsq65hXcsKRexC?lAGxuhnUUUbB5hNzzLX_sUkRG}zNufekfZ{gG>`2x$0)t;_Zgq7 zkv5fnB;TYLe5I7Z85o{X*GC)Rq*Bc|$s^2LT%-WS6?Xr->E|1PbgO_#8R9K1ZRbG! ziBxIF$=X%HwAqh(<4V~_XlJ5G$4j}Z5M7JfQfL=&Gt$JB-w2$$Mtz@x?SD}7u)s02 zYQhmG{)b&xpi_Zqk8*$-n-S<1gI*Kv)xA$3036bH%-ul5Mi1Q)lzLfOU+kVW`b*pX!a(m6@TtQ3AmQQDLoTq8% zL_#;*-mw~$iiexcw~Z1*Aoa6cr8EPx=rSZu$q9W2sx4pJi_Bu7%BNYf`(dcFhNuFg zscXX0oy0!(xZlrk2FVV^j~6);&SMHka6F27!%(y#8ao{s$>KYZGgHOBv}|`uk$1!@ z|JT4?uk6%u7`~mnRCr*uaB1T;GchN7Bih*sdW}C#jlJQXFLq(#^o{{YLLJX9vX0%M zACuS)a>7|@R2)ud))=-Fi({lWLSt~Uhfhj5DQe57pfKs7ascw@Y%%&Y9>y8Ce8Q#V z&grSDUtcE6B_Rtdy}E#(IeKuHWP6mwM==*d{A&gnTUjIoe(!1UE zwt0;^;D5LE-J9+5Gj80##u*%mad814_6t+`HLjKieEXm^l3p?$V*_kAL6c3k=qoIie|X%QF(OcE9D@ivs`4Em{n0 z+Fu=Fk1o36{1A5LrN_}W00{}Nw@4z}3Z*C8^Ha1S8C_M19{AnFUIkHC$=CwRN40Om zwW#uC=O}zk?I3ZRqzcW0Uoo3rzmT80$naiBi|Uf8R=jXPb!%kp52oDvZ)QlCuks`8 z%a!_BJKBScKZBc+s6ZkLaONl+>E$}N#Q${)ihIPc9f;=SN+dNG#80j;#tu~(_^g3g z$AB4&nxk_R^+u8X%AS76LOj&}uOsxsiy$T@jI$-5DdggZ5~2epCeVx!>*)bS;Yt8F zn9%_Q(qUsGM(3Fwf#pF&afFwFC8!SdBa!Ztb)h=5D7YwdJ#lz)VZKbAdPg0|BH9-Z zR0)>W?9cKs(=CUajA@YD{F0Aip2MaPc>DgQ#SWICY<68gwcp$7{?yFD`;kd*Bq@=N zyq}P>>@R|j;7K*-iKU$MEIPy=Urd%M;{sO!`f@<8_oKiE4GTd%1stv*I-y9E-n=+e zfP#%>9U4%`;B^hExn*~r=J&c4k6Kz713%SHOL*B0#+Zn->@H#h9o0B(roA_9@Q!Y& zHuEZhwH{d939Z!cLAI5`-LPfLOwULu#E`3?lCIiv-L^*rQVBb(DbIjtO4cYKsRGi0w>Tuu8fls@EcnZ_NSvDSPXpZVVUj{O+rSPrkuwvM z*4~hclMq|xjtkNzEKB3(Dr(SZb$sRxVcM3?bUU7auP?xZWcCZ5f+)S>*QJv37_a!o# zBK~SIU#3#@IqI%5K23f(N}#A2dxPaOoNB>Nk`^Hq`*)Az4vxp2w@Yyh7uGW;m7hRO zmB1Qu^`QrN)-4*-P)-vjEw40l@bNyAD*Mu?qVZ$ao*nHx$11o#VR&5R{{c;>dk6WL z@Q?`&sT(PL3WIO0nMcSY3%mNze~NUxnkneFRurFj*2k<)JIPuCl>xzNca=jg+8ud{ zuF0DeZWW-P{Yc1gRX*aPrkQ)Uyd#>S`)vC-1{)-o9D4M%M)%a2!rJMrr+Ea!#4gNvwH{rQ|C@`N}=-d8~LNXlU9xhbb7YO^X#g0 z{Q;G=;|=D2X)9hS9Z zCZL=`Bge1?D7tY?vXh-Xt%7ci1x^Udu%JwS;?x4vszr?av36}x}>A^9>lt@23{ z;dMd>qP}N=$eBDN;-J&DlEymZl))xgwq)qWu!ryf-p@E{5CzbaMDFove_jFsu^Ec#VBVO#jzJhpAMDs$2H z->-Cq{rFTOJ#sUZiX5w@;vq`j^>g?PY!_iD8R|xWCtbD{%@|Cj_N=)?w5 zQvs&VdbL(*4NB3Sc@z+&7{_@Z=9yQb=^w}fWSG$n-&q`noA|Agg?KelhCeXk3ikX& zn|k=-(E*~PHqkg^qOOV}$Y6QH`+$N}zzR=UjXYKda9M)R7cUNZ!&Y+Kt3wEfkVn4& zvAQlp6Uu2EZbMh2Q{Bs3LK_j_+V4hQe>j%n1`v6ij6%?{$I_ry2OCnzxW5F;CA)v{ zdJ<7{sfSODGIFumzZsFsss`8BE*vkJ{2l;npI}r(Yax`Yd6#(d>O}^lMheXsqQn#6 zcR211Uul3|lhe$8{)%g{zh7BRE%pLeD(H`FAlxrjmghuFplHECC(fVLYLrF0Cj+uo zp>j`EtK-vz5BK&#dxK|s`aw4S4JGc@gN|vLSu(#?j3wcM!)<{xRGT>x?_{XX62k#q zTdq16CrOc?ix|u?9l`-Cfr{HKxa8TcN{reXmRU*DK|MCAEUMNiB4I|Ctk2YH0qfYF zMJqFZo&odsToRz;bi(vn41~@<*rVW{F^5@{eD&EBOKcT%%!(u`$ATZ`?xg2~srUUY zTnc<9+Ikk<_W0xb!W7?TX$WiZ&{q$5h=jhmSJpAzL$xe4!v-=)6iV|d8C;4W6pN?PMY z4Z#CE#%PG}Ll|=r4Jg$V4;+|yM|Ih@(#_Ru0kBsltx*ce4O{5M^o1QkTXW32Q!Ujs zUfy7den~}X9T)8s*H`893*Q3r{0g7?I#7H_ZKQ27Kzx-O@EhWK4^UC#pjt(L4lrpH zNHd}Goj;zuaVW2t5|^zu>!Yg$)u^Wy8+yTakoR)3Y-VWjg_j|@Pd7x9bL4t}QR|)d zz^TX6TaPaHBz4ZBuMt|}FGw8sk!kfa(uWj3`aC!Ze;`5&rRbP2;ZxwDu3};B#;!At zXa{X;2}6C)JJii<0J2nA>*2*ietc>ukw5W8s%g;ho9Y4cJJ{P;R&{9;Y{rkggY|By z6+1<-@M(GDC#Fw+BIMm}P;Fa0e4pWI2&=#b7VOhr9G+7S=*vJWGUFVChFCG0<{6BQ z;d$!O6<*X0`oD9_$_=NX2f}A&Ei*az3IQ%H1|Yb2?QG$w=AiSvkHmdo>bU;I=E3RX zv6BDVbm=;todecLRu!gTe(Nj{6jq3}?%oJWvuo?}mz>$rc1!?H;sW@M5k|;l z<&<8a;l-WGtP~J!>Vl=kw(?P8tXYjA#db|Ak;Yr&H#0OHN>*OS47F^5#Q{34v!+G@ z{534#x-`xvN9tcxyTVWNy*+qCIREMJPn#>ur+_nB>se74|Cbj5LqqMdVY}$d7A?BD zPx8_X;h2=khI!tk(xsvICgMUJWN}RJ^-Rv2PkBYe8CZ5Zr`x9-zd_vPe|$N`W<1fZ zW_pQp11?N4!eF*00p}BYQ@ZEV(!NBI<#nH-c@P)17Xi2n149xhgcUk0A&9K5fVnI1 z147slHoDNyWH%Z5jl-W{ukbj@`+1=3e22!}mxct7ozAR%DZAnE-j?i5Kuy-RWx1=u zXk_aT%*OKLd#rl#d-`cHJq4Ftsbplp`x#b49{)Fs3!`zg+|E(5`s$SX9WFtQT?}*% z_18X(!swx#VGEJgTYw~C&!bx~W}6u}Mecg3BabR-Q|B-H^+6of&Y>|$0K8K%=`}Ff ztT`@?iS`44oX&#gYa=z8i;^t&dNU}`Fo7oOAFZ7jb+_IOtKT$?6sI|FEE8xy=*y|} zF;URL)+R4X;DgN2iJjeY&F1Ux{`%HWio`VJRS2=pY7_c&+XjhwYk`CFSCb(h z8!eFQ0%YXcq%)YA2x%t4NLY&3MCVGk4c-lG2I(C&Ji>_;3k3vzq;DaU6-%&JhkVot zVaB-#2^{MPrvx3R8;ZoCz=$(g%ok(q_KGCAA%ES!_ASpj=i90{5Y;6#+#f<39apz> z&{7>pI-FY)dcdI4|KyMbct@s%uc0ejsZcIM>GsdIt|&snmU&(x=W zZFeAV#~ILfLufsF*f_XJL5Ty@9M6sTOB^nq6VkU(aeRbZ$h@F)L)FC2pjOiM(D6FZ z)`wz{P5=V#3Mid~d2d2%Mx=8?x{Nb-0?VftN~vq~y`iGKu*ocu;y{hT)d!X<$`p~{;ri>au<(kWH>2S-5ls`>~LZD$A^#_NQ zbf|lT%Y~{HNG~)DqzOW3wQ^tXO+L)$J)HdFr0D1gSHXrmw(t_f$(p-&Ae|hQC60bn z)e2>TISlRL@NUg(4?H5KYi%p>`67c5@NTo2Y)t$*bqK1lsOI#5;|DcR0Q1K);R-1J z25GOT4fK!07juWT`bN3ZY!#Mv_ei+^4jP|FsG;I^g`R5n9!t?%MGj!v>6B4%-4pu5 zhS;Y~S|X*Q6H=1GQ0O2zpQT}6qZzQKKlAQJeT3*o2e zF__zK(e%bAI&Vicf!N$btLLxjl_4H$WW49cSVc9=BmjMzWA7RRnKqT{X{HiV11bd@ zYl9-Rl3M^SnyHps^YYCEE3H4gM-`DQ6YF%*3NKQ{qodK@Ei?c@%(0@_ z0QmFj>7gr-B;wN4niQ^73sc|i(d^&pI}uAnerrknB52jn1W5FfR=S{=!M+rL+&S*d z-K;t}7S9Qc$e*w6{5PJB!1T*`w4{M-ux+Rrw}FW}u`(gh9MC;$zfZ!^Fi`FfG5oyt z>s?{e1$C}vwKo)|s92bfTkLSC7%|LB#Pw!ut!4A=^o$f4d}e7Y5+TXqwRiKB;@hUz zWPHi``MJ^gBC=CXAM=Giv1v!e7xoTRH6dISigocp7fB-BN;lSCv1Iu-J7EPnIQ;)( zkm>VfH&FkibXCc`FqqVE_+~wf}8mHWuBazg~x%niX54BaIpQn1(1RU**0i z?bKyK_|SC;-exSkeqX8xfT5csR<{vvLCoKAyP>T7{s(vQJ~RDgo+((EwNpl)48`~R z7P}0s+NvpA^|g+#Ag8~pe3n*G$0#SWPd1J0q^ky?E_B(*1JRY{`lFt7PbVbB?>|=b zB>4NFjSCPj9t*NneDsj4F0j0q$QWjdn&5-+A@S2NsLqwVb!@z{?K9fWN*2I042SI} z&m}uPvSYK~cTbvtTzaV#aXDm=9qKTE+BQgmb)X;D3EX-x2GFgaXTyLhFtJsC-P=R# zJxu^#69FljSEZWwnAq4FgC5tbGmxvI4;n(kpf^v+0JXxDJx5`(DcRo;7>`BDO)=Vp zd}2792dVY;IaB0%z@5KFTd)KC5-Jxtiw8ao4^!2HC{tso0<>m%Cgax|I~f#pHOeaS z>*kj(gZe6qo56u-$ify|8DIu+R{BvEN$1Pg*3>dwNi>0T7tT16y0DOtz9)R{NW#I- z1zu^>qZi3LH;DElbb~Zbji(o?F<+^eoih5;z(eiiVSj#Kak{U!V$t-Gw?rT`!hsd& z*4E1BdU>yo0G--ZjVAgc_&0CRsCl~`5It#h^xI}dQvF#nPx+W$=yYP@-yp+kootE8 z+oESYwhEfOruZ!gJ-=7YR)egGvf~KFL;`a;P7|6DcprhjjIOI2Zi>(oH-)<|PdAB_ z7QMxEt>M&48TW80A&SC$Kgci?g$_L#){BKM_57PfWdGj#;IrH!9$5F5{28d^K2^Q_ zK|G8~o|zYf7CO^x#a8CoW&(wBy_WjmqV3RCqHLDNzkR3M3Gp$=S_8LNBRruO_pJR( z_+mewqZ#WZ)UQfZdiH}{z=NpH>ZA;AU-7o7wh?c8WGZ^2hX@UiUQ_Yv7EXDt`AAgF zSC;6CCddEfe;t>L=(oKqbon_H08Jg)+uK3y!@O5@cn^j$O7=L^5#^d*upI}u-OAF& zX^s?S0&o-7sS=xd=g9VTv1|1}i+!GGXFKW5J&O!zr``Rwn-rSEn)rSEZm{XJJZq7B z(MZ)>M3|+YXrAuSo}94`w<<4O-eY1%UYSqF*~dm%EU4czK^J>x5t2~Z@u>uR>c}j7 z3!CchU*b4dx6?4N=}tj``qp`Q9s+t|nYe9z*TGJIO}M$uErPv@@;WVFg;f7Q9Osz3 z(K$OhqK8HPo9V>d!JjG3Npm1VpGz4O%2gjP8twm7zw*;EpNU19$@gY~zqsA<_^~UI z8G8wAg8_x1>5-4Y(AI9-2jQN?gIqjthO_a(N#|Z&PCvvuNYj`YSpCj?%F*lCk>VnF zb#a5ks2hrL8~|DU6SK^G(lZ z%{&XBS@;Rj!oOv3kl1GMh%DY(hEc`4HFORmHdd!{sxHs*2 zO~xT^272W#D$r5e>)|onUz^!_jFjZvBb2GrNO2a7&SXzgoqjg^>}e%Qw^w&^$(#06 z=ln#>6C(IpzFab~*aV8wxh!sFGBsJMWX%-M8}qXeO5l0YTC54SJI|vNFle3ka27Qv z=9RRLSQ?72`9$n*rI=tJg*i20n;@YRI?{^oaruoig!Nno39u&5-G z)3ANK4K@kbtn^q91py4fldV}6dE=VD9I4(KuaZKABA@p6kxiG45c>I0`EHifuv5>W zWV9KT^*|wqiF{4iHzMHUfa@+)`vGo=5-MIUe@T3spx7PLYg;uD-U|A~tNtuJRUs6Av)^ZCSb(XnH7q3D_aYaO`Y^yj-9d(X7;uE zSjN8-?tL}Le2NVv(?-QUF71C)wJ9Nl<-VAi%CTk+?HvxsL|4}w5@4G`Z?g3ldPRNBqx-qZ!z4f6BB}W2QPb z$Y|+svG9tQdmvSw$qnpVhjZ7g`g*n)xmzdN@K#DLDV;X@ha}Gr9+9m%B;9*_wb8`W zOeTR}`2ndw?b42ouwEERH%EmzkBWck#gBDLq_kN<`Tap! zDu9kh|8<7Js4Uv3@*qXzP$w1;s^566f>Dg=(MXrzjK=pI7=7NJJG281YuYbYK8UvCk!H_Y)F9+@)F z5W0|>PzlS}9K))gSfM`1DX5`XGtev$Fmu?N+3ow>o^$^G?2qm{GC;QG|81Z(X5%C_ z`KQeymL2VgbO%vmc2#ey(YI!wc9X(Fj2v1|PCYeZdtk8H(>|kGdXGtDpt#;9b3?h( znM=S@F{NjLe*T|*9yr6HoAIW>R3G3&l$MdoZb+yp7j{|A6-??QzN8ct^R#a9bO%pQ z7Crnhyajita5~>#S)bo9QF*u1bu)b3gP}4}`(1Y>{6@|%?hn=?#vxx5TIsIdxV(v- zz*cuz1w6)-_au0l&eZ_^ILLA|M+&H@E}!S=B6fi6SGw5;N%c0!*)(Me0aQasplNiR z8!bXbGlPTE+^Vd6R^G*AI_F&tGuHM^a&b$F3s1$mM$4PsJLJsNb-P+t#CBd(hh=Qy z%b+l7=Dcq0e5g@>Y3MIM>lOK))VA|60YL?jScGLoXK6@#tJc3$UetFZstRZ@UI(SB0Y||qBKK41d; z`QT=}+2+{@?VbW5_C1`)m#!zzpF`iGJdn{mfnFX85B{|{u6jcW3ALRSzrpqcHP8?w zj)l8Wuv4QzEKJRn)QJ)IKZ0K~_D8@eo*(+((g;HW@3#~hb5h7D$929dxBa5E__%rH zKcEz zgN=lPFbK_p^3#~OiYToG)pHwhi@y2f4uimU6=mph0we*;@(}YZ8+X6f31P5_&Qpg*a z-eLP@GIh~H2{}9bl|8Pe#;Sga$wh1T-$NM=^|nRbwcz9QiJ9SzwMxBz6aH#)ORGvX z&rSHooc`7(dYPkUR4@K0NbewHj}p(<&$_<6aN^K> zZ5a=`)bC***sH-{WN4HnN+{<&NIh%JrlC)X0@8oS702hH$W6{Iz&LKZtLF^Sk zccmQbx+RQwwm`5@HZwtG;>R&QpS#4O|955=;?RE$b_?G0ygH8%h+}ATNqG)pd`0D{ zS_veS=RxlS3hP%EzFj`<5K;LMEIf=y<9kgm!p`U;2jcS6Bza@DS1Xd_>pqDi?VUss zh8r(f%?ynh3)I(DHKCDKa0@sMtTr zb)u~@cA-Iy`sA(kAJMsX3z>5MdnV#bNi`#8hsW6!wapWDO#0>o1$>pJ9qt=b zK2o`krneEs0>TWTJf&hBN^dIM4y$B-dj};e+7!f;K|*x->8Y)@d^_#yr=LR%l#!MN zyQCPkCznnT7Ls7)oBK({EKFtjbb~Cd>ZASafz*Rj=|0S!p0S0A5<(vP{D$a*OjeL& zi9;w5t5izUp=nYN_k7Kis)B^K^MCa!$0cIW6No$@6SknWHX9nM2?@HTM6_xZIBJrb z3{HiocaDK8Ny7#fbLB$zc>Esx0Qff&Zjqa7&zGIJF_UpScQnVrUS4xtTi%Z#1gj?O zNoNntxL$FiCVn-LT0t3=$eyJ7(kkqs2KM@(sr&;V@vyF0q)n`{T60A+bJ)-#a;@YG zfJ-uAuKby1JlqrpC#dRL)BnbJx==NM_};gmGLll$`!_yUs>_+f$Dy>cdO< zr%?q$cpO~?i4ua{p4|Ku?YFD!4Ca*d+hr2RV-nL>7*F(7kl!@n$sVq_N11QUC6BiT zcVLh-ut8ZyJqY%Ikj-(j%{J|Xq@y)Ib&l_D2ytmAOk+r;j@tA5sNWZLhRTOiWCOq{ zcG>C=`lbWQ&2kW>zBGPmTS%fCES=vCSLHu;(iJjM{LtwB@H13{Bho$ex+N@Q4;y%5 z$QeZ4?R~@Re*z=%c2B%_jp5dsC(i`(7-FtQ2}cup zm?&b7_=xl;PS3tq*;QopI)A|ZiUnltLrfK@D4qeLHNVYFNu?%IqkokF#e-s+GofOY zs{Eh-*H|@a5=%T+QDRj5y@!R?Sa!XFZP_AYF$ef#_H4yMd|Yr8fV5q)!}xe+B}iT$ zjCM>YV;OY(f!BGf2r!Fn4zJ& zFP@(uZV7i&f-%QHj7N8PLfD`-;a24&Rmyk?364n)jzh1UXsOKKeel56YCViN^6#*e zu}GC<+iFI+2_OK1M8GB+BYP4%uT7x(qLtYq*R^_#tQr6gFSZ?6xkSYN!?-jF3~LD+ zy*ev83E&Rog{7$UC{K=nnqCkOp4SCdU+FK@I@I@S5jZi`JQ4XYGx&f@cOCLb4!6@n zBFxUM7dQV(!H(mGaBYqU5@82_6^MnhBY*}%Vg%hhItZcK_V`;ww)9nk;Ed&Mkmzx$ zosv-HLmCRb4UT+F$_xx11L_Ni^Xhm`v$4~oU9<_2)5N?x7rPF6CnXt2MG2kGT&Ovy!@7Gl8Y zweKjv+@Mb_h(8EaHa@y$_oY|em&y1-BPJo|8+I2XjAQ~e?9+v`Vz`i*o z1%293fE6j^&HETv%NypNqPPjBo`hH49*10mdKH(em(!&vmE9e~xTk4m#rDY33jFB|86o$2z&FKt2rcHAEpm153_I)soy8siaC5l2Z_4VZ)Apts8 z@{`$BryxW_u0w*f_c>GSeA;H0yn2zO#=StdO56+J{YQ6%Wl26>ay|lusRU0vvP#w8XSz~P^Ab}Xd_o8n`TEsVl zq-W)nkZD-Mh*r>#Z&CG)SC}+28yE$de1eq%7mUo`qXvIa82@~++ z%g$REO+HY;w&Gk)X-Yx0fDbo74R`^p_ldCWG76^ca|i>~grGpXG2MhbaKw6dvaX@t z1MLkz`J9*e$ub|@A4cyByuUDHMfPu5v0=!9r_XX1_B=rW)4o2JULgqdCeNy_|QG}1^g5sR!Qz@H&ETfaPHT% zuvuA*KOVyA!K`(RjHWam)6xB*or!QTap#WSy2x*FPHscjnyPJpIq^T0*i=Cl-asXN zQ>ZXAwf-Mg20^Ml>*flz_O0nt6oT)T-TVOkfJpBV>E_`R%vD4{kO-A1${m~5Pg75O zCL@&pS@%q;!!rGK%Ozo4T>>*}sNJWrT8*nh#o`X#WoG#))~3m{7k;?uURQ zBi|X*7+q{vZG9#VUlEIdg=vVZffwE~2*~!Q)1EdMdCl#{Sgs z%f*^n861QD`-k%r56O#>T%{tXJH?s71{t9#A=jd*YLP(F`EU)7b1NsRVT74FSi_56 z$h$COu6F-V7JBFH9P9G{I229A$TL7es8MPtj|@j;=cM|3M;C4tzN?XVqsVvIOz{%> z8$!qh>K3vV1EHsF?r20xjT_;SC|Oyb1>DiC$fa}Bc#T9>SH%s*;e2YGmu4Q3FQz4? zvuhZ8ll=tl3G$$!*4m^WL_~VSxb?@T9F&B{?-XeD@4`O4jYz>n7{9HL+TZ#V9~KGK zK5FvcNb8C%W;HTwCEqKvCzmGs#Ig&Oxxekm_s++;gsN!5V55-jKiF@$Y$XALS#LOs zAUI%i0j4Nu{&2t!{<%D9wa|2cu4OD&>`PUg9rY;%L!r!l`kz{245sM`eiDsHOjCPdrXRS*DE`$XkLc7<-~n6I%sSR1^0 z@iff(yxHD?Odoc+;;@Asj8K8;Qnke147k&_vHD zyd(3A3S+&e)VuUc`Z&qClJXnG za!DB?<=kUM?)F;hbFT0gtm?^|&$@iufPgPcjNc+f!V;G?Vxm~tx|_&-X$O&B`ri1e zxccmXSv<_+^}69b`yw`Pd;<#L;}y~FWb~alFPlgh;NqL}mj{Z^25aChJ_mn{=&) z#3am%nMB7eMIu=VYm>GtuFS5c^rNG9Kp#_cXaT3ce7hG85K=n+7BMyu7R{>=ypm}q zY<6_8vn}1oq+tC+qrQQm-7KrBv;-f^_!-xCtT1D|lK9<$eA-~Z2N0lk1W=n?LfTeH zN~f*O5nlwoN#;d+7e@O?|A$sdtfDYs)wxtmeJb06if_C@e9w=Z*_0vVFD+*1sq1x; zj#%3i+kwt)Ew#}0)NH%1n6i-`-(5GRsc}@sE(?adfrnVNIDeW_o#c$#jN0d~T_+fj zDWdzD)lnKVUvl#_D`>vFf0&AEPLwIZ+HrdwWusDx?v7oX5Y0%3#I>wPDK1fDz0>!i zrk}5q2}#wOw$7kj^qUb@>p$%wLO?nQH^0gN^Un@}t7A4_>}Eh4ULAHj+0kl9=Gfa4cAgbWrXQUkU4a zi7Od*+qUkdhi3mP!K9t zx|LI$^o#83_{*KLe<#Hu+`xbRhE>Q8!eiO)Mu)2%pwcBW zWk2F-|B&;VK2drg5#_}UXnnk@DAXNgyzThAaw0`L#jqE?siajWV^V0*0tDGiACic+ z&2O1hypD>4g9YhV4@BvIdYRT&_}a5_Vxp zvic*xr@SJ_t9O|sQ=LIsb~8`X!Zl9CbgYK9_gK|=5vXm< zf0(wk5Y*@T$3C{z-bbO!hApBQgFA@cr+`Wh5gon~l52JK&$AbF`Uhy^u0JL%Zq6AZ zhK)R*A~ca^jeGatb87j6XHyrSRfZM9%j3q;fhQ^GbOCLJ=ZPAqB0?@=o4yBz{9g1@+z$x5LL+J~6hAobQY9PB_p);`>I``6bS;W{ z7F;Bf%%fV7Ew=F$u$z2fE#Dol07X{v_h|WS#g7&6O`RR?!h148m=onFNZefMJc=(X+ z$6bJf=roEU{L4-sZXsUlbJw{3`P^~Huy05Oa+>vWOd6c504sX7hDO*YrV z#7Zdtg$y+UT%ADzgR=wdkt7)bkP@PKQ=F|S#`dvGVbVmoPmaep!sN3}-#|Ld1S3M! zo$w1+ZCZ={u^W+*q+pwtA;u)EOhXN5a%IgNUtsZbMMd_|UOx9`Xox6c1}DwtB5Nw9 zKqAEzjk7HL=lU_ANSCR=@fJlKa2HMAVS-=si6Kv*#$NfkdFK}J@^|Zxqk=U0KP?Ry zFJP3^4z<#~n*yALR2H(%Jw%1Wd}}z;NQTNk3#ksCxam5p zFtge+r-IN%h+t352$+aGLR;l+0SbM}_ob`S#0}X;f;Z%tv7@bD|6&_9o|Zg}^};KR zn?U+3Q8FYP-^~bmV8FJPuTcvB@IDZQ?yvU8IpV&8`_s|AEgCmdK<;rtTKurQkq)my z9q6CzuN9U5v}4ciw;Mah(FK-98z~!XmkVzsL(uji1y7vFwqN=d$I8<<77Y7%neu%w$IA^4H(M4M?F4x1 zu86h%St@bBp2}y!yAcM16p?E2_?UR!ifnA!o$Hd(=p>r7)(tkGZ%>-Fm#Mb<6g&yQKLfwd0o_G5wK8YMs*x^U4o z8~|1f`RT2+`w9Q&_Mj)qn(}e!YxDciq77Ft+CJM2XH-SUD;dPow+y!D1=nJN!~u|O zRV3d?JC-6x^Fk(6+dng|=SG^uu%1wBs+soNG|Th8;VccV&f15V^SU9$%#qOoLuVcL zfa);b@beuHjopeKA>#J^aC6*L-GAhZ;BjOL!#B+Gxl-~moS7JFDzow(w5YuLf}^&> zUqH;3R#cM>q}^nxD+X zG0ank-4;^_dh@1Q8~yC|FGfzK^hH?bG#Xp-{mqd|LwR6y6$kt_S81Vkyf&uqYh^f0 z1x4rBv5uLLB{=M}r33FgM}esmT9)N*=f#z2 z8`O7JZhwk>G;#I*97MYiOlVf*rPbyjIiAmvSP0EG0^$1JZ@VY%8ERUMxnMtoy)Tg6 zW{mG@0r_9mc@A6AZ8(tR<*dC7A%}!p<;GMHf=%$mmqzdQ6z6x-^$eo)QTqm_Pwm(? zAPW((W*pWbNi_wArkZ{I(ZW!Y$8F|4Z3r2g7k~B7!?p|_|qe$5WpIy`7|PT6$S&!!5__JxIy7- z59O^sWm8$q=WOS211^@lFm>M{KR~|SmkX^ZU>G2Fkz zz{H*0b@Woc{H1Rw|AgQ?2N^XJ<$fmmKc2zQ#>Nb7y7fgt9MkcIQz7Mhg%vurLB@J( z%Sp_;*bA-^i>>-!Cu!~0l)9E?z)<}U(8K+TS7pr-k^Omzx!z}740AUd`vGy{Zy=Nb zq41SbaTpqJW?vb4k<`+-3ee&H>L89g8gdNJj&nIjXq_CRVZU{f?XJ_kU}TtA9;^x| z!xEc6k=|Mcg$FcLqdzPk-mGNf|tnXYgz7pxPeYXMaFuJypd*2S&V zAhzQH>n#tb8zN!vA>Db)Gk)bEC=r=lxdnD^amcyj={(T36U8ZS zYHo(*5_=3htmYR)e^BFRPbVvh+RPw{Y-ue^$La3HVHJrExp>fJom3ekQCLz z9oH0lk!Pkhx2cP(7xw*o?;PY}d@Bxk{lDwG*SL$ihdYKQ5$AK~$)@6&_~I6!`yG7W z21e{VhT@8Lm=pF@C?w|Z_M5FlO~SfLS@eISTAMVHU=wBdj=ltV+v>$nwU=+6{<%;1 z>+c8^GU0B!`k*!G#HlYMMp)wrP^m96VaHt&4`SA{?=|@0^_l+m;z`p!IFsiAFw^~` zdbV7`;jvV0Am%#&UiYB6wEhkERxf&0$}iv&ZqX<}yZzDto3*$B{WIxwqIF2AHeM$k zt{a46hJX*$j-Rh(Lim$%0d^yM`|H*%TWY*=mmgTo_j=pTTX1}1X zTiQBd|LSAfS;?M^p`bccc8mK;KqtRN-2?|KfX=+fRx6P?4^eO+vt9yh^O?9HB@^Y? zmVbM=o(Rpw;k*&?8Z}5BWtaDx*9UM?9^RcZ-Q{XlReAgSP^FC>G-0dXvEVhX9Gcu5 z8>%ej8!q`h2Zn7Pp#du;$2@r&Vp(=xlhL%dd)FboY6%9^4v?nmW=!uEVo-3W?%ee) zE+AVhU`xn4l9KmU>%d?!C^GUq&11v|)8m}|nE+*c|8HQ?gyab~^T5^g7&42Tom&z= zrpO+3v0tU{>a+M;LPu7YPeH&qJL|!ao7y({b@CC{V!IHrTm_0$K^YI+qxa(0PmLi4 z*%qruhA|W2O{87E;}4q*ffYRr54*h*Bg5y-HKJo#zz?JTc?^>l`Y-|SN+ zI=rP?wk#3BY=~9-rpm~{6eJQc5LLsGe)oA4TkPw-HV)PBAX;aZ&1j**0MpKX; zc|Q3b!fVQ3J13R=h#_>pq}+@U@4twyZv4b*sDB z9m4rHU0e+?!ITHk3l`~6mxReMN2IAU1mZX#fCND1m-FEJy61+=%Apu8%9cmW+>l*B zxKK$m$iT5nZat@fQZ5|$A@SfA>0)!sp|9u@tn1;(hd)xsen#Ml9-(@rAX z`ub;n%AU!tz6 za$-_TO`{(JrmVUT!{C}wo7WzH{6=ULEXs-2f?Tr0%9Kyhj%haeF3{_mD3+4?8O7EaaWLrv z2ueo&Cz#X$>1dz*->}UAA})c>Zo5X|7*|OPj+60$qPN`)j7>sCITF#`W%rGhj*e27BS>P zj#NFKE`dERh_WqPJC#AP$4~339A>J(c3+no_Xj{HeQVLo0EH>WqgQ%2@aLF5xk3?k zhnoX|rLqORKOy)%>!Bz;Z_+c9uoHZKCBsQVr^l#8LWf^w2DUs9ZttP+K5q}aeg~&3 zh1J_8&C6Sr!GZUif)orFi``^8Z?maVGSGUrdT|(&?ghrQBX=D6Qp=-WLk-~EJiRGl zTH3H_m%Vy~%8wT1&PNXW9t0!rcm(&iOrlJGVmXi#J1cb?kf}&MZMacq@ulu6PGq*BeH)KD>7%NMZJV-7>`YIIA211%_PUM&eCxuQrw1>x!HJj&- z_-W&k_dDg{l#^=_DUFeZR^Y_x9T39l=JKrQjk$_5Q1*Z&_@fEFsdw@7iEp_lW#6zD z@~+i@^zYM+r8=Ag#;~mxP31~y(*#2Ehb@x{@@#v~4T;ZGNB{S+$4Rwe>I*YN<~Sel zBdG#%BBDsAjE=&_jPg;q3*Q0$`|Y$QB*wo!2YjS zQxro+q*? z%DPs5+OxdK#b}_*<~i-_>lKU$YLfSTFLr+L0KB8yA_cE^@8wX(}=YEJR} zOA!Wa?hX=t*U9=f_4f{W9jV$2VWXqgStjk5M<@y&pVMPjtInL93`pSelptZtk?Cbf zk`}tZ60ntyINscv=jb@R#>A1^T7S==TZwjWc=?i!)aD0!>JwC?W0B@vcIJeoM`TNI&^vr@0n#lHJi7u>OBm za;q3(B^4Fg4DVDk^(yN`^IB7eJbt8*?3tc5rPBjvj7{j*e9nTxn|G|$)*@uIcGCs* zWBK_t1%PDMPF;;MYbSIuiVd%36sK8v5Tk_$M*1=xC3(NGfAGU($4Tz>pye8w_gDlT zz--w9Jz_sBZ4eNbcr)c>{`0f7R*bfAtPM)d3A!p ziiW)sdpJjjo?WRKpxOl_6Ev-wMphdAa$2xS^LKlfnuV9tyF7kS)KS@krX^Nw*a;S4 zoP0hx6$DaSm&onjU)U!O>MV0?2cK8EQIa2w-JqasMm*)JR7xic& zY$Hd5ItB`e=g^7KaL`eX;L>&@O(08NOi3siocpgg1(R`WJs$_f1MTUtucZQU79(e6 z6Q5B;&~ZW^W}VxqR-rgDnmRO@Y&U-KLv z4vV!Bc)7^jja#sdF|^?93$fa>MpfMZktlGcgaWqz^vTh`nIe54^ulP#j5!ifu?2v#&pk99Vdh zdWQU^d<;&O1sBwc_vZM({1}e^4|{W7zvSQLy(+T}pzToek<`8Y3uBr{a=rp_o^wDU zq5nWWVa!c^nHVs*Eb2$Ea_#*SsLW+zi`uLjU>we$Alc=kw6qt-9H#x|%`(Apeb-=^ z2VJl94}RB2v#5BVEaloP)e5*Wv9Pgl(aR0uQL_ZN-({v4E#n4RKN7MTqmsM7>@cEt z6y9pCJ6uFkC81VLPwAa^7Lj7&kkOs30m1-8ejBc5)^kI=09ZM%GBE%0esNxDmr$du z`eT6dr@=y2W7MI)gixui@Q2j-HS?v~1z>mwny$%Y>;Bp=iV46mhg4h|Dib~IWd`s+ za#(N!xVXKsUF@{ZCjle_E-k{K^YW zF!u}{nr@NM5DF8OK18U6+1Sr?%BJhSUvjAIg{PVsiKK<-Gg-gWNBl1CeD?Sb&dU-I z%^452r-T_>&_2KopDPECScji{(i@m^SbJi=^Jv(Z&)9bFQ5+;v^k-y>Fc90HW?#bX z0>%OvwNc^SHm_=-_#?^kNk4ldFh_zQ>f!I|?%tl4IF(6iW0@LV*EHJ;6Olcbevf>C_g{Xy~HJ>6bABEb4V7N_6^?I&Em z;Mwf|(w72D~vnWQJWCSoMY|0RS~_7cly$ z*$-8wo!eGB&mx7HQ6}7a4i>2?U{c@xq1Zm-ib3u;zjm#HcFc>}_ zi*^Ch=zfCi+Z(H@Vg+22)@p>_j0I~8d3QIn8MqYa3B#%L!P9lGk@VYmJZ{n!qhA9w z01!TZ?8=Q9cDaxW01U8L)2e57n!H(a9Yg1Pdqybn}@4R76kzC`fp6NKAu2lFzNRP3ToscW%W0&yF0?*f~Nn=far)Jvzkq|ILD8~Sei79wMx>#pf-z_tK? z!B+u$*i0QH6BPfN0z^tP(rt!dYJk-HpoO&+6pU+Ut@87*p(Pq@GfhZvJgK3C0YU*{ znv`5&)D!IY(ja&>ms`0r5eHH|eK#Y;@CG=7oM9Y2GvTY<@$c1UDly zR!B|e6veED>L2)l5S#N3p1)*a#J*82*5S8=i+9f2$|VhhfC>i%OpO)RLbt?r)w;ZY zBY0ynhC!We^eC$r+()gX`_RpHNM-Fd>=l*QJet(X^SV-@K_cvX&8}ybCyDYX@UEc$ z$>1`hl{=5HPWXt=Z{&YiAhiL2+5a-vA_%M|hQ%QgGAj~QF_xV3Zp%+7h7Q`&BE zm|o@4-e(LR-y1yzFH|FlMWj*#ujyXdBXmB&CT>w`jDbDm@5jsjCR`*p(2pHCRlo-l za2f|FpG$5T3`Tp%G=+8^O2h(|*4`#f49KQ8J}2nN8;%uN!s3z7+g|E#Q46n zCjbo2xL-5`D|=ih^_vOEWYYxj0P7MDVsDG5YYCojXY=f?{6ibCyXhJ(|Z&-0SdtuVMN7-Hq)kW?=&Cpx#n8HC^RM; z?_gGVu0$3I&{N!ONHZ2AleQ*h(DQfgkbHY6!Wuq(!I1+zd5U6=9LpkW2_|5e^Q6uL zh^PS?caZb5RFg!Hqhf|c=-A!=1aW8UH$2|S)I>sGYvy6B9l|XHJ=`x#I`+>J@hdA- zKSI@n2N+1E##Ve+aO1bp>J&K%yn&b?8Hv#;z-cE=hqV!X0xv4Pm}^17<@a0qePHJt z;1;8%OVfWq0L4}d=lDHf-HzezcsKK{=QjWvwsN1v zI8R64dELsd+BEwkp-M1om*HP;V9=T+8nx@62^cMfE#zO=1W-FA_G*@ZXCHt;RwAo} zrXPi&yh=$uW`M-&;Oi%OqL##=9+V>62!dO@~v|D8MHGO9Z*j-WPSqtB#dELRI^w}r|D(5)r zYd=>}GLVP@b9-OI2*CMJ$C34xtt?JD!qznTUTzU0ag??22Ud&L63~+CA3hOsOXLx& zy_$Bq85U_GEzJn{~plhA@D3+o`5$_ z^oB}YmoWv+c{IuLAz+;?Q{3z%qu4v$(|dw^$`xnxgZLhJ!sHkKb6Dr?+J2o%p6BBrV z@u{;oMC=&=bx~f;Ie*!33X2=>Gn2Na=b*(ZI@T1ilH)E81t5UxV=!069a2V5{^BlX z@`h&d!)5iF&54+oR^I%u&3c&%3F<+Q@!W+fVPa2(<>eo#Wllv&omF_YXWJp#Nv0UZ-B z2!0hVibdYnckyMG zv1zU8krAycwx^YIAzJU@@g3Xea_3n8nbWs*WAWz7GEUK{xA74QfX^w90@8Afzy@nD z2?pjLl0c+v;n72DEt$|{xE|XoER>MmZ}2zP`Yo7kSoozXua!ZJ;MY? zW`}xwy#PcuYi}oxTHX&Q@hwty9aL{S-E@H|VDJEln9sPhZY!jrFtFbhm|up@g6dz- zrgKsWWf>vT8)zZQmn#zF+pmL4+1r~a-sYlHuyO+3m;s?UpAh}t$Sc}XoF7H*A%d(X z+VZ4PCCa=|TiM^Uk0(C_AZ3u%TZ5BUmB`;5Za_-j1|B1RF4D2(an%OuAb2Oj17_MB zh2!$1x-93^vd`YTKvZdNuQV^?Bz#*$o@YhnYle{5@^m%2qX^LV^0BI3aiKmFri!b_ znCi22`Dp56Kr;N0l3-kn_E3@(qAF!D>Zr(SPcc3kFhQ`lgKzpZ+OG3f2@gvP!24aU z*4o7_Wm{Y3dL2kL1Uq{RDPN7W>L8|Iv@t|PZGc$@0g9_U8t8<-6>KaXi5Q%bYwyTY zGX}-9sTb6=V0+yXqkfX`D(!_I7{YaD{s1{+^dq||w(|7E0~T$YSPo7}u=>yu$+_%F zkj$rObu~UQ+blCZ>5-OL5;+E@+7>CYs9{mykU5M`>w|bqeA*6re4{EeTi#s8YYs)B z^~DAE_GEMd{8~Nm`Kc&wtO<>OZi4N6xI+2nNZuzIt@y3r;O#CAXmIS=X&}^d<@~sL zJ73Al|NAlri!)`;Sr2Ozl%dBamgDjJ(I7Wl&M(}z9IfKmXEe07ahvm z4ePbGjjrf-50#meH)KqNIBmhZ|5>%t%2{sXL?I{Tx5lx^^aygb&jR@rdP_g~g18i3 z74ISZFBrckBeO{Aq&dEn5KN^l{y>WL`KR(0J_s>{dIFXpRb0bYHA-ZtF;+lLn?u^V z0N7rTYFs!Yxv%9C5KOiB{xTcPa<8Ou5bjY|g)PO)pn7uIpf} zas~c52Eq&7Edg{ObXgF6<%mlevJz@J0NA~>9PhrDi)b7KHGeMG_0ib4iM#w568~Nl z+K5A)q|j}xx#r)6MX_DS={<#w7#8pV+flcnKLZ~-d$9Tr^earJ9Pe##$l1U71w0e& z4*0$W)z?z-U9T*TF_4Cs3lhJZcs2CF&StvE={F-8K?&2qOTL|7DlLXfgi%cvA8!JPhD==%9BzGzt~MMB&zIXOe&V8_&QA$N zAcX6z%zd(L7Pd7fe5Q4>!`fzYpvMC4wok#2#xPZ37u^j8pS~9M2?^C+5&o#bkvRed zUapHdFgR)Vxjh+&FBlqh9Xq3vn}AwQ9ES-?H7w|$=ek_CTIHWZ)42ebFWKlybIODc zUW3E;HZBTxnEv+|%_w!T>g0h@I5%sfBvOM~E&{7<$N_O(6X+DKf0V>sT8*kD)57FE z-?r`VK`Wv0c7LWq7g6#~O;rO;2h+oc&#=E-vQ8WtPyq%mYfgxkBWEoE7WsS766FPg zPD68m4Fy#X^kS?}wwy0bOE;0z9H1U|0Xh z-1yw7jrC7BqF?Jxj~Hg=s)CQ6jAlQh!6m$+w-YVyv7F$mCCL+jXtVXh8Xc)5ozi1y z7$(df9~q~KuDX-Qsgk<~U-q}Cs8RxYB0PfR@QxG6A814{|8BLcQXCu!!d;hLAK_;H zXXA-#AV!8$F9B`{;#|Nx@(rk+?0z7gzTFCAc4s2e>+CS^&gjj`r9P6d+=o>j7si$U z2ST45cL3+lmp_E9g*?-&uSG*S`*AV~utOU^JS{qQaM_*%JIe<*rSlxKmmrgwW)_$N+YFY9-RxP|ctOz14O~ruQiU*4 zhg+am8QdgFpvrv^z2uJB)&ja`ce2v?S@Fa$3Vda}`t8517%pjeaJqt&b_z%4?RVKj zZN(|BRAek_JxF!=h(Ix3wasP#}RU?uF zi(i|NfdcvcmYXVy?y11Aj8)V6#v$soa!deD9f z+?hR9s+CRynntJ8b#ik@KtWzb5LAsMk_19T22^X#z~YQM?q`$8Hm~Mt8S8hTMB!M% z6rxA57XkxnO{&bhGtUXovsI=WQ$#8_H3M{uhqh}QjJa~F>8iGl;HdL(M13s!L( z29$SE5|uj0;^zmt3_?(zMn!hK}w#XqUgfXh&C*4gTL5gB?>_ z3ALQFC9kzTxaPyFNJc2sNPhth9iCZ*qHVY803B^?bP!1zQ)C_;zkH8wO7#>YcyP!x z&U3qRO*myR#%60raa+>L3@8HnzXp2^0UGbAe{+UhaM1$>J%Z}IYv)dnS8%LUB%8{{ zM_Nn&L#%V3N+^6bVBkZRgR*T2i{#~WCQIFmak>XslY&mEf=k#(Q)_k{@(1kbu$xjU z6g_xjJ&@N#s(%3P6HpIY5DWVKa|VpLEJP=DT;1gl;p}`NepEcJ>cjk zCPn%sx>iJPMDP-M=$Gc$z>s=4Ke331B#p0cI|TXATg2f`Nj$;Kw+^0DOR#6Co@4p%}#w+<9|p6o>nuw)lVk~H3ggZ%UE+Rs?NuP&QRuPrj4jizsZ zx-fRV@fUBvB9F&l+Pz#Sg&sok?(0AWiDDAo5%<*05R?K(ZKP1^LMD_Rs0YQ#6;4m_ z{H5VP=}@IZuDCG3O{jwKiiW9w3p1A_DODz#1SEJ3l0*rP6iE4z^m05rf4$hl;L*q& znm9VrbAB{@;?kE6$SsERL2k^^9FPELo{c9PAL>;1Y$zcCwWWL)mNVdb@I>gEUT;;S zUX5id)0SJD1xS3Sio*@+6mvRe5N?%fqL!o-0vRjR`sQHj?$VvSe7pi zDOVbwZNKXSY-5lQ-}R2zI^~r$!}LLGuH5xYw*>UaK7|OTBkGZiJORn2(ip9@su}AC zUEjegbWE7|!G)w?OdbRhEfcT(GNQO(V;>zYmGhHRX7o`*BaMqb0g3*54~AfxiF8*} zBD%togXCyeyBAGLI4(0LTwb4YJcc}n(BEH|(ATepQqTBbLmV2wHZPbY-PBiJ{$z8y zm_Hjh%llT_5%{=X3&wwp?b$5U>btzBGbldA%xIK?&3W-~Tt9H)Uk0;P)LS@L4&ukT zhYjU0HL#81tC+NlaCj&Xt&J{{uvJPT0<2CfT>C*8_{15e9A~e(?|_Y}_<@D2UkTVW z6h-mon~`g>e_Bh)Mgl}dy8vL@gWRktDVkIw9aqV~0o5ayIPeZ}T6vkV<&E@g*B#b_+8*7Ls$IT5Wp%{tuI2 z4RUb=JwT`Hedlj=A@Ao0LZ~M40kuU8`eM^xHY}?G`8U(zEhqEMDo1kUJ`bdKaiI5I z!d=nV0q~pMQn$tXceAZ&S;cZpBU|?S>u<8F_B-G*o;RP+<77JQJH`gX8%r_Is{6e@ z8O26xky*^^UpDVLQV-SJ^2>igs~>dOp#P7^s4GsoAiIdVw3d>Z@c0T`AfH8!8FXAS zC_xgtavIKqRuITlljLY7zKyXI&XlvPG+#AEv{7KO^?3w(xYK?Y^A7Cw3d8iJMogL0 z<6jO!^${}2@%}ubW7UaI7N@*wna#pgh|;Vm?+Qn;Ls@9D=i!&Bnv2*okU1`#C{=8V z_O*~FW&$vn{^#asxd5v`x6tQnG7r)z<{l8{v7n_c|7PSTHLMKbgGHgEo(ZSx04%{v z0M51sBLE2*2u%+P;`v*wpJF5Zj3}hoS#wrh&w*8 zh_BcnRtqw2&db%I9K_#(sMl7QCHhWR)y}5xWp%IwEI4DBXlcs{ybV35Unp2_71m~T z*Rm6ku0dwQQ`3yP+6k7UCFD#^Yle_4o&X`%?XZTK&Q`nhBmOYu#`_~5Y87-C4r}|hci$g>vVWwnm$)EZm@X7J9DGrq!wDe8xv^q{sYNMo!ymk9LOFLRn4Tg^Pzr9XepUH5h$qe!Hgntbhbnm}$XX$cw zlm1hSL|sTkpW&-;?!M%$dD1KitSP}7y7NvdN9X!&cP%`ezHz703N2DzxjBU~NI7*s z&#nGfmg)GL6@!`4uFIhR!#Ru;$Uu9>%Kr<=H*k@@Hf-Vr{gvFfBkTAHq_^xM*%VtS zy;*K}WaYPW9;R9*h-3YVa5=nOxG|w`C)xDEZb9mb?r3+&NHhU43xMtWfHawq_}MBw z8}Eqq6|>RAj)GE?MIljTYh)d0TRA&qSY$Mhc|C6AP*7&e$WVQlQ-YAzIQgWlH-}G& zK#%TFc8T3KsEtTim0mI&EldjTg@-8_6>?OhF7TZ}e0bg8=1vwHxUr1UazkE@tOP~& zx&i^|ao>tV83SPy$e z-h?$x^WjR+3J&-n+z>n$3*R7L5r%_cD%dA1SVp=HvuClk{aP%Y4pDgpO<|kzg!&`< zRavKdFgkB2Q!5$_6a8;To{ghVg@<`DN!-}0y8cHnQ#g9F2t)a!d&WBdCv<)d(BT0* zQaSUs%3@`R^@wp47Po%a&V7=v&FhSfBCMF*qVsvdT&z)sj!RMHMM??__anpt7h$EXVredW&*-|w1z7PypC&j1 zu-r%qJ0qKrBV+!i_VR${*eh2I03pV9onx&i`UO?rr|DbqieKt|=+aB$YT1|E2e}TO z4}bUd7AUQbN6h!camXF86E*HP@opAN=;P{=+yb(r`ojplSAS{1K`6yM0{Efy5y|Jk zU#nJEsGQyX)FVs!qm{q-+GSH-N|ZseMnz!`oTX$FC`Nw&m(O%{4q9Xvu@ z_=&)oH15(6%Z>ymmwmqG3nb1&=`tdsQj-n)+`QOG`7XLYNm(;3K8RY6yD|6RRI1o-30Z z)U`xirS3`0d++5^JH$&P&;oN{e)lou4V4-xZTrxnJlZ43#XOb4_N};de8)d!e8LA*9=bp-lc>q&Equd{kf(_Dj(65xQVn&4 zmU?MWG`gE|z0Blvv{QkTG_^p1(lKUHU6+3HT>AGgtbce0UQn&_`a^1D7D~%lFXlG< zgN1+0##&>AZTI_$-z(8Qr`#2qU;UE>E4mQ*hRnq{t>n}#&KiO0T!<29yKXfCG*bsc^@Kh zs%?vNyCArXY!F&j%Fk7XR6cA^SNGRVpA~Wv*VB)XH#{S#QBmh`&Da;O1$4v>{pC+a zVbM)rTt2R>UOz;4{K6dR57bfFjAw2y-KyFwTXyFoz}H89(-X+ns^gNKHDY1K)#Tco zzVGri>CQ>FqFDkvf07)bR*#~S!i|u}47u7YWN!Co^ir1M;`#M96(*MrUedhb8mtgk ztmf413VG^}!j({PtycOq;0E@IL|3_Qq{m!UfBiUM z*bTy`dB=oUpt}I(;;3D#zXv96^^3+qH$}s2=A*J^V95qrs}Dm3`F|alJ7NF(YPXgz zK0bX`60S_3##JEcG021I8K1^%^QDM5q4CEN0AaG6p|GW9h@y&`Z^7c4>30ohQU>1H zjZIh61fFmNyR0n&vAks=l;+dwi)ErPF2+ue~u{=?YRuS{fi*J-u_A7Z`-Li3`T z8#kKsMbOF3h;+B9$14U&lzkq@V-nUc75zP?WD_p$OFOToe2qHi)50p-6@kua&kudi zrvzmqOfAy+|5>3vFm8$%DWm_x*jorPe1&XV!P9QZ&6DNI@aG4rnBE!TbI{r^Iyh8? zxxcF`*&X}#q^PeYT%cg>FYn_m0UOeumajp7B&)^54?*i${#oU|DB|`LUB)i;@xw^` z$Jq>aYz(K9_V>YZ!9b`6921&%@5>Fs^GsM8qMuoKepgZhg{i05|L*n&oLAc?W#kyE zF7*4#mMDTjYmr|WYm{D>&jRQO4WMP52kl&ckJZJYS@g|b?goR|bR9?Oa==W*SD?nV zm5&<53UH?whFaIvABi?MeaGcIveWfmo0ypS(Xsch>b=3IO0&#!y?mA zISNN=vsikR`x)L21>S(+9?P9Bq8;`RB=PEVX?)7D~g=V zcgnFOz`f4pOeAiODX%uwz?+O3NXgjNj@xv!e$O&In2}qgNtPXZM2lt<5V;0O-v>88 zHCRC(=p55>3KjIFd!OiG=+}~{zJAUZVYn5%HV$Wtx;4vizUI8Rso%aWxk*|y2vFl7 z*Ju*c+1Wp_8yy96zknWk#o%!BOjh0+w7)MDzF=^PW-F)vCtBeS24$aKG#0F!qUtMC z6QvM>SVI9r_NEA?A!F7+JyXRvc6T@%)c%7UM++_G&G zyk+|L>aLZc6D@?1JUV5EYVA~k@2rC{ zgOaOnvazEL5aB-*7SXT{-z=UgRXezV#tde8 zo^q93fEcfo!XAK$_sWJf*w_}^Xt5M#?tT1quXhY@8)45iqTj=wc_3*x2Ll3|MH~~S z+JZ(yk~aY{Qd_jegN?srz*PBGY?qeN2Ku*obJb8!g2YORA8}>IraCO~QLz+gW8pNZ=NsjQzO=|Rq+ZN#>bTu7S&KY@i4dayn#@v@r02Ke-%h=zs8<75XO1321 ztuH8I5?RQKBEA@xg%bDc2Vz(1j01{^oeL2HvU#KO?Gu#6Az8J-yhnd(~27U7%a~oEfiIQ%zNvoWvuigZn=A9n;O$G)$+hPTTXq7^O#5kW1~)FK~MF19+Ckqd+LgWD`ab>YJEiM_sX`j{>zS6jNx z+YT!k3o7}>XRc8uYbxm>T;6kYUfCA^5>xP6zKfx0XCwT@WN^0ROi`cBUi(xcQMGk# z7QsU{1uJRD_Y^;?=03Y+FLR8(`6)bB);7dV1WTYP%E_!#V8Na?8LfHJXw$-~k{eg6 zpf846Ce*hYc73dCs1pF5B(n8TQQ|&_B#V!&8v7&Y(myfP{T$q%MgPO%(ZJ44U6qn{ z8R@xaZ7y}Jl++4irdr5j^?8Rj721f^nOiwASNu2YhAY!Xz2tzo452IlfcegX1{N?D zscgWdNlVw9SM-||-2u`y-iqScZu#Va7m;SNP;4q4uarMVkzDXE(7r0@Hs2LkUD}H@ z%-l8w>*psq)f--V&Yi1s71kEC4I41trJ(-5p42-)QeQ(3pnUR@vIcsMvJhgD!q!>c z5-Q8yB26gdihK7l-3@VEpO5YP=K4E@?El>Ok8-2H_}hhLr$qCUlWzl}ud|zR{ljx%`2ADzFSRhP-!@KJmiI0-i#AzMN1<%YHQP#H2zy09+MlYy-Wacd)^OF z*3;98D5F2c0XF;@GbY-@l;3$vGl5oRpG=iElw^ z3Y88iGcx)-ya@q1O`5qE1Fyx5`HfUiouk0gp9aO3Go~n zp$^;cQ)ha(3NX;MF_!!T=7_QNfu&IfVNs3FV^<3mfB47H=uqcIO{291$PnIPqVTSd zekLYQfTxOoOUM9(ZF@59$mvF}5utL!&D$&>q%hXM9w#J5WQSd1CArqDlr%4A&-H$Q+`nV)IX6fqn zn3pY{muDQ(-LKo7R!AJY{F3OW)k^r1@M#9_4Dk%~17K`}?%#L)4ehz0{X3D;21GZcTlfk4Aq8Ni3`E>BTY;A4{gk~ee<9p z6Yk^oAoN>87rf!7br~g&NvBw)2+V4#bH&yn&Z|m|Cd$8+Da}@Z6F{AIx4eG9qigmG zg1oa;XcII73^6``1O{_*%PmvSf18%Xpk0v4)h?6Wd02+fr=@LY_C%cGtpQQ!Lx{V{ z1(J(l$O2*03%H*7xMtw}Kc^@tHfibQ$>VtE4w|f;zaFLbt1oMJ(`sN9*zWT$qLPKH zKa_fQh(AtA*)}G_A`nMt7i2mfk}zB3w1Qm}oi(pA3t_-=w1R;E9(&>d?KCaboEx%Q zl2s2y;=ZPN2B z`UK3B8`6lWHOnC|DI-5|bnWHw_z2g>&?>UYQ&qC$2Y_=-m}0g^AnNK-11W|A&N(Z9 zu%o_Z-Z#stn)CrLT?@@7AQ~5x|CqWV=@Ytyw?8VLO<|KjL?DI=re{oze+!Jg0d#;% zrol?_D_wdL^>gYdRh^$o5w(_tbT3|}E>uP`Xn}9)#cyyei~A8S%s$;&a136Ll?zCk zLO6lq56%E)(x){1MiYoP_vjxbRQ+7|wvp^8=cJBpwQRBYVN2-pk!j_aX1V`^x@7@z z7(lUP3=m4shh88&6_z0&-kiqXl>OGJ`)&9`05=TwXN6jS^4e zS1Cm#PB(iXUpiRi1`lW&bfGX8>s73oSafngA2>D8d=6eCeTyh^bZO4+gt}wY0TT351%0bxO<2?es!YnDgI{oW54N-RMY5=(E%pLzK z3mo&_1bt)Z7W~Qq*@ogMA;~e4QDF~fD#(ge5HoTx3qGPxatVPo4I6h+r%!o;-`NqR9G^rHOxxQSwPfZ$i>prNEx34|nAb5A#@M~1 z4cC%R$WmKK5gbJ)qKu?BG-T5Gr&=gaP9`%&SAYoTeBRh{HTC|)*Lplp>7^_Hy8EXJ zER$9Bwl;+lZkE`n5&oZ-c)^x&>%sj?1v->i=3HV33xpkrg+di@bDjEsMB@^CQVQAh z#GIC5e3%;RQI1wgdfSJnp`KKlIdjm+W)Vio0n&FwLOKREUcvAu2F3NsT@`T}o}nPB zlNpPz^h^uofwDMMMT9N>Qz-8Z*1bp>iOcan%xZPX5=;o_9U6O1iR+|!sDc#XXX^ls zEBmb>Qps*$507e86fPKbg*u?%uS)Wve&D$1!B*Fo=NvA~xc$av?3Ll+zw z$KDJdcg?P}xlAa`mZ{D;fuM0bU5X-%g_6uWj$(;~G)PggFLZslJ&^FEY^_)cU}7zZ zeov!cvKfo@R6|8xlj4{@&S`Xue#z1JmP8_65@{A@QD;ak|CE~}K%UPh?qseV%7#T^ zSXhL(1Z+P&q=MJz=yBL;n-+k{w)LgCjv3f&3tQsK~>T| z?vDIRSne^M@1!4{Uwa$#5%Y5j`IqA*C>0Yt~mqi80`|IID*m#>6MS6p=+ z7GiReA&NQ~Vgo#HqKA zc3*Xn;dYlFK0tJ*+{$4jt}2twm)8O*5d%Ge*slfU?wGs>)rdIe3?ESkFK7vS8kM_) zmZ)}e$VK?6Bf#<5reEYiEya_pieGw;buoNSpV`%g6of&XQqhlt>`d!LYya>;ZhquH zEHXGXIL#*dSy$FCT~Z7C*pFTzo^uzPOD(rcx(#(X@ytqa!Q6SCjdtOIP@t7)zF+h| z_Bn{9NE=>?%n*NThG2uem>=Yux_G{)=R9qxGX47o?yq7XJ$ZCgnQ7RC7?!A;f_|%j zp4u$O;`QTV$xt;WHfh?hI#u=3JTHn8>(V#0-y&~@BD9j%rs1>Wv0n2Tr`dOVJ5Rc$ zP9$dg{^xhDvs{g45^Gtalz-EB4_4%X!1|mg0=;Bx@$c zb2fGX!|7s6)RdcllXzE5!ueE+xnyNZ1PPi&FN!<31bdt_?sFNgEq;mxbXJEyCb^*s z6~~3!?ZpW1dI^!vLr)&z)w$`zLZ0*gi%+a|i6BG%5=n*jv6CI_Et6=`PrT@okusCN zc)z_F&NuN-Qm_Otfbz3l4Gfn8jr>uC*JRLZ?j>gggbFra^f~A5fSh%b40qX7pKHpz zhKAL4#P6jWhc+m3pZfRkFyYMg1!z$CL^t!qgmAbMm|C@fcF;p(q_h<8zO?Oe>%uzlVjXF#>vfY!!-pJC(9pWKgM0qjSJEo5#!#I16! zd0oA8z-K?!uaY4i_EX7w;dnq`vaegSbRLlOq|@!ohSP`ts~_vRSH^qNYMig>mzAO4 z1n32Ey?7fNM~uA7%?tspcfS4DX4?6}V4IfhFpOpSMMJ3unC>+mm+Px~}>Mv&YV9n%?CGNAy#=z6yr=GZwnVI+QYjLHL3p^Z=}MDTT6&21w+AH8S}2e*Dqa=9t2V8 zAm*>w2-uX=r6o11c&*L;mH=J>A{qm)vr6p}tw#f@7r^&O0+ayS+Di)e_ru>HUpdr) zev<9wt4$Fq9g2x(Wc;I2hJ(ztS73gkT%FmXKjT8A^Q5H?D%k!NRQ*NiQB)jq_xjoA z_QhpRcTXXZagm*nR9d`_0lJLy zU`L8=9%KUE=+T<~P`;l|3UF41n!2Pk$m_#fc*AI?75o<=7cBmW%8S#DX-ec^Xmm{a zD?Ds}(T3z-wR_wdv$ekU{qcoE96vzFTm!>4CveAMD(qDQSuY=(CXnaDj!4bjh`_Of zcmLfbvXA$Dr2}_)V$*xZv@sVkoVK~1U{=CTBlYSFzOLFPJ3-~k-5ev=)8Dm?xr*sE zJe1zhPHw*=YiUs_f+t5dL>+ut(xzZ#m5FJR_q@yASWu5o3x>wz&js{Jrq8aZ9n7p5 zsfhM8Q+#$Vb$_C>Op2YOA4pkC8L_hE`?wwfg){ha;DET%E_TvPyX1Xm)bo+aK5yAo zAV)#fp}t6enfcMakIF{18~s2o;CO(SV&-4lap(9E;_V1O`&_i+qvuRC?2o$G$HT%# z=~KhU9`DKnNcSj&1>|vxQQ>{?4J|hL-^%|)+jV5oU-q>v0)RV{sX&R%v|uw`OJ{Lv zMck%*MpQhftA%%{On;M~g=Fz~dW*>2pP-WTP`E-^?=!{`Ywy|A(z=v@wUGZ4d zM6qCf3udWc&qVCY{I1zUqK7 z9CG~9-IL+{erqMS*q^o}QS8|*rEU)5zu=YY={||hbkhNk=!5${Ib%cB6_#M1#dkD` z9W}Z00VA=!NzPDT3Zt(d3jvUrq7sHRzjJkd9}cLif@l5+i^Nc_6Ll6OOshKj=cl5R zJMo?@fH_R^K9>bcI0J4$+}wKvX7(v1+y|%Hg5Ojw`Es!lU#n=-_r!?wQY{jzJHMZ5 z1}o#{87I=}L1O`9lL9sH+k)B$30WthJK}HhNM*lGY5jZPp9fk;H zO$;>O{TC#&V$-vTmz{{olK-2H)qIpAYJ2AAFjobQsXz+|zy=sF!oMjM2U%EM*iU3~ ziTMe**CWMH$&#+wO3P%t{~*J#2;w9RznV)j1+>#W$%<@RpTcA@s@71B==XPcLPH%P zJ774X9Dqw7Y0ojGHr{k5>Q389+XZA~&)Rk4G4*04iO^9ks-Mo$Iw`;bEr$-Z zvwA@bQSWZJAA*$ih$-O>NSdn!`uM%d4Vn{b&@*}N4^KmTA=d&dA8tWvA{3so^KKnt zVLFMwanQb=+*hEBR_&kh6SJsr@kCXI3BVYt(taJi$a?^b%iH zBY}kefRQ3s{sYJU7SN1Fn!dEh(5H}wQ!T#V+n$*_MU$doBG6eobN6GeWPb?9_Wtov zJ&Y_xWpUW#&Jogo$i$s4ox*#BAAYXtI%*hKy$|9_xwDvkF}4NNX5;5S)TsX~e>P8r zfo8d|_D8FFZ=#z)%$29`7|UuFQRmuwRjC*F!@GZA0Wfo2ZG_PHkx%~%YAFE?3UrjW z!{ze~#_z4jz}(VwwRP8T?8~m0*h?{~@PGsWC!Rh;k3^-J=oW4AxAMU84&lR4@)#K6 zT%u0US}4XcBX8#CTxgRv7O1Ry)^nTrdJ7f1-IbN%D^7g}Iqbq)^`kk*M{( zG|g5tFH)X{E8d7sExZ_=F#Uw{5B~XKTWl3_Tc2ga$E$M*f-lliY2c0>y#9cs9NX{x z94+$2-_K#Rp?|Pr(~jco-_SI&H}#@Ax1sk%(W%I*z|veRZ4^%fZr2_>_c|=Kovy5* zC-)J^7Gfm#7x#%cgxBA<@+OzUD0KE8m^gfpUT%J?B;bY?z#a?i z2opQ0F{cAZG7sn;COzssf>~i*C6hFItJd(;M}3OER!G9@Z$=6HG7lvK;A!x>{ZFoA zdQJ^cZ~(WslD}Z#^NqU7nxKju2BCxhrA^A`=2bz? zJ0SURAS2-Q<`!dJC@`7?=SgeY5?1#0-G3OeZ9S}f=)apf`~aId=!~@^A%TtXo6s7< zifr+$U|D5L^|a+9Vx>Bmue@r&D9?-wixHvUO!V(0KX!H2W>2L)7t6fZn%bXAHhO_$ zIoutStE8P0?X=LsPI#_(cy!DWZR8KTgg5HD6WTUI1mz)apf=CUq&`UlkUT@*lKv0D zX4t}x%5%Jh^V5#~4APvU%6J4Mq+P1V;eG*B+Y%+Cobg=pFruy?9c=TgB8@qCoDm!*Dngeq$@^XvlIU{(!yy6h=^g zVX+fSfSFAeO5q3QTUI)aR0_~dV{r`pDK*W{m&ODBG^shQDH8;Lt$<}ZBLWQ75Vn`x z!MEIT2shi+d4vmg2k2TX4$}l#=5O!9Q;v2e-CZ0?$DXrs0O%Rtl$kUWNDjC2rf{{y zA1l#H`TqDIX+UU%{GSV<%AD`#Z|fIMHDIPGby%Gc2KYu%dJmY6!1faM@gvT&-A(9H zW(r^cgwwJ)kl%s43;Tqk%cO53DW7ZD;H=7uH$S>0bj{ndhX5c5yH&-^=~h4bR{B_~ ziSkt6qR=^p`v)8sZu|P(KjF2AiI4)THtiJ5ght{8OfjSf$#@H7Z0*>hsOqw=o}>l> zX5F93pB>jjjMT$f$Igt7Iz+e4Yl|bIj3UBt6-E859NHegvm%+;oB}5ry-1r$_XmmD z8hoK|r9?E03b*XJwY{>L6HKCHRS)|*A?`Nqi;kDiOh-2cm9Sf9%GPXJ-6 zK=xI6>ahEAhTSBuNXc@x?=~o+8?;IA^d5%r+Jw!nSQJ1LtG0bdLLvd-*YNBv-p?1! zT<|Qwj_Hr&v7}mSU$$b??~$D})*akXRKUf@U10^sX>7YtIs zq~1k9-f#aP(&683*d!y|y@dLKFPy$V3Lm+JHc12M==7{T^qQ$;^5rR(1s?%NRC8ls zJndQnsq^yx`c7y{mL?%JW5tzS)hWL4$2@g}`$sAxJ(Npb5Ol;GClLTjHn@&GRTxYT zBgfBuQT826f{n(gXEe(&Amv}o)}WsPNfFs>O^5)Qx!TP$R48!Q*4_)K{P_>h<~It`mlYNhsnTH(S|z2_zA;IGdEubM=)L2VHJ*BU&`%^sd@P&9@)A*j8=(o3d9= z(NAP3+01XdB16QydY~_iH-~9Al*1Oj0PynP*CJJfd}<|X15}F&cd8Rki6nb9 zwxo!ijWG>&?NpJ85tLOL>{Lq5}M6^)&0fUp6+jg0$j0M;CPaD)CcI_0A4BzKA8WWphvmh{yLLVe?eE4P6_o&hD`ZQB_1RYk>awq;jIlxD*6~toxUhz>cH{u<13x=4vL% zJt(YZ$W;fIf~tohCQW2B^aD##`j3p6svzH}yiH>C?8{^$)+!Z=;00b4>Ofoq=g4A( z?p%Jf>NtfiAfWg$J|ARW-rCOG;11WI!fAWkg(K*9LHEQz$btpTd z<9~x(P$zxWpZ5JdqW4yAm#Kz6M3fG&xIsbVI%R;I0%-4*d*I*w0ItTLYPbWGP}t|K z+Bh)B0o%u`%Z?-Kou~mwY#@YNvVpG69xBM?&sk-L}uf-dASo{l|#CRCxQZv!NI(P1G;L2JVk z^1E}9`EJVBXQPs!d`l|*p_MePdNoXG`;4LrMsJHv-ZL{=NKjV1N8`AuYdbq9$RpNG*n05`YR) zJ-_9Jr&u7AbTn`x+rOlv0*oL!gbBSh9geTDsA|oFZ(U)OVWpX?L<8NE@GK_z$4rV zma$BPTO1Z+MdAxlAg@7h=hCVa# zr~ef52eN(#qnmWy9b#SLC84~Ecj5}r&|78i!dQ3O94K`f7vQ;RtDVr8MPanG;%lbo zXGfc`#1>U*Xf_|ONRp80XIBUFw*z+b3b+TBAq;d4b%eX(fIKM|i$nNuZr+TJO7$X@ z+DiO=`Lr8IA#*zGJrwDQ>SR)eOz}_Iy^{+rxH8JQy_Mz+5l5cr?xO zj@9^V#v^g11GlBvz{~=J@eQUw9a%Yv9A;Tffi6135d)7en~vz5JaV8>O?f5zS_PoMIg8^22BX}a-MR)QFQ^)u zCjv4;E_V5jk}PpcZ%*ZK;v7K5gJ4HQ_h#JJ^@}KLd{xKO6ri(70=n2og%I5j68`#6 z9ebc{wwUd;JsxpZQ4>&zt2~A|$>-ZPK;5eujxAt`pii+TN`moOvw}T5b*83CR;|b>Q%T38Vgn_fSjuPdQ>a!Zi zq&2mU7n>^ixfgEh)4$nC?yHTXR1kbNQiZ$`tSS|uDe zbinPua5sQM{1?*;dNv{ihJw{<`mwcIUtm#A@a2Ht1B6Qg?VoumQus@CD8RMs&kE6mR^;_Yn*wh5$G?gyf zF9~au*us*e(SmX5VPH>&7tG*?iq+)Y zGH&ysQ`|h+Mp}qO) zX{%nr#zb%?Tmv5Fj6Bk~dex6@^RGfd>O}1)^BoX-T&n`%*uIE)!Dp~Oj!B0hp_LRW z;iIH@P8vfr7$T+8fa{aQy>$HjV`crU*hDjhzbrq^X=%A|tww!kxoQpfhdXf9Q^)SR zyDtwH5==#)^v+vpdX{%UG`uymemUa-pZ2y?eCN4KcmbM1R$d67Mf)v!CSI4uHMSt^k=su6Rinenf(np&AQ za=GN5xY061Hz5O_3g>!;uu!9-u$^A*F&=wmV=~d8R-(uZF)+?_BO&yo^qAebn61X;OCP8T%@*)(vZFZ)x(F|uCTE9Wm{Z4<$ z{(cj_m~H3lD;&J}owU5LBC4z{d#GqjWCriuMX(IBSAsSZH~$8oG~j`)u@Y{H*v!0g zx^gj0@eoCG&%6F#@x1vs(s`csiV!;ds6`W0GTHFi>w&iB22G{K?7&roq!EAhLS0xl z^d1*k@}2PNQR1zv)MxI|qk0OwV>=QCdqo{_`NKL>S=3W>6evOSf>$sY2hLiON5tG; z?2?I&>`us^()UBKuqnyBgL{MD`0Gu`(0{9z4SPuSZWgoVi3uo@V>w~-!*@bzZp`@zU*)Agkc4+g}UlPm4*g*V8od?A7R9!ufov0~si~Y@cyU2dqjY zImzJIk|;w~fkUzWzryCi<5EMDp&1`{!_AWPH|^!qNirA?T?#;2W9>Wn>N=Hh97sQW z+&1u@*mc$8W6Dd$;xvx-Fa*$A!2%wcyOPo{MRZ8Y{)Oq&DC;g%_v??i0Ciab2AVr0(K=VY4&-1E&}HC zW(_s)%w8RHLFXc(uBf|C#0%Y)YOQ3rWUxvM7MQL%z)VruJ=Gz}lXxWg$v^+E%^iCG zK)kXfd>@)DTbZceuV4@C$`A|PwYMCNlUU^wVRuFT2We!j+O63#9^RqeWKU~msT26% z(6vmXS&SHc%{q?dCyau9esCiFSy%B2lBkxUbT9!YwVI0QF=Za?*@#xTSnY5u?PbzB z7baAlGE-=VcKoCusT$*b21hUm-bV0RwVuW7x2*gzSNv=s`ed-kG^@E?Vr=CKn|tNe zS(mWG?RCqDZ73ubNkFl^@|qXll)~!5-H4;Di!V|AZ3&E znghv$_H8W7^G`i^Wq2S67S=FipOGiDw&44~1pVP76B;!5q8^+0PqxHuaL_Ql=FSeX ztQCwkr@5dhLr5_cB6Mv>`S0~%7O8*3D7$LkBq8KK99@_8bGlDnEtn5{4 zLcWALbwON9pv#TP<2Bz4MxSf*T)>hJgE55M5Uhq~w-xiH&`sK|Qzf?L&XkY~>1WNa z=Wjzh9mUi;LVd{vrsZ!h)OK)jHc~4dd6Mr92%SePup?(3H3Q>l;Sub}S>+hzpz`5S zHlA4w(JQWd__4e>tArMg3wvrsU4;h5Rm&gk<`4>3fWkYfXME4Qo3&m}ORSiRCOIsK zb`(`V;1*dIodQNdz-2nDz34ysS>#fe9f_3y!TOB2+K;^vuW24MfkSiq6G6rWC#mIp z*C$vP#QK|bs7N+l@gp4O|J7;uM5Axd6grSeW5dH5SI#0NqvyegmFN&+QUarb%2mmeprcfJtLM5r5jOG#(IAxyR>V(_Vp^q0`7Z-o zmIm8Z3;z*kGpItj#Q%TASFUayOOkOy;zRE8;4SkHmjy{(I*(#TcozV=dCzEYs$yPFWCZeMU1K!rLAP-_Hh-t9r!C^1&uff#`sIBB{H^zKW%cF=d ztX)0i>G8$M$6bg(<+Ea8(BXlLmy|>?-b7{C82DQy?fn5aQg0KM(0oI8Rw!lw!>eRk z*2B5O>pJAPsk7h<;eMCy4=-$f&eEiKtiKQs2q?B z!LA$r4`}%qWwbsCXaS1KW9uj!C;x7>{+TOw{{Lt$3`1etY=YXBOEs#5Ow>znm3p#z z6@fW6=3{2O;Y#`tH|YSR_4EQD$y zvswdxIylz_bJYxp;z9Mj?R`tB?Og%eO8$JCy~4wJ6z4hZHEmI7i(Lo0wvndkS9nYBJ~d=n_HIRT;<_l=KO99DSpiw z*`)e@R3RFqx&LPt-VRN9r|GFLnIZf+zI(R7X5i!XX{O<>7d!tq7G{W5lWfk&`0nb_ zzy%9(4$F0OtoQ0cXu0xuB(#IKGDi4TJWf8Egmq|xp0rnv^7szLQ#8!EANNW`jzaO? zzMw6tpFF{?5Lrg9p3X*7-2WAR8A_MC>DtaUvmN9HPuUt&5CSbmn}78-N?E7>_~#-$A#lr?^zt<~k5_(! z9+O*!C%;TN_lm3YL%P+oT_ibH#gQrq=1_=nz*WgODez2joKB$=-%jhpQH|O z#Ljf`yBygQp}<)#tUzdZM>zJcviD<{Y3<$+uajcjIvpus2TQm{c2Sy%T85)hl)^Yk zt5K_@czRP@1T0^Fi$4Q!rkuE6{Rsl{x=_~|L39qOJ-sVkpzhD0ZJ#wGtSQ`A(HTMJ zcue&^P1Vrl|9AhfJqA-E53-=GB(Vg?sdCUoMgbtk5hS4C>l3c*{q0~H6hM%{2(84( zNTkB>=67L0xwb#Lm$tT@uZ!nMitLEM4M!O6>bwvss2ogR->%!X~n^Z z!GMRK3YD4OV={eCgQPa)8imEr1jSC4^zhfxRU}To;oZ9`L)fWPxckg%d(TNmt#Oa zPAzCm8|H*E>s@w@=Q!wc>ghKgx^P&4GZ8)hjX*u5*!)bDSKYnQeN7oTyLVRqAWof% z`Zo1i#Wy^dhbcKL^l)xW7-|Gvc2APk#Cf)T`R}H5$8-Z1=$nXNkr}T2z^t5c>m2II zc8V1zn$`-KM}s&vbF{t((Q`16`*0MT>Y|vU)zR{twY<=cq7DI!65B$X6 z1!l{A@n7Oz7;D=L6}OWf>ML(0L=AB(4xe{373w)p z^F8e?Lq6=GM*Xx+x~#0C5qX?Uk#=j=@8rjx^%$tgH}MI# ztT2PB7x=4#hI&aPzf~w(t%d0lvghFk_HLtqKg5uo`>nc zK!#Bm-A6Xb)=wvEr?lieS;QN>Gooh7LO%h5UKHH^3fIM73q$%xCTy*$g($-IPIeoK zX)S5%mmBf@5of~5a+tQ=3B;#YRd?X^5I@|1?63_2VOq)ZHgfdlN3XEMX2PF!&IKgCDUu$x@#I)9PhtXbi(OeS2%(`KjaR^M8{jhP4(U zi@Y*TrkMmQY8{hC%u>`5etGCBzXk_jbSx_Xf&EJnkW6+ad>0)0k%ed%nTg5c8LO1z z>#cTU6r@&D>?p6Vuanq}INX0)rzDmedM>$#Y(x<25RuorpQ*1h%l z4%@uoA)3RatnYIRSfC5r&PMz4IUR)-%;(2BUJLY0K|dPky%IgAYy(VbC&wa#&K`hp9ek9+tmt3Kw>YYw4 z!LM_wP$(G)VkU4b%zJ$xV+FUFxyml8DI>KPd+V4AGnm3uVy@xl6|Pv_f=Dy@$28mwn2EmCQ{D$W4%Yn;T{kL{iiS#G!I4#)}nih#Rj8)_aj_x(RDK=O#eyrb^sC3leCn^}XIh*vhMD0O;QR zXqA#3xew8HUNB~qx%%{J;3N|1-I;5og2zP%Mbr^jjs8QO7t{ow5jL+xiE8x!?K-vi z&~De(Y3MrUpWjI3KCb@MLII?6jfb^IN7pAbg5*+gZ6+=R2meZle`7EgX8aK3(o(9i zjM1Isn!hR<;SwLGbbhosZDzFRbL>{2$JRd~iN7?gaAUbmG#{5X1k7=)^%#ksE5`p=CV4_mj+T9uk=BOjaX(Z=j_b6{ zCK|V=sM2u*+Rm1dm&27=ddqMHMF&0)OtVRmcbQLzlF)>lT=&;i{T;85ddBo=nLi@mB99@JlKn0YZ`e#OqIded;1qbW2G-}z zT?U@IoS67Bd9TvD9)PS2K*_h&Iu9PPcpMxH9_Lx@Ps&z=s$Hx2J{D10DRcYAf zkm-3C))NoBx|2XiF8m~{%s8BF^f*nZ!GnRWs{mr7&^T&v`dKH%(J|?baH>Tk~vw z##iONH7S@kRBcx{$_r$^={nE48sWtc*NhI7*{*i+^G1KG<�~*pvl?NgNSfmvVC4 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

oJl1L{&dO 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

RVL|(3=n0#2(HT&Ziv4 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

    f%(_6MXrzMX|6C~< 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%0DLW5hO!GjJX()6!&E8^9& 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

    YN+ma>~H8)Z;9R5 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�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

    (UGRwa%fbKZb!Gc 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�U_FLlZUJs*8f$0=?QcOqg;@dsGK6e8`L}M@^ z97}t3mK86VjHZ>&GEivgU75P8h_w@a^KJfrD-%iN!2wt_c!mRQ&Y5RrZEF4M!r2tA zH_6nBR_ULy25OJ~=hju=^XC7{1R|Z?eBF2_ALEr0C%ml-f>|Ayal{)y`<>sF_!yP* zJE#0PORnVu(sqGOG8V)$(>~mZ7hY6EhM!NT7d*{MJ7h~~X@*Oe!Z1O29DMa}d?52P z@8jXoVO}8wy`C2wn`UEHd(OUHrO<`?$)%#02ik~ipKYoN&Z!f=oW%8`><6qIF8Hrn z*30Mkx<+vKiF#xVM=)MrJFir<@p90lMg z3H!>$FY_UDB>_P;jJkitK}A5LmLPC%RDjaXnLTr|TYHnO;a|L&5-@h?fe5NDc501m z8gA@GfTOL8FSm8#|MwL`FRrS*RgLnY1v=ZG?}o!8BtQQ9Shda zHI`_MD|Ik0=oM0g?=+-DwtG45E0qy#!`yB z=dXW@2UR4LPM(mka~AO!Vj!K5)&SMJakuw4?&eXzwf8`+Q4|6T#6`gLSYr=OXPizFu^ zcSqP?9_@L35zSFRa!0myRLEukGHEr0c={zDU7^|Ddz01GW@+ZQR;0v}+dn_SsF1<1 z?SDD;qr95e6VYbotY(WZb3yu1 zr6%i|TYNU?+&_SvD}R$FAPJ#YrvIVCtc@^Vp$zZ78X7rXKD0O#Ryjw+A^q2s>B+0r z?(%k)m|tkg+!1XtN=d7=0WvKIXr`1msUwTZ%iT@eo zU91@@Q*^SK&R3b)I?cm^K180TA?wz2|Nh|og$7&j%K8hWut9Jzn9xV8Ze(S^B7ELhs5W>R#kU`EB0Ot!gjdC zg8DY$pU%o*leljI;7h?U?>S6QYc4xDaE0ni?q8am2#oY`#r* ztiD9-nmgGG%~mEqqM`=m!FZdItcA0^KMu%sRYdzuGthZ?deH(zX5{s^knA0~peOdS zXQ<@}g{jeRiAihg(D{cM*&R|@GOaY3_ufP2xQSB$RuV1EZnup}Dy!t$>R7}(kv{x< zr~2-MW1iK!V+rExJ1^*EByu}tClDl`&ND47P~ySn-D^kaB&AnfHsfh*Dn%8LQfYtZ zUm{I14(5-wwgv}VaU98LwM`SYPo4ruu?9?#-l7Bd$yVN+m`=5L>0Qih4hTY=U#3=% zd;a>MCtrj;~5?S*4FK%_xAIccM#0xzA_{_lB&yJZNC>YO?m_!Iq|Ewhu|v}q%P4U>D? zR_9ZXswIE?$Cxa#4tJO}GuNz?Ot-S=3-o_`4<2V2ztby;77jF9)Hjk+^O<#k*(bzW zd^+S2Pk#Gf53@OjRAheF=knUz1Y23j6SK)4>xL3~3KVCwQqH-1b!izS;~%k~1`-Sn z$6-v1nNrVbr#Q=(&fKth5@Zkce@$yKD5yB@XmxZMuROW6@mc~>+ZwB#KB3x_FZFf2WY;vh#c zIg!vK%j!sruhro8K<^DOPv(D|8H`H`g{=K|Im-nai%dUMkg zG1fY3#O=*V>TVh;&=vJ??e4&RhK{mrA7MRvW#o(5;Asvxy5DidK9roj4BV)4 zXD#9I>RzJ8k6kE$Ed4}l5IRbr(Xq~2j$Wz*cIfNi(Ou)mML67Y0r@~6Ked7_>8lf0 zQIMext8G(?CNhSq-N0b?BB!-yObH2I5HobdMOl6usagO2@qv_f&G7Zq?9b*H3`t#< zwv`?xRI~uw!#t+m#lwG8Q+`1`G|WbdoZ(4J47r@7k>FV$B{u-JX{{3(!4}ZUmIof>PBkgJTkaE}2jO9k=9LQkv}$#$unsnb`LFX<4!pF-h5HQ6x(5km_GIX6oQbE` z-Zni}{b5tqK0hVPvX>1;h{*?>WJ5Fw@5*T&5{I2%KpLx7Ecu8@?GwtMW@_C1 z=kwL$i;#aZ#j|r`oyoLE(6g8_!8}mW35hZ3=DqEI`=nl>T6mbqtIANNJ$HxIx zQFgvLo@~iL!+acqo2^I=B(DHqr384kA#qBX=@JA)@))T{oKFTh@YM(TZX$VZK|2Vl zrHb^z%Jewms!q3ym~4oJgXMy{nHf$o(e}R}_6(0GaR@1fW2bali@92_@!Y)0ddO^V zaa*b{6`p{jl)Tedwu1f_zoaW4N8#HuHpo^m(U1x5QKt_7DNy=_*8DyrN{q)2Go%n{PMUu$V;A!Tq>)(e^<$51vV8 z3vRZxB{K?PTcufNQ|jgxNbWobrr`;#X!x+P2}L-Vion|T(5z`AyCtGd*d#iBLk(hs z3F%_JLj&W5nNg;c1;vYgZb&{*N)uL#Tb~?ZX2&zptJX`QEyPYgl&?~4ZNN^Bz5>Zk z(L{nh7zGjGa)*on*QD|)o( z=|pfLZCQnNO0FkZy?tIqtCoXrPFfJD4L|5eIDRUKi|y;MEW`&jp6pvmf0(d8#(AGl z!iNeT?5!AfFsrtG>ZP;>btmi+c8=rmC3+VXjki%;;)ZFci9dz65-mD8o?ZZdpZYxz ztlyMoN(XDLb}3S&s%lzhD7r3H(7hAS@>$@U^RFjlR%Gi9%Hh^zIs0d(x%*TSsQ^+SQ- z2%!I@{$mkG1^X(;kIKLStm`(~`2pinMaKTy=AMR@{x4M0%%o5Zv0<)W=mm^V*ig5s zYc1SJvq^Vw44qgLKBOOXOOy%oR+rivZjc4v;d>^!f{pd9a?Tw zJ`;ilt4mW%9iA_!^zafKf2-p3u!rglEpGpEG?TO1A22APQo_f3xq|HEXWgPJeE@?4q#c3qVbC?cmMqkaNCQzOe%%K&AgXkv-WA_vzp6HddnUvR zP<+^u)KMRT;app9@Q2U7s3_j7!4xrRmckSXg;Qfx+ta#@bEbj>(;0Y8vKSR_Y8Ob~ z`8~5$t-YBEf+iA2GklBU$w2#QXKJ9YeGMj!zIoJ&9b;+tr_4Zq1-pe-M&%QlyEa+PyFW6w+xiF~H0gTk_A-ODRE^5PfLT&xvNM7x50hC$OpRmO<0 z0w#qEJ~avkiJvRVUYsc6hpvzl3`W90=!@mo1 zr?s0i;zj2Qz<~YZ;7JiX%=1u}&uDwp(@i1a$4lv6p93Rq*E7DNt{3oGZdU6rgVLYV zLes2MIMbc>4wNtZ59AAcNquwvtN^bH{r4*{{4H*BPrzTE`e=f@4mkIO=!=OMQe~+Zm|0^x28SLC^?5hyJzkxt8P#H_NgVzvoU6TZ1R@Nd zJZ@TF(eT{-*@AUB0JM(cf7JYFHKt&FGHV}Hf z&TzFNC|`P5eaNag>maufrUMeJbh*j2Fnhw}jN5q$hi3R0QexjL`r9$)j?I7~NL092uml z2k{NJdgFSj8^{F5uZJL)M3?1_HilX8@pIY_ibi(F!IcKH-ks!hke69@#W1ySK#^qn zRcu};H-!@3r*((J5|!zwn1~r)&vRfx?ng%^#&pj>w~WNf<-HYrR=49{6wxq(#m2&p zLe4W2vpF%dYp~UAO6S^kBxl${hOAmOIqj3p&v8{0K!&dwNSC+!av+&vyV;VK2&p|t z&XmP)Qb!t(el*k>O&R(s=0C8}+TSFac`xY1uG+L6T$Qt>OUm@2-Xwsf@j%{5v~t9r zAI&dT-<(a!(aOgQLIwAa0@JGfbSeuYI7ITM3AVde$%ZAj_JRn&=O&Q%3AWPtnV z5VipyE~c<2h~Vae3Lv$JF3*HPK%@{5^tQ0FpEY$LU|s!wt#|ob0O*Lq-9H`6sJ{TV zD|rdjdl(o4s6L%RtqtSf08xLPD!ETeS+Aq2Pf>HQda$S2pN&Ht8B7DTx_WS+J$}K1 zG`U}YA%|V5 zMWeE9i1~9x08O!>z=Qx1=g}XGxsci)L#{X}FW(gEMs(%@J=86UdKrVtRf?-@ltY{H-_`e?LLY8>J?$y^@N4&k6%&R7Ph&`en)=o@ zCHJqK7ziDhpAKa?0PI?Eg(R>c-A+FS?fTt2{0cjpCWd@8>Qb9gY4dk#s^BWw%N9n& zRtEbniM7*lg*sy?@G1JG(6@7gLUG44H`C<4IfzEXHaNjN;I-o>3gbhWV_%zB+=A(gcBuwv2qM0hsayP_&jWIh-=nt`PG2qe9*>X!x`csK&Ii}5 zg1_aciIs_=C`xB*@<+^R>7dXSAe8};$WZC(qMN7rDzGPH)-q#78>%~(MWpE+jwK-{ zHV}C&#ku$~%#0;*<0A_(Kcmp~hfu)k&eARn!S(*x4ElCbM&QMg|IeDj+`tL1#*<$1 zPEe#5JXqM;sC=Us9hQm)qXE=MSF73K#bKM@AyW1miO09BW{N@95rX>tP`F~!8%WQn z`n|c211g+Tvge?XyW88uPT~hJ$l*3%Nat3=+y&6}q_#A&5i|XDoB2KW6YIY$^0)C6 zU7D8`TR{fWCP~Eu)K0Kdf?|=s7)(u_x@O&D)n6!RyR_WSbFx9#O*t?nCF?Mu{i&3& zwOpdnl0*olYru!@jh`rKc$hOsS|q6P zX%cSz;>pQ+c+&@#$vprBNQpSmJ%`-Q!`WOxRH}5ka!4T#WCI8DceN9N3@OE9X ztOMrW_`XCcR~tRb zZS=T(=@5GowwCPA+*83A1)_^1?i<@*b9Y@%Bo;KYbRlkWrBc|O^M{5pTxOV3bU6E9 z2OrDl+=GLGcd-az`E~o5;Y^@uXjK|A+fpulJ-#~o-C@7)WqXV=!8k%*R{%WDxO)$4%paU`= z-M++ch#>(!fB9z!MKlES|5G!~9M*IP5c0J2aAU`gv%M3Z7@&9uhqfy)qH&jos_FB# zbILu=U`>Qc(k`o;sI!}dsTpJTg<}&uhK?&g4$1_+G7yFW463%&m1U3o9`EEmkUIs7{(a85+ zOWaz$F(eIg=CIL_kr8ivQ9H7PG=si+Jy|o3C?5thP{{0qeu*Gh`cFie{;WQjz&ag# zY&A`qUxQ30PfUiNT;KAXoOsdZc<;2yL-QQ>)o3 z74rrdD;EkU1ehbG2S$6R^x+!V<&AI#VT7Ty0Jg4B$gN5kLP2Z_?Plrcp^L`=SLGBr z)pY%Y{KHih8O`~5heun+%zDlqV{QOBy(T&%4eOb;{KZcJiGFtzB`Hn=Z*jkZHF*~p zp|{?H=kA_DpU8S;s17X+`WuRqnX|z1)^&#NCdQ&tydZ@VtlPI(J#p2J0*y28q#+cU zht`zn{CPi||KTD~IO_=dvoV&8Al~b(A+{ch=D>E$x~t8s6fHsgZ>LTDe5sRBbY`f2 z0xuia`#d?ScY7ycf|kJtYa{iybrcyD`@Co%L*(^3#?sn?0ZJX*NgGR}N=56jAHZ{E z{hEeQH2TEH+ujGkn>5|{F(=3E&jx^ez=e|LrSk3%AICO}2FG@P zuw6nl(gF3oE>cLqu3=t$4ruhozAHZ}neIgOt<#ICf(Vmjc=_Zc5%K|bKZuOROk=Hb z|B&wqsH1>o&$cFBb!<8!0%BC>5}X8gNFREnAZL09in$zZ`~i zn}+_iuV{KPNu>@7G=0@p#n43m#HoK#F=1|e0###ukV6iR1JX3syi`1CAB$g!3nGAQB^6kFu-SIB_J0W@7eH?Jo&V@5oQemtFNC@9X5Q3c z<*at7%YE}q^T1Sv^GIq5$GP)V5w@5cqGSpIh4t{6eLCZS4lgJxv++|@!Jl{ZtU`lq z{b=G1R`y?d6APC{Fk9a&(yVB4G(9zQSXvuA-gcTzhdu&2w5Hv^?Y@HwkWZ$sIT9Y> zzmSkat~I{}Rc*c6`PF33(XbY@AKrPD&()u7Q_Uv#OPJbwg-<0+thJ@O z?;T@aQ79>rh;Olx@LT`P3fwPr`j>ZD&mRcxG1hH5@*B09Nk~fPU;OODPat2!+7#O1 zu+6qy?9P$-H$-;AHDvb zTzRi8754Et9lIw*`5oEaDLU;>f_5~WbhmU~?IkF%l71jAym<~z2wD$FW7DTDmm~I? zAO&A-J!CV$-I$ckd@{~^3 zVoVgx)<0IBWJPuqibT_uzb+c#SKK20E|yGXtTNNSx$G!-?Ylr>F+06etu+6pisCl@ zIL78JsNFq=-Dc|5f3RfAfY@xT0RvXV@p}qD9gj;3aQ!JR;7v2O-BKe@sAFnu z`!e-k5c&RgR$vXMab`=E@}n37N;Y5lPYH2Bf_YBaO3H)QEtAUZfqpe~eF0A*$Lz26 zECSc|uPeKGr>t(iCDuTEN@dpcqsY>+(as!uKjL-WjD+1@|DOxkb>EDZ$C8V^%o5*+ zy8y(d1{yrwy}}ySaVC}}>-@+_qu#85s1J?UNgMy&gWmMo%HZY2{-rQIP`gX=|7OWdfs z)2KHt0$R15pC$8Sjprq1b@XAr&m_*t4@Pk(P9nvqiKAh@Zy3z1&(!V#whqD_$#Wrz zGRzKnI`+;rWAX~DA5qcq?z*zszS8O=yfW2@j1PF-NRG0yTGX$-V#v%Jk1 zo^P{nAZp4xdZES%)4j(O@>4u!RaEm~%qG`jWD)4S3VXI#vwsO&7_xMs4CXrY!DF}4 zbKs)Wk_7$D6apmy@F}qsXPIOOjOKL=P9k{Nw0@#{KZlu?$=G#Q}xs9wG_ z0_sNiDTqFprEk;?V8}bzeu#k$MV{#ejierFre<})vG=59Mny@pJI!6%&eQTF4A_h; ztTCO(GnE>+mXVx#n+q5`qrLVAhY1m01`8u;j|;OB;m36w3I8?b*;67zD?wF5!jQ6d zufbuEli_z*{#PQpV2>RYQBH;lVU*~vXY~L@_Z^t3V1S&?K6a;g>p6f+^NQ_sShJH+qGGlutLv00DS|1EJ zd<8!Bo`Zq&9nlS^w0RZ2{AZY2Tfzm!cBQrQ=69e0-8NwG#4!+pozm_s(-y!aV~I)( z8}`(!$I1~(7%dpNsc*>b@`T$J_elQ!9cHRIYzy^z*ueuJNHn2dy*P`Rv2)p4zxX8F zbt;#aX?TP1s?>k^We8uF0R{e;aD`|=l^`aJprr;&qD2k2?})p>fNkh#@U>IVEWvke$>4aT?6z?RJ1`{2oy^f#1`LMO4-$Tasf#YA`QJI+;*t zBxn-r@HhAys$~IvnYq|59f)RuKHC4tJ8Iq9lDd;}gC2bVq1dva@M;9Uqq_EWf8&hS zKm&MiSNk=OlPQntw^1ff()z((VOQ>%fs_R<;do2e{E%IqOfCv~jvq+G2&VHkWk{J2 zsz?e^L3%&K%)^NT?45pO<Yg<{53s`?8Z3?%$r&Npp&A*pKq6Kp?UaXsi!*HTcZ&b&A(9AfLpXP+*=kH*PF?_zff`-x{VGaeXOfJ9PHGO4KF_f>V82^e< zC+eW?kh&a!L?sYL)Nx|?3f^^IFbVb7&htP|5ahDQE^c?rP+6Gremw$i<+UYr#R4Q)O-dOz{)XDE+#P+-Tc%P$}1KB!lW#O{B0EPWdp`Y71VtT()!dcp#=` zL~r}}Ckc7&ro1ef<0fg|>M-A?QI@2VINT%RRp1loq?Xkk!#s2zb_YO$V&O=#EFQ_9 zvuZYN=TjRP*5F=pO_0|OQqcc(+qDDxf&~D6F74`R&(zU5DgG)3sQ6ZzK<;Z}c-Fvy zK{B>QW4mp}w#!=PsR2X#)1Q1V*#Lh?aqOABndZ7eNkPhQxBdH!|C3WNrqk`e-_pUY zt+NF9W(Y80f$*;zu7ixjz5yH*JxW%DLR<9f;3cq=yoH1g!IU~Ek<{qfCdO)SrEjFI z)6>vEt9Rr70S|@@ObfpNO^L@#nJ8-7f+n#9md$p&?m*5KI~K8mCsA}dAjgmRQSebp zU&!|^G3XVA$jz<4DgvQnRLv_ixybgwGX0y#`u%;MNioGP?O4@u=|g#&^VFc~J#;>f zsDTr~5>d6G8YW+d&K9=Iu!S3-#5p-^CcMmF`5=n{qeW&%CauI2PmCS^Q7#uhOW2vi zj8FTtdc$292#VDIMi>2pfQ0!U(^s;0`-I?>gUETX8O!ooguasN{Xmsy%v{AEGROi< zQ*eAF#^4MjQTeAFHib!>&Xj%@kU)ihJo%Io^WeyM#jezXu{w}v zobtdd3x5}eT;5a+#)4Ldp?(Jf9Kg(cGkdH&B<%o1Xo^zg`k4IqO*)GfGNWq+AY05) zEgK}Ig(FFxQDxNYZ*I^*Ss`l94cwFZ~2pnX{LL7q8^nlRQh`XI@cDtHBQ_v{g6axu-A+D(QnCM~1F zm0r8=VEkP0C!* zYo{`m@iOeeY$FEeaTNk1-14Cb3GRmi8?1Sn_cLs47$}cvR81!7Y;7a)OweZ zYwdk$wNt~aE4=x;Ve>sFQIeS=>8@LiWB(i((X6}sjUqH>3|g@|@hWW-{Q*NBI>>Uh zhbBUfNZLtbXcZ)x(<^5~*`}U~9l2d0$2AqUlFhs!`DbOo_|wU!yOcMvMO>y8GqbC>O&N9wQNiC;tGAm${ zIh=7o!*vI7i_S~qlCE(c3zniU@&z#kdTYn7L+uIHFWz1yexM3ebo)}QO3*3!6JvI& zjlJ#6yRg_xOwVl0;km^GGzkLUuX1s!95MWlM<6awZ>wu8X{n@V6}FtqI}w? zvR?g=MNQCBt>FO?%Zx|YR@^jZl`Rg`cs*i!t-L}Dv;$*cyRigXSi}#?@&gCW(KM?e z#dJ!kbyiMY&GPe!h`>=P6 zy*f=o-nz(XIDyoo*5s&P_GjONrui6zp)CV*giRcQw9!b)`@2Z4ILE)5!t^oPLG*>o}VbH|9x=RTs`zlr+=D z4}RHX8>+&OLCtHF?UleM?3u5YVSIVT5B@x2|3ss+f zPXgrWBy`?qSxRtec?%BKkRuie3qz<-pv6@mVqJ|g6w_E`wSJ&ibgkr}Hvo?7NdNmG z&|me(Yz+SMssJ?-9Szd5f{1?f?On=2OybW-JmAiS80}-T3mz8mF)8BiF|a9rte)u@ zUbO+ClTX^y3n|7}Gr$g8lO#v37T9YN*=7x)7)DquDD^f4FIhnd`fZnXs=}EwJWovpUkfu;+w4Y=i8UTA7axsjgv{$#~m4fA~+s6@hW5RPVuXCYI<;w_o*bEsu(i9k2zZ% zqU4`%fQZ?UV^cQ>26SvBSb%2{_g6|q8)IwDbokcv9^A%^&sxES%X)5-J;8ITFo^uO z5e@FBM2{lzw7Q?-8)D%rsz5G8zrSBZ7=qV4!(0NiMfA@nIX5c91KW8;aj`w~&cr5- zJk>+ypWJhFeM|%2K*Qnfsd=VOU`G8X69^B;d#z*P+Ej#3^4aza!X+j6q-BbOWd|;< zv&$F|L50bC;9?h;Smi9I+t&YsFAPIipJc|0A|<}>73{xnM1)NTq)_CkTcZ$&^9Y~f zhWG@X6lmOnUNfEKjfOFGd!!zUN7Wt2mg>eCR693k>XGAZH+P!6V`F%Q?z$%x8fu5M zg%Nzzj)6#$m(v3|Jm4jcN*(X>x|gVs6sM!88uHEONZ`k4yfynoqlWah2#o+z75mc> zI}?#Pj{i6C&bG9ZXhzL<;0D{=Gk^Z8?j%sm6QQ2xt+k1pUoK&$wJ6e*dc8{pH36r# zfH0Yes;$tWs{^TZW@RW1X($_wyQ5|O0)Y^hG)2!)1QmVlwdfYLoLh8TC34_n)v3k4 zliePz#gxx_UrHJ4PPSQj^3VnUiq8U_O3jU*kn^`d7=u%!aR7KOCNtckOj&`T6r%yH zKaXFj(`TWmkHaBpnetP~@<>}?`KvU(?@M<=ndZJ;<0-FiWNQpbx3M=0o$k3s7{_z8 zohc^6pUq-~J~<+q`Z0t0G$S|A{36b7)0VZ$=P72~^W93+JY>W|;}G=dvzGdef8<`t zED!rb_uuAMRn6giuH@3}23#ge7WXrF)g=4&BOG|NlIRc~Spprsr6V}yCp3vz^l5^l zViq_QqKTj0^_ZFnp~Ir_?`BpcGh)L)NPIv7+#Ifh{st|+ak1QOs zevwq8E)Gi(ZX)itwa_y_gQ~j^q(LZ6U!sR304_E6$|->02>av1F5PfPd)qgfN1NDT z+(Wm15Beh6j{P|B6k+!pWYstobxK+N6=X^ptdyLkx}3 z0%%t&fVhP~HJV?9BvooAj4dl$k9g%9$3<)`?w$T{xZ(3=3o6Y|rc1nw30x9$Wt4&8 zxezk8R|$$YwC3V~l$ud2cfSL-b#BUQn37lhJ*E&bGV3)hXmgF4+L1fzWgyd!*DnrX zP+`rk?dNTy<)ms;;@Tvpcgn#A0c@J+(cGcx@or|CM3&9$U{&Ow811%X4c`ziG)Tsg zCiJ(&YLw=7L%h-Dwm(!fl4ee5Uv-c3 z#iGyHpU4NQY(&Eg7$^Iu*8PemU?x+Fvc$rZRKv8ML+`=bJUGZ*^O@Z`CSV=>bD2)C zO?{+k1}?H_2EQ94B?JV+na6Ov!H^$~a$o!SU5i@KAkm>Z9fo~#%jD32x@ENg25Buj zufr#BJxkO~-SAGtrT5MBI=mNUv}eT&XK2?HgKBD0F!vu|y09(Zmo-T|@PMfzb|MSA z33*l~X|-WhxjQN@6sqLZrjRImoo6Cs!N*czBOzcD$F&K9eR(}ygN=HLy$S^>ZSur` zg|&zS3Iv)aUX?HD;-1h zBgz3$ALDX-p7Obmx+lyjR;4JCJ%kuN8r9O9K-LYbU15pl%h{tlDT=)H=naXG{{Z7(ojJ>OqGhib&eE>VJ(X6JF%$AFxQ-b`I5J8VA+3}ygov3= zfvb!_d6hn~W(7g4XW1Po+N`KIm(nP6lt1=kH~A#REaQK5>{X@6?JD8!BamFS*#)_W z&hVsV6EexdSXNqwdZ$CXQV@#}(-3wu>UI$EJIU*=<~uKxO57f>B)bm-bu`nLB}wt` zrOvbkWI{Jz@S_)|6*ty^Nxg9>i1{9Gys4VT(h2Ao#5>M9t|&>Oz@jSp7FWJF-?j*@@{N7>mr zbgtKP3vyX(KZS1S=u@IyqF-Vf> z+k6P*TNZ5PV4;b@lLYI(P@QEXCm3A&%^{}NJaXq)t(`F?fq`Zn08sK3lt3m^gS26U zGU~$8wmEnwj6YDR=sEU^50N>j8pC4~WITAq zml6H?dh|aIs-)wB?K5vpqXQFd_l$Cve%w6eflGx&1U~^GI`_P#+I%MKLRynWPo>ED zOB6Rm+FS&LZr|qGbWLoz&YwI5yF2nHZ4e9igHh_#I$|cZvG~t> z%y(}8{0h`ed2Hk$m4t1v&`g^@3eZaW?SVF+N1x! zg^>?l)D{@2BMR*Y%Z6=6moO0fbi2r~>!gr!4`#pR(B)vHl6`0R?dogPu&$MvpmEHy zoSdFbf0XgVW6BeV|1H{AmKRynOzz#we9PlnFK{`Kcd<|D@*mh)`MBp64TjXt>W+1g zq{sf7ZVVqQ^;#W(HO=+5&ML@Y{1id#s6^S}2S&KeZR;54>y&0zMLEbwB5%?Ib2PKB zaHmV7$y}%`{tyH`yjsKA;QW)bR+Br7JDr9Xn*7C6!}OOR5SQ3gZ3ndKMZT zX(XcA%)8?L|5dPn+nvUe(H`PO&AI4z#`REqt;>D#GEuLnICm#{_T$gCt*P5qTjacK zUUbEv?Bw?h{U3{2(s$ot;bNZj1ld;Ks94o;C?K!Z6;UJ>PJnnXfpV#*~7B zkx`nwZPVvGmm&GCn4EQ?z)%;=U@O&=br-x*y*+K+*=lY6#NgCkM{qKm-cualZN0+F z2S>fZbwbh^kUAD9z3Q6qF{$roRYDjX3NhL=_pbuFsyKBVMkR@#USX(lbI}(o``o8z z6rjZ7=zOfM&^vP3rskb&_6R^!b8r0syCG4of&Q9tfe*{RQF+UK$KtyOw_nWqP%%aS z8ri8hPHEHRRS8)`9!BpLC25pXLg-y>Qk3N~B)6V;K%5iYD!c?DfM~=LGn*Tq^ActU8tqe3EcG#L9z~~~!Wy#h;2|(2KaXq|CTYq3=V&Q#2EGlRjZ|g} z>ZxU5K}ORuIpY8HDd}6S{ft(rqiB_Il(aN=Lu%bOVRK4GIsGe=rbUz^%+Z6(2FQa; z!zznueLBf>#;F@*^nOea;x<_X!TjEds5KETAGT{yWQx^{#Fost7^N*D2E2gFFlZKh z242~TMX~UV~u0Z(Jl@a%1RvjN+1j^vTxT z(H_&#gyJMYro=2f9x~xt3$2&%9p8ln#-)P;^zHYwcL^pu+SYAG24zd3hXVMbDF}Qv)w8rY%(yC#SM4l z&A)B)L)T!vNt8A<2v*n#_9+)QYyNt2L9{g1rzXBU#lL{3ZOV7TqW$wJ|G0)YFvs$$ zmt-G=wX9r?_E&VCFwvweTmV+Y-wCf6MIXKS`eoF z4!^}#GIy!Bg_1mFn=NggY!y|gaTbq%Fct-6lK*RN-8ZoY&5bH z*0^`;LbRZHFxe6vOm@6SO-62aIO)45TsAX;p*e0sADrDk<|@fuFuKB5flPjSel>@Y z@yH;Y_$w@E{4!aEz1oJC3b#32psM@!pGFZ2vBc=s^bZg8M4 zM)N5+E>tLJ`C3&keKdjj1Yz6ZrRj>@Iyk|7%6&jNeik4jH)$R|XQ1fuK@`p1Eg9fy zANa5F(4Hrl7-92$x;a4dd@rJ?(pUwh9EmUl{zOBD({p6yvrs3y_nm@nm6JY?u_dt5 zxfJX5W2(#ae#>L;nbn*#1p*ry2GcSZUf+V%?=$%oW{zJCW$gm!h49}A{Um=i)I}v( z<8|`tj$t@Z^J5_xD$)6Lv|6G*yvJQn$Ghw@pNCT;M#CU$R3+b!629Qghw$V~**sPa zV2@ctYeqAI?+(I~VuK&JvsaZ(+yd>Y6%@*2G*!RGf0@%ff-s zovsdAZ(^8jcT6iz}fyU}RFi)^f;Z?%R^r ziB$4_4LJ=hU9O+$5278oTC|C|sQDlqL|98Z>=Er4_R4zP*6MUXUbCNri^fWpAL@Tl z{Fai`4B!+cL-vpn#GOEu+-@h;4;DOAc|Ng#CeD0^m8_>aB4u;{gU)iAdGE>)*8;~| zg@Sq6<9)>HR6ih<49c^M&9r+706?}lm+Slk?GJwpt>e1da}^8dxuQT@VW^y_&-*PV z0T44nVW~S(UGaA0Gej?_0FFLpjQ^830-xyEG>h+~qX`zgg^|<)#2O<@(>^H#;!llxE0Z<4pIh2 z%x{pUS;-mk10uX4B1y|+t^5Y$7uCjv9hM}d~(W2WFwo7e$HF5 zRK}L<D^>y5HMXSGMVaJOXpYNh(ZideY8gPx>c*|UUdM;Q_Z&X|jU@wMfhi9&zn22F zu6w_|Trjs@HD&x|i(_F$7~Ba!gn?$DR95l=!&Pz!{Xa|L zQ7I|RUUSy{>OaVL*lRG)ylj3uUs4g_*~6~!3c-H9-Pf2~5Hy-*DnY4dPcnn?R{`Wt zx%_SJ4oyVp!y-EV0>2M~dB(TtWh^OttfuXbH|KfTu38;jgH0#lR1GL19Jy>rds0I$9Kw`46BHkzW_vw;|;=KwqNIa@t@?S5k)HO zMVu#(Y7N6tW48!ykNRU77}qmmNzufM=;b z@>-j(V*<1hAl!czt0x!}lPp9Hjyn3tH?{2?16&k-~2Pm$Yd zvjZ8MTV6h2{=AVM-Fl?S%Vuji`C?OMEB)bvh1K>5pQ&VX86N5fGSM}Ba#ybZHk$Lq zoKA%njJqILM{iA-ALphN^yj;h%El*F#+Pq_f+3X;*l&CVXn55(e-~*VMxYV@byD;j zd|Dd84Qs&yXIAsofj@Lls#VrMu`hY_rY6qPJg*TtSyKmiX?19U_!Li`C8Ov|q&QT! zAB~!-;~PKfcZcput;BoI4jBbn&vopGOu@)y<@T`6YYp-;m!qyIy z3>;$H*qB7gpBp2r|0*9?H$+w*uaQ?(1@$2kqi{2+f+dqz4v%a^cVL+9=^(?m-@S@i zOR=XfJbH6J8T1n5{EprKtzuIwiM*(m6&5=bYj&l5nz$Lz%nkG z8Avk#I2Jw~8_m3QL7wk#;I(bD#fI83e)|xm&nQE24tx)?n&WE%`YvLdJdoP8NGcn8 z^YC+_C9&m`YzNqNt|!*?l905St7U)+bhm6^QcewpKpP?Aw6rsJ*YS!Puc9BvcG=J4`D&i9Rb<4xT=;0hTdBVxDcNF1ltN`&H=pJ^ zBG;15J3H}3_n|Zmn3Hym#O^6HDiTf5wWk%s+FoU9RC~b5A{wY`;mK0XV9{+lF?Wp) zrI=eEo{V{6Asp<)jGPATQvdNtM#<$|)5^%_stkny$PFw&$jqfsMCGdVgEQb0$p7 zJv7^&Z?&Y~z19%*k#nAY4jJ|iOXA9=D$YbJr*8wCL!Gr+uOBH%mI|PQC(6z=*XwB; z?AaXhf5hjZCN@ zci1rG3Bq7DoqI+?xUD$S%ccGsZ&$GWaTvxSEsPz!+`&@%AwZt`~Ubo!ZOmXds><(D9yE$m5;# z_`Ev)4(ILMmVrA$l%!+`QAMQKYyX$>|dca`8=Y| z66k!q&#+F=K9dyq>2A)GT`ShO$$cLeC3VQl56NC`7{ieXH%nvo@3fMMXu$P8l8+#; zP_Du`1hsyuD690%qoFjueuA1#UW5}r*aI{5&mVD2M^PR1jWhSSvVI~3ZHr8u+DShY*lDzfKx9}fpDxcEPi2Zk{(JpCJY$s< z&Qk~(HPMN+!d+;DD40~tIapwXPc2_Auxf9LC9KnK@Pxhqxr%Ni;0Oa@2WBAq!EtT?X}D#sF5`-S7+RV^z|Ni6_~^aA#}doPUBSKh(h~`nlOZ+ z&5oY76k1w`9WC-cshU6^%o(_dlB4;lM88&sDGw}iPl<0G~p ziGw*LA?YM%HPoXRXi9ok*XCQgxfPymCc`EFSkY@N(_=mkf zis?(6-i|E>NO*@UQh9@+rgVy>R7503898+)k5AJDW-h9`haGg&?>J?Y|MvmkVfQ*` zE{w$qs`FCdp-Vfur=YY!^lWIp+2f3uTwmxwX(-kt2~tDFU&EJ0z6T?#OeRx>%~izY zBRl5~E*QZf5cn^uw0qW0^2=BNSmG-f$v$&tXcam(Ar~B`V~vx`JyUwIF1|QL_|3K^ zpWNJz;FTdsF5Q!>dx_?X3;YRHr@i%EXRvh+yGgTH2jbhLAq0Y&-^OG$J7VrS6Df~j8akmk1$8ecB`gI zeP}+QioM)6QXGJTrQ|j}rn>(V1Wi%3&UZ*#F&6o>fR+$#y3u}JS5IX5N|tCubzuVQ zV>tp=BfjSx_=hlx#5Rw~Gz`}<#l5bK%V4Elc(CX&-#lR8AAB^zDO5SLa^2TcSp7gE zll#OE|Lz_kt_{Gm2`DiKszzoAc2tFx&Z>AY)!W}Ocp7$=S!ILzWK#ZsNO8*mt9imi zP2mv}fKkPIhz9aT5sv^x4a>G51{cH;s~(=rp4Whsm<5ABIA$?GPLA)08QMNFKhT9N?$*&*&6rzkM%1{*mIYFPP*L{D4%>NMXU$s}%<~;bTYj4KP zV8^sB7@(0-6`~qq7yG4f(A{a|Kn92=4Jwhy3c@fy;h}o*1>9eA{t%la<5Ch?SOUJ) zJF+%)r$kncZJbYUN*Z@eCGl2xc_D!R@=TY+cAd6-B4aG`rID_`_6=)-4 z6iUsztd3s*abjqW-lYLg#1aOSKiz$+L0??Gc@ng79~$X6h8-WJyQ$1_H=R6HrOwUt zwN#eL@HhIv^bax`*qjQ=G_%h?Dh#OME$=q3^S?T>`-bJh@v%L2^&%vZEp_sBtSV1J zqFlTLJaTnM2}y*uSXOI4fg(05CoB%20#YDk5=WCpTB2BWnuju#4OwZS89Rj-sE16O9Jy^3kkHcAj6$4Q6945UK?0|TTQ$bCFIZ5y;fW&e2 zY37o7{K#>+Ny$5HOgXNIc(T=eH{+V?&|ZCW)8DHtb0q=VQR+L$HF<;5Okk54L6oQp zh4UL?!Du|eB=Y^CvWi0v3B@mq^Xnzs%k?AA(~yn8MxL9JrWDX_gaGe<210YjCbW;l z*oA7z$<|78Fb$C`A$lf&-Ei@bQt{q=R3Vl(LbV3k7$!1EH z;0CA#z+#f1W(FTQq`nd`=ug&@;k&wK3`DSUv#s-4S+ZUc+)Ts9 zMSZd(_iiS~ugal#`A_7p*S%Nn(x)+zalI7bae(|W4nam0<-r)82Pt<9iGc%yGm4N9 zGp7(MmqG-YZ?|UKPaUM^na91LnmWl|Uti>&D~kAqw06{pC2s^KPFD|r*VrXj(nZ_> zv_X1;qtk2tDwXbYb}OKXcO2By+Ljqjc|F63eK6u(+Zj_=^YCSWdB^9b^VyzWfyKc< zzGE9H)w)JIZDtzlU4Uu(|`yD zZhme*?{=g%x690P-SBv0L#2L~*RT*g?f8!smeKl-MkBwg{GB>R8o* zb=!)!lL;?;lduGlS6k^o{s)uujthI(U%HeBf)S4tjov?2eti!`&1h}%41&c_)~Cb2 zgqrRs*y|vAE;6y{Mv$m}!$voq#6&m(B2RtR*fxlSA#feb*Qaf&0Zz5X+!x~>_L2N3&45xcPe z#sa0A{gMu?3;QO9N*NZz7mY;1kt*>r*s-*lM*YEFbmjUXB$uPAIWY2Z2j)FoIn`z( zjIiccDocek6D0vJ!0%g$1N3^CKr9E9&5%q&fW^FLCU*a*Dt|4cD=`I<^1}Fc z;9Ydm0?SwaP-P-pXqlD#5GHRK{!Ki9n(91ZcPv}!aAaYIs79QkZlyEbG)(xyr6NAL z^&#CNQAQo(M&BGXaZkpP2LpI~34ZrdB8cHL`S_KFqQa)Q(StxpcEg^E;$aRfdT!p; z6V%tgJw!m6lhQkiD`{##=%VNTLCj)Uh+c7wj@VU8*hXu4t0Cedwv*|m4$d$(>Y(MK zrCrOWLm@lvj_J}0_w+nsQS$DL>JdI2JtC*Ib2?WAd*z#Y=3(B7%k$*$_ErNB;f$I) zY-60tW4h$qyiHCY>gn{7X>*U%jWtp2OzrlEdBTehfS5|b3(l(n-{wM?^h-HE$p5}! zL!(AZ#8mOpyroI1D?YQD8z z9#OlhY}mp!!2$;m?)8*45e>P7C7H0L`U9Q5a!&*7;^ZVK>mw*laQKmQH-&dxgtg4J zC{i+5T9#rCMY`6s<>%&vY|QCz>e1h^B3NLWPt>1C{WijsPDC)X8;W{%0QJMPRR0-r zX07uPQT^ZyQ`C55Q@uiMo>F0G)*U{O8f8@#!vq- z4P|X~nVVTSP0or3C*>nnB+0@6w5`fY4_*t7JPwBCRZhFbnE&Om=u?f<)wz3&a68E! z%fEAQ#VhYEc%Qc8_m$1lrHVosnNd6rUNr`W9?=kbAZAFV8M|QjxJe=LoF$jcP!fZ0 zg1W$fU~&$jAzM(I#O8LQl31ASd2ho;$3?*LGN^qZ?*Rb<-6v1-4vCXBg@VqJVoXX` zhG5Q1_9|2pdYMQNYe6R>rqu1&Fqc|ygnG-8CgH2>8 z4&?C1r53r;u>hhlJio@1u6Oo-T*pJkpL&pQcZem|0phdzO800uY6Iwa`7Bh>@k~|5 z<54I&r-H>0p`~X`zVXA_YgFtb#HAG>Lt#yXpyiCqYZr*QOMHyii|06St58xR|FF$p zTue1i@;DZm;Pn8tn(WoPU)c)N^E~zw zq(X_iclFtJAu@p?4l}ly`mh+hq?1I#xL4W;rqx9V6XR6Z!x$m>f7NYrob!;54O!x`l=>;g59(5(gakRaKhb*G82B)*8c%WG-Yu};P8nY69G)6fs zGc=sHcylXdb6#k?C>5Wlp+Rk}63r!gJ)52C;4?cxlW0-vT`<2P!3t)L(5S&Jg`L_J z3Sf=x5xhzWxL`VRuw5d<7q}eIlLWGOe;e6U!)J41Cryp2Hl&7dv>H%Fe*K_;A`Z&5 zC7@uNkp}>zT19{jhQDHOnwmLqVj1>|T9EYef=#0lFd?VXPF~~DX`V!Y60ZubzTguh zL~f`|=R}Y$1e?Q<>O{`0_1#K6Qngli zvYl|iSFH01Pvo!p8fN24_=LiSAUx%RF<7lzC{Sp?wix;7T80y$NlVaUneGGq4{KBR zmg{U7@*T0}zSlf7OK|DRB5c#F>id8&JL*Sw%OJO8oqFb$wiaPG)vEHMCIqX zJe2nk_7nQf%r`*1q+>PcgXm>=lhT`q8Im|5>OG!EkyAv(OEdItjUqdmM!4_4+4kp;wA!yHfi)&7%eJ?OHb7p-zUq5 zO&K1L5UujMvdnPTLqbua^2xe%S!xT}&euow9G<9?p+^;Hplv}s;3}tNp1{B?>r`jx zsMIESP)P73=KTG_t%tV-tqxe-8h`vC0vIpRnvj6z(Z1l|;&w}s9?i@6arB)&K0QTO zkh{^|QA7&I__Ka9?uiU}A7yGepyeg9c2PE}WO;q%l}_%s^Q+kU_FgGJ@u;qkNib za=PF31z3PoQ))qeTfV;UaO*r3_n$^DUF1_Z^=Z*nfqo4Z42T^i6f>-O`?sxfGg)ea z1e^=^GCZc{FnmMRclpAxfu472`I1B`Sorqq(ThN9(tKGGy_Jv-8yDTH%%5AipxsaJA%F?xI$J@j;0NoO=y9e3n}-yEn8Ro%!#uGEq2j2 ziQ|^!%27PaCiu2$)N|h$=HPrFwS{IGtvmaqeN4V88?kgWJcCP)bn`ST0Yh@?H6oY+ zUi@rf1MRRq@4(x6?Y1jZt=YSVeJPR~Yw$G(#=NcFA@qOiKxN?$42F7-#~bOOJW5La zEiq4C3<&&vtKKJ;w!p}R#)5qwA=VD?(x^mgwG55_=pm+(#D`{%v|MQuRQWiJciE-b zy4?937H_T~E}aDct7+g)sc3qza$(&WmBh~QDQWB0P!QUa^~eFs_oH$N)H$U~51}|8 zrhg$-6Z2?RI%F@dX-)7kzC`dUtozL^@C_YW&9G#QD>1u1uvVq3`Z>$i-q}=Z9C&^x z$$#qrS(E%D@?<7-%yC}QfJ=MmX}%&NtOW48g#wKn1rgboQl!skPwd;aXb1E(CG{>Y z9)-0|uL%x9Znu0xmc8iCKGYW5G+T`IjGrMO12Ei0`KbJ@c| zGKw5qL#P27NBbd<#S?jmAfHq9G(t1kwRY4E6HixS68) z&(YmK&I5|>#c(5f!I}jPQly{&dlqt}AT@fP%}5N=?vbsj6<(>HA9$AbtR!(2xnYMUB4-FEYT2Tv4?YR z1|c!4BBlP4o(z%E;@QHczIC$VjJ(yeUP^ss3;S4#>y?i;&?}N3%Id91lR}RKN8zVy693Fz`e&70I!VzyAG6-waw3e>EYS$R$GFNO?ApTlLi&!wqgz>crW zL3wQ0Jk0_M2_KzUKS7eX1Q4ZB>zSxqh}5EXNvT1HVAWpnzz7PEec$KY;5maIq_*k3 zJt>*QR{gGt<{)~%5L@mmgeaONL~=E=^@zHa5L0a+Dv4?2tWC@6YJ)O=Sp?0GL6a08 z>{_)nSuk@8#fn3(@zTHK-}?!c+^7v> z>C(m@=8U*MePI1qGd0UKqx5zH$fSEfIgTZ#tZ*p?>BQis5T0rrnG12cW@?KRjaK5RPgE<$LUauDzFsd&rnqj=S>DEV%U-|+GTKVss4j~= z5DVbM8`E1d+pSc#!$Eu*gcSzHr!pWMX)MB_8cr)#;K&-sk!y3y!koy7!I{?n267S? zU~|C&Ln7~}hakOWPPcyTg3Qx0@270grTTcGO&~JYbi2v{h&vl$`#s3dw2xq}%-9K` z<8Ri{M5Z3yKf8WU-p4t{keFIQEBK>Zh$Va6ph67+iMdk)3tnShnoY6}zK@Y~kz2KC z??yz%^(OPgQD^C<;egckZBMi*sEkJ7KWAI z8))`$75EG$#$)=HX5B)ci}4;GdQ`=wm^NR0aNmz zj~HR+|f=ld6trZ;#n7Nhfda+GP;D=hY;L{13)#ZV{5U(_@*xT5RR9YECY|}?=5SU zhPhQO1{@D3zC<6%$GuZWz%5KZKRD5OLA{Z(LeLQ+H&x@l{Zu`IGM{4P-g}0Vh6Uq-1+Pw?1Cu^x=6$!KU6-k#ApSVuJ@bvJlZNxk>xj&tHEP z$?UwUCqz4m2)X;Cn`V9&$3Eu{WnLlHAmC_U^&A77|K^W(4~_qj zUp^Q)?HPXq4A-zOn<~PR)gMvA=xiWOT1F5C)1T91sEK?*H%`HXSJB1u#g~Tdm1Qx*fj@5t_B)I!GqV&(ue9)vR_FGF(;~ggrKZWzx}^Yh)Z6Kb5Ihr z2v-FUUL$tCPaugm|Ilxy5#47XGEUcuFb?5ZW6J}+td4c7h@9v}gAi|aLFuvH%gFUd zb$g~zIUuc{3_;jVqH96cKK@Td^TRxm%^?;mfWEVQwRt_V3 zn*emr-1-k`dd2D;97=iNnN!~L#*zgrq;_tj!5d8{#2+&&xapcbgJ$ChkTT%dcCI;O zoGXlnn+^3p7+_wFR1O)4GOF+F6k)aH#(I9d*(xQ9qr)ZLEm1vIxdjVp5SEaqr z;{m3fWy3Gd3{5unaoLLB68*S2cJHF;_JYitKfu=gABE8QSi!qLDv`su8%HRtR>38% zLFupdodHH0(5&LvPZaCgq3oOf?|6Lfp;P9yks1+0`8#7wC#FZ-175-6wgF`kP-n+r z8$h8blTv1di#_>clo(kTv~2=-);o4un;{Bb-62nwQMO-B+4K!ZW1|-Pak6hPUxmOl z@SBTeHkQrf>oQ5JNWmfdEUie32{MBTYo2JXG4v>~x^z|28>dx9--j2K-8$fMmI6D+ zGRaEk{_Zw-!0$X}MVB zH+xIqHW)G{se(}iWqrttwyKvg$79KYaQ^!EhS%QMvM=k=E8ESBU4*JQ3)``|SMTHG z7*Dx)t8Nu;NoLRc}ZK9YY*}`=XfaUShuQ>Ijb7)6x9s$Y?wYS9Cn1F)`P?D?$ z5mTAyK~8jGL^aEHn$3#N|*CFyn;9xoi<8Z zi6hncA69SQNq3YztiCR4RL91V6q6#&p)@(y+%8s?fOniw@`W-?E2#8^(x5eZ7K7 z;rMk|ZEP#@o~!TyJ@Os;J}rzXgTaITVS0PkHm4$iEeSY7Yk;?nn##5HTBM!L+?<*{ zfWf1u`;mALw!>>A{>1eaSRq*I3LXe!W01Ci_i&5^U*H+vLO4R@OZbX_^toTYMaDFR zJ=Dm*BXFSN2v}i1Vwcx^&?m~aAF{Qh?Yhs4rdX@g?zfanjV5G5{;j%f);7Hx-x7pN>}djDV;v75;F~&;`BavJ!Kl&H&>E6<(-&iBd0d2 z`39F7oZDo}7j~uPynl7u+U|krkbzwXQ%6`I=9SsWjZ#>CS{1B=Btp+4l(S$D(p9a- zXfFY)D*R0BeY(KL_3pH_gAQ{R`!WNoMaye(T4a{MAL^CNN@zxB$&%aDHlO%&{-FZG z5~}nFi@R<6zGR?8p}8$ztZWVoJreXrhW$ryrPorU1xVIrYzDOq^_X&(Va}Abz21&( zH+N@AMk47(LaVmLmo=B5SdBm$5nk$G&By^lW@v|R6R}mu72+r8sk{AzSM_yR!iVMK z^bIV`y$3@X<9C^W(@=SR+tF#&KxD~r3-A<(;$WM^qQFOtn5u%9h(E^@OvxjaPCTqtSPA^E{3Qfw2k=wC zBVIGc4pR74aY@^lsv&T-R2TVSK_k0T?+*khz)PFAB|7)X*0xlVdqVj9Mif#>CsqMu zK6x7~tx+77>GRo_jY!td=~cE11wE=fxV!3DPP+BT>80p*$+3arFOv*GR@&*qnZ2^# zoiHLHZ4&N1s+qdLNHUVDin`Nkkw`WH`LCJr8PBH)x{nP{J#0GJ&TyC&E4{LLS-`$T z2VkC5T(PGCK~x#l0&9xm$=TX4bd4rj>jv*vQ#P2wNIrWXcUha)%Z5oaSK6ZSl78`B z4sgM)AB*!~F)OOy0`25r_v0&8t;3&g?0kn|rEkh(0hgOGfPP|9Ftpxfc=e#-X~nw8 zcak$@sh2xoml75Uu;mwGK1ZFv~-I|k2_q=t50*`M`*9TeGNg8DdGvtui* zWHbX4BWHjxp7xvA4C3u9HegHfWcm$umd0mGkotB`|Jc?~5*EQ8eBGPZSu+(a#cUq{;q zzYJI$QoCnP*!Tnw{x{PIc}unm(JEf>QwwsYVD8DLgDO%%&zl5O^TCXzN@(Khs0?=<*B=4wPRWHBJ5;(rE^v6EYcY0YLQJ+hKbxcLmHEi=q&6?j0VWiX z9@qHBLNBek9Ee;+U9fObe}ES;9WDk~--X#n`Q+&$oKz#AJR?QM?odIVCKpI*k>~79 zFP5q@tx36`Kh6yM+wJ}vPa)kKPlq^B(JnLx!8*=sHveNJbx)Z8IFyBZQ7YTD!hDZZ zqD$(+MywFD5n8Y1hVK{&pI{Z+MoCfW-2*=%Y_&)%wySk-Qse;G%ymQb`QI5A{?%1u zU8TG#vUv{bIEXd6vl!rhX$IZ=drRTP=LCa{X7+*#&I_L2L%*XG57^+^BP-OClh}SD zwYbBmap#>Obu&+K=az<1mxsg#>;tlWZre2{_^BFL>JMIe@8`U5+?bSy^fZLk!9@jD z{@p5&x<7S(vFyI#OZeMF8<;pCg{)X*L^~IOaApq*#YJieq!LlFvYC`LF{f+jfiMYu*d38q;EHedK#(pf{iwKfl*itnQKh;|=~G z&C+WQz%G=&N&0cm@Be}-Sgs<}Tz~qz)sqFGc&ye#TAzemJi}z3;)8q>*{NG8(&y>} zGG&HP>?0TmiTjsFcFo6_>TeSYRbwQxX?yxr9EzUPZ$TZO=-@s@G6nJK##W#d6Bbx| z`ny%FFcU8B{iI%&qhyX;f6bC{;B-Uxil+H)g)4%|0eNiC2mMh|UYPp|KomaIdz!>v zvp~(#u46fHGvcAPBp!YliFtchDEiH>vS*s4=S3)q?vgR!(DZ>~Nz@1rN!|A@fGQF( zq{&nU{JK~_yWmto!ud7{rd`t#4l4|qQ9G^GwMif+4Y8<>gmxacyoao)4VS=R=!J@tO?GYWlC0(=Kgcx^406C5 zKW9bwHnJdC5+P^_AKk1q-?W!wlA!V%PfyZ(6-p4C5&5BUw~Km#*3Aj_7hcgK4^yMT z#DdnXeN&RsxsH6EaKoNd2IPa?&G#d7SA$JA*_)+EoB|MpSM32yZ6v?d5R^S}{)mq@ z$At>oa7gj#O&kUDb%oIZ8)>YPO}2s0z-jFC`Uq1Cx8yJIab6Yoc=v@XfjV zYupFVNh+66Wdv4sx~{!Tg^QP{F&6!BQqJ$1;EUnzV%wAu*6y(g>RPb~gy1TOd*S@C zofcozvDLl@HhBTeTU>=t~p#NZr79< z7Dp4}M1A^@@4^sLTS=DEp*6YI2>$`m_c})M*}+#Uu~qutxezDMs9L@+2G>?wm`ypH z&jTi$LS=)BUS_ zF(Wlr4_=Yl#vc+yn_VU#(|1w1chWk5lfrE%Uj*gPG?JBuPh6V?lU_=+ck?j1$kpD% zQdg~x^5q-^vN&NU#VMsUwrPQR*7z_>yPI=;ND0{S1(tQ&HrN(8!|f!9L49c9l1jQ+ zgnnyV^7tA`16XJT0PO!gWktpFW<*0r((r5X5fC*f{?AvVVF&ej_7TdPv`_;s-*){Q zGq`H9@06vYy2k&QM%jA#ZTuuaZL>75Z;bJm-zAVFT5MUct;R5Vqpq$ffiq6_fVgIO zg1UqGEih`h9>Og!{Sm?|AZ9oYq^C{vYtiNe+U|uns(~JBvqLdb-<_tzfLCA}BUpMh z?qeuK8C<<2ss~kZJ!^bFJ6B+uG&6l|uIA zI(oW1MJBi|Y3!m&11+gs1HIkRVC(gYM8!-455c5t{RADbzUnVN@ARqdyldlP?p-QW_cjtm&w;`==YV zy1m3U#3L=;m$wbq~MUwXU@Q2s|6y zdXR;V+Z3i~=a=8m5ASFquG`U1@AFI-E-}qT-7+!M`&{k@7H52uil$eZ_7QJQ!Zfe-wgkpCx;EUM}IIgq?K_Da0Q)F@#ck&`EQy>yJS3 zUT^(r-{cvuhhM5Nn33J&(A{)ts{weiyRb6_kUa`B0?Cgs|aus_krT!TV4u_gw}|he<`P%ecmWxbLdC9x-9B8Uml-AJA{v zpoV6#9NjzLF(su^0UNo=aOpcofK#Yh40W{631kS?>4w(WNwCsII#?!HQax)vz{LFB z$Af)**ZVG4nQ~;(*<0|t_)=qDGvZ?w#*?3|c>T^0Zpn~_Qh;(99t!q?hezk_4D`2A1#iVUG_BV`mN-9yZTFL4_u-f~F z=#eNje#zQXRiVUxf$s?xkOC64@k{}s+MCr}3-0F~X^>JM61y1#Xc&;9JZe{A__*nI zO3ShK{NF=qMx{$kNBm;45t|(<&+k!eo-hH2H5Q4%YHc^}P`>Q64sSo_(_9t`9W0co zwYR~B@_2-?|GWMN4cq~!+{RD@ycd|%N5n;NUAc-&PJ!B$m`wNlV&l2O&Y3rhIu=%} z0w^B&l)#4+CZ^G2>5K7mY5X}GBlUAv@BQ>Zk)iNfAQ%bg;LzO_yR3;id%%`OGk1)c{D-!P?{+swo zPLm4|*x?s@D{U#shO;kWwVzF2J0iU=phRrb}3@ zFU(y?-ZT2x^R?U-Hlb`F*Bi2myi<=O`{fuAmgtyhXl;r65=DO@zys@-Bx$V_1Lz;WOcsZIMn0@={KrG4kuHiVN8h@ z523}l*(;@yu%-t>?z5YgfP)vVZcqMJ zNo0tHlW6Xy0Use0q_&cV|0wj|(qM8)IXkr9guYO+8@ah@v&-k0R^7}*DBxc)Me-~N z5{!!JkQbgO!nqq&zTOAcIKlxFjk_8XWlJq;8ZzJ!6L^ptZC{T7*|1Mz%8n80VmT}q zVo}{kj~Dm_cI|gTDjt7DkdBAwP*yKk^{FWAU(bCNM_qVx01alFDVd_RXv^q)_b6d@ ztP8v#V8BcI`zX_H=xM6PIUQvLM-US99N+>rq`ELT5F$%&GSwJ`TnC%ZsbRBXiR1`i z0MOv6U7peaHzv<`=qt#?c2*cY;TAyvF& zi-^3pt~pfUNB5?-DSDfNV{|GGU^ez)jST}5Arhd`l#pBV6{&yq?w&07kVosVX{!K~ zVob!T5M-q2qb%aAG-TmvG(e7DF5_<=#o9FZtApgoq!fb&?I79qYlTR0C*^`UJ0w*C zgNm{lbF=VqO2?ay&h>tlGr3FnAiB{%w_+O|Xa;mb#i6J}Kp9v6;F`AZm z!XylUDtIgpH?~$hx@e33U6=D7b!1GOjfRMQE@#|oP@wEg2;E|QXaA~t)kyLw!jz~f zxI&_xBPw%b{QEiexc8#YfgKOKQ13tTpD5oth;L~h72Wes-S4^eOTRTH(ch9ghQv#+ zMb%*HZ-~+Fai#_e72x4S@K{g?wfJH;Rln195n=L)JxGGFPFPU8HMTtTb+UDuXMNg) z&PpP2PHp2{t>X1_2A)%aydw&9naa2ncxpm=ym_a9p@dEAVc`}KHdO63^y^lwiK6TV z+>7!jFH4z*j{DN^TFnT20@toG;WsOV>$RwiqXsn@%yLt(>V-RN_M5IkLRv|=3B`O> zgbq^LOElf6%&e@P@$|AMGSg#Ex|Fd>!Up1Eg9#&pww~N0|19$>9HbU zr6!kEg$EcL*sTk&(Mk=ykiwj1fWlKC>_=o-_Znt;$cqmBQKOkRXUfD|KN}Ugw<%O< zw9-9Es{$Ce-Q2W1xya}fY~{_ncU z-99*Uq?u{5hcwC6`JE%9sq$}Y?dTQ?x#eL4YAh8;EDQ%mhv`;opG9+FG0L~8Pm)Lk zd4hc>pfs(ZG?F1I^vtACj1=+XnDIwh#?#@B^tcD`40UHl%f~0j_E3tSF~ol?AI{Yk zsknGAE3@hdHNV14bvwG;c-~!3tm!+00Tm-&sTO#|X@qcDJjWnMcJ1RIKaBR;)caCeqD`u-!v&@HSZhXqvcAgzW@iGa^=?xs_ z<5;m;yJ!gtodUNtg#L#xMGNitKBTuhk$52P?gq8ZXI_*=+%HI=k1X^hw;IwJO{s~< z1_d3fOPlkwe_THH`ob*$s+wXVr!+e5Oj}txhEX}ji2~t3n3C!g7jtcFb3g3I`7B3IOM4ZZJc$p34X zFa8emh2~6NYbB-X-4jhARQRLo#b&!~<$egQH@=UA^^;=N8zd7)*-`HmH0Eb`W};GT zC8NP)*}@?clOEN8!4-;b0%h>Y!H0xMRWqZ$ZmB5&D#%h0;LUrj>DQTJkN;P|Ovq>s zpqEV+Mu=B;HqJ>nL+*iPl?M`!Cg1Q9!tLN2qk%o77;pQ?(NN(4-IcEr;tg3e}G%TO(Pgt&jp9XQs`2@Wv=MmB6AM&ufli6)DHU$q%X_W{J2e$xV2j z1@17fv->y%i_DVy@bkpIkSpSGgOZk-3TVYQnT$GG(1^_x~Eoyk6H`nBqR>x z2Qcsx-6QBq*=azI)%>@sY>Pgf93ICWx5O`@_@Qufayf}{wsBv1ZUo{BG-nsruXU5N zoQGd6Wc)R62lG$HTZ-{)Xh`H#(2S9kF)temMggIU2+%1oCwPop#x0dNW~I7 z(@+9qc1Q_L>$t*i#?JqM=DT1DaHLjAaZEAKbz`2wwAMvQ+PkPBH3fjGBJFQ848GE* z$NV`14p{^3NhE}Y)6gT9QxmV?$jAUSF=9WkED!|=z3euk2?mGLrwA&Sug)mE>t*P7 z^z>Pk{-uC9tOMnX{^-h4uep%kgZn-PSU7dA=JB&H(nOk#914MvWhPBy)X)z&$IxBdINEKtKUM5_OVaQx;fX#{O3(+11ij?VSK|vIGMmCxBhq2_}N1`!Q z7Jhm6L(Egz0UTTwsdWtFqJ&uPjlg@|kS0hGF5CxfvtMW+k2i5ncjaLXa2mfQ71zh| z2a)bQ%W6)M3>sWAvQgUGR}Yx+<~U!wZ;D|{aK2~w$j1trcwKhMHLSR4L#v?eArH_^ zwJTQS{x%&NB`V|=#@RlyMGxK11S4GO^s_Cn2@VE`sVTb`zDmIt1;j>oeV{K&1c8DM z)a0AnVa}5SoxMAPD*{*PUPBi6^>4!X+b8ZVrE+=%Zk=&}7a?EAVjL8VDg&TR&d%g{ z4nE7cT?UJkyB;q1(%IX|%GT5%9aJf=<_Bhg}8v8**UskfuS%+`UB-5Ut;#daMC>A?%o^bHf?x@Wz%Mh=tts8ozPH zC0JEP%fO=PG{nQvc7_1@J9q=!R!iE+UM(z7B?B+vJyA*I-X#OfZ+_u}rJ5pzms=-c zByX76R=J?9^ut_lPR6{|5^dHDS;~EqrgsF7MA8_F_KAd-hVSBB+d3_`3`&M^(g1^e z^hT|!fc41EjOv}z>+;T;V<^|T5+=5Py2YNOde8Wj5;)LMy$QP@)sfX^v5yu|mQgus zfU;Db{||C5*HlDN1laN#AI0)ZvL>EC~MQq;D() zn+F~XGSDE8?f>FH4ZC-x8*6Jpu~n{uDv%RlPxiZSpNF=v?ULIY&n*f#=B3Re7wW0| z`Hjp2)p+4wXn+7}V@Zt5y1ijFFD3 z9XqE*r1$|2HUf$w(Ckbdnr%lEhETfHmo%>hU^hs4?9a9oLNkEt#l4mHUw4n0W;wHU zRmeT`5r4f63i7pW?ZepZLU0S7&AfaO`e|WrPPtrJ^hYpO-@_TRj7?zR-ak<2y{@m7 z71x7OU{N!W2a4k&&xm(3XWeydPCn)F``cF zP{eSF&_)>NCz)|^GUdlm(=aF^H_lP`C^@ zi8r#RM%TqUk@IiJiUU*M5Q1pu_m!md*JW$zO8Bh zkxIrNEI`>O&@tw0V^I&%_@)^7BMEHeOrS&U6kVc} zJV~YRWjSA%l4gSNvD7%}=fCr{Zj``O8d)jqFK@q9>RDLlqwMU5-*r`ZVY7*R49%*4 zH~gF(pm=KBX7T}mH>lg@J4jwHc)dAk-J4i^E~`0B-y;aeZ#|y=?SQkSg(1KMRq3ya z#m8P-G`h7V!QQe9L%GrNKyny_sB2f$5KkH z$K_wlrUVw|&7ba*wW)mi^2XdFfZT6nHOq7eU-EWzWV$umswEWP4#FYc=Qh1K&p$w> ztC#v2CV5P-z3Z|BW03ML+5Q(AD71lnv^HmYHs=z$JF;p7%EVB8wlx@9niTy7v{4rr zHnX$g@+R*Pd}SkR=oxhh^#yj~S0|4qQ^gS*8P4;uYL#S%UcU(lv%vBg6$H0{gtZ9BcFM9FhSq^oR}@rq_pX($aIAq^x8 z-6D`--SnT>GCzI(4kPl&8mrK*!u`fdz6OBJsiD!y7A1XRqRF15SLarvaQO6?d^C6H5&tzr#a zd6INLx7a1tD^^Ds_Mv&SdhV(q>Rc@8iD+Wn(-$?A<$EO zMyt#w)-^^UkaGU${#PnV(evtp6;}@zmIFy7Xa(}aC{7r;1gtXc*R2}DNv8#EZA62!yfUC{;dC?E^P7QlNR9C!I)W)3=w*60lT+Lho3(+fS&h0R5ahU}c+5FIuF~Mw= zqr*weFv!-6ABKqe-8d(k+VL$dgVt`oU8>d{Mr=Hr)a{9TmtmAY!OEwRb=}YYl6#_N zO)pg{htt%mVSu{+#PsjCk%dr9a6_O^1CcIp$sT2CG}nD3 z+L+1;U2(eG-crSk6}oI%mZ3B-Qp%*PU0fF9b<{3dkiXc#)MH}O8XY8#HtQ-11wqoh z$*9`(AF-SuI$W6=adf&1)g4>URPi2A7FUCgL9#1^qj@5!m#C2JV(KCX4W4Vhy9cjE z?Z7L{y0vUqZ`S-s^t!Cmi^=~FM}1_-;0Y3V%4kNxdmFq3n^SV*`)$p>lmRtq8C(l9xSV4@6c3k=o73N|eqRN{7%mGX65gUAQvlN2!H z4PlrKd0mUaR3i^TtCdYcH75ZHWsrA$aPIOGfAoqhcssypI61JLm;>W~h|x%-kK&ex z_@iK>C`8#?s~Y|{2Me{m$=)xgL;m@baRt%b1I5xWQJH3<7JyZ*5R+LZv8C?qlW+zi$}ekDTq{_Wl30xlUrKiQ z!7J>`&Wg~BYy0%T`y|@cy}giICpo-e1}C9n1GjbN^NZlClr!~2A3@QRsbtWivZ^Ri z8zC^uO=mz(frd}AHMYN0roy-jBDhKJB%BiNmBsN$qA+omVrVg- zJvc_MT=%%e1JCvX0*vK7Zuyta6mO3Zw^G4J*t%ZgO#A{8+zo??v$JX&jEwvCs`gu< z3JE90UfbT4!MTYKBm+|kw5!%#bML*Xxl>M^Sd^LVey?TnPx1CxSQBdPqTdQtxz1!8 zqBaqSv#!T!Wp4FoLc&^@_Xf#CZUI`)no0>EfGiSuEx%VXrp#eolr7c5M(`RwK@Qb) zHtj^xdE-@ll)id{fbkn}fQ2d?nQ<@;JnLA}qz^|?C&K>KbJp)sZ@9_$lWT1m3Kj8Q zId>6vb(ZL9=V{kL$Z^GyLga8bo#XMlpD%Ln`lXJ5MgQW=p~d~k=mq*X2qxfD;~f*< z{tnz}Psc$e--Jvzz+O-|47Icr0vS{ylE7_~w9SG;L)Cf-Xc3j(WK@Ji$bI(8H>f>j zIo>=8*o8Ys!^a)Ehx=y~&y?dz2oBGvvu|~-#~ve_0^y&=zB$zM_m`q{+YyY~ z-_m@bm-Q;-=*^{*K>dEza23yPx9)eaV>59I4%J44DssJlXH>&?_O%4uII&2ikF1s_ zN^a~01@eNdHSpQtz1oNiSo^?toxmu^XQn1*4H)gG|B$svpc_O(mN*K9?3;x=1qBv2 zcc<8AFjcM;+Y&dE6=wss1;M8}f8t4|65hLPjqE@VS&th(->UY67L%Q0h02R)d9o;4 zHnzlbA|Fbfs$qUnaaiNld_aAqPaQp$bv`H^!Mx#&c%FT&C)GWl`os|&(M3Q_X)eDM zz>WRePt)nhTQJo|h?1_U z%P~FEtLGRZS}VCUkLg=YY2@i)2_okDhOqw|XH__^%CNMPk?QBYC-Lg(J}ftALnys$ zZYJpvi<>>k@^ah*M!xG=zz_6xBBd~Fm@>A$zU-sqpA4^@Zn6qc2Dvnc8R+7FWe5p? z#Hehv)c5gse)yD7GsQjU6F@e#zZ|h+L3L5r(O0PpFBQok&pgn=M1s$p?`s&}R#d9x zKh8@lkVhJ8heh~#I@}A}A|DCyKePjGgMQ3F3WB>ZX~yQ%q-oxq$EKFS_+$wMxZpH2 zVd6Elc|nux8~~W6F3k|x5`ULr-~vxcIqE(sPGU0&EfI;TXu0M~Ih0L5(d+OxzywSQ zZ7~X@qhO~n!}^g`ZQ+)7&R7%PR~O!){%98*$e!JMjXm1atqQ?*0}bH_RVD9B zY1Lx_IdZxuzeUvc!qR2AhzG1su5~V@hGBke9y9In#3@sP@@@E!RH4#6R{%6p-)AP0 zHn4Yl%voJ>2a@BiH6yBU3dY4QGAkb%?T=7Y+eX0qKu1iaY-6At-dv{u_4H!OWCUA6 z0&K^$)0O~NK&ZddOj^}#T6X?{QZW=9-H`lB&P%$R$iWvoky2e*+envs_5K{S3vwTB zWJY5uR58)$AIg+OFTgmtaA+dusU8de`FliCLS^iBhCQ5nv#wnLF@FE7i9moiGlgl6h=kmlT? zO|WthdStsPZr>zb56VDeo|Fcfx>p2I5{6|Ct^VY^EiE=C`c^jxvsf9!b@jc(fzU4U zp-W_Uk{J_%0_`>0)!^%OUtPommj9CVf8>ZWJMnsdtCFP*5^hDHzN2b>NwGr*JAO9I zSvFMq@A8LRD;?0z7B;97)teIP{YxFFy#z~tmitg-mHDbU6>5KlB|%QQ)bK|KQ((PL zt}vH}>!tus3%lE&0(8K#s-Zk;JHy;Ma?>H_5hpoZrnJ8R65C-o6#HCq7S1MJTrY50 zrqJ5wL=6gB@La29*H)6kj?kXR<~z0R|_Ba%uw5f~??XxAW%57pmcGhX+u&(_B!uuo5+juskms zY}5UUIf{h^(yTuRs3OWigk-^z+BK>TIU8zYkLeuWIf&s z#9_qmdUxU_D!&)sWO$>Z5rlxxvZ%3(1)ziissw6FujAS+-r9C)I~tqV0%HWq{R6?&$_a2x}oM7!P(3=kyWU8ASDroB28c2?{;`gj0 zcb+9j>#kW6qlQP^6uLdR+T5mTsNA?mR22(IT~5H5vAbQX3J1sN_*vv_;=U>l3A||8guDCIhl&w2EfZ9|t14y@ z0&U(XNqYxAB?C+98iN1e{Mxj0r_&eRpF=RqVj74^asfO^bbs;$;a%Ccl-7Xh(#(8+ zfx*o-oNyRM2Y5OI;e+KS1m!YAxFycI3YVX^e?q-3T@_I~reGBtNg31OMNxq1u?ZaI z4bIf`=2su-NGi)xK^Wv>kQJhTK=r(u0wgiE&`7RT&7#i#2lG3%0RN$ve+5`yY@@lKAL#%^I6f?w47hnI}JV7YKymvaM(SO zZl)~8G~@=_-_dnNx~tyrr+gya;Ue_Eu-1qN)cc{zoE1j6r{5@LhH+KJiThXXNafYK zr$`Npb1#8Yt>#f%xk3tvdREolq6F=2 zR@bNLIR;hSY-&V|9ll*zqosFMJUX24?mS`m_;f#AysbCCBeng1M{sWZ|KY8WA7@nB zk{H-8RzOD#?>7av(lg0d^Dvs}gu2(3w zIC)$w+&#L2Z8ZjfRwVKwy$P~n$D?~Wrxy5fvh32L;vD$PF3*c4SjsI@pgmw1E)?_y zhyrOulf;G)k+iJlj1Af-7E_dsEJ;&@$W?98>-sy<5Py!AF`7j?fL{*B_{;M)la2E= zoZ_k1jFdIXgWkWpxhn`DLoyFFN{`1*C{fixKy?_TRM2)wD@VVQG1*)l6K1_gc8TE} z*El_Us^Y|AGBm4msg&m|N)7tdFF>`syb1f}r>v(h$86w}99JB-hAx{FH6i1BEmaC+ zmAd}KsdiTZYe)N!%nYj znQVyi{3jmBu^QdUouS`6ibA2+`Z`Wi>2zVq@!_ad9ifA zB{8qO1Djj>?1)VjbA1(K1%Bwf7sDEhG#-}JZN@H}fF0PVHe;!w6FD27%_4VUZR%i@ z>!!|2ZZ=qS6f@(^{ay}P$!-r~iF(mnp~y&XOR)=HvHI@{WskgkxE6_=rC<>xx9ZEj!TkUiY_=9)#-o9c zsCZ$tj`_UB8l4-q;RNYwsWxg1-oHB7iJG92MkQ^>Q(DHvx1G^m3!iPT2AMrIkyQKYXLeEu~7Ms4KeJu9v5y#YQ=9_o3`H;(lk`@9gmCa9*bp^LG z{RG58BcrPEt|69=rF8#GGwK)#kko`}J6Sf0xCECXawCwA?OK__|WJD1S6_2RnJ zzR0~FIEa>|4%BCzb@CWXBmI8^G!mi#m%xj2{A;HS}C7 zNdKn#TzK*2Q6m&0XO10*4hSBmzLN(bpz}S`+eE^@>we{k)sIoo7soQ>!*EwIjr4s7 zWA;Ns03Khkv2|Ag>GeTWrzFTQuvw1?IWXpgRtYWnvjiugzx0gxDi0C;C9-P4oI!)% zOi^s5ER>tTzfJ^_e-=Na;I7*Gm3|A((ZFOd088`V!XlT>JD(VIYy>3LiOX;?RA}wZq@jMfl=wOTc-{f+bekG=Pp(Zm z%o2Q|aVcwq{`h$&-lPR5ZCo6`Cf{TdkI%0|=8$FC&$i>!r zVLbv!;L_AsgXQ_QoeWIlA^de;ZEe`vU@%k~0^(=tHG5KU$kq6_Y&uNgbQ?TIh4vuX zg9St&H`8&6ZNn=QLKC;+b8L+z{Kf!>&BN{|aMlDHNoPcR z-L*J7c;&{JEs9Z3#+7h^a?nZFO^N%Z)x2v!!T-AenkW+4y)>5Pg)YtGkbgSsxVoP( z(P@E7Mr&i?=U9d%ap&pLSHa2fEBzvs#HY}W#wTzE__QgUF7EAVA09=oX=Ar@dI1#R z{^YjmjUw_l(S-u6)5w92^O(VR9nQG)A`aH_{)@{9IUOe|f&*u-AuQ$Vwi)sLzTldB zs-)bC7lJ54c}-o>?WJmLM7Y=Tp1|9gdsC^l=oeG?tswM|l4Q<-2_Nzecf0qEkOLR! zjBi1sRfYryO-i~lFqqzHnLGFky@MgvRWd<+D89eR=x?-67IG^eUqHW^ zGoY+LybHQMMcYf|5fX}Ey^2ZEFhL)+Y>V`Hw`XsslJ;hB}zvwUK=^c5bmZ@ zPGE(JjiN{qoa_$RS_Am?yO%NqZ|#I5D{@tf9RR&&$gPiWz)SJYT~)tJH+@mb7svPa zauy8qiRUK1!0Y%S`*uLEpeKwrTCrqwR39R+7_AGHVxr}_Cz%%|C_YWF`r6Pp8hgxp zz*1#yf=*7n{LbdF0Idw+xP7<8>doy&tr=A&Wi?Q1NfZc;W-ORFY1)(k|MbyvfQ!P? z;J2qyqn%C_LRGH5jPjCkXq7pG>*Yd7Ca~$o_*sIX zOP(RE_z*u+DKWi`_*9O;;+>h=nbpm4kOO2o>hL`u=vUF4wMEj@4>t zZnQA}lh2*6erKUIA6*-%$NwrsFxc;Y6nsp@cN8;M$W)CUO%WIa&XH~Xm0jz~ZJ|$7 zgCdx_53ks6TrRcm1SCS~={xd0LmS;z#+ zoow&%Bk8lgA4x$B;o?UQcj!{+wXv{wi<;caF-Ye?Ew!j@o!S-6zihJJ1@@2DP?hW5 zkJ)|bHEJ7I%g-GlTXeo` z?5mo>xv_RHbf4*ctwoZ~*#IWy$SQ%N1|jA>9;b<^Vum^2stqzd$dlsgbTZzB9KWFJ z_aWCGM8<`P!Yigy8}*d;9AX}@)0Q8Jft+uNRn5OU1@EC3IlKrsNqJY%>P3}Z>I^wa zd9~?DHH5JXaU(=#EtFyUZUZs1zErY$Ih5N*uB(42CiZ7-)dv$Y)A+Q&=K!WUYQhM&?cpelA>m6;Q6#W_6-6MvLNWB~6PMxXJT zXRYnYLMV06Si9L)ou;IBm`ArhfN3w8E16qyfNk9w&;bmdbJPE{R_mj4DDGUOJEp?y z3C{q>VGY{h#zG9AM4rj2EsD4L^7+kUo|L}kbyXfZj-|9l=|dzVi-H|A+#a6RL3*-+ z0VkRDetuPNf}%}>0#!CrGS^}Taeec9(Ok4mTB7=m!_GWz!3(@$bS; zg$Jo8s?r|Jp@Q;&w{Y5sT11*g<1G9)OuBsU4y^6rVwZTSLvf2W+22s(e~t!rTQ>F0 z{u=!25EluM4}JK~w$1`ILbE&F|0aHlo>(U-gd{8LD0$xpe7BhjB+TjA%-%r`hpdW$97avGO&+2N4m7PozVcfpN0HxK=^sXMxkjHy*gxjsXy;Y zb@1we^l02a^&N>JN{#cJ%>@<7X-Az+eD05};8p%oQB}YS|0cIq#4L4-ektlvjy!Kz zVXO6-S63LQlKGru)|b=Dsd!iiv`M1}uA3uLbS$g4N4Eq=6%(K~vY8pjtFk1yzhN>K;^~_Toh;S}la#mRN9QR@%J#yAHjq~aW=;RDGt1}) zFsIPpYZhhWyd{OTWQ66(2|^V`i`S)O-m6+CHnlT3)L@@JRyX$H{LlMz)ApP`vD}>>v>S1L)043dZs3XF{GVg@5ogjGyD0a$14%<_x9kA0 zGmP&Hk7Ma|XCh>G%K=(2&ySgk6gY6^S|T(lT$Q#f8J(S6uhBwu7zSHY#if1OJRMl~uFNHU z>ZZ6H8k8u{*^{bY24NJWN3``nu*#dYQhw;tG${Dcm~%;x+}T`J^&3|f=_1KhQ~R|? z;7fG~zmL6fuY$yCONu&+1a;&%K5bsw1$0s`>NGNp1UI%5S;C-w*P%HG8 zUHUHde&*qbcy3aWh(TruS{tXc&O47e^PRkR`92k^8a(=3mr*DBpp13{ z(!@Qqt7nX3;-zrG-Tn3(GfW1Ze&)KK1M7k?@j`1OBXuPPKt3};jao;(dPxphPzze6 zKxBak-WzSb?Ldf5i324GLIRBv45o{vTX~2Tgmk-xJ+B9$rrkF1o;@2}8@lVs`Xlpa z)y60)QuN=Sic{PYj+7sS#8z% z@8DOQ6=$N4=~PV^h287A)PtCj1CurdxR$5(h{Skke@~}sdcjPrHHxBit2qsW5+JLY zDau_~#?-V2A_SmIKP43K5*oI5JDW-ioAON&KyW|7GL2`*LB&H6S4V+~qus}H&-M@S zz#RBtyODLL%@8Id-1a~lcl*t?9o@;z2i$?kgDrbO;SqOf!Ucqe+Bl9_4~d z@(lILJ!nK}M7PQyF$Bw0#GueuflVyn@n$bJwocPUpLR$zUs2RUF&%1t#2ArqJ%O$M zt8;5BN06g{n8Q(-`_ni6&6E*=JQbVCnpAp;@%vQ6FSl)LS$eKvgr%zwe>GlEdun&g zTHW6{MWxtnR@lXg0q>IJBk^)ad|JV-8Frf()`{n!^vOka;!SbM zdI~Up4?aPbZ36?`JQ zSb2R&7@I6H(=qz-10=LGRRO>|jhllw%0fu;@HV{?ADW%nAHi7n)`%HlhUKpw6PN}h zn28svC8QT}jC=_dIihGR?lm2mHZ;jr;M?6@J1omJl@*B4t*18^I?ey3X}+-?8LB{D zkSa#oMaFfu1nOcCtP4h$1&VnT*g1N%3aU$v_sNR*{!vkAKe*W+!>;PuqiL|}F0cSm z86|hxx%53Tg#bWz4oNKD%s?C8_Z?3qb_jY=24FNli=N`98Cr!zU_%zsiIvh43lF;P zBKM*^=NT^<+W1P8jYOq?pBkaAdlbf&OnQa8caW$Vn(w;x78?b8*jkIeW&0C~dD)01 z14_qw?UR%l`_NSAX7U2zVPdr?DhU4cVnv2?(Na$`;cNtkuMvq-8A?#qV6VRywr8&` zpW{ajDm!$2o#yHVac#YvVjj06U5L*_VsTwneEAi^eUY{A+uWs1Z|Hh?>l4OK$%qoq z>|~R}$_?c$wQtjS4Q%h|4bidhyC!0Fh#tZJ3E`xZT!S6ReDW@0 zOl3Cj%7A4S_^aTx@vpN-36_&iZa$bszaG%?(Drl{sY^SbP)%}#2NyV;mjW}LOLOm6I`BG5 zRiOF}3POg;;+QPEaAomLTm~QO1H3O-uXxQn92{s=N?EAvCzGWD^&Oa2RltmiPk}Luu_8P6>Sm`c)-3-;wP!jBfWrCDAiWGZ)9QhE_#9d=E)VREM4k{lV z^l*8m(j$3KVk(XRbP<-SBfVP-xf*qiBC4iyi6eMuH2RVKiU4d)^~p}(XgWatj50k` zIfptY6w-Kk#bfr?3F4G84GV3u5%J?a8b|;R$ zGNFHGsigZf@FJFpSwDz4nhE2nKMh0e-y#~buujnm++vuMzja?@G}o^!Hy(F?9!Xc@ zEOLJx1tYpP!NP3jE`&cv;oePx_+fc@4G)pcB%2o^92tCWl-qN>jwfJ(2unX9>6B($O~rr-;gN?|E&7<^FHRbijW$ z|MeHq@GY`Pb|T5#y&)C{|2r#m)!*5*k+M^QywDZq62g>x8DuJ|gw~=4$wo?(z`fBE z_D=hr>6n=QNz+0iIwReBQ}M_GO^c8Ql%RO)8T9L>L=)9ypIK8b5I&K~kM1p{)i`$R zz9^Bd%{){lDByD+Tr?UJ-ruiTT8K?cJe{g1lC?CL&dJm@It&72guT|*>Y&pSFI-kDP%!}y84 zQvqcS^N&Ke;}QR2DE0*E81Bb)6P(ytS`Zu9|L*z+DRSL!3@dOMNnUhw40>x>^lmr1 zJxNW*mtBZaa%x*m5Ai&(*q}m#kLF#yB;y@i=BGMr%7W1$CHOdj`@q z!Hos}?7{IOOqII=yB}b*k)_m#666d5gQ{)-vzJ21LdarrQQKtz$Ra(uSVL zriSgnUZ&o=aZ!P2!>PG=juzhqb|+Xyc1ixDCeIfP8#E+?ZntDFe@W`b?7q*A%|8*P z;uYip_^YQifj%+rrFV^<#&#ovwUu%=_=*K!I#gS~fpqzKej$)fdKhJ&#F5QxfPz?F z^?JwvO4>@4y{ib%RB+XR2C0WnDgG7jQNeJFRM%}TbT$BXK@hbYS+~8)wGOSI_iyW* z#UB5i#~CVd`56g$O_=xTtJjGpqQFEUk$z~%1<`35a`6y~LFe%x>kWP+Yv$*>fP3mI zp7(e?43VLE0XTQXfuF#7tuDO3C*bPzGA@A!=YSPdF+yR z!Lb(#4bYZ&;JJ~6zI4CKU+klZtZO>&;$QzL)V?*qv~czUoniek>3TDnvKa227tC$G zW1<;%G+83bge_)A@U|R$Q;1aWT&iSW%}%vR^WISEz^Ka)%JveF>nN(Idt%jUzCi2} zU8Hf$Smdm&M0CKJ<{eohxMU)GF`ZGN+zS41Ob^OGjX-~5tb7&mZ17rUFVB8Q5sy_H zVbOuB#valP++4?<8A9Uc!wjIwxsN@`LPDSK6@&kb3RN(oiOtx>@U;yiLM|Pj5ssQx zX{r;A_gN8TuEc2yppeRKiL>e0f&usd}hOSN1fCwwQ*P;UHDYF_tycw*# zNt7RmEWQ=6n$7dx3~p;>QV3$L+|m<+eoQE7q|n)wR&I8V#sJ zAo5Lo&mbK0INy-}#mBQS*7w{kMP-^Tw@DyZp^~<7e{MT4zCuglhw!T=5=+mGzAuf8 zdKI+4$&exoRyb}Xw=}G2l4Ej5P$9x_YH83J^en`*q(qq2QDicR52poW}N%J zBykPM0rt7{YIyc2yRrJ1@vVs7{e@yGB`L62U~>NuOh9CKc?qUoA7p(fpFPQ25sZ&z zr0lDdvAW3TDIce}fVe1>8?3ejC?LEpy9Ij8Q>WFlx6Lpzm}ZyWY52xq9+3e7+=c|r z2#wLN()JX(uxgP2#`lkriK$3+I~pN=?og~9u;b*{C~Fm1R8s#;=*Llr8X{N856(cuN|gG9@{1^lYR%9KQKOF-eSO z=BH7)5_6w*Gt#Im9aU{S4F_J{HeSB!xF7TKCT|-2)@UQ>l0HhIB52eV^oxc~RN_l7 z4LTlfYgirJA@g=Lh^W#P=Foy=lItpGAz{{i7){3G0(KR^G3f8KB`!0bM}3Ru3(w$M zhfW?_)%-J z>W6SL4-AQZ|Neuv?R%{F0TtOQWt9gnfb?8<9!;wl8j?El#I(I({zbQ+K5k8XoTdx* zO$X}DQ{-mu`Db+bT?cP*b@rp8v?t(e{df_Opj0CKqPzM$*HRmr*K7)fWqjHVs*A}f z&=x7>aC!Sir;3Kw+Rqj??_7SlCAuXU`D?YE95`?wbE_UN=kFtg04Bswn+v}1Sv2Og z8&d_Z?=L=doeR{)*Sr_qn*8m%sZQR-YY*MM&LC`SOUG8)>hCktr7J_*3575Op_14F zP0<I*{$IxLMBLAfG?OLEfauvM zxg^6HP`nyaL%!S@G@TC^pi)B&hB^G)Q=8dwCX}tTf&x56CjFre5JdN<=C?P3<`q49 zjXeQO5wDBB%&}V#sef*^S@Mfgf&vXN-lP)^)kNOV7#xy9lb7dX?V}V13UCzR#RCUV zCeS0>N;rbWsFEn5#(E86-qcq)?UYBZ_iIO*#0FpRO}?tWOhd*paiEn_-DN&k3I6UG zE>Etpb%H?gDUf_jD_$DPXH?RV**4hy$dwaekZlB*WrSfdF z%s!p+sK|4X4=;J!QCS`j52D?Y>)mB{+iJb(!wlayWS=)DRJNDPK|YMaHdBr|keJxE zN|Eh|BX(iBaw7;eGEJO;LqPN2O5XH2RNcAQRM`Z-Xi<2<)@m@eP1ISHqooYcU(ZDI3q#?d@5v)OJ z$UmB6tYvxZh>l^VG7TxnR4M0zo8ak5Q$YxOEIA}1kDI>OnN4uW{#VKwh+kEe(T@*ZB5fV!!+oSfv790%Yqq27?)UV%mX@Cy!$h`AZuJN3NJbi zJ-j}I0pE_`%yhKDD$O}N^gzg(tXtHpK*7wz_e|eVun>Wg=7cCS+f%=rUx|f5f5=;{ zb>t(*So;NfD31GG{ukU?CxJRpPepL0zcr9LW7V1kp=7d*ta4pr0I0PMUD%}YO1BVL zu7!iA;oxzbX|SaL)_DuU3U!ESySHatQu?8FP1~Se+qb$CKU4=LlD9APO)2b3$IeM| zIjXd7jW^W(RXBOB*M(vzW0W?MIkh{Q(;Q)>5s(t}4MKnpAZ_HO#cQSib@tzhApc|# zoSqhzFds-RUn%1l$zGN(6_cewlx?ej?NQ7S1eV+l-$rc1R>3M9P7>a8BXB9XuOj8|1Je)O3q-6LFHDA{B#!>)9jQ@Trnis6^g!UD|K%+K zV*-+xjNC*@&loFv54aV90w((l*?S@><*p zXAA97f>p?HOE`X;h3TyfXWm2=X62Z_@sMe3dgdc_5KB}<^eR4UF{Hqkp!lqn#%PTx zd3awXJrxJ&#Boat&#%5%{x`y4G3V` z8BCNK%EA4{cNus4<^dA7grWCePsR?}72G$F7s&4R(F!$FAnDCYkhtQ&1~JSooCFo^ z{#KBhUZ}UoP z$|olehLos_5u>|9|ES1tEz%2!&b(AU-Z#=)@1eH`88l_;eVB)v^Q}YO!Ni}Nd7a&J z`w99MZKOncOI8egZ0xzB&A`o1M&3wUL2{b_0%IxQQGoL3ot^&ok}t7b(0F7g_Gi?uc+MF>l5A-BLT+d zVZAQlwbaC?kSAStaKcqHia`*u9=$kq*n{baZ9LMWG?EC0c}C%wv@iw=+%h4&E5vYH z6l?J%0#Sc5Xx9LD{8h*<-otIRQ!Er4YOoom2guz7RxbxR6A9DU+2v75Q%fk})iTjR zUd)hb8#i2ceS0L{J=LuO#<8xGVe$sf&9+l70-KnWMTDe3rXpQ~0ZVAA@`*{g)_v4-wVm*Qm#7ts$saSQ6h& zpYY_X=K{cDy8Va#Z`tmh7mxPw1GTx5?#MJs`RMoO2~~sH&C_y4NIp=AmYllva=JY6 zq`T-oQAiXcevDE<77)Vk6{OZ^X*blfuh-^spX=& zGbsn~Tttueb)Nw-XRJ%PIIeXz9C^b#u^MJbeB;t)v0Q2D)}{?l&on`vulU zgvFY&!AHNc&M}BxuvE?(Wm*chc~vVVH_u-m$?xDSqFyg*?G`ZR#kO9VWyjH8qrMR$0twr-jDww z^^iSJHm#niAT1EN@t02VZb}Rkj7AUT#+GO`{Ho8dDe12T(hvp6N--oM&2swh&JWyz5n zJt%|{W}bzIEHoVb4B)UcMAa67uBD@^cFeOnRqyC0eV@v0suX}-z;<{_4 zK3|lcf(+l?3f9_-d;ez2yZ@dBje*WSy1FWTe;4l-8xIA-vlBZIL@!$C9DD^8YZK^( zJ*CFvhLl}sG;pe&a35ZCY)*;VL>*JaxL;*+1f_^Y$a#n8^L2pG7oPA$-^FS8e1XAO zN`8_q+;RF(+ya%ofOLKMxI(%R+av*6iyC@q)jB=17NW*YnPWjT3o`w#NqNXT0!{!D z>wJy{jgiu(X6Q(X0!n1D`^J`4yj!vVr{KcFL&o3S{B6t)uUBmqg1wMo<;rHQCu3Cg z4HNT}@%BGQnje`hs!bYcNw#z*_fH)H73dJZ9SqF>`Mk6khcDPiu$DCbFj&7}M}4Do z9Q~?*!hOY3<*;}eB6$7{-7rKVB6TY=S}v|gwz>5JK+R6eA~OKRdDABQr{<#-%SjaK z7Ux>er4FTm_N@?ra z_4zKW!|{S)`1An=nTb{bZ%!C{qa7UyprjkD%Dx#r#$cO*aT05C{Er@adGj3kv4mke(`dlGrLzzJvhmz~yglA>zDiuDUvx#c#q<@~uZ@aozKb%mO!x7uVZ4P$Y|y2zDt4+_)n z++jRQa^C{dt+&TFdJk&JKLYDM#qZg-Q`=d~sSF3Y~A2F>JlVxdK?-vud7NnG7 z^0`Z;L3sE#?LGrt7|!>s)h{AuSsNhl`kn28h*&__T1O`jgucPcC?nisxd%a4)hUBh zM1!BZ9eq(Vn!=klq9e{bHha==%~--0%>6(E9aI$e`< zJ@Vhb^Uf3bAPYhievtFV2N)AwS(;7TH>W9xrz2}(+Z3Kp)73YYc#q5r<+~Zzmp`ml zdcKW}Ma2hEht+To<>0s+A6LAb@iK5^_ha}Y?=6DqOqK{pfse$8kpBM-NhlNRBtT4c zf3RpEiSU#B*)}kMBm>bC-7g^Coc!r27<$hS=fv`>oDvskxGv%JTDS*P;bfi{2JB87 zRuV0E`cME7rR)GH2|)nEIiE>G-f0EGiG+SHH8Vs$1D={^`TqUOcq+BD}r|a06Mbx z*LsbYmV&8xrxnn^jMz;ilwYlQ%u$s^-pgW$_+>t~3?yYAV1Tpx^of;N5ib@8q)cMi zNAWeJXz@f%?ri(umQV{&qS91lE(ic27>w7gbLVMdct-;04FI9pX=wER`y|&#&I1fP zfCzA@8U2vby}!Zmrdbn*%wn5O#xIF?ef*!BX|NO9d5>3Dxdr+O_!tYZeQzrT2@efL^kTI@1;uF5Z5$!| zK(i+_81E6bx_Jr~>Tfit2~BD;R3!$QXE|EySm*_eHQOhoR_UmV-9sKyW?ecdz$-#_ z^dX$wzHUHTT9Bj3RfBIHPp9!C8kF0gU+yI(p+|$Lt4o{ffiHtg&w0}6|0M0JCN1Ie zC(cN@%gPfZ1@oS|XS8I-_pid6*X6Zc6>4b4wYNKlxlkw<2s|9H}QO^ z2-3(bgCwjGXG!B$?bhdSW=dT_c@1gzNrdG0Y;+kV z$JRF3+%kx}_mVde8BzsNL+-c#wkOfKie;of#HG1N?6*pTLZW$*Q49lx6dNSR$dr~* z$CiXB=>S1%XS`ywEV{kIv1c2AeRJ#MK_3j(<1(3&Se+{K>Y{b8QCL)BJPvAmK(D2? zJ=6)CPI4DeO;#YTD9@1c8;_L*@}X_0{wb`gUWXf377if`xueGt5_0gY;!4vt<;KRi z$BW-Eh_e#22U0j`=L6u|r%My(-m^&B6-q!SD(WyV#)!So6C%Q(%qkAUH zGEdN*mu!%9#-R5xkL(eHAOpP@+55Lt$$}3>aJDFUr8x!eaX~=@v->oiuq>|j-Z)7idAgQ z)o3Lf2L2(zsr45gK=Y96D~0b*)L9F`|D9qbONDL%cHPUe=@2j?v2=PxLF=pe;Rh&uMJ!XS!z>>wTcYg z0BcxkA@8ye2^r>`2RQZY+T^{Y(7LR7ItKN0)>HId^gSa@{Zag=voB)g0*zsKR>ze| zk|9wljIClNn_w~2aYnWG z)c<&0=$jL$tjI3U=EouorkeF$aOWe%7@$lfg_x!jouW|ms& z4%5q%BgjYg(ro&gD&X9|k(Bq5|5fKxaX!b)@+{~O`5JAcVz@^Ql(Q1#j_?iWxbbF%_j`Nblc&%9L#&gf! z6~=>(M156t_w}BmiLGR7oF#Kwl7*&JfQ*JGGZ$1dD(--}ZKTGV;2q&C^in=q{9A-4 zD_LFme6Airz^}HB!1>vN*pvXbmv~^wx7E8hU1R+`!L$NWuOz05g?8ZB&Ss(SNJ0Y3 z7gNrwyKuvsq9oA&7o0GuvpVugh89FoDTrc?m@K$mj+M)xzBYYG4-fWg2*TX8Dp7lr z^o<}9&Fx=1QP5etOC`iPi%WL1Cd~3r{mYf zwaL1oNQy_xaufa>uYAlW`MR>_~{uB4Et zygjObz~u_y-dQH6a22Ci{gQ@M$Wjq47O~x3qchlY%A}v8mH7mzYWS!LBaL^FY&3~1 z?)?iB#w9ulwHo+RHBtv;M58{I1Qv$9Dk8){>AjZW-)>Rh1k-fS)R?;}JsJ=+&DYX$KlqcNnO8T}gtg>P9nC2R!kBME{xL~gV`fXfQ)k=zjr_^1Fi zK+3;qf<%sB5h9Yo#Agpms0Ko1A;yM_V~su5FX|$gJH?6z>{oz;r+%LhdQB-J_U5pi z5#?YJC)2SFq0_sv#DA#o|2vP=*K)>nNHQ&GbW8#Yo<|1S?-U7hko`tlj;yZ>) zQ_T{j1VpV}y~B=C^&!CY{Q7hwFATVbE>h&0D^#^#70bEy>N=OobJs&xEQII)UExdS zX5qMqur?0|yfa72Fdrbph*GJV`x^`xn#f6h3Nx>1LnLw>=ji0cA=-^m?{cadT0Npy z(W#!fTz${T58qpHkpZ-CCowIeb_Tw6PBTHih1XR=i6PpDF}-WZj6_seWvV`d?u)l{ z7B^Dq<~3pwaCoZNUTm_abgSHOY5mZfD|Er_g_7Y@wzcRS2QNY~8 zH6sUt3=aiXwb^O2??5Y4tr`N$(c?!y{8jED;O|GyB5~qQ4>%y=DJ_hM~0{*uTkvH~GmxODo!cinZRRQg+-%M?b~dGm&7wXjZ*63R@5D1`un?&}@_0|3>bi^ryAY`$hAuTv4gbx? zkZR)phk&AJwj0MTR{=yU(2WY-;fgT(%w9@T4?ZXPl~luXuFS8CS!3ozE|)TaYJk=CO>zx@3ArT5elR)9_3bm7?RJ zPzyaCS^6$msaS7oM$s)a<|(WK-UE9WOgkAcg0%~6({3+86AvU9c}Y7ySJomo?uZWi zv6;*?K*g27iEu-mTBpbwri|$xn$|SdsToac51SKH&sRib_NK{%GTD7{8bbY^8^@4T z9kn+@U{Ru_326b%rZi(Yq6gx-hg{^0B9elD$L7dF%_AQ73!{O?HR~?kxCvuS{4RUVwDiD;g+RhG3f2)eSxJxi~a7>hJg;rUuJy-af&FUOe~jI+!UgYBO9}^ zuwo8A0;ke}UA^!AtH)I8XiUCP^qK)hI4X*(6fJt5E&VLVZM7ULIo7gnp}#!%L`$8Y z@wV28q5|Xd!2QgkT&9$8XrGINRGbeL4(QQEF#;y7r?*T2GKp%KssDV^ioCgH$Skw) z6(h*z>hNaveKt3Cqjfe5IbW7*h!;ZxE<5G55ZDXBM|c=%-p zyS+(gL?4_V(VvaPQIctqs%4k*GIa_xi$$y)EP2@CB|9fVHrg9cE1lfGC}ht{g5A;I zT5afysF9eF1`7kBh%s;WB;b^q!-hAU?#sLxYA~iADs3=A&v1KIAn0x&%yy5IRqa%o zclyql_}zoF@I@)Qx5Re`Jp!K)X+J*E>qx|};?|)K#Cb}EjKWcK2$`rc?KLy=AfVO< zA&g#jj!+pERP_lCpK^kc9$n?&)9uI2W9$Q6D+^_??@*aV&6d&ZSc_ETu|w=WO^eox z8T>?XTP&sTsR`?G$p`L{$6fN(u3;|`9Rkqj@qpnpbO`W?1&UHfV$E{|O`T%T7N-rO z*UzONI-q~iBj=Db@J^8MGNN`JOZ%6clbKLwtA;Qqq~z5*(H$QzH7r9|8_U#nkIW0k zEzSqbXac(7wAKLTMVnfy)yM0AvgKtm=Z4klyd&vKOeN%N1IM^v)-nQLH9xCoTX0S3 zK*-hVO)=i>1SdoQbtg0fYJps`1fK>WqCj%MSe;~`<_8YbTJsJ{6Aa1n zCM1(tw4W0g?y{ywpP*c*E>JeN?9Li%TcGUgYOAfw_hYiD(@(q1S>bQFvsNgh!vJ~NItM+&RMuU0WP8WD2K)uHYJ%cST28S> zlFo0LJ!{P+W4b37m|tc*bE?0@*5=?+U%;asX$6v|FdA(!PNurN4#h((kTJ>_)UBtU)C)F z>zz6v0XL5~Wi2!SVLS}rEf6Nq6##7bZ##t7?Tl2WCBKFtcdGmJR5&@wf!ArtB8u=| z;tn6Jdc?=hfo*&fp;2%r&`OGkWj#11GLR_xU;`^65Y}yTp4k{_=O2BIX64_@rxZ3yLjuQ$IVBcJ!X*gMjIYB?as5`aGpoBEsIBHStcUDZ+(yG1`EDez_&*eF z#4hDcf>@v1zjO6!#qlN$?E#Wc1OSVg4`>W-Zp;hgpSnJCF25+JGN?I%vB@W6U60LO z4^|EI?@1zDXRLgpnIE8O5)XUg?dA5DVlPX`m`WdrVg*;5gXs)j!-|Ux(b*pk{?guv zkll%`2FuXnfvhPqP&@;=$t46}IqZqcW_HEP84dAWo0`-zHwo)%cP4)OKd(D6eN zfjF7V|2AcyVdHxOV@|`?sLi{0|0J~bq=f)(teO1R3+c0Eu(lX(a}*7=DzP6sH!L3+ z27rQ7oozUIk;}o4*uOnyANtS!Vy>r^jxwcJ4M(Cug>uWDNwl8cExc8 zR|3>F^-c`6=1$iL?G=CWzy(t)+N>>et#1WMZQ|{_;3`mN5k8xFuFhf6a)0Kpu8!}D znCK{sxy0NWtqf~TOJTW+;}meMK@L#>uhr@#{Lu|K3^9eF2Z3#usj=qMK z!1q0QjM&wyGOyNYdCa*fP(NAcI25(R~%18WzxzpW2Eb4n)}hDmNUk+a)J>II6=BfS*7p8quO z)afxli2d?++s7&=5Bp&c)T$Zy_C&BfMyENb8km~uiKJgA+JQ?6_B_Ig+ter~i;A#u zil8kJtsbI?zc|SQ;6f`3fBFpsUFBtGQKg$joY0;9mLxmIUN1I6LVLMES84OQKUQ2l zLXrXr@dq=rj^3DP&!p&hc^h5TwqzpW}#g|#Ft0BR*5kfPdtz4jqU=-yW-VDIjv$J&_e0_za}yQFg`kLw72 z`buSc&;Lm8a8O0R#C|C)7dcPZ(lL5Px#;ah``|dag6t~>rIH05lL7))B}UR*xA6`N zJ?eBcHVhBUAt+=Cc|n(In^2#B$}%LM#6OD!h~S$27gutrKE%AqYRKIgSwwQ<4kV-e zOq8!{cnM0T3`~x4p?$`R6&z|#l*2LFu>c?0B+7-Ul3fP3-L!Zt0pks)2?m9lOPKye zWR=)KIK?M4@l{2$``J&GsTbK;`6fGLm4&^?C_W+7h_G>P?3fL#UTh+G$PUMr7FA2X z^hVg&{o2h^PJXG!`d*oK%FJKb!fORpHtvO}TlOVHZKnB4x|vaqUNH$$G_{1Hoe|?$ z?My~RyeT#Vm@V~DxVASJNne_XJ9rR(1@pM&Ew>Q$D5H4{F+nCZY^0D3Pe>Z!*HHc5 z&{qzrD#Gq$=pR_ALJ4kr$%YLTcT%W1R$&t z3LoSJ%uZ_;u6XeN;_|<065np00F?jV#vwJTZ9iU8tp=eL;xfPA@%(uJE?N;MU0cLqrc1iGv6fc@c{Hdw!o`Ta~j>8rHhGA!>N*>CT``Km}(MRqUIYrsNmDbB< zod3#DMLPXVCY8|C?*`9NUNihUbHF;lT z+>oGF^9C)g0QCQa6R9;Km^kS6!O!TNbL#x1DQ#?mCz03V_!!xEbapXjpQ9hE_9p~L zONZ|X=&_kOUm66duH;G1r+39+yAJ8E!U2`8{x&2$?l?QMb01m&D!I~6sUu8nRZ<|J zV62_8$`mym6!|cZ6NXf(9IF$u7#yM#>hjp=7A9I(@1!sQr|VwSWJ-z4#Pf>+3!v}O_$%5E=7enc zBFWzvhrk3~3=!Ct!ayQu)2YgV{U9WYG#G)4cifrE&($Jjwuw(8;CpYY;8Df(37# z@GPPNT5&oJjoGxtZVK`hZJofnJ9YLdH0@~i^49QtN>zVsV*-nABQ>tR&ZDet)pyF1<2M^qB2Fs9mNcIH7WhENtW!2XnzO5auI{CP0fk#L{)f9w< zvZ<2fp_$~n;|E2OLR1A&?5WK$Fo}Z2R%)Ca5MQn%|39cXW$_4yCT%Rp?fx-d2PLfd z<~9pXVIs!~Bh@IfqZ2J3z%54xapT_!0_mU`ef-500b?&E8Tih?_pdOWeM48yVVBQn zL<*3&!-Jh%51_Ni{9v9umAwdCXIcr|hV4i%22JtlN!;FO7Z4(k^C;EzvdgE9XAoRe zkqsMn#!(*nF&%Sp&@c~=12Sx|l%r9C8{E>-73$Cv-0=?J#36VuI3EXpyu7Fw3Q2vY zcJW^a4mN&SMGVpmi3!`8C?djTD7PGpsN9QzxpuL*rWgYJ&Lf|P z?F9(s3D0;P2d&u{yD_t#so!p_SBdezm|t)A*ol%G-IPfIXT)}Gj8SaQe=^IkJq&j} z2L|#?`i*;Eu=oYlnAzd|B{|EDi9!x2^zLX^Xfu?-+usYhjxad}Z{Nw^xs^vaBBbIQt-@Xn-o2SaaYhiPrc5HW#u>4Ig437hkfZLy zl2UEeO7l(G<%8cSPOX5ogeZ3`0gk=>VveZaYI|}}j(OLCBGPNo`>>M2y-G9IEcBM< zOkoGQSIR<>qZtES{tuhku&8TI0za91SL;+rzGIZ;#$3=z7%Xv(m)_$jT!?Xm=s~P) zNIeoaN_~vda8L4O($bv#A<{-Wou$g(gy85iC%YDc)b#v0dho&D&2+??mhTLb*)qW1 zc6E4XgPM6K0lA;i)nSsn)J>c&)|bb_1tkOj6J;Z|yJbcJ^)^*`f8Gn}-CIpU2Qpu- zo{t==1&cK>qyq5!{+ZhA*l~5)1|ZyHNKM)3UzPne?rNz-w;|%$V9fHORpylgH9hY9 zYG}!^MWzuluO>SL*`aE^{sDynfPf=kVGJ$^aVfI z9I5HO-dm_N!sz|x3sK9h3*Gthp6+{Dz5+Y2pyRl<_Gw0$DeCGUJEB=?UC9UX0^Sz~ zX@l@Rq`hvXTy$l@`ZXgfN&LDesa81!2k@X>Flsn?%vZ8h4qY@1LSZySPFJLP=RQ=A zSjCX4s$Rd=BP!(vlW$Iml$ApXzszUT#Cf3-DWh+Tc7s$)x5tNQ*o5w1A-$9A8q_$w z8qy0&vNW}nY3R9|TW=9S0AGhC@G1L+8*JP`z0{sg5Rx&I&mkD`!t-V73|&U78Sv*4 zgzRy0ZNyzFn<`A$4YweT2K-omvZ5UdEx%q4IQ}I^>?Vgt2N4rE6&0%Vk+c+NfP4fr zr^9Qbfn+UzXaCYI-D6eCn&5YshI~tVCBph@fkLPDF)&~u zC2j8y{UmH+>;#V$00A=oRc^ZzpONgc@X0H_Zql(&Ez%p*`(+YhO{a^;JGeZ)=M9({ z0uM&9&13^S7*Y#jr@?v)pb^?$Ik`J>p0<|AJNIdNCL?Mld}9f!IKF4{V5yLzs8XQK z34!Q1kK#WCJANpFG!?|`xW83%#DeR0 zG9MzV)#@mxz77rj)i=Cj;_EuS=P;=89z_z*WC;^b|E>(pHZDJ5OLzkfVab9d`qlRS zsazb&d(<2|(~{KN$Gi-Fs{|XYkGytkl zzRSA!hP}Ve4)ky-4H310mzu+Syb9+6ZFfRgKoX&>C-OF3$pjbs&bjO4_zBk|nX^4Y z3z>JF_*t5hgjtzHp6=GjBSG_NS-@g0WVNio>a@t|U&a_P?Ke{(edIpJM-2Ln8DBgH zQP-~{%PS2$QF}?rhvBrefz@j2Jg);LJKIpyFVJG2zy+G3$|&G0-0`!}G=PsD4uT0- z8sC5|Nb=l+WC@$!F>(+nz_h0vnFGzT44l0*+^v**U|A2nDod9(@QNgjC`U0}Omqh} z4y}AEYsMsJDc$&b2NQh;w0w9mN?Q#HAvQz;idp1v+C#55gM;6 zye#APgpA-rZ0JZVk6*hNA{X(aw z+i{~&I{@_NWJ-}MU|2^ zzlvyw8-t7!4kfK%ogS_mwa{OxwIYV4P(k3 z_9#Ewti8V!T6PWXyAF6S(UMzSrQ`VYT0mt^;;#yc>$KER~n7B1-d0H9T@3O{y zTF*0%@Y2z(Bli1lAYGX`m&&->lgQn3kK$enl91kD_J{jBY3Y`$3v0912={%|u^}}D zz0LUFT44GfS~5(1x`5-(ewL^*gm!`&eN$gYMEG~_CNrX|pFMu^6V%u-D-LtMT9R&L zYps_-k}6tGJv_Ee)Hl6qIXuB6337r{_=Xfli`X6m=;w&o8t4DnxZtQ$-e?sIC{)S< zG@h$dhmRWGOXTYo33vJY?Gevpaz5~kYQ?cql7~LaR1iK{EyK>*rYlZq>N*`d5tzn_9$fC#0xawIX}FYn!?>?m_m&%%BLL z=liB8E!yKNkil3*56TAD$@{UA?L=;Xwg2?-BkE4BN8Rs7o4FTXTc|64m|{Q_O!i(_ z`jMY>jWOCGNj6mW=u&!G2&fP-X}IDLn(dp@Qa zT`+gjJL!8O{_6YCLZ9r3WqV1bJvI{vjNN@qdn_cGyG=%(?piZLch%`OUbdP#U65@* z@WLhi?@(vPOb53y(AC$XE*c?2yo;T`hB;Gw4@;XBqO$q%aAu)`fqfRL_>cMCQ*%{w zOqHd>8{4Hv@_>t6|`Q7O4OAFH%oY$3akQzVp*m+17pErJt?XEry_qTw^SnHmZcFB-X4`1G! z!^+BN*M7(!a&hNtz6ziCZmay;_D{vI8!(^;RbZj%+8fwmVwAi!4ugJblu98n)I|t$1Ih~(pdC8;F%v3S@C7FF!YYu zcC|k4Hc5YCif+_)mtWX@>)8QjcbUaqN&= zd}eW=9+Y!V>V02*+(P!A*JTt?{K5N6Fvbmc(eM32IJ2lZPh04$kSQ5y?IJ&s z_K9akIh#pHNdEFObkLg)z=lWi+fXJuw99_>P9nItZYQ z;$)|8-}s}yM)KQxD2UBKae>F$w4B5LYHBf}K3MmSf~rkhW+c7>c$H{k!;4=|n9dxc z%Lbt&OS+zuFX-8$TE=oOz@-c^m*|3U{c$8&v$Am%?p=`W2L7K7`8$8*+lJRQNSQ-=p8y%1LeK?4SlP-M4bPc;#Qjf_AF zNfnq=^6G?}*nACIVd2XZ=O*FrFpQkxm#~e9Y=*SBHv?8sQdK0Srl+Wnj6vYFf*7+s z`);O0Kuu-gwesF5J$hxNrSl+!rr?4@Vrg#l9S+Tv-C;rW%7^p8modi1^=PAa<4n?v z)m;)k5!{FW9ctlysI%Y2Tm+48gnrC>#@6%vAC1n;;&zm?OlTf_ea@09BQuer>h|aO zK1caBljlX==PCoKZ4X&SB62KoFT-(-FUI^U8NlKcQ=#f8v-kh@0QE5V2=8`7;M8Vr zGk#qgT1W1!YwgCpwF5UHq(w5|Hf)xm1|qNbUAhQy5uE#p;f=7AlU8D`R?xfDz<78=4K{$B7J?bi__Fl-C13 zp;)wNR{`W)XyfVLY#5*GrI7RsGFyADE@YD3%$Y1Tih{w$feZx%Fci_XoV4B(xy!Z^}qO(!J&Yvc}4>@%OgeSCb;1s!P|&vMGp0$u!C11OK1 z)x3bM1)&99CU{4sl!as~0~&T;)T;?~EaxLL@mhh`mR|jPuDSuE?Mtxe76Mm|Lc^Rz z>4Q+iLSAH2Y}K+dGP{u!+S?0V@3Hx83B<>=)`F_%`rO6giDB}D+X)-^b7^2$X$*YTt9t?&xR;2Q2nxcXvJo5^v)mBrXsAUnPrTi1)#?DD;R{vhB3PFSJHtD0<#uU3!)fDm_lV7aJR zfL)m5EUPE2Zv;GVPH|`BM%*C} zDChi4k{>f=%lg}6$Bc;&b$J+H=w;l?^7QAXc7r?0=L#Y-=ja#wr;wys*Ia|mc7%AJS`_iVagNu-`50y9av>u{@ zTfi_PDv7QX`ss6L-niI-we|EoG0WH6u4!!kL-@Lov9$Y+q6#*00uUjE=wgZa56uM% zLlto)Xh&`dQFwlWuPHQ;`Wbi`lD@^}7ehO5p+T?sKMuJ%ozs@r zyJd%L7;}3gd+XJ7{F3Y-Cf8f1Ov|)dD!Vb6X$;a1Z;8gT=UvA9*q3pN5bjjg`Enma zBDA06tl77Qv8E!GYNXUs(10g$KBJbKh(Mp+- z9i}RWL%8S%kNE^Kb^~6xTLEju629{TGH@>y=iBtn=4{XRON$qA!ZCeNm8*lPtNyTE zPY~Zip(9sv)Mv-o+?v*p-`~NqZ8`M1%D++NbhLPl(rteSAc?x>ep7EPq$9^V)j`DV zw$67TH|bv^{x{1|GZLZ3kv+Re#Dt7z>561X7*}9C${XJc_VInlS@lo%0^f?A1b@+f z!z{oly-gFrhoC>AxM!7%=8*ch_c+?1aKg%nMRfn~CDKJ5lw~RXjLPva=KuJKZUQJTET!!eeGUWu= z?pNS{Ki_kz{+7U+r6+V)pS2v z@j{6Qa|m-|z&)^IS!3LV{Kd9(_{)#+w_d>2sfl7C6F20dibA0=Y=TO)Z?T6P=?`E+ zwR*dRdkl&r90_`OpP^43Cn$I!fj2QgNyg5PHJu6F@h|()5>tbCaaM4GX);|!@5?_7 z(qDC5gT(lA23If)xE!VdQUntNN~{3@dWbNthlfX33v6vMMW_nX^NG2_aSDG8Z0ZZ^ z!A?>|EdG^Ap_OqQnKwcs-x^pZ(^yA)ARhWWy3ar>qY}?WYY2IOiSTnXvmuHU>#|$o z(XC|>3|5~E%w&Pj_c9t3PLeE9=U_J7MBEvfM5<<_C0!Yp6|hEvd*nR*y{3$Zpx(Xt zeBJmkhr$Srcm)oYMx7?%tS~i-nTGEHpv>haYMt8*4zXYHQjLoqRJboB0*VVuc4AZi zQ1(Sy3N$JMxVC2e9w%{MA=Mv7Ba(fY$#)=2`IyV}n>~jsBSeeXg+3h#2{dDKM6nx( znoPmTU;5-D?l~Oy>*+`d(e*;ZyEm;)@Amtu|Bl;$$EQJvv5(m9@=y~|21czX{wT(3 zQf@|O*)zN|ny>R{AU(d%ZuSs&>u+(V!Rk7N6xhC$|A(ePFWOygo1kr0E-&~V2|U9S zCki7G zTLM#7j7^T-^#b`MECH^Wr!zROmpn#HM^(1?dF(}SRF1=4EV}4_w>&yN8fttqM&=G? zj>XLbV{7mjv33TtDKTQZR(9lYO6{M5AF?=!b}zCp4E+TcS4Q+BDyD#5YWK;UK7;=s zru$YKWk&2ny-{^zxoGGvT2ft5Ye(LNVtg5H8b*x<-@MTqO~<;|QPsvP#X3d$GRsW| z1mcS7eJ{^^q*LfpjO9Ojeq4x3Hm>y5E!QOug9J*GP~PrJY|?~HxdPMC#_#Ui2lu#wT@mDkw;$Noh!2GrBa3c?5uf+7jjuFsXA*`M?1M zis)P}Q!@f>HHPb}hT%=u34<_Zk!$wsCY9R2Bz%2K_(m82kFfRts}O0ChKWpJDE$i; z!Vbm?0;R7Jn=f5qsTp7&FU?MX3aNm?ngsM>KUr1bS@73P~KiMA2eQF*h# z$~hXr4PRj8K{&Ruewm!uE-`_P$3ye0qD|59$eLv$yy7zH#t|zRBb<> z%(gtj6Gtk0{pe#PK*9!3l2Z8h%@r)@daF$+5Q+4@6D;s8fT4bk>pu{nJv6-bv0c%? z*Gg~`>24f$qqeg`LL;3*&a#3;ZOYgb5|(7oGnCP(J4z}@oaudYQu5;aRb4!Bo7GCx z0Hb-9`E$8#D{>GZ#9bF7n1XCJk}1YySX;gKLksS@m8=jEL>wZ@@b0JGLua+$lg);W z7<(kvCA&@qtrf++9}a{Hp1i9($#3F@v8yiF$U%YJ#JLrdd@>EjIwP;Xd&X8+X)!>& zfE6E22(J-pWwR_Ld-IsS>b)~&!#fZrxjJG0kXseyI1ocnUO~}Lc;G^q3*k}PK*zKv zMUGH9-LxC!0Z2e4g=$C+5D*WAv%)`Aj#@B=1Nd`okS;|Bj-D~b4T1_JSIOX6j>{gk z@eKCj+f1xGhK|J`7(V_v?YQ#`6w7VR)M=cxWw(l|ifu3f{g4PDY){HFYX;f6{&fZ7 zDDnu!rlUgzWkWo}q}_+1_RMtrtC&O>Lg4%D9L=wP9oo4+bSu8qm%mo|gXTyfaQ7Pl zwm_cp)RA5$Hk8Ax34gkggd^ldfTX*$BdbNS1L_Nmgc6-8sIe>QRBAesaM)y9wRiCM z293|P?Z3(Q@3`;x$d`kqSDM?k^w1_V3)I!_Hg#E8vRv-QZWWM};EYJ2z`rmF>? zi4D=waL`+^H8y^bJ$H5qw9tcjS}d9a-?AW-L9PyN=uyqarCXnKzUJd;SjFsnu{zgB zYpD~hti;e&&p@YlcC9AmfW)MFPSis`jB+`1riUBx_32A$=>{5fM&m-Qn3&ZWI|};sL)c$*_(GT|7b&=L2}AYSmvtrdCxW1w1i|=M|=q5rnJPcf-NZUjLqA zqK05!u>T%=I=iLXq_8%Oe{YMI1&H!N&}u1M}wVCvOFkJvs1YxYagke{d&dbF^i&5ij-wZrcr}0jF_cx%Y^-k zJu-eeM!Y;H3>3=G(*@s?im#j7=;C4>GsTTIx2kCdcnN)|r9%x>#>Vf~w9~=z?}cP78$yZN@fsfm zNjerW<7R)C?BuKK)dE$@);*2_X#Ehxfsr9f%{BBm_62!agVruw(d~>4Bk*$XrO+#; zhq9tN!BkVZ%9v@IY1G}t;Piq3x%vi)qZ~jqZ?Cp?S4BcYR@gi`YL8(B(;#ZFN3n4H z;LIW0cG@U|t4Y7SA*7#bU7^=Q8-?GBbNVr5wn>eu;48abn;7KhWQnlZq{f@+#}i zwMIUhJs$iI?30xdnLZ1Jq=qdj%03*16pMF+Pn=(ovgXWo7w}uedXFO2e0 zSGl{%_5H<67mo9T8|`}UpM;8Uv1bqdtcJ+Wa(x*;aq)EcIlT;exBy7r;<^`Ugzi_& zyLr?$*WAsz@2A)tE-@!VE~?zT1W0o)A8_-uzf0akA^a z&@!v$OgJZ1{fwiL@zJTPVFV^XlrI32kL;n?JwUZa&B@nSa&ZX(hRxyjOJgrHdX71I z8ai?o%C2yS?WNN;Wv?dv4l@Kt_yzI2XBf$J!}tFyWw=`N3XtG|p1vqMA90m0Lp3OQ`m!3D>)t zbl<`JDvm8!IePEbvV2-5CzZ1S06^eaYeq_1EaB@8$ z1M&AlCUKd1gKyr&g` zL_h^HEa7@fY^udV;Ohq1JPRNKcln4~K%%)m9O#?i)a)Q4Cu)ux)zX*4f~nh9!MJXS z+7>FFy(Dj&6+apD7-_muelqua2(nbMw6{ncrtiek-g$Ri$`{sYen6p6GZo26w_ZO* zZBEHtrMj-lYsiE6-xqTd;JymRj-jJqX{UV3B_vVCm36{DAf^QkItLn6aOZ|`-WipE z%d^*Fs9q^pTNP9cwMZLvsEcT##XlOZH&bPqVKiomriCrx!A!qk69gpw>8^mz1#AqDrVIieQXsLXw@Q38%&5sX)dA5t`qK{3?01~4oR;R)u zrWNd3I||mq01SqDa_JXse55*6hg`s0_hg08bPX*2i_UvwEUNp;p~}GdmSmY*`yli6 zinS>3qilMIsv?OS=pFvaRIG@k84+J*Alnm)K6w*b$~`tMUKl$$av317e9v4M@4wV^ z*aMc4Xhh-_f?1~;t7v@MLrCcFwpvD?fIX6ygz3rjzLs6P2yW4w-*}EwdYsv$|5KH3oQXU$3MSCFpN4g zbSEKw^|awmv?zXR8}2zJlp`N3>U!YT29=Jp|F@(t#`!Dy`dv4@C5^7caZ%)r^2chD z>pnO6lBw&C{o@}p08cJ68p$2$kblSut5yV21tOpwfEAv z+a{HlQUNxduFOYr#v`<~k7_2U!s0LtL!HwTMN9E(ggPIW9wrQ<~C^UG0zJiO=Jguz0`4j0~SPd5z?Oi2|TZ(0xnB; z*VBq!Z;Ly6vV^q_GpR3lpGzKiEY)b>MjJVLm@O*_aNQ4R8UlNejaTz~ z+^a*aE!3(X9Y0!TCVOD?Gd3_K3;1X3HcmqY7&IKsLp8s+lU?j+`rAulZC7J7W+mZ5Vl265bFqg z&MCg-;|!!nHG+dSY9>z6rKmshy!U0$)WX5dWhqUEv`>lYb`1Gs$MDc)KQ_sUd#m2T;>5+ zv`It1{sCh205L$$zq+g^@X%6B5oLIFZ53=XC=+pD^iG)~_bP#?b`DRn@cY6_A5t8v zG7{8qx-L0E`-LJD0RN!_j^}hqDA~IRx04p$uMKf*+_kKf*Xa-BGRvFkjWn?U1b*mb z2ze?MObL^Vv3V$!@V>mEdm@=+_>XA=-W2q@s4;U5=W1@QcoBo#BgLlIWHrWYZY_gX zO&Z-%Ecg?xl}_1PfCA_xEht8QtXr&R#<$yPT9!{dJ?@@nN-epcRqVvI1_d zfu%i0la}RASwPzfGyH~tMcw&r>-CD+q!>8oSJnd45*GP~0mJoL+CSR`d+I@JxS#HkY{3oAzwq$?XdCt>JdyVji!HK-PfhMFn<(AeRY z>c@93ndG)$3lYI9^!VcZG7kK#%|^o2O<7$N9zBI@yzqF^)oO$ZeMC@~-)RH`M3e8N ziGO|7P-u~8HwzG=@!zA1=0=K!b@3xg6qfJ+w>oGiO0FEO^McPkhx!S>a=hO9g?q zTPf~V)YKD6^=X*!N?r!J64Z+oFXUH_RvC2~74|d>X~2#j3k}<(Ci#30Prn9wp!k0x z>v=$?nOy%|W@?&a`|?SlZQP{JdN@=OETLCQ`^x#i9+KIpoP+ut|0(eum@U7#FWCpe zXW#C$jP7w1F^Jtv5dB3d+jtSIoJ%mewXjfQRaXHPfH{9t=X0n6v(9~n+M|~r=ydsz zC39hh$a=M4s2Eg4Pf%|Y6hHs@*5riBa(*wX#9YlB#2EZ?{drNi=JUNfHWbOtR4FdM zE^w#aCo$$xmN#tF{y*eJs$vfM7$PUA#iR9ls!Mb7B1IY)UErnd_7#P*8vwXN1mSm4 z5nPhR5B^)QMCtlIDGZS=4-+R|CL!K0lXie9UWXPH57VAYu=O~fgdL(B&shmBXt-)|Ii(0U&g6^`yrM>X90<<16X8< zTmX?Lkgby=H%|kz^^r2kzfz3WOQ54JZ~yx@;~lPAoagv%LDh^r8#HwMy2NT%d2Xh; z3g+@Ik-FbJ2A* znL!+#nkBmqj_e02 z+;%htloue6Q2|NLKDj=}FooDc-bcU5x@RN!X8cmMqxtZmXEO>ht9>Upl~FYMTr2Yx}#?oy?+g~GM>>L#4G+60Q(T#bl7 z9U%&KVkOab<;y;@-Xi7{UIG6pL5=49LNo@?{1FbQ56f)GA>^Jf@PBI;eQw`p2_NqF zWnS=}LY8yvjtRs>@iO+o+<9VW-g7%3l_!zvHwSMz65q2U@+uObg!#vZ#O*nW20J!v zzM%l84QryPpHcMF917ri>0glXq+`^&9tMo}$Y4%7++{2zh0TBmA$&Fu zj#s0xmUdwYlo#@2voA^EYfFuS0|R#JxF#L4Gy9OhxR{R}u&np%P+4=Vz9HLP)p`;9MwCM(X07T=3$9omV z9~W2IOY3S?b?U z3CKMUy_zn7Cp<h(RL5uJiR>g> z)*F+u)ZNmN4u$KMF;8o@LGrfI|c^JrBam76QluzA+? zmkyMh;dCUINPry%-%&|I+7qQ9EyUV#hqEUJKwOA@>gV*eMhrZxf2&atEK{1hBsTAl;iD43Kk*xh+3ZADYOv~3IL6e(>e1&fk zU~=-VlT@nA5UtP*r>?0jmm5B_f(qRAFVQPYBvj@wKgJtUDXw_~pW9J|DX~dcA%{F&)3<=sxro5Jw)3$h7VqYjI06h? zM{A*3z~|NRh>(>Mgn~@M6TQL z%Im*n3iU|scF29%MA$`cGrZVwhwMN~B}J z7VU7T7c+{L6u~%hfqg8Z#TRph^UULJ0kU@#-!VA@;(+}2TDuq^Rzk<_y&)d{+S7gh@ zcRxk956KYqCbDlpyK~R^Wqm6hZ>1U(LGzY;dt5ANVWGinlzUT_j#V20hy)^A2KXVK0`A zuPZ%EKh?aBCtyO=DIa~QJ}>&X3i1>G?8e09CiCkgRm8V^;G&{A5wVC=Z&(x}io|in zmSMd61=-P4$tdN>Ol?#n&M;Ca{f7#tXx+8KqNQgAhaowRU^I+`Z=kKUWv4eXwk17_ z()$9~R(9){a6me51JVlZuYgng;H>(C%qfC7+FnYQ)uN3tS?ih7=UI^~fdAF%j}7F| zJz85>UYc`XZ;ITFwVbt`xM*c?E}1cf_C!{|&anxlx5>qa=x%dJ4#J$C4{yB1l2;Vt z>2n@)jVJ;Hblgb&vmVj|LeBTzF+&Tyl}OreR-8mq8nVZqKL8+XC@JpwqVwblSnMOY zL=4qsW(yZ4fin`~cYt`(R2+0d{Q1?NNF?53Di+n2eSTyLrl+8*Y*S+dWoV1H_IwoL zCYd<4A1zO?q;K_Rv09YDY2;lFUA@cOkGNEV=j(E1@do(7f~NN;{p6krrj|j?KB1wS zyOLVJVjtOdM=o~)8mKaX&x7aq(x4fCjC=*vw>dI&gcIxSScXa+rj`P zb-TK%5kK0|*Zt7rSS}`xhYS--`IA(pKDTi%n2$Z(O~Ew)3;|~;a!Q6_s4`fTIMMFs zT*bm({WC~A)_-_ku={(yN%Mge(qf=V>@X--^=1`Ec#3d>J8CHV_l+1w6>A*_w>~`7 zrFd34(JC2iTTo5??s!W4H*W``;qelc4u``^u)9NlU@>s(OC2l{Y6|Pjrclv&ab%C3 zFa|-7{1vmh4#qnj>>cYA@aubu^E(sK-YJ~rq3G2%-;SW8W4XudWsr2mO3o`UQ525h zmjxhZ1Epw`I&8=PVu;C3S~44txNLsbJ4M3Qp)y}-P|k?`2CTkQf|e_zw?i+RoTf+Ec;M)HbBTI+Bmks&3it8p z=;kVh$b{BWF`XRl@JLVP$sTPq?#o9bYa1c+SFOiLK`8!xcJqjZ|We++D)0CzdPyvuSzUv#XlP|7n!#GI49C;^q(~^L1PzhL``T2`CoYO z6ooSjgBa&NbdKffTbdnV)n=5!GEn3u=o%<(V43L!0r7!QTI0Hshs}V^?aO^yu$$z@vFJkZEsx` z9M0*+=upYX>4_&SE1LGd^(Jia5N>WDR|Pbw?ZhKUx|(}za?Itlsm?NVy7dIlU_M^F zgM4a+Fg}$6FX#%RW!kj7oG*^gku0gL&ec}!`FKTBiPRDjzZyP*ZVa{6N#2?8$O+8F zjZPFIJz14 zw{6hJcTdfNHYWT5S(*A==r44ge%e8tRABnTa#N$_dXEIdbZbIeHV%ckcusDDUfb=r76IvXQt99+ zP&kbFXnP6g%Vd|;Xm{V#3aG|*aaN+<^N12`k;NfnpsC9*OmG|(a-kU4Sc7_lo7wgR zCq-Izmv0Wb=xE?W`N9GNhU+k|$B(s!caixIe^YzYLS$)UGFdep^!vZWeGeM5BSyZW zxZ}q{uU`8i?n_2``wQ;SrI_0V&Gm^J4SZuD$haR(%<~W=IVGMGDOB{XHTkTws!Tca zU>w1lHq$1{thdSrk2*`|j|xxaGnc1J^9hw{k<#bhoh$}l(OHZs97vX(1_ty$1Nqe1 zYS!!Ml7{NqW)BvVak)vK5e%>288Hb3AL&9`Y_YB*+mzewo5PFjMpcG<4-{<*L_}8* z<7}TgE+r%>`(<){`M$Nd(DbW+F$E=x^CK`RE~m%;zv~8v$rqWx?%U66v5M zlYlx(K389DXm?|`RYc1En?=npOvaF@sV9u0mCsOIXq>GpT1+OaZK&sNj<+j`#srvP zc90bD$w}>Mkul4i#lLl~75~tUt!;o87tw;^+NXE8F-l65V4K?YL05rHoo&DqM2;Xw zKcm#r*V})Ao{6-WhiLj4YPix8mrda{fJ@xyhoMEJ9TzzwC8b_ruOVDu*D~rU<}#no zwVI@2vGJHAA>B3B^g5AZNaAIhhMi{{{T;5IJ-PkS|zpg`Eet6 z`n36dp=cV4As2o9aJL5dqdaL!TlZyv=`u&oy^eb9eV79bK8bYDGe*;e)PWOU!ocU2 zR>MRdlrQHl0sI$JH2Z+PdkkuaW}GC`fzS>~HP(nyI>J&k2F0q!+3xX|YpMlpt_(Vz zoOx^}G!F>$E5qKodke)c!)0$8{TMq}rvvx79JBCtT;G~oup+PsIRsbTy5ND=LlzFC z6E=Q?{ck*=q@%{mGZkkd=QFk&+4lW6574gewp{X3&wBDOEWj+)E^_<)H#p^m89g>( zu$6I=CB{}PTP5>`1{?YySEvl*d>x`KO`Oy_wew^%$#OSFciNezo=|i?F)Jk4+wI(N zk85?i91;xnRRxG8T%Hl(WHD+I-F&;8pT3Mk2gS)5uRC~;`TS|}9=I-Wq$MCejKw}L z4fERp^a=YQKfqJW-M8@nF8?vb#}n>;H@WZoaY$I+$oN%?s3kl8lPCg=eiP22h08WB0HC7HO<5gJcBxGA2}Ug;e#u7j{$bz97_o#-(7>H$(^T^890oeAi-n*y z;;bbNt5dPmrE#XJy6+Fb=%HY~c*m`hS+h*Ps)-bU;Hrj~)D1zvVCbq8Owslr`KH1Y zXww5wH`fnQ<^RvO7||e9;zA+GIJK)gH=7yVkLLF|SwlA+i%`mUyLeh`0)0nt?EFf7 zEHpZu7L-yGDdv4vOWa{^s||R|t{G>TYm4o@8m7b|PY%Tjv45O`c`UDS4NBYV#xe7h z%i&wg@nEkOcmlOfsv|*!_T{d;eRXwd&m4*)uQ{<$L&P2!F3QC&XOR5&SyjhOLf%FoZH zm$I6)VKMIu9Ct;9Fr>lw9-HzYx1tA^C9byu1~M<0s53ZtST$hf_buE7VsNMunrD7( z=sGJ%zP}1JJhJWnhOR&sHiFX0F$d0$7O)9eDh1;*rSPc=djC@ugk}$1@?ElN6o=eE09vrSWm6vXSsjkS z`)+)s0`&rE_CRz%q_>bmKIp>HQs$(8O!h6Iw{r~U4{Bbg<_)*wPP|P1r@N?6eHZgV z$$+Mj_?vW0WVp7DRj=qPMF^YEoR9?CDDCu;s>AXA00A4@m)9)4u9|tRf=l(~)xX{S zo`uq+{_DzpnF6Wt8*s)^`Y;Z8e(gQ{N5h zr+W^n7pEab&YH3U5kUw=rRe26A-5U8LtX!+1;T%GL$382M^}$e+qR`QIA_4;h$CoM z?kxlSdcSA2o%CW;gHZ&F8DRd+pcgH4$cVRtBe?SRdoZd(dhOM}Ss8=v)NTBbk`w*h zR|4r0TGYxc+f9C{{?vmJXM#Quk)y-q>VHl@u~O{&OuwqI#3x*dr131?Vdm6H(eJx0 zCoX%?7?yuM7Z;EY4^z4y2Qe6#BgA3Y&i+(*9TTGQMYzv2-7w7N6B z-{|`~2He5J&)sVB&M?-wRhFug9uFF+kMTX~S#z8l!LbnB6n5)11 zX>{aJx$FC&;m)Ilhd#C?rm+Ep)uxvb=8XVX54-3l zrY$H!WqoEZDtt{15J;OByyn~?V1BIbdx3?@$HV{Hw; z;MRF;fzxg_nB+~?$~9`01nl&iueUfgAss`{cC}(4O7<>Q`w|lKDzM}?#qK3lI5LBN zlP>PPtca{O?cU@9h_KK(Mn09W)RyE0e@9Mtpp2=P0io?Xqd7frbhqStdM{v84BE5Z zik#D;%Vr}Q@D~gs(tM_{yjD%-bD-+l_5Jt{tilk7aA2Blq8#2oU_3yXF*2Gp+zNr` zO#OO-NKs|JKUl*Dn4qF21~Ao(&^5^YE5sUKflbT^8h5%=#v%h>_0?r+NZ^a!oIzp0 zdRx8yjH$fi9}au2Oo)3Os*(Ht0xPo07io&FVKnKX3zbMVOpKcvpG0(zmf9*i zy;(Bd4VL?0>)C@4rZ-O}1Ycv~q^O_&oRR@Q*mc`E!VtCBKWejF-LuWz{t;kd@6yEQ ziBK{T^Q>%dqYx1mCycBk|1(#n7A8X1&o9N`@HS}k}W z-QjCBzZ;qgRFhCl1Sj2$Ath*$o3Vihgg$w^{(XxM>9nVrFEIF>ShIP_MtDKCBi7Zb zf!gUfiqiJ*?09#;>-V%IY-S^m3rD_AqQ{X)k+4c#Dl=$=4*dE&;tRnhiEoI9Yl3n6 zZ_(k(H72MY7ZXhVYLFdGd_U`NZWO@aU3?%VXLnOJJp0w^RK$M2-1hfwMu9?WEXztG z2{z?+e2POn5e=%;<%r_rm-iD(Da=Wvp`qUSkFdjO`yY@;mxzGPMnQqX)U94n_oPQ$$1K7>4>>QG zEsNPAdeR5ieO!h4dkQLH`-a=Wwz;lbL8Ak_4Du78T$)N7F10@Z=bCAg)VI_^J`%xN!cC^=YSBex!Wa?rm;Rv0Qs2&O z(NX}_2IhB0pjN%%*3!;CGcwg$T{|7X_DtO(~_o+JZs*LaG~fQ3z?{N&mK9YnrJ?zbaeUMuf}26*yWfI{Kw%sIH0 zNr#%%ym==??ojc^z`}01Vk-I5-5~GPN4Nz`EDS7rd#AN+yrvIb{xdHtGY~4LTfQzI zXI`*#H8{GQP}oP7z6kKJj$vm*V>5fdr-b^+!+!6Fyrrdah~5C#_sXls2ast*AN2Xw z45$K60pl+GDNf+y^{XN&;t-;V4dNjVyLvM!&Y$&J&c0wNugVxnSJVj+5UJfUHo)CS z`s*jKPxLLbRMlf<4hVTC)idJzJj~!q6%?^Hl_yZpXe)|1&PhTY#*SaUQGXpG>%RQ# zL6gflL$?cV8Rb2CYom}XIPHW%Zrs1MM2ibKVHJFKywSa>w+_Un zbxfEmgv`^Vy}FwV2A?iaLh9WR&ak1Pgn5)Q^#IakxhM`?ZOQZTIY_0Y`?18mIqa%^ zUKG=hK+H8Qy9RmQ<(FxcsA1t><^{QRSZ$O4X?B6Rplnra5il$#?a{`ovUEN)ulUWN zYmU&(H1S-;GY9U%OYWNZ##LV4!ZP$S)%LUP+ycyyZpFd(=%ZfGieZ=i@M|~=Dfo{4NVS;@CBCcgURQIjufhGk)i4!I@(46H>{gK*4p9q=PjBl`uu+T(OBe7A^(_&FBl(SaN6@E=mC@Ky z+L`oBB7RYXMu1|u^#aiD8z5yfM_PTTMs-@|_u9ttYB=Vg8A#j`XfXen4SO-T**mxM z!bxB9qx>LY5_K4k+JCaA3h2gSqX$87M31j#=lW%g^cu*1^gUadn&cd&jZ@}CfJ5eicbm-mMPo!I>mm#aEsyQA&QvqlGPC?R;#UNeFkyR=3bWS zmP^R|K#^1v^#^918bZ6wt)eXl^jaSw*-moeIHy@P-JrsC8@U49@4-c`2|MNb{sZ}C z!6E%(L->BuboZX zC@Vuv?+l7*1I@*Z49hr<+->#iLDbf^;uMOKT8N;YiC zt2M%`-aA%jO_3o{CLEu+<|(%3mu4NtT+xY^6TQm2p-TiLfUD~Em`WJu<>Vc--Y(mI z>F6ky`4V_iXpmf|X)Hx6m@7pVD8SSm(c?Qg^7ZcM^QwAVR%aPlZ*0%< zGdv;%^exq4hXCo~`^p9vp93(V*$+pWWUNlBsWSI!IB%Wno;glEw{x{QKQ&ZW&iZ;R z`e*=yf%*<8BU3;lDt=qepC6SZ7o^22WZ}y2r%vboZ+u1j|5{A+uPX*?gV84Zu~Dwd zCZzBn(-7DTkxFV2j22KJ53(A$u#5VK*7k@MiqD@>u$f%aDnf{GjYxa?%ZXO@Rt&j~ z%Q@(y{qB?smW(&q;7)oyl0@&VV)<=f$sB75$S!ZuHH{Z7GWsyn{05=s4}J^?OLM#V z-KSz5slS|EMdj-ftuG3XT~2I2o#Gt2%m`BdIALqWKKrqGYE0*wQv1`4? zg`MpW51-$DSz_(%1J6`0wgYq0S6rOYF+tn;_vytU@0b9mc@<^W7;nsIfD(CtXlCG3 z->4i%?VVF4DQy{c_5Vs!RIe5_yrCQ|yE3|oJ&_DXa<_9qhl~N+Vd1QD+dns?CfZmzn1-ToH4cMhm z)s9j5WRm(GZ)?tG}xHLC}}@TCehN1De%#U4>Od8&M4$0w(m`Aya}d z=h0S0U}l|O{ipUn4E&O{_ zb5IaVTppG1J%h7b}oYsaB#Q8 zaP!xXK@rx}F7=_Uv~c44Xd4fEM$rDdc1ArQ;)q1?;ZDZ$(utc5y%%_Yd;hNNio^+m zl3|w>5?8~V=QTcAy`DL5V%9@Xg!-9}B&Xa_%o^|M4Kc)2R1O zbddDm^qi^*DGT^%XIxq8%7F&5L@MMmCN&^V$D-UWt|;7f0`1;e*Hc;0l)fSCD-m8! z=fCuJ?nVF5b)YY@xbM;IEZA)nezG0XCj#X_s&%;auKyOQaR@^ar;k)%Aq=##M5h)0 zkD!s9TQfT7vP(+?1g~4ie%b5A5_q60SijOpcMukCos(OrWm{2t{shs8-d0bO2{NV6SbcH>k(g?SNOTHg4LTP{~+R)cZiET zC*3b(m8KtWB)62X{FfPS-CaVoGOs@XrAzGXpat@mxxxg1PDDljf^4pHpRSlxfuo#bcsq;>;=5G7fQ{WM(p$#ysX;6^r}5i zEL|5Uk*woQ8sEV*DY;Pr)6LOk7hanjqD z`B$j$EB8kWR*!&NDTJ_FOwMbp2l3*&DpmxkHapvSqS%3h;;$i$fDM039sQYOm4k6A z@eR;g39@oU5mPtG;kg%{2K|PQW9Vz;!Og62<$E}&M9DG7BTY<}Avtr^oWL8zR0c~y zN3}1CFkeLBg^3^-b!TCn&5FNZyZcS_LcV+6n>DN|a@sh=g&=Aob8y#-6FFO2^ zhnWXY7h+CwR!o!C3UPaJ4Tr08;>VAx^K>k>~bf$tFugnN9Ca!(!6ihyWpQX zdDqygyQ!`tzou3=E}{}ypL${DBc_MZr*Q>TFOb`-B~^XY{-F!i1=%r@6yEdyLm~HF z*)W^o?E$Vj^fi?}7}0gntRYNudHLJA^yzi5u^?c&5#NVjZ*fq5AZ!z86Bf*a0uz6Z zyeEjnn2;T%Y&AQG*d!+CCo!=PF06Bcg6V+JjpB2E;&V=X+!=C#StQXJmnSleC}Ff)OJF+<27IwEFJyWjWMo3`D)Qw;2c! z@-q;X$m9x1&T)E!(7NizNT{HE!4%ccx8GdS(7c<~038}M`=Rw0pcJG*H)>h-xKZKh zifcWRz~8SAUENI-_y`gYzvR@>-hEw0)Q?W6#|A?110`O2z}`=d>kBHAeJCOg!kADM zlboGAGwxF=L4ap1W7~>jwibVcb3+b@-k=#83LKuwk}%`ss3G4l$KeGY5a6XM)Hlnq zR4HN-vk8mh$rc!9tJ;TiZ{KVbE!Wg{@6`~F1)!e$pw!;uMZ1$6I1n~zrTgAj*?oX2 zfcRLOXDx!s?u0+J!%<&VR9M}&6lQU{d&Saev9YSs=Y*;6e9%DYvVGje<@h5M#Do=>N(}SkaXRnSdHgUM+i}6(S#GDL`n}t^cv|T(JjVk zM#2}B@=Wk1g%?kqNyKs5C86(cPnT9`hLxBY=qZX4qxlrbSf-fysYQt5Ok8NQn05Z1 zY;K$CP-M9IO4F13{ULZ{7O&~~VK4X*eUgi9a4e4`VX ze;Lq_zJx}w{~#{y9(6}v!Hir_aN9xTwYeUsK(0O|)ok0z%#*BU?Cbxo2nK#&=4OnU zez@PZi*bFfUtN`dC8SKj*16$>*K9~!II_qlQh2dmd`g)iR0&bnk|6#&ap}YwgEem* zWlR;r`d+oINZ>M`I<6?;kWf&o7>D_#Vh*3a3QMw@{~3Q$-`&R*>-S>k)srMnmLbX{ zCk}8O2h$fjjmNvD`Y^rZ&>L@V+}$xgq$3QaG#h{zz&|YX-@)#n!LRPR$cd{Vq@Oe4 zBl%BOARfBg*Pv)(%SAjWRpqg^qhiLir7iyDCDRHZNXK}4+cv)l^DfNPaqr|lksn1(a9Cc18;|L=T{3$S*68!^cvAc1X8vdT zu$}xAJnwInGI;*=>o=~Q?v>HgVDUO@DdE`%a71msFo;B|j1)-qUx}y=UrVPjjaW}c zg%Caq0r{SVz8~o|FPLa3BT{8ncOUSQ*(& z>2$ZJ`$;&T)Iwu+S*ZG8lY(C?X2)t%r&yqEFFa$iD+71ynI-vu(ZMc_ z@4n`=>JZVclP+3ROBEQPAK&FAuS|Stiscett;dloP}9@;*VpQQ`rm(@b&~FBEo@UL zjS%jkG#nI!bL!fAS1ZxxX#iPKxlb>n$tG(er_C-~o-8=S$OmkUU%b9(>x4579&G%H z5DI*6+_eoaiHkHY%X`phYye5eHG<(@t}%~?5AUo^;6pQnY)eQ*$) zq^6Fic%v)I^An+bW^fyMRY2rxWaMP>^{@;P#0IUP<$HWZ5%Dx}m=^%;Xa=c3{XTp8zw@M?IlYfSYHer0GxdjJU+w1g_B-QFSEtLRXI9X#28ll7X5u1#jTIF#-z6e)4Vi z4clzpAtjVeOa|M%d9qAZYf@MEiRXj$IL=1(0jWtOy?tWxT&=q8B}fd-MSirpuyL*5 zeg9aTCPTMg_~xWcL96MHst5dHYZraPxU0b=-vhk<*S0oYs>Q)!P! zErct>o^!%=1_U;xQY>s!khK|u(mX&)M0ZyjGa#nYrF4y>eFvbQ;N1drO(T2Q*rv{s z8u|a{X!I776UQIfaAoto^hEBUQOjz)FkD(@B;Z3S(O*@BX{mqPLbkA>WOM$}l{1vd zZY(3&Cqt6~M9qy`dB4b?y+koUtvy6niWD8m*YZ{P$a~nTD|24(2qs|zRP~7&9`Vvwz{zS@B|Ze?nY)c zNg}DXOj}#blSja*Im8j)AR=g?p&*4a1Mp-k`<5W(qWpsT?u+P8WSZxkVn;0o0Rd69 z65In9*_KM0~kO zD-^^ilzUQ{7{@8X6y?{|R+$o67qv#IRLvxJs~`?OKeDi{KSwxU3HFU8lSh?DHPNdw zAJXRc6u#&?L~s^ft~5QWvG-@ZH?41cgZHa|s}+@V!5+HgeE>mBzTzD4Uh6=@#Yxmb zODLgSI4V-&0SDq%@{R)TqUeqCs+kugZDV{1r{%?_X%_CsFnV2c!6(#-2p0wwvkZ|zQoZ~Bx{{Y=Gov7? z{y7p8c|?zykaH{yosch4>d|G|n(tiNR+V)vEN9kf2=|(ZJM4y$fMCpCn-{uMF9UnA zW;6JIS=f$1p&IcLNN1GQ&j!(@6ApA);uX~1n8J=&P;e-uAw;Lll!5?*bhUwV0M>kt zU7Z{g`d=WWO*$e&q|W!2rDh^%cxgw$vMlqy(v`nwOS1mR&PUBpSl&+7K6(ys{9!%W z*#{cSOB;OOx^5~@pGl*N=#^6@nB-Br;JH#H-*h`J>mGKPsmMweH}kzUZ{f2=sCD)E zY23Q`?!d}iy5^f)9fhO%BN1EhgQdT#xmxeV*tw_mEcGn899ZzHDN~M?x)wIccivRb zp!rW@0=(YM{KU_k*WucdJBbLvYdJI&K+RHJ_=cg3OH0%b%MMyG+B$Qi+q zU(xGuU(!d-&dT^JYC6S>21L=qMOqC)U>soPzJ6IUihg5M2-HtwjrIiJd|vXxh-biR^5VA|wOV1)E>4Q0r-Rh_v$l}a_EgAPL>-mR zW6roPV^W%>uLWM6k&cEkrX55%uhas+_sO{Hr-(!Fx{hT%Vl%0}Od$(8${2|uNvAE( z`q+JGqGjZY8cy0P!}3`Vbbl=#9Q_{AAz8z9<%2=jgzZNMaszjr18o@5`Gz8MeDGV7 z0Ainzub7fdIw?426MUyN?*Ng$HT7VeZYq_lEy5-o@ni?UW0Z>E%{!N(dK`dYSjJfv)}V_6_z-66h^Yi*Dtf&Ye*DU?d2SOFYLG54 z{<_3?R?taZ`=M0b(&%lAHSwEr6r5_n&U+V;*0ettDH;Vh09^P$Pm0eoAV2F&Y{-u4 z-qQ&=c0(UzSgy{hh-P0oooj1zv@iw{=KfP%Fy=HDbd;^wyNZ9(=V-k+?ln*2agY2T$p+>kJrYUdK+}?QI{uEitqVKJ+4cndx&_F&2t$fw}NR< zR{o*DXF?KowN4-Z5Q3jEArDaE@x@+8va0H~Kn8sCK@gPp)}HCoYbM#JbYa_JOtrc< zCNuJ~dwdU>0-kh!&Cwf^awJA%ssjF;0dHZaHvtvlE$nBpYmJx9iMcO8i%w9+Jmo04 zzKaX)7_ElIHhk$-i9{aV)*pMg#Z94g(Y4?xy$Qu1;cH<3R+~E$7bB)`J;al{3@=*R z8|N-N0mLPHKSgN&;_591bW47!!Ob~k6SBWae^*5H*CMQu^k@Vl%^G6|IhNW|RdeFq zNPspKo05ts5kBtO`D3_yVkUiq{{!*3DEFp^9K(zqztANK7^IQ^XX1e4?EjDTT9w_u0SPlUA2r&3ZfZ>T zhD?!)5^xO*2@xZEGZZ9=4AYci#!=fC{GM@*3W|3y&W&f=*X*(Mb5L>0_8gV%?wW(w z(m@x~R&@{m=<6uy$wY{PhDdi4fWr3?7DLOE7bTF(b=W>C+$1 zzVS7hHqL zQvj)*gsZs3(hafrI%dm?EcZ`apO(U6d)eZG7ZVBtGNpO zY&%at?i1zkJB}_b@emyif!CFB2QD`JqpiD@#97#}4N_UyfiuD@$M_RPEP1V@?DG4I z%^ABdwsKq=rrk^b7= z(-Ol>8Jj^l3xHXORQ#vF8_3duRWbr4MHj#I=KHmQz9mBa#W&5O{C$;n6)_2bW9~aR zz`#&>&z~`2Z)|8um4K*>s_|<*Y06s7WpiYr#{DRO?Y3e0qc1BpSXk>l0~r|!Izt~k z(^~wc0Y3P?`~XBRiNVy6{lu(BwLHqB6CeW;@bzG2S<+gngOoJE6=3(fl*x|xIYZ_F zp-8*d9n~$EjT1`#P`rx|BX=Z0h!p2)x1|( z0CvlOK_tD9^n`7G2Hd*bm9@D6U7=+~LsuVIdtC&>WM^aC>pXA_i|%5rw*2TW+li|L zzP2tJapbw8YbWGW{AHA9{qnST7NBt0J?9*$pHcN(>rPJaz`}=MX%+c7*DMQ3d7Q_j zU9Bkyp>gJ1`RP+KcV*)2#L(w*f)+gvcr~Y;Qgg>qLddUM3$PPCYuE9P=48LR`7}6w zU1fl()+5YtDO+Naf0V4nTk@Ap?_N^eTfc@Hi{s|rRUKIRZY^ciF3roT(XQ4 zG(>W@VbFM7b`OyI^Xjhtq^oK=2k?29)!pum#6VhLb8b94p8mR_ zt?o~Xy68m4)@sG#&I1AF{BF`<7a*{B{ts4E-*(qg^s-FwuG-m0O!Xt}k3o>TS7>PQ1T2!f6fz^%0*EfdDBq&yH>76;uxZNvVu}%DUBVXEMMS9y`Cwh!_7tT8nNNm>-#Y(`P0oQ1Vc5EU z^-H)0XrX$iQ=2X?1Gh)mdyemn(0Vzp9()UH)061f zKbXaAtI$`1!!Z+%EqYj3U3TXKtzw+)e#dGb?^2|3){}HB_l0&p;UIDU8&_9Ddl+s~ z_6%y8Q0=*p6PpsASS1ktch0t?nZ4LV=ruDD?rA~YY19o%SI#8G1NxSvO=+Ss!bO65 znm|i9m=NVD#SV%J&@jy1)xQqwqh63=iXU{JQ#IN;sw(Q>lAo3NEveqNZ z`2QV~dyf%eW{je2ml3wF)~ecdc)OKa^3dT?LS49)(1Uq6s$*pc@8p?%fsg zirr&Kz$ibwQo76i=iZQDsj;nkPM|%tV?J}vb$mk(m`(Fy^1mKcP`2UH$-tE>57|pX zcO9y(Dj3>ofmkRZkC52R=Kt_h8D0vNfUC5>rHHMdC&yrX;Aq*7(j3EBc}e?+tKinF$>6^1p&b2gkA{MCn`IA) zyK1f`J7H6n&pY*=$dj@0c!7!}>Z&*E2O$2fu&D?3@ET$jB9V~EQMIuRnJD?^n{I{$ z-;X@*rJWlgEi^xH`S}7y zkeIo_0N{NY9?!)?>QeJZ?hlo|X}-;Dgfger^n~qey+*#Ki&SL$KgM#Rt2>~)+$Jvv z;OMVxSOf}%5-9u%zs~%W+zm}^73Dr4SCRe|DqYRy z*WA~)V59DXG=#aQ?z-eLNrJhWz#7yz@^}!F6_OFyOf1~Y%&Ax_`@@zu6r5UGG*@z# z<0Gt-?Ud(w$Ur8{Fvy^8c^x@1tf85(Qo3II;}1d)Z0D8)hFz)FCJcyen4Nx7bFT>W z$^H=Z7$P?tSRtDfo%Y%nrT`xUz~=p$Pao{o0eGmGz0wzy(7N6DJiL=kKT5P3IpL6m z5>@)DIUuvXy^}>2Rjq!dAvZd$sk;In4#gk9xC^%l`qBh=&k3}rzzuXgrF@nT3S9_f z%n#=wm-yj&Dzo6qieEb?HYuE$eKA+P>GG%Hto;NZf%!~l>ZyL)fRm< zQxm~3$Meqyi6aA%O+65f^~!sH>4d9?>sC@0d@xUQJE(&`N8oT3n^kg~vBywGjD0++ z(=LqIq?|q8Iww_au!JvyJ-tFiwX5S%xND`i|Hn3Ck{>H*X0${~GjUF5ELt$uh=mY> zjAm=f?hzwz1)9_FyPM7sZmpE>I<&&T8fCisS>mUHg?^2!8J}LdUYRfjAg=+XnX%i! zx=d=XZtv>7H;Z$yTQ|k_i&Cx`2!#fmZcx!JLc!n^nk*O)owtq@2nL^9@6&4MflLL* zt2*=<5P{Cpd(L8x#gdeX1JXkw0|_eD^IJdgd!d&C3Z{V`QgYmh?Z5WGkd*YnK64bjj@`Z)|`l^K2qkF#gzNl{TGK z*T<2=wZXm`d9E%nUB2wy3Rp&v0#`Q_Ybq!MY3rQHgDkXlPB+XoB|Y-lH=zgLY%q^> z)lZ12jV8)(O3D=y*OfkRyxICF)Zs7j=|KAx82Rg=>D|!|VSkcTJ`=}FU*hfVRmGd! z-jPpt0Tu8dFqkK=QgO~YJYc1=MV1)Hfi*riN@b4u*|r-VX4*aPWofGVK}Oz!ybZN! zzv5;f2tCXi=P}jF>JaDnqLX5+vLdGGlpY73?bQkuswM(|N9(hFo7yl2b)-+EntGB` z=kH&{`_?N4T5TwjXS}QMcS)ol_gYfpuWXb*cNL8ha!?fs zUd=0FqG-^0Rm!gQfm_5KIt6{OS|(s8PK#WzFHY!e^=O&n@hp;r;^ab{BtZBYPA&Xr z-WzD(oOvmqVK|Tj##t8Vv8o5Vx|7li3S_m1_+f1+zTV&n9DH@hOvFt?&B0kSy~V_t zEdjJFYGnj|P!3Hp=qVMOvHIHn5P85ataX8Mx4<606Faz=2qppB6iZ`pl!JR>rU0QX z?n|a!3wc{o(#xTP@k!g22{f#bGTa((a)p@ngXh93^)=!?T;@y}0a2p5nlYSR;VX*S z>%IG{SrvLEbdKz%#?hgu1~52|tO2kgkRvzD;Wz#SjrM2XgGz8)-38}!w%7J;FzUoX zAv0ASaO^YjZ~QDtKw~kImm|0&VC1t{jJ9)6GO5)diK}Iyz||7Kxy-91r-s2G{Dyj);d zkO?uRc=VLo$tRwu|&-rDjVB|gLT8dojD zWWdM{mFwX*JX3YxaD835GZiMRTJBh11AaAQJ*MZiy;^n@YX`z)2GL$&gNc=`V0ojZ zL_i&x^w-ZZyseu#ijc765pf1yIs%sC%_H_Ux~+TXm$Cp`?wWF1*h;7xjmFNFzQ}gb zeKB3{DmeEuMj8H#dN{)6st*Q9{;7SIdux$!oKTFE+O*~@)xW@{BEoX4ymIy98=gwB z=~YZ{^W1+b%gId4A9QI0KW+BEa_>*!m_Oa$(>oq7s^R{_ksZJ!e8+gJ9xz~rmR z>C3N7g(2Mcol9_;aB0oDuUhW8*}t%wdJz-RQQamFjp ztI!XHW~OZl=L}nHSgw}&$|~YIkP_-+1-!|9o(&1WbW?(rujDnpF!T;VT!-w zL%9kFVyRt8QZpX_HihDaYrD;S6B!e*{;JG%xVMrMFUlLuC%YB6E|kUT-KmaJ2!iHK z-qct{(O%c<0GN}vC(T{2>BYD?YXhtVm@K}7kRaQws4#vWwB-%1&dyvcY| zHGVbS?zm<9n?It29Ojz(e0HD-G~BKYo;WcTfgbx=+vI8s7TU+;9mqB;`D7#I=?=T? zpH}~8$ItuhklcIm;~X?YuepZnL%7R|b}1C(si2P70Cu2lr97C&WZpKtCgvRJkLp2| zIlN`lGEbkdI!$1(!9uNY03G`X5`t>D6cVM;!O-yJb1|AcBhFj_mxGT8%Y~--u2IXH z(cX!n3BBt*fUZk=K3Hb0+m}dAxd&VXqDasJH2>A|OnetKY44Hqio-5KHELRXaA$Ye zPgiIv#(=_BU(>`%4ftKe92;WrnH4o1k_Bb#`*?YFGy*{rH0fyc_|hkC={)jieAD~j zHC_m=;fg|WC&O1^IAa8Z%Ohz;I*lYbOTx;VGgFH>b?Mbu%*?G=%PgwO=zxATY3yZm z9Q0O@$KQ%3OVH<6R{nK!-ap@|u2nFf{`R@iBLch5g9mkcnKx%tf$!Oz_@r=gl5Z6f zK}d1l`lE_P-6JzqS0bmoW@AHNTTo;H4#71SM?{{$2jx-9j=woHF!-Yx5sxLNaQBBZ z@?9t&Ir78{qON$03bUF8MIR5Zt_OZp-^QSHQRy!E4OOV7)GUiuoz#z%ph!DB*hTV* zFX*YSlPG9`x;CTCii#5OchBpkZ>&wIu2Fek)*XGTWL<_fzYp!|E4!@I>*&X9Go?S6 zTuxu8df_wm7UVfR{1pwtg>bB$>iUO!ZDXqM&!{CdxsUGDLms$|gmxgVb?7SV9(PAH z%%S>MA)CY+{=9o$KFAo%f1 zHb^4&QXjZUf-I)fhOfw?!a!soR7lhmIF8d>+onGjeV{meHO>SN z(9ekl>MW2y&O7-0LW9Nov29c&SO;pr^(sW$L)&SEyZ{@+lQ%l20W3HkW!V!4wj9|2 zK)c;k6$;esYN#128suhv#W z(uB>}yFN=AwnDG_!(CVVCrw?6p<{o0Egeqqw!K@D+jERBnUaw=1if zhhiCv7rtgq+K7+0>KD=X>_0fyL_m5{q6`mj8`COl1E@b8M3<4CLOV|pB$-?yLI)$k z#xffbuL3BZN;`cX1A^@6>Y`qnJsIY%)FbE!bvbY@^m7Esd5M(w*J8#^4@^!deqPZx zyx{_Mb94p2f2vl=rMq6{?3<^W@9y@GO^Bez`;?;49O_NKDz zKO@XqDg*v%HOQi3S|ClPmA|iaIu=-Y`Dk8)sen}kvH)eY;U4_f#}vTo@HVGXXx?>( zXwi;$eB_+|5VUDwzu4bbZ<24h1^ba#P2)8RI4xLMX0sWv+iJ)!s;qS6%NH$MXy#!S z>jVrv*On7ljS4gLDi8j8uj)aq&e;3i{$cTRVJMuK_cJr}gJ)BVW~Inb^zpc_yHedv zjbj};<=caEY;vJG`yEu&!7a7xeRn-DF3{>AP*WBu>^2I86`K(-osF@}o!MOyTZ9;* zTqdnn&;T^@yZlPnd%-1~P_2=a*RO{Z$fK6mZ`%-pK?H*tf%K4GcFGPCx<2kbU^ruL zV=VJ&|35lu2Cz=GvMs4<$U$2Kg#F144GwfP-s<+H*YtA%Od8W zcst=Z9v$EM$~WJA%W<0CsqzYC>Yh$F8-p~2*XS54`E!|41XCWJN>GmT&Ca9jpc$tk zUA{UQBF@GX2t=c&vOVZ%;uCetB%ipr=3AUplC@JPXHJ46p`$20jqb8-itH4k!H+)! zP$0C8V*i7i1&Bf`B^Y?gh!B5r6&Wa})*{s^GStXJ9D@&0WrMXu8C77p&tcIo7FZ%S z&isaI=soYS%_PAWTUv6!I6(1GDh5+P3DtF;KCyJiJCas)w+0+6RstARJycWl<}Hrz zg{T_3Hl2&zB0)5)GYCc3diTe|*TY7QrqA7ZFw2YDh!-;**02bbphrG`NSP^YPvN5y zb>)kdOi4Q8WFSI6<(MOlo@_q#Wj2f^YE?#_(^E2~tF=%5aAkx0nl%^mm;b4g?LkWHgy?ZYe zw{pVDQO&qQl)?AXxiiN1*1oNI-!b-hXsRbeW%~T{ba!drnH`;T2AZ$(9fxS&&`vm# zX*j9%<_Fb8%cxYNckQYj#o{ zI>z|wGepw~KA7db6x%X>QY5Pa#1XIoWRTRI&=x5ft9Rj54T9{~ct|3TdNMeMp)QDqc6Lm0 zLn)aQwvg1XNoNGh#m+*JiMDh1NE1_G4&rN6Nn!wm2f!K!Of~;8u1IU-+-ttAz)1@T zJvA`Kt2@FGTiG%`gBJUf^y58w?~Py3w)bV_bf{$z$k3eeP@vVeW}0K)E15z`D6`Q{ z(2Z+UL@!m+!ml+Qxtt2L@6Qik0fRr<*7On^pXWpHusY`u49f4$J9 z%o+z)*OHJ?Gh`>+OL8ODuSA&YLY$YEd{+64N0VC{Z4?T!iWzdQ@4UL1AudP3yhqL0 zpMq#E5kfD+he`|MLg=OpibrEoO0m85rR@sD};kM+k-HKtDy-HOW@YlkW% z;_)jzAzfqH*OkN&K|*jGlDrnDkVA}^zfZ=?T($A^E=mn6yo~6f{xRG}Wa@Myc1K}x zd};sA`cRN5mR&<%S?F(Kn^N7H21_V>p%vi4trJZ!j}0w~-2=|~G67ww%djzVkKgTj z^6@qoy}=M9=lxIctZ_LX`m*r)ZFjf2*Pd4Ybr_-zK0$@(^)0dYUS|1nTZ%cGY%cfA zvK#=yGbp!sUfY-QZ=QmBd!SU=t!=$$}@nii)MKGuiai(#%x z(tmYN1sJkrv~?v0o@nI_;u7jDbsINWQjnr@Kln+it%gLTQV@ zvoszrfAS7u0=C_{T+|=FE%bvD>N*YX46m-;Ybvc?ZVIQtrh7Wx80SR~5UVM6@~2gy z=r0r9J@8}?znUW5;pNhNCQx8#@uacm0-_s9+*tINqizC{$fqs#@?K#l+-9}=UQhjE z*lOy&#~fH$c`@d?2P5kLDrDNEPK*OR_x z8sOQI#23R)T8EE*SfJc3xZNJgsx*%O8PW@!RWSBi*th8@*z89PU zc_G?lmYm&6_0&mvySUCZJ`oBbdAam{BB2ZJ@&Fla60HzHf@n=d zEPasfguA{bF>1c9_{FhQTU~hu#=FXjtA@Jme&S``XAWZpHV+JJZ0#3swl$%_O~WKd z9TTcS$8#w{@_=vsQDRPex+q$tkdIOmUfS^)ESMMa5al`#w~6(u0`)W7OjjF+L2oGo z;YAYxnPC(`cf+WY8JW`pn-zS*2Hec5<`A#P9Ss;jxyt``sBppe>BruGQ}(%{Cf}=r zc*$W>DG{!? z9~YbL@HFqJm=iT2>Kt6^f$a?BCZ@x(!9{QZFnTH)#ldo-{7SF=y` z0C0~IH=d|!H_Y#*5ljaVg4h~>`EQbahQKSI=pO}0m!c5Hsq?V``jsT4#G|0=7CFS` zd|I?I)NI}*WSU&UPH*H)>_;*-lS@M*3^u36dHE+FHbikUJEMPPudzjK9528bab)Xi z2}Q@`1>Jl3@b#}?B0+1%1SKcK$u-Iwy@$O{(Cn^wD6o18WK1<=T8!?b4Q>83eGAua zoEc7G-g?4=s$=<0)Nxcu?-n+UAF2eT4-wC)pZSRy;v|wwbi$yH!{8Bao$!d4PNnmkq6O_vV$SB^R>XMyLAa#E0F923@O_eTB`UYbH&N2xTZh&fFGieEn;ZMO6MLV^( zC?Jh9Z!o$~!rlZN!;zReZmE>>ekF-8PGZYWA?IWm4Nq6}DQ=Ab)hHU0A_fxaZ=ST}@i(k*(&tIpS}dI^45REB{);dBuJDvU^l zU63QTIjXdlJgZx3lHeiFs(k@2Z}6fmN>^#nK-RYNCs#?dhvJUPbCL=@?(84;b;_gG z)xcVit=OrV)F=k0Ec!RQDN?B&>Q$osTu#$`)BtX9v)RDQEBw3|QiK(l4i_s@N%-A; zkba*7xu6z(W?UUg2ez-y9JPN?bZ}N>fK%#A8N{fO)9unbtuGR);o=a;T^|(CSB+dp zLmwKSDwYV01YSn?F#`tbQlzNj7*P63%Ylo7RPz=K!^2p(QoXc;Zjo~=1XbO=AAlmh zT-_Bri#yuC3LSeZ4;U_My5r!a0ha736v?aG=F`_w>RXEa*6e>2bO zM)&<7ru-wd#Go>eA!uuOQiTr{N-VNV??qKiGyRJiRPd}0HC>+!(86ksdByXO{4(T|ijUwsPrRcyRG$(1438Q_DPb`OR-hg`|WD9vs^|(t&=l%esOF&u184%~2_9LH_m#0-_o5M9IyS^b%N`S6N zQ};mkMtF2AdIwF`p78udSpZpdBPW*Y4%RmBWs3Tu$uwt9`4PN_5TOPQBhLxJ(L3j^ zC7=&P8s*yA*Z^%&?IYM%oqTgJP$jsKh@7+?;(m(8-ZU!-vz6B*`_e{O9qr6d?B=sK z1fJqVve22eNdGyYCTqhEeQO!Cfz}Sp543fWw*{{zEn1*B(s7)7%@9)$N67z=;|(dy z*eh?Aa2;+a*E9Nc+JoovFrZZ=v zsye1aY7NM>E>2zibnG4)d0m9|{Y)ttg+6@-wOs-fH`0d&AQ}A@UFx2az3$ z=EwqV%nN2_wC5@K?K1aUm#cmK3DHL!KiPo^sC?B?#s0FkBffoy6&NM9dbf^rQ!uTS zz~m6wCB^I|Ng1h2;p9BN+3@3YsT4A0bk*{nv-5LVFE;H6o6YVdLn@vJx^GzR=PF7p zO^r*%^OUH^^F`Czzy^0%r!$nlHU9%u1vXeHavVC3<+~gq17w4T)_fqJY4otDGI57Y zp&x!BB-6|M3g-ndxZI_1n4Yg@*|MpETx@=u5YwEGm0oyH;eX>cx-rNIo($Xd4Wef< z>J}+N)F@9knh0r}&1ggKZ{l#JgRgx_4#PoGhm(qt_6QLJeyvdbnJ~N@Sc|`0 z2j{JzcT6Y30wQdNO2el;Ueo8}))+Ow2X7#Qj_YPRT-~f_IlfIFKHxBmx25xOA@-*j zd`5Jqb#jCJM;PgHe!jdNKlAzo!lbi$qp_gtLVaTiaACWww5Z_!If7jp=LppOit*S> zrJ@Wn&g|I0))^mQmYyigyXuPBz~PX_up=O}kX)35N8JYpj0-1*O{ifWf15T2m;Z>*yL}a47&i7p+tD)&5bb(sAs&ia zG>ajOJ*7W?!^LXOBnE?dVUE2N_3H#YMQ`X6kU<6f0ZczCt>m=$Knw5o*M5WE?P$(* zfWb?9;Nby|Q1vg(s1m14S1nK1-_RPJk#D@9zh9>J{usVSmI1?RL&eAe!AWdc9Bo#p z9_SdiZZGNhKMNc&*BQz^Y^Ox&5*fmQ8pIh)R*CSEKFAeCRwvx9=F@dbqdzp!7E+8e z)i=ve1PrawV}*a40kH;tdJf_J0OJ9r4}Q6U0KVDVbc2kxRz0?%ZeD{bkEWOpBUn3v zEAT_i<7Pu8%lQ7)rO#E@8(_(LdSD?V>n2jw0#Sj;lfrHkV4qE1bzDY`+p?E?umZ4G zy|yc!fb{V{i0pKq_3?m=-}4$U+YMs-e8?)?Z?;IlDh{Z_ScYJfIFu|4fbvnEA(QP@ zn$&&nEXF&z^=;D+u?Cq&*qr|?nSOp9$G2$v*A~gfsLe?UvUjGw^42gevZ=0yOiZfx zPKU9(o}gQNCagaTF*4^(a#&{2@2?sk%RnFZfg)Qi+KT0l+L8 z7fuDu!*7bs@xRL2bzNPzm|otP5ZOU6_2~SB$X=rttx7P>WO__w+T>bSkB#rpL{$c3cSv7?)e-;S-Yml{~8#wi@ZW<>U>6>ah9w;ySWO5V{s z+->2NHo-35ABWH#az$ik+ifX(y;-&B1`GD3Zl-vPE}Rz<(*^A?I->1~03FeE2Yhlw z5=%MI$hT+Oz=%z=n!uCQ(4d|yQ=%IpZC{{#D>AWeWy{JiH|Z(|Sl)nZn-aeGq*cjY z4u#Z2o*zROs`LHHv~f=zBZ)=ipy_d*Ry^UkW(H7X>ZPbpzLYS^Gx^=IAjGSP{}U%C zDxe21_ATJa8MZ!|B9#N5RxSa83MQKaGR1|MFH03hiig4o+2zjfabUBLlICcyPz@;* zY1pIVX#iP-aycW|r&tvtUxyp7s+$I^PQ{~5gkr^L{U4R7uC`T-kqEH7SOF=kh~>e+ z%M;1u`O;!^%O(X5wu1X9TpXuZZ=6hx-OBUDM6G2~@ekObP&EL@@Drqx2V~S8Hm%}D z!=eprE|$Plqkcw8O>oF%9)2JO7Os(pe_bQ`=@v(-4(mAlNA-6Ia3+yzm&Cd|J&b_} zI1s1`$B##dfgKkJX7TTlXGz0+9`*7=GnElQ58A~*m@hjfy2&d74`Vw^suO%4^tQ0+80*sh2d z1~`x1gC4F}l3hAfS-|$YSlQvHd>W_u-r^KtyT?(S6$M8`)epBs8M@#J%X|;QQpdMx zs%`0SRFra=B72sTZu;1iQVV=s?l*Pi0Rmpj^}{-`;5Y0Xpz7Sg=ahYqLi*+X{Z-?4 z{dgQdsU;f)9r_A%i2kp9p0Q1+_3?-PgeKSmG3a&E}h;&avAhp zhuZ5p6F?S0nLC|TeLx3-45h=b@Q=|I%)Y!bm${%ok1sIHz6-lBCojF%f$bkI&gBgZIkiM=d+0I>a4nNsh{}k4H)y%J=_M-!D9!Zo8(`L- z@&&903yR3&0GI_*Qm#HD9M6dEOvC7f5ik2YPZ)rEqyA#C&wR~GG#=m7;Yn zLh+gj?9)xIDhcb=IuZJlwV_D%GiqCIf=Tn%|Bd9#=xz^_utF$_6~Bc6Zwn0mVcIdV zFLu`@_~E|>W#O!`gxmuT??!`~4r1C>v~N*-ZsFc}qv9<(e^5hNkv2)BNhu4t!=RmH`afXmD0sA za~wah1ni}_{aaTPf(#g_20>k*!p<+{`E%e3O?7OoB%TRyws*dPpVs#>(!BY-!5g^( zmxF?dW`{jy+t*XK4;79S&g^;$m9aO-Genups(@k0u+dhCQTUxybhn1#ZL>MQLIs<6 zMB%zc1}jk1gn9>AW&D{u>x${8_vi4_aCAlq z3}L_f%9l;w6p$sA>E}lLw49W7Bnwg)NtIq#D~8`t0v;E7`uG(@Wx))cO2=KMt4QMe zS)t@7++P9W%~-2bH&RXc_ufQ0RO2alJQu)jefDeISECQVGo^NUI~(()g9<#2 z{{aREnGqeyz1qHI7n41n1tfcK_9wPJ!R>PXI ze2LJOY;I%>cav=Rvg>ihjCn7N=CNsN>i5085}f;$6iqn3m&X;>9Qcb5SsrxbcTMp> z!e2@K#i>3Q^jty{JT(Pjoy(;~b*m-GZ>O^rf5y+3E8+{gE^v1nI~Iat7g?V>t?bm0 z|6-if&3UinV9IbDV2#aN!O>CU0h5DFiDC8NCu5dnIR zQMzK+YY;_!(V%N~znJ!6TD;n#vM$wC=VLIC$udq}&CUVS!c^A~9poeNi)Ub+C3G4% zclP_2_xLBxIpwqT+7bK~@c)8~dBszu5NBdTk)#ai?(9gdLJELD7mEL7pOXI%Z3Et< zMmZmIR85cwp__e9T4u94p)%@e&CCzQmY*%Oj)VL;8bWuZu%y$8`B;ZBZ<0Vq#} z8IK$UKCzgn>!{*|;QMZ?KDWi+^tRcV3ZNkr+<{je5dV88XJ1R@@mCe;M%4a>-L+qVGmna26rYNzXo52LwXI7Kd3*BRElEq0EW67w5`xpbb zDZ@LbTc0) zFw&r-(}lT>T<*%%MEn<-%6-^EQ~FF07@PPBroM6NVe{!ojev_wNeC_yb+?wl$g6zT z^gIKl(hcc4_HOyR2Kjuo1aDZu*stYCrYZuz3F`5}adw70fUn6jREaI3AmVHu3lm-GFU zhR+5zQv*|@ms8fontnSaw%w%^`7| z6^99Xw&U{wNNLj{nJSfL;?8+^i&TZVNTwavw;sQ3TGji_pe+iU2Am*MgmIk`@C

    CTTw4Yk+#nuo-Yr6C!dBhPcJ?26F9 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̼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�h@BdOZyxA>2q$-hu_#RCOc!ayn-=TQl(t%-G<`E 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

    W_DHn;xw5xP-R?~OZN9F$!|N3)4{ki()H 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

    rx~7+q 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


    ^(#lqiD+-W(q3 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

    pW;mIq6UR$fT*ZDz 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 @sYj*(q=UFGENc= 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�B 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ⅅ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%0Atozo? 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�o6 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

    sW3gHLc;!=LoIP+lM{d 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 z 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

    7bo2N3DShwWuM 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"N1kYEG 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

    (9&JmMXA~iQi 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 literal 0 HcmV?d00001 diff --git a/tests/system/conftest.py b/tests/system/conftest.py index 588f66f79..5d4481a3b 100644 --- a/tests/system/conftest.py +++ b/tests/system/conftest.py @@ -30,6 +30,7 @@ ("logo", "CloudPlatform_128px_Retina.png"), ("big", "five-point-one-mb-file.zip"), ("simple", "simple.txt"), + ("big_9MiB", "random_9_MiB_file"), ] _file_data = { key: {"path": os.path.join(data_dirname, file_name)} diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index a421fb2e4..12ee4c6db 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -39,6 +39,40 @@ def _check_blob_hash(blob, info): assert md5_hash == info["hash"] +def test_large_file_write_from_stream_w_user_provided_checksum( + shared_bucket, + blobs_to_delete, + file_data, + service_account, +): + blob = shared_bucket.blob( + f"LargeFile{uuid.uuid4().hex}", crc32c_checksum="20tD7w==" + ) + + info = file_data["big_9MiB"] + with open(info["path"], "rb") as file_obj: + blob.upload_from_file(file_obj) + blobs_to_delete.append(blob) + + +def test_large_file_write_from_stream_w_user_provided_wrong_checksum( + shared_bucket, + blobs_to_delete, + file_data, + service_account, +): + blob = shared_bucket.blob( + f"LargeFile{uuid.uuid4().hex}", crc32c_checksum="A0tD7w==" + ) + + info = file_data["big_9MiB"] + with pytest.raises(exceptions.BadRequest) as excep_info: + with open(info["path"], "rb") as file_obj: + blob.upload_from_file(file_obj) + blobs_to_delete.append(blob) + assert excep_info.value.code == 400 + + def test_large_file_write_from_stream( shared_bucket, blobs_to_delete, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index b3e7ec649..20f7d730e 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -2762,12 +2762,21 @@ def _initiate_resumable_helper( metadata=None, mtls=False, retry=None, + crc32c_checksum=None, ): from google.cloud.storage._media.requests import ResumableUpload from google.cloud.storage.blob import _DEFAULT_CHUNKSIZE bucket = _Bucket(name="whammy", user_project=user_project) - blob = self._make_one("blob-name", bucket=bucket, kms_key_name=kms_key_name) + if crc32c_checksum is None: + blob = self._make_one("blob-name", bucket=bucket, kms_key_name=kms_key_name) + else: + blob = self._make_one( + "blob-name", + bucket=bucket, + kms_key_name=kms_key_name, + crc32c_checksum=crc32c_checksum, + ) if metadata: self.assertIsNone(blob.metadata) blob._properties["metadata"] = metadata @@ -2919,6 +2928,10 @@ def _initiate_resumable_helper( else: # Check the mocks. blob._get_writable_metadata.assert_called_once_with() + + if "crc32c" in blob._properties: + object_metadata["crc32c"] = blob._properties["crc32c"] + payload = json.dumps(object_metadata).encode("utf-8") with patch.object( @@ -2945,6 +2958,17 @@ def _initiate_resumable_helper( def test__initiate_resumable_upload_with_metadata(self): self._initiate_resumable_helper(metadata={"test": "test"}) + def test__initiate_resumable_upload_with_user_provided_checksum(self): + self._initiate_resumable_helper( + crc32c_checksum="this-is-a-fake-checksum-for-unit-tests", + ) + + def test__initiate_resumable_upload_w_metadata_and_user_provided_checksum(self): + self._initiate_resumable_helper( + crc32c_checksum="test-checksum", + metadata={"my-fav-key": "my-fav-value"}, + ) + def test__initiate_resumable_upload_with_custom_timeout(self): self._initiate_resumable_helper(timeout=9.58) From 2ad77c7d949e84c515c051a0fd4b37b822788dd8 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 22 Aug 2025 16:00:26 +0530 Subject: [PATCH 367/509] Fix: send part's checksum for XML MPU part upload (#1529) * For XML MPU part upload checksum of the part should be sent to the server using `x-goog-hash` header . [Docs](https://cloud.google.com/storage/docs/xml-api/put-object-multipart#request_headers) * The server will throw `400 InvalidDigest/BadDigest/CrcMismatch` in difference scenarios; but all of them essentially mean the same - "The checksum provided by user didn't match the one calculated by us" --- google/cloud/storage/_media/_upload.py | 23 +++++++ .../cloud/storage/_media/requests/upload.py | 9 +++ .../unit/requests/test_upload.py | 65 +++++++++++++++++++ tests/resumable_media/unit/test__upload.py | 31 ++++++++- 4 files changed, 125 insertions(+), 3 deletions(-) diff --git a/google/cloud/storage/_media/_upload.py b/google/cloud/storage/_media/_upload.py index e656d3e5c..765716882 100644 --- a/google/cloud/storage/_media/_upload.py +++ b/google/cloud/storage/_media/_upload.py @@ -1387,6 +1387,29 @@ def _process_upload_response(self, response): .. _sans-I/O: https://sans-io.readthedocs.io/ """ + # Data corruption errors shouldn't be considered as invalid responses, + # So we handle them earlier than call to `_helpers.require_status_code`. + # If the response is 400, we check for data corruption errors. + if response.status_code == 400: + root = ElementTree.fromstring(response.text) + error_code = root.find("Code").text + error_message = root.find("Message").text + error_details = root.find("Details").text + if error_code in ["InvalidDigest", "BadDigest", "CrcMismatch"]: + raise DataCorruption( + response, + ( + "Checksum mismatch: checksum calculated by client and" + " server did not match. Error code: {error_code}," + " Error message: {error_message}," + " Error details: {error_details}" + ).format( + error_code=error_code, + error_message=error_message, + error_details=error_details, + ), + ) + _helpers.require_status_code( response, (http.client.OK,), diff --git a/google/cloud/storage/_media/requests/upload.py b/google/cloud/storage/_media/requests/upload.py index 75d4c53da..cb9653fb3 100644 --- a/google/cloud/storage/_media/requests/upload.py +++ b/google/cloud/storage/_media/requests/upload.py @@ -21,6 +21,7 @@ from google.cloud.storage._media import _upload from google.cloud.storage._media.requests import _request_helpers +from google.cloud.storage._media import _helpers class SimpleUpload(_request_helpers.RequestsMixin, _upload.SimpleUpload): @@ -757,6 +758,14 @@ def upload( ~requests.Response: The HTTP response returned by ``transport``. """ method, url, payload, headers = self._prepare_upload_request() + if self._checksum_object is not None: + checksum_digest_in_base64 = _helpers.prepare_checksum_digest( + self._checksum_object.digest() + ) + if self._checksum_type == "crc32c": + headers["X-Goog-Hash"] = f"crc32c={checksum_digest_in_base64}" + elif self._checksum_type == "md5": + headers["X-Goog-Hash"] = f"md5={checksum_digest_in_base64}" # Wrap the request business logic in a function to be retried. def retriable_request(): diff --git a/tests/resumable_media/unit/requests/test_upload.py b/tests/resumable_media/unit/requests/test_upload.py index 6868cc7b8..07b4cebd8 100644 --- a/tests/resumable_media/unit/requests/test_upload.py +++ b/tests/resumable_media/unit/requests/test_upload.py @@ -42,6 +42,11 @@ UPLOAD_ID = "VXBsb2FkIElEIGZvciBlbHZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZA" PARTS = {1: "39a59594290b0f9a30662a56d695b71d", 2: "00000000290b0f9a30662a56d695b71d"} FILE_DATA = b"testdata" * 128 +_HASH_HEADER = "x-goog-hash" +CRC32C_HASH_OF_FIRST_PART = "8hVqVQ==" +MD5_HASH_OF_FIRST_PART = "gfVZ4+0LdooJwGAkxLrCcg==" +DEFAULT_CONNECT_TIMEOUT = 61 +DEFAULT_READ_TIMEOUT = 60 @pytest.fixture(scope="session") @@ -402,6 +407,66 @@ def test_mpu_part(filename): assert part.etag == PARTS[1] +def test_mpu_part_with_md5_enabled(filename): + part = upload_mod.XMLMPUPart( + EXAMPLE_XML_UPLOAD_URL, + UPLOAD_ID, + filename, + start=0, + end=128, + part_number=1, + checksum="md5", + ) + + transport = mock.Mock(spec=["request"]) + transport.request.return_value = _make_response( + headers={"etag": PARTS[1], _HASH_HEADER: f"md5={MD5_HASH_OF_FIRST_PART}"} + ) + + part.upload(transport) + + transport.request.assert_called_once_with( + "PUT", + f"{part.upload_url}?partNumber={part.part_number}&uploadId={UPLOAD_ID}", + data=FILE_DATA[part.start : part.end], + headers={"X-Goog-Hash": f"md5={MD5_HASH_OF_FIRST_PART}"}, + timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT), + ) + + assert part.finished + assert part.etag == PARTS[1] + + +def test_mpu_part_with_crc32c_enabled(filename): + part = upload_mod.XMLMPUPart( + EXAMPLE_XML_UPLOAD_URL, + UPLOAD_ID, + filename, + start=0, + end=128, + part_number=1, + checksum="crc32c", + ) + + transport = mock.Mock(spec=["request"]) + transport.request.return_value = _make_response( + headers={"etag": PARTS[1], _HASH_HEADER: f"crc32c={CRC32C_HASH_OF_FIRST_PART}"} + ) + + part.upload(transport) + + transport.request.assert_called_once_with( + "PUT", + f"{part.upload_url}?partNumber={part.part_number}&uploadId={UPLOAD_ID}", + data=FILE_DATA[part.start : part.end], + headers={"X-Goog-Hash": f"crc32c={CRC32C_HASH_OF_FIRST_PART}"}, + timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT), + ) + + assert part.finished + assert part.etag == PARTS[1] + + def _make_response(status_code=http.client.OK, headers=None, text=None): headers = headers or {} return mock.Mock( diff --git a/tests/resumable_media/unit/test__upload.py b/tests/resumable_media/unit/test__upload.py index faabc0f56..15bac1618 100644 --- a/tests/resumable_media/unit/test__upload.py +++ b/tests/resumable_media/unit/test__upload.py @@ -47,6 +47,21 @@ UPLOAD_ID = "VXBsb2FkIElEIGZvciBlbHZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZA" PARTS = {1: "39a59594290b0f9a30662a56d695b71d", 2: "00000000290b0f9a30662a56d695b71d"} FILE_DATA = b"testdata" * 128 +CHECKSUM_MISMATCH_ERROR_MSG_XML_TEMPLATE = """ + + {ERROR_CODE} + The MD5 you specified in Content-MD5 or x-goog-hash was invalid. +

    Invalid MD5 value: dfdfdfd==
    +""" +INVALID_MD5_XML_RESPONSE = CHECKSUM_MISMATCH_ERROR_MSG_XML_TEMPLATE.format( + ERROR_CODE="InvalidDigest" +) +INVALID_CRC32C_XML_RESPONSE = CHECKSUM_MISMATCH_ERROR_MSG_XML_TEMPLATE.format( + ERROR_CODE="BadDigest" +) +INCORRECT_LENGTH_CRC32C_XML_RESPONSE = CHECKSUM_MISMATCH_ERROR_MSG_XML_TEMPLATE.format( + ERROR_CODE="CrcMismatch" +) @pytest.fixture(scope="session") @@ -1471,7 +1486,15 @@ def test_xml_mpu_part_invalid_response(filename): part._process_upload_response(response) -def test_xml_mpu_part_checksum_failure(filename): +@pytest.mark.parametrize( + "error_scenarios", + [ + INVALID_MD5_XML_RESPONSE, + INVALID_CRC32C_XML_RESPONSE, + INCORRECT_LENGTH_CRC32C_XML_RESPONSE, + ], +) +def test_xml_mpu_part_checksum_failure(filename, error_scenarios): PART_NUMBER = 1 START = 0 END = 256 @@ -1490,7 +1513,9 @@ def test_xml_mpu_part_checksum_failure(filename): _fix_up_virtual(part) part._prepare_upload_request() response = _make_xml_response( - headers={"etag": ETAG, "x-goog-hash": "md5=Ojk9c3dhfxgoKVVHYwFbHQ=="} + status_code=http.client.BAD_REQUEST, + headers={"etag": ETAG, "x-goog-hash": "md5=Ojk9c3dhfxgoKVVHYwFbHQ=="}, + text=error_scenarios, ) # Example md5 checksum but not the correct one with pytest.raises(DataCorruption): part._process_upload_response(response) @@ -1555,7 +1580,7 @@ def _make_xml_response(status_code=http.client.OK, headers=None, text=None): headers=headers, status_code=status_code, text=text, - spec=["headers", "status_code"], + spec=["headers", "status_code", "text"], ) From 87f27e43d49c7dab52a670352b2a88ad585b3111 Mon Sep 17 00:00:00 2001 From: shubham-up-47 Date: Mon, 25 Aug 2025 10:46:38 +0530 Subject: [PATCH 368/509] updating signed url samples (#1531) --- samples/snippets/storage_generate_signed_url_v2.py | 4 +--- samples/snippets/storage_generate_signed_url_v4.py | 4 +--- samples/snippets/storage_generate_upload_signed_url_v4.py | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/samples/snippets/storage_generate_signed_url_v2.py b/samples/snippets/storage_generate_signed_url_v2.py index f1317ea2f..9d34630f1 100644 --- a/samples/snippets/storage_generate_signed_url_v2.py +++ b/samples/snippets/storage_generate_signed_url_v2.py @@ -26,9 +26,7 @@ def generate_signed_url(bucket_name, blob_name): """Generates a v2 signed URL for downloading a blob. - Note that this method requires a service account key file. You can not use - this if you are using Application Default Credentials from Google Compute - Engine or from the Google Cloud SDK. + Note that this method requires a service account key file. """ # bucket_name = 'your-bucket-name' # blob_name = 'your-object-name' diff --git a/samples/snippets/storage_generate_signed_url_v4.py b/samples/snippets/storage_generate_signed_url_v4.py index 80625a7b3..8825a7bb5 100644 --- a/samples/snippets/storage_generate_signed_url_v4.py +++ b/samples/snippets/storage_generate_signed_url_v4.py @@ -27,9 +27,7 @@ def generate_download_signed_url_v4(bucket_name, blob_name): """Generates a v4 signed URL for downloading a blob. - Note that this method requires a service account key file. You can not use - this if you are using Application Default Credentials from Google Compute - Engine or from the Google Cloud SDK. + Note that this method requires a service account key file. """ # bucket_name = 'your-bucket-name' # blob_name = 'your-object-name' diff --git a/samples/snippets/storage_generate_upload_signed_url_v4.py b/samples/snippets/storage_generate_upload_signed_url_v4.py index dc1da8864..b096fe59e 100644 --- a/samples/snippets/storage_generate_upload_signed_url_v4.py +++ b/samples/snippets/storage_generate_upload_signed_url_v4.py @@ -27,9 +27,7 @@ def generate_upload_signed_url_v4(bucket_name, blob_name): """Generates a v4 signed URL for uploading a blob using HTTP PUT. - Note that this method requires a service account key file. You can not use - this if you are using Application Default Credentials from Google Compute - Engine or from the Google Cloud SDK. + Note that this method requires a service account key file. """ # bucket_name = 'your-bucket-name' # blob_name = 'your-object-name' From 04b01ed07d3541a74fbe7de1f4bff95ed62cd311 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:12:32 +0530 Subject: [PATCH 369/509] chore: make the gapic code private (#1519) --- owlbot.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/owlbot.py b/owlbot.py index e04f47062..085466c4e 100644 --- a/owlbot.py +++ b/owlbot.py @@ -15,6 +15,7 @@ """This script is used to synthesize generated parts of this library.""" import json +from pathlib import Path import synthtool as s from synthtool import gcp @@ -28,12 +29,6 @@ default_version = json.load(open(".repo-metadata.json", "rt")).get("default_version") for library in s.get_staging_dirs(default_version): - s.replace( - library / "google/cloud/storage_v2/__init__.py", - "from google.cloud.storage import gapic_version as package_version", - "from google.cloud.storage_v2 import gapic_version as package_version", - ) - s.move( [library], excludes=[ @@ -51,6 +46,19 @@ "tests/unit/__init__.py", ], ) + + source_path = Path("google/cloud/storage_v2") + renamed_path = Path("google/cloud/_storage_v2") + if source_path.exists(): + source_path.rename(renamed_path) + + if renamed_path.exists(): + s.replace( + renamed_path / "__init__.py", + "from google.cloud.storage_v2 import gapic_version as package_version", + "from google.cloud._storage_v2 import gapic_version as package_version", + ) + s.remove_staging_dirs() common = gcp.CommonTemplates() From 067e6b08f0d4022f2471656cee3375a09e006776 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 11:21:41 +0530 Subject: [PATCH 370/509] chore(main): release 3.3.1 (#1532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(main): release 3.3.1 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Update commit msg for Initiate Resumable Upload Checksum --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot Co-authored-by: Chandra Shekhar Sirimala --- CHANGELOG.md | 8 +++++ google/cloud/storage/version.py | 2 +- tests/system/test__signing.py | 52 +++++++++------------------------ tests/system/test_bucket.py | 2 +- 4 files changed, 23 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92342065c..766bbabe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.3.1](https://github.com/googleapis/python-storage/compare/v3.3.0...v3.3.1) (2025-08-25) + + +### Bug Fixes + +* Provide option to user to set entire object checksum at "initiate a resumable upload session" and send the same ([#1525](https://github.com/googleapis/python-storage/issues/1525)) ([a8109e0](https://github.com/googleapis/python-storage/commit/a8109e0d02c62542f1bea20373b53864fb776caa)) +* Send part's checksum for XML MPU part upload ([#1529](https://github.com/googleapis/python-storage/issues/1529)) ([2ad77c7](https://github.com/googleapis/python-storage/commit/2ad77c7d949e84c515c051a0fd4b37b822788dd8)) + ## [3.3.0](https://github.com/googleapis/python-storage/compare/v3.2.0...v3.3.0) (2025-08-05) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 2279c3674..a5a77c35d 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.3.0" +__version__ = "3.3.1" diff --git a/tests/system/test__signing.py b/tests/system/test__signing.py index ed5a0c09a..6ad417de1 100644 --- a/tests/system/test__signing.py +++ b/tests/system/test__signing.py @@ -59,9 +59,7 @@ def _create_signed_list_blobs_url_helper( :Response headers end." -def test_create_signed_list_blobs_url_v2( - storage_client, signing_bucket, no_mtls -): +def test_create_signed_list_blobs_url_v2(storage_client, signing_bucket, no_mtls): _create_signed_list_blobs_url_helper( storage_client, signing_bucket, @@ -83,9 +81,7 @@ def test_create_signed_list_blobs_url_v2_w_expiration( ) -def test_create_signed_list_blobs_url_v4( - storage_client, signing_bucket, no_mtls -): +def test_create_signed_list_blobs_url_v4(storage_client, signing_bucket, no_mtls): _create_signed_list_blobs_url_helper( storage_client, signing_bucket, @@ -229,9 +225,7 @@ def test_create_signed_read_url_v4_w_non_ascii_name( ) -def test_create_signed_read_url_v2_w_csek( - storage_client, signing_bucket, no_mtls -): +def test_create_signed_read_url_v2_w_csek(storage_client, signing_bucket, no_mtls): encryption_key = os.urandom(32) _create_signed_read_url_helper( storage_client, @@ -242,9 +236,7 @@ def test_create_signed_read_url_v2_w_csek( ) -def test_create_signed_read_url_v4_w_csek( - storage_client, signing_bucket, no_mtls -): +def test_create_signed_read_url_v4_w_csek(storage_client, signing_bucket, no_mtls): encryption_key = os.urandom(32) _create_signed_read_url_helper( storage_client, @@ -327,9 +319,7 @@ def test_create_signed_read_url_v4_w_access_token_universe_domain( "https://www.googleapis.com/auth/devstorage.read_write", "https://www.googleapis.com/auth/iam", ] - response = universe_domain_iam_client.generate_access_token( - name=name, scope=scope - ) + response = universe_domain_iam_client.generate_access_token(name=name, scope=scope) _create_signed_read_url_helper( universe_domain_client, @@ -340,9 +330,7 @@ def test_create_signed_read_url_v4_w_access_token_universe_domain( ) -def _create_signed_delete_url_helper( - client, bucket, version="v2", expiration=None -): +def _create_signed_delete_url_helper(client, bucket, version="v2", expiration=None): expiration = _morph_expiration(version, expiration) blob = bucket.blob("DELETE_ME.txt") @@ -372,9 +360,7 @@ def test_create_signed_delete_url_v2(storage_client, signing_bucket, no_mtls): def test_create_signed_delete_url_v4(storage_client, signing_bucket, no_mtls): - _create_signed_delete_url_helper( - storage_client, signing_bucket, version="v4" - ) + _create_signed_delete_url_helper(storage_client, signing_bucket, version="v4") def _create_signed_resumable_upload_url_helper( @@ -393,9 +379,7 @@ def _create_signed_resumable_upload_url_helper( ) post_headers = {"x-goog-resumable": "start"} - post_response = requests.post( - signed_resumable_upload_url, headers=post_headers - ) + post_response = requests.post(signed_resumable_upload_url, headers=post_headers) assert ( post_response.status_code == 201 ), f"Response content start: {post_response.content} \ @@ -445,9 +429,7 @@ def _create_signed_resumable_upload_url_helper( :Response headers end." -def test_create_signed_resumable_upload_url_v2( - storage_client, signing_bucket, no_mtls -): +def test_create_signed_resumable_upload_url_v2(storage_client, signing_bucket, no_mtls): _create_signed_resumable_upload_url_helper( storage_client, signing_bucket, @@ -455,9 +437,7 @@ def test_create_signed_resumable_upload_url_v2( ) -def test_create_signed_resumable_upload_url_v4( - storage_client, signing_bucket, no_mtls -): +def test_create_signed_resumable_upload_url_v4(storage_client, signing_bucket, no_mtls): _create_signed_resumable_upload_url_helper( storage_client, signing_bucket, @@ -494,9 +474,7 @@ def test_generate_signed_post_policy_v4( ) with open(blob_name, "r") as f: files = {"file": (blob_name, f)} - response = requests.post( - policy["url"], data=policy["fields"], files=files - ) + response = requests.post(policy["url"], data=policy["fields"], files=files) os.remove(blob_name) assert ( @@ -549,9 +527,7 @@ def test_generate_signed_post_policy_v4_access_token_sa_email( ) with open(blob_name, "r") as f: files = {"file": (blob_name, f)} - response = requests.post( - policy["url"], data=policy["fields"], files=files - ) + response = requests.post(policy["url"], data=policy["fields"], files=files) os.remove(blob_name) assert ( @@ -591,9 +567,7 @@ def test_generate_signed_post_policy_v4_invalid_field( ) with open(blob_name, "r") as f: files = {"file": (blob_name, f)} - response = requests.post( - policy["url"], data=policy["fields"], files=files - ) + response = requests.post(policy["url"], data=policy["fields"], files=files) os.remove(blob_name) assert ( diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 3b05e8483..602e407cc 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1338,6 +1338,7 @@ def test_bucket_ip_filter_patch(storage_client, buckets_to_delete): ] assert len(reloaded_filter.vpc_network_sources) == 1 + def test_list_buckets_with_ip_filter(storage_client, buckets_to_delete): """Test that listing buckets returns a summarized IP filter.""" bucket_name = _helpers.unique_name("ip-filter-list") @@ -1366,4 +1367,3 @@ def test_list_buckets_with_ip_filter(storage_client, buckets_to_delete): # Check that the summarized filter does not include full details. assert summarized_filter.public_network_source is None assert summarized_filter.vpc_network_sources == [] - From 67326df83ced2678987f98f1daa926c6849ab925 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 2 Sep 2025 11:13:57 +0530 Subject: [PATCH 371/509] chore: fix the gapic unit tests (#1536) --- owlbot.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/owlbot.py b/owlbot.py index 085466c4e..3829bf0d7 100644 --- a/owlbot.py +++ b/owlbot.py @@ -54,10 +54,18 @@ if renamed_path.exists(): s.replace( - renamed_path / "__init__.py", - "from google.cloud.storage_v2 import gapic_version as package_version", - "from google.cloud._storage_v2 import gapic_version as package_version", - ) + renamed_path / "**/*.py", + "google.cloud.storage_v2", + "google.cloud._storage_v2", + ) + + # Fix imports in the unit tests + s.replace( + "tests/unit/gapic/storage_v2/**/*.py", + "google.cloud.storage_v2", + "google.cloud._storage_v2", + ) + s.remove_staging_dirs() From 87f71961d6a498e8bf74c4f995b4c0f98190892d Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 2 Sep 2025 12:12:32 +0530 Subject: [PATCH 372/509] chore: update Python generator version to 1.25.1 (#1535) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update Python generator version to 1.25.1 PiperOrigin-RevId: 800535761 Source-Link: https://github.com/googleapis/googleapis/commit/4cf1f99cccc014627af5e8a6c0f80a3e6ec0d268 Source-Link: https://github.com/googleapis/googleapis-gen/commit/133d25b68e712116e1c5dc71fc3eb3c5e717022a Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMTMzZDI1YjY4ZTcxMjExNmUxYzVkYzcxZmMzZWIzYzVlNzE3MDIyYSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .../{storage_v2 => _storage_v2}/__init__.py | 2 +- .../gapic_metadata.json | 0 .../gapic_version.py | 0 .../{storage_v2 => _storage_v2}/py.typed | 0 .../services/__init__.py | 0 .../services/storage/__init__.py | 0 .../services/storage/async_client.py | 92 ++++----- .../services/storage/client.py | 92 ++++----- .../services/storage/pagers.py | 34 ++-- .../services/storage/transports/README.rst | 0 .../services/storage/transports/__init__.py | 0 .../services/storage/transports/base.py | 4 +- .../services/storage/transports/grpc.py | 2 +- .../storage/transports/grpc_asyncio.py | 2 +- .../types/__init__.py | 0 .../types/storage.py | 182 +++++++++--------- tests/unit/gapic/storage_v2/test_storage.py | 18 +- 17 files changed, 214 insertions(+), 214 deletions(-) rename google/cloud/{storage_v2 => _storage_v2}/__init__.py (98%) rename google/cloud/{storage_v2 => _storage_v2}/gapic_metadata.json (100%) rename google/cloud/{storage_v2 => _storage_v2}/gapic_version.py (100%) rename google/cloud/{storage_v2 => _storage_v2}/py.typed (100%) rename google/cloud/{storage_v2 => _storage_v2}/services/__init__.py (100%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/__init__.py (100%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/async_client.py (97%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/client.py (97%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/pagers.py (90%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/transports/README.rst (100%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/transports/__init__.py (100%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/transports/base.py (99%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/transports/grpc.py (99%) rename google/cloud/{storage_v2 => _storage_v2}/services/storage/transports/grpc_asyncio.py (99%) rename google/cloud/{storage_v2 => _storage_v2}/types/__init__.py (100%) rename google/cloud/{storage_v2 => _storage_v2}/types/storage.py (96%) diff --git a/google/cloud/storage_v2/__init__.py b/google/cloud/_storage_v2/__init__.py similarity index 98% rename from google/cloud/storage_v2/__init__.py rename to google/cloud/_storage_v2/__init__.py index 4d03ee922..de9735f8d 100644 --- a/google/cloud/storage_v2/__init__.py +++ b/google/cloud/_storage_v2/__init__.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from google.cloud.storage_v2 import gapic_version as package_version +from google.cloud._storage_v2 import gapic_version as package_version __version__ = package_version.__version__ diff --git a/google/cloud/storage_v2/gapic_metadata.json b/google/cloud/_storage_v2/gapic_metadata.json similarity index 100% rename from google/cloud/storage_v2/gapic_metadata.json rename to google/cloud/_storage_v2/gapic_metadata.json diff --git a/google/cloud/storage_v2/gapic_version.py b/google/cloud/_storage_v2/gapic_version.py similarity index 100% rename from google/cloud/storage_v2/gapic_version.py rename to google/cloud/_storage_v2/gapic_version.py diff --git a/google/cloud/storage_v2/py.typed b/google/cloud/_storage_v2/py.typed similarity index 100% rename from google/cloud/storage_v2/py.typed rename to google/cloud/_storage_v2/py.typed diff --git a/google/cloud/storage_v2/services/__init__.py b/google/cloud/_storage_v2/services/__init__.py similarity index 100% rename from google/cloud/storage_v2/services/__init__.py rename to google/cloud/_storage_v2/services/__init__.py diff --git a/google/cloud/storage_v2/services/storage/__init__.py b/google/cloud/_storage_v2/services/storage/__init__.py similarity index 100% rename from google/cloud/storage_v2/services/storage/__init__.py rename to google/cloud/_storage_v2/services/storage/__init__.py diff --git a/google/cloud/storage_v2/services/storage/async_client.py b/google/cloud/_storage_v2/services/storage/async_client.py similarity index 97% rename from google/cloud/storage_v2/services/storage/async_client.py rename to google/cloud/_storage_v2/services/storage/async_client.py index 81290e8aa..55234cd28 100644 --- a/google/cloud/storage_v2/services/storage/async_client.py +++ b/google/cloud/_storage_v2/services/storage/async_client.py @@ -32,7 +32,7 @@ Union, ) -from google.cloud.storage_v2 import gapic_version as package_version +from google.cloud._storage_v2 import gapic_version as package_version from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions @@ -48,8 +48,8 @@ except AttributeError: # pragma: NO COVER OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore -from google.cloud.storage_v2.services.storage import pagers -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.services.storage import pagers +from google.cloud._storage_v2.types import storage from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore @@ -350,7 +350,7 @@ async def sample_delete_bucket(): await client.delete_bucket(request=request) Args: - request (Optional[Union[google.cloud.storage_v2.types.DeleteBucketRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.DeleteBucketRequest, dict]]): The request object. Request message for DeleteBucket. name (:class:`str`): Required. Name of a bucket to delete. @@ -455,7 +455,7 @@ async def sample_get_bucket(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.GetBucketRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.GetBucketRequest, dict]]): The request object. Request message for GetBucket. name (:class:`str`): Required. Name of a bucket. @@ -471,7 +471,7 @@ async def sample_get_bucket(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -570,7 +570,7 @@ async def sample_create_bucket(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.CreateBucketRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.CreateBucketRequest, dict]]): The request object. Request message for CreateBucket. parent (:class:`str`): Required. The project to which this bucket will belong. @@ -581,7 +581,7 @@ async def sample_create_bucket(): This corresponds to the ``parent`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - bucket (:class:`google.cloud.storage_v2.types.Bucket`): + bucket (:class:`google.cloud._storage_v2.types.Bucket`): Optional. Properties of the new bucket being inserted. The name of the bucket is specified in the ``bucket_id`` field. Populating ``bucket.name`` field will result in @@ -613,7 +613,7 @@ async def sample_create_bucket(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -719,7 +719,7 @@ async def sample_list_buckets(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.ListBucketsRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.ListBucketsRequest, dict]]): The request object. Request message for ListBuckets. parent (:class:`str`): Required. The project whose buckets @@ -737,7 +737,7 @@ async def sample_list_buckets(): be of type `bytes`. Returns: - google.cloud.storage_v2.services.storage.pagers.ListBucketsAsyncPager: + google.cloud._storage_v2.services.storage.pagers.ListBucketsAsyncPager: The result of a call to Buckets.ListBuckets Iterating over this object will yield @@ -850,7 +850,7 @@ async def sample_lock_bucket_retention_policy(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.LockBucketRetentionPolicyRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.LockBucketRetentionPolicyRequest, dict]]): The request object. Request message for LockBucketRetentionPolicyRequest. bucket (:class:`str`): @@ -867,7 +867,7 @@ async def sample_lock_bucket_retention_policy(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -1422,9 +1422,9 @@ async def sample_update_bucket(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.UpdateBucketRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.UpdateBucketRequest, dict]]): The request object. Request for UpdateBucket method. - bucket (:class:`google.cloud.storage_v2.types.Bucket`): + bucket (:class:`google.cloud._storage_v2.types.Bucket`): Required. The bucket to update. The bucket's ``name`` field will be used to identify the bucket. @@ -1455,7 +1455,7 @@ async def sample_update_bucket(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -1552,7 +1552,7 @@ async def sample_compose_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.ComposeObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.ComposeObjectRequest, dict]]): The request object. Request message for ComposeObject. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. @@ -1563,7 +1563,7 @@ async def sample_compose_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -1663,7 +1663,7 @@ async def sample_delete_object(): await client.delete_object(request=request) Args: - request (Optional[Union[google.cloud.storage_v2.types.DeleteObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.DeleteObjectRequest, dict]]): The request object. Message for deleting an object. ``bucket`` and ``object`` **must** be set. bucket (:class:`str`): @@ -1796,7 +1796,7 @@ async def sample_restore_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.RestoreObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.RestoreObjectRequest, dict]]): The request object. Message for restoring an object. ``bucket``, ``object``, and ``generation`` **must** be set. bucket (:class:`str`): @@ -1829,7 +1829,7 @@ async def sample_restore_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -1937,7 +1937,7 @@ async def sample_cancel_resumable_write(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.CancelResumableWriteRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.CancelResumableWriteRequest, dict]]): The request object. Message for canceling an in-progress resumable upload. ``upload_id`` **must** be set. upload_id (:class:`str`): @@ -1957,7 +1957,7 @@ async def sample_cancel_resumable_write(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.CancelResumableWriteResponse: + google.cloud._storage_v2.types.CancelResumableWriteResponse: Empty response message for canceling an in-progress resumable upload, will be extended as needed. @@ -2068,7 +2068,7 @@ async def sample_get_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.GetObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.GetObjectRequest, dict]]): The request object. Request message for GetObject. bucket (:class:`str`): Required. Name of the bucket in which @@ -2100,7 +2100,7 @@ async def sample_get_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -2210,7 +2210,7 @@ async def sample_read_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.ReadObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.ReadObjectRequest, dict]]): The request object. Request message for ReadObject. bucket (:class:`str`): Required. The name of the bucket @@ -2244,7 +2244,7 @@ async def sample_read_object(): be of type `bytes`. Returns: - AsyncIterable[google.cloud.storage_v2.types.ReadObjectResponse]: + AsyncIterable[google.cloud._storage_v2.types.ReadObjectResponse]: Response message for ReadObject. """ # Create or coerce a protobuf request object. @@ -2373,7 +2373,7 @@ def request_generator(): print(response) Args: - requests (AsyncIterator[`google.cloud.storage_v2.types.BidiReadObjectRequest`]): + requests (AsyncIterator[`google.cloud._storage_v2.types.BidiReadObjectRequest`]): The request object AsyncIterator. Request message for BidiReadObject. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. @@ -2384,7 +2384,7 @@ def request_generator(): be of type `bytes`. Returns: - AsyncIterable[google.cloud.storage_v2.types.BidiReadObjectResponse]: + AsyncIterable[google.cloud._storage_v2.types.BidiReadObjectResponse]: Response message for BidiReadObject. """ @@ -2454,9 +2454,9 @@ async def sample_update_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.UpdateObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.UpdateObjectRequest, dict]]): The request object. Request message for UpdateObject. - object_ (:class:`google.cloud.storage_v2.types.Object`): + object_ (:class:`google.cloud._storage_v2.types.Object`): Required. The object to update. The object's bucket and name fields are used to identify the object to update. @@ -2493,7 +2493,7 @@ async def sample_update_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -2674,7 +2674,7 @@ def request_generator(): print(response) Args: - requests (AsyncIterator[`google.cloud.storage_v2.types.WriteObjectRequest`]): + requests (AsyncIterator[`google.cloud._storage_v2.types.WriteObjectRequest`]): The request object AsyncIterator. Request message for WriteObject. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. @@ -2685,7 +2685,7 @@ def request_generator(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.WriteObjectResponse: + google.cloud._storage_v2.types.WriteObjectResponse: Response message for WriteObject. """ @@ -2774,7 +2774,7 @@ def request_generator(): print(response) Args: - requests (AsyncIterator[`google.cloud.storage_v2.types.BidiWriteObjectRequest`]): + requests (AsyncIterator[`google.cloud._storage_v2.types.BidiWriteObjectRequest`]): The request object AsyncIterator. Request message for BidiWriteObject. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. @@ -2785,7 +2785,7 @@ def request_generator(): be of type `bytes`. Returns: - AsyncIterable[google.cloud.storage_v2.types.BidiWriteObjectResponse]: + AsyncIterable[google.cloud._storage_v2.types.BidiWriteObjectResponse]: Response message for BidiWriteObject. """ @@ -2856,7 +2856,7 @@ async def sample_list_objects(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.ListObjectsRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.ListObjectsRequest, dict]]): The request object. Request message for ListObjects. parent (:class:`str`): Required. Name of the bucket in which @@ -2874,7 +2874,7 @@ async def sample_list_objects(): be of type `bytes`. Returns: - google.cloud.storage_v2.services.storage.pagers.ListObjectsAsyncPager: + google.cloud._storage_v2.services.storage.pagers.ListObjectsAsyncPager: The result of a call to Objects.ListObjects Iterating over this object will yield @@ -2989,7 +2989,7 @@ async def sample_rewrite_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.RewriteObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.RewriteObjectRequest, dict]]): The request object. Request message for RewriteObject. If the source object is encrypted using a Customer-Supplied Encryption Key the key information must be provided in the @@ -3010,7 +3010,7 @@ async def sample_rewrite_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.RewriteResponse: + google.cloud._storage_v2.types.RewriteResponse: A rewrite response. """ # Create or coerce a protobuf request object. @@ -3102,7 +3102,7 @@ async def sample_start_resumable_write(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.StartResumableWriteRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.StartResumableWriteRequest, dict]]): The request object. Request message StartResumableWrite. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. @@ -3113,7 +3113,7 @@ async def sample_start_resumable_write(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.StartResumableWriteResponse: + google.cloud._storage_v2.types.StartResumableWriteResponse: Response object for StartResumableWrite. """ # Create or coerce a protobuf request object. @@ -3211,7 +3211,7 @@ async def sample_query_write_status(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.QueryWriteStatusRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.QueryWriteStatusRequest, dict]]): The request object. Request object for ``QueryWriteStatus``. upload_id (:class:`str`): Required. The name of the resume @@ -3230,7 +3230,7 @@ async def sample_query_write_status(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.QueryWriteStatusResponse: + google.cloud._storage_v2.types.QueryWriteStatusResponse: Response object for QueryWriteStatus. """ # Create or coerce a protobuf request object. @@ -3333,7 +3333,7 @@ async def sample_move_object(): print(response) Args: - request (Optional[Union[google.cloud.storage_v2.types.MoveObjectRequest, dict]]): + request (Optional[Union[google.cloud._storage_v2.types.MoveObjectRequest, dict]]): The request object. Request message for MoveObject. bucket (:class:`str`): Required. Name of the bucket in which @@ -3363,7 +3363,7 @@ async def sample_move_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. diff --git a/google/cloud/storage_v2/services/storage/client.py b/google/cloud/_storage_v2/services/storage/client.py similarity index 97% rename from google/cloud/storage_v2/services/storage/client.py rename to google/cloud/_storage_v2/services/storage/client.py index 2026a8918..ae1087cf6 100644 --- a/google/cloud/storage_v2/services/storage/client.py +++ b/google/cloud/_storage_v2/services/storage/client.py @@ -36,7 +36,7 @@ ) import warnings -from google.cloud.storage_v2 import gapic_version as package_version +from google.cloud._storage_v2 import gapic_version as package_version from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions @@ -63,8 +63,8 @@ _LOGGER = std_logging.getLogger(__name__) -from google.cloud.storage_v2.services.storage import pagers -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.services.storage import pagers +from google.cloud._storage_v2.types import storage from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore @@ -789,7 +789,7 @@ def sample_delete_bucket(): client.delete_bucket(request=request) Args: - request (Union[google.cloud.storage_v2.types.DeleteBucketRequest, dict]): + request (Union[google.cloud._storage_v2.types.DeleteBucketRequest, dict]): The request object. Request message for DeleteBucket. name (str): Required. Name of a bucket to delete. @@ -891,7 +891,7 @@ def sample_get_bucket(): print(response) Args: - request (Union[google.cloud.storage_v2.types.GetBucketRequest, dict]): + request (Union[google.cloud._storage_v2.types.GetBucketRequest, dict]): The request object. Request message for GetBucket. name (str): Required. Name of a bucket. @@ -907,7 +907,7 @@ def sample_get_bucket(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -1003,7 +1003,7 @@ def sample_create_bucket(): print(response) Args: - request (Union[google.cloud.storage_v2.types.CreateBucketRequest, dict]): + request (Union[google.cloud._storage_v2.types.CreateBucketRequest, dict]): The request object. Request message for CreateBucket. parent (str): Required. The project to which this bucket will belong. @@ -1014,7 +1014,7 @@ def sample_create_bucket(): This corresponds to the ``parent`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - bucket (google.cloud.storage_v2.types.Bucket): + bucket (google.cloud._storage_v2.types.Bucket): Optional. Properties of the new bucket being inserted. The name of the bucket is specified in the ``bucket_id`` field. Populating ``bucket.name`` field will result in @@ -1046,7 +1046,7 @@ def sample_create_bucket(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -1149,7 +1149,7 @@ def sample_list_buckets(): print(response) Args: - request (Union[google.cloud.storage_v2.types.ListBucketsRequest, dict]): + request (Union[google.cloud._storage_v2.types.ListBucketsRequest, dict]): The request object. Request message for ListBuckets. parent (str): Required. The project whose buckets @@ -1167,7 +1167,7 @@ def sample_list_buckets(): be of type `bytes`. Returns: - google.cloud.storage_v2.services.storage.pagers.ListBucketsPager: + google.cloud._storage_v2.services.storage.pagers.ListBucketsPager: The result of a call to Buckets.ListBuckets Iterating over this object will yield @@ -1277,7 +1277,7 @@ def sample_lock_bucket_retention_policy(): print(response) Args: - request (Union[google.cloud.storage_v2.types.LockBucketRetentionPolicyRequest, dict]): + request (Union[google.cloud._storage_v2.types.LockBucketRetentionPolicyRequest, dict]): The request object. Request message for LockBucketRetentionPolicyRequest. bucket (str): @@ -1294,7 +1294,7 @@ def sample_lock_bucket_retention_policy(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -1851,9 +1851,9 @@ def sample_update_bucket(): print(response) Args: - request (Union[google.cloud.storage_v2.types.UpdateBucketRequest, dict]): + request (Union[google.cloud._storage_v2.types.UpdateBucketRequest, dict]): The request object. Request for UpdateBucket method. - bucket (google.cloud.storage_v2.types.Bucket): + bucket (google.cloud._storage_v2.types.Bucket): Required. The bucket to update. The bucket's ``name`` field will be used to identify the bucket. @@ -1884,7 +1884,7 @@ def sample_update_bucket(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Bucket: + google.cloud._storage_v2.types.Bucket: A bucket. """ # Create or coerce a protobuf request object. @@ -1978,7 +1978,7 @@ def sample_compose_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.ComposeObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.ComposeObjectRequest, dict]): The request object. Request message for ComposeObject. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -1989,7 +1989,7 @@ def sample_compose_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -2087,7 +2087,7 @@ def sample_delete_object(): client.delete_object(request=request) Args: - request (Union[google.cloud.storage_v2.types.DeleteObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.DeleteObjectRequest, dict]): The request object. Message for deleting an object. ``bucket`` and ``object`` **must** be set. bucket (str): @@ -2217,7 +2217,7 @@ def sample_restore_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.RestoreObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.RestoreObjectRequest, dict]): The request object. Message for restoring an object. ``bucket``, ``object``, and ``generation`` **must** be set. bucket (str): @@ -2250,7 +2250,7 @@ def sample_restore_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -2355,7 +2355,7 @@ def sample_cancel_resumable_write(): print(response) Args: - request (Union[google.cloud.storage_v2.types.CancelResumableWriteRequest, dict]): + request (Union[google.cloud._storage_v2.types.CancelResumableWriteRequest, dict]): The request object. Message for canceling an in-progress resumable upload. ``upload_id`` **must** be set. upload_id (str): @@ -2375,7 +2375,7 @@ def sample_cancel_resumable_write(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.CancelResumableWriteResponse: + google.cloud._storage_v2.types.CancelResumableWriteResponse: Empty response message for canceling an in-progress resumable upload, will be extended as needed. @@ -2483,7 +2483,7 @@ def sample_get_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.GetObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.GetObjectRequest, dict]): The request object. Request message for GetObject. bucket (str): Required. Name of the bucket in which @@ -2515,7 +2515,7 @@ def sample_get_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -2622,7 +2622,7 @@ def sample_read_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.ReadObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.ReadObjectRequest, dict]): The request object. Request message for ReadObject. bucket (str): Required. The name of the bucket @@ -2656,7 +2656,7 @@ def sample_read_object(): be of type `bytes`. Returns: - Iterable[google.cloud.storage_v2.types.ReadObjectResponse]: + Iterable[google.cloud._storage_v2.types.ReadObjectResponse]: Response message for ReadObject. """ # Create or coerce a protobuf request object. @@ -2782,7 +2782,7 @@ def request_generator(): print(response) Args: - requests (Iterator[google.cloud.storage_v2.types.BidiReadObjectRequest]): + requests (Iterator[google.cloud._storage_v2.types.BidiReadObjectRequest]): The request object iterator. Request message for BidiReadObject. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -2793,7 +2793,7 @@ def request_generator(): be of type `bytes`. Returns: - Iterable[google.cloud.storage_v2.types.BidiReadObjectResponse]: + Iterable[google.cloud._storage_v2.types.BidiReadObjectResponse]: Response message for BidiReadObject. """ @@ -2861,9 +2861,9 @@ def sample_update_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.UpdateObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.UpdateObjectRequest, dict]): The request object. Request message for UpdateObject. - object_ (google.cloud.storage_v2.types.Object): + object_ (google.cloud._storage_v2.types.Object): Required. The object to update. The object's bucket and name fields are used to identify the object to update. @@ -2900,7 +2900,7 @@ def sample_update_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. @@ -3078,7 +3078,7 @@ def request_generator(): print(response) Args: - requests (Iterator[google.cloud.storage_v2.types.WriteObjectRequest]): + requests (Iterator[google.cloud._storage_v2.types.WriteObjectRequest]): The request object iterator. Request message for WriteObject. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -3089,7 +3089,7 @@ def request_generator(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.WriteObjectResponse: + google.cloud._storage_v2.types.WriteObjectResponse: Response message for WriteObject. """ @@ -3176,7 +3176,7 @@ def request_generator(): print(response) Args: - requests (Iterator[google.cloud.storage_v2.types.BidiWriteObjectRequest]): + requests (Iterator[google.cloud._storage_v2.types.BidiWriteObjectRequest]): The request object iterator. Request message for BidiWriteObject. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -3187,7 +3187,7 @@ def request_generator(): be of type `bytes`. Returns: - Iterable[google.cloud.storage_v2.types.BidiWriteObjectResponse]: + Iterable[google.cloud._storage_v2.types.BidiWriteObjectResponse]: Response message for BidiWriteObject. """ @@ -3256,7 +3256,7 @@ def sample_list_objects(): print(response) Args: - request (Union[google.cloud.storage_v2.types.ListObjectsRequest, dict]): + request (Union[google.cloud._storage_v2.types.ListObjectsRequest, dict]): The request object. Request message for ListObjects. parent (str): Required. Name of the bucket in which @@ -3274,7 +3274,7 @@ def sample_list_objects(): be of type `bytes`. Returns: - google.cloud.storage_v2.services.storage.pagers.ListObjectsPager: + google.cloud._storage_v2.services.storage.pagers.ListObjectsPager: The result of a call to Objects.ListObjects Iterating over this object will yield @@ -3386,7 +3386,7 @@ def sample_rewrite_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.RewriteObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.RewriteObjectRequest, dict]): The request object. Request message for RewriteObject. If the source object is encrypted using a Customer-Supplied Encryption Key the key information must be provided in the @@ -3407,7 +3407,7 @@ def sample_rewrite_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.RewriteResponse: + google.cloud._storage_v2.types.RewriteResponse: A rewrite response. """ # Create or coerce a protobuf request object. @@ -3497,7 +3497,7 @@ def sample_start_resumable_write(): print(response) Args: - request (Union[google.cloud.storage_v2.types.StartResumableWriteRequest, dict]): + request (Union[google.cloud._storage_v2.types.StartResumableWriteRequest, dict]): The request object. Request message StartResumableWrite. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -3508,7 +3508,7 @@ def sample_start_resumable_write(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.StartResumableWriteResponse: + google.cloud._storage_v2.types.StartResumableWriteResponse: Response object for StartResumableWrite. """ # Create or coerce a protobuf request object. @@ -3604,7 +3604,7 @@ def sample_query_write_status(): print(response) Args: - request (Union[google.cloud.storage_v2.types.QueryWriteStatusRequest, dict]): + request (Union[google.cloud._storage_v2.types.QueryWriteStatusRequest, dict]): The request object. Request object for ``QueryWriteStatus``. upload_id (str): Required. The name of the resume @@ -3623,7 +3623,7 @@ def sample_query_write_status(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.QueryWriteStatusResponse: + google.cloud._storage_v2.types.QueryWriteStatusResponse: Response object for QueryWriteStatus. """ # Create or coerce a protobuf request object. @@ -3723,7 +3723,7 @@ def sample_move_object(): print(response) Args: - request (Union[google.cloud.storage_v2.types.MoveObjectRequest, dict]): + request (Union[google.cloud._storage_v2.types.MoveObjectRequest, dict]): The request object. Request message for MoveObject. bucket (str): Required. Name of the bucket in which @@ -3753,7 +3753,7 @@ def sample_move_object(): be of type `bytes`. Returns: - google.cloud.storage_v2.types.Object: + google.cloud._storage_v2.types.Object: An object. """ # Create or coerce a protobuf request object. diff --git a/google/cloud/storage_v2/services/storage/pagers.py b/google/cloud/_storage_v2/services/storage/pagers.py similarity index 90% rename from google/cloud/storage_v2/services/storage/pagers.py rename to google/cloud/_storage_v2/services/storage/pagers.py index 79aa18984..d0076080e 100644 --- a/google/cloud/storage_v2/services/storage/pagers.py +++ b/google/cloud/_storage_v2/services/storage/pagers.py @@ -37,14 +37,14 @@ OptionalRetry = Union[retries.Retry, object, None] # type: ignore OptionalAsyncRetry = Union[retries_async.AsyncRetry, object, None] # type: ignore -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.types import storage class ListBucketsPager: """A pager for iterating through ``list_buckets`` requests. This class thinly wraps an initial - :class:`google.cloud.storage_v2.types.ListBucketsResponse` object, and + :class:`google.cloud._storage_v2.types.ListBucketsResponse` object, and provides an ``__iter__`` method to iterate through its ``buckets`` field. @@ -53,7 +53,7 @@ class ListBucketsPager: through the ``buckets`` field on the corresponding responses. - All the usual :class:`google.cloud.storage_v2.types.ListBucketsResponse` + All the usual :class:`google.cloud._storage_v2.types.ListBucketsResponse` attributes are available on the pager. If multiple requests are made, only the most recent response is retained, and thus used for attribute lookup. """ @@ -73,9 +73,9 @@ def __init__( Args: method (Callable): The method that was originally called, and which instantiated this pager. - request (google.cloud.storage_v2.types.ListBucketsRequest): + request (google.cloud._storage_v2.types.ListBucketsRequest): The initial request object. - response (google.cloud.storage_v2.types.ListBucketsResponse): + response (google.cloud._storage_v2.types.ListBucketsResponse): The initial response object. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -120,7 +120,7 @@ class ListBucketsAsyncPager: """A pager for iterating through ``list_buckets`` requests. This class thinly wraps an initial - :class:`google.cloud.storage_v2.types.ListBucketsResponse` object, and + :class:`google.cloud._storage_v2.types.ListBucketsResponse` object, and provides an ``__aiter__`` method to iterate through its ``buckets`` field. @@ -129,7 +129,7 @@ class ListBucketsAsyncPager: through the ``buckets`` field on the corresponding responses. - All the usual :class:`google.cloud.storage_v2.types.ListBucketsResponse` + All the usual :class:`google.cloud._storage_v2.types.ListBucketsResponse` attributes are available on the pager. If multiple requests are made, only the most recent response is retained, and thus used for attribute lookup. """ @@ -149,9 +149,9 @@ def __init__( Args: method (Callable): The method that was originally called, and which instantiated this pager. - request (google.cloud.storage_v2.types.ListBucketsRequest): + request (google.cloud._storage_v2.types.ListBucketsRequest): The initial request object. - response (google.cloud.storage_v2.types.ListBucketsResponse): + response (google.cloud._storage_v2.types.ListBucketsResponse): The initial response object. retry (google.api_core.retry.AsyncRetry): Designation of what errors, if any, should be retried. @@ -200,7 +200,7 @@ class ListObjectsPager: """A pager for iterating through ``list_objects`` requests. This class thinly wraps an initial - :class:`google.cloud.storage_v2.types.ListObjectsResponse` object, and + :class:`google.cloud._storage_v2.types.ListObjectsResponse` object, and provides an ``__iter__`` method to iterate through its ``objects`` field. @@ -209,7 +209,7 @@ class ListObjectsPager: through the ``objects`` field on the corresponding responses. - All the usual :class:`google.cloud.storage_v2.types.ListObjectsResponse` + All the usual :class:`google.cloud._storage_v2.types.ListObjectsResponse` attributes are available on the pager. If multiple requests are made, only the most recent response is retained, and thus used for attribute lookup. """ @@ -229,9 +229,9 @@ def __init__( Args: method (Callable): The method that was originally called, and which instantiated this pager. - request (google.cloud.storage_v2.types.ListObjectsRequest): + request (google.cloud._storage_v2.types.ListObjectsRequest): The initial request object. - response (google.cloud.storage_v2.types.ListObjectsResponse): + response (google.cloud._storage_v2.types.ListObjectsResponse): The initial response object. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -276,7 +276,7 @@ class ListObjectsAsyncPager: """A pager for iterating through ``list_objects`` requests. This class thinly wraps an initial - :class:`google.cloud.storage_v2.types.ListObjectsResponse` object, and + :class:`google.cloud._storage_v2.types.ListObjectsResponse` object, and provides an ``__aiter__`` method to iterate through its ``objects`` field. @@ -285,7 +285,7 @@ class ListObjectsAsyncPager: through the ``objects`` field on the corresponding responses. - All the usual :class:`google.cloud.storage_v2.types.ListObjectsResponse` + All the usual :class:`google.cloud._storage_v2.types.ListObjectsResponse` attributes are available on the pager. If multiple requests are made, only the most recent response is retained, and thus used for attribute lookup. """ @@ -305,9 +305,9 @@ def __init__( Args: method (Callable): The method that was originally called, and which instantiated this pager. - request (google.cloud.storage_v2.types.ListObjectsRequest): + request (google.cloud._storage_v2.types.ListObjectsRequest): The initial request object. - response (google.cloud.storage_v2.types.ListObjectsResponse): + response (google.cloud._storage_v2.types.ListObjectsResponse): The initial response object. retry (google.api_core.retry.AsyncRetry): Designation of what errors, if any, should be retried. diff --git a/google/cloud/storage_v2/services/storage/transports/README.rst b/google/cloud/_storage_v2/services/storage/transports/README.rst similarity index 100% rename from google/cloud/storage_v2/services/storage/transports/README.rst rename to google/cloud/_storage_v2/services/storage/transports/README.rst diff --git a/google/cloud/storage_v2/services/storage/transports/__init__.py b/google/cloud/_storage_v2/services/storage/transports/__init__.py similarity index 100% rename from google/cloud/storage_v2/services/storage/transports/__init__.py rename to google/cloud/_storage_v2/services/storage/transports/__init__.py diff --git a/google/cloud/storage_v2/services/storage/transports/base.py b/google/cloud/_storage_v2/services/storage/transports/base.py similarity index 99% rename from google/cloud/storage_v2/services/storage/transports/base.py rename to google/cloud/_storage_v2/services/storage/transports/base.py index ea82adddc..3484b18dd 100644 --- a/google/cloud/storage_v2/services/storage/transports/base.py +++ b/google/cloud/_storage_v2/services/storage/transports/base.py @@ -16,7 +16,7 @@ import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -from google.cloud.storage_v2 import gapic_version as package_version +from google.cloud._storage_v2 import gapic_version as package_version import google.auth # type: ignore import google.api_core @@ -27,7 +27,7 @@ from google.oauth2 import service_account # type: ignore import google.protobuf -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.types import storage from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore diff --git a/google/cloud/storage_v2/services/storage/transports/grpc.py b/google/cloud/_storage_v2/services/storage/transports/grpc.py similarity index 99% rename from google/cloud/storage_v2/services/storage/transports/grpc.py rename to google/cloud/_storage_v2/services/storage/transports/grpc.py index 6d5bbca85..7ffe8465c 100644 --- a/google/cloud/storage_v2/services/storage/transports/grpc.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc.py @@ -30,7 +30,7 @@ import grpc # type: ignore import proto # type: ignore -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.types import storage from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore diff --git a/google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py similarity index 99% rename from google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py rename to google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py index d2ff8dc05..fa2fa0e9d 100644 --- a/google/cloud/storage_v2/services/storage/transports/grpc_asyncio.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py @@ -33,7 +33,7 @@ import proto # type: ignore from grpc.experimental import aio # type: ignore -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.types import storage from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore diff --git a/google/cloud/storage_v2/types/__init__.py b/google/cloud/_storage_v2/types/__init__.py similarity index 100% rename from google/cloud/storage_v2/types/__init__.py rename to google/cloud/_storage_v2/types/__init__.py diff --git a/google/cloud/storage_v2/types/storage.py b/google/cloud/_storage_v2/types/storage.py similarity index 96% rename from google/cloud/storage_v2/types/storage.py rename to google/cloud/_storage_v2/types/storage.py index 9dc7d6262..bee559a2f 100644 --- a/google/cloud/storage_v2/types/storage.py +++ b/google/cloud/_storage_v2/types/storage.py @@ -184,7 +184,7 @@ class CreateBucketRequest(proto.Message): field must either be empty or ``projects/_``. The project ID that owns this bucket should be specified in the ``bucket.project`` field. - bucket (google.cloud.storage_v2.types.Bucket): + bucket (google.cloud._storage_v2.types.Bucket): Optional. Properties of the new bucket being inserted. The name of the bucket is specified in the ``bucket_id`` field. Populating ``bucket.name`` field will result in an error. @@ -302,7 +302,7 @@ class ListBucketsResponse(proto.Message): r"""The result of a call to Buckets.ListBuckets Attributes: - buckets (MutableSequence[google.cloud.storage_v2.types.Bucket]): + buckets (MutableSequence[google.cloud._storage_v2.types.Bucket]): The list of items. next_page_token (str): The continuation token, used to page through @@ -354,7 +354,7 @@ class UpdateBucketRequest(proto.Message): .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: - bucket (google.cloud.storage_v2.types.Bucket): + bucket (google.cloud._storage_v2.types.Bucket): Required. The bucket to update. The bucket's ``name`` field will be used to identify the bucket. if_metageneration_match (int): @@ -427,9 +427,9 @@ class ComposeObjectRequest(proto.Message): .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: - destination (google.cloud.storage_v2.types.Object): + destination (google.cloud._storage_v2.types.Object): Required. Properties of the resulting object. - source_objects (MutableSequence[google.cloud.storage_v2.types.ComposeObjectRequest.SourceObject]): + source_objects (MutableSequence[google.cloud._storage_v2.types.ComposeObjectRequest.SourceObject]): Optional. The list of source objects that will be concatenated into a single object. destination_predefined_acl (str): @@ -457,10 +457,10 @@ class ComposeObjectRequest(proto.Message): ``projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key``, that will be used to encrypt the object. Overrides the object metadata's ``kms_key_name`` value, if any. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. - object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. The checksums of the complete object. This will be validated against the combined checksums of the component objects. @@ -476,7 +476,7 @@ class SourceObject(proto.Message): generation (int): Optional. The generation of this object to use as the source. - object_preconditions (google.cloud.storage_v2.types.ComposeObjectRequest.SourceObject.ObjectPreconditions): + object_preconditions (google.cloud._storage_v2.types.ComposeObjectRequest.SourceObject.ObjectPreconditions): Optional. Conditions that must be met for this operation to execute. """ @@ -605,7 +605,7 @@ class DeleteObjectRequest(proto.Message): match the given value. This field is a member of `oneof`_ ``_if_metageneration_not_match``. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. """ @@ -709,7 +709,7 @@ class RestoreObjectRequest(proto.Message): if bucket has UBLA enabled. This field is a member of `oneof`_ ``_copy_source_acl``. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. """ @@ -851,7 +851,7 @@ class ReadObjectRequest(proto.Message): match the given value. This field is a member of `oneof`_ ``_if_metageneration_not_match``. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. read_mask (google.protobuf.field_mask_pb2.FieldMask): @@ -967,7 +967,7 @@ class GetObjectRequest(proto.Message): match the given value. This field is a member of `oneof`_ ``_if_metageneration_not_match``. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. read_mask (google.protobuf.field_mask_pb2.FieldMask): @@ -1045,23 +1045,23 @@ class ReadObjectResponse(proto.Message): r"""Response message for ReadObject. Attributes: - checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + checksummed_data (google.cloud._storage_v2.types.ChecksummedData): A portion of the data for the object. The service **may** leave ``data`` empty for any given ``ReadResponse``. This enables the service to inform the client that the request is still live while it is running an operation to generate more data. - object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + object_checksums (google.cloud._storage_v2.types.ObjectChecksums): The checksums of the complete object. If the object is downloaded in full, the client should compute one of these checksums over the downloaded object and compare it against the value provided here. - content_range (google.cloud.storage_v2.types.ContentRange): + content_range (google.cloud._storage_v2.types.ContentRange): If read_offset and or read_limit was specified on the ReadObjectRequest, ContentRange will be populated on the first ReadObjectResponse message of the read stream. - metadata (google.cloud.storage_v2.types.Object): + metadata (google.cloud._storage_v2.types.Object): Metadata of the object whose media is being returned. Only populated in the first response in the stream. @@ -1133,7 +1133,7 @@ class BidiReadObjectSpec(proto.Message): match the given value. This field is a member of `oneof`_ ``_if_metageneration_not_match``. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. read_mask (google.protobuf.field_mask_pb2.FieldMask): @@ -1148,7 +1148,7 @@ class BidiReadObjectSpec(proto.Message): https://cloud.google.com/apis/docs/system-parameters#definitions This field is a member of `oneof`_ ``_read_mask``. - read_handle (google.cloud.storage_v2.types.BidiReadHandle): + read_handle (google.cloud._storage_v2.types.BidiReadHandle): The client can optionally set this field. The read handle is an optimized way of creating new streams. Read handles are generated and @@ -1223,12 +1223,12 @@ class BidiReadObjectRequest(proto.Message): r"""Request message for BidiReadObject. Attributes: - read_object_spec (google.cloud.storage_v2.types.BidiReadObjectSpec): + read_object_spec (google.cloud._storage_v2.types.BidiReadObjectSpec): Optional. The first message of each stream should set this field. If this is not the first message, an error will be returned. Describes the object to read. - read_ranges (MutableSequence[google.cloud.storage_v2.types.ReadRange]): + read_ranges (MutableSequence[google.cloud._storage_v2.types.ReadRange]): Optional. Provides a list of 0 or more (up to 100) ranges to read. If a single range is large enough to require multiple responses, they are @@ -1256,7 +1256,7 @@ class BidiReadObjectResponse(proto.Message): r"""Response message for BidiReadObject. Attributes: - object_data_ranges (MutableSequence[google.cloud.storage_v2.types.ObjectRangeData]): + object_data_ranges (MutableSequence[google.cloud._storage_v2.types.ObjectRangeData]): A portion of the object's data. The service **may** leave data empty for any given ReadResponse. This enables the service to inform the client that the request is still live @@ -1265,12 +1265,12 @@ class BidiReadObjectResponse(proto.Message): different read requests. Each ObjectRangeData entry will have a read_id set to the same value as the corresponding source read request. - metadata (google.cloud.storage_v2.types.Object): + metadata (google.cloud._storage_v2.types.Object): Metadata of the object whose media is being returned. Only populated in the first response in the stream and not populated when the stream is opened with a read handle. - read_handle (google.cloud.storage_v2.types.BidiReadHandle): + read_handle (google.cloud._storage_v2.types.BidiReadHandle): This field will be periodically refreshed, however it may not be set in every response. It allows the client to more efficiently open @@ -1304,7 +1304,7 @@ class BidiReadObjectRedirectedError(proto.Message): .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: - read_handle (google.cloud.storage_v2.types.BidiReadHandle): + read_handle (google.cloud._storage_v2.types.BidiReadHandle): The read handle for the redirected read. If set, the client may use this in the BidiReadObjectSpec when retrying the read @@ -1346,7 +1346,7 @@ class BidiWriteObjectRedirectedError(proto.Message): this string verbatim as the value. This field is a member of `oneof`_ ``_routing_token``. - write_handle (google.cloud.storage_v2.types.BidiWriteHandle): + write_handle (google.cloud._storage_v2.types.BidiWriteHandle): Opaque value describing a previous write. If set, the client must use this in an AppendObjectSpec first_message when retrying the write stream. If not set, clients may retry the @@ -1385,7 +1385,7 @@ class BidiReadObjectError(proto.Message): reads on the failed stream Attributes: - read_range_errors (MutableSequence[google.cloud.storage_v2.types.ReadRangeError]): + read_range_errors (MutableSequence[google.cloud._storage_v2.types.ReadRangeError]): The error code for each outstanding read_range """ @@ -1473,9 +1473,9 @@ class ObjectRangeData(proto.Message): r"""Contains data and metadata for a range of an object. Attributes: - checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + checksummed_data (google.cloud._storage_v2.types.ChecksummedData): A portion of the data for the object. - read_range (google.cloud.storage_v2.types.ReadRange): + read_range (google.cloud._storage_v2.types.ReadRange): The ReadRange describes the content being returned with read_id set to the corresponding ReadObjectRequest in the stream. Multiple ObjectRangeData messages may have the same @@ -1547,7 +1547,7 @@ class WriteObjectSpec(proto.Message): .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: - resource (google.cloud.storage_v2.types.Object): + resource (google.cloud._storage_v2.types.Object): Required. Destination object, including its name and its metadata. predefined_acl (str): @@ -1660,7 +1660,7 @@ class WriteObjectRequest(proto.Message): returned from a call to ``StartResumableWriteResponse``. This field is a member of `oneof`_ ``first_message``. - write_object_spec (google.cloud.storage_v2.types.WriteObjectSpec): + write_object_spec (google.cloud._storage_v2.types.WriteObjectSpec): For non-resumable uploads. Describes the overall upload, including the destination bucket and object name, preconditions, etc. @@ -1681,13 +1681,13 @@ class WriteObjectRequest(proto.Message): ``data`` chunks sent previously on this stream. An incorrect value will cause an error. - checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + checksummed_data (google.cloud._storage_v2.types.ChecksummedData): The data to insert. If a crc32c checksum is provided that doesn't match the checksum computed by the service, the request will fail. This field is a member of `oneof`_ ``data``. - object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. Checksums for the complete object. If the checksums computed by the service don't match the specified checksums the call will fail. May only be provided in the @@ -1700,7 +1700,7 @@ class WriteObjectRequest(proto.Message): error. For a non-resumable write (where the upload_id was not set in the first message), it is an error not to set this field in the final message of the stream. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. """ @@ -1759,7 +1759,7 @@ class WriteObjectResponse(proto.Message): upload has not finalized. This field is a member of `oneof`_ ``write_status``. - resource (google.cloud.storage_v2.types.Object): + resource (google.cloud._storage_v2.types.Object): A resource containing the metadata for the uploaded object. Only set if the upload has finalized. @@ -1819,7 +1819,7 @@ class AppendObjectSpec(proto.Message): if a BidiWriteObjectRedirectedError is returned. This field is a member of `oneof`_ ``_routing_token``. - write_handle (google.cloud.storage_v2.types.BidiWriteHandle): + write_handle (google.cloud._storage_v2.types.BidiWriteHandle): An optional write handle returned from a previous BidiWriteObjectResponse message or a BidiWriteObjectRedirectedError error. @@ -1881,13 +1881,13 @@ class BidiWriteObjectRequest(proto.Message): returned from a call to ``StartResumableWriteResponse``. This field is a member of `oneof`_ ``first_message``. - write_object_spec (google.cloud.storage_v2.types.WriteObjectSpec): + write_object_spec (google.cloud._storage_v2.types.WriteObjectSpec): For non-resumable uploads. Describes the overall upload, including the destination bucket and object name, preconditions, etc. This field is a member of `oneof`_ ``first_message``. - append_object_spec (google.cloud.storage_v2.types.AppendObjectSpec): + append_object_spec (google.cloud._storage_v2.types.AppendObjectSpec): For appendable uploads. Describes the object to append to. @@ -1907,13 +1907,13 @@ class BidiWriteObjectRequest(proto.Message): ``data`` chunks sent previously on this stream. An invalid value will cause an error. - checksummed_data (google.cloud.storage_v2.types.ChecksummedData): + checksummed_data (google.cloud._storage_v2.types.ChecksummedData): The data to insert. If a crc32c checksum is provided that doesn't match the checksum computed by the service, the request will fail. This field is a member of `oneof`_ ``data``. - object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. Checksums for the complete object. If the checksums computed by the service don't match the specified checksums the call will fail. May only be provided in the @@ -1945,7 +1945,7 @@ class BidiWriteObjectRequest(proto.Message): error. For a non-resumable write (where the upload_id was not set in the first message), it is an error not to set this field in the final message of the stream. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. """ @@ -2018,13 +2018,13 @@ class BidiWriteObjectResponse(proto.Message): upload has not finalized. This field is a member of `oneof`_ ``write_status``. - resource (google.cloud.storage_v2.types.Object): + resource (google.cloud._storage_v2.types.Object): A resource containing the metadata for the uploaded object. Only set if the upload has finalized. This field is a member of `oneof`_ ``write_status``. - write_handle (google.cloud.storage_v2.types.BidiWriteHandle): + write_handle (google.cloud._storage_v2.types.BidiWriteHandle): An optional write handle that will periodically be present in response messages. Clients should save it for later use in @@ -2197,7 +2197,7 @@ class QueryWriteStatusRequest(proto.Message): Required. The name of the resume token for the object whose write status is being requested. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. """ @@ -2232,7 +2232,7 @@ class QueryWriteStatusResponse(proto.Message): upload has not finalized. This field is a member of `oneof`_ ``write_status``. - resource (google.cloud.storage_v2.types.Object): + resource (google.cloud._storage_v2.types.Object): A resource containing the metadata for the uploaded object. Only set if the upload has finalized. @@ -2287,7 +2287,7 @@ class RewriteObjectRequest(proto.Message): specified, the request uses the destination bucket's default encryption key, if any, or else the Google-managed encryption key. - destination (google.cloud.storage_v2.types.Object): + destination (google.cloud._storage_v2.types.Object): Optional. Properties of the destination, post-rewrite object. The ``name``, ``bucket`` and ``kms_key`` fields must not be populated (these values are specified in the @@ -2398,10 +2398,10 @@ class RewriteObjectRequest(proto.Message): SHA256 hash of the encryption key used to encrypt the source object, if it was encrypted with a Customer-Supplied Encryption Key. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. - object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. The checksums of the complete object. This will be used to validate the destination object after rewriting. @@ -2534,7 +2534,7 @@ class RewriteResponse(proto.Message): continue copying data. This token is present in the response only when there is more data to copy. - resource (google.cloud.storage_v2.types.Object): + resource (google.cloud._storage_v2.types.Object): A resource containing the metadata for the copied-to object. This property is present in the response only when copying completes. @@ -2711,13 +2711,13 @@ class StartResumableWriteRequest(proto.Message): r"""Request message StartResumableWrite. Attributes: - write_object_spec (google.cloud.storage_v2.types.WriteObjectSpec): + write_object_spec (google.cloud._storage_v2.types.WriteObjectSpec): Required. Contains the information necessary to start a resumable write. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests related to an object. - object_checksums (google.cloud.storage_v2.types.ObjectChecksums): + object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. The checksums of the complete object. This is used to validate the uploaded object. For each upload, ``object_checksums`` can be provided when initiating a @@ -2768,7 +2768,7 @@ class UpdateObjectRequest(proto.Message): .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: - object_ (google.cloud.storage_v2.types.Object): + object_ (google.cloud._storage_v2.types.Object): Required. The object to update. The object's bucket and name fields are used to identify the object to update. If present, the @@ -2821,7 +2821,7 @@ class UpdateObjectRequest(proto.Message): accidentally reset the new field's value. Not specifying any fields is an error. - common_object_request_params (google.cloud.storage_v2.types.CommonObjectRequestParams): + common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. override_unlocked_retention (bool): @@ -3051,22 +3051,22 @@ class Bucket(proto.Message): bucket is created, it defaults to "DEFAULT". For more information, see https://cloud.google.com/storage/docs/availability-durability#turbo-replication. - acl (MutableSequence[google.cloud.storage_v2.types.BucketAccessControl]): + acl (MutableSequence[google.cloud._storage_v2.types.BucketAccessControl]): Optional. Access controls on the bucket. If iam_config.uniform_bucket_level_access is enabled on this bucket, requests to set, read, or modify acl is an error. - default_object_acl (MutableSequence[google.cloud.storage_v2.types.ObjectAccessControl]): + default_object_acl (MutableSequence[google.cloud._storage_v2.types.ObjectAccessControl]): Optional. Default access controls to apply to new objects when no ACL is provided. If iam_config.uniform_bucket_level_access is enabled on this bucket, requests to set, read, or modify acl is an error. - lifecycle (google.cloud.storage_v2.types.Bucket.Lifecycle): + lifecycle (google.cloud._storage_v2.types.Bucket.Lifecycle): Optional. The bucket's lifecycle config. See [https://developers.google.com/storage/docs/lifecycle]Lifecycle Management] for more information. create_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The creation time of the bucket. - cors (MutableSequence[google.cloud.storage_v2.types.Bucket.Cors]): + cors (MutableSequence[google.cloud._storage_v2.types.Bucket.Cors]): Optional. The bucket's [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing] (CORS) config. @@ -3097,26 +3097,26 @@ class Bucket(proto.Message): labels (MutableMapping[str, str]): Optional. User-provided labels, in key/value pairs. - website (google.cloud.storage_v2.types.Bucket.Website): + website (google.cloud._storage_v2.types.Bucket.Website): Optional. The bucket's website config, controlling how the service behaves when accessing bucket contents as a web site. See the [https://cloud.google.com/storage/docs/static-website][Static Website Examples] for more information. - versioning (google.cloud.storage_v2.types.Bucket.Versioning): + versioning (google.cloud._storage_v2.types.Bucket.Versioning): Optional. The bucket's versioning config. - logging (google.cloud.storage_v2.types.Bucket.Logging): + logging (google.cloud._storage_v2.types.Bucket.Logging): Optional. The bucket's logging config, which defines the destination bucket and name prefix (if any) for the current bucket's logs. - owner (google.cloud.storage_v2.types.Owner): + owner (google.cloud._storage_v2.types.Owner): Output only. The owner of the bucket. This is always the project team's owner group. - encryption (google.cloud.storage_v2.types.Bucket.Encryption): + encryption (google.cloud._storage_v2.types.Bucket.Encryption): Optional. Encryption config for a bucket. - billing (google.cloud.storage_v2.types.Bucket.Billing): + billing (google.cloud._storage_v2.types.Bucket.Billing): Optional. The bucket's billing config. - retention_policy (google.cloud.storage_v2.types.Bucket.RetentionPolicy): + retention_policy (google.cloud._storage_v2.types.Bucket.RetentionPolicy): Optional. The bucket's retention policy. The retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any @@ -3128,34 +3128,34 @@ class Bucket(proto.Message): for the lifetime of the bucket. Attempting to remove or decrease period of a locked retention policy will result in a PERMISSION_DENIED error. - iam_config (google.cloud.storage_v2.types.Bucket.IamConfig): + iam_config (google.cloud._storage_v2.types.Bucket.IamConfig): Optional. The bucket's IAM config. satisfies_pzs (bool): Optional. Reserved for future use. - custom_placement_config (google.cloud.storage_v2.types.Bucket.CustomPlacementConfig): + custom_placement_config (google.cloud._storage_v2.types.Bucket.CustomPlacementConfig): Optional. Configuration that, if present, specifies the data placement for a [https://cloud.google.com/storage/docs/locations#location-dr][configurable dual-region]. - autoclass (google.cloud.storage_v2.types.Bucket.Autoclass): + autoclass (google.cloud._storage_v2.types.Bucket.Autoclass): Optional. The bucket's Autoclass configuration. If there is no configuration, the Autoclass feature will be disabled and have no effect on the bucket. - hierarchical_namespace (google.cloud.storage_v2.types.Bucket.HierarchicalNamespace): + hierarchical_namespace (google.cloud._storage_v2.types.Bucket.HierarchicalNamespace): Optional. The bucket's hierarchical namespace configuration. If there is no configuration, the hierarchical namespace feature will be disabled and have no effect on the bucket. - soft_delete_policy (google.cloud.storage_v2.types.Bucket.SoftDeletePolicy): + soft_delete_policy (google.cloud._storage_v2.types.Bucket.SoftDeletePolicy): Optional. The bucket's soft delete policy. The soft delete policy prevents soft-deleted objects from being permanently deleted. - object_retention (google.cloud.storage_v2.types.Bucket.ObjectRetention): + object_retention (google.cloud._storage_v2.types.Bucket.ObjectRetention): Optional. The bucket's object retention configuration. Must be enabled before objects in the bucket may have retention configured. - ip_filter (google.cloud.storage_v2.types.Bucket.IpFilter): + ip_filter (google.cloud._storage_v2.types.Bucket.IpFilter): Optional. The bucket's IP filter configuration. @@ -3233,7 +3233,7 @@ class Encryption(proto.Message): will be used to encrypt objects inserted into this bucket, if no encryption method is specified. - google_managed_encryption_enforcement_config (google.cloud.storage_v2.types.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig): + google_managed_encryption_enforcement_config (google.cloud._storage_v2.types.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig): Optional. If omitted, then new objects with GMEK encryption-type is allowed. If set, then new objects created in this bucket must comply @@ -3242,7 +3242,7 @@ class Encryption(proto.Message): objects only. This field is a member of `oneof`_ ``_google_managed_encryption_enforcement_config``. - customer_managed_encryption_enforcement_config (google.cloud.storage_v2.types.Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig): + customer_managed_encryption_enforcement_config (google.cloud._storage_v2.types.Bucket.Encryption.CustomerManagedEncryptionEnforcementConfig): Optional. If omitted, then new objects with CMEK encryption-type is allowed. If set, then new objects created in this bucket must comply @@ -3251,7 +3251,7 @@ class Encryption(proto.Message): objects only. This field is a member of `oneof`_ ``_customer_managed_encryption_enforcement_config``. - customer_supplied_encryption_enforcement_config (google.cloud.storage_v2.types.Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig): + customer_supplied_encryption_enforcement_config (google.cloud._storage_v2.types.Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig): Optional. If omitted, then new objects with CSEK encryption-type is allowed. If set, then new objects created in this bucket must comply @@ -3397,7 +3397,7 @@ class IamConfig(proto.Message): r"""Bucket restriction options. Attributes: - uniform_bucket_level_access (google.cloud.storage_v2.types.Bucket.IamConfig.UniformBucketLevelAccess): + uniform_bucket_level_access (google.cloud._storage_v2.types.Bucket.IamConfig.UniformBucketLevelAccess): Optional. Bucket restriction options currently enforced on the bucket. public_access_prevention (str): @@ -3450,7 +3450,7 @@ class Lifecycle(proto.Message): https://cloud.google.com/storage/docs/lifecycle. Attributes: - rule (MutableSequence[google.cloud.storage_v2.types.Bucket.Lifecycle.Rule]): + rule (MutableSequence[google.cloud._storage_v2.types.Bucket.Lifecycle.Rule]): Optional. A lifecycle management rule, which is made of an action to take and the condition(s) under which the action will be @@ -3462,9 +3462,9 @@ class Rule(proto.Message): and a condition which will trigger that action. Attributes: - action (google.cloud.storage_v2.types.Bucket.Lifecycle.Rule.Action): + action (google.cloud._storage_v2.types.Bucket.Lifecycle.Rule.Action): Optional. The action to take. - condition (google.cloud.storage_v2.types.Bucket.Lifecycle.Rule.Condition): + condition (google.cloud._storage_v2.types.Bucket.Lifecycle.Rule.Condition): Optional. The condition(s) under which the action will be taken. """ @@ -3871,12 +3871,12 @@ class IpFilter(proto.Message): to a bucket.". This field is a member of `oneof`_ ``_mode``. - public_network_source (google.cloud.storage_v2.types.Bucket.IpFilter.PublicNetworkSource): + public_network_source (google.cloud._storage_v2.types.Bucket.IpFilter.PublicNetworkSource): Public IPs allowed to operate or access the bucket. This field is a member of `oneof`_ ``_public_network_source``. - vpc_network_sources (MutableSequence[google.cloud.storage_v2.types.Bucket.IpFilter.VpcNetworkSource]): + vpc_network_sources (MutableSequence[google.cloud._storage_v2.types.Bucket.IpFilter.VpcNetworkSource]): Optional. The list of network sources that are allowed to access operations on the bucket or the underlying objects. @@ -4188,7 +4188,7 @@ class BucketAccessControl(proto.Message): domain (str): Optional. The domain associated with the entity, if any. - project_team (google.cloud.storage_v2.types.ProjectTeam): + project_team (google.cloud._storage_v2.types.ProjectTeam): Optional. The project team associated with the entity, if any. """ @@ -4331,7 +4331,7 @@ class ObjectContexts(proto.Message): r"""All contexts of an object grouped by type. Attributes: - custom (MutableMapping[str, google.cloud.storage_v2.types.ObjectCustomContextPayload]): + custom (MutableMapping[str, google.cloud._storage_v2.types.ObjectCustomContextPayload]): Optional. User-defined object contexts. """ @@ -4426,7 +4426,7 @@ class Object(proto.Message): §5.2]. If omitted, and the object is accessible to all anonymous users, the default will be ``public, max-age=3600``. - acl (MutableSequence[google.cloud.storage_v2.types.ObjectAccessControl]): + acl (MutableSequence[google.cloud._storage_v2.types.ObjectAccessControl]): Optional. Access controls on the object. If iam_config.uniform_bucket_level_access is enabled on the parent bucket, requests to set, read, or modify acl is an @@ -4453,7 +4453,7 @@ class Object(proto.Message): Output only. Number of underlying components that make up this object. Components are accumulated by compose operations. - checksums (google.cloud.storage_v2.types.ObjectChecksums): + checksums (google.cloud._storage_v2.types.ObjectChecksums): Output only. Hashes for the data part of this object. This field is used for output only and will be silently ignored if provided in @@ -4505,7 +4505,7 @@ class Object(proto.Message): metadata (MutableMapping[str, str]): Optional. User-provided metadata, in key/value pairs. - contexts (google.cloud.storage_v2.types.ObjectContexts): + contexts (google.cloud._storage_v2.types.ObjectContexts): Optional. User-defined or system-defined object contexts. Each object context is a key-payload pair, where the key provides the @@ -4527,10 +4527,10 @@ class Object(proto.Message): will always be set to true or false. This field is a member of `oneof`_ ``_event_based_hold``. - owner (google.cloud.storage_v2.types.Owner): + owner (google.cloud._storage_v2.types.Owner): Output only. The owner of the object. This will always be the uploader of the object. - customer_encryption (google.cloud.storage_v2.types.CustomerEncryption): + customer_encryption (google.cloud._storage_v2.types.CustomerEncryption): Optional. Metadata of Customer-Supplied Encryption Key, if the object is encrypted by such a key. @@ -4554,7 +4554,7 @@ class Object(proto.Message): accessible. This field is a member of `oneof`_ ``_hard_delete_time``. - retention (google.cloud.storage_v2.types.Object.Retention): + retention (google.cloud._storage_v2.types.Object.Retention): Optional. Retention configuration of this object. May only be configured if the bucket has object retention enabled. @@ -4566,7 +4566,7 @@ class Retention(proto.Message): expires. Attributes: - mode (google.cloud.storage_v2.types.Object.Retention.Mode): + mode (google.cloud._storage_v2.types.Object.Retention.Mode): Optional. The mode of the Retention. retain_until_time (google.protobuf.timestamp_pb2.Timestamp): Optional. The timestamp that the object needs @@ -4812,7 +4812,7 @@ class ObjectAccessControl(proto.Message): domain (str): Optional. The domain associated with the entity, if any. - project_team (google.cloud.storage_v2.types.ProjectTeam): + project_team (google.cloud._storage_v2.types.ProjectTeam): Optional. The project team associated with the entity, if any. """ @@ -4860,7 +4860,7 @@ class ListObjectsResponse(proto.Message): r"""The result of a call to Objects.ListObjects Attributes: - objects (MutableSequence[google.cloud.storage_v2.types.Object]): + objects (MutableSequence[google.cloud._storage_v2.types.Object]): The list of items. prefixes (MutableSequence[str]): The list of prefixes of objects diff --git a/tests/unit/gapic/storage_v2/test_storage.py b/tests/unit/gapic/storage_v2/test_storage.py index 4869eba7f..e6344192b 100644 --- a/tests/unit/gapic/storage_v2/test_storage.py +++ b/tests/unit/gapic/storage_v2/test_storage.py @@ -47,11 +47,11 @@ from google.api_core import retry as retries from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError -from google.cloud.storage_v2.services.storage import StorageAsyncClient -from google.cloud.storage_v2.services.storage import StorageClient -from google.cloud.storage_v2.services.storage import pagers -from google.cloud.storage_v2.services.storage import transports -from google.cloud.storage_v2.types import storage +from google.cloud._storage_v2.services.storage import StorageAsyncClient +from google.cloud._storage_v2.services.storage import StorageClient +from google.cloud._storage_v2.services.storage import pagers +from google.cloud._storage_v2.services.storage import transports +from google.cloud._storage_v2.types import storage from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import options_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore @@ -950,7 +950,7 @@ def test_storage_client_client_options_credentials_file( def test_storage_client_client_options_from_dict(): with mock.patch( - "google.cloud.storage_v2.services.storage.transports.StorageGrpcTransport.__init__" + "google.cloud._storage_v2.services.storage.transports.StorageGrpcTransport.__init__" ) as grpc_transport: grpc_transport.return_value = None client = StorageClient(client_options={"api_endpoint": "squid.clam.whelk"}) @@ -10868,7 +10868,7 @@ def test_storage_base_transport_error(): def test_storage_base_transport(): # Instantiate the base transport. with mock.patch( - "google.cloud.storage_v2.services.storage.transports.StorageTransport.__init__" + "google.cloud._storage_v2.services.storage.transports.StorageTransport.__init__" ) as Transport: Transport.return_value = None transport = transports.StorageTransport( @@ -10924,7 +10924,7 @@ def test_storage_base_transport_with_credentials_file(): with mock.patch.object( google.auth, "load_credentials_from_file", autospec=True ) as load_creds, mock.patch( - "google.cloud.storage_v2.services.storage.transports.StorageTransport._prep_wrapped_messages" + "google.cloud._storage_v2.services.storage.transports.StorageTransport._prep_wrapped_messages" ) as Transport: Transport.return_value = None load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) @@ -10949,7 +10949,7 @@ def test_storage_base_transport_with_credentials_file(): def test_storage_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( - "google.cloud.storage_v2.services.storage.transports.StorageTransport._prep_wrapped_messages" + "google.cloud._storage_v2.services.storage.transports.StorageTransport._prep_wrapped_messages" ) as Transport: Transport.return_value = None adc.return_value = (ga_credentials.AnonymousCredentials(), None) From b4ce8dad8fc08be8d4c67fa3dc33c7867d7df822 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 2 Sep 2025 14:07:54 +0530 Subject: [PATCH 373/509] chore: add argparse to run samples as script (#1538) * add argparse so that the samples can be run as a a standalone script ```python python samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py --bucket_name --source_filename --destination_blob_name ``` --- ...sfer_manager_upload_chunks_concurrently.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py b/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py index 009f09648..a4abd13b9 100644 --- a/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py +++ b/samples/snippets/storage_transfer_manager_upload_chunks_concurrently.py @@ -11,6 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import argparse + # [START storage_transfer_manager_upload_chunks_concurrently] def upload_chunks_concurrently( @@ -54,4 +56,40 @@ def upload_chunks_concurrently( print(f"File {source_filename} uploaded to {destination_blob_name}.") +if __name__ == "__main__": + argparse = argparse.ArgumentParser( + description="Upload a file to GCS in chunks concurrently." + ) + argparse.add_argument( + "--bucket_name", help="The name of the GCS bucket to upload to." + ) + argparse.add_argument( + "--source_filename", help="The local path to the file to upload." + ) + argparse.add_argument( + "--destination_blob_name", help="The name of the object in GCS." + ) + argparse.add_argument( + "--chunk_size", + type=int, + default=32 * 1024 * 1024, + help="The size of each chunk in bytes (default: 32 MiB). The remote\ + service has a minimum of 5 MiB and a maximum of 5 GiB", + ) + argparse.add_argument( + "--workers", + type=int, + default=8, + help="The number of worker processes to use (default: 8).", + ) + args = argparse.parse_args() + upload_chunks_concurrently( + args.bucket_name, + args.source_filename, + args.destination_blob_name, + args.chunk_size, + args.workers, + ) + + # [END storage_transfer_manager_upload_chunks_concurrently] From c80d8207a8661b84c56cd66bb34de7b5704675b8 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:49:14 +0530 Subject: [PATCH 374/509] fix: GAPIC generation failed with 'Directory not empty' (#1542) --- owlbot.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/owlbot.py b/owlbot.py index 3829bf0d7..67b2369ce 100644 --- a/owlbot.py +++ b/owlbot.py @@ -16,6 +16,7 @@ import json from pathlib import Path +import shutil import synthtool as s from synthtool import gcp @@ -49,6 +50,11 @@ source_path = Path("google/cloud/storage_v2") renamed_path = Path("google/cloud/_storage_v2") + + # Remove the old _storage_v2 directory if it exists + if renamed_path.exists(): + shutil.rmtree(renamed_path) + if source_path.exists(): source_path.rename(renamed_path) From dc3756d00c75438a8e7097b2f9160dc47ca73e03 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:06:43 +0530 Subject: [PATCH 375/509] chore: Update gapic-generator-python to 1.26.2 (#1540) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: Update gapic-generator-python to 1.26.2 PiperOrigin-RevId: 802200836 Source-Link: https://github.com/googleapis/googleapis/commit/d300b151a973ce0425ae4ad07b3de957ca31bec6 Source-Link: https://github.com/googleapis/googleapis-gen/commit/a1ff0ae72ddcb68a259215d8c77661e2cdbb9b02 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYTFmZjBhZTcyZGRjYjY4YTI1OTIxNWQ4Yzc3NjYxZTJjZGJiOWIwMiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .../services/storage/async_client.py | 118 +++++++++--------- .../_storage_v2/services/storage/client.py | 118 +++++++++--------- .../services/storage/transports/grpc.py | 96 +++++++------- .../storage/transports/grpc_asyncio.py | 96 +++++++------- google/cloud/_storage_v2/types/storage.py | 96 +++++++------- 5 files changed, 262 insertions(+), 262 deletions(-) diff --git a/google/cloud/_storage_v2/services/storage/async_client.py b/google/cloud/_storage_v2/services/storage/async_client.py index 55234cd28..4244fa791 100644 --- a/google/cloud/_storage_v2/services/storage/async_client.py +++ b/google/cloud/_storage_v2/services/storage/async_client.py @@ -80,22 +80,22 @@ class StorageAsyncClient: Resources are named as follows: - - Projects are referred to as they are defined by the Resource - Manager API, using strings like ``projects/123456`` or - ``projects/my-string-id``. - - - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. - - - Objects are uniquely identified by their name along with the name - of the bucket they belong to, as separate strings in this API. - For example: - - ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. + + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. + + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. For + example: + + ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). """ _client: StorageClient @@ -1006,19 +1006,19 @@ async def sample_get_iam_policy(): constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM - documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** - :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` **YAML example:** - :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` For a description of IAM and its features, see the [IAM - documentation](\ https://cloud.google.com/iam/docs/). + documentation](https://cloud.google.com/iam/docs/). """ # Create or coerce a protobuf request object. @@ -1161,19 +1161,19 @@ async def sample_set_iam_policy(): constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM - documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** - :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` **YAML example:** - :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` For a description of IAM and its features, see the [IAM - documentation](\ https://cloud.google.com/iam/docs/). + documentation](https://cloud.google.com/iam/docs/). """ # Create or coerce a protobuf request object. @@ -2578,41 +2578,41 @@ async def write_object( explicitly by the client or due to a network error or an error response from the server), the client should do as follows: - - Check the result Status of the stream, to determine if - writing can be resumed on this stream or must be restarted - from scratch (by calling ``StartResumableWrite()``). The - resumable errors are DEADLINE_EXCEEDED, INTERNAL, and - UNAVAILABLE. For each case, the client should use binary - exponential backoff before retrying. Additionally, writes can - be resumed after RESOURCE_EXHAUSTED errors, but only after - taking appropriate measures, which may include reducing - aggregate send rate across clients and/or requesting a quota - increase for your project. - - If the call to ``WriteObject`` returns ``ABORTED``, that - indicates concurrent attempts to update the resumable write, - caused either by multiple racing clients or by a single - client where the previous request was timed out on the client - side but nonetheless reached the server. In this case the - client should take steps to prevent further concurrent writes - (e.g., increase the timeouts, stop using more than one - process to perform the upload, etc.), and then should follow - the steps below for resuming the upload. - - For resumable errors, the client should call - ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than - the returned ``persisted_size``; in this case, the service - will skip data at offsets that were already persisted - (without checking that it matches the previously written - data), and write only the data starting from the persisted - offset. Even though the data isn't written, it may still - incur a performance cost over resuming at the correct write - offset. This behavior can make client-side handling simpler - in some cases. - - Clients must only send data that is a multiple of 256 KiB per - message, unless the object is being finished with - ``finish_write`` set to ``true``. + - Check the result Status of the stream, to determine if writing + can be resumed on this stream or must be restarted from + scratch (by calling ``StartResumableWrite()``). The resumable + errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For + each case, the client should use binary exponential backoff + before retrying. Additionally, writes can be resumed after + RESOURCE_EXHAUSTED errors, but only after taking appropriate + measures, which may include reducing aggregate send rate + across clients and/or requesting a quota increase for your + project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single client + where the previous request was timed out on the client side + but nonetheless reached the server. In this case the client + should take steps to prevent further concurrent writes (e.g., + increase the timeouts, stop using more than one process to + perform the upload, etc.), and then should follow the steps + below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than the + returned ``persisted_size``; in this case, the service will + skip data at offsets that were already persisted (without + checking that it matches the previously written data), and + write only the data starting from the persisted offset. Even + though the data isn't written, it may still incur a + performance cost over resuming at the correct write offset. + This behavior can make client-side handling simpler in some + cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. The service will not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` diff --git a/google/cloud/_storage_v2/services/storage/client.py b/google/cloud/_storage_v2/services/storage/client.py index ae1087cf6..82596dcd2 100644 --- a/google/cloud/_storage_v2/services/storage/client.py +++ b/google/cloud/_storage_v2/services/storage/client.py @@ -120,22 +120,22 @@ class StorageClient(metaclass=StorageClientMeta): Resources are named as follows: - - Projects are referred to as they are defined by the Resource - Manager API, using strings like ``projects/123456`` or - ``projects/my-string-id``. - - - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. - - - Objects are uniquely identified by their name along with the name - of the bucket they belong to, as separate strings in this API. - For example: - - ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. + + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. + + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. For + example: + + ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). """ @staticmethod @@ -1432,19 +1432,19 @@ def sample_get_iam_policy(): constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM - documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** - :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` **YAML example:** - :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` For a description of IAM and its features, see the [IAM - documentation](\ https://cloud.google.com/iam/docs/). + documentation](https://cloud.google.com/iam/docs/). """ # Create or coerce a protobuf request object. @@ -1588,19 +1588,19 @@ def sample_set_iam_policy(): constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM - documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies). + documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** - :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` + :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \` **YAML example:** - :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` + :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \` For a description of IAM and its features, see the [IAM - documentation](\ https://cloud.google.com/iam/docs/). + documentation](https://cloud.google.com/iam/docs/). """ # Create or coerce a protobuf request object. @@ -2982,41 +2982,41 @@ def write_object( explicitly by the client or due to a network error or an error response from the server), the client should do as follows: - - Check the result Status of the stream, to determine if - writing can be resumed on this stream or must be restarted - from scratch (by calling ``StartResumableWrite()``). The - resumable errors are DEADLINE_EXCEEDED, INTERNAL, and - UNAVAILABLE. For each case, the client should use binary - exponential backoff before retrying. Additionally, writes can - be resumed after RESOURCE_EXHAUSTED errors, but only after - taking appropriate measures, which may include reducing - aggregate send rate across clients and/or requesting a quota - increase for your project. - - If the call to ``WriteObject`` returns ``ABORTED``, that - indicates concurrent attempts to update the resumable write, - caused either by multiple racing clients or by a single - client where the previous request was timed out on the client - side but nonetheless reached the server. In this case the - client should take steps to prevent further concurrent writes - (e.g., increase the timeouts, stop using more than one - process to perform the upload, etc.), and then should follow - the steps below for resuming the upload. - - For resumable errors, the client should call - ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than - the returned ``persisted_size``; in this case, the service - will skip data at offsets that were already persisted - (without checking that it matches the previously written - data), and write only the data starting from the persisted - offset. Even though the data isn't written, it may still - incur a performance cost over resuming at the correct write - offset. This behavior can make client-side handling simpler - in some cases. - - Clients must only send data that is a multiple of 256 KiB per - message, unless the object is being finished with - ``finish_write`` set to ``true``. + - Check the result Status of the stream, to determine if writing + can be resumed on this stream or must be restarted from + scratch (by calling ``StartResumableWrite()``). The resumable + errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For + each case, the client should use binary exponential backoff + before retrying. Additionally, writes can be resumed after + RESOURCE_EXHAUSTED errors, but only after taking appropriate + measures, which may include reducing aggregate send rate + across clients and/or requesting a quota increase for your + project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single client + where the previous request was timed out on the client side + but nonetheless reached the server. In this case the client + should take steps to prevent further concurrent writes (e.g., + increase the timeouts, stop using more than one process to + perform the upload, etc.), and then should follow the steps + below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than the + returned ``persisted_size``; in this case, the service will + skip data at offsets that were already persisted (without + checking that it matches the previously written data), and + write only the data starting from the persisted offset. Even + though the data isn't written, it may still incur a + performance cost over resuming at the correct write offset. + This behavior can make client-side handling simpler in some + cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. The service will not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc.py b/google/cloud/_storage_v2/services/storage/transports/grpc.py index 7ffe8465c..1738c3272 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc.py @@ -125,22 +125,22 @@ class StorageGrpcTransport(StorageTransport): Resources are named as follows: - - Projects are referred to as they are defined by the Resource - Manager API, using strings like ``projects/123456`` or - ``projects/my-string-id``. + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. - - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. - - Objects are uniquely identified by their name along with the name - of the bucket they belong to, as separate strings in this API. - For example: + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. For + example: - ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). This class defines the same methods as the primary client, so the primary client can load the underlying transport implementation @@ -887,41 +887,41 @@ def write_object( explicitly by the client or due to a network error or an error response from the server), the client should do as follows: - - Check the result Status of the stream, to determine if - writing can be resumed on this stream or must be restarted - from scratch (by calling ``StartResumableWrite()``). The - resumable errors are DEADLINE_EXCEEDED, INTERNAL, and - UNAVAILABLE. For each case, the client should use binary - exponential backoff before retrying. Additionally, writes can - be resumed after RESOURCE_EXHAUSTED errors, but only after - taking appropriate measures, which may include reducing - aggregate send rate across clients and/or requesting a quota - increase for your project. - - If the call to ``WriteObject`` returns ``ABORTED``, that - indicates concurrent attempts to update the resumable write, - caused either by multiple racing clients or by a single - client where the previous request was timed out on the client - side but nonetheless reached the server. In this case the - client should take steps to prevent further concurrent writes - (e.g., increase the timeouts, stop using more than one - process to perform the upload, etc.), and then should follow - the steps below for resuming the upload. - - For resumable errors, the client should call - ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than - the returned ``persisted_size``; in this case, the service - will skip data at offsets that were already persisted - (without checking that it matches the previously written - data), and write only the data starting from the persisted - offset. Even though the data isn't written, it may still - incur a performance cost over resuming at the correct write - offset. This behavior can make client-side handling simpler - in some cases. - - Clients must only send data that is a multiple of 256 KiB per - message, unless the object is being finished with - ``finish_write`` set to ``true``. + - Check the result Status of the stream, to determine if writing + can be resumed on this stream or must be restarted from + scratch (by calling ``StartResumableWrite()``). The resumable + errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For + each case, the client should use binary exponential backoff + before retrying. Additionally, writes can be resumed after + RESOURCE_EXHAUSTED errors, but only after taking appropriate + measures, which may include reducing aggregate send rate + across clients and/or requesting a quota increase for your + project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single client + where the previous request was timed out on the client side + but nonetheless reached the server. In this case the client + should take steps to prevent further concurrent writes (e.g., + increase the timeouts, stop using more than one process to + perform the upload, etc.), and then should follow the steps + below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than the + returned ``persisted_size``; in this case, the service will + skip data at offsets that were already persisted (without + checking that it matches the previously written data), and + write only the data starting from the persisted offset. Even + though the data isn't written, it may still incur a + performance cost over resuming at the correct write offset. + This behavior can make client-side handling simpler in some + cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. The service will not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py index fa2fa0e9d..c0cbc60cd 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py @@ -131,22 +131,22 @@ class StorageGrpcAsyncIOTransport(StorageTransport): Resources are named as follows: - - Projects are referred to as they are defined by the Resource - Manager API, using strings like ``projects/123456`` or - ``projects/my-string-id``. + - Projects are referred to as they are defined by the Resource + Manager API, using strings like ``projects/123456`` or + ``projects/my-string-id``. - - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. + - Buckets are named using string names of the form: + ``projects/{project}/buckets/{bucket}`` For globally unique + buckets, ``_`` may be substituted for the project. - - Objects are uniquely identified by their name along with the name - of the bucket they belong to, as separate strings in this API. - For example: + - Objects are uniquely identified by their name along with the name + of the bucket they belong to, as separate strings in this API. For + example: - ReadObjectRequest { bucket: 'projects/_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' + object: 'my-object' } Note that object names can contain ``/`` + characters, which are treated as any other character (no special + directory semantics). This class defines the same methods as the primary client, so the primary client can load the underlying transport implementation @@ -914,41 +914,41 @@ def write_object( explicitly by the client or due to a network error or an error response from the server), the client should do as follows: - - Check the result Status of the stream, to determine if - writing can be resumed on this stream or must be restarted - from scratch (by calling ``StartResumableWrite()``). The - resumable errors are DEADLINE_EXCEEDED, INTERNAL, and - UNAVAILABLE. For each case, the client should use binary - exponential backoff before retrying. Additionally, writes can - be resumed after RESOURCE_EXHAUSTED errors, but only after - taking appropriate measures, which may include reducing - aggregate send rate across clients and/or requesting a quota - increase for your project. - - If the call to ``WriteObject`` returns ``ABORTED``, that - indicates concurrent attempts to update the resumable write, - caused either by multiple racing clients or by a single - client where the previous request was timed out on the client - side but nonetheless reached the server. In this case the - client should take steps to prevent further concurrent writes - (e.g., increase the timeouts, stop using more than one - process to perform the upload, etc.), and then should follow - the steps below for resuming the upload. - - For resumable errors, the client should call - ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than - the returned ``persisted_size``; in this case, the service - will skip data at offsets that were already persisted - (without checking that it matches the previously written - data), and write only the data starting from the persisted - offset. Even though the data isn't written, it may still - incur a performance cost over resuming at the correct write - offset. This behavior can make client-side handling simpler - in some cases. - - Clients must only send data that is a multiple of 256 KiB per - message, unless the object is being finished with - ``finish_write`` set to ``true``. + - Check the result Status of the stream, to determine if writing + can be resumed on this stream or must be restarted from + scratch (by calling ``StartResumableWrite()``). The resumable + errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For + each case, the client should use binary exponential backoff + before retrying. Additionally, writes can be resumed after + RESOURCE_EXHAUSTED errors, but only after taking appropriate + measures, which may include reducing aggregate send rate + across clients and/or requesting a quota increase for your + project. + - If the call to ``WriteObject`` returns ``ABORTED``, that + indicates concurrent attempts to update the resumable write, + caused either by multiple racing clients or by a single client + where the previous request was timed out on the client side + but nonetheless reached the server. In this case the client + should take steps to prevent further concurrent writes (e.g., + increase the timeouts, stop using more than one process to + perform the upload, etc.), and then should follow the steps + below for resuming the upload. + - For resumable errors, the client should call + ``QueryWriteStatus()`` and then continue writing from the + returned ``persisted_size``. This may be less than the amount + of data the client previously sent. Note also that it is + acceptable to send data starting at an offset earlier than the + returned ``persisted_size``; in this case, the service will + skip data at offsets that were already persisted (without + checking that it matches the previously written data), and + write only the data starting from the persisted offset. Even + though the data isn't written, it may still incur a + performance cost over resuming at the correct write offset. + This behavior can make client-side handling simpler in some + cases. + - Clients must only send data that is a multiple of 256 KiB per + message, unless the object is being finished with + ``finish_write`` set to ``true``. The service will not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` diff --git a/google/cloud/_storage_v2/types/storage.py b/google/cloud/_storage_v2/types/storage.py index bee559a2f..6e4e01855 100644 --- a/google/cloud/_storage_v2/types/storage.py +++ b/google/cloud/_storage_v2/types/storage.py @@ -146,7 +146,7 @@ class GetBucketRequest(proto.Message): This field is a member of `oneof`_ ``_if_metageneration_not_match``. read_mask (google.protobuf.field_mask_pb2.FieldMask): - Mask specifying which fields to read. A "*" field may be + Mask specifying which fields to read. A "\*" field may be used to indicate all fields. If no mask is specified, will default to all fields. @@ -269,7 +269,7 @@ class ListBucketsRequest(proto.Message): mask is specified, will default to all fields except items.owner, items.acl, and items.default_object_acl. - - may be used to mean "all fields". + - may be used to mean "all fields". This field is a member of `oneof`_ ``_read_mask``. """ @@ -860,7 +860,7 @@ class ReadObjectRequest(proto.Message): specified, will default to all fields except metadata.owner and metadata.acl. - - may be used to mean "all fields". + - may be used to mean "all fields". This field is a member of `oneof`_ ``_read_mask``. """ @@ -975,7 +975,7 @@ class GetObjectRequest(proto.Message): specified, will default to all fields except metadata.acl and metadata.owner. - - may be used to mean "all fields". + - may be used to mean "all fields". This field is a member of `oneof`_ ``_read_mask``. restore_token (str): @@ -1142,10 +1142,10 @@ class BidiReadObjectSpec(proto.Message): specified, will default to all fields except metadata.owner and metadata.acl. - - may be used to mean "all fields". As per - https://google.aip.dev/161, this field is deprecated. As - an alternative, grpc metadata can be used: - https://cloud.google.com/apis/docs/system-parameters#definitions + - may be used to mean "all fields". As per + https://google.aip.dev/161, this field is deprecated. As + an alternative, grpc metadata can be used: + https://cloud.google.com/apis/docs/system-parameters#definitions This field is a member of `oneof`_ ``_read_mask``. read_handle (google.cloud._storage_v2.types.BidiReadHandle): @@ -2095,7 +2095,7 @@ class ListObjectsRequest(proto.Message): mask is specified, will default to all fields except items.acl and items.owner. - - may be used to mean "all fields". + - may be used to mean "all fields". This field is a member of `oneof`_ ``_read_mask``. lexicographic_start (str): @@ -3187,12 +3187,12 @@ class Cors(proto.Message): Optional. The list of Origins eligible to receive CORS response headers. See [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on - origins. Note: "*" is permitted in the list of origins, and + origins. Note: "\*" is permitted in the list of origins, and means "any Origin". method (MutableSequence[str]): Optional. The list of HTTP methods on which to include CORS response headers, (``GET``, ``OPTIONS``, ``POST``, etc) - Note: "*" is permitted in the list of methods, and means + Note: "\*" is permitted in the list of methods, and means "any method". response_header (MutableSequence[str]): Optional. The list of HTTP headers other than the @@ -4152,23 +4152,23 @@ class BucketAccessControl(proto.Message): Optional. The entity holding the permission, in one of the following forms: - - ``user-{userid}`` - - ``user-{email}`` - - ``group-{groupid}`` - - ``group-{email}`` - - ``domain-{domain}`` - - ``project-{team}-{projectnumber}`` - - ``project-{team}-{projectid}`` - - ``allUsers`` - - ``allAuthenticatedUsers`` Examples: - - The user ``liz@example.com`` would be - ``user-liz@example.com``. - - The group ``example@googlegroups.com`` would be - ``group-example@googlegroups.com`` - - All members of the Google Apps for Business domain - ``example.com`` would be ``domain-example.com`` For - project entities, ``project-{team}-{projectnumber}`` - format will be returned on response. + - ``user-{userid}`` + - ``user-{email}`` + - ``group-{groupid}`` + - ``group-{email}`` + - ``domain-{domain}`` + - ``project-{team}-{projectnumber}`` + - ``project-{team}-{projectid}`` + - ``allUsers`` + - ``allAuthenticatedUsers`` Examples: + - The user ``liz@example.com`` would be + ``user-liz@example.com``. + - The group ``example@googlegroups.com`` would be + ``group-example@googlegroups.com`` + - All members of the Google Apps for Business domain + ``example.com`` would be ``domain-example.com`` For + project entities, ``project-{team}-{projectnumber}`` + format will be returned on response. entity_alt (str): Output only. The alternative entity format, if exists. For project entities, ``project-{team}-{projectid}`` format will @@ -4767,32 +4767,32 @@ class ObjectAccessControl(proto.Message): Optional. The access permission for the entity. One of the following values: - - ``READER`` - - ``WRITER`` - - ``OWNER`` + - ``READER`` + - ``WRITER`` + - ``OWNER`` id (str): Optional. The ID of the access-control entry. entity (str): Optional. The entity holding the permission, in one of the following forms: - - ``user-{userid}`` - - ``user-{email}`` - - ``group-{groupid}`` - - ``group-{email}`` - - ``domain-{domain}`` - - ``project-{team}-{projectnumber}`` - - ``project-{team}-{projectid}`` - - ``allUsers`` - - ``allAuthenticatedUsers`` Examples: - - The user ``liz@example.com`` would be - ``user-liz@example.com``. - - The group ``example@googlegroups.com`` would be - ``group-example@googlegroups.com``. - - All members of the Google Apps for Business domain - ``example.com`` would be ``domain-example.com``. For - project entities, ``project-{team}-{projectnumber}`` - format will be returned on response. + - ``user-{userid}`` + - ``user-{email}`` + - ``group-{groupid}`` + - ``group-{email}`` + - ``domain-{domain}`` + - ``project-{team}-{projectnumber}`` + - ``project-{team}-{projectid}`` + - ``allUsers`` + - ``allAuthenticatedUsers`` Examples: + - The user ``liz@example.com`` would be + ``user-liz@example.com``. + - The group ``example@googlegroups.com`` would be + ``group-example@googlegroups.com``. + - All members of the Google Apps for Business domain + ``example.com`` would be ``domain-example.com``. For + project entities, ``project-{team}-{projectnumber}`` + format will be returned on response. entity_alt (str): Output only. The alternative entity format, if exists. For project entities, ``project-{team}-{projectid}`` format will From 5674587f2aa347ec2787f2bc1e847eaa294bc1ca Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:58:48 +0530 Subject: [PATCH 376/509] feat(experimental): Add grpc client (#1533) * feat: Add grpc client * add an option to configure direct path * fix lint errors * move the files to _experimental folder * move the test file under tests/unit * fix patch errors * update the imports for _storage_v2 * change the default directpath value to True * add getter for grpc_client * resolve comments * add more tests * minor change * adding helper function for credentials --- .../storage/_experimental/grpc_client.py | 122 ++++++++++ tests/unit/test_grpc_client.py | 208 ++++++++++++++++++ 2 files changed, 330 insertions(+) create mode 100644 google/cloud/storage/_experimental/grpc_client.py create mode 100644 tests/unit/test_grpc_client.py diff --git a/google/cloud/storage/_experimental/grpc_client.py b/google/cloud/storage/_experimental/grpc_client.py new file mode 100644 index 000000000..7a739b7b7 --- /dev/null +++ b/google/cloud/storage/_experimental/grpc_client.py @@ -0,0 +1,122 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A client for interacting with Google Cloud Storage using the gRPC API.""" + +from google.cloud.client import ClientWithProject +from google.cloud import _storage_v2 as storage_v2 + +_marker = object() + + +class GrpcClient(ClientWithProject): + """A client for interacting with Google Cloud Storage using the gRPC API. + + :type project: str or None + :param project: The project which the client acts on behalf of. If not + passed, falls back to the default inferred from the + environment. + + :type credentials: :class:`~google.auth.credentials.Credentials` + :param credentials: (Optional) The OAuth2 Credentials to use for this + client. If not passed, falls back to the default + inferred from the environment. + + :type client_info: :class:`~google.api_core.client_info.ClientInfo` + :param client_info: + The client info used to send a user-agent string along with API + requests. If ``None``, then default info will be used. Generally, + you only need to set this if you're developing your own library + or partner tool. + + :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` + :param client_options: (Optional) Client options used to set user options + on the client. A non-default universe domain or API endpoint should be + set through client_options. + + :type api_key: string + :param api_key: + (Optional) An API key. Mutually exclusive with any other credentials. + This parameter is an alias for setting `client_options.api_key` and + will supersede any API key set in the `client_options` parameter. + + :type attempt_direct_path: bool + :param attempt_direct_path: + (Optional) Whether to attempt to use DirectPath for gRPC connections. + This provides a direct, unproxied connection to GCS for lower latency + and higher throughput, and is highly recommended when running on Google + Cloud infrastructure. Defaults to ``True``. + """ + + def __init__( + self, + project=_marker, + credentials=None, + client_info=None, + client_options=None, + *, + api_key=None, + attempt_direct_path=True, + ): + super(GrpcClient, self).__init__(project=project, credentials=credentials) + + if isinstance(client_options, dict): + if api_key: + client_options["api_key"] = api_key + elif client_options is None: + client_options = {} if not api_key else {"api_key": api_key} + elif api_key: + client_options.api_key = api_key + + self._grpc_client = self._create_gapic_client( + credentials=credentials, + client_info=client_info, + client_options=client_options, + attempt_direct_path=attempt_direct_path, + ) + + def _create_gapic_client( + self, + credentials=None, + client_info=None, + client_options=None, + attempt_direct_path=True, + ): + """Creates and configures the low-level GAPIC `storage_v2` client.""" + transport_cls = storage_v2.StorageClient.get_transport_class("grpc") + + channel = transport_cls.create_channel(attempt_direct_path=attempt_direct_path) + + transport = transport_cls(credentials=credentials, channel=channel) + + return storage_v2.StorageClient( + credentials=credentials, + transport=transport, + client_info=client_info, + client_options=client_options, + ) + + @property + def grpc_client(self): + """The underlying gRPC client. + + This property gives users direct access to the `storage_v2.StorageClient` + instance. This can be useful for accessing + newly added or experimental RPCs that are not yet exposed through + the high-level GrpcClient. + + Returns: + google.cloud.storage_v2.StorageClient: The configured GAPIC client. + """ + return self._grpc_client diff --git a/tests/unit/test_grpc_client.py b/tests/unit/test_grpc_client.py new file mode 100644 index 000000000..9eca1b280 --- /dev/null +++ b/tests/unit/test_grpc_client.py @@ -0,0 +1,208 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest import mock +from google.auth import credentials as auth_credentials +from google.api_core import client_options as client_options_lib + + +def _make_credentials(spec=None): + if spec is None: + return mock.Mock(spec=auth_credentials.Credentials) + return mock.Mock(spec=spec) + + +class TestGrpcClient(unittest.TestCase): + @mock.patch("google.cloud.client.ClientWithProject.__init__") + @mock.patch("google.cloud._storage_v2.StorageClient") + def test_constructor_defaults_and_options( + self, mock_storage_client, mock_base_client + ): + from google.cloud.storage._experimental import grpc_client + + mock_transport_cls = mock.MagicMock() + mock_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials(spec=["_base", "_get_project_id"]) + mock_client_info = mock.Mock() + client_options_dict = {"api_endpoint": "test.endpoint"} + + mock_base_instance = mock_base_client.return_value + mock_base_instance._credentials = mock_creds + + client = grpc_client.GrpcClient( + project="test-project", + credentials=mock_creds, + client_info=mock_client_info, + client_options=client_options_dict, + ) + + # 1. Assert that the base class was initialized correctly. + mock_base_client.assert_called_once_with( + project="test-project", credentials=mock_creds + ) + + # 2. Assert DirectPath is ON by default. + mock_storage_client.get_transport_class.assert_called_once_with("grpc") + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=True + ) + + # 3. Assert the GAPIC client was created with the correct options. + mock_transport = mock_transport_cls.return_value + mock_storage_client.assert_called_once_with( + credentials=mock_creds, + transport=mock_transport, + client_info=mock_client_info, + client_options=client_options_dict, + ) + + # 4. Assert the client instance holds the mocked GAPIC client. + self.assertIs(client.grpc_client, mock_storage_client.return_value) + + @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud._storage_v2.StorageClient") + def test_constructor_disables_direct_path( + self, mock_storage_client, mock_base_client + ): + from google.cloud.storage._experimental import grpc_client + + mock_transport_cls = mock.MagicMock() + mock_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials() + mock_base_instance = mock_base_client.return_value + mock_base_instance._credentials = mock_creds + + grpc_client.GrpcClient( + project="test-project", + credentials=mock_creds, + attempt_direct_path=False, + ) + + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=False + ) + + @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud._storage_v2.StorageClient") + def test_constructor_initialize_with_api_key( + self, mock_storage_client, mock_base_client + ): + from google.cloud.storage._experimental import grpc_client + + mock_transport_cls = mock.MagicMock() + mock_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials() + mock_creds.project_id = None + + mock_base_instance = mock_base_client.return_value + mock_base_instance._credentials = mock_creds + + # Instantiate with just the api_key. + grpc_client.GrpcClient( + project="test-project", credentials=mock_creds, api_key="test-api-key" + ) + + # Assert that the GAPIC client was called with client_options + # that contains the api_key. + mock_transport = mock_transport_cls.return_value + mock_storage_client.assert_called_once_with( + credentials=mock_creds, + transport=mock_transport, + client_info=None, + client_options={"api_key": "test-api-key"}, + ) + + @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud._storage_v2.StorageClient") + def test_grpc_client_property(self, mock_storage_client, mock_base_client): + from google.cloud.storage._experimental import grpc_client + + mock_creds = _make_credentials() + mock_base_client.return_value._credentials = mock_creds + + client = grpc_client.GrpcClient(project="test-project", credentials=mock_creds) + + retrieved_client = client.grpc_client + + self.assertIs(retrieved_client, mock_storage_client.return_value) + + @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud._storage_v2.StorageClient") + def test_constructor_with_api_key_and_client_options( + self, mock_storage_client, mock_base_client + ): + from google.cloud.storage._experimental import grpc_client + + mock_transport_cls = mock.MagicMock() + mock_storage_client.get_transport_class.return_value = mock_transport_cls + mock_transport = mock_transport_cls.return_value + + mock_creds = _make_credentials() + mock_base_instance = mock_base_client.return_value + mock_base_instance._credentials = mock_creds + + client_options_obj = client_options_lib.ClientOptions( + api_endpoint="test.endpoint" + ) + self.assertIsNone(client_options_obj.api_key) + + grpc_client.GrpcClient( + project="test-project", + credentials=mock_creds, + client_options=client_options_obj, + api_key="new-test-key", + ) + + mock_storage_client.assert_called_once_with( + credentials=mock_creds, + transport=mock_transport, + client_info=None, + client_options=client_options_obj, + ) + self.assertEqual(client_options_obj.api_key, "new-test-key") + + @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud._storage_v2.StorageClient") + def test_constructor_with_api_key_and_dict_options( + self, mock_storage_client, mock_base_client + ): + from google.cloud.storage._experimental import grpc_client + + mock_creds = _make_credentials() + mock_base_instance = mock_base_client.return_value + mock_base_instance._credentials = mock_creds + mock_transport_cls = mock.MagicMock() + mock_storage_client.get_transport_class.return_value = mock_transport_cls + mock_transport = mock_transport_cls.return_value + + client_options_dict = {"api_endpoint": "test.endpoint"} + + grpc_client.GrpcClient( + project="test-project", + credentials=mock_creds, + client_options=client_options_dict, + api_key="new-test-key", + ) + + expected_options = { + "api_endpoint": "test.endpoint", + "api_key": "new-test-key", + } + mock_storage_client.assert_called_once_with( + credentials=mock_creds, + transport=mock_transport, + client_info=None, + client_options=expected_options, + ) From ac57b8d819a49aef0ed0cb5bb630bf11012f43e3 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:46:51 +0530 Subject: [PATCH 377/509] feat(experimental): add async grpc client (#1537) * feat(experimental): add async grpc client * minor changes * remove unused import * update the imports for _storage_v2 * change the default directpath value to True * add more comprehensive unit tests * adding helper methods --- .../_experimental/async_grpc_client.py | 89 +++++++++++++++++++ tests/unit/test_async_grpc_client.py | 85 ++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 google/cloud/storage/_experimental/async_grpc_client.py create mode 100644 tests/unit/test_async_grpc_client.py diff --git a/google/cloud/storage/_experimental/async_grpc_client.py b/google/cloud/storage/_experimental/async_grpc_client.py new file mode 100644 index 000000000..e6546908d --- /dev/null +++ b/google/cloud/storage/_experimental/async_grpc_client.py @@ -0,0 +1,89 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""An async client for interacting with Google Cloud Storage using the gRPC API.""" + +from google.cloud import _storage_v2 as storage_v2 + + +class AsyncGrpcClient: + """An asynchronous client for interacting with Google Cloud Storage using the gRPC API. + + :type credentials: :class:`~google.auth.credentials.Credentials` + :param credentials: (Optional) The OAuth2 Credentials to use for this + client. If not passed, falls back to the default + inferred from the environment. + + :type client_info: :class:`~google.api_core.client_info.ClientInfo` + :param client_info: + The client info used to send a user-agent string along with API + requests. If ``None``, then default info will be used. + + :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` + :param client_options: (Optional) Client options used to set user options + on the client. + + :type attempt_direct_path: bool + :param attempt_direct_path: + (Optional) Whether to attempt to use DirectPath for gRPC connections. + Defaults to ``True``. + """ + + def __init__( + self, + credentials=None, + client_info=None, + client_options=None, + *, + attempt_direct_path=True, + ): + self._grpc_client = self._create_async_grpc_client( + credentials=credentials, + client_info=client_info, + client_options=client_options, + attempt_direct_path=attempt_direct_path, + ) + + def _create_async_grpc_client( + self, + credentials=None, + client_info=None, + client_options=None, + attempt_direct_path=True, + ): + transport_cls = storage_v2.StorageAsyncClient.get_transport_class( + "grpc_asyncio" + ) + channel = transport_cls.create_channel(attempt_direct_path=attempt_direct_path) + transport = transport_cls(credentials=credentials, channel=channel) + + return storage_v2.StorageAsyncClient( + credentials=credentials, + transport=transport, + client_info=client_info, + client_options=client_options, + ) + + @property + def grpc_client(self): + """The underlying gRPC client. + + This property gives users direct access to the `_storage_v2.StorageAsyncClient` + instance. This can be useful for accessing + newly added or experimental RPCs that are not yet exposed through + the high-level GrpcClient. + Returns: + google.cloud._storage_v2.StorageAsyncClient: The configured GAPIC client. + """ + return self._grpc_client diff --git a/tests/unit/test_async_grpc_client.py b/tests/unit/test_async_grpc_client.py new file mode 100644 index 000000000..322772f8d --- /dev/null +++ b/tests/unit/test_async_grpc_client.py @@ -0,0 +1,85 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest import mock +from google.auth import credentials as auth_credentials + + +def _make_credentials(spec=None): + if spec is None: + return mock.Mock(spec=auth_credentials.Credentials) + return mock.Mock(spec=spec) + + +class TestAsyncGrpcClient(unittest.TestCase): + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + def test_constructor_default_options(self, mock_async_storage_client): + from google.cloud.storage._experimental import async_grpc_client + + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials() + + async_grpc_client.AsyncGrpcClient(credentials=mock_creds) + + mock_async_storage_client.get_transport_class.assert_called_once_with( + "grpc_asyncio" + ) + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=True + ) + mock_channel = mock_transport_cls.create_channel.return_value + mock_transport_cls.assert_called_once_with( + credentials=mock_creds, channel=mock_channel + ) + mock_transport = mock_transport_cls.return_value + mock_async_storage_client.assert_called_once_with( + credentials=mock_creds, + transport=mock_transport, + client_options=None, + client_info=None, + ) + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + def test_constructor_disables_directpath(self, mock_async_storage_client): + from google.cloud.storage._experimental import async_grpc_client + + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials() + + async_grpc_client.AsyncGrpcClient( + credentials=mock_creds, attempt_direct_path=False + ) + + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=False + ) + mock_channel = mock_transport_cls.create_channel.return_value + mock_transport_cls.assert_called_once_with( + credentials=mock_creds, channel=mock_channel + ) + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + def test_grpc_client_property(self, mock_async_storage_client): + from google.cloud.storage._experimental import async_grpc_client + + mock_creds = _make_credentials() + + client = async_grpc_client.AsyncGrpcClient(credentials=mock_creds) + + retrieved_client = client.grpc_client + + self.assertIs(retrieved_client, mock_async_storage_client.return_value) From fd8e9119d81ea6b53e9af591d5d464c91b263c51 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 16:02:38 +0530 Subject: [PATCH 378/509] chore(main): release 3.4.0 (#1543) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 766bbabe3..727a3a8cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.4.0](https://github.com/googleapis/python-storage/compare/v3.3.1...v3.4.0) (2025-09-15) + + +### Features + +* **experimental:** Add async grpc client ([#1537](https://github.com/googleapis/python-storage/issues/1537)) ([ac57b8d](https://github.com/googleapis/python-storage/commit/ac57b8d819a49aef0ed0cb5bb630bf11012f43e3)) +* **experimental:** Add grpc client ([#1533](https://github.com/googleapis/python-storage/issues/1533)) ([5674587](https://github.com/googleapis/python-storage/commit/5674587f2aa347ec2787f2bc1e847eaa294bc1ca)) + + +### Bug Fixes + +* GAPIC generation failed with 'Directory not empty' ([#1542](https://github.com/googleapis/python-storage/issues/1542)) ([c80d820](https://github.com/googleapis/python-storage/commit/c80d8207a8661b84c56cd66bb34de7b5704675b8)) + ## [3.3.1](https://github.com/googleapis/python-storage/compare/v3.3.0...v3.3.1) (2025-08-25) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index a5a77c35d..6b822f0c1 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.3.1" +__version__ = "3.4.0" From aca40f5429a54e82ea79a471fc127a314df7efe7 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 17 Sep 2025 10:40:18 +0530 Subject: [PATCH 379/509] chore: move async files into async folder (#1544) --- .../_experimental/{ => asyncio}/async_grpc_client.py | 0 tests/unit/{ => asyncio}/test_async_grpc_client.py | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename google/cloud/storage/_experimental/{ => asyncio}/async_grpc_client.py (100%) rename tests/unit/{ => asyncio}/test_async_grpc_client.py (92%) diff --git a/google/cloud/storage/_experimental/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py similarity index 100% rename from google/cloud/storage/_experimental/async_grpc_client.py rename to google/cloud/storage/_experimental/asyncio/async_grpc_client.py diff --git a/tests/unit/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py similarity index 92% rename from tests/unit/test_async_grpc_client.py rename to tests/unit/asyncio/test_async_grpc_client.py index 322772f8d..250d85522 100644 --- a/tests/unit/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -26,7 +26,7 @@ def _make_credentials(spec=None): class TestAsyncGrpcClient(unittest.TestCase): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_default_options(self, mock_async_storage_client): - from google.cloud.storage._experimental import async_grpc_client + from google.cloud.storage._experimental.asyncio import async_grpc_client mock_transport_cls = mock.MagicMock() mock_async_storage_client.get_transport_class.return_value = mock_transport_cls @@ -54,7 +54,7 @@ def test_constructor_default_options(self, mock_async_storage_client): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_disables_directpath(self, mock_async_storage_client): - from google.cloud.storage._experimental import async_grpc_client + from google.cloud.storage._experimental.asyncio import async_grpc_client mock_transport_cls = mock.MagicMock() mock_async_storage_client.get_transport_class.return_value = mock_transport_cls @@ -74,7 +74,7 @@ def test_constructor_disables_directpath(self, mock_async_storage_client): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_grpc_client_property(self, mock_async_storage_client): - from google.cloud.storage._experimental import async_grpc_client + from google.cloud.storage._experimental.asyncio import async_grpc_client mock_creds = _make_credentials() From 8b988ade0aae184f6404ac85391bc305e8dd1d94 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 18 Sep 2025 12:35:52 +0530 Subject: [PATCH 380/509] feat: Add async bidiRpc files in python-storage (#1545) * Add async bidiRpc files in python-storage these files will be removed once https://github.com/googleapis/python-api-core/pull/836 gets submitted * fix import path for bidi_base --- .../_experimental/asyncio/bidi_async.py | 230 +++++++++++++ .../_experimental/asyncio/bidi_base.py | 80 +++++ tests/unit/asyncio/test_bidi_async.py | 310 ++++++++++++++++++ 3 files changed, 620 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/bidi_async.py create mode 100644 google/cloud/storage/_experimental/asyncio/bidi_base.py create mode 100644 tests/unit/asyncio/test_bidi_async.py diff --git a/google/cloud/storage/_experimental/asyncio/bidi_async.py b/google/cloud/storage/_experimental/asyncio/bidi_async.py new file mode 100644 index 000000000..8c5e58fd0 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/bidi_async.py @@ -0,0 +1,230 @@ +# Copyright 2025, Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Asynchronous bi-directional streaming RPC helpers.""" + +import asyncio +import logging + +from google.api_core import exceptions +from google.cloud.storage._experimental.asyncio.bidi_base import BidiRpcBase + +_LOGGER = logging.getLogger(__name__) + + +class _AsyncRequestQueueGenerator: + """_AsyncRequestQueueGenerator is a helper class for sending asynchronous + requests to a gRPC stream from a Queue. + + This generator takes asynchronous requests off a given queue and yields them + to gRPC. + + This helper is useful when you have an indeterminate, indefinite, or + otherwise open-ended set of requests to send through a request-streaming + (or bidirectional) RPC. + + The reason this is necessary + + is because it's let's user have control on the when they would want to + send requests proto messages instead of sending all of them initilally. + + This is achieved via asynchronous queue (asyncio.Queue), + gRPC awaits until there's a message in the queue. + + Finally, it allows for retrying without swapping queues because if it does + pull an item off the queue when the RPC is inactive, it'll immediately put + it back and then exit. This is necessary because yielding the item in this + case will cause gRPC to discard it. In practice, this means that the order + of messages is not guaranteed. If such a thing is necessary it would be + easy to use a priority queue. + + Example:: + + requests = _AsyncRequestQueueGenerator(q) + call = await stub.StreamingRequest(requests) + requests.call = call + + async for response in call: + print(response) + await q.put(...) + + Args: + queue (asyncio.Queue): The request queue. + initial_request (Union[protobuf.Message, + Callable[[], protobuf.Message]]): The initial request to + yield. This is done independently of the request queue to allow for + easily restarting streams that require some initial configuration + request. + """ + + def __init__(self, queue: asyncio.Queue, initial_request=None): + self._queue = queue + self._initial_request = initial_request + self.call = None + + def _is_active(self): + """ + Returns true if the call is not set or not completed. + """ + return self.call is None or not self.call.done() + + async def __aiter__(self): + if self._initial_request is not None: + if callable(self._initial_request): + yield self._initial_request() + else: + yield self._initial_request + + while True: + item = await self._queue.get() + + # The consumer explicitly sent "None", indicating that the request + # should end. + if item is None: + _LOGGER.debug("Cleanly exiting request generator.") + return + + if not self._is_active(): + # We have an item, but the call is closed. We should put the + # item back on the queue so that the next call can consume it. + await self._queue.put(item) + _LOGGER.debug( + "Inactive call, replacing item on queue and exiting " + "request generator." + ) + return + + yield item + + +class AsyncBidiRpc(BidiRpcBase): + """A helper for consuming a async bi-directional streaming RPC. + + This maps gRPC's built-in interface which uses a request iterator and a + response iterator into a socket-like :func:`send` and :func:`recv`. This + is a more useful pattern for long-running or asymmetric streams (streams + where there is not a direct correlation between the requests and + responses). + + Example:: + + initial_request = example_pb2.StreamingRpcRequest( + setting='example') + rpc = AsyncBidiRpc( + stub.StreamingRpc, + initial_request=initial_request, + metadata=[('name', 'value')] + ) + + await rpc.open() + + while rpc.is_active: + print(await rpc.recv()) + await rpc.send(example_pb2.StreamingRpcRequest( + data='example')) + + This does *not* retry the stream on errors. See :class:`AsyncResumableBidiRpc`. + + Args: + start_rpc (grpc.aio.StreamStreamMultiCallable): The gRPC method used to + start the RPC. + initial_request (Union[protobuf.Message, + Callable[[], protobuf.Message]]): The initial request to + yield. This is useful if an initial request is needed to start the + stream. + metadata (Sequence[Tuple(str, str)]): RPC metadata to include in + the request. + """ + + def _create_queue(self): + """Create a queue for requests.""" + return asyncio.Queue() + + async def open(self): + """Opens the stream.""" + if self.is_active: + raise ValueError("Can not open an already open stream.") + + request_generator = _AsyncRequestQueueGenerator( + self._request_queue, initial_request=self._initial_request + ) + try: + call = await self._start_rpc(request_generator, metadata=self._rpc_metadata) + except exceptions.GoogleAPICallError as exc: + # The original `grpc.RpcError` (which is usually also a `grpc.Call`) is + # available from the ``response`` property on the mapped exception. + self._on_call_done(exc.response) + raise + + request_generator.call = call + + # TODO: api_core should expose the future interface for wrapped + # callables as well. + if hasattr(call, "_wrapped"): # pragma: NO COVER + call._wrapped.add_done_callback(self._on_call_done) + else: + call.add_done_callback(self._on_call_done) + + self._request_generator = request_generator + self.call = call + + async def close(self): + """Closes the stream.""" + if self.call is None: + return + + await self._request_queue.put(None) + self.call.cancel() + self._request_generator = None + self._initial_request = None + self._callbacks = [] + # Don't set self.call to None. Keep it around so that send/recv can + # raise the error. + + async def send(self, request): + """Queue a message to be sent on the stream. + + If the underlying RPC has been closed, this will raise. + + Args: + request (protobuf.Message): The request to send. + """ + if self.call is None: + raise ValueError("Can not send() on an RPC that has never been opened.") + + # Don't use self.is_active(), as ResumableBidiRpc will overload it + # to mean something semantically different. + if not self.call.done(): + await self._request_queue.put(request) + else: + # calling read should cause the call to raise. + await self.call.read() + + async def recv(self): + """Wait for a message to be returned from the stream. + + If the underlying RPC has been closed, this will raise. + + Returns: + protobuf.Message: The received message. + """ + if self.call is None: + raise ValueError("Can not recv() on an RPC that has never been opened.") + + return await self.call.read() + + @property + def is_active(self): + """bool: True if this stream is currently open and active.""" + return self.call is not None and not self.call.done() diff --git a/google/cloud/storage/_experimental/asyncio/bidi_base.py b/google/cloud/storage/_experimental/asyncio/bidi_base.py new file mode 100644 index 000000000..195e35750 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/bidi_base.py @@ -0,0 +1,80 @@ +# Copyright 2025, Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# You may obtain a copy of the License at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Base class for bi-directional streaming RPC helpers.""" + + +class BidiRpcBase: + """A base class for consuming a bi-directional streaming RPC. + + This maps gRPC's built-in interface which uses a request iterator and a + response iterator into a socket-like :func:`send` and :func:`recv`. This + is a more useful pattern for long-running or asymmetric streams (streams + where there is not a direct correlation between the requests and + responses). + + This does *not* retry the stream on errors. + + Args: + start_rpc (Union[grpc.StreamStreamMultiCallable, + grpc.aio.StreamStreamMultiCallable]): The gRPC method used + to start the RPC. + initial_request (Union[protobuf.Message, + Callable[[], protobuf.Message]]): The initial request to + yield. This is useful if an initial request is needed to start the + stream. + metadata (Sequence[Tuple(str, str)]): RPC metadata to include in + the request. + """ + + def __init__(self, start_rpc, initial_request=None, metadata=None): + self._start_rpc = start_rpc + self._initial_request = initial_request + self._rpc_metadata = metadata + self._request_queue = self._create_queue() + self._request_generator = None + self._callbacks = [] + self.call = None + + def _create_queue(self): + """Create a queue for requests.""" + raise NotImplementedError("`_create_queue` is not implemented.") + + def add_done_callback(self, callback): + """Adds a callback that will be called when the RPC terminates. + + This occurs when the RPC errors or is successfully terminated. + + Args: + callback (Callable[[grpc.Future], None]): The callback to execute. + It will be provided with the same gRPC future as the underlying + stream which will also be a :class:`grpc.aio.Call`. + """ + self._callbacks.append(callback) + + def _on_call_done(self, future): + # This occurs when the RPC errors or is successfully terminated. + # Note that grpc's "future" here can also be a grpc.RpcError. + # See note in https://github.com/grpc/grpc/issues/10885#issuecomment-302651331 + # that `grpc.RpcError` is also `grpc.aio.Call`. + for callback in self._callbacks: + callback(future) + + @property + def is_active(self): + """bool: True if this stream is currently open and active.""" + raise NotImplementedError("`is_active` is not implemented.") + + @property + def pending_requests(self): + """int: Returns an estimate of the number of queued requests.""" + return self._request_queue.qsize() diff --git a/tests/unit/asyncio/test_bidi_async.py b/tests/unit/asyncio/test_bidi_async.py new file mode 100644 index 000000000..313748af8 --- /dev/null +++ b/tests/unit/asyncio/test_bidi_async.py @@ -0,0 +1,310 @@ +# Copyright 2025, Google LLC All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import asyncio + +from unittest import mock + +try: + from unittest.mock import AsyncMock +except ImportError: # pragma: NO COVER + from mock import AsyncMock # type: ignore + + +import pytest + +try: + from grpc import aio +except ImportError: # pragma: NO COVER + pytest.skip("No GRPC", allow_module_level=True) + +from google.cloud.storage._experimental.asyncio import bidi_async +from google.api_core import exceptions + + +if sys.version_info < (3, 10): # type: ignore[operator] + + def aiter(obj): + return obj.__aiter__() + + async def anext(obj): + return await obj.__anext__() + + +@pytest.mark.asyncio +class Test_AsyncRequestQueueGenerator: + async def test_bounded_consume(self): + call = mock.create_autospec(aio.Call, instance=True) + call.done.return_value = False + + q = asyncio.Queue() + await q.put(mock.sentinel.A) + await q.put(mock.sentinel.B) + + generator = bidi_async._AsyncRequestQueueGenerator(q) + generator.call = call + + items = [] + gen_aiter = aiter(generator) + + items.append(await anext(gen_aiter)) + items.append(await anext(gen_aiter)) + + # At this point, the queue is empty. The next call to anext will sleep. + # We make the call inactive. + call.done.return_value = True + + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(anext(gen_aiter), timeout=1) + + assert items == [mock.sentinel.A, mock.sentinel.B] + + async def test_yield_initial_and_exit(self): + q = asyncio.Queue() + call = mock.create_autospec(aio.Call, instance=True) + call.done.return_value = True + + generator = bidi_async._AsyncRequestQueueGenerator( + q, initial_request=mock.sentinel.A + ) + generator.call = call + + assert await anext(aiter(generator)) == mock.sentinel.A + + async def test_yield_initial_callable_and_exit(self): + q = asyncio.Queue() + call = mock.create_autospec(aio.Call, instance=True) + call.done.return_value = True + + generator = bidi_async._AsyncRequestQueueGenerator( + q, initial_request=lambda: mock.sentinel.A + ) + generator.call = call + + assert await anext(aiter(generator)) == mock.sentinel.A + + async def test_exit_when_inactive_with_item(self): + q = asyncio.Queue() + await q.put(mock.sentinel.A) + + call = mock.create_autospec(aio.Call, instance=True) + call.done.return_value = True + + generator = bidi_async._AsyncRequestQueueGenerator(q) + generator.call = call + + with pytest.raises(StopAsyncIteration) as exc_info: + assert await anext(aiter(generator)) + assert ( + exc_info.value.args[0] + == "Inactive call, replacing item on queue and exiting request generator." + ) + + # Make sure it put the item back. + assert not q.empty() + assert await q.get() == mock.sentinel.A + + async def test_exit_when_inactive_empty(self): + q = asyncio.Queue() + call = mock.create_autospec(aio.Call, instance=True) + call.done.return_value = True + + generator = bidi_async._AsyncRequestQueueGenerator(q) + generator.call = call + + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(anext(aiter(generator)), timeout=1) + + async def test_exit_with_stop(self): + q = asyncio.Queue() + await q.put(None) + call = mock.create_autospec(aio.Call, instance=True) + call.done.return_value = False + + generator = bidi_async._AsyncRequestQueueGenerator(q) + generator.call = call + + with pytest.raises(StopAsyncIteration) as exc_info: + assert await anext(aiter(generator)) + assert exc_info.value.args[0] == "Cleanly exiting request generator." + + +def make_async_rpc(): + """Makes a mock async RPC used to test Bidi classes.""" + call = mock.create_autospec(aio.StreamStreamCall, instance=True) + rpc = AsyncMock() + + def rpc_side_effect(request, metadata=None): + call.done.return_value = False + return call + + rpc.side_effect = rpc_side_effect + + def cancel_side_effect(): + call.done.return_value = True + return True + + call.cancel.side_effect = cancel_side_effect + call.read = AsyncMock() + + return rpc, call + + +class AsyncClosedCall: + def __init__(self, exception): + self.exception = exception + + def done(self): + return True + + async def read(self): + raise self.exception + + +class TestAsyncBidiRpc: + def test_initial_state(self): + bidi_rpc = bidi_async.AsyncBidiRpc(None) + assert bidi_rpc.is_active is False + + def test_done_callbacks(self): + bidi_rpc = bidi_async.AsyncBidiRpc(None) + callback = mock.Mock(spec=["__call__"]) + + bidi_rpc.add_done_callback(callback) + bidi_rpc._on_call_done(mock.sentinel.future) + + callback.assert_called_once_with(mock.sentinel.future) + + @pytest.mark.asyncio + @pytest.mark.skipif( + sys.version_info < (3, 8), # type: ignore[operator] + reason="Python 3.8 below doesnt provide support for assert_awaited_once", + ) + async def test_metadata(self): + rpc, call = make_async_rpc() + bidi_rpc = bidi_async.AsyncBidiRpc(rpc, metadata=mock.sentinel.A) + assert bidi_rpc._rpc_metadata == mock.sentinel.A + + await bidi_rpc.open() + assert bidi_rpc.call == call + rpc.assert_awaited_once() + assert rpc.call_args.kwargs["metadata"] == mock.sentinel.A + + @pytest.mark.asyncio + async def test_open(self): + rpc, call = make_async_rpc() + bidi_rpc = bidi_async.AsyncBidiRpc(rpc) + + await bidi_rpc.open() + + assert bidi_rpc.call == call + assert bidi_rpc.is_active + call.add_done_callback.assert_called_once_with(bidi_rpc._on_call_done) + + @pytest.mark.asyncio + async def test_open_error_already_open(self): + rpc, _ = make_async_rpc() + bidi_rpc = bidi_async.AsyncBidiRpc(rpc) + + await bidi_rpc.open() + + with pytest.raises(ValueError): + await bidi_rpc.open() + + @pytest.mark.asyncio + async def test_open_error_call_error(self): + rpc, _ = make_async_rpc() + expected_exception = exceptions.GoogleAPICallError( + "test", response=mock.sentinel.response + ) + rpc.side_effect = expected_exception + bidi_rpc = bidi_async.AsyncBidiRpc(rpc) + callback = mock.Mock(spec=["__call__"]) + bidi_rpc.add_done_callback(callback) + + with pytest.raises(exceptions.GoogleAPICallError) as exc_info: + await bidi_rpc.open() + + assert exc_info.value == expected_exception + callback.assert_called_once_with(mock.sentinel.response) + + @pytest.mark.asyncio + async def test_close(self): + rpc, call = make_async_rpc() + bidi_rpc = bidi_async.AsyncBidiRpc(rpc) + await bidi_rpc.open() + + await bidi_rpc.close() + + call.cancel.assert_called_once() + assert bidi_rpc.call is call + assert bidi_rpc.is_active is False + # ensure the request queue was signaled to stop. + assert bidi_rpc.pending_requests == 1 + assert await bidi_rpc._request_queue.get() is None + # ensure request and callbacks are cleaned up + assert bidi_rpc._initial_request is None + assert not bidi_rpc._callbacks + + @pytest.mark.asyncio + async def test_close_no_rpc(self): + bidi_rpc = bidi_async.AsyncBidiRpc(None) + await bidi_rpc.close() + + @pytest.mark.asyncio + async def test_send(self): + rpc, call = make_async_rpc() + bidi_rpc = bidi_async.AsyncBidiRpc(rpc) + await bidi_rpc.open() + + await bidi_rpc.send(mock.sentinel.request) + + assert bidi_rpc.pending_requests == 1 + assert await bidi_rpc._request_queue.get() is mock.sentinel.request + + @pytest.mark.asyncio + async def test_send_not_open(self): + bidi_rpc = bidi_async.AsyncBidiRpc(None) + + with pytest.raises(ValueError): + await bidi_rpc.send(mock.sentinel.request) + + @pytest.mark.asyncio + async def test_send_dead_rpc(self): + error = ValueError() + bidi_rpc = bidi_async.AsyncBidiRpc(None) + bidi_rpc.call = AsyncClosedCall(error) + + with pytest.raises(ValueError) as exc_info: + await bidi_rpc.send(mock.sentinel.request) + + assert exc_info.value == error + + @pytest.mark.asyncio + async def test_recv(self): + bidi_rpc = bidi_async.AsyncBidiRpc(None) + bidi_rpc.call = mock.create_autospec(aio.Call, instance=True) + bidi_rpc.call.read = AsyncMock(return_value=mock.sentinel.response) + + response = await bidi_rpc.recv() + + assert response == mock.sentinel.response + + @pytest.mark.asyncio + async def test_recv_not_open(self): + bidi_rpc = bidi_async.AsyncBidiRpc(None) + + with pytest.raises(ValueError): + await bidi_rpc.recv() From 71e0904d9b311ba520188ced0a60d1fc7eb10072 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 19 Sep 2025 13:44:31 +0530 Subject: [PATCH 381/509] feat(experimental): add AsyncAbstractObjectStream (#1546) * add AsyncAbstractObjectStream this will be the parent class for AsyncReadObjectStream and AsyncWriteObjectStream * keep _AsyncAbstractObjectStream private * include handle in tests * remove unit tests for abstract class * bucket_name and object_name cannot be NONE * minor edit - add bidi-stream in doc string --- .../asyncio/async_abstract_object_stream.py | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py diff --git a/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py new file mode 100644 index 000000000..49d7a293a --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py @@ -0,0 +1,67 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import abc +from typing import Any, Optional + + +class _AsyncAbstractObjectStream(abc.ABC): + """Abstract base class to represent gRPC bidi-stream for GCS ``Object``. + + Concrete implementation of this class could be ``_AsyncReadObjectStream`` + or ``_AsyncWriteObjectStream``. + + :type bucket_name: str + :param bucket_name: (Optional) The name of the bucket containing the object. + + :type object_name: str + :param object_name: (Optional) The name of the object. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. + + :type handle: bytes + :param handle: (Optional) The handle for the object, could be read_handle or + write_handle, based on how the stream is used. + """ + + def __init__( + self, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + handle: Optional[bytes] = None, + ) -> None: + super().__init__() + self.bucket_name: str = bucket_name + self.object_name: str = object_name + self.generation_number: Optional[int] = generation_number + self.handle: Optional[bytes] = handle + + @abc.abstractmethod + async def open(self) -> None: + pass + + @abc.abstractmethod + async def close(self) -> None: + pass + + @abc.abstractmethod + async def send(self, protobuf: Any) -> None: + pass + + @abc.abstractmethod + async def recv(self) -> Any: + pass From 3c8a21d6467f3a2407dd64d231ba89ffb9940187 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 22 Sep 2025 09:33:54 +0530 Subject: [PATCH 382/509] feat(experimental): Add _AsyncReadObjectStream and it's stubs (#1547) * add AsyncAbstractObjectStream this will be the parent class for AsyncReadObjectStream and AsyncWriteObjectStream * keep _AsyncAbstractObjectStream private * Add _AsyncReadObjectStream and it's stubs * fix doc strings, add licence and type hints * pass abstract methods * add handle param * include handle in tests * remove unit tests for abstract class * edit doc string for _AsyncReadObjectStream * bucket_name and object_name cannot be NONE * bucket_name and object_name cannot be None * minor edit - add bidi-stream in doc string * add checks for invalid inputs --- .../asyncio/async_read_object_stream.py | 92 +++++++++++++++++++ .../asyncio/test_async_read_object_stream.py | 86 +++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/async_read_object_stream.py create mode 100644 tests/unit/asyncio/test_async_read_object_stream.py diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py new file mode 100644 index 000000000..bedfbf7ba --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -0,0 +1,92 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +NOTE: +This is _experimental module for upcoming support for Rapid Storage. +(https://cloud.google.com/blog/products/storage-data-transfer/high-performance-storage-innovations-for-ai-hpc#:~:text=your%20AI%20workloads%3A-,Rapid%20Storage,-%3A%20A%20new) + +APIs may not work as intended and are not stable yet. Feature is not +GA(Generally Available) yet, please contact your TAM(Technical Account Manager) +if you want to use these APIs. + +""" + +from typing import Any, Optional +from google.cloud import _storage_v2 +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( + _AsyncAbstractObjectStream, +) + + +class _AsyncReadObjectStream(_AsyncAbstractObjectStream): + """Class representing a gRPC bidi-stream for reading data from a GCS ``Object``. + + This class provides a unix socket-like interface to a GCS ``Object``, with + methods like ``open``, ``close``, ``send``, and ``recv``. + + :type client: :class:`~google.cloud.storage.asyncio.AsyncGrpcClient.grpc_client` + :param client: async grpc client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the GCS ``bucket`` containing the object. + + :type object_name: str + :param object_name: The name of the GCS ``object`` to be read. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. + + :type read_handle: bytes + :param read_handle: (Optional) An existing handle for reading the object. + If provided, opening the bidi-gRPC connection will be faster. + """ + + def __init__( + self, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + read_handle: Optional[bytes] = None, + ) -> None: + if client is None: + raise ValueError("client must be provided") + if bucket_name is None: + raise ValueError("bucket_name must be provided") + if object_name is None: + raise ValueError("object_name must be provided") + + super().__init__( + bucket_name=bucket_name, + object_name=object_name, + generation_number=generation_number, + ) + self.client: AsyncGrpcClient.grpc_client = client + self.read_handle: Optional[bytes] = read_handle + + async def open(self) -> None: + pass + + async def close(self) -> None: + pass + + async def send( + self, bidi_read_object_request: _storage_v2.BidiReadObjectRequest + ) -> None: + pass + + async def recv(self) -> Any: + pass diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py new file mode 100644 index 000000000..89d0571b0 --- /dev/null +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -0,0 +1,86 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from unittest import mock + +from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( + _AsyncAbstractObjectStream, +) +from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( + _AsyncReadObjectStream, +) + + +def test_inheritance(): + """Test that _AsyncReadObjectStream inherits from _AsyncAbstractObjectStream.""" + assert issubclass(_AsyncReadObjectStream, _AsyncAbstractObjectStream) + + +def test_init(): + """Test the constructor of _AsyncReadObjectStream.""" + mock_client = mock.Mock(name="client") + bucket_name = "test-bucket" + object_name = "test-object" + generation = 12345 + read_handle = "some-handle" + + # Test with all parameters + stream = _AsyncReadObjectStream( + mock_client, + bucket_name=bucket_name, + object_name=object_name, + generation_number=generation, + read_handle=read_handle, + ) + + assert stream.client is mock_client + assert stream.bucket_name == bucket_name + assert stream.object_name == object_name + assert stream.generation_number == generation + assert stream.read_handle == read_handle + + # Test with default parameters + stream_defaults = _AsyncReadObjectStream( + mock_client, bucket_name=bucket_name, object_name=object_name + ) + assert stream_defaults.client is mock_client + assert stream_defaults.bucket_name is bucket_name + assert stream_defaults.object_name is object_name + assert stream_defaults.generation_number is None + assert stream_defaults.read_handle is None + + +def test_init_with_invalid_parameters(): + """Test the constructor of _AsyncReadObjectStream with invalid params.""" + + with pytest.raises(ValueError): + _AsyncReadObjectStream(None, bucket_name=None, object_name=None) + + +@pytest.mark.asyncio +async def test_async_methods_are_awaitable(): + """Test that the async methods exist and are awaitable.""" + mock_client = mock.Mock(name="client") + stream = _AsyncReadObjectStream(mock_client, "bucket", "object") + + # These methods are currently empty, but we can test they are awaitable + # and don't raise exceptions. + try: + await stream.open() + await stream.close() + await stream.send(mock.Mock()) + await stream.recv() + except Exception as e: + pytest.fail(f"Async methods should be awaitable without errors. Raised: {e}") From c31a516def72a1504b05c44dd8fad5a7eef52552 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 23 Sep 2025 11:38:04 +0530 Subject: [PATCH 383/509] feat(experimental): Implement `__init__` method for _AsyncReadObjectStream (#1548) * feat(experimental): Implement `__init__` method for _AsyncReadObjectStream (#1548) --- .../asyncio/async_read_object_stream.py | 18 ++++- .../asyncio/test_async_read_object_stream.py | 78 +++++++------------ 2 files changed, 45 insertions(+), 51 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index bedfbf7ba..0ac229c5a 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -28,6 +28,7 @@ from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( _AsyncAbstractObjectStream, ) +from google.cloud.storage._experimental.asyncio.bidi_async import AsyncBidiRpc class _AsyncReadObjectStream(_AsyncAbstractObjectStream): @@ -36,7 +37,7 @@ class _AsyncReadObjectStream(_AsyncAbstractObjectStream): This class provides a unix socket-like interface to a GCS ``Object``, with methods like ``open``, ``close``, ``send``, and ``recv``. - :type client: :class:`~google.cloud.storage.asyncio.AsyncGrpcClient.grpc_client` + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` :param client: async grpc client to use for making API requests. :type bucket_name: str @@ -77,6 +78,21 @@ def __init__( self.client: AsyncGrpcClient.grpc_client = client self.read_handle: Optional[bytes] = read_handle + self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" + + self.rpc = self.client._client._transport._wrapped_methods[ + self.client._client._transport.bidi_read_object + ] + first_bidi_read_req = _storage_v2.BidiReadObjectRequest( + read_object_spec=_storage_v2.BidiReadObjectSpec( + bucket=self._full_bucket_name, object=object_name + ), + ) + self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) + self.socket_like_rpc = AsyncBidiRpc( + self.rpc, initial_request=first_bidi_read_req, metadata=self.metadata + ) + async def open(self) -> None: pass diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 89d0571b0..28566084c 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -14,52 +14,47 @@ import pytest from unittest import mock +from google.cloud import _storage_v2 -from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( - _AsyncAbstractObjectStream, -) from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( _AsyncReadObjectStream, ) -def test_inheritance(): - """Test that _AsyncReadObjectStream inherits from _AsyncAbstractObjectStream.""" - assert issubclass(_AsyncReadObjectStream, _AsyncAbstractObjectStream) - - -def test_init(): - """Test the constructor of _AsyncReadObjectStream.""" - mock_client = mock.Mock(name="client") +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): + # initialize with bucket, object_name and generation number. & client. bucket_name = "test-bucket" object_name = "test-object" - generation = 12345 - read_handle = "some-handle" + generation_number = 12345 + mock_client._client._transport.bidi_read_object = "bidi_read_object_rpc" + mock_client._client._transport._wrapped_methods = { + "bidi_read_object_rpc": mock.sentinel.A + } - # Test with all parameters - stream = _AsyncReadObjectStream( - mock_client, + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, bucket_name=bucket_name, object_name=object_name, - generation_number=generation, - read_handle=read_handle, + generation_number=generation_number, ) - - assert stream.client is mock_client - assert stream.bucket_name == bucket_name - assert stream.object_name == object_name - assert stream.generation_number == generation - assert stream.read_handle == read_handle - - # Test with default parameters - stream_defaults = _AsyncReadObjectStream( - mock_client, bucket_name=bucket_name, object_name=object_name + full_bucket_name = f"projects/_/buckets/{bucket_name}" + first_bidi_read_req = _storage_v2.BidiReadObjectRequest( + read_object_spec=_storage_v2.BidiReadObjectSpec( + bucket=full_bucket_name, object=object_name + ), + ) + mock_async_bidi_rpc.assert_called_once_with( + mock.sentinel.A, + initial_request=first_bidi_read_req, + metadata=(("x-goog-request-params", f"bucket={full_bucket_name}"),), ) - assert stream_defaults.client is mock_client - assert stream_defaults.bucket_name is bucket_name - assert stream_defaults.object_name is object_name - assert stream_defaults.generation_number is None - assert stream_defaults.read_handle is None + assert read_obj_stream.socket_like_rpc is mock_async_bidi_rpc.return_value def test_init_with_invalid_parameters(): @@ -67,20 +62,3 @@ def test_init_with_invalid_parameters(): with pytest.raises(ValueError): _AsyncReadObjectStream(None, bucket_name=None, object_name=None) - - -@pytest.mark.asyncio -async def test_async_methods_are_awaitable(): - """Test that the async methods exist and are awaitable.""" - mock_client = mock.Mock(name="client") - stream = _AsyncReadObjectStream(mock_client, "bucket", "object") - - # These methods are currently empty, but we can test they are awaitable - # and don't raise exceptions. - try: - await stream.open() - await stream.close() - await stream.send(mock.Mock()) - await stream.recv() - except Exception as e: - pytest.fail(f"Async methods should be awaitable without errors. Raised: {e}") From fc8461b5d1ae8cae749a0e0a262e055fe8ea9439 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 23 Sep 2025 14:12:58 +0530 Subject: [PATCH 384/509] feat(zb-experimental): Add all other methods open close send recv in _AsyncReadObjectStream (#1549) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add AsyncAbstractObjectStream this will be the parent class for AsyncReadObjectStream and AsyncWriteObjectStream * keep _AsyncAbstractObjectStream private * Add _AsyncReadObjectStream and it's stubs * complete __init__ for read_obj_str * remove unuseful comments * add methods open close send recv * change read_handle type from 'str' to 'bytes' * fix doc strings, add licence and type hints * pass abstract methods * add handle param * include handle in tests * remove unit tests for abstract class * edit doc string for _AsyncReadObjectStream * refactor unit tests for async_read_object_stream * bucket_name and object_name cannot be NONE * bucket_name and object_name cannot be None * simplyfy tests for open * simply tests for send recv and close * minor edit - add bidi-stream in doc string * add checks for invalid inputs * remove duplicated import * remove unused import * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * remove unused import --------- Co-authored-by: Owl Bot --- .../asyncio/async_read_object_stream.py | 41 +++++- .../asyncio/test_async_read_object_stream.py | 127 +++++++++++++++--- 2 files changed, 144 insertions(+), 24 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index 0ac229c5a..316a6750a 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -22,7 +22,7 @@ """ -from typing import Any, Optional +from typing import Optional from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( @@ -94,15 +94,42 @@ def __init__( ) async def open(self) -> None: - pass + """Opens the bidi-gRPC connection to read from the object. + + This method sends an initial request to start the stream and receives + the first response containing metadata and a read handle. + """ + await self.socket_like_rpc.open() # this is actually 1 send + response = await self.socket_like_rpc.recv() + if self.generation_number is None: + self.generation_number = response.metadata.generation + + self.read_handle = response.read_handle async def close(self) -> None: - pass + """Closes the bidi-gRPC connection.""" + await self.socket_like_rpc.close() async def send( self, bidi_read_object_request: _storage_v2.BidiReadObjectRequest ) -> None: - pass - - async def recv(self) -> Any: - pass + """Sends a request message on the stream. + + Args: + bidi_read_object_request (:class:`~google.cloud._storage_v2.types.BidiReadObjectRequest`): + The request message to send. This is typically used to specify + the read offset and limit. + """ + await self.socket_like_rpc.send(bidi_read_object_request) + + async def recv(self) -> _storage_v2.BidiReadObjectResponse: + """Receives a response from the stream. + + This method waits for the next message from the server, which could + contain object data or metadata. + + Returns: + :class:`~google.cloud._storage_v2.types.BidiReadObjectResponse`: + The response message from the server. + """ + return await self.socket_like_rpc.recv() diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 28566084c..d7170c4a4 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -14,12 +14,18 @@ import pytest from unittest import mock +from unittest.mock import AsyncMock from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( _AsyncReadObjectStream, ) +_TEST_BUCKET_NAME = "test-bucket" +_TEST_OBJECT_NAME = "test-object" +_TEST_GENERATION_NUMBER = 12345 +_TEST_READ_HANDLE = b"test-read-handle" + @mock.patch( "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" @@ -28,27 +34,24 @@ "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): - # initialize with bucket, object_name and generation number. & client. - bucket_name = "test-bucket" - object_name = "test-object" - generation_number = 12345 mock_client._client._transport.bidi_read_object = "bidi_read_object_rpc" mock_client._client._transport._wrapped_methods = { "bidi_read_object_rpc": mock.sentinel.A } - - read_obj_stream = _AsyncReadObjectStream( - client=mock_client, - bucket_name=bucket_name, - object_name=object_name, - generation_number=generation_number, - ) - full_bucket_name = f"projects/_/buckets/{bucket_name}" + full_bucket_name = f"projects/_/buckets/{_TEST_BUCKET_NAME}" first_bidi_read_req = _storage_v2.BidiReadObjectRequest( read_object_spec=_storage_v2.BidiReadObjectSpec( - bucket=full_bucket_name, object=object_name + bucket=full_bucket_name, object=_TEST_OBJECT_NAME ), ) + + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + generation_number=_TEST_GENERATION_NUMBER, + ) + mock_async_bidi_rpc.assert_called_once_with( mock.sentinel.A, initial_request=first_bidi_read_req, @@ -57,8 +60,98 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): assert read_obj_stream.socket_like_rpc is mock_async_bidi_rpc.return_value -def test_init_with_invalid_parameters(): - """Test the constructor of _AsyncReadObjectStream with invalid params.""" +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_open(mock_client): + # arrange + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + ) + read_obj_stream.socket_like_rpc.open = AsyncMock() + + recv_response = mock.MagicMock(spec=_storage_v2.BidiReadObjectResponse) + recv_response.metadata = mock.MagicMock(spec=_storage_v2.Object) + recv_response.metadata.generation = _TEST_GENERATION_NUMBER + recv_response.read_handle = _TEST_READ_HANDLE + read_obj_stream.socket_like_rpc.recv = AsyncMock(return_value=recv_response) + + # act + await read_obj_stream.open() + + # assert + read_obj_stream.socket_like_rpc.open.assert_called_once() + read_obj_stream.socket_like_rpc.recv.assert_called_once() + + assert read_obj_stream.generation_number == _TEST_GENERATION_NUMBER + assert read_obj_stream.read_handle == _TEST_READ_HANDLE + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_close(mock_client): + # arrange + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + ) + read_obj_stream.socket_like_rpc.close = AsyncMock() + + # act + await read_obj_stream.close() + + # assert + read_obj_stream.socket_like_rpc.close.assert_called_once() + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_send(mock_client): + # arrange + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + ) + read_obj_stream.socket_like_rpc.send = AsyncMock() + + # act + bidi_read_object_request = _storage_v2.BidiReadObjectRequest() + await read_obj_stream.send(bidi_read_object_request) + + # assert + read_obj_stream.socket_like_rpc.send.assert_called_once_with( + bidi_read_object_request + ) + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_recv(mock_client): + # arrange + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + ) + bidi_read_object_response = _storage_v2.BidiReadObjectResponse() + read_obj_stream.socket_like_rpc.recv = AsyncMock( + return_value=bidi_read_object_response + ) + + # act + response = await read_obj_stream.recv() - with pytest.raises(ValueError): - _AsyncReadObjectStream(None, bucket_name=None, object_name=None) + # assert + read_obj_stream.socket_like_rpc.recv.assert_called_once() + assert response == bidi_read_object_response From 4766164e560e170af18de68870c085f2202c7b9a Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 24 Sep 2025 10:58:55 +0530 Subject: [PATCH 385/509] feat(zb-experimental): Add AsyncMultiRangeDownloader (#1550) feat(zb-experimental): Add AsyncMultiRangeDownloader and it's init method. --- .../asyncio/async_multi_range_downloader.py | 165 ++++++++++++++++++ .../test_async_multi_range_downloader.py | 79 +++++++++ 2 files changed, 244 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py create mode 100644 tests/unit/asyncio/test_async_multi_range_downloader.py diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py new file mode 100644 index 000000000..bc60262ed --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -0,0 +1,165 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Any, List, Optional, Tuple + +from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( + _AsyncReadObjectStream, +) +from google.cloud.storage._experimental.asyncio.async_grpc_client import ( + AsyncGrpcClient, +) + +from io import BytesIO + + +class AsyncMultiRangeDownloader: + """Provides an interface for downloading multiple ranges of a GCS ``Object`` + concurrently. + + Example usage: + + .. code-block:: python + + client = AsyncGrpcClient().grpc_client + mrd = await AsyncMultiRangeDownloader.create_mrd( + client, bucket_name="chandrasiri-rs", object_name="test_open9" + ) + my_buff1 = BytesIO() + my_buff2 = BytesIO() + my_buff3 = BytesIO() + my_buff4 = BytesIO() + buffers = [my_buff1, my_buff2, my_buff3, my_buff4] + await mrd.download_ranges( + [ + (0, 100, my_buff1), + (100, 200, my_buff2), + (200, 300, my_buff3), + (300, 400, my_buff4), + ] + ) + for buff in buffers: + print("downloaded bytes", buff.getbuffer().nbytes) + + """ + + @classmethod + async def create_mrd( + cls, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + read_handle: Optional[bytes] = None, + ) -> AsyncMultiRangeDownloader: + """Initializes a MultiRangeDownloader and opens the underlying bidi-gRPC + object for reading. + + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :param client: The asynchronous client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the bucket containing the object. + + :type object_name: str + :param object_name: The name of the object to be read. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific + revision of this object. + + :type read_handle: bytes + :param read_handle: (Optional) An existing handle for reading the object. + If provided, opening the bidi-gRPC connection will be faster. + + :rtype: :class:`~google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader` + :returns: An initialized AsyncMultiRangeDownloader instance for reading. + """ + mrd = cls(client, bucket_name, object_name, generation_number, read_handle) + await mrd.open() + return mrd + + def __init__( + self, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + read_handle: Optional[bytes] = None, + ) -> None: + """Constructor for AsyncMultiRangeDownloader, clients are not adviced to + use it directly. Instead it's adviced to use the classmethod `create_mrd`. + + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :param client: The asynchronous client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the bucket containing the object. + + :type object_name: str + :param object_name: The name of the object to be read. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. + + :type read_handle: bytes + :param read_handle: (Optional) An existing read handle. + """ + self.client = client + self.bucket_name = bucket_name + self.object_name = object_name + self.generation_number = generation_number + self.read_handle = read_handle + self.read_obj_str: _AsyncReadObjectStream = None + + async def open(self) -> None: + """Opens the bidi-gRPC connection to read from the object. + + This method initializes and opens an `_AsyncReadObjectStream` (bidi-gRPC stream) to + for downloading ranges of data from GCS ``Object``. + + "Opening" constitutes fetching object metadata such as generation number + and read handle and sets them as attributes if not already set. + """ + self.read_obj_str = _AsyncReadObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=self.read_handle, + ) + await self.read_obj_str.open() + if self.generation_number is None: + self.generation_number = self.read_obj_str.generation_number + self.read_handle = self.read_obj_str.read_handle + return + + async def download_ranges(self, read_ranges: List[Tuple[int, int, BytesIO]]) -> Any: + """Downloads multiple byte ranges from the object into the buffers + provided by user. + + :type read_ranges: List[Tuple[int, int, "BytesIO"]] + :param read_ranges: A list of tuples, where each tuple represents a + byte range (start_byte, end_byte, buffer) to download. Buffer has to + be provided by the user, and user has to make sure appropriate + memory is available in the application to avoid out-of-memory crash. + + + Raises: + NotImplementedError: This method is not yet implemented. + """ + raise NotImplementedError("TODO") diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py new file mode 100644 index 000000000..edcd3fcc4 --- /dev/null +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -0,0 +1,79 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from unittest import mock +from unittest.mock import AsyncMock + +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) +from io import BytesIO + + +_TEST_BUCKET_NAME = "test-bucket" +_TEST_OBJECT_NAME = "test-object" +_TEST_GENERATION_NUMBER = 123456789 +_TEST_READ_HANDLE = b"test-handle" + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_create_mrd(mock_async_grpc_client, async_read_object_stream): + # Arrange + mock_stream_instance = async_read_object_stream.return_value + mock_stream_instance.open = AsyncMock() + mock_stream_instance.generation_number = _TEST_GENERATION_NUMBER + mock_stream_instance.read_handle = _TEST_READ_HANDLE + + # act + mrd = await AsyncMultiRangeDownloader.create_mrd( + mock_async_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + + # Assert + async_read_object_stream.assert_called_once_with( + client=mock_async_grpc_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + generation_number=None, + read_handle=None, + ) + mock_stream_instance.open.assert_called_once() + + assert mrd.client == mock_async_grpc_client + assert mrd.bucket_name == _TEST_BUCKET_NAME + assert mrd.object_name == _TEST_OBJECT_NAME + assert mrd.generation_number == _TEST_GENERATION_NUMBER + assert mrd.read_handle == _TEST_READ_HANDLE + assert mrd.read_obj_str is mock_stream_instance + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_download_ranges(mock_async_grpc_client): + """Test that download_ranges() raises NotImplementedError.""" + mrd = AsyncMultiRangeDownloader( + mock_async_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + + with pytest.raises(NotImplementedError): + await mrd.download_ranges([(0, 100, BytesIO())]) From e26888fa6885330a3d938b09b3a028c2fd6c605d Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 29 Sep 2025 13:24:17 +0530 Subject: [PATCH 386/509] feat(zb-experimental): implement download_ranges (#1551) Downloads multiple byte ranges from the object into the buffers provided by user. This interface provides option to download multiple ranges of a GCS `Object` concurrently. Example usage ```python client = AsyncGrpcClient().grpc_client mrd = await AsyncMultiRangeDownloader.create_mrd( client, bucket_name="chandrasiri-rs", object_name="test_open9" ) my_buff1 = open('my_fav_file.txt', 'wb') my_buff2 = BytesIO() my_buff3 = BytesIO() my_buff4 = any_object_which_provides_BytesIO_like_interface() results_arr, error_obj = await mrd.download_ranges( [ (0, 100, my_buff1), (100, 20, my_buff2), (200, 123, my_buff3), (300, 789, my_buff4), ] ) if error_obj: print("Error occurred: ") print(error_obj) print( "please issue call to `download_ranges` with updated" "`read_ranges` based on diff of (bytes_requested - bytes_written)" ) for result in results_arr: print("downloaded bytes", result) ``` --- .../asyncio/async_multi_range_downloader.py | 125 +++++++++++-- .../test_async_multi_range_downloader.py | 165 +++++++++++++----- 2 files changed, 233 insertions(+), 57 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index bc60262ed..a458a5e43 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -14,7 +14,7 @@ from __future__ import annotations -from typing import Any, List, Optional, Tuple +from typing import List, Optional, Tuple from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( _AsyncReadObjectStream, @@ -24,6 +24,38 @@ ) from io import BytesIO +from google.cloud import _storage_v2 + + +_MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 + + +class Result: + """An instance of this class will be populated and retured for each + `read_range` provided to ``download_ranges`` method. + + """ + + def __init__(self, bytes_requested: int): + # only while instantiation, should not be edited later. + # hence there's no setter, only getter is provided. + self._bytes_requested: int = bytes_requested + self._bytes_written: int = 0 + + @property + def bytes_requested(self) -> int: + return self._bytes_requested + + @property + def bytes_written(self) -> int: + return self._bytes_written + + @bytes_written.setter + def bytes_written(self, value: int): + self._bytes_written = value + + def __repr__(self): + return f"bytes_requested: {self._bytes_requested}, bytes_written: {self._bytes_written}" class AsyncMultiRangeDownloader: @@ -38,21 +70,30 @@ class AsyncMultiRangeDownloader: mrd = await AsyncMultiRangeDownloader.create_mrd( client, bucket_name="chandrasiri-rs", object_name="test_open9" ) - my_buff1 = BytesIO() + my_buff1 = open('my_fav_file.txt', 'wb') my_buff2 = BytesIO() my_buff3 = BytesIO() - my_buff4 = BytesIO() - buffers = [my_buff1, my_buff2, my_buff3, my_buff4] - await mrd.download_ranges( + my_buff4 = any_object_which_provides_BytesIO_like_interface() + results_arr, error_obj = await mrd.download_ranges( [ + # (start_byte, bytes_to_read, writeable_buffer) (0, 100, my_buff1), - (100, 200, my_buff2), - (200, 300, my_buff3), - (300, 400, my_buff4), + (100, 20, my_buff2), + (200, 123, my_buff3), + (300, 789, my_buff4), ] ) - for buff in buffers: - print("downloaded bytes", buff.getbuffer().nbytes) + if error_obj: + print("Error occurred: ") + print(error_obj) + print( + "please issue call to `download_ranges` with updated" + "`read_ranges` based on diff of (bytes_requested - bytes_written)" + ) + + for result in results_arr: + print("downloaded bytes", result) + """ @@ -148,18 +189,70 @@ async def open(self) -> None: self.read_handle = self.read_obj_str.read_handle return - async def download_ranges(self, read_ranges: List[Tuple[int, int, BytesIO]]) -> Any: + async def download_ranges( + self, read_ranges: List[Tuple[int, int, BytesIO]] + ) -> List[Result]: """Downloads multiple byte ranges from the object into the buffers provided by user. :type read_ranges: List[Tuple[int, int, "BytesIO"]] :param read_ranges: A list of tuples, where each tuple represents a - byte range (start_byte, end_byte, buffer) to download. Buffer has to - be provided by the user, and user has to make sure appropriate + byte range (start_byte, bytes_to_read, writeable_buffer). Buffer has + to be provided by the user, and user has to make sure appropriate memory is available in the application to avoid out-of-memory crash. + :rtype: List[:class:`~google.cloud.storage._experimental.asyncio.async_multi_range_downloader.Result`] + :returns: A list of ``Result`` objects, where each object corresponds + to a requested range. - Raises: - NotImplementedError: This method is not yet implemented. """ - raise NotImplementedError("TODO") + if len(read_ranges) > 1000: + raise ValueError( + "Invalid input - length of read_ranges cannot be more than 1000" + ) + + read_id_to_writable_buffer_dict = {} + results = [] + for i in range(0, len(read_ranges), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST): + read_ranges_segment = read_ranges[ + i : i + _MAX_READ_RANGES_PER_BIDI_READ_REQUEST + ] + + read_ranges_for_bidi_req = [] + for j, read_range in enumerate(read_ranges_segment): + read_id = i + j + read_id_to_writable_buffer_dict[read_id] = read_range[2] + bytes_requested = read_range[1] + results.append(Result(bytes_requested)) + read_ranges_for_bidi_req.append( + _storage_v2.ReadRange( + read_offset=read_range[0], + read_length=bytes_requested, + read_id=read_id, + ) + ) + await self.read_obj_str.send( + _storage_v2.BidiReadObjectRequest(read_ranges=read_ranges_for_bidi_req) + ) + + while len(read_id_to_writable_buffer_dict) > 0: + response = await self.read_obj_str.recv() + + if response is None: + raise Exception("None response received, something went wrong.") + + for object_data_range in response.object_data_ranges: + if object_data_range.read_range is None: + raise Exception("Invalid response, read_range is None") + + data = object_data_range.checksummed_data.content + read_id = object_data_range.read_range.read_id + buffer = read_id_to_writable_buffer_dict[read_id] + buffer.write(data) + results[read_id].bytes_written += len(data) + + if object_data_range.range_end: + del read_id_to_writable_buffer_dict[ + object_data_range.read_range.read_id + ] + return results diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index edcd3fcc4..b57bc92ca 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -15,6 +15,7 @@ import pytest from unittest import mock from unittest.mock import AsyncMock +from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, @@ -28,52 +29,134 @@ _TEST_READ_HANDLE = b"test-handle" -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" -) -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" -) -@pytest.mark.asyncio -async def test_create_mrd(mock_async_grpc_client, async_read_object_stream): - # Arrange - mock_stream_instance = async_read_object_stream.return_value - mock_stream_instance.open = AsyncMock() - mock_stream_instance.generation_number = _TEST_GENERATION_NUMBER - mock_stream_instance.read_handle = _TEST_READ_HANDLE - - # act - mrd = await AsyncMultiRangeDownloader.create_mrd( - mock_async_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME - ) - - # Assert - async_read_object_stream.assert_called_once_with( - client=mock_async_grpc_client, +class TestAsyncMultiRangeDownloader: + # helper method + @pytest.mark.asyncio + async def _make_mock_mrd( + self, + mock_grpc_client, + mock_cls_async_read_object_stream, bucket_name=_TEST_BUCKET_NAME, object_name=_TEST_OBJECT_NAME, - generation_number=None, - read_handle=None, + generation_number=_TEST_GENERATION_NUMBER, + read_handle=_TEST_READ_HANDLE, + ): + mock_stream = mock_cls_async_read_object_stream.return_value + mock_stream.open = AsyncMock() + mock_stream.generation_number = _TEST_GENERATION_NUMBER + mock_stream.read_handle = _TEST_READ_HANDLE + + mrd = await AsyncMultiRangeDownloader.create_mrd( + mock_grpc_client, bucket_name, object_name, generation_number, read_handle + ) + + return mrd + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) - mock_stream_instance.open.assert_called_once() + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_create_mrd( + self, mock_grpc_client, mock_cls_async_read_object_stream + ): + # Arrange & Act + mrd = await self._make_mock_mrd( + mock_grpc_client, mock_cls_async_read_object_stream + ) - assert mrd.client == mock_async_grpc_client - assert mrd.bucket_name == _TEST_BUCKET_NAME - assert mrd.object_name == _TEST_OBJECT_NAME - assert mrd.generation_number == _TEST_GENERATION_NUMBER - assert mrd.read_handle == _TEST_READ_HANDLE - assert mrd.read_obj_str is mock_stream_instance + # Assert + mock_cls_async_read_object_stream.assert_called_once_with( + client=mock_grpc_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + generation_number=_TEST_GENERATION_NUMBER, + read_handle=_TEST_READ_HANDLE, + ) + mrd.read_obj_str.open.assert_called_once() -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" -) -@pytest.mark.asyncio -async def test_download_ranges(mock_async_grpc_client): - """Test that download_ranges() raises NotImplementedError.""" - mrd = AsyncMultiRangeDownloader( - mock_async_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + assert mrd.client == mock_grpc_client + assert mrd.bucket_name == _TEST_BUCKET_NAME + assert mrd.object_name == _TEST_OBJECT_NAME + assert mrd.generation_number == _TEST_GENERATION_NUMBER + assert mrd.read_handle == _TEST_READ_HANDLE + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_download_ranges( + self, mock_grpc_client, mock_cls_async_read_object_stream + ): + # Arrange + mock_mrd = await self._make_mock_mrd( + mock_grpc_client, mock_cls_async_read_object_stream + ) + mock_mrd.read_obj_str.send = AsyncMock() + mock_mrd.read_obj_str.recv = AsyncMock() + mock_mrd.read_obj_str.recv.return_value = _storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + _storage_v2.ObjectRangeData( + checksummed_data=_storage_v2.ChecksummedData( + content=b"these_are_18_chars", crc32c=123 + ), + range_end=True, + read_range=_storage_v2.ReadRange( + read_offset=0, read_length=18, read_id=0 + ), + ) + ], + ) + + # Act + buffer = BytesIO() + results = await mock_mrd.download_ranges([(0, 18, buffer)]) + + # Assert + mock_mrd.read_obj_str.send.assert_called_once_with( + _storage_v2.BidiReadObjectRequest( + read_ranges=[ + _storage_v2.ReadRange(read_offset=0, read_length=18, read_id=0) + ] + ) + ) + assert len(results) == 1 + assert results[0].bytes_requested == 18 + assert results[0].bytes_written == 18 + assert buffer.getvalue() == b"these_are_18_chars" + + def create_read_ranges(self, num_ranges): + ranges = [] + for i in range(num_ranges): + ranges.append( + _storage_v2.ReadRange(read_offset=i, read_length=1, read_id=i) + ) + return ranges + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) + @pytest.mark.asyncio + async def test_downloading_ranges_with_more_than_1000_should_throw_error( + self, mock_grpc_client + ): + # Arrange + mrd = AsyncMultiRangeDownloader( + mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + + # Act + Assert + with pytest.raises(ValueError) as exc: + await mrd.download_ranges(self.create_read_ranges(1001)) - with pytest.raises(NotImplementedError): - await mrd.download_ranges([(0, 100, BytesIO())]) + # Assert + assert ( + str(exc.value) + == "Invalid input - length of read_ranges cannot be more than 1000" + ) From 9c8856af3b4fa95269855509c08968c2d29412e9 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 30 Sep 2025 15:07:20 +0530 Subject: [PATCH 387/509] feat(zb-experimental): Add support for closing MRD (#1554) * add `is_stream_open` and check it's value before doing any of the following operation. `open` , `close` , `send` ,`recv` * Instantiate `socket_like_rpc` inside open, so that it is a new object every time we open. * Otherwise, consider this scenario where a user is opening after closing then `initial_request` would be None because close sets it to None. --- .../asyncio/async_read_object_stream.py | 25 ++- .../asyncio/test_async_read_object_stream.py | 190 ++++++++++++++---- 2 files changed, 175 insertions(+), 40 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index 316a6750a..b14c55227 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -83,15 +83,14 @@ def __init__( self.rpc = self.client._client._transport._wrapped_methods[ self.client._client._transport.bidi_read_object ] - first_bidi_read_req = _storage_v2.BidiReadObjectRequest( + self.first_bidi_read_req = _storage_v2.BidiReadObjectRequest( read_object_spec=_storage_v2.BidiReadObjectSpec( bucket=self._full_bucket_name, object=object_name ), ) self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) - self.socket_like_rpc = AsyncBidiRpc( - self.rpc, initial_request=first_bidi_read_req, metadata=self.metadata - ) + self.socket_like_rpc: Optional[AsyncBidiRpc] = None + self._is_stream_open: bool = False async def open(self) -> None: """Opens the bidi-gRPC connection to read from the object. @@ -99,6 +98,11 @@ async def open(self) -> None: This method sends an initial request to start the stream and receives the first response containing metadata and a read handle. """ + if self._is_stream_open: + raise ValueError("Stream is already open") + self.socket_like_rpc = AsyncBidiRpc( + self.rpc, initial_request=self.first_bidi_read_req, metadata=self.metadata + ) await self.socket_like_rpc.open() # this is actually 1 send response = await self.socket_like_rpc.recv() if self.generation_number is None: @@ -106,9 +110,14 @@ async def open(self) -> None: self.read_handle = response.read_handle + self._is_stream_open = True + async def close(self) -> None: """Closes the bidi-gRPC connection.""" + if not self._is_stream_open: + raise ValueError("Stream is not open") await self.socket_like_rpc.close() + self._is_stream_open = False async def send( self, bidi_read_object_request: _storage_v2.BidiReadObjectRequest @@ -120,6 +129,8 @@ async def send( The request message to send. This is typically used to specify the read offset and limit. """ + if not self._is_stream_open: + raise ValueError("Stream is not open") await self.socket_like_rpc.send(bidi_read_object_request) async def recv(self) -> _storage_v2.BidiReadObjectResponse: @@ -132,4 +143,10 @@ async def recv(self) -> _storage_v2.BidiReadObjectResponse: :class:`~google.cloud._storage_v2.types.BidiReadObjectResponse`: The response message from the server. """ + if not self._is_stream_open: + raise ValueError("Stream is not open") return await self.socket_like_rpc.recv() + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index d7170c4a4..ea91b2251 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -27,6 +27,30 @@ _TEST_READ_HANDLE = b"test-read-handle" +async def instantiate_read_obj_stream(mock_client, mock_cls_async_bidi_rpc, open=True): + """Helper to create an instance of _AsyncReadObjectStream and open it by default.""" + socket_like_rpc = AsyncMock() + mock_cls_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = AsyncMock() + + recv_response = mock.MagicMock(spec=_storage_v2.BidiReadObjectResponse) + recv_response.metadata = mock.MagicMock(spec=_storage_v2.Object) + recv_response.metadata.generation = _TEST_GENERATION_NUMBER + recv_response.read_handle = _TEST_READ_HANDLE + socket_like_rpc.recv = AsyncMock(return_value=recv_response) + + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + ) + + if open: + await read_obj_stream.open() + + return read_obj_stream + + @mock.patch( "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" ) @@ -34,9 +58,11 @@ "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): + # Arrange + rpc_sentinel = mock.sentinel.A mock_client._client._transport.bidi_read_object = "bidi_read_object_rpc" mock_client._client._transport._wrapped_methods = { - "bidi_read_object_rpc": mock.sentinel.A + "bidi_read_object_rpc": rpc_sentinel, } full_bucket_name = f"projects/_/buckets/{_TEST_BUCKET_NAME}" first_bidi_read_req = _storage_v2.BidiReadObjectRequest( @@ -45,39 +71,36 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): ), ) + # Act read_obj_stream = _AsyncReadObjectStream( client=mock_client, bucket_name=_TEST_BUCKET_NAME, object_name=_TEST_OBJECT_NAME, generation_number=_TEST_GENERATION_NUMBER, + read_handle=_TEST_READ_HANDLE, ) - mock_async_bidi_rpc.assert_called_once_with( - mock.sentinel.A, - initial_request=first_bidi_read_req, - metadata=(("x-goog-request-params", f"bucket={full_bucket_name}"),), - ) - assert read_obj_stream.socket_like_rpc is mock_async_bidi_rpc.return_value + # Assert + assert read_obj_stream.bucket_name == _TEST_BUCKET_NAME + assert read_obj_stream.object_name == _TEST_OBJECT_NAME + assert read_obj_stream.generation_number == _TEST_GENERATION_NUMBER + assert read_obj_stream.read_handle == _TEST_READ_HANDLE + assert read_obj_stream.first_bidi_read_req == first_bidi_read_req + assert read_obj_stream.rpc == rpc_sentinel +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio -async def test_open(mock_client): +async def test_open(mock_client, mock_cls_async_bidi_rpc): # arrange - read_obj_stream = _AsyncReadObjectStream( - client=mock_client, - bucket_name=_TEST_BUCKET_NAME, - object_name=_TEST_OBJECT_NAME, + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False ) - read_obj_stream.socket_like_rpc.open = AsyncMock() - - recv_response = mock.MagicMock(spec=_storage_v2.BidiReadObjectResponse) - recv_response.metadata = mock.MagicMock(spec=_storage_v2.Object) - recv_response.metadata.generation = _TEST_GENERATION_NUMBER - recv_response.read_handle = _TEST_READ_HANDLE - read_obj_stream.socket_like_rpc.recv = AsyncMock(return_value=recv_response) # act await read_obj_stream.open() @@ -88,40 +111,88 @@ async def test_open(mock_client): assert read_obj_stream.generation_number == _TEST_GENERATION_NUMBER assert read_obj_stream.read_handle == _TEST_READ_HANDLE + assert read_obj_stream.is_stream_open +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio -async def test_close(mock_client): +async def test_open_when_already_open_should_raise_error( + mock_client, mock_cls_async_bidi_rpc +): # arrange - read_obj_stream = _AsyncReadObjectStream( - client=mock_client, - bucket_name=_TEST_BUCKET_NAME, - object_name=_TEST_OBJECT_NAME, + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + + # act + assert (pythonic) + with pytest.raises(ValueError) as exc: + await read_obj_stream.open() + + # assert + assert str(exc.value) == "Stream is already open" + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_close(mock_client, mock_cls_async_bidi_rpc): + # arrange + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True ) - read_obj_stream.socket_like_rpc.close = AsyncMock() # act await read_obj_stream.close() # assert read_obj_stream.socket_like_rpc.close.assert_called_once() + assert not read_obj_stream.is_stream_open +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio -async def test_send(mock_client): +async def test_close_without_open_should_raise_error( + mock_client, mock_cls_async_bidi_rpc +): # arrange - read_obj_stream = _AsyncReadObjectStream( - client=mock_client, - bucket_name=_TEST_BUCKET_NAME, - object_name=_TEST_OBJECT_NAME, + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # act + assert (pythonic) + with pytest.raises(ValueError) as exc: + await read_obj_stream.close() + + # assert + assert str(exc.value) == "Stream is not open" + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_send(mock_client, mock_cls_async_bidi_rpc): + # arrange + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True ) - read_obj_stream.socket_like_rpc.send = AsyncMock() # act bidi_read_object_request = _storage_v2.BidiReadObjectRequest() @@ -133,16 +204,40 @@ async def test_send(mock_client): ) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio -async def test_recv(mock_client): +async def test_send_without_open_should_raise_error( + mock_client, mock_cls_async_bidi_rpc +): # arrange - read_obj_stream = _AsyncReadObjectStream( - client=mock_client, - bucket_name=_TEST_BUCKET_NAME, - object_name=_TEST_OBJECT_NAME, + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # act + assert (pythonic) + with pytest.raises(ValueError) as exc: + await read_obj_stream.send(_storage_v2.BidiReadObjectRequest()) + + # assert + assert str(exc.value) == "Stream is not open" + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_recv(mock_client, mock_cls_async_bidi_rpc): + # arrange + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True ) bidi_read_object_response = _storage_v2.BidiReadObjectResponse() read_obj_stream.socket_like_rpc.recv = AsyncMock( @@ -155,3 +250,26 @@ async def test_recv(mock_client): # assert read_obj_stream.socket_like_rpc.recv.assert_called_once() assert response == bidi_read_object_response + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_recv_without_open_should_raise_error( + mock_client, mock_cls_async_bidi_rpc +): + # arrange + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # act + assert (pythonic) + with pytest.raises(ValueError) as exc: + await read_obj_stream.recv() + + # assert + assert str(exc.value) == "Stream is not open" From aba4c6b7bd34f8ceb8284f0cb2137cfd0ef81b63 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 30 Sep 2025 16:24:06 +0530 Subject: [PATCH 388/509] feat(zb-experimental): implement `close` in AsyncMultiRangeDownloader (#1555) feat(zb-experimental): implement `close` in AsyncMultiRangeDownloader --- .../asyncio/async_multi_range_downloader.py | 58 ++++++++-- .../test_async_multi_range_downloader.py | 107 ++++++++++++++++-- 2 files changed, 149 insertions(+), 16 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index a458a5e43..f9081d0d6 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -71,16 +71,23 @@ class AsyncMultiRangeDownloader: client, bucket_name="chandrasiri-rs", object_name="test_open9" ) my_buff1 = open('my_fav_file.txt', 'wb') + my_buff1 = open('my_fav_file.txt', 'wb') my_buff2 = BytesIO() my_buff3 = BytesIO() my_buff4 = any_object_which_provides_BytesIO_like_interface() + results_arr, error_obj = await mrd.download_ranges( + my_buff4 = any_object_which_provides_BytesIO_like_interface() results_arr, error_obj = await mrd.download_ranges( [ + # (start_byte, bytes_to_read, writeable_buffer) # (start_byte, bytes_to_read, writeable_buffer) (0, 100, my_buff1), (100, 20, my_buff2), (200, 123, my_buff3), (300, 789, my_buff4), + (100, 20, my_buff2), + (200, 123, my_buff3), + (300, 789, my_buff4), ] ) if error_obj: @@ -94,6 +101,17 @@ class AsyncMultiRangeDownloader: for result in results_arr: print("downloaded bytes", result) + if error_obj: + print("Error occurred: ") + print(error_obj) + print( + "please issue call to `download_ranges` with updated" + "`read_ranges` based on diff of (bytes_requested - bytes_written)" + ) + + for result in results_arr: + print("downloaded bytes", result) + """ @@ -165,7 +183,8 @@ def __init__( self.object_name = object_name self.generation_number = generation_number self.read_handle = read_handle - self.read_obj_str: _AsyncReadObjectStream = None + self.read_obj_str: Optional[_AsyncReadObjectStream] = None + self._is_stream_open: bool = False async def open(self) -> None: """Opens the bidi-gRPC connection to read from the object. @@ -176,14 +195,19 @@ async def open(self) -> None: "Opening" constitutes fetching object metadata such as generation number and read handle and sets them as attributes if not already set. """ - self.read_obj_str = _AsyncReadObjectStream( - client=self.client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation_number, - read_handle=self.read_handle, - ) + if self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is already open") + + if self.read_obj_str is None: + self.read_obj_str = _AsyncReadObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=self.read_handle, + ) await self.read_obj_str.open() + self._is_stream_open = True if self.generation_number is None: self.generation_number = self.read_obj_str.generation_number self.read_handle = self.read_obj_str.read_handle @@ -206,11 +230,15 @@ async def download_ranges( to a requested range. """ + if len(read_ranges) > 1000: raise ValueError( "Invalid input - length of read_ranges cannot be more than 1000" ) + if not self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is not open") + read_id_to_writable_buffer_dict = {} results = [] for i in range(0, len(read_ranges), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST): @@ -255,4 +283,18 @@ async def download_ranges( del read_id_to_writable_buffer_dict[ object_data_range.read_range.read_id ] + return results + + async def close(self): + """ + Closes the underlying bidi-gRPC connection. + """ + if not self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is not open") + await self.read_obj_str.close() + self._is_stream_open = False + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index b57bc92ca..27d1ed6dd 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -30,6 +30,14 @@ class TestAsyncMultiRangeDownloader: + def create_read_ranges(self, num_ranges): + ranges = [] + for i in range(num_ranges): + ranges.append( + _storage_v2.ReadRange(read_offset=i, read_length=1, read_id=i) + ) + return ranges + # helper method @pytest.mark.asyncio async def _make_mock_mrd( @@ -76,6 +84,16 @@ async def test_create_mrd( read_handle=_TEST_READ_HANDLE, ) + mrd.read_obj_str.open.assert_called_once() + # Assert + mock_cls_async_read_object_stream.assert_called_once_with( + client=mock_grpc_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + generation_number=_TEST_GENERATION_NUMBER, + read_handle=_TEST_READ_HANDLE, + ) + mrd.read_obj_str.open.assert_called_once() assert mrd.client == mock_grpc_client @@ -83,6 +101,7 @@ async def test_create_mrd( assert mrd.object_name == _TEST_OBJECT_NAME assert mrd.generation_number == _TEST_GENERATION_NUMBER assert mrd.read_handle == _TEST_READ_HANDLE + assert mrd.is_stream_open @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" @@ -131,14 +150,6 @@ async def test_download_ranges( assert results[0].bytes_written == 18 assert buffer.getvalue() == b"these_are_18_chars" - def create_read_ranges(self, num_ranges): - ranges = [] - for i in range(num_ranges): - ranges.append( - _storage_v2.ReadRange(read_offset=i, read_length=1, read_id=i) - ) - return ranges - @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -160,3 +171,83 @@ async def test_downloading_ranges_with_more_than_1000_should_throw_error( str(exc.value) == "Invalid input - length of read_ranges cannot be more than 1000" ) + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_opening_mrd_more_than_once_should_throw_error( + self, mock_grpc_client, mock_cls_async_read_object_stream + ): + # Arrange + mrd = await self._make_mock_mrd( + mock_grpc_client, mock_cls_async_read_object_stream + ) # mock mrd is already opened + + # Act + Assert + with pytest.raises(ValueError) as exc: + await mrd.open() + + # Assert + assert str(exc.value) == "Underlying bidi-gRPC stream is already open" + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_close_mrd(self, mock_grpc_client, mock_cls_async_read_object_stream): + # Arrange + mrd = await self._make_mock_mrd( + mock_grpc_client, mock_cls_async_read_object_stream + ) # mock mrd is already opened + mrd.read_obj_str.close = AsyncMock() + + # Act + await mrd.close() + + # Assert + assert not mrd.is_stream_open + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_close_mrd_not_opened_should_throw_error(self, mock_grpc_client): + # Arrange + mrd = AsyncMultiRangeDownloader( + mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + + # Act + Assert + with pytest.raises(ValueError) as exc: + await mrd.close() + + # Assert + assert str(exc.value) == "Underlying bidi-gRPC stream is not open" + assert not mrd.is_stream_open + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_downloading_without_opening_should_throw_error( + self, mock_grpc_client + ): + # Arrange + mrd = AsyncMultiRangeDownloader( + mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + + # Act + Assert + with pytest.raises(ValueError) as exc: + await mrd.download_ranges([(0, 18, BytesIO())]) + + # Assert + assert str(exc.value) == "Underlying bidi-gRPC stream is not open" + assert not mrd.is_stream_open From cdbb26caa278bab507a152f658e2fdef2c861011 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 1 Oct 2025 14:58:53 +0530 Subject: [PATCH 389/509] chore: remove unwanted comments in AsyncMRD (#1557) chore: remove unwanted comments in AsyncMRD --- .../asyncio/async_multi_range_downloader.py | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index f9081d0d6..b9ac0f88d 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -71,43 +71,18 @@ class AsyncMultiRangeDownloader: client, bucket_name="chandrasiri-rs", object_name="test_open9" ) my_buff1 = open('my_fav_file.txt', 'wb') - my_buff1 = open('my_fav_file.txt', 'wb') my_buff2 = BytesIO() my_buff3 = BytesIO() my_buff4 = any_object_which_provides_BytesIO_like_interface() - results_arr, error_obj = await mrd.download_ranges( - my_buff4 = any_object_which_provides_BytesIO_like_interface() - results_arr, error_obj = await mrd.download_ranges( + results_arr = await mrd.download_ranges( [ - # (start_byte, bytes_to_read, writeable_buffer) # (start_byte, bytes_to_read, writeable_buffer) (0, 100, my_buff1), (100, 20, my_buff2), (200, 123, my_buff3), (300, 789, my_buff4), - (100, 20, my_buff2), - (200, 123, my_buff3), - (300, 789, my_buff4), ] ) - if error_obj: - print("Error occurred: ") - print(error_obj) - print( - "please issue call to `download_ranges` with updated" - "`read_ranges` based on diff of (bytes_requested - bytes_written)" - ) - - for result in results_arr: - print("downloaded bytes", result) - - if error_obj: - print("Error occurred: ") - print(error_obj) - print( - "please issue call to `download_ranges` with updated" - "`read_ranges` based on diff of (bytes_requested - bytes_written)" - ) for result in results_arr: print("downloaded bytes", result) From b975732f24b1e54bfd0a2c8918f3043e6e1634b6 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:26:05 +0530 Subject: [PATCH 390/509] feat(experimental): Read handle refresh (#1559) * feat(experimental): refresh read handles * fix unit tests --- .../asyncio/async_read_object_stream.py | 6 ++- .../asyncio/test_async_read_object_stream.py | 47 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index b14c55227..96e9f154a 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -145,7 +145,11 @@ async def recv(self) -> _storage_v2.BidiReadObjectResponse: """ if not self._is_stream_open: raise ValueError("Stream is not open") - return await self.socket_like_rpc.recv() + response = await self.socket_like_rpc.recv() + # Update read_handle if present in response + if response and response.read_handle: + self.read_handle = response.read_handle + return response @property def is_stream_open(self) -> bool: diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index ea91b2251..ae5a48d76 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -17,6 +17,7 @@ from unittest.mock import AsyncMock from google.cloud import _storage_v2 +from google.cloud.storage._experimental.asyncio import async_read_object_stream from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( _AsyncReadObjectStream, ) @@ -273,3 +274,49 @@ async def test_recv_without_open_should_raise_error( # assert assert str(exc.value) == "Stream is not open" + +@mock.patch("google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc") +@mock.patch("google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client") +@pytest.mark.asyncio +async def test_recv_updates_read_handle_on_refresh(mock_client, mock_cls_async_bidi_rpc): + """ + Verify that the `recv` method correctly updates the stream's handle + when a new one is provided in a server response. + """ + # Arrange + socket_like_rpc = AsyncMock() + mock_cls_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = AsyncMock() + + initial_handle = _storage_v2.BidiReadHandle(handle=b"initial-handle-token") + response_with_initial_handle = _storage_v2.BidiReadObjectResponse(read_handle=initial_handle) + response_without_handle = _storage_v2.BidiReadObjectResponse(read_handle=None) + + refreshed_handle = _storage_v2.BidiReadHandle(handle=b"new-refreshed-handle-token") + response_with_refreshed_handle = _storage_v2.BidiReadObjectResponse(read_handle=refreshed_handle) + + socket_like_rpc.recv.side_effect = [ + response_with_initial_handle, + response_without_handle, + response_with_refreshed_handle, + ] + + starting_handle = _storage_v2.BidiReadHandle(handle=b"starting-handle-token") + stream = async_read_object_stream._AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + read_handle=starting_handle, + ) + + # Act & Assert + assert stream.read_handle == starting_handle + + await stream.open() + assert stream.read_handle == initial_handle + + await stream.recv() + assert stream.read_handle == initial_handle + + await stream.recv() + assert stream.read_handle == refreshed_handle From acb918e20f7092e13d72fc63fe4ae2560bfecd40 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 8 Oct 2025 18:54:06 +0530 Subject: [PATCH 391/509] fix: send entire object checksums via upload methods (#1561) fixes #1541 : Send entire object checksums via upload methods and remove it from Object properties. * In recent release, v3.3.1 this library provided an option for users to specify entire object checksum before performing resumable upload. It introduced the bug #1541 * This PR is fixing it by providing the option to specify entire object checksum via upload methods - `upload_from_string`, `upload_from_file` and `upload_from_filename`. * **Note**: Ability to specify entire upload checksum is applicable only for [Resumable Uploads](https://cloud.google.com/storage/docs/performing-resumable-uploads) , which in this library is applicable for uploads of object greater than 8 MiB --- google/cloud/storage/blob.py | 258 ++++++++++++++++++++++++++++++--- google/cloud/storage/bucket.py | 2 - tests/system/test_blob.py | 28 ++-- tests/unit/test_blob.py | 24 ++- 4 files changed, 268 insertions(+), 44 deletions(-) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index b7d5d698a..0d6bef271 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -180,14 +180,6 @@ class Blob(_PropertyMixin): :type generation: long :param generation: (Optional) If present, selects a specific revision of this object. - - :type crc32c_checksum: str - :param crc32c_checksum: - (Optional) If set, the CRC32C checksum of the blob's content. - CRC32c checksum, as described in RFC 4960, Appendix B; encoded using - base64 in big-endian byte order. See - Apenndix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B - base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 """ _chunk_size = None # Default value for each instance. @@ -221,7 +213,6 @@ def __init__( encryption_key=None, kms_key_name=None, generation=None, - crc32c_checksum=None, ): """ property :attr:`name` @@ -244,10 +235,6 @@ def __init__( if generation is not None: self._properties["generation"] = generation - - if crc32c_checksum is not None: - self._properties["crc32c"] = crc32c_checksum - @property def bucket(self): """Bucket which contains the object. @@ -2016,9 +2003,6 @@ def _do_multipart_upload( info = self._get_upload_arguments(client, content_type, command=command) headers, object_metadata, content_type = info - if "crc32c" in self._properties: - object_metadata["crc32c"] = self._properties["crc32c"] - hostname = _get_host_name(client._connection) base_url = _MULTIPART_URL_TEMPLATE.format( hostname=hostname, @@ -2097,6 +2081,7 @@ def _initiate_resumable_upload( checksum="auto", retry=None, command=None, + crc32c_checksum_value=None, ): """Initiate a resumable upload. @@ -2192,6 +2177,38 @@ def _initiate_resumable_upload( to be included in the X-Goog-API-Client header. Please leave as None unless otherwise directed. + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `file`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 + :rtype: tuple :returns: Pair of @@ -2214,8 +2231,8 @@ def _initiate_resumable_upload( if extra_headers is not None: headers.update(extra_headers) - if "crc32c" in self._properties: - object_metadata["crc32c"] = self._properties["crc32c"] + if crc32c_checksum_value is not None: + object_metadata["crc32c"] = crc32c_checksum_value hostname = _get_host_name(client._connection) base_url = _RESUMABLE_URL_TEMPLATE.format( @@ -2292,6 +2309,7 @@ def _do_resumable_upload( checksum="auto", retry=None, command=None, + crc32c_checksum_value=None, ): """Perform a resumable upload. @@ -2377,6 +2395,38 @@ def _do_resumable_upload( to be included in the X-Goog-API-Client header. Please leave as None unless otherwise directed. + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `stream`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 + :rtype: :class:`~requests.Response` :returns: The "200 OK" response object returned after the final chunk is uploaded. @@ -2395,6 +2445,7 @@ def _do_resumable_upload( checksum=checksum, retry=retry, command=command, + crc32c_checksum_value=crc32c_checksum_value, ) extra_attributes = { "url.full": upload.resumable_url, @@ -2432,6 +2483,7 @@ def _do_upload( checksum="auto", retry=None, command=None, + crc32c_checksum_value=None, ): """Determine an upload strategy and then perform the upload. @@ -2525,6 +2577,38 @@ def _do_upload( to be included in the X-Goog-API-Client header. Please leave as None unless otherwise directed. + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `file_obj`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 + :rtype: dict :returns: The parsed JSON from the "200 OK" response. This will be the **only** response in the multipart case and it will be the @@ -2574,6 +2658,7 @@ def _do_upload( checksum=checksum, retry=retry, command=command, + crc32c_checksum_value=crc32c_checksum_value, ) return response.json() @@ -2594,6 +2679,7 @@ def _prep_and_do_upload( checksum="auto", retry=DEFAULT_RETRY, command=None, + crc32c_checksum_value=None, ): """Upload the contents of this blob from a file-like object. @@ -2708,6 +2794,38 @@ def _prep_and_do_upload( to be included in the X-Goog-API-Client header. Please leave as None unless otherwise directed. + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `file_obj`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 + :raises: :class:`~google.cloud.exceptions.GoogleCloudError` if the upload response returns an error status. """ @@ -2729,6 +2847,7 @@ def _prep_and_do_upload( checksum=checksum, retry=retry, command=command, + crc32c_checksum_value=crc32c_checksum_value, ) self._set_properties(created_json) except InvalidResponse as exc: @@ -2749,6 +2868,7 @@ def upload_from_file( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + crc32c_checksum_value=None, ): """Upload the contents of this blob from a file-like object. @@ -2857,6 +2977,38 @@ def upload_from_file( (google.cloud.storage.retry) for information on retry types and how to configure them. + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `file_obj`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 + :raises: :class:`~google.cloud.exceptions.GoogleCloudError` if the upload response returns an error status. """ @@ -2875,6 +3027,7 @@ def upload_from_file( timeout=timeout, checksum=checksum, retry=retry, + crc32c_checksum_value=crc32c_checksum_value, ) def _handle_filename_and_upload(self, filename, content_type=None, *args, **kwargs): @@ -2914,6 +3067,8 @@ def upload_from_filename( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + crc32c_checksum_value=None, + ): """Upload this blob's contents from the content of a named file. @@ -3008,6 +3163,38 @@ def upload_from_filename( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `filename`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 """ with create_trace_span(name="Storage.Blob.uploadFromFilename"): self._handle_filename_and_upload( @@ -3022,6 +3209,7 @@ def upload_from_filename( timeout=timeout, checksum=checksum, retry=retry, + crc32c_checksum_value=crc32c_checksum_value, ) def upload_from_string( @@ -3037,6 +3225,7 @@ def upload_from_string( timeout=_DEFAULT_TIMEOUT, checksum="auto", retry=DEFAULT_RETRY, + crc32c_checksum_value=None, ): """Upload contents of this blob from the provided string. @@ -3123,6 +3312,38 @@ def upload_from_string( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. + + :type crc32c_checksum_value: str + :param crc32c_checksum_value: (Optional) This should be the checksum of + the entire contents of `file_obj`. Applicable while uploading object + greater than `_MAX_MULTIPART_SIZE` bytes. + + It can be obtained by running + + `gcloud storage hash /path/to/your/file` + + or + + .. code-block:: python + + import google_crc32c + import base64 + + data = b"Hello, world!" + crc32c_int = google_crc32c.value(data) + crc32c_hex = f"{crc32c_int:08x}" + crc32c_bytes = crc32c_int.to_bytes(4, "big") + base64_encoded = base64.b64encode(crc32c_bytes) + crc32c_base64 = base64_encoded.decode("utf-8") + + print(crc32c_base64) + + Above code block prints 8 char string of base64 encoded big-endian + bytes of 32 bit CRC32c integer. + + More details on CRC32c can be found in Appendix B: + https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and + base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 """ with create_trace_span(name="Storage.Blob.uploadFromString"): data = _to_bytes(data, encoding="utf-8") @@ -3140,6 +3361,7 @@ def upload_from_string( timeout=timeout, checksum=checksum, retry=retry, + crc32c_checksum_value=crc32c_checksum_value, ) def create_resumable_upload_session( diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index a9277e09d..0d1f9192b 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -849,7 +849,6 @@ def blob( encryption_key=None, kms_key_name=None, generation=None, - crc32c_checksum=None, ): """Factory constructor for blob object. @@ -895,7 +894,6 @@ def blob( encryption_key=encryption_key, kms_key_name=kms_key_name, generation=generation, - crc32c_checksum=crc32c_checksum, ) def notification( diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index 12ee4c6db..add994d17 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -43,15 +43,12 @@ def test_large_file_write_from_stream_w_user_provided_checksum( shared_bucket, blobs_to_delete, file_data, - service_account, ): - blob = shared_bucket.blob( - f"LargeFile{uuid.uuid4().hex}", crc32c_checksum="20tD7w==" - ) + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") info = file_data["big_9MiB"] with open(info["path"], "rb") as file_obj: - blob.upload_from_file(file_obj) + blob.upload_from_file(file_obj, crc32c_checksum_value="20tD7w==") blobs_to_delete.append(blob) @@ -59,19 +56,30 @@ def test_large_file_write_from_stream_w_user_provided_wrong_checksum( shared_bucket, blobs_to_delete, file_data, - service_account, ): - blob = shared_bucket.blob( - f"LargeFile{uuid.uuid4().hex}", crc32c_checksum="A0tD7w==" - ) + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") info = file_data["big_9MiB"] with pytest.raises(exceptions.BadRequest) as excep_info: with open(info["path"], "rb") as file_obj: - blob.upload_from_file(file_obj) + blob.upload_from_file(file_obj,crc32c_checksum_value="A0tD7w==") blobs_to_delete.append(blob) assert excep_info.value.code == 400 +def test_touch_and_write_large_file_w_user_provided_checksum( + shared_bucket, + blobs_to_delete, + file_data, +): + blob = shared_bucket.blob(f"LargeFile{uuid.uuid4().hex}") + blob.upload_from_string(b"") + blob.reload() + + info = file_data["big_9MiB"] + with open(info["path"], "rb") as file_obj: + blob.upload_from_file(file_obj, crc32c_checksum_value="20tD7w==") + blobs_to_delete.append(blob) + def test_large_file_write_from_stream( shared_bucket, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 20f7d730e..4404cdf56 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -2762,21 +2762,13 @@ def _initiate_resumable_helper( metadata=None, mtls=False, retry=None, - crc32c_checksum=None, + crc32c_checksum_value=None, ): from google.cloud.storage._media.requests import ResumableUpload from google.cloud.storage.blob import _DEFAULT_CHUNKSIZE bucket = _Bucket(name="whammy", user_project=user_project) - if crc32c_checksum is None: - blob = self._make_one("blob-name", bucket=bucket, kms_key_name=kms_key_name) - else: - blob = self._make_one( - "blob-name", - bucket=bucket, - kms_key_name=kms_key_name, - crc32c_checksum=crc32c_checksum, - ) + blob = self._make_one("blob-name", bucket=bucket, kms_key_name=kms_key_name) if metadata: self.assertIsNone(blob.metadata) blob._properties["metadata"] = metadata @@ -2841,6 +2833,7 @@ def _initiate_resumable_helper( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, retry=retry, + crc32c_checksum_value=crc32c_checksum_value, **timeout_kwarg, ) @@ -2929,8 +2922,8 @@ def _initiate_resumable_helper( # Check the mocks. blob._get_writable_metadata.assert_called_once_with() - if "crc32c" in blob._properties: - object_metadata["crc32c"] = blob._properties["crc32c"] + if crc32c_checksum_value is not None: + object_metadata["crc32c"] = crc32c_checksum_value payload = json.dumps(object_metadata).encode("utf-8") @@ -2960,12 +2953,12 @@ def test__initiate_resumable_upload_with_metadata(self): def test__initiate_resumable_upload_with_user_provided_checksum(self): self._initiate_resumable_helper( - crc32c_checksum="this-is-a-fake-checksum-for-unit-tests", + crc32c_checksum_value="this-is-a-fake-checksum-for-unit-tests", ) def test__initiate_resumable_upload_w_metadata_and_user_provided_checksum(self): self._initiate_resumable_helper( - crc32c_checksum="test-checksum", + crc32c_checksum_value="test-checksum", metadata={"my-fav-key": "my-fav-value"}, ) @@ -3425,6 +3418,7 @@ def _do_upload_helper( checksum=None, retry=retry, command=None, + crc32c_checksum_value=None, ) def test__do_upload_uses_multipart(self): @@ -3513,6 +3507,7 @@ def _upload_from_file_helper(self, side_effect=None, **kwargs): checksum=None, retry=retry, command=None, + crc32c_checksum_value=None, ) return stream @@ -3577,6 +3572,7 @@ def _do_upload_mock_call_helper( kwargs, { "timeout": expected_timeout, + 'crc32c_checksum_value': None, "checksum": None, "retry": retry, "command": None, From 5ee391db2b2a9ffe92113359333151803acea259 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:25:48 +0530 Subject: [PATCH 392/509] chore(main): release 3.4.1 (#1552) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(main): release 3.4.1 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Update CHANGELOG.md Don't bump minor version for experimental changes. * Update just the minor version. Update just the minor version. Don't update minor version for experimental features. * Update version.py from 3.5.0 to 3.4.1 Update just the patch version. Don't update (bump up) minor version for experimental features. --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot Co-authored-by: Chandra Shekhar Sirimala --- CHANGELOG.md | 6 +++ google/cloud/storage/blob.py | 46 +++++++++---------- google/cloud/storage/version.py | 2 +- tests/system/test_blob.py | 3 +- .../asyncio/test_async_read_object_stream.py | 21 +++++++-- tests/unit/test_blob.py | 2 +- 6 files changed, 49 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 727a3a8cc..144092d1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.4.1](https://github.com/googleapis/python-storage/compare/v3.4.0...v3.5.0) (2025-10-08) + +### Bug Fixes + +* Fixes [#1561](https://github.com/googleapis/python-storage/issues/1561) by adding an option to specify the entire object checksum for resumable uploads via the `upload_from_string`, `upload_from_file`, and `upload_from_filename` methods ([acb918e](https://github.com/googleapis/python-storage/commit/acb918e20f7092e13d72fc63fe4ae2560bfecd40)) + ## [3.4.0](https://github.com/googleapis/python-storage/compare/v3.3.1...v3.4.0) (2025-09-15) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 0d6bef271..381ce5c9d 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -235,6 +235,7 @@ def __init__( if generation is not None: self._properties["generation"] = generation + @property def bucket(self): """Bucket which contains the object. @@ -2178,12 +2179,12 @@ def _initiate_resumable_upload( unless otherwise directed. :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `file`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -2204,7 +2205,7 @@ def _initiate_resumable_upload( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 @@ -2396,12 +2397,12 @@ def _do_resumable_upload( unless otherwise directed. :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `stream`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -2422,7 +2423,7 @@ def _do_resumable_upload( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 @@ -2578,12 +2579,12 @@ def _do_upload( unless otherwise directed. :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `file_obj`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -2604,7 +2605,7 @@ def _do_upload( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 @@ -2795,12 +2796,12 @@ def _prep_and_do_upload( unless otherwise directed. :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `file_obj`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -2821,7 +2822,7 @@ def _prep_and_do_upload( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 @@ -2978,12 +2979,12 @@ def upload_from_file( to configure them. :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `file_obj`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -3004,7 +3005,7 @@ def upload_from_file( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 @@ -3068,7 +3069,6 @@ def upload_from_filename( checksum="auto", retry=DEFAULT_RETRY, crc32c_checksum_value=None, - ): """Upload this blob's contents from the content of a named file. @@ -3163,14 +3163,14 @@ def upload_from_filename( See the retry.py source code and docstrings in this package (google.cloud.storage.retry) for information on retry types and how to configure them. - + :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `filename`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -3191,7 +3191,7 @@ def upload_from_filename( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 @@ -3314,12 +3314,12 @@ def upload_from_string( to configure them. :type crc32c_checksum_value: str - :param crc32c_checksum_value: (Optional) This should be the checksum of + :param crc32c_checksum_value: (Optional) This should be the checksum of the entire contents of `file_obj`. Applicable while uploading object greater than `_MAX_MULTIPART_SIZE` bytes. It can be obtained by running - + `gcloud storage hash /path/to/your/file` or @@ -3340,7 +3340,7 @@ def upload_from_string( Above code block prints 8 char string of base64 encoded big-endian bytes of 32 bit CRC32c integer. - + More details on CRC32c can be found in Appendix B: https://datatracker.ietf.org/doc/html/rfc4960#appendix-B and base64: https://datatracker.ietf.org/doc/html/rfc4648#section-4 diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 6b822f0c1..71133df01 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.4.0" +__version__ = "3.4.1" diff --git a/tests/system/test_blob.py b/tests/system/test_blob.py index add994d17..59c665cfa 100644 --- a/tests/system/test_blob.py +++ b/tests/system/test_blob.py @@ -62,10 +62,11 @@ def test_large_file_write_from_stream_w_user_provided_wrong_checksum( info = file_data["big_9MiB"] with pytest.raises(exceptions.BadRequest) as excep_info: with open(info["path"], "rb") as file_obj: - blob.upload_from_file(file_obj,crc32c_checksum_value="A0tD7w==") + blob.upload_from_file(file_obj, crc32c_checksum_value="A0tD7w==") blobs_to_delete.append(blob) assert excep_info.value.code == 400 + def test_touch_and_write_large_file_w_user_provided_checksum( shared_bucket, blobs_to_delete, diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index ae5a48d76..4e4c93dd3 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -275,10 +275,17 @@ async def test_recv_without_open_should_raise_error( # assert assert str(exc.value) == "Stream is not open" -@mock.patch("google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc") -@mock.patch("google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client") + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) @pytest.mark.asyncio -async def test_recv_updates_read_handle_on_refresh(mock_client, mock_cls_async_bidi_rpc): +async def test_recv_updates_read_handle_on_refresh( + mock_client, mock_cls_async_bidi_rpc +): """ Verify that the `recv` method correctly updates the stream's handle when a new one is provided in a server response. @@ -289,11 +296,15 @@ async def test_recv_updates_read_handle_on_refresh(mock_client, mock_cls_async_b socket_like_rpc.open = AsyncMock() initial_handle = _storage_v2.BidiReadHandle(handle=b"initial-handle-token") - response_with_initial_handle = _storage_v2.BidiReadObjectResponse(read_handle=initial_handle) + response_with_initial_handle = _storage_v2.BidiReadObjectResponse( + read_handle=initial_handle + ) response_without_handle = _storage_v2.BidiReadObjectResponse(read_handle=None) refreshed_handle = _storage_v2.BidiReadHandle(handle=b"new-refreshed-handle-token") - response_with_refreshed_handle = _storage_v2.BidiReadObjectResponse(read_handle=refreshed_handle) + response_with_refreshed_handle = _storage_v2.BidiReadObjectResponse( + read_handle=refreshed_handle + ) socket_like_rpc.recv.side_effect = [ response_with_initial_handle, diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 4404cdf56..f3b6da5d1 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -3572,7 +3572,7 @@ def _do_upload_mock_call_helper( kwargs, { "timeout": expected_timeout, - 'crc32c_checksum_value': None, + "crc32c_checksum_value": None, "checksum": None, "retry": retry, "command": None, From 93ce515d60f0ac77ab83680ba2b4d6a9f57e75d0 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:45:32 +0530 Subject: [PATCH 393/509] feat(experimental): add checksum for bidi reads operation (#1566) * feat(experimental): add checksum for bidi reads operation * resolving comments --- .../asyncio/async_multi_range_downloader.py | 28 +++++++- .../test_async_multi_range_downloader.py | 64 ++++++++++++++++++- 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index b9ac0f88d..d8b8eeb1c 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -13,6 +13,9 @@ # limitations under the License. from __future__ import annotations +import google_crc32c +from google.api_core import exceptions +from google_crc32c import Checksum from typing import List, Optional, Tuple @@ -25,6 +28,7 @@ from io import BytesIO from google.cloud import _storage_v2 +from google.cloud.storage.exceptions import DataCorruption _MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 @@ -153,6 +157,16 @@ def __init__( :type read_handle: bytes :param read_handle: (Optional) An existing read handle. """ + + # Verify that the fast, C-accelerated version of crc32c is available. + # If not, raise an error to prevent silent performance degradation. + if google_crc32c.implementation != "c": + raise exceptions.NotFound( + "The google-crc32c package is not installed with C support. " + "Bidi reads require the C extension for data integrity checks." + "For more information, see https://github.com/googleapis/python-crc32c." + ) + self.client = client self.bucket_name = bucket_name self.object_name = object_name @@ -248,7 +262,19 @@ async def download_ranges( if object_data_range.read_range is None: raise Exception("Invalid response, read_range is None") - data = object_data_range.checksummed_data.content + checksummed_data = object_data_range.checksummed_data + data = checksummed_data.content + server_checksum = checksummed_data.crc32c + + client_crc32c = Checksum(data).digest() + client_checksum = int.from_bytes(client_crc32c, "big") + + if server_checksum != client_checksum: + raise DataCorruption(response, + f"Checksum mismatch for read_id {object_data_range.read_range.read_id}. " + f"Server sent {server_checksum}, client calculated {client_checksum}." + ) + read_id = object_data_range.read_range.read_id buffer = read_id_to_writable_buffer_dict[read_id] buffer.write(data) diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 27d1ed6dd..529aa4559 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -16,11 +16,15 @@ from unittest import mock from unittest.mock import AsyncMock from google.cloud import _storage_v2 +from google.api_core import exceptions +from google_crc32c import Checksum from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) +from google.cloud.storage._experimental.asyncio import async_read_object_stream from io import BytesIO +from google.cloud.storage.exceptions import DataCorruption _TEST_BUCKET_NAME = "test-bucket" @@ -114,6 +118,10 @@ async def test_download_ranges( self, mock_grpc_client, mock_cls_async_read_object_stream ): # Arrange + data = b"these_are_18_chars" + crc32c = Checksum(data).digest() + crc32c_int = int.from_bytes(crc32c, "big") + mock_mrd = await self._make_mock_mrd( mock_grpc_client, mock_cls_async_read_object_stream ) @@ -123,7 +131,7 @@ async def test_download_ranges( object_data_ranges=[ _storage_v2.ObjectRangeData( checksummed_data=_storage_v2.ChecksummedData( - content=b"these_are_18_chars", crc32c=123 + content=data, crc32c=crc32c_int ), range_end=True, read_range=_storage_v2.ReadRange( @@ -148,7 +156,7 @@ async def test_download_ranges( assert len(results) == 1 assert results[0].bytes_requested == 18 assert results[0].bytes_written == 18 - assert buffer.getvalue() == b"these_are_18_chars" + assert buffer.getvalue() == data @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" @@ -251,3 +259,55 @@ async def test_downloading_without_opening_should_throw_error( # Assert assert str(exc.value) == "Underlying bidi-gRPC stream is not open" assert not mrd.is_stream_open + + @mock.patch("google.cloud.storage._experimental.asyncio.async_multi_range_downloader.google_crc32c") + @mock.patch("google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client") + def test_init_raises_if_crc32c_c_extension_is_missing( + self, mock_grpc_client, mock_google_crc32c + ): + mock_google_crc32c.implementation = "python" + + with pytest.raises(exceptions.NotFound) as exc_info: + AsyncMultiRangeDownloader( + mock_grpc_client, "bucket", "object" + ) + + assert "The google-crc32c package is not installed with C support" in str(exc_info.value) + + @pytest.mark.asyncio + @mock.patch("google.cloud.storage._experimental.asyncio.async_multi_range_downloader.Checksum") + @mock.patch("google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client") + async def test_download_ranges_raises_on_checksum_mismatch(self, mock_client, mock_checksum_class): + mock_stream = mock.AsyncMock(spec=async_read_object_stream._AsyncReadObjectStream) + + test_data = b"some-data" + server_checksum = 12345 + mock_checksum_instance = mock_checksum_class.return_value + mock_checksum_instance.digest.return_value = (54321).to_bytes(4, "big") + + mock_response = _storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + _storage_v2.ObjectRangeData( + checksummed_data=_storage_v2.ChecksummedData( + content=test_data, crc32c=server_checksum + ), + read_range=_storage_v2.ReadRange(read_id=0), + range_end=True, + ) + ] + ) + + mock_stream.recv.side_effect = [mock_response, None] + + mrd = AsyncMultiRangeDownloader( + mock_client, "bucket", "object" + ) + mrd.read_obj_str = mock_stream + mrd._is_stream_open = True + + with pytest.raises(DataCorruption) as exc_info: + await mrd.download_ranges([(0, len(test_data), BytesIO())]) + + assert "Checksum mismatch" in str(exc_info.value) + mock_checksum_class.assert_called_once_with(test_data) + From a38ca1977694def98f65ae7239e300a987bbd262 Mon Sep 17 00:00:00 2001 From: Rajiv Podar Date: Wed, 22 Oct 2025 17:30:23 +0530 Subject: [PATCH 394/509] fix: Redact sensitive data from OTEL traces and fix env var parsing (#1553) fix: Redact sensitive data from OTEL traces and fix env var parsing (#1553) --- .../asyncio/async_multi_range_downloader.py | 5 +- .../cloud/storage/_opentelemetry_tracing.py | 44 +++++- google/cloud/storage/blob.py | 30 ++-- .../test_async_multi_range_downloader.py | 37 +++-- tests/unit/test__opentelemetry_tracing.py | 140 +++++++++++++++--- tests/unit/test_client.py | 2 + 6 files changed, 201 insertions(+), 57 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index d8b8eeb1c..56aba3e27 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -270,9 +270,10 @@ async def download_ranges( client_checksum = int.from_bytes(client_crc32c, "big") if server_checksum != client_checksum: - raise DataCorruption(response, + raise DataCorruption( + response, f"Checksum mismatch for read_id {object_data_range.read_range.read_id}. " - f"Server sent {server_checksum}, client calculated {client_checksum}." + f"Server sent {server_checksum}, client calculated {client_checksum}.", ) read_id = object_data_range.read_range.read_id diff --git a/google/cloud/storage/_opentelemetry_tracing.py b/google/cloud/storage/_opentelemetry_tracing.py index 3416081cd..b654aae2b 100644 --- a/google/cloud/storage/_opentelemetry_tracing.py +++ b/google/cloud/storage/_opentelemetry_tracing.py @@ -18,7 +18,7 @@ import os from contextlib import contextmanager - +from urllib.parse import urlparse from google.api_core import exceptions as api_exceptions from google.api_core import retry as api_retry from google.cloud.storage import __version__ @@ -28,7 +28,15 @@ ENABLE_OTEL_TRACES_ENV_VAR = "ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACES" _DEFAULT_ENABLE_OTEL_TRACES_VALUE = False -enable_otel_traces = os.environ.get( + +def _parse_bool_env(name: str, default: bool = False) -> bool: + val = os.environ.get(name, None) + if val is None: + return default + return str(val).strip().lower() in {"1", "true", "yes", "on"} + + +enable_otel_traces = _parse_bool_env( ENABLE_OTEL_TRACES_ENV_VAR, _DEFAULT_ENABLE_OTEL_TRACES_VALUE ) logger = logging.getLogger(__name__) @@ -105,11 +113,10 @@ def _set_api_request_attr(request, client): if request.get("method"): attr["http.request.method"] = request.get("method") if request.get("path"): - path = request.get("path") - full_path = f"{client._connection.API_BASE_URL}{path}" - attr["url.full"] = full_path - if request.get("timeout"): - attr["connect_timeout,read_timeout"] = request.get("timeout") + full_url = client._connection.build_api_url(request.get("path")) + attr.update(_get_opentelemetry_attributes_from_url(full_url, strip_query=True)) + if "timeout" in request: + attr["connect_timeout,read_timeout"] = str(request.get("timeout")) return attr @@ -117,3 +124,26 @@ def _set_retry_attr(retry, conditional_predicate=None): predicate = conditional_predicate if conditional_predicate else retry._predicate retry_info = f"multiplier{retry._multiplier}/deadline{retry._deadline}/max{retry._maximum}/initial{retry._initial}/predicate{predicate}" return {"retry": retry_info} + + +def _get_opentelemetry_attributes_from_url(url, strip_query=True): + """Helper to assemble OpenTelemetry span attributes from a URL.""" + u = urlparse(url) + netloc = u.netloc + # u.hostname is always lowercase. We parse netloc to preserve casing. + # netloc format: [userinfo@]host[:port] + if "@" in netloc: + netloc = netloc.split("@", 1)[1] + if ":" in netloc and not netloc.endswith("]"): # Handle IPv6 literal + netloc = netloc.split(":", 1)[0] + + attributes = { + "server.address": netloc, + "server.port": u.port, + "url.scheme": u.scheme, + "url.path": u.path, + } + if not strip_query: + attributes["url.query"] = u.query + + return attributes diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 381ce5c9d..746334d1c 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -47,6 +47,9 @@ from google.cloud._helpers import _rfc3339_nanos_to_datetime from google.cloud._helpers import _to_bytes from google.cloud.exceptions import NotFound +from google.cloud.storage._opentelemetry_tracing import ( + _get_opentelemetry_attributes_from_url, +) from google.cloud.storage._helpers import _add_etag_match_headers from google.cloud.storage._helpers import _add_generation_match_parameters from google.cloud.storage._helpers import _PropertyMixin @@ -1055,13 +1058,11 @@ def _do_download( Please enable this as per your use case. """ - extra_attributes = { - "url.full": download_url, - "download.chunk_size": f"{self.chunk_size}", - "download.raw_download": raw_download, - "upload.checksum": f"{checksum}", - "download.single_shot_download": single_shot_download, - } + extra_attributes = _get_opentelemetry_attributes_from_url(download_url) + extra_attributes["download.chunk_size"] = f"{self.chunk_size}" + extra_attributes["download.raw_download"] = raw_download + extra_attributes["upload.checksum"] = f"{checksum}" + extra_attributes["download.single_shot_download"] = single_shot_download args = {"timeout": timeout} if self.chunk_size is None: @@ -2048,10 +2049,8 @@ def _do_multipart_upload( upload_url, headers=headers, checksum=checksum, retry=retry ) - extra_attributes = { - "url.full": upload_url, - "upload.checksum": f"{checksum}", - } + extra_attributes = _get_opentelemetry_attributes_from_url(upload_url) + extra_attributes["upload.checksum"] = f"{checksum}" args = {"timeout": timeout} with create_trace_span( name="Storage.MultipartUpload/transmit", @@ -2448,11 +2447,10 @@ def _do_resumable_upload( command=command, crc32c_checksum_value=crc32c_checksum_value, ) - extra_attributes = { - "url.full": upload.resumable_url, - "upload.chunk_size": upload.chunk_size, - "upload.checksum": f"{checksum}", - } + extra_attributes = _get_opentelemetry_attributes_from_url(upload.resumable_url) + extra_attributes["upload.chunk_size"] = upload.chunk_size + extra_attributes["upload.checksum"] = f"{checksum}" + args = {"timeout": timeout} with create_trace_span( name="Storage.ResumableUpload/transmitNextChunk", diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 529aa4559..8c1137980 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -260,25 +260,37 @@ async def test_downloading_without_opening_should_throw_error( assert str(exc.value) == "Underlying bidi-gRPC stream is not open" assert not mrd.is_stream_open - @mock.patch("google.cloud.storage._experimental.asyncio.async_multi_range_downloader.google_crc32c") - @mock.patch("google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client") + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.google_crc32c" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) def test_init_raises_if_crc32c_c_extension_is_missing( self, mock_grpc_client, mock_google_crc32c ): mock_google_crc32c.implementation = "python" with pytest.raises(exceptions.NotFound) as exc_info: - AsyncMultiRangeDownloader( - mock_grpc_client, "bucket", "object" - ) + AsyncMultiRangeDownloader(mock_grpc_client, "bucket", "object") - assert "The google-crc32c package is not installed with C support" in str(exc_info.value) + assert "The google-crc32c package is not installed with C support" in str( + exc_info.value + ) @pytest.mark.asyncio - @mock.patch("google.cloud.storage._experimental.asyncio.async_multi_range_downloader.Checksum") - @mock.patch("google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client") - async def test_download_ranges_raises_on_checksum_mismatch(self, mock_client, mock_checksum_class): - mock_stream = mock.AsyncMock(spec=async_read_object_stream._AsyncReadObjectStream) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.Checksum" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + async def test_download_ranges_raises_on_checksum_mismatch( + self, mock_client, mock_checksum_class + ): + mock_stream = mock.AsyncMock( + spec=async_read_object_stream._AsyncReadObjectStream + ) test_data = b"some-data" server_checksum = 12345 @@ -299,9 +311,7 @@ async def test_download_ranges_raises_on_checksum_mismatch(self, mock_client, mo mock_stream.recv.side_effect = [mock_response, None] - mrd = AsyncMultiRangeDownloader( - mock_client, "bucket", "object" - ) + mrd = AsyncMultiRangeDownloader(mock_client, "bucket", "object") mrd.read_obj_str = mock_stream mrd._is_stream_open = True @@ -310,4 +320,3 @@ async def test_download_ranges_raises_on_checksum_mismatch(self, mock_client, mo assert "Checksum mismatch" in str(exc_info.value) mock_checksum_class.assert_called_once_with(test_data) - diff --git a/tests/unit/test__opentelemetry_tracing.py b/tests/unit/test__opentelemetry_tracing.py index bdbb40fd2..c1660dd5e 100644 --- a/tests/unit/test__opentelemetry_tracing.py +++ b/tests/unit/test__opentelemetry_tracing.py @@ -58,6 +58,13 @@ def setup_optin(mock_os_environ): importlib.reload(_opentelemetry_tracing) +@pytest.fixture() +def setup_optout(mock_os_environ): + """Mock envar to opt-in tracing for storage client.""" + mock_os_environ["ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACES"] = "False" + importlib.reload(_opentelemetry_tracing) + + def test_opentelemetry_not_installed(setup, monkeypatch): monkeypatch.setitem(sys.modules, "opentelemetry", None) importlib.reload(_opentelemetry_tracing) @@ -83,6 +90,13 @@ def test_enable_trace_yield_span(setup, setup_optin): assert span is not None +def test_disable_traces(setup, setup_optout): + assert _opentelemetry_tracing.HAS_OPENTELEMETRY + assert not _opentelemetry_tracing.enable_otel_traces + with _opentelemetry_tracing.create_trace_span("No-ops for opentelemetry") as span: + assert span is None + + def test_enable_trace_call(setup, setup_optin): from opentelemetry import trace as trace_api @@ -136,7 +150,7 @@ def test_get_final_attributes(setup, setup_optin): } api_request = { "method": "GET", - "path": "/foo/bar/baz", + "path": "/foo/bar/baz?sensitive=true", "timeout": (100, 100), } retry_obj = api_retry.Retry() @@ -147,15 +161,19 @@ def test_get_final_attributes(setup, setup_optin): "rpc.system": "http", "user_agent.original": f"gcloud-python/{__version__}", "http.request.method": "GET", - "url.full": "https://testOtel.org/foo/bar/baz", - "connect_timeout,read_timeout": (100, 100), + "server.address": "testOtel.org", + "url.path": "/foo/bar/baz", + "url.scheme": "https", + "connect_timeout,read_timeout": str((100, 100)), "retry": f"multiplier{retry_obj._multiplier}/deadline{retry_obj._deadline}/max{retry_obj._maximum}/initial{retry_obj._initial}/predicate{retry_obj._predicate}", } expected_attributes.update(_opentelemetry_tracing._cloud_trace_adoption_attrs) with mock.patch("google.cloud.storage.client.Client") as test_client: test_client.project = "test_project" - test_client._connection.API_BASE_URL = "https://testOtel.org" + test_client._connection.build_api_url.return_value = ( + "https://testOtel.org/foo/bar/baz?sensitive=true" + ) with _opentelemetry_tracing.create_trace_span( test_span_name, attributes=test_span_attributes, @@ -165,6 +183,7 @@ def test_get_final_attributes(setup, setup_optin): ) as span: assert span is not None assert span.name == test_span_name + assert "url.query" not in span.attributes assert span.attributes == expected_attributes @@ -196,23 +215,108 @@ def test_set_conditional_retry_attr(setup, setup_optin): assert span.attributes == expected_attributes -def test_set_api_request_attr(): - from google.cloud.storage import Client +def test__get_opentelemetry_attributes_from_url(): + url = "https://example.com:8080/path?query=true" + expected = { + "server.address": "example.com", + "server.port": 8080, + "url.scheme": "https", + "url.path": "/path", + } + # Test stripping query + attrs = _opentelemetry_tracing._get_opentelemetry_attributes_from_url( + url, strip_query=True + ) + assert attrs == expected + assert "url.query" not in attrs + + # Test not stripping query + expected["url.query"] = "query=true" + attrs = _opentelemetry_tracing._get_opentelemetry_attributes_from_url( + url, strip_query=False + ) + assert attrs == expected - test_client = Client() - args_method = {"method": "GET"} - expected_attributes = {"http.request.method": "GET"} - attr = _opentelemetry_tracing._set_api_request_attr(args_method, test_client) - assert attr == expected_attributes - args_path = {"path": "/foo/bar/baz"} - expected_attributes = {"url.full": "https://storage.googleapis.com/foo/bar/baz"} - attr = _opentelemetry_tracing._set_api_request_attr(args_path, test_client) - assert attr == expected_attributes +def test__get_opentelemetry_attributes_from_url_with_query(): + url = "https://example.com/path?query=true&another=false" + expected = { + "server.address": "example.com", + "server.port": None, + "url.scheme": "https", + "url.path": "/path", + "url.query": "query=true&another=false", + } + # Test not stripping query + attrs = _opentelemetry_tracing._get_opentelemetry_attributes_from_url( + url, strip_query=False + ) + assert attrs == expected - args_timeout = {"timeout": (100, 100)} + +def test_set_api_request_attr_with_pii_in_query(): + client = mock.Mock() + client._connection.build_api_url.return_value = ( + "https://example.com/path?sensitive=true&token=secret" + ) + + request = { + "method": "GET", + "path": "/path?sensitive=true&token=secret", + "timeout": 60, + } expected_attributes = { - "connect_timeout,read_timeout": (100, 100), + "http.request.method": "GET", + "server.address": "example.com", + "server.port": None, + "url.scheme": "https", + "url.path": "/path", + "connect_timeout,read_timeout": "60", } - attr = _opentelemetry_tracing._set_api_request_attr(args_timeout, test_client) + attr = _opentelemetry_tracing._set_api_request_attr(request, client) assert attr == expected_attributes + assert "url.query" not in attr # Ensure query with PII is not captured + + +def test_set_api_request_attr_no_timeout(): + client = mock.Mock() + client._connection.build_api_url.return_value = "https://example.com/path" + + request = {"method": "GET", "path": "/path"} + attr = _opentelemetry_tracing._set_api_request_attr(request, client) + assert "connect_timeout,read_timeout" not in attr + + +@pytest.mark.parametrize( + "env_value, default, expected", + [ + # Test default values when env var is not set + (None, False, False), + (None, True, True), + # Test truthy values + ("1", False, True), + ("true", False, True), + ("yes", False, True), + ("on", False, True), + ("TRUE", False, True), + (" Yes ", False, True), + # Test falsy values + ("0", False, False), + ("false", False, False), + ("no", False, False), + ("off", False, False), + ("any_other_string", False, False), + ("", False, False), + # Test with default=True and falsy values + ("false", True, False), + ("0", True, False), + ], +) +def test__parse_bool_env(monkeypatch, env_value, default, expected): + env_var_name = "TEST_ENV_VAR" + monkeypatch.setenv( + env_var_name, str(env_value) + ) if env_value is not None else monkeypatch.delenv(env_var_name, raising=False) + + result = _opentelemetry_tracing._parse_bool_env(env_var_name, default) + assert result is expected diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index db8094a95..99de31961 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -684,6 +684,7 @@ def test__list_resource_w_defaults(self): credentials = _make_credentials() client = self._make_one(project=project, credentials=credentials) connection = client._base_connection = _make_connection() + connection.build_api_url = mock.Mock(return_value="http://example.com" + path) iterator = client._list_resource( path=path, @@ -719,6 +720,7 @@ def test__list_resource_w_explicit(self): credentials = _make_credentials() client = self._make_one(project=project, credentials=credentials) connection = client._base_connection = _make_connection() + connection.build_api_url = mock.Mock(return_value="http://example.com" + path) iterator = client._list_resource( path=path, From 961536c7bf3652a824c207754317030526b9dd28 Mon Sep 17 00:00:00 2001 From: Dimitri John Ledkov <19779+xnox@users.noreply.github.com> Date: Thu, 23 Oct 2025 06:28:18 +0100 Subject: [PATCH 395/509] feat: Indicate that md5 is used as a CRC (#1522) MD5 in storage helpers is used as a CRC function for non-cryptographically secure purposes. Ensure that md5 is initiated with `usedforsecurity=False` to ensure that Python in FIPS mode can fetch MD5 implementation for such non cryptographically secure purpose. This is no effective change on non-FIPS mode Python installations. This improves compatibility with most FIPS mode Python installations. Co-authored-by: Chandra Shekhar Sirimala --- google/cloud/storage/_helpers.py | 6 +++++- tests/unit/test__helpers.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 674dced79..236480a7e 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -21,6 +21,7 @@ import datetime from hashlib import md5 import os +import sys from urllib.parse import urlsplit from urllib.parse import urlunsplit from uuid import uuid4 @@ -536,7 +537,10 @@ def _base64_md5hash(buffer_object): :rtype: str :returns: A base64 encoded digest of the MD5 hash. """ - hash_obj = md5() + if sys.version_info >= (3, 9): + hash_obj = md5(usedforsecurity=False) + else: + hash_obj = md5() _write_buffer_to_hash(buffer_object, hash_obj) digest_bytes = hash_obj.digest() return base64.b64encode(digest_bytes) diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index d628bfddb..1615738d1 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -735,7 +735,7 @@ def __init__(self, digest_val): self.hash_obj = _MD5Hash(digest_val) self._called = [] - def __call__(self, data=None): + def __call__(self, data=None, usedforsecurity=True): self._called.append(data) return self.hash_obj From 7fee3dd3390cfb5475a39d8f8272ea825dbda449 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:25:23 +0530 Subject: [PATCH 396/509] fix: flaky system tests for resumable_media (#1592) * fix: flaky system tests for resumable_media * resolving comments --- tests/resumable_media/system/requests/test_download.py | 7 ++++++- tests/resumable_media/system/requests/test_upload.py | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/resumable_media/system/requests/test_download.py b/tests/resumable_media/system/requests/test_download.py index 5417dd7bc..95f80b3c2 100644 --- a/tests/resumable_media/system/requests/test_download.py +++ b/tests/resumable_media/system/requests/test_download.py @@ -18,6 +18,7 @@ import http.client import io import os +import sys import google.auth # type: ignore import google.auth.transport.requests as tr_requests # type: ignore @@ -63,7 +64,11 @@ class CorruptingAuthorizedSession(tr_requests.AuthorizedSession): constructor. """ - EMPTY_MD5 = base64.b64encode(hashlib.md5(b"").digest()).decode("utf-8") + EMPTY_MD5 = base64.b64encode( + hashlib.md5( + b"", **({"usedforsecurity": False} if sys.version_info >= (3, 9) else {}) + ).digest() + ).decode("utf-8") crc32c = google_crc32c.Checksum() crc32c.update(b"") EMPTY_CRC32C = base64.b64encode(crc32c.digest()).decode("utf-8") diff --git a/tests/resumable_media/system/requests/test_upload.py b/tests/resumable_media/system/requests/test_upload.py index f9e3b8164..dd90aa53b 100644 --- a/tests/resumable_media/system/requests/test_upload.py +++ b/tests/resumable_media/system/requests/test_upload.py @@ -18,6 +18,7 @@ import io import os import urllib.parse +import sys import pytest # type: ignore from unittest import mock @@ -73,7 +74,9 @@ def img_stream(): def get_md5(data): - hash_obj = hashlib.md5(data) + hash_obj = hashlib.md5( + data, **({"usedforsecurity": False} if sys.version_info >= (3, 9) else {}) + ) return base64.b64encode(hash_obj.digest()) From faf8b83b1f0ac378f8f6f47ce33dc23a866090c9 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 29 Oct 2025 12:12:06 +0530 Subject: [PATCH 397/509] fix: Make `download_ranges` compatible with `asyncio.create_task(..)` (#1591) fix: Make `download_ranges` compatible with `asyncio.create_task(..)` (#1591) --------- Co-authored-by: Owl Bot --- .../asyncio/async_multi_range_downloader.py | 93 +++++++++++----- google/cloud/storage/_helpers.py | 18 ++++ .../test_async_multi_range_downloader.py | 100 ++++++++++++++++-- 3 files changed, 179 insertions(+), 32 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 56aba3e27..16dce5025 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations +import asyncio import google_crc32c from google.api_core import exceptions from google_crc32c import Checksum @@ -29,6 +30,7 @@ from io import BytesIO from google.cloud import _storage_v2 from google.cloud.storage.exceptions import DataCorruption +from google.cloud.storage._helpers import generate_random_56_bit_integer _MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 @@ -78,7 +80,7 @@ class AsyncMultiRangeDownloader: my_buff2 = BytesIO() my_buff3 = BytesIO() my_buff4 = any_object_which_provides_BytesIO_like_interface() - results_arr = await mrd.download_ranges( + await mrd.download_ranges( [ # (start_byte, bytes_to_read, writeable_buffer) (0, 100, my_buff1), @@ -88,8 +90,8 @@ class AsyncMultiRangeDownloader: ] ) - for result in results_arr: - print("downloaded bytes", result) + # verify data in buffers... + assert my_buff2.getbuffer().nbytes == 20 """ @@ -175,6 +177,10 @@ def __init__( self.read_obj_str: Optional[_AsyncReadObjectStream] = None self._is_stream_open: bool = False + self._read_id_to_writable_buffer_dict = {} + self._read_id_to_download_ranges_id = {} + self._download_ranges_id_to_pending_read_ids = {} + async def open(self) -> None: """Opens the bidi-gRPC connection to read from the object. @@ -203,8 +209,8 @@ async def open(self) -> None: return async def download_ranges( - self, read_ranges: List[Tuple[int, int, BytesIO]] - ) -> List[Result]: + self, read_ranges: List[Tuple[int, int, BytesIO]], lock: asyncio.Lock = None + ) -> None: """Downloads multiple byte ranges from the object into the buffers provided by user. @@ -214,9 +220,36 @@ async def download_ranges( to be provided by the user, and user has to make sure appropriate memory is available in the application to avoid out-of-memory crash. - :rtype: List[:class:`~google.cloud.storage._experimental.asyncio.async_multi_range_downloader.Result`] - :returns: A list of ``Result`` objects, where each object corresponds - to a requested range. + :type lock: asyncio.Lock + :param lock: (Optional) An asyncio lock to synchronize sends and recvs + on the underlying bidi-GRPC stream. This is required when multiple + coroutines are calling this method concurrently. + + i.e. Example usage with multiple coroutines: + + ``` + lock = asyncio.Lock() + task1 = asyncio.create_task(mrd.download_ranges(ranges1, lock)) + task2 = asyncio.create_task(mrd.download_ranges(ranges2, lock)) + await asyncio.gather(task1, task2) + + ``` + + If user want to call this method serially from multiple coroutines, + then providing a lock is not necessary. + + ``` + await mrd.download_ranges(ranges1) + await mrd.download_ranges(ranges2) + + # ... some other code code... + + ``` + + + :raises ValueError: if the underlying bidi-GRPC stream is not open. + :raises ValueError: if the length of read_ranges is more than 1000. + :raises DataCorruption: if a checksum mismatch is detected while reading data. """ @@ -228,8 +261,11 @@ async def download_ranges( if not self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is not open") - read_id_to_writable_buffer_dict = {} - results = [] + if lock is None: + lock = asyncio.Lock() + + _func_id = generate_random_56_bit_integer() + read_ids_in_current_func = set() for i in range(0, len(read_ranges), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST): read_ranges_segment = read_ranges[ i : i + _MAX_READ_RANGES_PER_BIDI_READ_REQUEST @@ -237,10 +273,11 @@ async def download_ranges( read_ranges_for_bidi_req = [] for j, read_range in enumerate(read_ranges_segment): - read_id = i + j - read_id_to_writable_buffer_dict[read_id] = read_range[2] + read_id = generate_random_56_bit_integer() + read_ids_in_current_func.add(read_id) + self._read_id_to_download_ranges_id[read_id] = _func_id + self._read_id_to_writable_buffer_dict[read_id] = read_range[2] bytes_requested = read_range[1] - results.append(Result(bytes_requested)) read_ranges_for_bidi_req.append( _storage_v2.ReadRange( read_offset=read_range[0], @@ -248,12 +285,19 @@ async def download_ranges( read_id=read_id, ) ) - await self.read_obj_str.send( - _storage_v2.BidiReadObjectRequest(read_ranges=read_ranges_for_bidi_req) - ) + async with lock: + await self.read_obj_str.send( + _storage_v2.BidiReadObjectRequest( + read_ranges=read_ranges_for_bidi_req + ) + ) + self._download_ranges_id_to_pending_read_ids[ + _func_id + ] = read_ids_in_current_func - while len(read_id_to_writable_buffer_dict) > 0: - response = await self.read_obj_str.recv() + while len(self._download_ranges_id_to_pending_read_ids[_func_id]) > 0: + async with lock: + response = await self.read_obj_str.recv() if response is None: raise Exception("None response received, something went wrong.") @@ -277,16 +321,15 @@ async def download_ranges( ) read_id = object_data_range.read_range.read_id - buffer = read_id_to_writable_buffer_dict[read_id] + buffer = self._read_id_to_writable_buffer_dict[read_id] buffer.write(data) - results[read_id].bytes_written += len(data) if object_data_range.range_end: - del read_id_to_writable_buffer_dict[ - object_data_range.read_range.read_id - ] - - return results + tmp_dn_ranges_id = self._read_id_to_download_ranges_id[read_id] + self._download_ranges_id_to_pending_read_ids[ + tmp_dn_ranges_id + ].remove(read_id) + del self._read_id_to_download_ranges_id[read_id] async def close(self): """ diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 236480a7e..682f8784d 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -22,6 +22,7 @@ from hashlib import md5 import os import sys +import secrets from urllib.parse import urlsplit from urllib.parse import urlunsplit from uuid import uuid4 @@ -668,3 +669,20 @@ def _get_default_headers( "content-type": content_type, "x-upload-content-type": x_upload_content_type or content_type, } + + +def generate_random_56_bit_integer(): + """Generates a secure 56 bit random integer. + + + If 64 bit int is used, sometimes the random int generated is greater than + max positive value of signed 64 bit int which is 2^63 -1 causing overflow + issues. + + :rtype: int + :returns: A secure random 56 bit integer. + """ + # 7 bytes * 8 bits/byte = 56 bits + random_bytes = secrets.token_bytes(7) + # Convert bytes to an integer + return int.from_bytes(random_bytes, "big") diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 8c1137980..668006627 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import pytest from unittest import mock from unittest.mock import AsyncMock @@ -107,6 +108,93 @@ async def test_create_mrd( assert mrd.read_handle == _TEST_READ_HANDLE assert mrd.is_stream_open + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_download_ranges_via_async_gather( + self, mock_grpc_client, mock_cls_async_read_object_stream, mock_random_int + ): + # Arrange + data = b"these_are_18_chars" + crc32c = Checksum(data).digest() + crc32c_int = int.from_bytes(crc32c, "big") + crc32c_checksum_for_data_slice = int.from_bytes( + Checksum(data[10:16]).digest(), "big" + ) + + mock_mrd = await self._make_mock_mrd( + mock_grpc_client, mock_cls_async_read_object_stream + ) + mock_random_int.side_effect = [123, 456, 789, 91011] # for _func_id and read_id + mock_mrd.read_obj_str.send = AsyncMock() + mock_mrd.read_obj_str.recv = AsyncMock() + + mock_mrd.read_obj_str.recv.side_effect = [ + _storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + _storage_v2.ObjectRangeData( + checksummed_data=_storage_v2.ChecksummedData( + content=data, crc32c=crc32c_int + ), + range_end=True, + read_range=_storage_v2.ReadRange( + read_offset=0, read_length=18, read_id=456 + ), + ) + ] + ), + _storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + _storage_v2.ObjectRangeData( + checksummed_data=_storage_v2.ChecksummedData( + content=data[10:16], + crc32c=crc32c_checksum_for_data_slice, + ), + range_end=True, + read_range=_storage_v2.ReadRange( + read_offset=10, read_length=6, read_id=91011 + ), + ) + ], + ), + ] + + # Act + buffer = BytesIO() + second_buffer = BytesIO() + lock = asyncio.Lock() + task1 = asyncio.create_task(mock_mrd.download_ranges([(0, 18, buffer)], lock)) + task2 = asyncio.create_task( + mock_mrd.download_ranges([(10, 6, second_buffer)], lock) + ) + await asyncio.gather(task1, task2) + + # Assert + mock_mrd.read_obj_str.send.side_effect = [ + _storage_v2.BidiReadObjectRequest( + read_ranges=[ + _storage_v2.ReadRange(read_offset=0, read_length=18, read_id=456) + ] + ), + _storage_v2.BidiReadObjectRequest( + read_ranges=[ + _storage_v2.ReadRange(read_offset=10, read_length=6, read_id=91011) + ] + ), + ] + assert buffer.getvalue() == data + assert second_buffer.getvalue() == data[10:16] + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" + ) @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) @@ -115,7 +203,7 @@ async def test_create_mrd( ) @pytest.mark.asyncio async def test_download_ranges( - self, mock_grpc_client, mock_cls_async_read_object_stream + self, mock_grpc_client, mock_cls_async_read_object_stream, mock_random_int ): # Arrange data = b"these_are_18_chars" @@ -125,6 +213,7 @@ async def test_download_ranges( mock_mrd = await self._make_mock_mrd( mock_grpc_client, mock_cls_async_read_object_stream ) + mock_random_int.side_effect = [123, 456] # for _func_id and read_id mock_mrd.read_obj_str.send = AsyncMock() mock_mrd.read_obj_str.recv = AsyncMock() mock_mrd.read_obj_str.recv.return_value = _storage_v2.BidiReadObjectResponse( @@ -135,7 +224,7 @@ async def test_download_ranges( ), range_end=True, read_range=_storage_v2.ReadRange( - read_offset=0, read_length=18, read_id=0 + read_offset=0, read_length=18, read_id=456 ), ) ], @@ -143,19 +232,16 @@ async def test_download_ranges( # Act buffer = BytesIO() - results = await mock_mrd.download_ranges([(0, 18, buffer)]) + await mock_mrd.download_ranges([(0, 18, buffer)]) # Assert mock_mrd.read_obj_str.send.assert_called_once_with( _storage_v2.BidiReadObjectRequest( read_ranges=[ - _storage_v2.ReadRange(read_offset=0, read_length=18, read_id=0) + _storage_v2.ReadRange(read_offset=0, read_length=18, read_id=456) ] ) ) - assert len(results) == 1 - assert results[0].bytes_requested == 18 - assert results[0].bytes_written == 18 assert buffer.getvalue() == data @mock.patch( From 74415a2a120e9bfa42f4f5fc8bd2f8e0d4cf5d18 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 15:55:44 +0530 Subject: [PATCH 398/509] feat: Add support for Python 3.14 (#1562) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add support for Python 3.14 fix: Deprecate credentials_file argument chore: Update gapic-generator-python to 1.28.0 PiperOrigin-RevId: 816753840 Source-Link: https://github.com/googleapis/googleapis/commit/d06cf27a47074d1de3fde6f0ca48680a96229306 Source-Link: https://github.com/googleapis/googleapis-gen/commit/a524e7310882bbb99bfe1399b18bed328979211c Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYTUyNGU3MzEwODgyYmJiOTliZmUxMzk5YjE4YmVkMzI4OTc5MjExYyJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Chalmer Lowe --- .../_storage_v2/services/storage/transports/base.py | 5 +++-- .../_storage_v2/services/storage/transports/grpc.py | 8 +++++--- .../services/storage/transports/grpc_asyncio.py | 8 +++++--- .../snippet_metadata_google.storage.v2.json | 2 +- testing/constraints-3.10.txt | 2 ++ testing/constraints-3.11.txt | 2 ++ testing/constraints-3.12.txt | 2 ++ testing/constraints-3.13.txt | 1 + testing/constraints-3.14.txt | 13 +++++++++++++ testing/constraints-3.8.txt | 2 ++ 10 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 testing/constraints-3.14.txt diff --git a/google/cloud/_storage_v2/services/storage/transports/base.py b/google/cloud/_storage_v2/services/storage/transports/base.py index 3484b18dd..b45d47623 100644 --- a/google/cloud/_storage_v2/services/storage/transports/base.py +++ b/google/cloud/_storage_v2/services/storage/transports/base.py @@ -77,9 +77,10 @@ def __init__( credentials identify the application to the service; if none are specified, the client will attempt to ascertain the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can + credentials_file (Optional[str]): Deprecated. A file with credentials that can be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. + This argument is mutually exclusive with credentials. This argument will be + removed in the next major version of this library. scopes (Optional[Sequence[str]]): A list of scopes. quota_project_id (Optional[str]): An optional project to use for billing and quota. diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc.py b/google/cloud/_storage_v2/services/storage/transports/grpc.py index 1738c3272..73f88c164 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc.py @@ -180,9 +180,10 @@ def __init__( are specified, the client will attempt to ascertain the credentials from the environment. This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can + credentials_file (Optional[str]): Deprecated. A file with credentials that can be loaded with :func:`google.auth.load_credentials_from_file`. This argument is ignored if a ``channel`` instance is provided. + This argument will be removed in the next major version of this library. scopes (Optional(Sequence[str])): A list of scopes. This argument is ignored if a ``channel`` instance is provided. channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): @@ -315,9 +316,10 @@ def create_channel( credentials identify this application to the service. If none are specified, the client will attempt to ascertain the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can + credentials_file (Optional[str]): Deprecated. A file with credentials that can be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. + This argument is mutually exclusive with credentials. This argument will be + removed in the next major version of this library. scopes (Optional[Sequence[str]]): A optional list of scopes needed for this service. These are only used when credentials are not specified and are passed to :func:`google.auth.default`. diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py index c0cbc60cd..f0c9e5721 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py @@ -177,8 +177,9 @@ def create_channel( credentials identify this application to the service. If none are specified, the client will attempt to ascertain the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. + credentials_file (Optional[str]): Deprecated. A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. This argument will be + removed in the next major version of this library. scopes (Optional[Sequence[str]]): A optional list of scopes needed for this service. These are only used when credentials are not specified and are passed to :func:`google.auth.default`. @@ -229,9 +230,10 @@ def __init__( are specified, the client will attempt to ascertain the credentials from the environment. This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can + credentials_file (Optional[str]): Deprecated. A file with credentials that can be loaded with :func:`google.auth.load_credentials_from_file`. This argument is ignored if a ``channel`` instance is provided. + This argument will be removed in the next major version of this library. scopes (Optional[Sequence[str]]): A optional list of scopes needed for this service. These are only used when credentials are not specified and are passed to :func:`google.auth.default`. diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json index 907bdb30e..b2448bff2 100644 --- a/samples/generated_samples/snippet_metadata_google.storage.v2.json +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage", - "version": "0.1.0" + "version": "0.0.0" }, "snippets": [ { diff --git a/testing/constraints-3.10.txt b/testing/constraints-3.10.txt index ad3f0fa58..ef1c92fff 100644 --- a/testing/constraints-3.10.txt +++ b/testing/constraints-3.10.txt @@ -2,6 +2,8 @@ # This constraints file is required for unit tests. # List all library dependencies and extras in this file. google-api-core +google-auth +grpcio proto-plus protobuf grpc-google-iam-v1 diff --git a/testing/constraints-3.11.txt b/testing/constraints-3.11.txt index ad3f0fa58..ef1c92fff 100644 --- a/testing/constraints-3.11.txt +++ b/testing/constraints-3.11.txt @@ -2,6 +2,8 @@ # This constraints file is required for unit tests. # List all library dependencies and extras in this file. google-api-core +google-auth +grpcio proto-plus protobuf grpc-google-iam-v1 diff --git a/testing/constraints-3.12.txt b/testing/constraints-3.12.txt index ad3f0fa58..ef1c92fff 100644 --- a/testing/constraints-3.12.txt +++ b/testing/constraints-3.12.txt @@ -2,6 +2,8 @@ # This constraints file is required for unit tests. # List all library dependencies and extras in this file. google-api-core +google-auth +grpcio proto-plus protobuf grpc-google-iam-v1 diff --git a/testing/constraints-3.13.txt b/testing/constraints-3.13.txt index 2010e549c..2ae5a677e 100644 --- a/testing/constraints-3.13.txt +++ b/testing/constraints-3.13.txt @@ -7,6 +7,7 @@ # Then this file should have google-cloud-foo>=1 google-api-core>=2 google-auth>=2 +grpcio>=1 proto-plus>=1 protobuf>=6 grpc-google-iam-v1>=0 diff --git a/testing/constraints-3.14.txt b/testing/constraints-3.14.txt new file mode 100644 index 000000000..2ae5a677e --- /dev/null +++ b/testing/constraints-3.14.txt @@ -0,0 +1,13 @@ +# We use the constraints file for the latest Python version +# (currently this file) to check that the latest +# major versions of dependencies are supported in setup.py. +# List all library dependencies and extras in this file. +# Require the latest major version be installed for each dependency. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", +# Then this file should have google-cloud-foo>=1 +google-api-core>=2 +google-auth>=2 +grpcio>=1 +proto-plus>=1 +protobuf>=6 +grpc-google-iam-v1>=0 diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt index ad3f0fa58..ef1c92fff 100644 --- a/testing/constraints-3.8.txt +++ b/testing/constraints-3.8.txt @@ -2,6 +2,8 @@ # This constraints file is required for unit tests. # List all library dependencies and extras in this file. google-api-core +google-auth +grpcio proto-plus protobuf grpc-google-iam-v1 From 2da90fc12394eceaf97df718f3e37d42e8f674a4 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:52:26 +0000 Subject: [PATCH 399/509] chore(python): Add Python 3.14 to python post processor image (#1563) Source-Link: https://togithub.com/googleapis/synthtool/commit/16790a32126759493ba20781e04edd165825ff82 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:543e209e7c1c1ffe720eb4db1a3f045a75099304fb19aa11a47dc717b8aae2a9 --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/samples/python3.14/common.cfg | 40 ++++++++++++++++++++ .kokoro/samples/python3.14/continuous.cfg | 6 +++ .kokoro/samples/python3.14/periodic-head.cfg | 11 ++++++ .kokoro/samples/python3.14/periodic.cfg | 6 +++ .kokoro/samples/python3.14/presubmit.cfg | 6 +++ samples/snippets/noxfile.py | 2 +- 7 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 .kokoro/samples/python3.14/common.cfg create mode 100644 .kokoro/samples/python3.14/continuous.cfg create mode 100644 .kokoro/samples/python3.14/periodic-head.cfg create mode 100644 .kokoro/samples/python3.14/periodic.cfg create mode 100644 .kokoro/samples/python3.14/presubmit.cfg diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index c631e1f7d..4a311db02 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:5581906b957284864632cde4e9c51d1cc66b0094990b27e689132fe5cd036046 -# created: 2025-03-05 + digest: sha256:543e209e7c1c1ffe720eb4db1a3f045a75099304fb19aa11a47dc717b8aae2a9 +# created: 2025-10-09T14:48:42.914384887Z diff --git a/.kokoro/samples/python3.14/common.cfg b/.kokoro/samples/python3.14/common.cfg new file mode 100644 index 000000000..fe21fac22 --- /dev/null +++ b/.kokoro/samples/python3.14/common.cfg @@ -0,0 +1,40 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Specify which tests to run +env_vars: { + key: "RUN_TESTS_SESSION" + value: "py-3.14" +} + +# Declare build specific Cloud project. +env_vars: { + key: "BUILD_SPECIFIC_GCLOUD_PROJECT" + value: "python-docs-samples-tests-314" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-storage/.kokoro/test-samples.sh" +} + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" +} + +# Download secrets for samples +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-storage/.kokoro/trampoline_v2.sh" diff --git a/.kokoro/samples/python3.14/continuous.cfg b/.kokoro/samples/python3.14/continuous.cfg new file mode 100644 index 000000000..a1c8d9759 --- /dev/null +++ b/.kokoro/samples/python3.14/continuous.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/.kokoro/samples/python3.14/periodic-head.cfg b/.kokoro/samples/python3.14/periodic-head.cfg new file mode 100644 index 000000000..5d0faf58f --- /dev/null +++ b/.kokoro/samples/python3.14/periodic-head.cfg @@ -0,0 +1,11 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-storage/.kokoro/test-samples-against-head.sh" +} diff --git a/.kokoro/samples/python3.14/periodic.cfg b/.kokoro/samples/python3.14/periodic.cfg new file mode 100644 index 000000000..71cd1e597 --- /dev/null +++ b/.kokoro/samples/python3.14/periodic.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "False" +} diff --git a/.kokoro/samples/python3.14/presubmit.cfg b/.kokoro/samples/python3.14/presubmit.cfg new file mode 100644 index 000000000..a1c8d9759 --- /dev/null +++ b/.kokoro/samples/python3.14/presubmit.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index a169b5b5b..69bcaf56d 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -89,7 +89,7 @@ def get_pytest_env_vars() -> Dict[str, str]: # DO NOT EDIT - automatically generated. # All versions used to test samples. -ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] # Any default versions that should be ignored. IGNORED_VERSIONS = TEST_CONFIG["ignored_versions"] From 70aa38558fd200142530074b4757c17e5c29fd25 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 31 Oct 2025 12:44:48 +0530 Subject: [PATCH 400/509] chore: remove local AsyncBidiRpc and use from `google-api-core` >= 2.27.0 (#1597) * chore: user AsyncBidiRpc from google-api-core * update google-api-core version to min of 2.27.0 * update import statement in test files as well * fix python3.9 constraints file --- .../asyncio/async_read_object_stream.py | 3 +- .../_experimental/asyncio/bidi_async.py | 230 ------------------ .../_experimental/asyncio/bidi_base.py | 80 ------ setup.py | 2 +- testing/constraints-3.9.txt | 2 +- tests/unit/asyncio/test_bidi_async.py | 2 +- 6 files changed, 5 insertions(+), 314 deletions(-) delete mode 100644 google/cloud/storage/_experimental/asyncio/bidi_async.py delete mode 100644 google/cloud/storage/_experimental/asyncio/bidi_base.py diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index 96e9f154a..ddaaf9a54 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -28,7 +28,8 @@ from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( _AsyncAbstractObjectStream, ) -from google.cloud.storage._experimental.asyncio.bidi_async import AsyncBidiRpc + +from google.api_core.bidi_async import AsyncBidiRpc class _AsyncReadObjectStream(_AsyncAbstractObjectStream): diff --git a/google/cloud/storage/_experimental/asyncio/bidi_async.py b/google/cloud/storage/_experimental/asyncio/bidi_async.py deleted file mode 100644 index 8c5e58fd0..000000000 --- a/google/cloud/storage/_experimental/asyncio/bidi_async.py +++ /dev/null @@ -1,230 +0,0 @@ -# Copyright 2025, Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Asynchronous bi-directional streaming RPC helpers.""" - -import asyncio -import logging - -from google.api_core import exceptions -from google.cloud.storage._experimental.asyncio.bidi_base import BidiRpcBase - -_LOGGER = logging.getLogger(__name__) - - -class _AsyncRequestQueueGenerator: - """_AsyncRequestQueueGenerator is a helper class for sending asynchronous - requests to a gRPC stream from a Queue. - - This generator takes asynchronous requests off a given queue and yields them - to gRPC. - - This helper is useful when you have an indeterminate, indefinite, or - otherwise open-ended set of requests to send through a request-streaming - (or bidirectional) RPC. - - The reason this is necessary - - is because it's let's user have control on the when they would want to - send requests proto messages instead of sending all of them initilally. - - This is achieved via asynchronous queue (asyncio.Queue), - gRPC awaits until there's a message in the queue. - - Finally, it allows for retrying without swapping queues because if it does - pull an item off the queue when the RPC is inactive, it'll immediately put - it back and then exit. This is necessary because yielding the item in this - case will cause gRPC to discard it. In practice, this means that the order - of messages is not guaranteed. If such a thing is necessary it would be - easy to use a priority queue. - - Example:: - - requests = _AsyncRequestQueueGenerator(q) - call = await stub.StreamingRequest(requests) - requests.call = call - - async for response in call: - print(response) - await q.put(...) - - Args: - queue (asyncio.Queue): The request queue. - initial_request (Union[protobuf.Message, - Callable[[], protobuf.Message]]): The initial request to - yield. This is done independently of the request queue to allow for - easily restarting streams that require some initial configuration - request. - """ - - def __init__(self, queue: asyncio.Queue, initial_request=None): - self._queue = queue - self._initial_request = initial_request - self.call = None - - def _is_active(self): - """ - Returns true if the call is not set or not completed. - """ - return self.call is None or not self.call.done() - - async def __aiter__(self): - if self._initial_request is not None: - if callable(self._initial_request): - yield self._initial_request() - else: - yield self._initial_request - - while True: - item = await self._queue.get() - - # The consumer explicitly sent "None", indicating that the request - # should end. - if item is None: - _LOGGER.debug("Cleanly exiting request generator.") - return - - if not self._is_active(): - # We have an item, but the call is closed. We should put the - # item back on the queue so that the next call can consume it. - await self._queue.put(item) - _LOGGER.debug( - "Inactive call, replacing item on queue and exiting " - "request generator." - ) - return - - yield item - - -class AsyncBidiRpc(BidiRpcBase): - """A helper for consuming a async bi-directional streaming RPC. - - This maps gRPC's built-in interface which uses a request iterator and a - response iterator into a socket-like :func:`send` and :func:`recv`. This - is a more useful pattern for long-running or asymmetric streams (streams - where there is not a direct correlation between the requests and - responses). - - Example:: - - initial_request = example_pb2.StreamingRpcRequest( - setting='example') - rpc = AsyncBidiRpc( - stub.StreamingRpc, - initial_request=initial_request, - metadata=[('name', 'value')] - ) - - await rpc.open() - - while rpc.is_active: - print(await rpc.recv()) - await rpc.send(example_pb2.StreamingRpcRequest( - data='example')) - - This does *not* retry the stream on errors. See :class:`AsyncResumableBidiRpc`. - - Args: - start_rpc (grpc.aio.StreamStreamMultiCallable): The gRPC method used to - start the RPC. - initial_request (Union[protobuf.Message, - Callable[[], protobuf.Message]]): The initial request to - yield. This is useful if an initial request is needed to start the - stream. - metadata (Sequence[Tuple(str, str)]): RPC metadata to include in - the request. - """ - - def _create_queue(self): - """Create a queue for requests.""" - return asyncio.Queue() - - async def open(self): - """Opens the stream.""" - if self.is_active: - raise ValueError("Can not open an already open stream.") - - request_generator = _AsyncRequestQueueGenerator( - self._request_queue, initial_request=self._initial_request - ) - try: - call = await self._start_rpc(request_generator, metadata=self._rpc_metadata) - except exceptions.GoogleAPICallError as exc: - # The original `grpc.RpcError` (which is usually also a `grpc.Call`) is - # available from the ``response`` property on the mapped exception. - self._on_call_done(exc.response) - raise - - request_generator.call = call - - # TODO: api_core should expose the future interface for wrapped - # callables as well. - if hasattr(call, "_wrapped"): # pragma: NO COVER - call._wrapped.add_done_callback(self._on_call_done) - else: - call.add_done_callback(self._on_call_done) - - self._request_generator = request_generator - self.call = call - - async def close(self): - """Closes the stream.""" - if self.call is None: - return - - await self._request_queue.put(None) - self.call.cancel() - self._request_generator = None - self._initial_request = None - self._callbacks = [] - # Don't set self.call to None. Keep it around so that send/recv can - # raise the error. - - async def send(self, request): - """Queue a message to be sent on the stream. - - If the underlying RPC has been closed, this will raise. - - Args: - request (protobuf.Message): The request to send. - """ - if self.call is None: - raise ValueError("Can not send() on an RPC that has never been opened.") - - # Don't use self.is_active(), as ResumableBidiRpc will overload it - # to mean something semantically different. - if not self.call.done(): - await self._request_queue.put(request) - else: - # calling read should cause the call to raise. - await self.call.read() - - async def recv(self): - """Wait for a message to be returned from the stream. - - If the underlying RPC has been closed, this will raise. - - Returns: - protobuf.Message: The received message. - """ - if self.call is None: - raise ValueError("Can not recv() on an RPC that has never been opened.") - - return await self.call.read() - - @property - def is_active(self): - """bool: True if this stream is currently open and active.""" - return self.call is not None and not self.call.done() diff --git a/google/cloud/storage/_experimental/asyncio/bidi_base.py b/google/cloud/storage/_experimental/asyncio/bidi_base.py deleted file mode 100644 index 195e35750..000000000 --- a/google/cloud/storage/_experimental/asyncio/bidi_base.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 2025, Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# You may obtain a copy of the License at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Base class for bi-directional streaming RPC helpers.""" - - -class BidiRpcBase: - """A base class for consuming a bi-directional streaming RPC. - - This maps gRPC's built-in interface which uses a request iterator and a - response iterator into a socket-like :func:`send` and :func:`recv`. This - is a more useful pattern for long-running or asymmetric streams (streams - where there is not a direct correlation between the requests and - responses). - - This does *not* retry the stream on errors. - - Args: - start_rpc (Union[grpc.StreamStreamMultiCallable, - grpc.aio.StreamStreamMultiCallable]): The gRPC method used - to start the RPC. - initial_request (Union[protobuf.Message, - Callable[[], protobuf.Message]]): The initial request to - yield. This is useful if an initial request is needed to start the - stream. - metadata (Sequence[Tuple(str, str)]): RPC metadata to include in - the request. - """ - - def __init__(self, start_rpc, initial_request=None, metadata=None): - self._start_rpc = start_rpc - self._initial_request = initial_request - self._rpc_metadata = metadata - self._request_queue = self._create_queue() - self._request_generator = None - self._callbacks = [] - self.call = None - - def _create_queue(self): - """Create a queue for requests.""" - raise NotImplementedError("`_create_queue` is not implemented.") - - def add_done_callback(self, callback): - """Adds a callback that will be called when the RPC terminates. - - This occurs when the RPC errors or is successfully terminated. - - Args: - callback (Callable[[grpc.Future], None]): The callback to execute. - It will be provided with the same gRPC future as the underlying - stream which will also be a :class:`grpc.aio.Call`. - """ - self._callbacks.append(callback) - - def _on_call_done(self, future): - # This occurs when the RPC errors or is successfully terminated. - # Note that grpc's "future" here can also be a grpc.RpcError. - # See note in https://github.com/grpc/grpc/issues/10885#issuecomment-302651331 - # that `grpc.RpcError` is also `grpc.aio.Call`. - for callback in self._callbacks: - callback(future) - - @property - def is_active(self): - """bool: True if this stream is currently open and active.""" - raise NotImplementedError("`is_active` is not implemented.") - - @property - def pending_requests(self): - """int: Returns an estimate of the number of queued requests.""" - return self._request_queue.qsize() diff --git a/setup.py b/setup.py index 43e3404f6..2c4504749 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ release_status = "Development Status :: 5 - Production/Stable" dependencies = [ "google-auth >= 2.26.1, < 3.0.0", - "google-api-core >= 2.15.0, < 3.0.0", + "google-api-core >= 2.27.0, < 3.0.0", "google-cloud-core >= 2.4.2, < 3.0.0", # The dependency "google-resumable-media" is no longer used. However, the # dependency is still included here to accommodate users who may be diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index 251ae699b..ccf6c1493 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -5,7 +5,7 @@ # e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", # Then this file should have google-cloud-foo==1.14.0 google-auth==2.26.1 -google-api-core==2.15.0 +google-api-core>=2.15.0 google-cloud-core==2.4.2 google-resumable-media==2.7.2 requests==2.22.0 diff --git a/tests/unit/asyncio/test_bidi_async.py b/tests/unit/asyncio/test_bidi_async.py index 313748af8..9625c806e 100644 --- a/tests/unit/asyncio/test_bidi_async.py +++ b/tests/unit/asyncio/test_bidi_async.py @@ -30,7 +30,7 @@ except ImportError: # pragma: NO COVER pytest.skip("No GRPC", allow_module_level=True) -from google.cloud.storage._experimental.asyncio import bidi_async +from google.api_core import bidi_async from google.api_core import exceptions From 02f1451aaa8dacd10a862e97abb62ae48249b9b4 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 31 Oct 2025 13:44:33 +0530 Subject: [PATCH 401/509] feat: provide option to update user_agent (#1596) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: provide option to update user_agent fixes #1327 * make tests more readable and intuitive * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- google/cloud/storage/client.py | 12 ++++++++++++ tests/unit/test_client.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 2f56d8719..74b6061c0 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -297,6 +297,18 @@ def universe_domain(self): def api_endpoint(self): return self._connection.API_BASE_URL + def update_user_agent(self, user_agent): + """Update the user-agent string for this client. + + :type user_agent: str + :param user_agent: The string to add to the user-agent. + """ + existing_user_agent = self._connection._client_info.user_agent + if existing_user_agent is None: + self._connection.user_agent = user_agent + else: + self._connection.user_agent = f"{user_agent} {existing_user_agent}" + @property def _connection(self): """Get connection or batch on the client. diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 99de31961..d5723740e 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1528,6 +1528,34 @@ def test_create_bucket_w_conflict_w_user_project(self): _target_object=mock.ANY, ) + def test_update_user_agent_when_default_clientinfo_provided(self): + from google.cloud._http import ClientInfo + + client_info = ClientInfo() + + client = self._make_one(project=None, client_info=client_info) + self.assertGreater(len(client._connection.user_agent), 0) + + client.update_user_agent("my-test-agent/1.0") + self.assertIn("my-test-agent/1.0", client._connection.user_agent) + + def test_update_user_agent_when_none_clientinfo_provided(self): + client = self._make_one(project=None) + client.update_user_agent("my-test-agent/1.0") + + self.assertIn("my-test-agent/1.0", client._connection.user_agent) + + def test_update_user_agent_with_existing_user_agent(self): + from google.cloud._http import ClientInfo + + client_info = ClientInfo(user_agent="existing-agent/2.0") + client = self._make_one(project=None, client_info=client_info) + client.update_user_agent("my-test-agent/1.0") + + self.assertIn( + "my-test-agent/1.0 existing-agent/2.0", client._connection.user_agent + ) + @mock.patch("warnings.warn") def test_create_bucket_w_requester_pays_deprecated(self, mock_warn): from google.cloud.storage.bucket import Bucket From 0d867bd4f405d2dbeca1edfc8072080c5a96c1cd Mon Sep 17 00:00:00 2001 From: Matt Irvine Date: Fri, 31 Oct 2025 04:38:16 -0700 Subject: [PATCH 402/509] fix: Use separate header object for each upload in Transfer Manager MPU (#1595) Co-authored-by: Chandra Shekhar Sirimala --- google/cloud/storage/transfer_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index fafe68f1c..a34419020 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -1136,7 +1136,7 @@ def upload_chunks_concurrently( end=end, part_number=part_number, checksum=checksum, - headers=headers, + headers=headers.copy(), retry=retry, ) ) From 5fb85ea544dcc9ed9dca65957c872c3811f02b87 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Tue, 4 Nov 2025 11:51:22 +0530 Subject: [PATCH 403/509] feat(experimental): Add base resumption strategy for bidi streams (#1594) * feat(experimental): Add base resumption strategy for bidi streams * minor changes * resolving comments --- .../asyncio/retry/base_strategy.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/retry/base_strategy.py diff --git a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py new file mode 100644 index 000000000..e4e443815 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py @@ -0,0 +1,65 @@ +import abc +from typing import Any, Iterable + +class _BaseResumptionStrategy(abc.ABC): + """Abstract base class defining the interface for a bidi stream resumption strategy. + + This class defines the skeleton for a pluggable strategy that contains + all the service-specific logic for a given bidi operation (e.g., reads + or writes). This allows a generic retry manager to handle the common + retry loop while sending the state management and request generation + to a concrete implementation of this class. + """ + + @abc.abstractmethod + def generate_requests(self, state: Any) -> Iterable[Any]: + """Generates the next batch of requests based on the current state. + + This method is called at the beginning of each retry attempt. It should + inspect the provided state object and generate the appropriate list of + request protos to send to the server. For example, a read strategy + would use this to implement "Smarter Resumption" by creating smaller + `ReadRange` requests for partially downloaded ranges. For bidi-writes, + it will set the `write_offset` field to the persisted size received + from the server in the next request. + + :type state: Any + :param state: An object containing all the state needed for the + operation (e.g., requested ranges, user buffers, + bytes written). + """ + pass + + @abc.abstractmethod + def update_state_from_response(self, state: Any) -> None: + """Updates the state based on a successful server response. + + This method is called for every message received from the server. It is + responsible for processing the response and updating the shared state + object. + + :type state: Any + :param state: The shared state object for the operation, which will be + mutated by this method. + """ + pass + + @abc.abstractmethod + async def recover_state_on_failure(self, error: Exception, state: Any) -> None: + """Prepares the state for the next retry attempt after a failure. + + This method is called when a retriable gRPC error occurs. It is + responsible for performing any necessary actions to ensure the next + retry attempt can succeed. For bidi reads, its primary role is to + handle the `BidiReadObjectRedirectError` by extracting the + `routing_token` and updating the state. For bidi writes, it will update + the state to reflect any bytes that were successfully persisted before + the failure. + + :type error: :class:`Exception` + :param error: The exception that was caught by the retry engine. + + :type state: Any + :param state: The shared state object for the operation. + """ + pass From 5d5e895e173075da557b58614fecc84086aaf9cb Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:00:40 +0530 Subject: [PATCH 404/509] feat(experimental): Add read resumption strategy (#1599) * feat(experimental): Add read resumption strategy * add unit tests * minor fixes * resolving comments --- .../asyncio/retry/base_strategy.py | 5 +- .../retry/reads_resumption_strategy.py | 71 ++++++ .../retry/test_reads_resumption_strategy.py | 206 ++++++++++++++++++ 3 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py create mode 100644 tests/unit/asyncio/retry/test_reads_resumption_strategy.py diff --git a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py index e4e443815..8a06608b2 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py @@ -31,13 +31,16 @@ def generate_requests(self, state: Any) -> Iterable[Any]: pass @abc.abstractmethod - def update_state_from_response(self, state: Any) -> None: + def update_state_from_response(self, response: Any, state: Any) -> None: """Updates the state based on a successful server response. This method is called for every message received from the server. It is responsible for processing the response and updating the shared state object. + :type response: Any + :param response: The response message received from the server. + :type state: Any :param state: The shared state object for the operation, which will be mutated by this method. diff --git a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py new file mode 100644 index 000000000..1ff038827 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py @@ -0,0 +1,71 @@ +from typing import Any, List, IO + +from google.cloud import _storage_v2 as storage_v2 +from google.cloud.storage.exceptions import DataCorruption +from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( + _BaseResumptionStrategy, +) + +class _DownloadState: + """A helper class to track the state of a single range download.""" + def __init__(self, initial_offset: int, initial_length: int, user_buffer: IO[bytes]): + self.initial_offset = initial_offset + self.initial_length = initial_length + self.user_buffer = user_buffer + self.bytes_written = 0 + self.next_expected_offset = initial_offset + self.is_complete = False + + +class _ReadResumptionStrategy(_BaseResumptionStrategy): + """The concrete resumption strategy for bidi reads.""" + + def generate_requests(self, state: dict) -> List[storage_v2.ReadRange]: + """Generates new ReadRange requests for all incomplete downloads. + + :type state: dict + :param state: A dictionary mapping a read_id to its corresponding + _DownloadState object. + """ + pending_requests = [] + for read_id, read_state in state.items(): + if not read_state.is_complete: + new_offset = read_state.initial_offset + read_state.bytes_written + new_length = read_state.initial_length - read_state.bytes_written + + new_request = storage_v2.ReadRange( + read_offset=new_offset, + read_length=new_length, + read_id=read_id, + ) + pending_requests.append(new_request) + return pending_requests + + def update_state_from_response(self, response: storage_v2.BidiReadObjectResponse, state: dict) -> None: + """Processes a server response, performs integrity checks, and updates state.""" + for object_data_range in response.object_data_ranges: + read_id = object_data_range.read_range.read_id + read_state = state[read_id] + + # Offset Verification + chunk_offset = object_data_range.read_range.read_offset + if chunk_offset != read_state.next_expected_offset: + raise DataCorruption(response, f"Offset mismatch for read_id {read_id}") + + data = object_data_range.checksummed_data.content + chunk_size = len(data) + read_state.bytes_written += chunk_size + read_state.next_expected_offset += chunk_size + read_state.user_buffer.write(data) + + # Final Byte Count Verification + if object_data_range.range_end: + read_state.is_complete = True + if read_state.initial_length != 0 and read_state.bytes_written != read_state.initial_length: + raise DataCorruption(response, f"Byte count mismatch for read_id {read_id}") + + async def recover_state_on_failure(self, error: Exception, state: Any) -> None: + """Handles BidiReadObjectRedirectError for reads.""" + # This would parse the gRPC error details, extract the routing_token, + # and store it on the shared state object. + pass diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py new file mode 100644 index 000000000..7153844ad --- /dev/null +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -0,0 +1,206 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import io +import unittest +import pytest +from google.cloud.storage.exceptions import DataCorruption + +from google.cloud import _storage_v2 as storage_v2 +from google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy import ( + _DownloadState, + _ReadResumptionStrategy, +) + +_READ_ID = 1 + + +class TestDownloadState(unittest.TestCase): + def test_initialization(self): + """Test that _DownloadState initializes correctly.""" + initial_offset = 10 + initial_length = 100 + user_buffer = io.BytesIO() + state = _DownloadState(initial_offset, initial_length, user_buffer) + + self.assertEqual(state.initial_offset, initial_offset) + self.assertEqual(state.initial_length, initial_length) + self.assertEqual(state.user_buffer, user_buffer) + self.assertEqual(state.bytes_written, 0) + self.assertEqual(state.next_expected_offset, initial_offset) + self.assertFalse(state.is_complete) + + +class TestReadResumptionStrategy(unittest.TestCase): + def test_generate_requests_single_incomplete(self): + """Test generating a request for a single incomplete download.""" + read_state = _DownloadState(0, 100, io.BytesIO()) + read_state.bytes_written = 20 + state = {_READ_ID: read_state} + + read_strategy = _ReadResumptionStrategy() + requests = read_strategy.generate_requests(state) + + self.assertEqual(len(requests), 1) + self.assertEqual(requests[0].read_offset, 20) + self.assertEqual(requests[0].read_length, 80) + self.assertEqual(requests[0].read_id, _READ_ID) + + def test_generate_requests_multiple_incomplete(self): + """Test generating requests for multiple incomplete downloads.""" + read_id2 = 2 + read_state1 = _DownloadState(0, 100, io.BytesIO()) + read_state1.bytes_written = 50 + read_state2 = _DownloadState(200, 100, io.BytesIO()) + state = {_READ_ID: read_state1, read_id2: read_state2} + + read_strategy = _ReadResumptionStrategy() + requests = read_strategy.generate_requests(state) + + self.assertEqual(len(requests), 2) + req1 = next(request for request in requests if request.read_id == _READ_ID) + req2 = next(request for request in requests if request.read_id == read_id2) + + self.assertEqual(req1.read_offset, 50) + self.assertEqual(req1.read_length, 50) + self.assertEqual(req2.read_offset, 200) + self.assertEqual(req2.read_length, 100) + + def test_generate_requests_with_complete(self): + """Test that no request is generated for a completed download.""" + read_state = _DownloadState(0, 100, io.BytesIO()) + read_state.is_complete = True + state = {_READ_ID: read_state} + + read_strategy = _ReadResumptionStrategy() + requests = read_strategy.generate_requests(state) + + self.assertEqual(len(requests), 0) + + def test_generate_requests_empty_state(self): + """Test generating requests with an empty state.""" + read_strategy = _ReadResumptionStrategy() + requests = read_strategy.generate_requests({}) + self.assertEqual(len(requests), 0) + + def test_update_state_processes_single_chunk_successfully(self): + """Test updating state from a successful response.""" + buffer = io.BytesIO() + read_state = _DownloadState(0, 100, buffer) + state = {_READ_ID: read_state} + data = b"test_data" + read_strategy = _ReadResumptionStrategy() + + response = storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + storage_v2.types.ObjectRangeData( + read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=len(data)), + checksummed_data=storage_v2.ChecksummedData(content=data), + ) + ] + ) + + read_strategy.update_state_from_response(response, state) + + self.assertEqual(read_state.bytes_written, len(data)) + self.assertEqual(read_state.next_expected_offset, len(data)) + self.assertFalse(read_state.is_complete) + self.assertEqual(buffer.getvalue(), data) + + def test_update_state_from_response_offset_mismatch(self): + """Test that an offset mismatch raises DataCorruption.""" + read_state = _DownloadState(0, 100, io.BytesIO()) + read_state.next_expected_offset = 10 + state = {_READ_ID: read_state} + read_strategy = _ReadResumptionStrategy() + + response = storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + storage_v2.types.ObjectRangeData( + read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=4), + checksummed_data=storage_v2.ChecksummedData(content=b"data"), + ) + ] + ) + + with pytest.raises(DataCorruption) as exc_info: + read_strategy.update_state_from_response(response, state) + assert "Offset mismatch" in str(exc_info.value) + + def test_update_state_from_response_final_byte_count_mismatch(self): + """Test that a final byte count mismatch raises DataCorruption.""" + read_state = _DownloadState(0, 100, io.BytesIO()) + state = {_READ_ID: read_state} + read_strategy = _ReadResumptionStrategy() + + response = storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + storage_v2.types.ObjectRangeData( + read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=4), + checksummed_data=storage_v2.ChecksummedData(content=b"data"), + range_end=True, + ) + ] + ) + + with pytest.raises(DataCorruption) as exc_info: + read_strategy.update_state_from_response(response, state) + assert "Byte count mismatch" in str(exc_info.value) + + def test_update_state_from_response_completes_download(self): + """Test that the download is marked complete on range_end.""" + buffer = io.BytesIO() + data = b"test_data" + read_state = _DownloadState(0, len(data), buffer) + state = {_READ_ID: read_state} + read_strategy = _ReadResumptionStrategy() + + response = storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + storage_v2.types.ObjectRangeData( + read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=len(data)), + checksummed_data=storage_v2.ChecksummedData(content=data), + range_end=True, + ) + ] + ) + + read_strategy.update_state_from_response(response, state) + + self.assertTrue(read_state.is_complete) + self.assertEqual(read_state.bytes_written, len(data)) + self.assertEqual(buffer.getvalue(), data) + + def test_update_state_from_response_completes_download_zero_length(self): + """Test completion for a download with initial_length of 0.""" + buffer = io.BytesIO() + data = b"test_data" + read_state = _DownloadState(0, 0, buffer) + state = {_READ_ID: read_state} + read_strategy = _ReadResumptionStrategy() + + response = storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + storage_v2.types.ObjectRangeData( + read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=len(data)), + checksummed_data=storage_v2.ChecksummedData(content=data), + range_end=True, + ) + ] + ) + + read_strategy.update_state_from_response(response, state) + + self.assertTrue(read_state.is_complete) + self.assertEqual(read_state.bytes_written, len(data)) From 71b0f8a368a61bed9bd793a059f980562061223e Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:42:35 +0530 Subject: [PATCH 405/509] feat(experimental): Handle BidiReadObjectRedirectedError for bidi reads (#1600) * feat(experimental): Add read resumption strategy * add unit tests * feat(experimental): Handle BidiReadObjectRedirectedError for bidi reads * resolve comments --- .../retry/reads_resumption_strategy.py | 7 +++++-- .../retry/test_reads_resumption_strategy.py | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py index 1ff038827..9c82cf7f0 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py @@ -5,6 +5,7 @@ from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( _BaseResumptionStrategy, ) +from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError class _DownloadState: """A helper class to track the state of a single range download.""" @@ -65,7 +66,9 @@ def update_state_from_response(self, response: storage_v2.BidiReadObjectResponse raise DataCorruption(response, f"Byte count mismatch for read_id {read_id}") async def recover_state_on_failure(self, error: Exception, state: Any) -> None: - """Handles BidiReadObjectRedirectError for reads.""" + """Handles BidiReadObjectRedirectedError for reads.""" # This would parse the gRPC error details, extract the routing_token, # and store it on the shared state object. - pass + cause = getattr(error, "cause", error) + if isinstance(cause, BidiReadObjectRedirectedError): + state['routing_token'] = cause.routing_token diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py index 7153844ad..fdde74f62 100644 --- a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -16,12 +16,14 @@ import unittest import pytest from google.cloud.storage.exceptions import DataCorruption +from google.api_core import exceptions from google.cloud import _storage_v2 as storage_v2 from google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy import ( _DownloadState, _ReadResumptionStrategy, ) +from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError _READ_ID = 1 @@ -204,3 +206,21 @@ def test_update_state_from_response_completes_download_zero_length(self): self.assertTrue(read_state.is_complete) self.assertEqual(read_state.bytes_written, len(data)) + + async def test_recover_state_on_failure_handles_redirect(self): + """Verify recover_state_on_failure correctly extracts routing_token.""" + strategy = _ReadResumptionStrategy() + + state = {} + self.assertIsNone(state.get("routing_token")) + + dummy_token = "dummy-routing-token" + redirect_error = BidiReadObjectRedirectedError( + routing_token=dummy_token + ) + + final_error = exceptions.RetryError("Retry failed", cause=redirect_error) + + await strategy.recover_state_on_failure(final_error, state) + + self.assertEqual(state.get("routing_token"), dummy_token) From c2cd474d96ce39016ae00c59672f3ad42490c764 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 5 Nov 2025 18:04:39 +0530 Subject: [PATCH 406/509] chore(main): release 3.5.0 (#1568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(main): release 3.5.0 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot --- CHANGELOG.md | 23 ++++++++++++++++++ .../asyncio/retry/base_strategy.py | 1 + .../retry/reads_resumption_strategy.py | 21 ++++++++++++---- google/cloud/storage/version.py | 2 +- .../retry/test_reads_resumption_strategy.py | 24 ++++++++++++------- 5 files changed, 57 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 144092d1c..329740c33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,29 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.5.0](https://github.com/googleapis/python-storage/compare/v3.4.1...v3.5.0) (2025-11-05) + + +### Features + +* **experimental:** Add base resumption strategy for bidi streams ([#1594](https://github.com/googleapis/python-storage/issues/1594)) ([5fb85ea](https://github.com/googleapis/python-storage/commit/5fb85ea544dcc9ed9dca65957c872c3811f02b87)) +* **experimental:** Add checksum for bidi reads operation ([#1566](https://github.com/googleapis/python-storage/issues/1566)) ([93ce515](https://github.com/googleapis/python-storage/commit/93ce515d60f0ac77ab83680ba2b4d6a9f57e75d0)) +* **experimental:** Add read resumption strategy ([#1599](https://github.com/googleapis/python-storage/issues/1599)) ([5d5e895](https://github.com/googleapis/python-storage/commit/5d5e895e173075da557b58614fecc84086aaf9cb)) +* **experimental:** Handle BidiReadObjectRedirectedError for bidi reads ([#1600](https://github.com/googleapis/python-storage/issues/1600)) ([71b0f8a](https://github.com/googleapis/python-storage/commit/71b0f8a368a61bed9bd793a059f980562061223e)) +* Indicate that md5 is used as a CRC ([#1522](https://github.com/googleapis/python-storage/issues/1522)) ([961536c](https://github.com/googleapis/python-storage/commit/961536c7bf3652a824c207754317030526b9dd28)) +* Provide option to update user_agent ([#1596](https://github.com/googleapis/python-storage/issues/1596)) ([02f1451](https://github.com/googleapis/python-storage/commit/02f1451aaa8dacd10a862e97abb62ae48249b9b4)) + + +### Bug Fixes + +* Deprecate credentials_file argument ([74415a2](https://github.com/googleapis/python-storage/commit/74415a2a120e9bfa42f4f5fc8bd2f8e0d4cf5d18)) +* Flaky system tests for resumable_media ([#1592](https://github.com/googleapis/python-storage/issues/1592)) ([7fee3dd](https://github.com/googleapis/python-storage/commit/7fee3dd3390cfb5475a39d8f8272ea825dbda449)) +* Make `download_ranges` compatible with `asyncio.create_task(..)` ([#1591](https://github.com/googleapis/python-storage/issues/1591)) ([faf8b83](https://github.com/googleapis/python-storage/commit/faf8b83b1f0ac378f8f6f47ce33dc23a866090c9)) +* Make `download_ranges` compatible with `asyncio.create_task(..)` ([#1591](https://github.com/googleapis/python-storage/issues/1591)) ([faf8b83](https://github.com/googleapis/python-storage/commit/faf8b83b1f0ac378f8f6f47ce33dc23a866090c9)) +* Redact sensitive data from OTEL traces and fix env var parsing ([#1553](https://github.com/googleapis/python-storage/issues/1553)) ([a38ca19](https://github.com/googleapis/python-storage/commit/a38ca1977694def98f65ae7239e300a987bbd262)) +* Redact sensitive data from OTEL traces and fix env var parsing ([#1553](https://github.com/googleapis/python-storage/issues/1553)) ([a38ca19](https://github.com/googleapis/python-storage/commit/a38ca1977694def98f65ae7239e300a987bbd262)) +* Use separate header object for each upload in Transfer Manager MPU ([#1595](https://github.com/googleapis/python-storage/issues/1595)) ([0d867bd](https://github.com/googleapis/python-storage/commit/0d867bd4f405d2dbeca1edfc8072080c5a96c1cd)) + ## [3.4.1](https://github.com/googleapis/python-storage/compare/v3.4.0...v3.5.0) (2025-10-08) ### Bug Fixes diff --git a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py index 8a06608b2..e32125069 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py @@ -1,6 +1,7 @@ import abc from typing import Any, Iterable + class _BaseResumptionStrategy(abc.ABC): """Abstract base class defining the interface for a bidi stream resumption strategy. diff --git a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py index 9c82cf7f0..d5d080358 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py @@ -7,9 +7,13 @@ ) from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError + class _DownloadState: """A helper class to track the state of a single range download.""" - def __init__(self, initial_offset: int, initial_length: int, user_buffer: IO[bytes]): + + def __init__( + self, initial_offset: int, initial_length: int, user_buffer: IO[bytes] + ): self.initial_offset = initial_offset self.initial_length = initial_length self.user_buffer = user_buffer @@ -42,7 +46,9 @@ def generate_requests(self, state: dict) -> List[storage_v2.ReadRange]: pending_requests.append(new_request) return pending_requests - def update_state_from_response(self, response: storage_v2.BidiReadObjectResponse, state: dict) -> None: + def update_state_from_response( + self, response: storage_v2.BidiReadObjectResponse, state: dict + ) -> None: """Processes a server response, performs integrity checks, and updates state.""" for object_data_range in response.object_data_ranges: read_id = object_data_range.read_range.read_id @@ -62,8 +68,13 @@ def update_state_from_response(self, response: storage_v2.BidiReadObjectResponse # Final Byte Count Verification if object_data_range.range_end: read_state.is_complete = True - if read_state.initial_length != 0 and read_state.bytes_written != read_state.initial_length: - raise DataCorruption(response, f"Byte count mismatch for read_id {read_id}") + if ( + read_state.initial_length != 0 + and read_state.bytes_written != read_state.initial_length + ): + raise DataCorruption( + response, f"Byte count mismatch for read_id {read_id}" + ) async def recover_state_on_failure(self, error: Exception, state: Any) -> None: """Handles BidiReadObjectRedirectedError for reads.""" @@ -71,4 +82,4 @@ async def recover_state_on_failure(self, error: Exception, state: Any) -> None: # and store it on the shared state object. cause = getattr(error, "cause", error) if isinstance(cause, BidiReadObjectRedirectedError): - state['routing_token'] = cause.routing_token + state["routing_token"] = cause.routing_token diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 71133df01..13194aa56 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.4.1" +__version__ = "3.5.0" diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py index fdde74f62..e6b343f86 100644 --- a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -107,7 +107,9 @@ def test_update_state_processes_single_chunk_successfully(self): response = storage_v2.BidiReadObjectResponse( object_data_ranges=[ storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=len(data)), + read_range=storage_v2.ReadRange( + read_id=_READ_ID, read_offset=0, read_length=len(data) + ), checksummed_data=storage_v2.ChecksummedData(content=data), ) ] @@ -130,7 +132,9 @@ def test_update_state_from_response_offset_mismatch(self): response = storage_v2.BidiReadObjectResponse( object_data_ranges=[ storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=4), + read_range=storage_v2.ReadRange( + read_id=_READ_ID, read_offset=0, read_length=4 + ), checksummed_data=storage_v2.ChecksummedData(content=b"data"), ) ] @@ -149,7 +153,9 @@ def test_update_state_from_response_final_byte_count_mismatch(self): response = storage_v2.BidiReadObjectResponse( object_data_ranges=[ storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=4), + read_range=storage_v2.ReadRange( + read_id=_READ_ID, read_offset=0, read_length=4 + ), checksummed_data=storage_v2.ChecksummedData(content=b"data"), range_end=True, ) @@ -171,7 +177,9 @@ def test_update_state_from_response_completes_download(self): response = storage_v2.BidiReadObjectResponse( object_data_ranges=[ storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=len(data)), + read_range=storage_v2.ReadRange( + read_id=_READ_ID, read_offset=0, read_length=len(data) + ), checksummed_data=storage_v2.ChecksummedData(content=data), range_end=True, ) @@ -195,7 +203,9 @@ def test_update_state_from_response_completes_download_zero_length(self): response = storage_v2.BidiReadObjectResponse( object_data_ranges=[ storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange(read_id=_READ_ID, read_offset=0, read_length=len(data)), + read_range=storage_v2.ReadRange( + read_id=_READ_ID, read_offset=0, read_length=len(data) + ), checksummed_data=storage_v2.ChecksummedData(content=data), range_end=True, ) @@ -215,9 +225,7 @@ async def test_recover_state_on_failure_handles_redirect(self): self.assertIsNone(state.get("routing_token")) dummy_token = "dummy-routing-token" - redirect_error = BidiReadObjectRedirectedError( - routing_token=dummy_token - ) + redirect_error = BidiReadObjectRedirectedError(routing_token=dummy_token) final_error = exceptions.RetryError("Retry failed", cause=redirect_error) From 323cddd5d439e04e12614106eab1928fd4008c0b Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:11:14 +0530 Subject: [PATCH 407/509] feat: make return_partial_success and unreachable fields public for list Bucket (#1601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: make return_partial_success and unreachable fields public for list Bucket docs: updates to docs and docs formatting PiperOrigin-RevId: 828488192 Source-Link: https://github.com/googleapis/googleapis/commit/3a77bd60b37c086effb39819e9183fbc83e3a693 Source-Link: https://github.com/googleapis/googleapis-gen/commit/c74fa7ee707c42064a99435914db0ac10ba5f545 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYzc0ZmE3ZWU3MDdjNDIwNjRhOTk0MzU5MTRkYjBhYzEwYmE1ZjU0NSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot --- .flake8 | 15 +- MANIFEST.in | 13 +- .../services/storage/async_client.py | 536 +++++--- .../_storage_v2/services/storage/client.py | 536 +++++--- .../services/storage/transports/grpc.py | 394 ++++-- .../storage/transports/grpc_asyncio.py | 394 ++++-- google/cloud/_storage_v2/types/storage.py | 1081 +++++++++-------- tests/unit/gapic/storage_v2/test_storage.py | 6 + 8 files changed, 1819 insertions(+), 1156 deletions(-) diff --git a/.flake8 b/.flake8 index 32986c792..90316de21 100644 --- a/.flake8 +++ b/.flake8 @@ -1,28 +1,29 @@ # -*- coding: utf-8 -*- -# -# Copyright 2024 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - -# Generated by synthtool. DO NOT EDIT! +# [flake8] +# TODO(https://github.com/googleapis/gapic-generator-python/issues/2333): +# Resolve flake8 lint issues ignore = E203, E231, E266, E501, W503 exclude = - # Exclude generated code. - **/proto/** + # TODO(https://github.com/googleapis/gapic-generator-python/issues/2333): + # Ensure that generated code passes flake8 lint **/gapic/** **/services/** **/types/** + # Exclude Protobuf gencode *_pb2.py # Standard linting exemptions. diff --git a/MANIFEST.in b/MANIFEST.in index d6814cd60..dae249ec8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,25 +1,20 @@ # -*- coding: utf-8 -*- -# -# Copyright 2024 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - -# Generated by synthtool. DO NOT EDIT! +# include README.rst LICENSE -recursive-include google *.json *.proto py.typed +recursive-include google *.py *.pyi *.json *.proto py.typed recursive-include tests * global-exclude *.py[co] global-exclude __pycache__ - -# Exclude scripts for samples readmegen -prune scripts/readme-gen diff --git a/google/cloud/_storage_v2/services/storage/async_client.py b/google/cloud/_storage_v2/services/storage/async_client.py index 4244fa791..c71ee0472 100644 --- a/google/cloud/_storage_v2/services/storage/async_client.py +++ b/google/cloud/_storage_v2/services/storage/async_client.py @@ -75,8 +75,8 @@ class StorageAsyncClient: The Cloud Storage gRPC API allows applications to read and write data through the abstractions of buckets and objects. For a - description of these abstractions please see - https://cloud.google.com/storage/docs. + description of these abstractions please see `Cloud Storage + documentation `__. Resources are named as follows: @@ -85,17 +85,24 @@ class StorageAsyncClient: ``projects/my-string-id``. - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. + ``projects/{project}/buckets/{bucket}``. For globally unique + buckets, ``_`` might be substituted for the project. - Objects are uniquely identified by their name along with the name of the bucket they belong to, as separate strings in this API. For example: - ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + :: + + ``` + ReadObjectRequest { + bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' + } + ``` + + Note that object names can contain ``/`` characters, which are + treated as any other character (no special directory semantics). """ _client: StorageClient @@ -324,7 +331,28 @@ async def delete_bucket( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> None: - r"""Permanently deletes an empty bucket. + r"""Permanently deletes an empty bucket. The request fails if there + are any live or noncurrent objects in the bucket, but the + request succeeds if the bucket only contains soft-deleted + objects or incomplete uploads, such as ongoing XML API multipart + uploads. Does not permanently delete soft-deleted objects. + + When this API is used to delete a bucket containing an object + that has a soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. + + Objects and multipart uploads that were in the bucket at the + time of deletion are also retained for the specified retention + duration. When a soft-deleted bucket reaches the end of its + retention duration, it is permanently deleted. The + ``hardDeleteTime`` of the bucket always equals or exceeds the + expiration time of the last soft-deleted object in the bucket. + + **IAM Permissions**: + + Requires ``storage.buckets.delete`` IAM permission on the + bucket. .. code-block:: python @@ -351,7 +379,8 @@ async def sample_delete_bucket(): Args: request (Optional[Union[google.cloud._storage_v2.types.DeleteBucketRequest, dict]]): - The request object. Request message for DeleteBucket. + The request object. Request message for + [DeleteBucket][google.storage.v2.Storage.DeleteBucket]. name (:class:`str`): Required. Name of a bucket to delete. This corresponds to the ``name`` field @@ -428,6 +457,16 @@ async def get_bucket( ) -> storage.Bucket: r"""Returns metadata for the specified bucket. + **IAM Permissions**: + + Requires ``storage.buckets.get`` IAM permission on the bucket. + Additionally, to return specific bucket metadata, the + authenticated user must have the following permissions: + + - To return the IAM policies: ``storage.buckets.getIamPolicy`` + - To return the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` + .. code-block:: python # This snippet has been automatically generated and should be regarded as a @@ -456,7 +495,8 @@ async def sample_get_bucket(): Args: request (Optional[Union[google.cloud._storage_v2.types.GetBucketRequest, dict]]): - The request object. Request message for GetBucket. + The request object. Request message for + [GetBucket][google.storage.v2.Storage.GetBucket]. name (:class:`str`): Required. Name of a bucket. This corresponds to the ``name`` field @@ -542,6 +582,17 @@ async def create_bucket( ) -> storage.Bucket: r"""Creates a new bucket. + **IAM Permissions**: + + Requires ``storage.buckets.create`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To enable object retention using the ``enableObjectRetention`` + query parameter: ``storage.buckets.enableObjectRetention`` + - To set the bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + .. code-block:: python # This snippet has been automatically generated and should be regarded as a @@ -571,10 +622,11 @@ async def sample_create_bucket(): Args: request (Optional[Union[google.cloud._storage_v2.types.CreateBucketRequest, dict]]): - The request object. Request message for CreateBucket. + The request object. Request message for + [CreateBucket][google.storage.v2.Storage.CreateBucket]. parent (:class:`str`): - Required. The project to which this bucket will belong. - This field must either be empty or ``projects/_``. The + Required. The project to which this bucket belongs. This + field must either be empty or ``projects/_``. The project ID that owns this bucket should be specified in the ``bucket.project`` field. @@ -584,8 +636,8 @@ async def sample_create_bucket(): bucket (:class:`google.cloud._storage_v2.types.Bucket`): Optional. Properties of the new bucket being inserted. The name of the bucket is specified in the ``bucket_id`` - field. Populating ``bucket.name`` field will result in - an error. The project of the bucket must be specified in + field. Populating ``bucket.name`` field results in an + error. The project of the bucket must be specified in the ``bucket.project`` field. This field must be in ``projects/{projectIdentifier}`` format, {projectIdentifier} can be the project ID or project @@ -596,10 +648,10 @@ async def sample_create_bucket(): on the ``request`` instance; if ``request`` is provided, this should not be set. bucket_id (:class:`str`): - Required. The ID to use for this bucket, which will - become the final component of the bucket's resource - name. For example, the value ``foo`` might result in a - bucket with the name ``projects/123456/buckets/foo``. + Required. The ID to use for this bucket, which becomes + the final component of the bucket's resource name. For + example, the value ``foo`` might result in a bucket with + the name ``projects/123456/buckets/foo``. This corresponds to the ``bucket_id`` field on the ``request`` instance; if ``request`` is provided, this @@ -689,7 +741,18 @@ async def list_buckets( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> pagers.ListBucketsAsyncPager: - r"""Retrieves a list of buckets for a given project. + r"""Retrieves a list of buckets for a given project, ordered + lexicographically by name. + + **IAM Permissions**: + + Requires ``storage.buckets.list`` IAM permission on the bucket. + Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To list the IAM policies: ``storage.buckets.getIamPolicy`` + - To list the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` .. code-block:: python @@ -720,7 +783,8 @@ async def sample_list_buckets(): Args: request (Optional[Union[google.cloud._storage_v2.types.ListBucketsRequest, dict]]): - The request object. Request message for ListBuckets. + The request object. Request message for + [ListBuckets][google.storage.v2.Storage.ListBuckets]. parent (:class:`str`): Required. The project whose buckets we are listing. @@ -738,11 +802,11 @@ async def sample_list_buckets(): Returns: google.cloud._storage_v2.services.storage.pagers.ListBucketsAsyncPager: - The result of a call to - Buckets.ListBuckets - Iterating over this object will yield - results and resolve additional pages - automatically. + Response message for + [ListBuckets][google.storage.v2.Storage.ListBuckets]. + + Iterating over this object will yield results and + resolve additional pages automatically. """ # Create or coerce a protobuf request object. @@ -820,7 +884,25 @@ async def lock_bucket_retention_policy( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Bucket: - r"""Locks retention policy on a bucket. + r"""Permanently locks the retention policy that is currently applied + to the specified bucket. + + Caution: Locking a bucket is an irreversible action. Once you + lock a bucket: + + - You cannot remove the retention policy from the bucket. + - You cannot decrease the retention period for the policy. + + Once locked, you must delete the entire bucket in order to + remove the bucket's retention policy. However, before you can + delete the bucket, you must delete all the objects in the + bucket, which is only possible if all the objects have reached + the retention period set by the retention policy. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. .. code-block:: python @@ -852,7 +934,7 @@ async def sample_lock_bucket_retention_policy(): Args: request (Optional[Union[google.cloud._storage_v2.types.LockBucketRetentionPolicyRequest, dict]]): The request object. Request message for - LockBucketRetentionPolicyRequest. + [LockBucketRetentionPolicy][google.storage.v2.Storage.LockBucketRetentionPolicy]. bucket (:class:`str`): Required. Name of a bucket. This corresponds to the ``bucket`` field @@ -934,12 +1016,18 @@ async def get_iam_policy( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> policy_pb2.Policy: - r"""Gets the IAM policy for a specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + r"""Gets the IAM policy for a specified bucket or managed folder. + The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. + **IAM Permissions**: + + Requires ``storage.buckets.getIamPolicy`` on the bucket or + ``storage.managedFolders.getIamPolicy`` IAM permission on the + managed folder. + .. code-block:: python # This snippet has been automatically generated and should be regarded as a @@ -1089,9 +1177,9 @@ async def set_iam_policy( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> policy_pb2.Policy: - r"""Updates an IAM policy for the specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + r"""Updates an IAM policy for the specified bucket or managed + folder. The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. @@ -1393,8 +1481,20 @@ async def update_bucket( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Bucket: - r"""Updates a bucket. Equivalent to JSON API's - storage.buckets.patch method. + r"""Updates a bucket. Changes to the bucket are readable immediately + after writing, but configuration changes might take time to + propagate. This method supports ``patch`` semantics. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To set bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + - To update public access prevention policies or access control + lists (ACLs): ``storage.buckets.setIamPolicy`` .. code-block:: python @@ -1423,10 +1523,12 @@ async def sample_update_bucket(): Args: request (Optional[Union[google.cloud._storage_v2.types.UpdateBucketRequest, dict]]): - The request object. Request for UpdateBucket method. + The request object. Request for + [UpdateBucket][google.storage.v2.Storage.UpdateBucket] + method. bucket (:class:`google.cloud._storage_v2.types.Bucket`): Required. The bucket to update. The bucket's ``name`` - field will be used to identify the bucket. + field is used to identify the bucket. This corresponds to the ``bucket`` field on the ``request`` instance; if ``request`` is provided, this @@ -1438,7 +1540,7 @@ async def sample_update_bucket(): "update" function, specify a single field with the value ``*``. Note: not recommended. If a new field is introduced at a later time, an older client updating - with the ``*`` may accidentally reset the new field's + with the ``*`` might accidentally reset the new field's value. Not specifying any fields is an error. @@ -1523,8 +1625,19 @@ async def compose_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Concatenates a list of existing objects into a new - object in the same bucket. + r"""Concatenates a list of existing objects into a new object in the + same bucket. The existing source objects are unaffected by this + operation. + + **IAM Permissions**: + + Requires the ``storage.objects.create`` and + ``storage.objects.get`` IAM permissions to use this method. If + the new composite object overwrites an existing object, the + authenticated user must also have the ``storage.objects.delete`` + permission. If the request body includes the retention property, + the authenticated user must also have the + ``storage.objects.setRetention`` IAM permission. .. code-block:: python @@ -1553,7 +1666,8 @@ async def sample_compose_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.ComposeObjectRequest, dict]]): - The request object. Request message for ComposeObject. + The request object. Request message for + [ComposeObject][google.storage.v2.Storage.ComposeObject]. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -1617,15 +1731,13 @@ async def delete_object( ) -> None: r"""Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation - parameter is used, or if `soft - delete `__ is - not enabled for the bucket. When this API is used to delete an - object from a bucket that has soft delete policy enabled, the - object becomes soft deleted, and the ``softDeleteTime`` and - ``hardDeleteTime`` properties are set on the object. This API - cannot be used to permanently delete soft-deleted objects. - Soft-deleted objects are permanently deleted according to their - ``hardDeleteTime``. + parameter is used, or if soft delete is not enabled for the + bucket. When this API is used to delete an object from a bucket + that has soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. This API cannot be used to + permanently delete soft-deleted objects. Soft-deleted objects + are permanently deleted according to their ``hardDeleteTime``. You can use the [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API @@ -1634,9 +1746,8 @@ async def delete_object( **IAM Permissions**: - Requires ``storage.objects.delete`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.delete`` IAM permission on the + bucket. .. code-block:: python @@ -1664,8 +1775,8 @@ async def sample_delete_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.DeleteObjectRequest, dict]]): - The request object. Message for deleting an object. ``bucket`` and - ``object`` **must** be set. + The request object. Request message for deleting an + object. bucket (:class:`str`): Required. Name of the bucket in which the object resides. @@ -1765,7 +1876,44 @@ async def restore_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Restores a soft-deleted object. + r"""Restores a soft-deleted object. When a soft-deleted object is + restored, a new copy of that object is created in the same + bucket and inherits the same metadata as the soft-deleted + object. The inherited metadata is the metadata that existed when + the original object became soft deleted, with the following + exceptions: + + - The ``createTime`` of the new object is set to the time at + which the soft-deleted object was restored. + - The ``softDeleteTime`` and ``hardDeleteTime`` values are + cleared. + - A new generation is assigned and the metageneration is reset + to 1. + - If the soft-deleted object was in a bucket that had Autoclass + enabled, the new object is restored to Standard storage. + - The restored object inherits the bucket's default object ACL, + unless ``copySourceAcl`` is ``true``. + + If a live object using the same name already exists in the + bucket and becomes overwritten, the live object becomes a + noncurrent object if Object Versioning is enabled on the bucket. + If Object Versioning is not enabled, the live object becomes + soft deleted. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.restore`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) + - ``storage.objects.getIamPolicy`` (only required if + ``projection`` is ``full`` and the relevant bucket has uniform + bucket-level access disabled) + - ``storage.objects.setIamPolicy`` (only required if + ``copySourceAcl`` is ``true`` and the relevant bucket has + uniform bucket-level access disabled) .. code-block:: python @@ -1797,8 +1945,10 @@ async def sample_restore_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.RestoreObjectRequest, dict]]): - The request object. Message for restoring an object. ``bucket``, ``object``, - and ``generation`` **must** be set. + The request object. Request message for + [RestoreObject][google.storage.v2.Storage.RestoreObject]. + ``bucket``, ``object``, and ``generation`` **must** be + set. bucket (:class:`str`): Required. Name of the bucket in which the object resides. @@ -1903,11 +2053,11 @@ async def cancel_resumable_write( r"""Cancels an in-progress resumable upload. Any attempts to write to the resumable upload after - cancelling the upload will fail. + cancelling the upload fail. - The behavior for currently in progress write operations - is not guaranteed - they could either complete before - the cancellation or fail if the cancellation completes + The behavior for any in-progress write operations is not + guaranteed; they could either complete before the + cancellation or fail if the cancellation completes first. .. code-block:: python @@ -1938,8 +2088,8 @@ async def sample_cancel_resumable_write(): Args: request (Optional[Union[google.cloud._storage_v2.types.CancelResumableWriteRequest, dict]]): - The request object. Message for canceling an in-progress resumable upload. - ``upload_id`` **must** be set. + The request object. Request message for + [CancelResumableWrite][google.storage.v2.Storage.CancelResumableWrite]. upload_id (:class:`str`): Required. The upload_id of the resumable upload to cancel. This should be copied from the ``upload_id`` @@ -1959,7 +2109,7 @@ async def sample_cancel_resumable_write(): Returns: google.cloud._storage_v2.types.CancelResumableWriteResponse: Empty response message for canceling - an in-progress resumable upload, will be + an in-progress resumable upload, is extended as needed. """ @@ -2035,10 +2185,9 @@ async def get_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. To return object ACLs, the authenticated user - must also have the ``storage.objects.getIamPolicy`` permission. + Requires ``storage.objects.get`` IAM permission on the bucket. + To return object ACLs, the authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. .. code-block:: python @@ -2069,7 +2218,8 @@ async def sample_get_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.GetObjectRequest, dict]]): - The request object. Request message for GetObject. + The request object. Request message for + [GetObject][google.storage.v2.Storage.GetObject]. bucket (:class:`str`): Required. Name of the bucket in which the object resides. @@ -2177,9 +2327,7 @@ def read_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.get`` IAM permission on the bucket. .. code-block:: python @@ -2211,7 +2359,8 @@ async def sample_read_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.ReadObjectRequest, dict]]): - The request object. Request message for ReadObject. + The request object. Request message for + [ReadObject][google.storage.v2.Storage.ReadObject]. bucket (:class:`str`): Required. The name of the bucket containing the object to read. @@ -2245,7 +2394,9 @@ async def sample_read_object(): Returns: AsyncIterable[google.cloud._storage_v2.types.ReadObjectResponse]: - Response message for ReadObject. + Response message for + [ReadObject][google.storage.v2.Storage.ReadObject]. + """ # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have @@ -2316,25 +2467,17 @@ def bidi_read_object( ) -> Awaitable[AsyncIterable[storage.BidiReadObjectResponse]]: r"""Reads an object's data. - This is a bi-directional API with the added support for reading - multiple ranges within one stream both within and across - multiple messages. If the server encountered an error for any of - the inputs, the stream will be closed with the relevant error - code. Because the API allows for multiple outstanding requests, - when the stream is closed the error response will contain a - BidiReadObjectRangesError proto in the error extension - describing the error for each outstanding read_id. + This bi-directional API reads data from an object, allowing you + to request multiple data ranges within a single stream, even + across several messages. If an error occurs with any request, + the stream closes with a relevant error code. Since you can have + multiple outstanding requests, the error response includes a + ``BidiReadObjectRangesError`` field detailing the specific error + for each pending ``read_id``. **IAM Permissions**: - Requires ``storage.objects.get`` - - `IAM - permission `__ - on the bucket. - - This API is currently in preview and is not yet available for - general use. + Requires ``storage.objects.get`` IAM permission on the bucket. .. code-block:: python @@ -2374,7 +2517,8 @@ def request_generator(): Args: requests (AsyncIterator[`google.cloud._storage_v2.types.BidiReadObjectRequest`]): - The request object AsyncIterator. Request message for BidiReadObject. + The request object AsyncIterator. Request message for + [BidiReadObject][google.storage.v2.Storage.BidiReadObject]. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -2385,7 +2529,9 @@ def request_generator(): Returns: AsyncIterable[google.cloud._storage_v2.types.BidiReadObjectResponse]: - Response message for BidiReadObject. + Response message for + [BidiReadObject][google.storage.v2.Storage.BidiReadObject]. + """ # Wrap the RPC method; this adds retry and timeout information, @@ -2425,8 +2571,13 @@ async def update_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Updates an object's metadata. - Equivalent to JSON API's storage.objects.patch. + r"""Updates an object's metadata. Equivalent to JSON API's + ``storage.objects.patch`` method. + + **IAM Permissions**: + + Requires ``storage.objects.update`` IAM permission on the + bucket. .. code-block:: python @@ -2455,7 +2606,8 @@ async def sample_update_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.UpdateObjectRequest, dict]]): - The request object. Request message for UpdateObject. + The request object. Request message for + [UpdateObject][google.storage.v2.Storage.UpdateObject]. object_ (:class:`google.cloud._storage_v2.types.Object`): Required. The object to update. The object's bucket and name fields are @@ -2476,7 +2628,7 @@ async def sample_update_object(): "update" function, specify a single field with the value ``*``. Note: not recommended. If a new field is introduced at a later time, an older client updating - with the ``*`` may accidentally reset the new field's + with the ``*`` might accidentally reset the new field's value. Not specifying any fields is an error. @@ -2581,32 +2733,32 @@ async def write_object( - Check the result Status of the stream, to determine if writing can be resumed on this stream or must be restarted from scratch (by calling ``StartResumableWrite()``). The resumable - errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For - each case, the client should use binary exponential backoff - before retrying. Additionally, writes can be resumed after - RESOURCE_EXHAUSTED errors, but only after taking appropriate - measures, which may include reducing aggregate send rate - across clients and/or requesting a quota increase for your - project. + errors are ``DEADLINE_EXCEEDED``, ``INTERNAL``, and + ``UNAVAILABLE``. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after ``RESOURCE_EXHAUSTED`` errors, but only after + taking appropriate measures, which might include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. - If the call to ``WriteObject`` returns ``ABORTED``, that indicates concurrent attempts to update the resumable write, caused either by multiple racing clients or by a single client where the previous request was timed out on the client side but nonetheless reached the server. In this case the client - should take steps to prevent further concurrent writes (e.g., - increase the timeouts, stop using more than one process to - perform the upload, etc.), and then should follow the steps - below for resuming the upload. + should take steps to prevent further concurrent writes. For + example, increase the timeouts and stop using more than one + process to perform the upload. Follow the steps below for + resuming the upload. - For resumable errors, the client should call ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than the - returned ``persisted_size``; in this case, the service will - skip data at offsets that were already persisted (without + returned ``persisted_size``. This might be less than the + amount of data the client previously sent. Note also that it + is acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + skips data at offsets that were already persisted (without checking that it matches the previously written data), and write only the data starting from the persisted offset. Even - though the data isn't written, it may still incur a + though the data isn't written, it might still incur a performance cost over resuming at the correct write offset. This behavior can make client-side handling simpler in some cases. @@ -2614,27 +2766,26 @@ async def write_object( message, unless the object is being finished with ``finish_write`` set to ``true``. - The service will not view the object as complete until the + The service does not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` set to ``true``. Sending any requests on a stream after sending - a request with ``finish_write`` set to ``true`` will cause an - error. The client **should** check the response it receives to - determine how much data the service was able to commit and - whether the service views the object as complete. + a request with ``finish_write`` set to ``true`` causes an error. + The client must check the response it receives to determine how + much data the service is able to commit and whether the service + views the object as complete. - Attempting to resume an already finalized object will result in - an OK status, with a ``WriteObjectResponse`` containing the + Attempting to resume an already finalized object results in an + ``OK`` status, with a ``WriteObjectResponse`` containing the finalized object's metadata. - Alternatively, the BidiWriteObject operation may be used to + Alternatively, you can use the ``BidiWriteObject`` operation to write an object with controls over flushing and the ability to fetch the ability to determine the current persisted size. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. .. code-block:: python @@ -2675,7 +2826,8 @@ def request_generator(): Args: requests (AsyncIterator[`google.cloud._storage_v2.types.WriteObjectRequest`]): - The request object AsyncIterator. Request message for WriteObject. + The request object AsyncIterator. Request message for + [WriteObject][google.storage.v2.Storage.WriteObject]. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -2686,7 +2838,9 @@ def request_generator(): Returns: google.cloud._storage_v2.types.WriteObjectResponse: - Response message for WriteObject. + Response message for + [WriteObject][google.storage.v2.Storage.WriteObject]. + """ # Wrap the RPC method; this adds retry and timeout information, @@ -2719,20 +2873,20 @@ def bidi_write_object( ) -> Awaitable[AsyncIterable[storage.BidiWriteObjectResponse]]: r"""Stores a new object and metadata. - This is similar to the WriteObject call with the added support - for manual flushing of persisted state, and the ability to - determine current persisted size without closing the stream. - - The client may specify one or both of the ``state_lookup`` and - ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is - specified, the data written so far will be persisted to storage. - If ``state_lookup`` is specified, the service will respond with - a BidiWriteObjectResponse that contains the persisted size. If - both ``flush`` and ``state_lookup`` are specified, the flush - will always occur before a ``state_lookup``, so that both may be - set in the same request and the returned state will be the state - of the object post-flush. When the stream is closed, a - BidiWriteObjectResponse will always be sent to the client, + This is similar to the ``WriteObject`` call with the added + support for manual flushing of persisted state, and the ability + to determine current persisted size without closing the stream. + + The client might specify one or both of the ``state_lookup`` and + ``flush`` fields in each ``BidiWriteObjectRequest``. If + ``flush`` is specified, the data written so far is persisted to + storage. If ``state_lookup`` is specified, the service responds + with a ``BidiWriteObjectResponse`` that contains the persisted + size. If both ``flush`` and ``state_lookup`` are specified, the + flush always occurs before a ``state_lookup``, so that both + might be set in the same request and the returned state is the + state of the object post-flush. When the stream is closed, a + ``BidiWriteObjectResponse`` is always sent to the client, regardless of the value of ``state_lookup``. .. code-block:: python @@ -2775,7 +2929,8 @@ def request_generator(): Args: requests (AsyncIterator[`google.cloud._storage_v2.types.BidiWriteObjectRequest`]): - The request object AsyncIterator. Request message for BidiWriteObject. + The request object AsyncIterator. Request message for + [BidiWriteObject][google.storage.v2.Storage.BidiWriteObject]. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -2822,11 +2977,10 @@ async def list_objects( **IAM Permissions**: - The authenticated user requires ``storage.objects.list`` `IAM - permission `__ - to use this method. To return object ACLs, the authenticated - user must also have the ``storage.objects.getIamPolicy`` - permission. + The authenticated user requires ``storage.objects.list`` IAM + permission to use this method. To return object ACLs, the + authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. .. code-block:: python @@ -2857,7 +3011,8 @@ async def sample_list_objects(): Args: request (Optional[Union[google.cloud._storage_v2.types.ListObjectsRequest, dict]]): - The request object. Request message for ListObjects. + The request object. Request message for + [ListObjects][google.storage.v2.Storage.ListObjects]. parent (:class:`str`): Required. Name of the bucket in which to look for objects. @@ -2990,17 +3145,20 @@ async def sample_rewrite_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.RewriteObjectRequest, dict]]): - The request object. Request message for RewriteObject. If the source object - is encrypted using a Customer-Supplied Encryption Key - the key information must be provided in the - copy_source_encryption_algorithm, - copy_source_encryption_key_bytes, and - copy_source_encryption_key_sha256_bytes fields. If the - destination object should be encrypted the keying + The request object. Request message for + [RewriteObject][google.storage.v2.Storage.RewriteObject]. + If the source object is encrypted using a + Customer-Supplied Encryption Key the key information + must be provided in the + ``copy_source_encryption_algorithm``, + ``copy_source_encryption_key_bytes``, and + ``copy_source_encryption_key_sha256_bytes`` fields. If + the destination object should be encrypted the keying information should be provided in the - encryption_algorithm, encryption_key_bytes, and - encryption_key_sha256_bytes fields of the - common_object_request_params.customer_encryption field. + ``encryption_algorithm``, ``encryption_key_bytes``, and + ``encryption_key_sha256_bytes`` fields of the + ``common_object_request_params.customer_encryption`` + field. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -3063,18 +3221,16 @@ async def start_resumable_write( metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.StartResumableWriteResponse: r"""Starts a resumable write operation. This method is part of the - `Resumable - upload `__ - feature. This allows you to upload large objects in multiple - chunks, which is more resilient to network interruptions than a - single upload. The validity duration of the write operation, and - the consequences of it becoming invalid, are service-dependent. + Resumable upload feature. This allows you to upload large + objects in multiple chunks, which is more resilient to network + interruptions than a single upload. The validity duration of the + write operation, and the consequences of it becoming invalid, + are service-dependent. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. .. code-block:: python @@ -3103,7 +3259,8 @@ async def sample_start_resumable_write(): Args: request (Optional[Union[google.cloud._storage_v2.types.StartResumableWriteRequest, dict]]): - The request object. Request message StartResumableWrite. + The request object. Request message for + [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite]. retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -3114,7 +3271,9 @@ async def sample_start_resumable_write(): Returns: google.cloud._storage_v2.types.StartResumableWriteResponse: - Response object for StartResumableWrite. + Response object for + [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite]. + """ # Create or coerce a protobuf request object. # - Use the request object if provided (there's no risk of modifying the input as @@ -3166,11 +3325,10 @@ async def query_write_status( metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.QueryWriteStatusResponse: r"""Determines the ``persisted_size`` of an object that is being - written. This method is part of the `resumable - upload `__ - feature. The returned value is the size of the object that has - been persisted so far. The value can be used as the - ``write_offset`` for the next ``Write()`` call. + written. This method is part of the resumable upload feature. + The returned value is the size of the object that has been + persisted so far. The value can be used as the ``write_offset`` + for the next ``Write()`` call. If the object does not exist, meaning if it was deleted, or the first ``Write()`` has not yet reached the service, this method @@ -3212,7 +3370,8 @@ async def sample_query_write_status(): Args: request (Optional[Union[google.cloud._storage_v2.types.QueryWriteStatusRequest, dict]]): - The request object. Request object for ``QueryWriteStatus``. + The request object. Request object for + [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus]. upload_id (:class:`str`): Required. The name of the resume token for the object whose write status @@ -3231,7 +3390,9 @@ async def sample_query_write_status(): Returns: google.cloud._storage_v2.types.QueryWriteStatusResponse: - Response object for QueryWriteStatus. + Response object for + [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus]. + """ # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have @@ -3301,8 +3462,20 @@ async def move_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Moves the source object to the destination object in - the same bucket. + r"""Moves the source object to the destination object in the same + bucket. This operation moves a source object to a destination + object in the same bucket by renaming the object. The move + itself is an atomic transaction, ensuring all steps either + complete successfully or no changes are made. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.move`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) .. code-block:: python @@ -3334,7 +3507,8 @@ async def sample_move_object(): Args: request (Optional[Union[google.cloud._storage_v2.types.MoveObjectRequest, dict]]): - The request object. Request message for MoveObject. + The request object. Request message for + [MoveObject][google.storage.v2.Storage.MoveObject]. bucket (:class:`str`): Required. Name of the bucket in which the object resides. diff --git a/google/cloud/_storage_v2/services/storage/client.py b/google/cloud/_storage_v2/services/storage/client.py index 82596dcd2..16c76a01f 100644 --- a/google/cloud/_storage_v2/services/storage/client.py +++ b/google/cloud/_storage_v2/services/storage/client.py @@ -115,8 +115,8 @@ class StorageClient(metaclass=StorageClientMeta): The Cloud Storage gRPC API allows applications to read and write data through the abstractions of buckets and objects. For a - description of these abstractions please see - https://cloud.google.com/storage/docs. + description of these abstractions please see `Cloud Storage + documentation `__. Resources are named as follows: @@ -125,17 +125,24 @@ class StorageClient(metaclass=StorageClientMeta): ``projects/my-string-id``. - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. + ``projects/{project}/buckets/{bucket}``. For globally unique + buckets, ``_`` might be substituted for the project. - Objects are uniquely identified by their name along with the name of the bucket they belong to, as separate strings in this API. For example: - ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + :: + + ``` + ReadObjectRequest { + bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' + } + ``` + + Note that object names can contain ``/`` characters, which are + treated as any other character (no special directory semantics). """ @staticmethod @@ -763,7 +770,28 @@ def delete_bucket( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> None: - r"""Permanently deletes an empty bucket. + r"""Permanently deletes an empty bucket. The request fails if there + are any live or noncurrent objects in the bucket, but the + request succeeds if the bucket only contains soft-deleted + objects or incomplete uploads, such as ongoing XML API multipart + uploads. Does not permanently delete soft-deleted objects. + + When this API is used to delete a bucket containing an object + that has a soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. + + Objects and multipart uploads that were in the bucket at the + time of deletion are also retained for the specified retention + duration. When a soft-deleted bucket reaches the end of its + retention duration, it is permanently deleted. The + ``hardDeleteTime`` of the bucket always equals or exceeds the + expiration time of the last soft-deleted object in the bucket. + + **IAM Permissions**: + + Requires ``storage.buckets.delete`` IAM permission on the + bucket. .. code-block:: python @@ -790,7 +818,8 @@ def sample_delete_bucket(): Args: request (Union[google.cloud._storage_v2.types.DeleteBucketRequest, dict]): - The request object. Request message for DeleteBucket. + The request object. Request message for + [DeleteBucket][google.storage.v2.Storage.DeleteBucket]. name (str): Required. Name of a bucket to delete. This corresponds to the ``name`` field @@ -864,6 +893,16 @@ def get_bucket( ) -> storage.Bucket: r"""Returns metadata for the specified bucket. + **IAM Permissions**: + + Requires ``storage.buckets.get`` IAM permission on the bucket. + Additionally, to return specific bucket metadata, the + authenticated user must have the following permissions: + + - To return the IAM policies: ``storage.buckets.getIamPolicy`` + - To return the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` + .. code-block:: python # This snippet has been automatically generated and should be regarded as a @@ -892,7 +931,8 @@ def sample_get_bucket(): Args: request (Union[google.cloud._storage_v2.types.GetBucketRequest, dict]): - The request object. Request message for GetBucket. + The request object. Request message for + [GetBucket][google.storage.v2.Storage.GetBucket]. name (str): Required. Name of a bucket. This corresponds to the ``name`` field @@ -975,6 +1015,17 @@ def create_bucket( ) -> storage.Bucket: r"""Creates a new bucket. + **IAM Permissions**: + + Requires ``storage.buckets.create`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To enable object retention using the ``enableObjectRetention`` + query parameter: ``storage.buckets.enableObjectRetention`` + - To set the bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + .. code-block:: python # This snippet has been automatically generated and should be regarded as a @@ -1004,10 +1055,11 @@ def sample_create_bucket(): Args: request (Union[google.cloud._storage_v2.types.CreateBucketRequest, dict]): - The request object. Request message for CreateBucket. + The request object. Request message for + [CreateBucket][google.storage.v2.Storage.CreateBucket]. parent (str): - Required. The project to which this bucket will belong. - This field must either be empty or ``projects/_``. The + Required. The project to which this bucket belongs. This + field must either be empty or ``projects/_``. The project ID that owns this bucket should be specified in the ``bucket.project`` field. @@ -1017,8 +1069,8 @@ def sample_create_bucket(): bucket (google.cloud._storage_v2.types.Bucket): Optional. Properties of the new bucket being inserted. The name of the bucket is specified in the ``bucket_id`` - field. Populating ``bucket.name`` field will result in - an error. The project of the bucket must be specified in + field. Populating ``bucket.name`` field results in an + error. The project of the bucket must be specified in the ``bucket.project`` field. This field must be in ``projects/{projectIdentifier}`` format, {projectIdentifier} can be the project ID or project @@ -1029,10 +1081,10 @@ def sample_create_bucket(): on the ``request`` instance; if ``request`` is provided, this should not be set. bucket_id (str): - Required. The ID to use for this bucket, which will - become the final component of the bucket's resource - name. For example, the value ``foo`` might result in a - bucket with the name ``projects/123456/buckets/foo``. + Required. The ID to use for this bucket, which becomes + the final component of the bucket's resource name. For + example, the value ``foo`` might result in a bucket with + the name ``projects/123456/buckets/foo``. This corresponds to the ``bucket_id`` field on the ``request`` instance; if ``request`` is provided, this @@ -1119,7 +1171,18 @@ def list_buckets( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> pagers.ListBucketsPager: - r"""Retrieves a list of buckets for a given project. + r"""Retrieves a list of buckets for a given project, ordered + lexicographically by name. + + **IAM Permissions**: + + Requires ``storage.buckets.list`` IAM permission on the bucket. + Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To list the IAM policies: ``storage.buckets.getIamPolicy`` + - To list the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` .. code-block:: python @@ -1150,7 +1213,8 @@ def sample_list_buckets(): Args: request (Union[google.cloud._storage_v2.types.ListBucketsRequest, dict]): - The request object. Request message for ListBuckets. + The request object. Request message for + [ListBuckets][google.storage.v2.Storage.ListBuckets]. parent (str): Required. The project whose buckets we are listing. @@ -1168,11 +1232,11 @@ def sample_list_buckets(): Returns: google.cloud._storage_v2.services.storage.pagers.ListBucketsPager: - The result of a call to - Buckets.ListBuckets - Iterating over this object will yield - results and resolve additional pages - automatically. + Response message for + [ListBuckets][google.storage.v2.Storage.ListBuckets]. + + Iterating over this object will yield results and + resolve additional pages automatically. """ # Create or coerce a protobuf request object. @@ -1247,7 +1311,25 @@ def lock_bucket_retention_policy( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Bucket: - r"""Locks retention policy on a bucket. + r"""Permanently locks the retention policy that is currently applied + to the specified bucket. + + Caution: Locking a bucket is an irreversible action. Once you + lock a bucket: + + - You cannot remove the retention policy from the bucket. + - You cannot decrease the retention period for the policy. + + Once locked, you must delete the entire bucket in order to + remove the bucket's retention policy. However, before you can + delete the bucket, you must delete all the objects in the + bucket, which is only possible if all the objects have reached + the retention period set by the retention policy. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. .. code-block:: python @@ -1279,7 +1361,7 @@ def sample_lock_bucket_retention_policy(): Args: request (Union[google.cloud._storage_v2.types.LockBucketRetentionPolicyRequest, dict]): The request object. Request message for - LockBucketRetentionPolicyRequest. + [LockBucketRetentionPolicy][google.storage.v2.Storage.LockBucketRetentionPolicy]. bucket (str): Required. Name of a bucket. This corresponds to the ``bucket`` field @@ -1360,12 +1442,18 @@ def get_iam_policy( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> policy_pb2.Policy: - r"""Gets the IAM policy for a specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + r"""Gets the IAM policy for a specified bucket or managed folder. + The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. + **IAM Permissions**: + + Requires ``storage.buckets.getIamPolicy`` on the bucket or + ``storage.managedFolders.getIamPolicy`` IAM permission on the + managed folder. + .. code-block:: python # This snippet has been automatically generated and should be regarded as a @@ -1516,9 +1604,9 @@ def set_iam_policy( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> policy_pb2.Policy: - r"""Updates an IAM policy for the specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + r"""Updates an IAM policy for the specified bucket or managed + folder. The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. @@ -1822,8 +1910,20 @@ def update_bucket( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Bucket: - r"""Updates a bucket. Equivalent to JSON API's - storage.buckets.patch method. + r"""Updates a bucket. Changes to the bucket are readable immediately + after writing, but configuration changes might take time to + propagate. This method supports ``patch`` semantics. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To set bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + - To update public access prevention policies or access control + lists (ACLs): ``storage.buckets.setIamPolicy`` .. code-block:: python @@ -1852,10 +1952,12 @@ def sample_update_bucket(): Args: request (Union[google.cloud._storage_v2.types.UpdateBucketRequest, dict]): - The request object. Request for UpdateBucket method. + The request object. Request for + [UpdateBucket][google.storage.v2.Storage.UpdateBucket] + method. bucket (google.cloud._storage_v2.types.Bucket): Required. The bucket to update. The bucket's ``name`` - field will be used to identify the bucket. + field is used to identify the bucket. This corresponds to the ``bucket`` field on the ``request`` instance; if ``request`` is provided, this @@ -1867,7 +1969,7 @@ def sample_update_bucket(): "update" function, specify a single field with the value ``*``. Note: not recommended. If a new field is introduced at a later time, an older client updating - with the ``*`` may accidentally reset the new field's + with the ``*`` might accidentally reset the new field's value. Not specifying any fields is an error. @@ -1949,8 +2051,19 @@ def compose_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Concatenates a list of existing objects into a new - object in the same bucket. + r"""Concatenates a list of existing objects into a new object in the + same bucket. The existing source objects are unaffected by this + operation. + + **IAM Permissions**: + + Requires the ``storage.objects.create`` and + ``storage.objects.get`` IAM permissions to use this method. If + the new composite object overwrites an existing object, the + authenticated user must also have the ``storage.objects.delete`` + permission. If the request body includes the retention property, + the authenticated user must also have the + ``storage.objects.setRetention`` IAM permission. .. code-block:: python @@ -1979,7 +2092,8 @@ def sample_compose_object(): Args: request (Union[google.cloud._storage_v2.types.ComposeObjectRequest, dict]): - The request object. Request message for ComposeObject. + The request object. Request message for + [ComposeObject][google.storage.v2.Storage.ComposeObject]. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -2041,15 +2155,13 @@ def delete_object( ) -> None: r"""Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation - parameter is used, or if `soft - delete `__ is - not enabled for the bucket. When this API is used to delete an - object from a bucket that has soft delete policy enabled, the - object becomes soft deleted, and the ``softDeleteTime`` and - ``hardDeleteTime`` properties are set on the object. This API - cannot be used to permanently delete soft-deleted objects. - Soft-deleted objects are permanently deleted according to their - ``hardDeleteTime``. + parameter is used, or if soft delete is not enabled for the + bucket. When this API is used to delete an object from a bucket + that has soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. This API cannot be used to + permanently delete soft-deleted objects. Soft-deleted objects + are permanently deleted according to their ``hardDeleteTime``. You can use the [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API @@ -2058,9 +2170,8 @@ def delete_object( **IAM Permissions**: - Requires ``storage.objects.delete`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.delete`` IAM permission on the + bucket. .. code-block:: python @@ -2088,8 +2199,8 @@ def sample_delete_object(): Args: request (Union[google.cloud._storage_v2.types.DeleteObjectRequest, dict]): - The request object. Message for deleting an object. ``bucket`` and - ``object`` **must** be set. + The request object. Request message for deleting an + object. bucket (str): Required. Name of the bucket in which the object resides. @@ -2186,7 +2297,44 @@ def restore_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Restores a soft-deleted object. + r"""Restores a soft-deleted object. When a soft-deleted object is + restored, a new copy of that object is created in the same + bucket and inherits the same metadata as the soft-deleted + object. The inherited metadata is the metadata that existed when + the original object became soft deleted, with the following + exceptions: + + - The ``createTime`` of the new object is set to the time at + which the soft-deleted object was restored. + - The ``softDeleteTime`` and ``hardDeleteTime`` values are + cleared. + - A new generation is assigned and the metageneration is reset + to 1. + - If the soft-deleted object was in a bucket that had Autoclass + enabled, the new object is restored to Standard storage. + - The restored object inherits the bucket's default object ACL, + unless ``copySourceAcl`` is ``true``. + + If a live object using the same name already exists in the + bucket and becomes overwritten, the live object becomes a + noncurrent object if Object Versioning is enabled on the bucket. + If Object Versioning is not enabled, the live object becomes + soft deleted. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.restore`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) + - ``storage.objects.getIamPolicy`` (only required if + ``projection`` is ``full`` and the relevant bucket has uniform + bucket-level access disabled) + - ``storage.objects.setIamPolicy`` (only required if + ``copySourceAcl`` is ``true`` and the relevant bucket has + uniform bucket-level access disabled) .. code-block:: python @@ -2218,8 +2366,10 @@ def sample_restore_object(): Args: request (Union[google.cloud._storage_v2.types.RestoreObjectRequest, dict]): - The request object. Message for restoring an object. ``bucket``, ``object``, - and ``generation`` **must** be set. + The request object. Request message for + [RestoreObject][google.storage.v2.Storage.RestoreObject]. + ``bucket``, ``object``, and ``generation`` **must** be + set. bucket (str): Required. Name of the bucket in which the object resides. @@ -2321,11 +2471,11 @@ def cancel_resumable_write( r"""Cancels an in-progress resumable upload. Any attempts to write to the resumable upload after - cancelling the upload will fail. + cancelling the upload fail. - The behavior for currently in progress write operations - is not guaranteed - they could either complete before - the cancellation or fail if the cancellation completes + The behavior for any in-progress write operations is not + guaranteed; they could either complete before the + cancellation or fail if the cancellation completes first. .. code-block:: python @@ -2356,8 +2506,8 @@ def sample_cancel_resumable_write(): Args: request (Union[google.cloud._storage_v2.types.CancelResumableWriteRequest, dict]): - The request object. Message for canceling an in-progress resumable upload. - ``upload_id`` **must** be set. + The request object. Request message for + [CancelResumableWrite][google.storage.v2.Storage.CancelResumableWrite]. upload_id (str): Required. The upload_id of the resumable upload to cancel. This should be copied from the ``upload_id`` @@ -2377,7 +2527,7 @@ def sample_cancel_resumable_write(): Returns: google.cloud._storage_v2.types.CancelResumableWriteResponse: Empty response message for canceling - an in-progress resumable upload, will be + an in-progress resumable upload, is extended as needed. """ @@ -2450,10 +2600,9 @@ def get_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. To return object ACLs, the authenticated user - must also have the ``storage.objects.getIamPolicy`` permission. + Requires ``storage.objects.get`` IAM permission on the bucket. + To return object ACLs, the authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. .. code-block:: python @@ -2484,7 +2633,8 @@ def sample_get_object(): Args: request (Union[google.cloud._storage_v2.types.GetObjectRequest, dict]): - The request object. Request message for GetObject. + The request object. Request message for + [GetObject][google.storage.v2.Storage.GetObject]. bucket (str): Required. Name of the bucket in which the object resides. @@ -2589,9 +2739,7 @@ def read_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.get`` IAM permission on the bucket. .. code-block:: python @@ -2623,7 +2771,8 @@ def sample_read_object(): Args: request (Union[google.cloud._storage_v2.types.ReadObjectRequest, dict]): - The request object. Request message for ReadObject. + The request object. Request message for + [ReadObject][google.storage.v2.Storage.ReadObject]. bucket (str): Required. The name of the bucket containing the object to read. @@ -2657,7 +2806,9 @@ def sample_read_object(): Returns: Iterable[google.cloud._storage_v2.types.ReadObjectResponse]: - Response message for ReadObject. + Response message for + [ReadObject][google.storage.v2.Storage.ReadObject]. + """ # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have @@ -2725,25 +2876,17 @@ def bidi_read_object( ) -> Iterable[storage.BidiReadObjectResponse]: r"""Reads an object's data. - This is a bi-directional API with the added support for reading - multiple ranges within one stream both within and across - multiple messages. If the server encountered an error for any of - the inputs, the stream will be closed with the relevant error - code. Because the API allows for multiple outstanding requests, - when the stream is closed the error response will contain a - BidiReadObjectRangesError proto in the error extension - describing the error for each outstanding read_id. + This bi-directional API reads data from an object, allowing you + to request multiple data ranges within a single stream, even + across several messages. If an error occurs with any request, + the stream closes with a relevant error code. Since you can have + multiple outstanding requests, the error response includes a + ``BidiReadObjectRangesError`` field detailing the specific error + for each pending ``read_id``. **IAM Permissions**: - Requires ``storage.objects.get`` - - `IAM - permission `__ - on the bucket. - - This API is currently in preview and is not yet available for - general use. + Requires ``storage.objects.get`` IAM permission on the bucket. .. code-block:: python @@ -2783,7 +2926,8 @@ def request_generator(): Args: requests (Iterator[google.cloud._storage_v2.types.BidiReadObjectRequest]): - The request object iterator. Request message for BidiReadObject. + The request object iterator. Request message for + [BidiReadObject][google.storage.v2.Storage.BidiReadObject]. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -2794,7 +2938,9 @@ def request_generator(): Returns: Iterable[google.cloud._storage_v2.types.BidiReadObjectResponse]: - Response message for BidiReadObject. + Response message for + [BidiReadObject][google.storage.v2.Storage.BidiReadObject]. + """ # Wrap the RPC method; this adds retry and timeout information, @@ -2832,8 +2978,13 @@ def update_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Updates an object's metadata. - Equivalent to JSON API's storage.objects.patch. + r"""Updates an object's metadata. Equivalent to JSON API's + ``storage.objects.patch`` method. + + **IAM Permissions**: + + Requires ``storage.objects.update`` IAM permission on the + bucket. .. code-block:: python @@ -2862,7 +3013,8 @@ def sample_update_object(): Args: request (Union[google.cloud._storage_v2.types.UpdateObjectRequest, dict]): - The request object. Request message for UpdateObject. + The request object. Request message for + [UpdateObject][google.storage.v2.Storage.UpdateObject]. object_ (google.cloud._storage_v2.types.Object): Required. The object to update. The object's bucket and name fields are @@ -2883,7 +3035,7 @@ def sample_update_object(): "update" function, specify a single field with the value ``*``. Note: not recommended. If a new field is introduced at a later time, an older client updating - with the ``*`` may accidentally reset the new field's + with the ``*`` might accidentally reset the new field's value. Not specifying any fields is an error. @@ -2985,32 +3137,32 @@ def write_object( - Check the result Status of the stream, to determine if writing can be resumed on this stream or must be restarted from scratch (by calling ``StartResumableWrite()``). The resumable - errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For - each case, the client should use binary exponential backoff - before retrying. Additionally, writes can be resumed after - RESOURCE_EXHAUSTED errors, but only after taking appropriate - measures, which may include reducing aggregate send rate - across clients and/or requesting a quota increase for your - project. + errors are ``DEADLINE_EXCEEDED``, ``INTERNAL``, and + ``UNAVAILABLE``. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after ``RESOURCE_EXHAUSTED`` errors, but only after + taking appropriate measures, which might include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. - If the call to ``WriteObject`` returns ``ABORTED``, that indicates concurrent attempts to update the resumable write, caused either by multiple racing clients or by a single client where the previous request was timed out on the client side but nonetheless reached the server. In this case the client - should take steps to prevent further concurrent writes (e.g., - increase the timeouts, stop using more than one process to - perform the upload, etc.), and then should follow the steps - below for resuming the upload. + should take steps to prevent further concurrent writes. For + example, increase the timeouts and stop using more than one + process to perform the upload. Follow the steps below for + resuming the upload. - For resumable errors, the client should call ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than the - returned ``persisted_size``; in this case, the service will - skip data at offsets that were already persisted (without + returned ``persisted_size``. This might be less than the + amount of data the client previously sent. Note also that it + is acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + skips data at offsets that were already persisted (without checking that it matches the previously written data), and write only the data starting from the persisted offset. Even - though the data isn't written, it may still incur a + though the data isn't written, it might still incur a performance cost over resuming at the correct write offset. This behavior can make client-side handling simpler in some cases. @@ -3018,27 +3170,26 @@ def write_object( message, unless the object is being finished with ``finish_write`` set to ``true``. - The service will not view the object as complete until the + The service does not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` set to ``true``. Sending any requests on a stream after sending - a request with ``finish_write`` set to ``true`` will cause an - error. The client **should** check the response it receives to - determine how much data the service was able to commit and - whether the service views the object as complete. + a request with ``finish_write`` set to ``true`` causes an error. + The client must check the response it receives to determine how + much data the service is able to commit and whether the service + views the object as complete. - Attempting to resume an already finalized object will result in - an OK status, with a ``WriteObjectResponse`` containing the + Attempting to resume an already finalized object results in an + ``OK`` status, with a ``WriteObjectResponse`` containing the finalized object's metadata. - Alternatively, the BidiWriteObject operation may be used to + Alternatively, you can use the ``BidiWriteObject`` operation to write an object with controls over flushing and the ability to fetch the ability to determine the current persisted size. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. .. code-block:: python @@ -3079,7 +3230,8 @@ def request_generator(): Args: requests (Iterator[google.cloud._storage_v2.types.WriteObjectRequest]): - The request object iterator. Request message for WriteObject. + The request object iterator. Request message for + [WriteObject][google.storage.v2.Storage.WriteObject]. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -3090,7 +3242,9 @@ def request_generator(): Returns: google.cloud._storage_v2.types.WriteObjectResponse: - Response message for WriteObject. + Response message for + [WriteObject][google.storage.v2.Storage.WriteObject]. + """ # Wrap the RPC method; this adds retry and timeout information, @@ -3121,20 +3275,20 @@ def bidi_write_object( ) -> Iterable[storage.BidiWriteObjectResponse]: r"""Stores a new object and metadata. - This is similar to the WriteObject call with the added support - for manual flushing of persisted state, and the ability to - determine current persisted size without closing the stream. - - The client may specify one or both of the ``state_lookup`` and - ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is - specified, the data written so far will be persisted to storage. - If ``state_lookup`` is specified, the service will respond with - a BidiWriteObjectResponse that contains the persisted size. If - both ``flush`` and ``state_lookup`` are specified, the flush - will always occur before a ``state_lookup``, so that both may be - set in the same request and the returned state will be the state - of the object post-flush. When the stream is closed, a - BidiWriteObjectResponse will always be sent to the client, + This is similar to the ``WriteObject`` call with the added + support for manual flushing of persisted state, and the ability + to determine current persisted size without closing the stream. + + The client might specify one or both of the ``state_lookup`` and + ``flush`` fields in each ``BidiWriteObjectRequest``. If + ``flush`` is specified, the data written so far is persisted to + storage. If ``state_lookup`` is specified, the service responds + with a ``BidiWriteObjectResponse`` that contains the persisted + size. If both ``flush`` and ``state_lookup`` are specified, the + flush always occurs before a ``state_lookup``, so that both + might be set in the same request and the returned state is the + state of the object post-flush. When the stream is closed, a + ``BidiWriteObjectResponse`` is always sent to the client, regardless of the value of ``state_lookup``. .. code-block:: python @@ -3177,7 +3331,8 @@ def request_generator(): Args: requests (Iterator[google.cloud._storage_v2.types.BidiWriteObjectRequest]): - The request object iterator. Request message for BidiWriteObject. + The request object iterator. Request message for + [BidiWriteObject][google.storage.v2.Storage.BidiWriteObject]. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -3222,11 +3377,10 @@ def list_objects( **IAM Permissions**: - The authenticated user requires ``storage.objects.list`` `IAM - permission `__ - to use this method. To return object ACLs, the authenticated - user must also have the ``storage.objects.getIamPolicy`` - permission. + The authenticated user requires ``storage.objects.list`` IAM + permission to use this method. To return object ACLs, the + authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. .. code-block:: python @@ -3257,7 +3411,8 @@ def sample_list_objects(): Args: request (Union[google.cloud._storage_v2.types.ListObjectsRequest, dict]): - The request object. Request message for ListObjects. + The request object. Request message for + [ListObjects][google.storage.v2.Storage.ListObjects]. parent (str): Required. Name of the bucket in which to look for objects. @@ -3387,17 +3542,20 @@ def sample_rewrite_object(): Args: request (Union[google.cloud._storage_v2.types.RewriteObjectRequest, dict]): - The request object. Request message for RewriteObject. If the source object - is encrypted using a Customer-Supplied Encryption Key - the key information must be provided in the - copy_source_encryption_algorithm, - copy_source_encryption_key_bytes, and - copy_source_encryption_key_sha256_bytes fields. If the - destination object should be encrypted the keying + The request object. Request message for + [RewriteObject][google.storage.v2.Storage.RewriteObject]. + If the source object is encrypted using a + Customer-Supplied Encryption Key the key information + must be provided in the + ``copy_source_encryption_algorithm``, + ``copy_source_encryption_key_bytes``, and + ``copy_source_encryption_key_sha256_bytes`` fields. If + the destination object should be encrypted the keying information should be provided in the - encryption_algorithm, encryption_key_bytes, and - encryption_key_sha256_bytes fields of the - common_object_request_params.customer_encryption field. + ``encryption_algorithm``, ``encryption_key_bytes``, and + ``encryption_key_sha256_bytes`` fields of the + ``common_object_request_params.customer_encryption`` + field. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -3458,18 +3616,16 @@ def start_resumable_write( metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.StartResumableWriteResponse: r"""Starts a resumable write operation. This method is part of the - `Resumable - upload `__ - feature. This allows you to upload large objects in multiple - chunks, which is more resilient to network interruptions than a - single upload. The validity duration of the write operation, and - the consequences of it becoming invalid, are service-dependent. + Resumable upload feature. This allows you to upload large + objects in multiple chunks, which is more resilient to network + interruptions than a single upload. The validity duration of the + write operation, and the consequences of it becoming invalid, + are service-dependent. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. .. code-block:: python @@ -3498,7 +3654,8 @@ def sample_start_resumable_write(): Args: request (Union[google.cloud._storage_v2.types.StartResumableWriteRequest, dict]): - The request object. Request message StartResumableWrite. + The request object. Request message for + [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite]. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -3509,7 +3666,9 @@ def sample_start_resumable_write(): Returns: google.cloud._storage_v2.types.StartResumableWriteResponse: - Response object for StartResumableWrite. + Response object for + [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite]. + """ # Create or coerce a protobuf request object. # - Use the request object if provided (there's no risk of modifying the input as @@ -3559,11 +3718,10 @@ def query_write_status( metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.QueryWriteStatusResponse: r"""Determines the ``persisted_size`` of an object that is being - written. This method is part of the `resumable - upload `__ - feature. The returned value is the size of the object that has - been persisted so far. The value can be used as the - ``write_offset`` for the next ``Write()`` call. + written. This method is part of the resumable upload feature. + The returned value is the size of the object that has been + persisted so far. The value can be used as the ``write_offset`` + for the next ``Write()`` call. If the object does not exist, meaning if it was deleted, or the first ``Write()`` has not yet reached the service, this method @@ -3605,7 +3763,8 @@ def sample_query_write_status(): Args: request (Union[google.cloud._storage_v2.types.QueryWriteStatusRequest, dict]): - The request object. Request object for ``QueryWriteStatus``. + The request object. Request object for + [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus]. upload_id (str): Required. The name of the resume token for the object whose write status @@ -3624,7 +3783,9 @@ def sample_query_write_status(): Returns: google.cloud._storage_v2.types.QueryWriteStatusResponse: - Response object for QueryWriteStatus. + Response object for + [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus]. + """ # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have @@ -3691,8 +3852,20 @@ def move_object( timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> storage.Object: - r"""Moves the source object to the destination object in - the same bucket. + r"""Moves the source object to the destination object in the same + bucket. This operation moves a source object to a destination + object in the same bucket by renaming the object. The move + itself is an atomic transaction, ensuring all steps either + complete successfully or no changes are made. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.move`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) .. code-block:: python @@ -3724,7 +3897,8 @@ def sample_move_object(): Args: request (Union[google.cloud._storage_v2.types.MoveObjectRequest, dict]): - The request object. Request message for MoveObject. + The request object. Request message for + [MoveObject][google.storage.v2.Storage.MoveObject]. bucket (str): Required. Name of the bucket in which the object resides. diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc.py b/google/cloud/_storage_v2/services/storage/transports/grpc.py index 73f88c164..fae2d7949 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc.py @@ -120,8 +120,8 @@ class StorageGrpcTransport(StorageTransport): The Cloud Storage gRPC API allows applications to read and write data through the abstractions of buckets and objects. For a - description of these abstractions please see - https://cloud.google.com/storage/docs. + description of these abstractions please see `Cloud Storage + documentation `__. Resources are named as follows: @@ -130,17 +130,24 @@ class StorageGrpcTransport(StorageTransport): ``projects/my-string-id``. - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. + ``projects/{project}/buckets/{bucket}``. For globally unique + buckets, ``_`` might be substituted for the project. - Objects are uniquely identified by their name along with the name of the bucket they belong to, as separate strings in this API. For example: - ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + :: + + ``` + ReadObjectRequest { + bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' + } + ``` + + Note that object names can contain ``/`` characters, which are + treated as any other character (no special directory semantics). This class defines the same methods as the primary client, so the primary client can load the underlying transport implementation @@ -355,7 +362,28 @@ def grpc_channel(self) -> grpc.Channel: def delete_bucket(self) -> Callable[[storage.DeleteBucketRequest], empty_pb2.Empty]: r"""Return a callable for the delete bucket method over gRPC. - Permanently deletes an empty bucket. + Permanently deletes an empty bucket. The request fails if there + are any live or noncurrent objects in the bucket, but the + request succeeds if the bucket only contains soft-deleted + objects or incomplete uploads, such as ongoing XML API multipart + uploads. Does not permanently delete soft-deleted objects. + + When this API is used to delete a bucket containing an object + that has a soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. + + Objects and multipart uploads that were in the bucket at the + time of deletion are also retained for the specified retention + duration. When a soft-deleted bucket reaches the end of its + retention duration, it is permanently deleted. The + ``hardDeleteTime`` of the bucket always equals or exceeds the + expiration time of the last soft-deleted object in the bucket. + + **IAM Permissions**: + + Requires ``storage.buckets.delete`` IAM permission on the + bucket. Returns: Callable[[~.DeleteBucketRequest], @@ -381,6 +409,16 @@ def get_bucket(self) -> Callable[[storage.GetBucketRequest], storage.Bucket]: Returns metadata for the specified bucket. + **IAM Permissions**: + + Requires ``storage.buckets.get`` IAM permission on the bucket. + Additionally, to return specific bucket metadata, the + authenticated user must have the following permissions: + + - To return the IAM policies: ``storage.buckets.getIamPolicy`` + - To return the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` + Returns: Callable[[~.GetBucketRequest], ~.Bucket]: @@ -405,6 +443,17 @@ def create_bucket(self) -> Callable[[storage.CreateBucketRequest], storage.Bucke Creates a new bucket. + **IAM Permissions**: + + Requires ``storage.buckets.create`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To enable object retention using the ``enableObjectRetention`` + query parameter: ``storage.buckets.enableObjectRetention`` + - To set the bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + Returns: Callable[[~.CreateBucketRequest], ~.Bucket]: @@ -429,7 +478,18 @@ def list_buckets( ) -> Callable[[storage.ListBucketsRequest], storage.ListBucketsResponse]: r"""Return a callable for the list buckets method over gRPC. - Retrieves a list of buckets for a given project. + Retrieves a list of buckets for a given project, ordered + lexicographically by name. + + **IAM Permissions**: + + Requires ``storage.buckets.list`` IAM permission on the bucket. + Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To list the IAM policies: ``storage.buckets.getIamPolicy`` + - To list the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` Returns: Callable[[~.ListBucketsRequest], @@ -455,7 +515,25 @@ def lock_bucket_retention_policy( ) -> Callable[[storage.LockBucketRetentionPolicyRequest], storage.Bucket]: r"""Return a callable for the lock bucket retention policy method over gRPC. - Locks retention policy on a bucket. + Permanently locks the retention policy that is currently applied + to the specified bucket. + + Caution: Locking a bucket is an irreversible action. Once you + lock a bucket: + + - You cannot remove the retention policy from the bucket. + - You cannot decrease the retention period for the policy. + + Once locked, you must delete the entire bucket in order to + remove the bucket's retention policy. However, before you can + delete the bucket, you must delete all the objects in the + bucket, which is only possible if all the objects have reached + the retention period set by the retention policy. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. Returns: Callable[[~.LockBucketRetentionPolicyRequest], @@ -483,12 +561,18 @@ def get_iam_policy( ) -> Callable[[iam_policy_pb2.GetIamPolicyRequest], policy_pb2.Policy]: r"""Return a callable for the get iam policy method over gRPC. - Gets the IAM policy for a specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + Gets the IAM policy for a specified bucket or managed folder. + The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. + **IAM Permissions**: + + Requires ``storage.buckets.getIamPolicy`` on the bucket or + ``storage.managedFolders.getIamPolicy`` IAM permission on the + managed folder. + Returns: Callable[[~.GetIamPolicyRequest], ~.Policy]: @@ -513,9 +597,9 @@ def set_iam_policy( ) -> Callable[[iam_policy_pb2.SetIamPolicyRequest], policy_pb2.Policy]: r"""Return a callable for the set iam policy method over gRPC. - Updates an IAM policy for the specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + Updates an IAM policy for the specified bucket or managed + folder. The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. @@ -577,8 +661,20 @@ def test_iam_permissions( def update_bucket(self) -> Callable[[storage.UpdateBucketRequest], storage.Bucket]: r"""Return a callable for the update bucket method over gRPC. - Updates a bucket. Equivalent to JSON API's - storage.buckets.patch method. + Updates a bucket. Changes to the bucket are readable immediately + after writing, but configuration changes might take time to + propagate. This method supports ``patch`` semantics. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To set bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + - To update public access prevention policies or access control + lists (ACLs): ``storage.buckets.setIamPolicy`` Returns: Callable[[~.UpdateBucketRequest], @@ -604,8 +700,19 @@ def compose_object( ) -> Callable[[storage.ComposeObjectRequest], storage.Object]: r"""Return a callable for the compose object method over gRPC. - Concatenates a list of existing objects into a new - object in the same bucket. + Concatenates a list of existing objects into a new object in the + same bucket. The existing source objects are unaffected by this + operation. + + **IAM Permissions**: + + Requires the ``storage.objects.create`` and + ``storage.objects.get`` IAM permissions to use this method. If + the new composite object overwrites an existing object, the + authenticated user must also have the ``storage.objects.delete`` + permission. If the request body includes the retention property, + the authenticated user must also have the + ``storage.objects.setRetention`` IAM permission. Returns: Callable[[~.ComposeObjectRequest], @@ -631,15 +738,13 @@ def delete_object(self) -> Callable[[storage.DeleteObjectRequest], empty_pb2.Emp Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation - parameter is used, or if `soft - delete `__ is - not enabled for the bucket. When this API is used to delete an - object from a bucket that has soft delete policy enabled, the - object becomes soft deleted, and the ``softDeleteTime`` and - ``hardDeleteTime`` properties are set on the object. This API - cannot be used to permanently delete soft-deleted objects. - Soft-deleted objects are permanently deleted according to their - ``hardDeleteTime``. + parameter is used, or if soft delete is not enabled for the + bucket. When this API is used to delete an object from a bucket + that has soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. This API cannot be used to + permanently delete soft-deleted objects. Soft-deleted objects + are permanently deleted according to their ``hardDeleteTime``. You can use the [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API @@ -648,9 +753,8 @@ def delete_object(self) -> Callable[[storage.DeleteObjectRequest], empty_pb2.Emp **IAM Permissions**: - Requires ``storage.objects.delete`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.delete`` IAM permission on the + bucket. Returns: Callable[[~.DeleteObjectRequest], @@ -676,7 +780,44 @@ def restore_object( ) -> Callable[[storage.RestoreObjectRequest], storage.Object]: r"""Return a callable for the restore object method over gRPC. - Restores a soft-deleted object. + Restores a soft-deleted object. When a soft-deleted object is + restored, a new copy of that object is created in the same + bucket and inherits the same metadata as the soft-deleted + object. The inherited metadata is the metadata that existed when + the original object became soft deleted, with the following + exceptions: + + - The ``createTime`` of the new object is set to the time at + which the soft-deleted object was restored. + - The ``softDeleteTime`` and ``hardDeleteTime`` values are + cleared. + - A new generation is assigned and the metageneration is reset + to 1. + - If the soft-deleted object was in a bucket that had Autoclass + enabled, the new object is restored to Standard storage. + - The restored object inherits the bucket's default object ACL, + unless ``copySourceAcl`` is ``true``. + + If a live object using the same name already exists in the + bucket and becomes overwritten, the live object becomes a + noncurrent object if Object Versioning is enabled on the bucket. + If Object Versioning is not enabled, the live object becomes + soft deleted. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.restore`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) + - ``storage.objects.getIamPolicy`` (only required if + ``projection`` is ``full`` and the relevant bucket has uniform + bucket-level access disabled) + - ``storage.objects.setIamPolicy`` (only required if + ``copySourceAcl`` is ``true`` and the relevant bucket has + uniform bucket-level access disabled) Returns: Callable[[~.RestoreObjectRequest], @@ -707,11 +848,11 @@ def cancel_resumable_write( Cancels an in-progress resumable upload. Any attempts to write to the resumable upload after - cancelling the upload will fail. + cancelling the upload fail. - The behavior for currently in progress write operations - is not guaranteed - they could either complete before - the cancellation or fail if the cancellation completes + The behavior for any in-progress write operations is not + guaranteed; they could either complete before the + cancellation or fail if the cancellation completes first. Returns: @@ -740,10 +881,9 @@ def get_object(self) -> Callable[[storage.GetObjectRequest], storage.Object]: **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. To return object ACLs, the authenticated user - must also have the ``storage.objects.getIamPolicy`` permission. + Requires ``storage.objects.get`` IAM permission on the bucket. + To return object ACLs, the authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. Returns: Callable[[~.GetObjectRequest], @@ -773,9 +913,7 @@ def read_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.get`` IAM permission on the bucket. Returns: Callable[[~.ReadObjectRequest], @@ -803,25 +941,17 @@ def bidi_read_object( Reads an object's data. - This is a bi-directional API with the added support for reading - multiple ranges within one stream both within and across - multiple messages. If the server encountered an error for any of - the inputs, the stream will be closed with the relevant error - code. Because the API allows for multiple outstanding requests, - when the stream is closed the error response will contain a - BidiReadObjectRangesError proto in the error extension - describing the error for each outstanding read_id. + This bi-directional API reads data from an object, allowing you + to request multiple data ranges within a single stream, even + across several messages. If an error occurs with any request, + the stream closes with a relevant error code. Since you can have + multiple outstanding requests, the error response includes a + ``BidiReadObjectRangesError`` field detailing the specific error + for each pending ``read_id``. **IAM Permissions**: - Requires ``storage.objects.get`` - - `IAM - permission `__ - on the bucket. - - This API is currently in preview and is not yet available for - general use. + Requires ``storage.objects.get`` IAM permission on the bucket. Returns: Callable[[~.BidiReadObjectRequest], @@ -845,8 +975,13 @@ def bidi_read_object( def update_object(self) -> Callable[[storage.UpdateObjectRequest], storage.Object]: r"""Return a callable for the update object method over gRPC. - Updates an object's metadata. - Equivalent to JSON API's storage.objects.patch. + Updates an object's metadata. Equivalent to JSON API's + ``storage.objects.patch`` method. + + **IAM Permissions**: + + Requires ``storage.objects.update`` IAM permission on the + bucket. Returns: Callable[[~.UpdateObjectRequest], @@ -892,32 +1027,32 @@ def write_object( - Check the result Status of the stream, to determine if writing can be resumed on this stream or must be restarted from scratch (by calling ``StartResumableWrite()``). The resumable - errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For - each case, the client should use binary exponential backoff - before retrying. Additionally, writes can be resumed after - RESOURCE_EXHAUSTED errors, but only after taking appropriate - measures, which may include reducing aggregate send rate - across clients and/or requesting a quota increase for your - project. + errors are ``DEADLINE_EXCEEDED``, ``INTERNAL``, and + ``UNAVAILABLE``. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after ``RESOURCE_EXHAUSTED`` errors, but only after + taking appropriate measures, which might include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. - If the call to ``WriteObject`` returns ``ABORTED``, that indicates concurrent attempts to update the resumable write, caused either by multiple racing clients or by a single client where the previous request was timed out on the client side but nonetheless reached the server. In this case the client - should take steps to prevent further concurrent writes (e.g., - increase the timeouts, stop using more than one process to - perform the upload, etc.), and then should follow the steps - below for resuming the upload. + should take steps to prevent further concurrent writes. For + example, increase the timeouts and stop using more than one + process to perform the upload. Follow the steps below for + resuming the upload. - For resumable errors, the client should call ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than the - returned ``persisted_size``; in this case, the service will - skip data at offsets that were already persisted (without + returned ``persisted_size``. This might be less than the + amount of data the client previously sent. Note also that it + is acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + skips data at offsets that were already persisted (without checking that it matches the previously written data), and write only the data starting from the persisted offset. Even - though the data isn't written, it may still incur a + though the data isn't written, it might still incur a performance cost over resuming at the correct write offset. This behavior can make client-side handling simpler in some cases. @@ -925,27 +1060,26 @@ def write_object( message, unless the object is being finished with ``finish_write`` set to ``true``. - The service will not view the object as complete until the + The service does not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` set to ``true``. Sending any requests on a stream after sending - a request with ``finish_write`` set to ``true`` will cause an - error. The client **should** check the response it receives to - determine how much data the service was able to commit and - whether the service views the object as complete. + a request with ``finish_write`` set to ``true`` causes an error. + The client must check the response it receives to determine how + much data the service is able to commit and whether the service + views the object as complete. - Attempting to resume an already finalized object will result in - an OK status, with a ``WriteObjectResponse`` containing the + Attempting to resume an already finalized object results in an + ``OK`` status, with a ``WriteObjectResponse`` containing the finalized object's metadata. - Alternatively, the BidiWriteObject operation may be used to + Alternatively, you can use the ``BidiWriteObject`` operation to write an object with controls over flushing and the ability to fetch the ability to determine the current persisted size. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. Returns: Callable[[~.WriteObjectRequest], @@ -973,20 +1107,20 @@ def bidi_write_object( Stores a new object and metadata. - This is similar to the WriteObject call with the added support - for manual flushing of persisted state, and the ability to - determine current persisted size without closing the stream. - - The client may specify one or both of the ``state_lookup`` and - ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is - specified, the data written so far will be persisted to storage. - If ``state_lookup`` is specified, the service will respond with - a BidiWriteObjectResponse that contains the persisted size. If - both ``flush`` and ``state_lookup`` are specified, the flush - will always occur before a ``state_lookup``, so that both may be - set in the same request and the returned state will be the state - of the object post-flush. When the stream is closed, a - BidiWriteObjectResponse will always be sent to the client, + This is similar to the ``WriteObject`` call with the added + support for manual flushing of persisted state, and the ability + to determine current persisted size without closing the stream. + + The client might specify one or both of the ``state_lookup`` and + ``flush`` fields in each ``BidiWriteObjectRequest``. If + ``flush`` is specified, the data written so far is persisted to + storage. If ``state_lookup`` is specified, the service responds + with a ``BidiWriteObjectResponse`` that contains the persisted + size. If both ``flush`` and ``state_lookup`` are specified, the + flush always occurs before a ``state_lookup``, so that both + might be set in the same request and the returned state is the + state of the object post-flush. When the stream is closed, a + ``BidiWriteObjectResponse`` is always sent to the client, regardless of the value of ``state_lookup``. Returns: @@ -1017,11 +1151,10 @@ def list_objects( **IAM Permissions**: - The authenticated user requires ``storage.objects.list`` `IAM - permission `__ - to use this method. To return object ACLs, the authenticated - user must also have the ``storage.objects.getIamPolicy`` - permission. + The authenticated user requires ``storage.objects.list`` IAM + permission to use this method. To return object ACLs, the + authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. Returns: Callable[[~.ListObjectsRequest], @@ -1077,18 +1210,16 @@ def start_resumable_write( r"""Return a callable for the start resumable write method over gRPC. Starts a resumable write operation. This method is part of the - `Resumable - upload `__ - feature. This allows you to upload large objects in multiple - chunks, which is more resilient to network interruptions than a - single upload. The validity duration of the write operation, and - the consequences of it becoming invalid, are service-dependent. + Resumable upload feature. This allows you to upload large + objects in multiple chunks, which is more resilient to network + interruptions than a single upload. The validity duration of the + write operation, and the consequences of it becoming invalid, + are service-dependent. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. Returns: Callable[[~.StartResumableWriteRequest], @@ -1115,11 +1246,10 @@ def query_write_status( r"""Return a callable for the query write status method over gRPC. Determines the ``persisted_size`` of an object that is being - written. This method is part of the `resumable - upload `__ - feature. The returned value is the size of the object that has - been persisted so far. The value can be used as the - ``write_offset`` for the next ``Write()`` call. + written. This method is part of the resumable upload feature. + The returned value is the size of the object that has been + persisted so far. The value can be used as the ``write_offset`` + for the next ``Write()`` call. If the object does not exist, meaning if it was deleted, or the first ``Write()`` has not yet reached the service, this method @@ -1155,8 +1285,20 @@ def query_write_status( def move_object(self) -> Callable[[storage.MoveObjectRequest], storage.Object]: r"""Return a callable for the move object method over gRPC. - Moves the source object to the destination object in - the same bucket. + Moves the source object to the destination object in the same + bucket. This operation moves a source object to a destination + object in the same bucket by renaming the object. The move + itself is an atomic transaction, ensuring all steps either + complete successfully or no changes are made. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.move`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) Returns: Callable[[~.MoveObjectRequest], diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py index f0c9e5721..be54eb3b0 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py @@ -126,8 +126,8 @@ class StorageGrpcAsyncIOTransport(StorageTransport): The Cloud Storage gRPC API allows applications to read and write data through the abstractions of buckets and objects. For a - description of these abstractions please see - https://cloud.google.com/storage/docs. + description of these abstractions please see `Cloud Storage + documentation `__. Resources are named as follows: @@ -136,17 +136,24 @@ class StorageGrpcAsyncIOTransport(StorageTransport): ``projects/my-string-id``. - Buckets are named using string names of the form: - ``projects/{project}/buckets/{bucket}`` For globally unique - buckets, ``_`` may be substituted for the project. + ``projects/{project}/buckets/{bucket}``. For globally unique + buckets, ``_`` might be substituted for the project. - Objects are uniquely identified by their name along with the name of the bucket they belong to, as separate strings in this API. For example: - ReadObjectRequest { bucket: 'projects/\_/buckets/my-bucket' - object: 'my-object' } Note that object names can contain ``/`` - characters, which are treated as any other character (no special - directory semantics). + :: + + ``` + ReadObjectRequest { + bucket: 'projects/_/buckets/my-bucket' + object: 'my-object' + } + ``` + + Note that object names can contain ``/`` characters, which are + treated as any other character (no special directory semantics). This class defines the same methods as the primary client, so the primary client can load the underlying transport implementation @@ -365,7 +372,28 @@ def delete_bucket( ) -> Callable[[storage.DeleteBucketRequest], Awaitable[empty_pb2.Empty]]: r"""Return a callable for the delete bucket method over gRPC. - Permanently deletes an empty bucket. + Permanently deletes an empty bucket. The request fails if there + are any live or noncurrent objects in the bucket, but the + request succeeds if the bucket only contains soft-deleted + objects or incomplete uploads, such as ongoing XML API multipart + uploads. Does not permanently delete soft-deleted objects. + + When this API is used to delete a bucket containing an object + that has a soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. + + Objects and multipart uploads that were in the bucket at the + time of deletion are also retained for the specified retention + duration. When a soft-deleted bucket reaches the end of its + retention duration, it is permanently deleted. The + ``hardDeleteTime`` of the bucket always equals or exceeds the + expiration time of the last soft-deleted object in the bucket. + + **IAM Permissions**: + + Requires ``storage.buckets.delete`` IAM permission on the + bucket. Returns: Callable[[~.DeleteBucketRequest], @@ -393,6 +421,16 @@ def get_bucket( Returns metadata for the specified bucket. + **IAM Permissions**: + + Requires ``storage.buckets.get`` IAM permission on the bucket. + Additionally, to return specific bucket metadata, the + authenticated user must have the following permissions: + + - To return the IAM policies: ``storage.buckets.getIamPolicy`` + - To return the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` + Returns: Callable[[~.GetBucketRequest], Awaitable[~.Bucket]]: @@ -419,6 +457,17 @@ def create_bucket( Creates a new bucket. + **IAM Permissions**: + + Requires ``storage.buckets.create`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To enable object retention using the ``enableObjectRetention`` + query parameter: ``storage.buckets.enableObjectRetention`` + - To set the bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + Returns: Callable[[~.CreateBucketRequest], Awaitable[~.Bucket]]: @@ -443,7 +492,18 @@ def list_buckets( ) -> Callable[[storage.ListBucketsRequest], Awaitable[storage.ListBucketsResponse]]: r"""Return a callable for the list buckets method over gRPC. - Retrieves a list of buckets for a given project. + Retrieves a list of buckets for a given project, ordered + lexicographically by name. + + **IAM Permissions**: + + Requires ``storage.buckets.list`` IAM permission on the bucket. + Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To list the IAM policies: ``storage.buckets.getIamPolicy`` + - To list the bucket IP filtering rules: + ``storage.buckets.getIpFilter`` Returns: Callable[[~.ListBucketsRequest], @@ -471,7 +531,25 @@ def lock_bucket_retention_policy( ]: r"""Return a callable for the lock bucket retention policy method over gRPC. - Locks retention policy on a bucket. + Permanently locks the retention policy that is currently applied + to the specified bucket. + + Caution: Locking a bucket is an irreversible action. Once you + lock a bucket: + + - You cannot remove the retention policy from the bucket. + - You cannot decrease the retention period for the policy. + + Once locked, you must delete the entire bucket in order to + remove the bucket's retention policy. However, before you can + delete the bucket, you must delete all the objects in the + bucket, which is only possible if all the objects have reached + the retention period set by the retention policy. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. Returns: Callable[[~.LockBucketRetentionPolicyRequest], @@ -499,12 +577,18 @@ def get_iam_policy( ) -> Callable[[iam_policy_pb2.GetIamPolicyRequest], Awaitable[policy_pb2.Policy]]: r"""Return a callable for the get iam policy method over gRPC. - Gets the IAM policy for a specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + Gets the IAM policy for a specified bucket or managed folder. + The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. + **IAM Permissions**: + + Requires ``storage.buckets.getIamPolicy`` on the bucket or + ``storage.managedFolders.getIamPolicy`` IAM permission on the + managed folder. + Returns: Callable[[~.GetIamPolicyRequest], Awaitable[~.Policy]]: @@ -529,9 +613,9 @@ def set_iam_policy( ) -> Callable[[iam_policy_pb2.SetIamPolicyRequest], Awaitable[policy_pb2.Policy]]: r"""Return a callable for the set iam policy method over gRPC. - Updates an IAM policy for the specified bucket. The ``resource`` - field in the request should be ``projects/_/buckets/{bucket}`` - for a bucket, or + Updates an IAM policy for the specified bucket or managed + folder. The ``resource`` field in the request should be + ``projects/_/buckets/{bucket}`` for a bucket, or ``projects/_/buckets/{bucket}/managedFolders/{managedFolder}`` for a managed folder. @@ -595,8 +679,20 @@ def update_bucket( ) -> Callable[[storage.UpdateBucketRequest], Awaitable[storage.Bucket]]: r"""Return a callable for the update bucket method over gRPC. - Updates a bucket. Equivalent to JSON API's - storage.buckets.patch method. + Updates a bucket. Changes to the bucket are readable immediately + after writing, but configuration changes might take time to + propagate. This method supports ``patch`` semantics. + + **IAM Permissions**: + + Requires ``storage.buckets.update`` IAM permission on the + bucket. Additionally, to enable specific bucket features, the + authenticated user must have the following permissions: + + - To set bucket IP filtering rules: + ``storage.buckets.setIpFilter`` + - To update public access prevention policies or access control + lists (ACLs): ``storage.buckets.setIamPolicy`` Returns: Callable[[~.UpdateBucketRequest], @@ -622,8 +718,19 @@ def compose_object( ) -> Callable[[storage.ComposeObjectRequest], Awaitable[storage.Object]]: r"""Return a callable for the compose object method over gRPC. - Concatenates a list of existing objects into a new - object in the same bucket. + Concatenates a list of existing objects into a new object in the + same bucket. The existing source objects are unaffected by this + operation. + + **IAM Permissions**: + + Requires the ``storage.objects.create`` and + ``storage.objects.get`` IAM permissions to use this method. If + the new composite object overwrites an existing object, the + authenticated user must also have the ``storage.objects.delete`` + permission. If the request body includes the retention property, + the authenticated user must also have the + ``storage.objects.setRetention`` IAM permission. Returns: Callable[[~.ComposeObjectRequest], @@ -651,15 +758,13 @@ def delete_object( Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation - parameter is used, or if `soft - delete `__ is - not enabled for the bucket. When this API is used to delete an - object from a bucket that has soft delete policy enabled, the - object becomes soft deleted, and the ``softDeleteTime`` and - ``hardDeleteTime`` properties are set on the object. This API - cannot be used to permanently delete soft-deleted objects. - Soft-deleted objects are permanently deleted according to their - ``hardDeleteTime``. + parameter is used, or if soft delete is not enabled for the + bucket. When this API is used to delete an object from a bucket + that has soft delete policy enabled, the object becomes soft + deleted, and the ``softDeleteTime`` and ``hardDeleteTime`` + properties are set on the object. This API cannot be used to + permanently delete soft-deleted objects. Soft-deleted objects + are permanently deleted according to their ``hardDeleteTime``. You can use the [``RestoreObject``][google.storage.v2.Storage.RestoreObject] API @@ -668,9 +773,8 @@ def delete_object( **IAM Permissions**: - Requires ``storage.objects.delete`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.delete`` IAM permission on the + bucket. Returns: Callable[[~.DeleteObjectRequest], @@ -696,7 +800,44 @@ def restore_object( ) -> Callable[[storage.RestoreObjectRequest], Awaitable[storage.Object]]: r"""Return a callable for the restore object method over gRPC. - Restores a soft-deleted object. + Restores a soft-deleted object. When a soft-deleted object is + restored, a new copy of that object is created in the same + bucket and inherits the same metadata as the soft-deleted + object. The inherited metadata is the metadata that existed when + the original object became soft deleted, with the following + exceptions: + + - The ``createTime`` of the new object is set to the time at + which the soft-deleted object was restored. + - The ``softDeleteTime`` and ``hardDeleteTime`` values are + cleared. + - A new generation is assigned and the metageneration is reset + to 1. + - If the soft-deleted object was in a bucket that had Autoclass + enabled, the new object is restored to Standard storage. + - The restored object inherits the bucket's default object ACL, + unless ``copySourceAcl`` is ``true``. + + If a live object using the same name already exists in the + bucket and becomes overwritten, the live object becomes a + noncurrent object if Object Versioning is enabled on the bucket. + If Object Versioning is not enabled, the live object becomes + soft deleted. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.restore`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) + - ``storage.objects.getIamPolicy`` (only required if + ``projection`` is ``full`` and the relevant bucket has uniform + bucket-level access disabled) + - ``storage.objects.setIamPolicy`` (only required if + ``copySourceAcl`` is ``true`` and the relevant bucket has + uniform bucket-level access disabled) Returns: Callable[[~.RestoreObjectRequest], @@ -728,11 +869,11 @@ def cancel_resumable_write( Cancels an in-progress resumable upload. Any attempts to write to the resumable upload after - cancelling the upload will fail. + cancelling the upload fail. - The behavior for currently in progress write operations - is not guaranteed - they could either complete before - the cancellation or fail if the cancellation completes + The behavior for any in-progress write operations is not + guaranteed; they could either complete before the + cancellation or fail if the cancellation completes first. Returns: @@ -763,10 +904,9 @@ def get_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. To return object ACLs, the authenticated user - must also have the ``storage.objects.getIamPolicy`` permission. + Requires ``storage.objects.get`` IAM permission on the bucket. + To return object ACLs, the authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. Returns: Callable[[~.GetObjectRequest], @@ -796,9 +936,7 @@ def read_object( **IAM Permissions**: - Requires ``storage.objects.get`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.get`` IAM permission on the bucket. Returns: Callable[[~.ReadObjectRequest], @@ -828,25 +966,17 @@ def bidi_read_object( Reads an object's data. - This is a bi-directional API with the added support for reading - multiple ranges within one stream both within and across - multiple messages. If the server encountered an error for any of - the inputs, the stream will be closed with the relevant error - code. Because the API allows for multiple outstanding requests, - when the stream is closed the error response will contain a - BidiReadObjectRangesError proto in the error extension - describing the error for each outstanding read_id. + This bi-directional API reads data from an object, allowing you + to request multiple data ranges within a single stream, even + across several messages. If an error occurs with any request, + the stream closes with a relevant error code. Since you can have + multiple outstanding requests, the error response includes a + ``BidiReadObjectRangesError`` field detailing the specific error + for each pending ``read_id``. **IAM Permissions**: - Requires ``storage.objects.get`` - - `IAM - permission `__ - on the bucket. - - This API is currently in preview and is not yet available for - general use. + Requires ``storage.objects.get`` IAM permission on the bucket. Returns: Callable[[~.BidiReadObjectRequest], @@ -872,8 +1002,13 @@ def update_object( ) -> Callable[[storage.UpdateObjectRequest], Awaitable[storage.Object]]: r"""Return a callable for the update object method over gRPC. - Updates an object's metadata. - Equivalent to JSON API's storage.objects.patch. + Updates an object's metadata. Equivalent to JSON API's + ``storage.objects.patch`` method. + + **IAM Permissions**: + + Requires ``storage.objects.update`` IAM permission on the + bucket. Returns: Callable[[~.UpdateObjectRequest], @@ -919,32 +1054,32 @@ def write_object( - Check the result Status of the stream, to determine if writing can be resumed on this stream or must be restarted from scratch (by calling ``StartResumableWrite()``). The resumable - errors are DEADLINE_EXCEEDED, INTERNAL, and UNAVAILABLE. For - each case, the client should use binary exponential backoff - before retrying. Additionally, writes can be resumed after - RESOURCE_EXHAUSTED errors, but only after taking appropriate - measures, which may include reducing aggregate send rate - across clients and/or requesting a quota increase for your - project. + errors are ``DEADLINE_EXCEEDED``, ``INTERNAL``, and + ``UNAVAILABLE``. For each case, the client should use binary + exponential backoff before retrying. Additionally, writes can + be resumed after ``RESOURCE_EXHAUSTED`` errors, but only after + taking appropriate measures, which might include reducing + aggregate send rate across clients and/or requesting a quota + increase for your project. - If the call to ``WriteObject`` returns ``ABORTED``, that indicates concurrent attempts to update the resumable write, caused either by multiple racing clients or by a single client where the previous request was timed out on the client side but nonetheless reached the server. In this case the client - should take steps to prevent further concurrent writes (e.g., - increase the timeouts, stop using more than one process to - perform the upload, etc.), and then should follow the steps - below for resuming the upload. + should take steps to prevent further concurrent writes. For + example, increase the timeouts and stop using more than one + process to perform the upload. Follow the steps below for + resuming the upload. - For resumable errors, the client should call ``QueryWriteStatus()`` and then continue writing from the - returned ``persisted_size``. This may be less than the amount - of data the client previously sent. Note also that it is - acceptable to send data starting at an offset earlier than the - returned ``persisted_size``; in this case, the service will - skip data at offsets that were already persisted (without + returned ``persisted_size``. This might be less than the + amount of data the client previously sent. Note also that it + is acceptable to send data starting at an offset earlier than + the returned ``persisted_size``; in this case, the service + skips data at offsets that were already persisted (without checking that it matches the previously written data), and write only the data starting from the persisted offset. Even - though the data isn't written, it may still incur a + though the data isn't written, it might still incur a performance cost over resuming at the correct write offset. This behavior can make client-side handling simpler in some cases. @@ -952,27 +1087,26 @@ def write_object( message, unless the object is being finished with ``finish_write`` set to ``true``. - The service will not view the object as complete until the + The service does not view the object as complete until the client has sent a ``WriteObjectRequest`` with ``finish_write`` set to ``true``. Sending any requests on a stream after sending - a request with ``finish_write`` set to ``true`` will cause an - error. The client **should** check the response it receives to - determine how much data the service was able to commit and - whether the service views the object as complete. + a request with ``finish_write`` set to ``true`` causes an error. + The client must check the response it receives to determine how + much data the service is able to commit and whether the service + views the object as complete. - Attempting to resume an already finalized object will result in - an OK status, with a ``WriteObjectResponse`` containing the + Attempting to resume an already finalized object results in an + ``OK`` status, with a ``WriteObjectResponse`` containing the finalized object's metadata. - Alternatively, the BidiWriteObject operation may be used to + Alternatively, you can use the ``BidiWriteObject`` operation to write an object with controls over flushing and the ability to fetch the ability to determine the current persisted size. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. Returns: Callable[[~.WriteObjectRequest], @@ -1002,20 +1136,20 @@ def bidi_write_object( Stores a new object and metadata. - This is similar to the WriteObject call with the added support - for manual flushing of persisted state, and the ability to - determine current persisted size without closing the stream. - - The client may specify one or both of the ``state_lookup`` and - ``flush`` fields in each BidiWriteObjectRequest. If ``flush`` is - specified, the data written so far will be persisted to storage. - If ``state_lookup`` is specified, the service will respond with - a BidiWriteObjectResponse that contains the persisted size. If - both ``flush`` and ``state_lookup`` are specified, the flush - will always occur before a ``state_lookup``, so that both may be - set in the same request and the returned state will be the state - of the object post-flush. When the stream is closed, a - BidiWriteObjectResponse will always be sent to the client, + This is similar to the ``WriteObject`` call with the added + support for manual flushing of persisted state, and the ability + to determine current persisted size without closing the stream. + + The client might specify one or both of the ``state_lookup`` and + ``flush`` fields in each ``BidiWriteObjectRequest``. If + ``flush`` is specified, the data written so far is persisted to + storage. If ``state_lookup`` is specified, the service responds + with a ``BidiWriteObjectResponse`` that contains the persisted + size. If both ``flush`` and ``state_lookup`` are specified, the + flush always occurs before a ``state_lookup``, so that both + might be set in the same request and the returned state is the + state of the object post-flush. When the stream is closed, a + ``BidiWriteObjectResponse`` is always sent to the client, regardless of the value of ``state_lookup``. Returns: @@ -1046,11 +1180,10 @@ def list_objects( **IAM Permissions**: - The authenticated user requires ``storage.objects.list`` `IAM - permission `__ - to use this method. To return object ACLs, the authenticated - user must also have the ``storage.objects.getIamPolicy`` - permission. + The authenticated user requires ``storage.objects.list`` IAM + permission to use this method. To return object ACLs, the + authenticated user must also have the + ``storage.objects.getIamPolicy`` permission. Returns: Callable[[~.ListObjectsRequest], @@ -1107,18 +1240,16 @@ def start_resumable_write( r"""Return a callable for the start resumable write method over gRPC. Starts a resumable write operation. This method is part of the - `Resumable - upload `__ - feature. This allows you to upload large objects in multiple - chunks, which is more resilient to network interruptions than a - single upload. The validity duration of the write operation, and - the consequences of it becoming invalid, are service-dependent. + Resumable upload feature. This allows you to upload large + objects in multiple chunks, which is more resilient to network + interruptions than a single upload. The validity duration of the + write operation, and the consequences of it becoming invalid, + are service-dependent. **IAM Permissions**: - Requires ``storage.objects.create`` `IAM - permission `__ - on the bucket. + Requires ``storage.objects.create`` IAM permission on the + bucket. Returns: Callable[[~.StartResumableWriteRequest], @@ -1147,11 +1278,10 @@ def query_write_status( r"""Return a callable for the query write status method over gRPC. Determines the ``persisted_size`` of an object that is being - written. This method is part of the `resumable - upload `__ - feature. The returned value is the size of the object that has - been persisted so far. The value can be used as the - ``write_offset`` for the next ``Write()`` call. + written. This method is part of the resumable upload feature. + The returned value is the size of the object that has been + persisted so far. The value can be used as the ``write_offset`` + for the next ``Write()`` call. If the object does not exist, meaning if it was deleted, or the first ``Write()`` has not yet reached the service, this method @@ -1189,8 +1319,20 @@ def move_object( ) -> Callable[[storage.MoveObjectRequest], Awaitable[storage.Object]]: r"""Return a callable for the move object method over gRPC. - Moves the source object to the destination object in - the same bucket. + Moves the source object to the destination object in the same + bucket. This operation moves a source object to a destination + object in the same bucket by renaming the object. The move + itself is an atomic transaction, ensuring all steps either + complete successfully or no changes are made. + + **IAM Permissions**: + + Requires the following IAM permissions to use this method: + + - ``storage.objects.move`` + - ``storage.objects.create`` + - ``storage.objects.delete`` (only required if overwriting an + existing object) Returns: Callable[[~.MoveObjectRequest], diff --git a/google/cloud/_storage_v2/types/storage.py b/google/cloud/_storage_v2/types/storage.py index 6e4e01855..8602610be 100644 --- a/google/cloud/_storage_v2/types/storage.py +++ b/google/cloud/_storage_v2/types/storage.py @@ -90,7 +90,9 @@ class DeleteBucketRequest(proto.Message): - r"""Request message for DeleteBucket. + r"""Request message for + [DeleteBucket][google.storage.v2.Storage.DeleteBucket]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -126,7 +128,9 @@ class DeleteBucketRequest(proto.Message): class GetBucketRequest(proto.Message): - r"""Request message for GetBucket. + r"""Request message for + [GetBucket][google.storage.v2.Storage.GetBucket]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -134,21 +138,20 @@ class GetBucketRequest(proto.Message): name (str): Required. Name of a bucket. if_metageneration_match (int): - If set, and if the bucket's current - metageneration does not match the specified - value, the request will return an error. + If set, only gets the bucket metadata if its + metageneration matches this value. This field is a member of `oneof`_ ``_if_metageneration_match``. if_metageneration_not_match (int): If set, and if the bucket's current metageneration matches the specified value, the - request will return an error. + request returns an error. This field is a member of `oneof`_ ``_if_metageneration_not_match``. read_mask (google.protobuf.field_mask_pb2.FieldMask): - Mask specifying which fields to read. A "\*" field may be - used to indicate all fields. If no mask is specified, will - default to all fields. + Mask specifying which fields to read. A ``*`` field might be + used to indicate all fields. If no mask is specified, it + defaults to all fields. This field is a member of `oneof`_ ``_read_mask``. """ @@ -176,40 +179,39 @@ class GetBucketRequest(proto.Message): class CreateBucketRequest(proto.Message): - r"""Request message for CreateBucket. + r"""Request message for + [CreateBucket][google.storage.v2.Storage.CreateBucket]. Attributes: parent (str): - Required. The project to which this bucket will belong. This + Required. The project to which this bucket belongs. This field must either be empty or ``projects/_``. The project ID that owns this bucket should be specified in the ``bucket.project`` field. bucket (google.cloud._storage_v2.types.Bucket): Optional. Properties of the new bucket being inserted. The name of the bucket is specified in the ``bucket_id`` field. - Populating ``bucket.name`` field will result in an error. - The project of the bucket must be specified in the + Populating ``bucket.name`` field results in an error. The + project of the bucket must be specified in the ``bucket.project`` field. This field must be in ``projects/{projectIdentifier}`` format, {projectIdentifier} can be the project ID or project number. The ``parent`` field must be either empty or ``projects/_``. bucket_id (str): - Required. The ID to use for this bucket, which will become - the final component of the bucket's resource name. For - example, the value ``foo`` might result in a bucket with the - name ``projects/123456/buckets/foo``. + Required. The ID to use for this bucket, which becomes the + final component of the bucket's resource name. For example, + the value ``foo`` might result in a bucket with the name + ``projects/123456/buckets/foo``. predefined_acl (str): - Optional. Apply a predefined set of access - controls to this bucket. Valid values are - "authenticatedRead", "private", - "projectPrivate", "publicRead", or - "publicReadWrite". + Optional. Apply a predefined set of access controls to this + bucket. Valid values are ``authenticatedRead``, ``private``, + ``projectPrivate``, ``publicRead``, or ``publicReadWrite``. predefined_default_object_acl (str): - Optional. Apply a predefined set of default - object access controls to this bucket. Valid - values are "authenticatedRead", - "bucketOwnerFullControl", "bucketOwnerRead", - "private", "projectPrivate", or "publicRead". + Optional. Apply a predefined set of default object access + controls to this bucket. Valid values are + ``authenticatedRead``, ``bucketOwnerFullControl``, + ``bucketOwnerRead``, ``private``, ``projectPrivate``, or + ``publicRead``. enable_object_retention (bool): Optional. If true, enable object retention on the bucket. @@ -243,7 +245,9 @@ class CreateBucketRequest(proto.Message): class ListBucketsRequest(proto.Message): - r"""Request message for ListBuckets. + r"""Request message for + [ListBuckets][google.storage.v2.Storage.ListBuckets]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -253,10 +257,10 @@ class ListBucketsRequest(proto.Message): listing. page_size (int): Optional. Maximum number of buckets to return in a single - response. The service will use this parameter or 1,000 - items, whichever is smaller. If "acl" is present in the - read_mask, the service will use this parameter of 200 items, - whichever is smaller. + response. The service uses this parameter or ``1,000`` + items, whichever is smaller. If ``acl`` is present in the + ``read_mask``, the service uses this parameter of ``200`` + items, whichever is smaller. page_token (str): Optional. A previously-returned page token representing part of the larger set of results @@ -266,12 +270,15 @@ class ListBucketsRequest(proto.Message): names begin with this prefix. read_mask (google.protobuf.field_mask_pb2.FieldMask): Mask specifying which fields to read from each result. If no - mask is specified, will default to all fields except - items.owner, items.acl, and items.default_object_acl. - - - may be used to mean "all fields". + mask is specified, it defaults to all fields except + ``items. owner``, ``items.acl``, and + ``items.default_object_acl``. ``*`` might be used to mean + "all fields". This field is a member of `oneof`_ ``_read_mask``. + return_partial_success (bool): + Optional. Allows listing of buckets, even if + there are buckets that are unreachable. """ parent: str = proto.Field( @@ -296,10 +303,15 @@ class ListBucketsRequest(proto.Message): optional=True, message=field_mask_pb2.FieldMask, ) + return_partial_success: bool = proto.Field( + proto.BOOL, + number=9, + ) class ListBucketsResponse(proto.Message): - r"""The result of a call to Buckets.ListBuckets + r"""Response message for + [ListBuckets][google.storage.v2.Storage.ListBuckets]. Attributes: buckets (MutableSequence[google.cloud._storage_v2.types.Bucket]): @@ -309,6 +321,13 @@ class ListBucketsResponse(proto.Message): large result sets. Provide this value in a subsequent request to return the next page of results. + unreachable (MutableSequence[str]): + Unreachable resources. This field can only be present if the + caller specified return_partial_success to be true in the + request to receive indications of temporarily missing + resources. unreachable might be: unreachable = [ + "projects/*/buckets/bucket1", "projects/*/buckets/bucket2", + "projects/\_/buckets/bucket3", ] """ @property @@ -324,10 +343,15 @@ def raw_page(self): proto.STRING, number=2, ) + unreachable: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=3, + ) class LockBucketRetentionPolicyRequest(proto.Message): - r"""Request message for LockBucketRetentionPolicyRequest. + r"""Request message for + [LockBucketRetentionPolicy][google.storage.v2.Storage.LockBucketRetentionPolicy]. Attributes: bucket (str): @@ -349,43 +373,43 @@ class LockBucketRetentionPolicyRequest(proto.Message): class UpdateBucketRequest(proto.Message): - r"""Request for UpdateBucket method. + r"""Request for [UpdateBucket][google.storage.v2.Storage.UpdateBucket] + method. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: bucket (google.cloud._storage_v2.types.Bucket): Required. The bucket to update. The bucket's ``name`` field - will be used to identify the bucket. + is used to identify the bucket. if_metageneration_match (int): - If set, will only modify the bucket if its - metageneration matches this value. + If set, the request modifies the bucket if + its metageneration matches this value. This field is a member of `oneof`_ ``_if_metageneration_match``. if_metageneration_not_match (int): - If set, will only modify the bucket if its - metageneration does not match this value. + If set, the request modifies the bucket if + its metageneration doesn't match this value. This field is a member of `oneof`_ ``_if_metageneration_not_match``. predefined_acl (str): - Optional. Apply a predefined set of access - controls to this bucket. Valid values are - "authenticatedRead", "private", - "projectPrivate", "publicRead", or - "publicReadWrite". + Optional. Apply a predefined set of access controls to this + bucket. Valid values are ``authenticatedRead``, ``private``, + ``projectPrivate``, ``publicRead``, or ``publicReadWrite``. predefined_default_object_acl (str): - Optional. Apply a predefined set of default - object access controls to this bucket. Valid - values are "authenticatedRead", - "bucketOwnerFullControl", "bucketOwnerRead", - "private", "projectPrivate", or "publicRead". + Optional. Apply a predefined set of default object access + controls to this bucket. Valid values are + ``authenticatedRead``, ``bucketOwnerFullControl``, + ``bucketOwnerRead``, ``private``, ``projectPrivate``, or + ``publicRead``. update_mask (google.protobuf.field_mask_pb2.FieldMask): Required. List of fields to be updated. To specify ALL fields, equivalent to the JSON API's "update" function, specify a single field with the value ``*``. Note: not recommended. If a new field is introduced at a later - time, an older client updating with the ``*`` may + time, an older client updating with the ``*`` might accidentally reset the new field's value. Not specifying any fields is an error. @@ -422,7 +446,9 @@ class UpdateBucketRequest(proto.Message): class ComposeObjectRequest(proto.Message): - r"""Request message for ComposeObject. + r"""Request message for + [ComposeObject][google.storage.v2.Storage.ComposeObject]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -430,14 +456,13 @@ class ComposeObjectRequest(proto.Message): destination (google.cloud._storage_v2.types.Object): Required. Properties of the resulting object. source_objects (MutableSequence[google.cloud._storage_v2.types.ComposeObjectRequest.SourceObject]): - Optional. The list of source objects that - will be concatenated into a single object. + Optional. The list of source objects that is + concatenated into a single object. destination_predefined_acl (str): - Optional. Apply a predefined set of access - controls to the destination object. Valid values - are "authenticatedRead", - "bucketOwnerFullControl", "bucketOwnerRead", - "private", "projectPrivate", or "publicRead". + Optional. Apply a predefined set of access controls to the + destination object. Valid values are ``authenticatedRead``, + ``bucketOwnerFullControl``, ``bucketOwnerRead``, + ``private``, ``projectPrivate``, or ``publicRead``. if_generation_match (int): Makes the operation conditional on whether the object's current generation matches the @@ -455,15 +480,15 @@ class ComposeObjectRequest(proto.Message): kms_key (str): Optional. Resource name of the Cloud KMS key, of the form ``projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key``, - that will be used to encrypt the object. Overrides the - object metadata's ``kms_key_name`` value, if any. + that is used to encrypt the object. Overrides the object + metadata's ``kms_key_name`` value, if any. common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to Storage API requests concerning an object. object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. The checksums of the complete - object. This will be validated against the - combined checksums of the component objects. + object. This is validated against the combined + checksums of the component objects. """ class SourceObject(proto.Message): @@ -492,7 +517,7 @@ class ObjectPreconditions(proto.Message): generation of the source object that would be used matches this value. If this value and a generation are both specified, they must be the - same value or the call will fail. + same value or the call fails. This field is a member of `oneof`_ ``_if_generation_match``. """ @@ -558,9 +583,7 @@ class ObjectPreconditions(proto.Message): class DeleteObjectRequest(proto.Message): - r"""Message for deleting an object. ``bucket`` and ``object`` **must** - be set. - + r"""Request message for deleting an object. .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -650,8 +673,9 @@ class DeleteObjectRequest(proto.Message): class RestoreObjectRequest(proto.Message): - r"""Message for restoring an object. ``bucket``, ``object``, and - ``generation`` **must** be set. + r"""Request message for + [RestoreObject][google.storage.v2.Storage.RestoreObject]. + ``bucket``, ``object``, and ``generation`` **must** be set. .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -704,9 +728,9 @@ class RestoreObjectRequest(proto.Message): This field is a member of `oneof`_ ``_if_metageneration_not_match``. copy_source_acl (bool): If false or unset, the bucket's default - object ACL will be used. If true, copy the - source object's access controls. Return an error - if bucket has UBLA enabled. + object ACL is used. If true, copy the source + object's access controls. Return an error if + bucket has UBLA enabled. This field is a member of `oneof`_ ``_copy_source_acl``. common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): @@ -763,8 +787,8 @@ class RestoreObjectRequest(proto.Message): class CancelResumableWriteRequest(proto.Message): - r"""Message for canceling an in-progress resumable upload. ``upload_id`` - **must** be set. + r"""Request message for + [CancelResumableWrite][google.storage.v2.Storage.CancelResumableWrite]. Attributes: upload_id (str): @@ -781,13 +805,15 @@ class CancelResumableWriteRequest(proto.Message): class CancelResumableWriteResponse(proto.Message): r"""Empty response message for canceling an in-progress resumable - upload, will be extended as needed. + upload, is extended as needed. """ class ReadObjectRequest(proto.Message): - r"""Request message for ReadObject. + r"""Request message for + [ReadObject][google.storage.v2.Storage.ReadObject]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -805,18 +831,19 @@ class ReadObjectRequest(proto.Message): Optional. The offset for the first byte to return in the read, relative to the start of the object. - A negative ``read_offset`` value will be interpreted as the + A negative ``read_offset`` value is interpreted as the number of bytes back from the end of the object to be - returned. For example, if an object's length is 15 bytes, a - ReadObjectRequest with ``read_offset`` = -5 and - ``read_limit`` = 3 would return bytes 10 through 12 of the - object. Requesting a negative offset with magnitude larger - than the size of the object will return the entire object. + returned. For example, if an object's length is ``15`` + bytes, a ``ReadObjectRequest`` with ``read_offset`` = ``-5`` + and ``read_limit`` = ``3`` would return bytes ``10`` through + ``12`` of the object. Requesting a negative offset with + magnitude larger than the size of the object returns the + entire object. read_limit (int): Optional. The maximum number of ``data`` bytes the server is allowed to return in the sum of all ``Object`` messages. A ``read_limit`` of zero indicates that there is no limit, and - a negative ``read_limit`` will cause an error. + a negative ``read_limit`` causes an error. If the stream returns fewer bytes than allowed by the ``read_limit`` and no error occurred, the stream includes @@ -855,12 +882,11 @@ class ReadObjectRequest(proto.Message): Optional. A set of parameters common to Storage API requests concerning an object. read_mask (google.protobuf.field_mask_pb2.FieldMask): - Mask specifying which fields to read. The checksummed_data - field and its children will always be present. If no mask is - specified, will default to all fields except metadata.owner - and metadata.acl. - - - may be used to mean "all fields". + Mask specifying which fields to read. The + ``checksummed_data`` field and its children are always + present. If no mask is specified, it defaults to all fields + except ``metadata. owner`` and ``metadata.acl``. ``*`` might + be used to mean "all fields". This field is a member of `oneof`_ ``_read_mask``. """ @@ -919,7 +945,9 @@ class ReadObjectRequest(proto.Message): class GetObjectRequest(proto.Message): - r"""Request message for GetObject. + r"""Request message for + [GetObject][google.storage.v2.Storage.GetObject]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -972,19 +1000,19 @@ class GetObjectRequest(proto.Message): Storage API requests concerning an object. read_mask (google.protobuf.field_mask_pb2.FieldMask): Mask specifying which fields to read. If no mask is - specified, will default to all fields except metadata.acl - and metadata.owner. - - - may be used to mean "all fields". + specified, it defaults to all fields except + ``metadata. acl`` and ``metadata.owner``. ``*`` might be + used to mean "all fields". This field is a member of `oneof`_ ``_read_mask``. restore_token (str): Optional. Restore token used to differentiate soft-deleted objects with the same name and generation. Only applicable - for hierarchical namespace buckets and if soft_deleted is - set to true. This parameter is optional, and is only + for hierarchical namespace buckets and if ``soft_deleted`` + is set to ``true``. This parameter is optional, and is only required in the rare case when there are multiple - soft-deleted objects with the same name and generation. + soft-deleted objects with the same ``name`` and + ``generation``. """ bucket: str = proto.Field( @@ -1042,11 +1070,12 @@ class GetObjectRequest(proto.Message): class ReadObjectResponse(proto.Message): - r"""Response message for ReadObject. + r"""Response message for + [ReadObject][google.storage.v2.Storage.ReadObject]. Attributes: checksummed_data (google.cloud._storage_v2.types.ChecksummedData): - A portion of the data for the object. The service **may** + A portion of the data for the object. The service might leave ``data`` empty for any given ``ReadResponse``. This enables the service to inform the client that the request is still live while it is running an operation to generate more @@ -1058,9 +1087,9 @@ class ReadObjectResponse(proto.Message): downloaded object and compare it against the value provided here. content_range (google.cloud._storage_v2.types.ContentRange): - If read_offset and or read_limit was specified on the - ReadObjectRequest, ContentRange will be populated on the - first ReadObjectResponse message of the read stream. + If ``read_offset`` and or ``read_limit`` is specified on the + ``ReadObjectRequest``, ``ContentRange`` is populated on the + first ``ReadObjectResponse`` message of the read stream. metadata (google.cloud._storage_v2.types.Object): Metadata of the object whose media is being returned. Only populated in the first response @@ -1137,15 +1166,13 @@ class BidiReadObjectSpec(proto.Message): Optional. A set of parameters common to Storage API requests concerning an object. read_mask (google.protobuf.field_mask_pb2.FieldMask): - Mask specifying which fields to read. The checksummed_data - field and its children will always be present. If no mask is - specified, will default to all fields except metadata.owner - and metadata.acl. - - - may be used to mean "all fields". As per - https://google.aip.dev/161, this field is deprecated. As - an alternative, grpc metadata can be used: - https://cloud.google.com/apis/docs/system-parameters#definitions + Mask specifying which fields to read. The + ``checksummed_data`` field and its children are always + present. If no mask is specified, it defaults to all fields + except ``metadata. owner`` and ``metadata.acl``. ``*`` might + be used to mean "all fields". As per + https://google.aip.dev/161, this field is deprecated. As an + alternative, ``grpc metadata`` can be used: This field is a member of `oneof`_ ``_read_mask``. read_handle (google.cloud._storage_v2.types.BidiReadHandle): @@ -1220,24 +1247,23 @@ class BidiReadObjectSpec(proto.Message): class BidiReadObjectRequest(proto.Message): - r"""Request message for BidiReadObject. + r"""Request message for + [BidiReadObject][google.storage.v2.Storage.BidiReadObject]. Attributes: read_object_spec (google.cloud._storage_v2.types.BidiReadObjectSpec): Optional. The first message of each stream should set this field. If this is not the first - message, an error will be returned. Describes - the object to read. + message, an error is returned. Describes the + object to read. read_ranges (MutableSequence[google.cloud._storage_v2.types.ReadRange]): - Optional. Provides a list of 0 or more (up to - 100) ranges to read. If a single range is large - enough to require multiple responses, they are - guaranteed to be delivered in increasing offset - order. There are no ordering guarantees across - ranges. When no ranges are provided, the - response message will not include - ObjectRangeData. For full object downloads, the - offset and size can be set to 0. + Optional. Provides a list of 0 or more (up to 100) ranges to + read. If a single range is large enough to require multiple + responses, they are delivered in increasing offset order. + There are no ordering guarantees across ranges. When no + ranges are provided, the response message doesn't include + ``ObjectRangeData``. For full object downloads, the offset + and size can be set to ``0``. """ read_object_spec: "BidiReadObjectSpec" = proto.Field( @@ -1253,29 +1279,29 @@ class BidiReadObjectRequest(proto.Message): class BidiReadObjectResponse(proto.Message): - r"""Response message for BidiReadObject. + r"""Response message for + [BidiReadObject][google.storage.v2.Storage.BidiReadObject]. Attributes: object_data_ranges (MutableSequence[google.cloud._storage_v2.types.ObjectRangeData]): - A portion of the object's data. The service **may** leave - data empty for any given ReadResponse. This enables the + A portion of the object's data. The service might leave data + empty for any given ``ReadResponse``. This enables the service to inform the client that the request is still live while it is running an operation to generate more data. The - service **may** pipeline multiple responses belonging to - different read requests. Each ObjectRangeData entry will - have a read_id set to the same value as the corresponding - source read request. + service might pipeline multiple responses belonging to + different read requests. Each ``ObjectRangeData`` entry has + a ``read_id`` that is set to the same value as the + corresponding source read request. metadata (google.cloud._storage_v2.types.Object): Metadata of the object whose media is being returned. Only populated in the first response in the stream and not populated when the stream is opened with a read handle. read_handle (google.cloud._storage_v2.types.BidiReadHandle): - This field will be periodically refreshed, - however it may not be set in every response. It - allows the client to more efficiently open - subsequent bidirectional streams to the same - object. + This field is periodically refreshed, however + it might not be set in every response. It allows + the client to more efficiently open subsequent + bidirectional streams to the same object. """ object_data_ranges: MutableSequence["ObjectRangeData"] = proto.RepeatedField( @@ -1297,7 +1323,7 @@ class BidiReadObjectResponse(proto.Message): class BidiReadObjectRedirectedError(proto.Message): r"""Error proto containing details for a redirected read. This - error may be attached as details for an ABORTED response to + error might be attached as details for an ABORTED response to BidiReadObject. @@ -1306,7 +1332,7 @@ class BidiReadObjectRedirectedError(proto.Message): Attributes: read_handle (google.cloud._storage_v2.types.BidiReadHandle): The read handle for the redirected read. If - set, the client may use this in the + set, the client might use this in the BidiReadObjectSpec when retrying the read stream. routing_token (str): @@ -1332,7 +1358,7 @@ class BidiReadObjectRedirectedError(proto.Message): class BidiWriteObjectRedirectedError(proto.Message): r"""Error proto containing details for a redirected write. This - error may be attached as details for an ABORTED response to + error might be attached as details for an ABORTED response to BidiWriteObject. @@ -1349,14 +1375,14 @@ class BidiWriteObjectRedirectedError(proto.Message): write_handle (google.cloud._storage_v2.types.BidiWriteHandle): Opaque value describing a previous write. If set, the client must use this in an AppendObjectSpec first_message when - retrying the write stream. If not set, clients may retry the - original request. + retrying the write stream. If not set, clients might retry + the original request. This field is a member of `oneof`_ ``_write_handle``. generation (int): The generation of the object that triggered the redirect. - This will be set iff write_handle is set. If set, the client - must use this in an AppendObjectSpec first_message when + This is set iff ``write_handle`` is set. If set, the client + must use this in an ``AppendObjectSpec`` first_message when retrying the write stream. This field is a member of `oneof`_ ``_generation``. @@ -1420,7 +1446,7 @@ class ReadRangeError(proto.Message): class ReadRange(proto.Message): - r"""Describes a range of bytes to read in a BidiReadObjectRanges + r"""Describes a range of bytes to read in a ``BidiReadObjectRanges`` request. Attributes: @@ -1428,30 +1454,31 @@ class ReadRange(proto.Message): Required. The offset for the first byte to return in the read, relative to the start of the object. - A negative read_offset value will be interpreted as the - number of bytes back from the end of the object to be - returned. For example, if an object's length is 15 bytes, a - ReadObjectRequest with read_offset = -5 and read_length = 3 - would return bytes 10 through 12 of the object. Requesting a - negative offset with magnitude larger than the size of the - object will return the entire object. A read_offset larger - than the size of the object will result in an OutOfRange - error. + A negative read_offset value is interpreted as the number of + bytes back from the end of the object to be returned. For + example, if an object's length is 15 bytes, a + ``ReadObjectRequest`` with ``read_offset`` = -5 and + ``read_length`` = 3 would return bytes 10 through 12 of the + object. Requesting a negative offset with magnitude larger + than the size of the object returns the entire object. A + ``read_offset`` larger than the size of the object results + in an ``OutOfRange`` error. read_length (int): Optional. The maximum number of data bytes the server is allowed to return across all response messages with the same - read_id. A read_length of zero indicates to read until the - resource end, and a negative read_length will cause an - error. If the stream returns fewer bytes than allowed by the - read_length and no error occurred, the stream includes all - data from the read_offset to the resource end. + ``read_id``. A ``read_length`` of zero indicates to read + until the resource end, and a negative ``read_length`` + causes an error. If the stream returns fewer bytes than + allowed by the ``read_length`` and no error occurred, the + stream includes all data from the ``read_offset`` to the + resource end. read_id (int): Required. Read identifier provided by the client. When the - client issues more than one outstanding ReadRange on the + client issues more than one outstanding ``ReadRange`` on the same stream, responses can be mapped back to their corresponding requests using this value. Clients must ensure that all outstanding requests have different read_id values. - The server may close the stream with an error if this + The server might close the stream with an error if this condition is not met. """ @@ -1476,12 +1503,12 @@ class ObjectRangeData(proto.Message): checksummed_data (google.cloud._storage_v2.types.ChecksummedData): A portion of the data for the object. read_range (google.cloud._storage_v2.types.ReadRange): - The ReadRange describes the content being returned with - read_id set to the corresponding ReadObjectRequest in the - stream. Multiple ObjectRangeData messages may have the same - read_id but increasing offsets. ReadObjectResponse messages - with the same read_id are guaranteed to be delivered in - increasing offset order. + The ``ReadRange`` describes the content being returned with + ``read_id`` set to the corresponding ``ReadObjectRequest`` + in the stream. Multiple ``ObjectRangeData`` messages might + have the same read_id but increasing offsets. + ``ReadObjectResponse`` messages with the same ``read_id`` + are guaranteed to be delivered in increasing offset order. range_end (bool): If set, indicates there are no more bytes to read for the given ReadRange. @@ -1504,9 +1531,9 @@ class ObjectRangeData(proto.Message): class BidiReadHandle(proto.Message): - r"""BidiReadHandle contains a handle from a previous - BiDiReadObject invocation. The client can use this instead of - BidiReadObjectSpec as an optimized way of opening subsequent + r"""``BidiReadHandle`` contains a handle from a previous + ``BiDiReadObject`` invocation. The client can use this instead of + ``BidiReadObjectSpec`` as an optimized way of opening subsequent bidirectional streams to the same object. Attributes: @@ -1522,10 +1549,10 @@ class BidiReadHandle(proto.Message): class BidiWriteHandle(proto.Message): - r"""BidiWriteHandle contains a handle from a previous - BidiWriteObject invocation. The client can use this as an - optimized way of opening subsequent bidirectional streams to the - same object. + r"""``BidiWriteHandle`` contains a handle from a previous + ``BidiWriteObject`` invocation. The client can use this instead of + ``BidiReadObjectSpec`` as an optimized way of opening subsequent + bidirectional streams to the same object. Attributes: handle (bytes): @@ -1551,26 +1578,23 @@ class WriteObjectSpec(proto.Message): Required. Destination object, including its name and its metadata. predefined_acl (str): - Optional. Apply a predefined set of access - controls to this object. Valid values are - "authenticatedRead", "bucketOwnerFullControl", - "bucketOwnerRead", "private", "projectPrivate", - or "publicRead". + Optional. Apply a predefined set of access controls to this + object. Valid values are ``authenticatedRead``, + ``bucketOwnerFullControl``, ``bucketOwnerRead``, + ``private``, ``projectPrivate``, or ``publicRead``. if_generation_match (int): - Makes the operation conditional on whether - the object's current generation matches the - given value. Setting to 0 makes the operation - succeed only if there are no live versions of - the object. + Makes the operation conditional on whether the object's + current generation matches the given value. Setting to ``0`` + makes the operation succeed only if there are no live + versions of the object. This field is a member of `oneof`_ ``_if_generation_match``. if_generation_not_match (int): - Makes the operation conditional on whether - the object's live generation does not match the - given value. If no live object exists, the - precondition fails. Setting to 0 makes the - operation succeed only if there is a live - version of the object. + Makes the operation conditional on whether the object's live + generation does not match the given value. If no live object + exists, the precondition fails. Setting to ``0`` makes the + operation succeed only if there is a live version of the + object. This field is a member of `oneof`_ ``_if_generation_not_match``. if_metageneration_match (int): @@ -1588,7 +1612,7 @@ class WriteObjectSpec(proto.Message): object_size (int): The expected final object size being uploaded. If this value is set, closing the stream after writing fewer or more than - ``object_size`` bytes will result in an OUT_OF_RANGE error. + ``object_size`` bytes results in an ``OUT_OF_RANGE`` error. This situation is considered a client error, and if such an error occurs you must start the upload over from scratch, @@ -1596,9 +1620,8 @@ class WriteObjectSpec(proto.Message): This field is a member of `oneof`_ ``_object_size``. appendable (bool): - If true, the object will be created in - appendable mode. This field may only be set when - using BidiWriteObject. + If ``true``, the object is created in appendable mode. This + field might only be set when using ``BidiWriteObject``. This field is a member of `oneof`_ ``_appendable``. """ @@ -1645,7 +1668,8 @@ class WriteObjectSpec(proto.Message): class WriteObjectRequest(proto.Message): - r"""Request message for WriteObject. + r"""Request message for + [WriteObject][google.storage.v2.Storage.WriteObject]. This message has `oneof`_ fields (mutually exclusive fields). For each oneof, at most one member field can be set at the same time. @@ -1680,28 +1704,28 @@ class WriteObjectRequest(proto.Message): the sum of the first ``write_offset`` and the sizes of all ``data`` chunks sent previously on this stream. - An incorrect value will cause an error. + An incorrect value causes an error. checksummed_data (google.cloud._storage_v2.types.ChecksummedData): The data to insert. If a crc32c checksum is provided that doesn't match the checksum - computed by the service, the request will fail. + computed by the service, the request fails. This field is a member of `oneof`_ ``data``. object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. Checksums for the complete object. If the checksums computed by the service don't match the specified - checksums the call will fail. May only be provided in the - first or last request (either with first_message, or - finish_write set). + checksums the call fails. This field might only be provided + in the first or last request (either with ``first_message``, + or ``finish_write`` set). finish_write (bool): Optional. If ``true``, this indicates that the write is complete. Sending any ``WriteObjectRequest``\ s subsequent - to one in which ``finish_write`` is ``true`` will cause an - error. For a non-resumable write (where the upload_id was - not set in the first message), it is an error not to set + to one in which ``finish_write`` is ``true`` causes an + error. For a non-resumable write (where the ``upload_id`` + was not set in the first message), it is an error not to set this field in the final message of the stream. common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): - Optional. A set of parameters common to + Optional. A set of parameters common to Cloud Storage API requests concerning an object. """ @@ -1743,7 +1767,8 @@ class WriteObjectRequest(proto.Message): class WriteObjectResponse(proto.Message): - r"""Response message for WriteObject. + r"""Response message for + [WriteObject][google.storage.v2.Storage.WriteObject]. This message has `oneof`_ fields (mutually exclusive fields). For each oneof, at most one member field can be set at the same time. @@ -1814,9 +1839,9 @@ class AppendObjectSpec(proto.Message): This field is a member of `oneof`_ ``_if_metageneration_not_match``. routing_token (str): - An optional routing token that influences - request routing for the stream. Must be provided - if a BidiWriteObjectRedirectedError is returned. + An optional routing token that influences request routing + for the stream. Must be provided if a + ``BidiWriteObjectRedirectedError`` is returned. This field is a member of `oneof`_ ``_routing_token``. write_handle (google.cloud._storage_v2.types.BidiWriteHandle): @@ -1866,7 +1891,8 @@ class AppendObjectSpec(proto.Message): class BidiWriteObjectRequest(proto.Message): - r"""Request message for BidiWriteObject. + r"""Request message for + [BidiWriteObject][google.storage.v2.Storage.BidiWriteObject]. This message has `oneof`_ fields (mutually exclusive fields). For each oneof, at most one member field can be set at the same time. @@ -1898,52 +1924,52 @@ class BidiWriteObjectRequest(proto.Message): In the first ``WriteObjectRequest`` of a ``WriteObject()`` action, it indicates the initial offset for the ``Write()`` - call. The value **must** be equal to the ``persisted_size`` - that a call to ``QueryWriteStatus()`` would return (0 if - this is the first write to the object). + call. The value must be equal to the ``persisted_size`` that + a call to ``QueryWriteStatus()`` would return (0 if this is + the first write to the object). - On subsequent calls, this value **must** be no larger than - the sum of the first ``write_offset`` and the sizes of all + On subsequent calls, this value must be no larger than the + sum of the first ``write_offset`` and the sizes of all ``data`` chunks sent previously on this stream. - An invalid value will cause an error. + An invalid value causes an error. checksummed_data (google.cloud._storage_v2.types.ChecksummedData): The data to insert. If a crc32c checksum is provided that doesn't match the checksum - computed by the service, the request will fail. + computed by the service, the request fails. This field is a member of `oneof`_ ``data``. object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. Checksums for the complete object. If the checksums computed by the service don't match the specified - checksums the call will fail. May only be provided in the + checksums the call fails. Might only be provided in the first request or the last request (with finish_write set). state_lookup (bool): - Optional. For each BidiWriteObjectRequest where state_lookup - is ``true`` or the client closes the stream, the service - will send a BidiWriteObjectResponse containing the current - persisted size. The persisted size sent in responses covers - all the bytes the server has persisted thus far and can be - used to decide what data is safe for the client to drop. - Note that the object's current size reported by the - BidiWriteObjectResponse may lag behind the number of bytes - written by the client. This field is ignored if - ``finish_write`` is set to true. + Optional. For each ``BidiWriteObjectRequest`` where + ``state_lookup`` is ``true`` or the client closes the + stream, the service sends a ``BidiWriteObjectResponse`` + containing the current persisted size. The persisted size + sent in responses covers all the bytes the server has + persisted thus far and can be used to decide what data is + safe for the client to drop. Note that the object's current + size reported by the ``BidiWriteObjectResponse`` might lag + behind the number of bytes written by the client. This field + is ignored if ``finish_write`` is set to true. flush (bool): Optional. Persists data written on the stream, up to and including the current message, to permanent storage. This - option should be used sparingly as it may reduce - performance. Ongoing writes will periodically be persisted - on the server even when ``flush`` is not set. This field is + option should be used sparingly as it might reduce + performance. Ongoing writes are periodically persisted on + the server even when ``flush`` is not set. This field is ignored if ``finish_write`` is set to true since there's no need to checkpoint or flush if this message completes the write. finish_write (bool): Optional. If ``true``, this indicates that the write is complete. Sending any ``WriteObjectRequest``\ s subsequent - to one in which ``finish_write`` is ``true`` will cause an - error. For a non-resumable write (where the upload_id was - not set in the first message), it is an error not to set + to one in which ``finish_write`` is ``true`` causes an + error. For a non-resumable write (where the ``upload_id`` + was not set in the first message), it is an error not to set this field in the final message of the stream. common_object_request_params (google.cloud._storage_v2.types.CommonObjectRequestParams): Optional. A set of parameters common to @@ -2025,11 +2051,10 @@ class BidiWriteObjectResponse(proto.Message): This field is a member of `oneof`_ ``write_status``. write_handle (google.cloud._storage_v2.types.BidiWriteHandle): - An optional write handle that will - periodically be present in response messages. - Clients should save it for later use in - establishing a new stream if a connection is - interrupted. + An optional write handle that is returned + periodically in response messages. Clients + should save it for later use in establishing a + new stream if a connection is interrupted. This field is a member of `oneof`_ ``_write_handle``. """ @@ -2054,7 +2079,9 @@ class BidiWriteObjectResponse(proto.Message): class ListObjectsRequest(proto.Message): - r"""Request message for ListObjects. + r"""Request message for + [ListObjects][google.storage.v2.Storage.ListObjects]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -2065,68 +2092,69 @@ class ListObjectsRequest(proto.Message): page_size (int): Optional. Maximum number of ``items`` plus ``prefixes`` to return in a single page of responses. As duplicate - ``prefixes`` are omitted, fewer total results may be - returned than requested. The service will use this parameter - or 1,000 items, whichever is smaller. + ``prefixes`` are omitted, fewer total results might be + returned than requested. The service uses this parameter or + 1,000 items, whichever is smaller. page_token (str): Optional. A previously-returned page token representing part of the larger set of results to view. delimiter (str): Optional. If set, returns results in a directory-like mode. - ``items`` will contain only objects whose names, aside from - the ``prefix``, do not contain ``delimiter``. Objects whose - names, aside from the ``prefix``, contain ``delimiter`` will - have their name, truncated after the ``delimiter``, returned - in ``prefixes``. Duplicate ``prefixes`` are omitted. + ``items`` contains only objects whose names, aside from the + ``prefix``, do not contain ``delimiter``. Objects whose + names, aside from the ``prefix``, contain ``delimiter`` has + their name, truncated after the ``delimiter``, returned in + ``prefixes``. Duplicate ``prefixes`` are omitted. include_trailing_delimiter (bool): Optional. If true, objects that end in exactly one instance - of ``delimiter`` will have their metadata included in - ``items`` in addition to ``prefixes``. + of ``delimiter`` has their metadata included in ``items`` in + addition to ``prefixes``. prefix (str): Optional. Filter results to objects whose names begin with this prefix. versions (bool): Optional. If ``true``, lists all versions of an object as - distinct results. For more information, see `Object - Versioning `__. + distinct results. read_mask (google.protobuf.field_mask_pb2.FieldMask): Mask specifying which fields to read from each result. If no - mask is specified, will default to all fields except - items.acl and items.owner. - - - may be used to mean "all fields". + mask is specified, defaults to all fields except + ``items.acl`` and ``items.owner``. ``*`` might be used to + mean all fields. This field is a member of `oneof`_ ``_read_mask``. lexicographic_start (str): Optional. Filter results to objects whose names are - lexicographically equal to or after lexicographic_start. If - lexicographic_end is also set, the objects listed have names - between lexicographic_start (inclusive) and - lexicographic_end (exclusive). + lexicographically equal to or after ``lexicographic_start``. + If ``lexicographic_end`` is also set, the objects listed + have names between ``lexicographic_start`` (inclusive) and + ``lexicographic_end`` (exclusive). lexicographic_end (str): Optional. Filter results to objects whose names are - lexicographically before lexicographic_end. If - lexicographic_start is also set, the objects listed have - names between lexicographic_start (inclusive) and - lexicographic_end (exclusive). + lexicographically before ``lexicographic_end``. If + ``lexicographic_start`` is also set, the objects listed have + names between ``lexicographic_start`` (inclusive) and + ``lexicographic_end`` (exclusive). soft_deleted (bool): Optional. If true, only list all soft-deleted versions of the object. Soft delete policy is required to set this option. include_folders_as_prefixes (bool): - Optional. If true, will also include folders and managed - folders (besides objects) in the returned ``prefixes``. - Requires ``delimiter`` to be set to '/'. + Optional. If true, includes folders and managed folders + (besides objects) in the returned ``prefixes``. Requires + ``delimiter`` to be set to '/'. match_glob (str): Optional. Filter results to objects and prefixes that match - this glob pattern. See `List Objects Using - Glob `__ + this glob pattern. See `List objects using + glob `__ for the full syntax. filter (str): - Optional. Filter the returned objects. Currently only - supported for the ``contexts`` field. If ``delimiter`` is - set, the returned ``prefixes`` are exempt from this filter. + Optional. An expression used to filter the returned objects + by the ``context`` field. For the full syntax, see `Filter + objects by contexts + syntax `__. + If a ``delimiter`` is set, the returned ``prefixes`` are + exempt from this filter. """ parent: str = proto.Field( @@ -2190,7 +2218,8 @@ class ListObjectsRequest(proto.Message): class QueryWriteStatusRequest(proto.Message): - r"""Request object for ``QueryWriteStatus``. + r"""Request object for + [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus]. Attributes: upload_id (str): @@ -2214,7 +2243,8 @@ class QueryWriteStatusRequest(proto.Message): class QueryWriteStatusResponse(proto.Message): - r"""Response object for ``QueryWriteStatus``. + r"""Response object for + [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus]. This message has `oneof`_ fields (mutually exclusive fields). For each oneof, at most one member field can be set at the same time. @@ -2254,15 +2284,17 @@ class QueryWriteStatusResponse(proto.Message): class RewriteObjectRequest(proto.Message): - r"""Request message for RewriteObject. If the source object is encrypted - using a Customer-Supplied Encryption Key the key information must be - provided in the copy_source_encryption_algorithm, - copy_source_encryption_key_bytes, and - copy_source_encryption_key_sha256_bytes fields. If the destination - object should be encrypted the keying information should be provided - in the encryption_algorithm, encryption_key_bytes, and - encryption_key_sha256_bytes fields of the - common_object_request_params.customer_encryption field. + r"""Request message for + [RewriteObject][google.storage.v2.Storage.RewriteObject]. If the + source object is encrypted using a Customer-Supplied Encryption Key + the key information must be provided in the + ``copy_source_encryption_algorithm``, + ``copy_source_encryption_key_bytes``, and + ``copy_source_encryption_key_sha256_bytes`` fields. If the + destination object should be encrypted the keying information should + be provided in the ``encryption_algorithm``, + ``encryption_key_bytes``, and ``encryption_key_sha256_bytes`` fields + of the ``common_object_request_params.customer_encryption`` field. .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -2281,9 +2313,9 @@ class RewriteObjectRequest(proto.Message): containing the destination object. destination_kms_key (str): Optional. The name of the Cloud KMS key that - will be used to encrypt the destination object. - The Cloud KMS key must be located in same - location as the object. If the parameter is not + is used to encrypt the destination object. The + Cloud KMS key must be located in same location + as the object. If the parameter is not specified, the request uses the destination bucket's default encryption key, if any, or else the Google-managed encryption key. @@ -2293,9 +2325,9 @@ class RewriteObjectRequest(proto.Message): not be populated (these values are specified in the ``destination_name``, ``destination_bucket``, and ``destination_kms_key`` fields). If ``destination`` is - present it will be used to construct the destination - object's metadata; otherwise the destination object's - metadata will be copied from the source object. + present it is used to construct the destination object's + metadata; otherwise the destination object's metadata is + copied from the source object. source_bucket (str): Required. Name of the bucket in which to find the source object. @@ -2315,11 +2347,10 @@ class RewriteObjectRequest(proto.Message): the values provided in the first rewrite request. destination_predefined_acl (str): - Optional. Apply a predefined set of access - controls to the destination object. Valid values - are "authenticatedRead", - "bucketOwnerFullControl", "bucketOwnerRead", - "private", "projectPrivate", or "publicRead". + Optional. Apply a predefined set of access controls to the + destination object. Valid values are ``authenticatedRead``, + ``bucketOwnerFullControl``, ``bucketOwnerRead``, + ``private``, ``projectPrivate``, or ``publicRead``. if_generation_match (int): Makes the operation conditional on whether the object's current generation matches the @@ -2374,15 +2405,15 @@ class RewriteObjectRequest(proto.Message): This field is a member of `oneof`_ ``_if_source_metageneration_not_match``. max_bytes_rewritten_per_call (int): - Optional. The maximum number of bytes that will be rewritten - per rewrite request. Most callers shouldn't need to specify - this parameter - it is primarily in place to support - testing. If specified the value must be an integral multiple - of 1 MiB (1048576). Also, this only applies to requests - where the source and destination span locations and/or - storage classes. Finally, this value must not change across - rewrite calls else you'll get an error that the - ``rewriteToken`` is invalid. + Optional. The maximum number of bytes that are rewritten per + rewrite request. Most callers shouldn't need to specify this + parameter - it is primarily in place to support testing. If + specified the value must be an integral multiple of 1 MiB + (1048576). Also, this only applies to requests where the + source and destination span locations and/or storage + classes. Finally, this value must not change across rewrite + calls else you'll get an error that the ``rewriteToken`` is + invalid. copy_source_encryption_algorithm (str): Optional. The algorithm used to encrypt the source object, if any. Used if the source object @@ -2403,8 +2434,8 @@ class RewriteObjectRequest(proto.Message): Storage API requests concerning an object. object_checksums (google.cloud._storage_v2.types.ObjectChecksums): Optional. The checksums of the complete - object. This will be used to validate the - destination object after rewriting. + object. This is used to validate the destination + object after rewriting. """ destination_name: str = proto.Field( @@ -2564,7 +2595,9 @@ class RewriteResponse(proto.Message): class MoveObjectRequest(proto.Message): - r"""Request message for MoveObject. + r"""Request message for + [MoveObject][google.storage.v2.Storage.MoveObject]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -2708,7 +2741,8 @@ class MoveObjectRequest(proto.Message): class StartResumableWriteRequest(proto.Message): - r"""Request message StartResumableWrite. + r"""Request message for + [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite]. Attributes: write_object_spec (google.cloud._storage_v2.types.WriteObjectSpec): @@ -2744,7 +2778,8 @@ class StartResumableWriteRequest(proto.Message): class StartResumableWriteResponse(proto.Message): - r"""Response object for ``StartResumableWrite``. + r"""Response object for + [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite]. Attributes: upload_id (str): @@ -2763,7 +2798,9 @@ class StartResumableWriteResponse(proto.Message): class UpdateObjectRequest(proto.Message): - r"""Request message for UpdateObject. + r"""Request message for + [UpdateObject][google.storage.v2.Storage.UpdateObject]. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -2817,7 +2854,7 @@ class UpdateObjectRequest(proto.Message): To specify ALL fields, equivalent to the JSON API's "update" function, specify a single field with the value ``*``. Note: not recommended. If a new field is introduced at a later - time, an older client updating with the ``*`` may + time, an older client updating with the ``*`` might accidentally reset the new field's value. Not specifying any fields is an error. @@ -2887,7 +2924,7 @@ class CommonObjectRequestParams(proto.Message): raw bytes format (not base64-encoded). encryption_key_sha256_bytes (bytes): Optional. SHA256 hash of encryption key used - with the Customer-Supplied Encryption Keys + with the Customer-supplied encryption keys feature. """ @@ -2916,9 +2953,8 @@ class Values(proto.Enum): VALUES_UNSPECIFIED (0): Unused. Proto3 requires first enum to be 0. MAX_READ_CHUNK_BYTES (2097152): - The maximum size chunk that can will be - returned in a single ReadRequest. - 2 MiB. + The maximum size chunk that can be returned in a single + ``ReadRequest``. 2 MiB. MAX_WRITE_CHUNK_BYTES (2097152): The maximum size chunk that can be sent in a single WriteObjectRequest. 2 MiB. @@ -3006,31 +3042,25 @@ class Bucket(proto.Message): bucket_id (str): Output only. The user-chosen part of the bucket name. The ``{bucket}`` portion of the ``name`` field. For globally - unique buckets, this is equal to the "bucket name" of other - Cloud Storage APIs. Example: "pub". + unique buckets, this is equal to the ``bucket name`` of + other Cloud Storage APIs. Example: ``pub``. etag (str): - The etag of the bucket. - If included in the metadata of an - UpdateBucketRequest, the operation will only be - performed if the etag matches that of the - bucket. + The etag of the bucket. If included in the metadata of an + ``UpdateBucketRequest``, the operation is only performed if + the ``etag`` matches that of the bucket. project (str): - Immutable. The project which owns this - bucket, in the format of - "projects/{projectIdentifier}". - {projectIdentifier} can be the project ID or - project number. Output values will always be in - project number format. + Immutable. The project which owns this bucket, in the format + of ``projects/{projectIdentifier}``. ``{projectIdentifier}`` + can be the project ID or project number. Output values are + always in the project number format. metageneration (int): Output only. The metadata generation of this bucket. location (str): Immutable. The location of the bucket. Object data for objects in the bucket resides in physical storage within - this region. Defaults to ``US``. See the - [https://developers.google.com/storage/docs/concepts-techniques#specifyinglocations"][developer's - guide] for the authoritative list. Attempting to update this - field after the bucket is created will result in an error. + this region. Defaults to ``US``. Attempting to update this + field after the bucket is created results in an error. location_type (str): Output only. The location type of the bucket (region, dual-region, multi-region, etc). @@ -3039,37 +3069,39 @@ class Bucket(proto.Message): no storageClass is specified for a newly-created object. This defines how objects in the bucket are stored and determines the SLA and the cost of storage. If this value is - not specified when the bucket is created, it will default to - ``STANDARD``. For more information, see - https://developers.google.com/storage/docs/storage-classes. + not specified when the bucket is created, it defaults to + ``STANDARD``. For more information, see `Storage + classes `__. rpo (str): Optional. The recovery point objective for cross-region replication of the bucket. Applicable only for dual- and - multi-region buckets. "DEFAULT" uses default replication. - "ASYNC_TURBO" enables turbo replication, valid for + multi-region buckets. ``DEFAULT`` uses default replication. + ``ASYNC_TURBO`` enables turbo replication, valid for dual-region buckets only. If rpo is not specified when the - bucket is created, it defaults to "DEFAULT". For more - information, see - https://cloud.google.com/storage/docs/availability-durability#turbo-replication. + bucket is created, it defaults to ``DEFAULT``. For more + information, see `Turbo + replication `__. acl (MutableSequence[google.cloud._storage_v2.types.BucketAccessControl]): Optional. Access controls on the bucket. If - iam_config.uniform_bucket_level_access is enabled on this - bucket, requests to set, read, or modify acl is an error. + ``iam_config.uniform_bucket_level_access`` is enabled on + this bucket, requests to set, read, or modify acl is an + error. default_object_acl (MutableSequence[google.cloud._storage_v2.types.ObjectAccessControl]): Optional. Default access controls to apply to new objects when no ACL is provided. If - iam_config.uniform_bucket_level_access is enabled on this - bucket, requests to set, read, or modify acl is an error. + ``iam_config.uniform_bucket_level_access`` is enabled on + this bucket, requests to set, read, or modify acl is an + error. lifecycle (google.cloud._storage_v2.types.Bucket.Lifecycle): - Optional. The bucket's lifecycle config. See - [https://developers.google.com/storage/docs/lifecycle]Lifecycle - Management] for more information. + Optional. The bucket's lifecycle configuration. See + `Lifecycle + Management `__ + for more information. create_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The creation time of the bucket. cors (MutableSequence[google.cloud._storage_v2.types.Bucket.Cors]): Optional. The bucket's - [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing] - (CORS) config. + `CORS `__ configuration. update_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The modification time of the bucket. @@ -3079,32 +3111,33 @@ class Bucket(proto.Message): Event-based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such - objects will be subject to bucket-level - retention (if any). One sample use case of this - flag is for banks to hold loan documents for at - least 3 years after loan is paid in full. Here, + objects are subject to bucket-level retention + (if any). One sample use case of this flag is + for banks to hold loan documents for at least 3 + years after loan is paid in full. Here, bucket-level retention is 3 years and the event is loan being paid in full. In this example, - these objects will be held intact for any number - of years until the event has occurred - (event-based hold on the object is released) and - then 3 more years after that. That means - retention duration of the objects begins from - the moment event-based hold transitioned from - true to false. Objects under event-based hold - cannot be deleted, overwritten or archived until - the hold is removed. + these objects are held intact for any number of + years until the event has occurred (event-based + hold on the object is released) and then 3 more + years after that. That means retention duration + of the objects begins from the moment + event-based hold transitioned from true to + false. Objects under event-based hold cannot be + deleted, overwritten or archived until the hold + is removed. labels (MutableMapping[str, str]): Optional. User-provided labels, in key/value pairs. website (google.cloud._storage_v2.types.Bucket.Website): Optional. The bucket's website config, controlling how the service behaves when accessing bucket contents as a web - site. See the - [https://cloud.google.com/storage/docs/static-website][Static - Website Examples] for more information. + site. See the `Static website + examples `__ + for more information. versioning (google.cloud._storage_v2.types.Bucket.Versioning): - Optional. The bucket's versioning config. + Optional. The bucket's versioning + configuration. logging (google.cloud._storage_v2.types.Bucket.Logging): Optional. The bucket's logging config, which defines the destination bucket and name prefix @@ -3115,38 +3148,37 @@ class Bucket(proto.Message): encryption (google.cloud._storage_v2.types.Bucket.Encryption): Optional. Encryption config for a bucket. billing (google.cloud._storage_v2.types.Bucket.Billing): - Optional. The bucket's billing config. + Optional. The bucket's billing configuration. retention_policy (google.cloud._storage_v2.types.Bucket.RetentionPolicy): Optional. The bucket's retention policy. The retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any attempt to overwrite or delete objects younger than the - retention period will result in a PERMISSION_DENIED error. + retention period results in a ``PERMISSION_DENIED`` error. An unlocked retention policy can be modified or removed from the bucket via a storage.buckets.update operation. A locked retention policy cannot be removed or shortened in duration for the lifetime of the bucket. Attempting to remove or - decrease period of a locked retention policy will result in - a PERMISSION_DENIED error. + decrease period of a locked retention policy results in a + ``PERMISSION_DENIED`` error. iam_config (google.cloud._storage_v2.types.Bucket.IamConfig): - Optional. The bucket's IAM config. + Optional. The bucket's IAM configuration. satisfies_pzs (bool): Optional. Reserved for future use. custom_placement_config (google.cloud._storage_v2.types.Bucket.CustomPlacementConfig): Optional. Configuration that, if present, specifies the data - placement for a - [https://cloud.google.com/storage/docs/locations#location-dr][configurable - dual-region]. + placement for a `configurable + dual-region `__. autoclass (google.cloud._storage_v2.types.Bucket.Autoclass): Optional. The bucket's Autoclass configuration. If there is no configuration, the - Autoclass feature will be disabled and have no - effect on the bucket. + Autoclass feature is disabled and has no effect + on the bucket. hierarchical_namespace (google.cloud._storage_v2.types.Bucket.HierarchicalNamespace): Optional. The bucket's hierarchical namespace configuration. If there is no configuration, the - hierarchical namespace feature will be disabled - and have no effect on the bucket. + hierarchical namespace feature is disabled and + has no effect on the bucket. soft_delete_policy (google.cloud._storage_v2.types.Bucket.SoftDeletePolicy): Optional. The bucket's soft delete policy. The soft delete policy prevents soft-deleted @@ -3154,7 +3186,7 @@ class Bucket(proto.Message): object_retention (google.cloud._storage_v2.types.Bucket.ObjectRetention): Optional. The bucket's object retention configuration. Must be enabled before objects in - the bucket may have retention configured. + the bucket might have retention configured. ip_filter (google.cloud._storage_v2.types.Bucket.IpFilter): Optional. The bucket's IP filter configuration. @@ -3184,25 +3216,27 @@ class Cors(proto.Message): Attributes: origin (MutableSequence[str]): - Optional. The list of Origins eligible to receive CORS - response headers. See - [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on - origins. Note: "\*" is permitted in the list of origins, and - means "any Origin". + Optional. The list of origins eligible to receive CORS + response headers. For more information about origins, see + `RFC 6454 `__. Note: + ``*`` is permitted in the list of origins, and means + ``any origin``. method (MutableSequence[str]): Optional. The list of HTTP methods on which to include CORS response headers, (``GET``, ``OPTIONS``, ``POST``, etc) - Note: "\*" is permitted in the list of methods, and means + Note: ``*`` is permitted in the list of methods, and means "any method". response_header (MutableSequence[str]): - Optional. The list of HTTP headers other than the - [https://www.w3.org/TR/cors/#simple-response-header][simple - response headers] to give permission for the user-agent to - share across domains. + Optional. The list of HTTP headers other than the `simple + response + headers `__ + to give permission for the user-agent to share across + domains. max_age_seconds (int): Optional. The value, in seconds, to return in the - [https://www.w3.org/TR/cors/#access-control-max-age-response-header][Access-Control-Max-Age - header] used in preflight responses. + `Access-Control-Max-Age + header `__ + used in preflight responses. """ origin: MutableSequence[str] = proto.RepeatedField( @@ -3230,9 +3264,8 @@ class Encryption(proto.Message): Attributes: default_kms_key (str): Optional. The name of the Cloud KMS key that - will be used to encrypt objects inserted into - this bucket, if no encryption method is - specified. + is used to encrypt objects inserted into this + bucket, if no encryption method is specified. google_managed_encryption_enforcement_config (google.cloud._storage_v2.types.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfig): Optional. If omitted, then new objects with GMEK encryption-type is allowed. If set, then @@ -3273,10 +3306,11 @@ class GoogleManagedEncryptionEnforcementConfig(proto.Message): restriction_mode (str): Restriction mode for google-managed encryption for new objects within the bucket. Valid values are: - "NotRestricted", "FullyRestricted". If ``NotRestricted`` or - unset, creation of new objects with google-managed - encryption is allowed. If ``FullyRestricted``, new objects - can't be created using google-managed encryption. + ``NotRestricted`` and ``FullyRestricted``. If + ``NotRestricted`` or unset, creation of new objects with + google-managed encryption is allowed. If + ``FullyRestricted``, new objects can't be created using + google-managed encryption. This field is a member of `oneof`_ ``_restriction_mode``. effective_time (google.protobuf.timestamp_pb2.Timestamp): @@ -3309,10 +3343,11 @@ class CustomerManagedEncryptionEnforcementConfig(proto.Message): restriction_mode (str): Restriction mode for customer-managed encryption for new objects within the bucket. Valid values are: - "NotRestricted", "FullyRestricted". If ``NotRestricted`` or - unset, creation of new objects with customer-managed - encryption is allowed. If ``FullyRestricted``, new objects - can't be created using customer-managed encryption. + ``NotRestricted`` and ``FullyRestricted``. If + ``NotRestricted`` or unset, creation of new objects with + customer-managed encryption is allowed. If + ``FullyRestricted``, new objects can't be created using + customer-managed encryption. This field is a member of `oneof`_ ``_restriction_mode``. effective_time (google.protobuf.timestamp_pb2.Timestamp): @@ -3345,10 +3380,11 @@ class CustomerSuppliedEncryptionEnforcementConfig(proto.Message): restriction_mode (str): Restriction mode for customer-supplied encryption for new objects within the bucket. Valid values are: - "NotRestricted", "FullyRestricted". If ``NotRestricted`` or - unset, creation of new objects with customer-supplied - encryption is allowed. If ``FullyRestricted``, new objects - can't be created using customer-supplied encryption. + ``NotRestricted`` and ``FullyRestricted``. If + ``NotRestricted`` or unset, creation of new objects with + customer-supplied encryption is allowed. If + ``FullyRestricted``, new objects can't be created using + customer-supplied encryption. This field is a member of `oneof`_ ``_restriction_mode``. effective_time (google.protobuf.timestamp_pb2.Timestamp): @@ -3401,9 +3437,8 @@ class IamConfig(proto.Message): Optional. Bucket restriction options currently enforced on the bucket. public_access_prevention (str): - Optional. Whether IAM will enforce public - access prevention. Valid values are "enforced" - or "inherited". + Optional. Whether IAM enforces public access prevention. + Valid values are ``enforced`` or ``inherited``. """ class UniformBucketLevelAccess(proto.Message): @@ -3445,28 +3480,27 @@ class UniformBucketLevelAccess(proto.Message): ) class Lifecycle(proto.Message): - r"""Lifecycle properties of a bucket. - For more information, see - https://cloud.google.com/storage/docs/lifecycle. + r"""Lifecycle properties of a bucket. For more information, see `Object + Lifecycle + Management `__. Attributes: rule (MutableSequence[google.cloud._storage_v2.types.Bucket.Lifecycle.Rule]): Optional. A lifecycle management rule, which - is made of an action to take and the - condition(s) under which the action will be - taken. + is made of an action to take and the condition + under which the action is taken. """ class Rule(proto.Message): r"""A lifecycle Rule, combining an action to take on an object - and a condition which will trigger that action. + and a condition which triggers that action. Attributes: action (google.cloud._storage_v2.types.Bucket.Lifecycle.Rule.Action): Optional. The action to take. condition (google.cloud._storage_v2.types.Bucket.Lifecycle.Rule.Condition): - Optional. The condition(s) under which the - action will be taken. + Optional. The condition under which the + action is taken. """ class Action(proto.Message): @@ -3524,7 +3558,7 @@ class Condition(proto.Message): This field is a member of `oneof`_ ``_num_newer_versions``. matches_storage_class (MutableSequence[str]): Optional. Objects having any of the storage classes - specified by this condition will be matched. Values include + specified by this condition are matched. Values include ``MULTI_REGIONAL``, ``REGIONAL``, ``NEARLINE``, ``COLDLINE``, ``STANDARD``, and ``DURABLE_REDUCED_AVAILABILITY``. @@ -3545,8 +3579,8 @@ class Condition(proto.Message): condition only if these many days have been passed since it became noncurrent. The value of the field must be a nonnegative integer. If it's - zero, the object version will become eligible - for Lifecycle action as soon as it becomes + zero, the object version becomes eligible for + Lifecycle action as soon as it becomes noncurrent. This field is a member of `oneof`_ ``_days_since_noncurrent_time``. @@ -3686,8 +3720,8 @@ class RetentionPolicy(proto.Message): Retention duration must be greater than zero and less than 100 years. Note that enforcement of retention periods less than a day is not guaranteed. Such periods should only be - used for testing purposes. Any ``nanos`` value specified - will be rounded down to the nearest second. + used for testing purposes. Any ``nanos`` value specified is + rounded down to the nearest second. """ effective_time: timestamp_pb2.Timestamp = proto.Field( @@ -3740,9 +3774,9 @@ class SoftDeletePolicy(proto.Message): ) class Versioning(proto.Message): - r"""Properties of a bucket related to versioning. - For more on Cloud Storage versioning, see - https://cloud.google.com/storage/docs/object-versioning. + r"""Properties of a bucket related to versioning. For more information + about Cloud Storage versioning, see `Object + versioning `__. Attributes: enabled (bool): @@ -3756,25 +3790,24 @@ class Versioning(proto.Message): ) class Website(proto.Message): - r"""Properties of a bucket related to accessing the contents as a - static website. For more on hosting a static website via Cloud - Storage, see - https://cloud.google.com/storage/docs/hosting-static-website. + r"""Properties of a bucket related to accessing the contents as a static + website. For details, see `hosting a static website using Cloud + Storage `__. Attributes: main_page_suffix (str): Optional. If the requested object path is missing, the - service will ensure the path has a trailing '/', append this + service ensures the path has a trailing '/', append this suffix, and attempt to retrieve the resulting object. This allows the creation of ``index.html`` objects to represent directory pages. not_found_page (str): Optional. If the requested object path is missing, and any ``mainPageSuffix`` object is missing, if applicable, the - service will return the named object from this bucket as the - content for a - [https://tools.ietf.org/html/rfc7231#section-6.5.4][404 Not - Found] result. + service returns the named object from this bucket as the + content for a `404 Not + Found `__ + result. """ main_page_suffix: str = proto.Field( @@ -3787,10 +3820,11 @@ class Website(proto.Message): ) class CustomPlacementConfig(proto.Message): - r"""Configuration for Custom Dual Regions. It should specify precisely - two eligible regions within the same Multiregion. More information - on regions may be found - `here `__. + r"""Configuration for `configurable dual- + regions `__. + It should specify precisely two eligible regions within the same + multi-region. For details, see + `locations `__. Attributes: data_locations (MutableSequence[str]): @@ -3815,13 +3849,13 @@ class Autoclass(proto.Message): Output only. Latest instant at which the ``enabled`` field was set to true after being disabled/unconfigured or set to false after being enabled. If Autoclass is enabled when the - bucket is created, the toggle_time is set to the bucket - creation time. + bucket is created, the value of the ``toggle_time`` field is + set to the bucket ``create_time``. terminal_storage_class (str): - An object in an Autoclass bucket will - eventually cool down to the terminal storage - class if there is no access to the object. The - only valid values are NEARLINE and ARCHIVE. + An object in an Autoclass bucket eventually + cools down to the terminal storage class if + there is no access to the object. The only valid + values are NEARLINE and ARCHIVE. This field is a member of `oneof`_ ``_terminal_storage_class``. terminal_storage_class_update_time (google.protobuf.timestamp_pb2.Timestamp): @@ -3868,7 +3902,7 @@ class IpFilter(proto.Message): filtering rules are applied to a bucket and all incoming requests to the bucket are evaluated against these rules. When set to ``Disabled``, IP filtering rules are not applied - to a bucket.". + to a bucket. This field is a member of `oneof`_ ``_mode``. public_network_source (google.cloud._storage_v2.types.Bucket.IpFilter.PublicNetworkSource): @@ -3885,13 +3919,13 @@ class IpFilter(proto.Message): orgs different than the bucket's parent org to access the bucket. When set to true, validations on the existence of the VPCs won't be performed. - If set to false, each VPC network source will be + If set to false, each VPC network source is checked to belong to the same org as the bucket as well as validated for existence. allow_all_service_agent_access (bool): Whether or not to allow all P4SA access to the bucket. When set to true, IP filter config - validation will not apply. + validation doesn't apply. This field is a member of `oneof`_ ``_allow_all_service_agent_access``. """ @@ -4168,20 +4202,18 @@ class BucketAccessControl(proto.Message): - All members of the Google Apps for Business domain ``example.com`` would be ``domain-example.com`` For project entities, ``project-{team}-{projectnumber}`` - format will be returned on response. + format is returned on response. entity_alt (str): Output only. The alternative entity format, if exists. For - project entities, ``project-{team}-{projectid}`` format will - be returned on response. + project entities, ``project-{team}-{projectid}`` format is + returned in the response. entity_id (str): Optional. The ID for the entity, if any. etag (str): - Optional. The etag of the - BucketAccessControl. If included in the metadata - of an update or delete request message, the - operation operation will only be performed if - the etag matches that of the bucket's - BucketAccessControl. + Optional. The ``etag`` of the ``BucketAccessControl``. If + included in the metadata of an update or delete request + message, the operation operation is only performed if the + etag matches that of the bucket's ``BucketAccessControl``. email (str): Optional. The email address associated with the entity, if any. @@ -4272,18 +4304,18 @@ class ObjectChecksums(proto.Message): CRC32C digest of the object data. Computed by the Cloud Storage service for all written objects. If set in a WriteObjectRequest, service - will validate that the stored object matches - this checksum. + validates that the stored object matches this + checksum. This field is a member of `oneof`_ ``_crc32c``. md5_hash (bytes): Optional. 128 bit MD5 hash of the object data. For more - information about using the MD5 hash, see - [https://cloud.google.com/storage/docs/hashes-etags#json-api][Hashes - and ETags: Best Practices]. Not all objects will provide an - MD5 hash. For example, composite objects provide only crc32c - hashes. This value is equivalent to running - ``cat object.txt | openssl md5 -binary`` + information about using the MD5 hash, see `Data validation + and change + detection `__. + Not all objects provide an MD5 hash. For example, composite + objects provide only crc32c hashes. This value is equivalent + to running ``cat object.txt | openssl md5 -binary`` """ crc32c: int = proto.Field( @@ -4344,8 +4376,8 @@ class ObjectContexts(proto.Message): class CustomerEncryption(proto.Message): - r"""Describes the Customer-Supplied Encryption Key mechanism used - to store an Object's data at rest. + r"""Describes the customer-supplied encryption key mechanism used + to store an object's data at rest. Attributes: encryption_algorithm (str): @@ -4383,10 +4415,9 @@ class Object(proto.Message): Immutable. The name of the bucket containing this object. etag (str): - Optional. The etag of the object. - If included in the metadata of an update or - delete request message, the operation will only - be performed if the etag matches that of the + Optional. The ``etag`` of an object. If included in the + metadata of an update or delete request message, the + operation is only performed if the etag matches that of the live object. generation (int): Immutable. The content generation of this @@ -4409,32 +4440,30 @@ class Object(proto.Message): Optional. Storage class of the object. size (int): Output only. Content-Length of the object data in bytes, - matching - [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 - §3.3.2]. + matching `RFC 7230 + §3.3.2 `__. content_encoding (str): - Optional. Content-Encoding of the object data, matching - [https://tools.ietf.org/html/rfc7231#section-3.1.2.2][RFC - 7231 §3.1.2.2] + Optional. Content-Encoding of the object data, matching `RFC + 7231 + §3.1.2.2 `__ content_disposition (str): Optional. Content-Disposition of the object data, matching - [https://tools.ietf.org/html/rfc6266][RFC 6266]. + `RFC 6266 `__. cache_control (str): Optional. Cache-Control directive for the object data, - matching - [https://tools.ietf.org/html/rfc7234#section-5.2"][RFC 7234 - §5.2]. If omitted, and the object is accessible to all - anonymous users, the default will be - ``public, max-age=3600``. + matching `RFC 7234 + §5.2 `__. + If omitted, and the object is accessible to all anonymous + users, the default is ``public, max-age=3600``. acl (MutableSequence[google.cloud._storage_v2.types.ObjectAccessControl]): Optional. Access controls on the object. If - iam_config.uniform_bucket_level_access is enabled on the + ``iam_config.uniform_bucket_level_access`` is enabled on the parent bucket, requests to set, read, or modify acl is an error. content_language (str): - Optional. Content-Language of the object data, matching - [https://tools.ietf.org/html/rfc7231#section-3.1.3.2][RFC - 7231 §3.1.3.2]. + Optional. Content-Language of the object data, matching `RFC + 7231 + §3.1.3.2 `__. delete_time (google.protobuf.timestamp_pb2.Timestamp): Output only. If this object is noncurrent, this is the time when the object became @@ -4443,10 +4472,11 @@ class Object(proto.Message): Output only. The time when the object was finalized. content_type (str): - Optional. Content-Type of the object data, matching - [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC - 7231 §3.1.1.5]. If an object is stored without a - Content-Type, it is served as ``application/octet-stream``. + Optional. Content-Type of the object data, matching `RFC + 7231 + §3.1.1.5 `__. + If an object is stored without a Content-Type, it is served + as ``application/octet-stream``. create_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The creation time of the object. component_count (int): @@ -4456,13 +4486,12 @@ class Object(proto.Message): checksums (google.cloud._storage_v2.types.ObjectChecksums): Output only. Hashes for the data part of this object. This field is used for output only and - will be silently ignored if provided in - requests. The checksums of the complete object - regardless of data range. If the object is - downloaded in full, the client should compute - one of these checksums over the downloaded - object and compare it against the value provided - here. + is silently ignored if provided in requests. The + checksums of the complete object regardless of + data range. If the object is downloaded in full, + the client should compute one of these checksums + over the downloaded object and compare it + against the value provided here. update_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The modification time of the object metadata. Set initially to object @@ -4480,7 +4509,7 @@ class Object(proto.Message): update_storage_class_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The time at which the object's storage class was last changed. When the object is initially created, it - will be set to time_created. + is set to ``time_created``. temporary_hold (bool): Optional. Whether an object is under temporary hold. While this flag is set to true, @@ -4515,24 +4544,24 @@ class Object(proto.Message): Whether an object is under event-based hold. An event-based hold is a way to force the retention of an object until after some event occurs. Once the hold is released by - explicitly setting this field to false, the object will - become subject to any bucket-level retention policy, except - that the retention duration will be calculated from the time - the event based hold was lifted, rather than the time the - object was created. + explicitly setting this field to ``false``, the object + becomes subject to any bucket-level retention policy, except + that the retention duration is calculated from the time the + event based hold was lifted, rather than the time the object + was created. - In a WriteObject request, not setting this field implies + In a ``WriteObject`` request, not setting this field implies that the value should be taken from the parent bucket's - "default_event_based_hold" field. In a response, this field - will always be set to true or false. + ``default_event_based_hold`` field. In a response, this + field is always set to ``true`` or ``false``. This field is a member of `oneof`_ ``_event_based_hold``. owner (google.cloud._storage_v2.types.Owner): - Output only. The owner of the object. This - will always be the uploader of the object. + Output only. The owner of the object. This is + always the uploader of the object. customer_encryption (google.cloud._storage_v2.types.CustomerEncryption): - Optional. Metadata of Customer-Supplied - Encryption Key, if the object is encrypted by + Optional. Metadata of customer-supplied + encryption key, if the object is encrypted by such a key. custom_time (google.protobuf.timestamp_pb2.Timestamp): Optional. A user-specified timestamp set on @@ -4542,22 +4571,23 @@ class Object(proto.Message): soft-deleted. Soft-deleted objects are only accessible if a - soft_delete_policy is enabled. Also see hard_delete_time. + soft_delete_policy is enabled. Also see + ``hard_delete_time``. This field is a member of `oneof`_ ``_soft_delete_time``. hard_delete_time (google.protobuf.timestamp_pb2.Timestamp): - Output only. The time when the object will be permanently + Output only. The time when the object is permanently deleted. Only set when an object becomes soft-deleted with a - soft_delete_policy. Otherwise, the object will not be + ``soft_delete_policy``. Otherwise, the object is not accessible. This field is a member of `oneof`_ ``_hard_delete_time``. retention (google.cloud._storage_v2.types.Object.Retention): Optional. Retention configuration of this - object. May only be configured if the bucket has - object retention enabled. + object. Might only be configured if the bucket + has object retention enabled. """ class Retention(proto.Message): @@ -4582,11 +4612,11 @@ class Mode(proto.Enum): No specified mode. Object is not under retention. UNLOCKED (1): - Retention period may be decreased or - increased. The Retention configuration may be - removed. The mode may be changed to locked. + Retention period might be decreased or + increased. The Retention configuration might be + removed. The mode might be changed to locked. LOCKED (2): - Retention period may be increased. + Retention period might be increased. The Retention configuration cannot be removed. The mode cannot be changed. """ @@ -4792,20 +4822,19 @@ class ObjectAccessControl(proto.Message): - All members of the Google Apps for Business domain ``example.com`` would be ``domain-example.com``. For project entities, ``project-{team}-{projectnumber}`` - format will be returned on response. + format is returned in the response. entity_alt (str): Output only. The alternative entity format, if exists. For - project entities, ``project-{team}-{projectid}`` format will - be returned on response. + project entities, ``project-{team}-{projectid}`` format is + returned in the response. entity_id (str): Optional. The ID for the entity, if any. etag (str): Optional. The etag of the ObjectAccessControl. If included in the metadata of an update or delete request message, the - operation will only be performed if the etag - matches that of the live object's - ObjectAccessControl. + operation is only performed if the etag matches + that of the live object's ObjectAccessControl. email (str): Optional. The email address associated with the entity, if any. diff --git a/tests/unit/gapic/storage_v2/test_storage.py b/tests/unit/gapic/storage_v2/test_storage.py index e6344192b..20b680341 100644 --- a/tests/unit/gapic/storage_v2/test_storage.py +++ b/tests/unit/gapic/storage_v2/test_storage.py @@ -1935,6 +1935,7 @@ def test_list_buckets(request_type, transport: str = "grpc"): # Designate an appropriate return value for the call. call.return_value = storage.ListBucketsResponse( next_page_token="next_page_token_value", + unreachable=["unreachable_value"], ) response = client.list_buckets(request) @@ -1947,6 +1948,7 @@ def test_list_buckets(request_type, transport: str = "grpc"): # Establish that the response is the type that we expect. assert isinstance(response, pagers.ListBucketsPager) assert response.next_page_token == "next_page_token_value" + assert response.unreachable == ["unreachable_value"] def test_list_buckets_non_empty_request_with_auto_populated_field(): @@ -2077,6 +2079,7 @@ async def test_list_buckets_async( call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( storage.ListBucketsResponse( next_page_token="next_page_token_value", + unreachable=["unreachable_value"], ) ) response = await client.list_buckets(request) @@ -2090,6 +2093,7 @@ async def test_list_buckets_async( # Establish that the response is the type that we expect. assert isinstance(response, pagers.ListBucketsAsyncPager) assert response.next_page_token == "next_page_token_value" + assert response.unreachable == ["unreachable_value"] @pytest.mark.asyncio @@ -9281,6 +9285,7 @@ async def test_list_buckets_empty_call_grpc_asyncio(): call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( storage.ListBucketsResponse( next_page_token="next_page_token_value", + unreachable=["unreachable_value"], ) ) await client.list_buckets(request=None) @@ -10018,6 +10023,7 @@ async def test_list_buckets_routing_parameters_request_1_grpc_asyncio(): call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( storage.ListBucketsResponse( next_page_token="next_page_token_value", + unreachable=["unreachable_value"], ) ) await client.list_buckets(request={"parent": "sample1"}) From 195d644c4d4feec98e9a9cd9fad67fc774c50dc8 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 12 Nov 2025 14:15:27 +0530 Subject: [PATCH 408/509] fix: dont pass credentials to StorageClient (#1608) if transport is provided with credentials. gRPC client will throw [error](https://github.com/googleapis/python-storage/blob/323cddd5d439e04e12614106eab1928fd4008c0b/google/cloud/_storage_v2/services/storage/client.py#L691-L695) if credentials are passed to client's instance in addition to passing it to transport. --- google/cloud/storage/_experimental/asyncio/async_grpc_client.py | 1 - tests/unit/asyncio/test_async_grpc_client.py | 1 - 2 files changed, 2 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py index e6546908d..75e6f63d2 100644 --- a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py +++ b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py @@ -69,7 +69,6 @@ def _create_async_grpc_client( transport = transport_cls(credentials=credentials, channel=channel) return storage_v2.StorageAsyncClient( - credentials=credentials, transport=transport, client_info=client_info, client_options=client_options, diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index 250d85522..0e2bf9b50 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -46,7 +46,6 @@ def test_constructor_default_options(self, mock_async_storage_client): ) mock_transport = mock_transport_cls.return_value mock_async_storage_client.assert_called_once_with( - credentials=mock_creds, transport=mock_transport, client_options=None, client_info=None, From 92fc2b00429415b9fbe7cba0167778eee60449e2 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:31:35 +0530 Subject: [PATCH 409/509] feat: add support for partial list buckets (#1606) Add support for partial list buckets --- google/cloud/storage/client.py | 24 +++++++++++- tests/unit/test_client.py | 72 ++++++++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 8 deletions(-) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 74b6061c0..f03807ca7 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -64,6 +64,15 @@ _marker = object() +def _buckets_page_start(iterator, page, response): + """Grab unreachable buckets after a :class:`~google.cloud.iterator.Page` started.""" + unreachable = response.get("unreachable", []) + if not isinstance(unreachable, list): + raise TypeError( + f"expected unreachable to be list, but obtained {type(unreachable)}" + ) + page.unreachable = unreachable + class Client(ClientWithProject): """Client to bundle configuration needed for API requests. @@ -1458,6 +1467,7 @@ def list_buckets( retry=DEFAULT_RETRY, *, soft_deleted=None, + return_partial_success=None, ): """Get all buckets in the project associated to the client. @@ -1516,6 +1526,13 @@ def list_buckets( generation number. This parameter can only be used successfully if the bucket has a soft delete policy. See: https://cloud.google.com/storage/docs/soft-delete + :type return_partial_success: bool + :param return_partial_success: + (Optional) If True, the response will also contain a list of + unreachable buckets if the buckets are unavailable. The + unreachable buckets will be available on the ``unreachable`` + attribute of the returned iterator. + :rtype: :class:`~google.api_core.page_iterator.Iterator` :raises ValueError: if both ``project`` is ``None`` and the client's project is also ``None``. @@ -1551,7 +1568,10 @@ def list_buckets( if soft_deleted is not None: extra_params["softDeleted"] = soft_deleted - return self._list_resource( + if return_partial_success is not None: + extra_params["returnPartialSuccess"] = return_partial_success + + iterator = self._list_resource( "/b", _item_to_bucket, page_token=page_token, @@ -1560,7 +1580,9 @@ def list_buckets( page_size=page_size, timeout=timeout, retry=retry, + page_start=_buckets_page_start, ) + return iterator def restore_bucket( self, diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index d5723740e..331f40d66 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -2224,7 +2224,7 @@ def test_list_blobs_w_explicit_w_user_project(self): def test_list_buckets_wo_project(self): from google.cloud.exceptions import BadRequest - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start credentials = _make_credentials() client = self._make_one(project=None, credentials=credentials) @@ -2253,10 +2253,11 @@ def test_list_buckets_wo_project(self): page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + page_start=_buckets_page_start, ) def test_list_buckets_wo_project_w_emulator(self): - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start # mock STORAGE_EMULATOR_ENV_VAR is set host = "http://localhost:8080" @@ -2288,10 +2289,11 @@ def test_list_buckets_wo_project_w_emulator(self): page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + page_start=_buckets_page_start, ) def test_list_buckets_w_environ_project_w_emulator(self): - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start # mock STORAGE_EMULATOR_ENV_VAR is set host = "http://localhost:8080" @@ -2327,10 +2329,11 @@ def test_list_buckets_w_environ_project_w_emulator(self): page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + page_start=_buckets_page_start, ) def test_list_buckets_w_custom_endpoint(self): - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start custom_endpoint = "storage-example.p.googleapis.com" client = self._make_one(client_options={"api_endpoint": custom_endpoint}) @@ -2358,10 +2361,11 @@ def test_list_buckets_w_custom_endpoint(self): page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + page_start=_buckets_page_start, ) def test_list_buckets_w_defaults(self): - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start project = "PROJECT" credentials = _make_credentials() @@ -2390,10 +2394,11 @@ def test_list_buckets_w_defaults(self): page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + page_start=_buckets_page_start, ) def test_list_buckets_w_soft_deleted(self): - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start project = "PROJECT" credentials = _make_credentials() @@ -2423,10 +2428,11 @@ def test_list_buckets_w_soft_deleted(self): page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, + page_start=_buckets_page_start, ) def test_list_buckets_w_explicit(self): - from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _item_to_bucket, _buckets_page_start project = "foo-bar" other_project = "OTHER_PROJECT" @@ -2476,6 +2482,7 @@ def test_list_buckets_w_explicit(self): page_size=expected_page_size, timeout=timeout, retry=retry, + page_start=_buckets_page_start, ) def test_restore_bucket(self): @@ -3086,6 +3093,57 @@ def test_get_signed_policy_v4_with_access_token_sa_email(self): self.assertEqual(fields["x-goog-signature"], EXPECTED_SIGN) self.assertEqual(fields["policy"], EXPECTED_POLICY) + def test_list_buckets_w_partial_success(self): + from google.cloud.storage.client import _item_to_bucket + from google.cloud.storage.client import _buckets_page_start + + PROJECT = "project" + bucket_name = "bucket-name" + unreachable_bucket = "projects/_/buckets/unreachable-bucket" + + client = self._make_one(project=PROJECT) + + mock_bucket = mock.Mock() + mock_bucket.name = bucket_name + + mock_page = mock.Mock() + mock_page.unreachable = [unreachable_bucket] + mock_page.__iter__ = mock.Mock(return_value=iter([mock_bucket])) + + mock_iterator = mock.Mock() + mock_iterator.pages = iter([mock_page]) + + client._list_resource = mock.Mock(return_value=mock_iterator) + + iterator = client.list_buckets(return_partial_success=True) + + page = next(iterator.pages) + + self.assertEqual(page.unreachable, [unreachable_bucket]) + + buckets = list(page) + self.assertEqual(len(buckets), 1) + self.assertEqual(buckets[0].name, bucket_name) + + expected_path = "/b" + expected_item_to_value = _item_to_bucket + expected_extra_params = { + "project": PROJECT, + "projection": "noAcl", + "returnPartialSuccess": True, + } + + client._list_resource.assert_called_once_with( + expected_path, + expected_item_to_value, + page_token=None, + max_results=None, + extra_params=expected_extra_params, + page_size=None, + timeout=self._get_default_timeout(), + retry=DEFAULT_RETRY, + page_start=_buckets_page_start, + ) class Test__item_to_bucket(unittest.TestCase): def _call_fut(self, iterator, item): From 5ab81032268e875f82a66431d666fe61c9eb394b Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 17 Nov 2025 13:58:03 +0530 Subject: [PATCH 410/509] feat(zb-experimental): add async write object stream (#1612) feat(zb-experimental): add async write object stream --------- Co-authored-by: Owl Bot --- .../asyncio/async_write_object_stream.py | 134 ++++++++++++++++++ google/cloud/storage/client.py | 1 + .../asyncio/test_async_write_object_stream.py | 108 ++++++++++++++ tests/unit/test_client.py | 1 + 4 files changed, 244 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/async_write_object_stream.py create mode 100644 tests/unit/asyncio/test_async_write_object_stream.py diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py new file mode 100644 index 000000000..07263ddd8 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -0,0 +1,134 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +NOTE: +This is _experimental module for upcoming support for Rapid Storage. +(https://cloud.google.com/blog/products/storage-data-transfer/high-performance-storage-innovations-for-ai-hpc#:~:text=your%20AI%20workloads%3A-,Rapid%20Storage,-%3A%20A%20new) + +APIs may not work as intended and are not stable yet. Feature is not +GA(Generally Available) yet, please contact your TAM(Technical Account Manager) +if you want to use these Rapid Storage APIs. + +""" +from typing import Optional +from google.cloud import _storage_v2 +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( + _AsyncAbstractObjectStream, +) +from google.api_core.bidi_async import AsyncBidiRpc + + +class _AsyncWriteObjectStream(_AsyncAbstractObjectStream): + """Class representing a gRPC bidi-stream for writing data from a GCS + ``Appendable Object``. + + This class provides a unix socket-like interface to a GCS ``Object``, with + methods like ``open``, ``close``, ``send``, and ``recv``. + + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :param client: async grpc client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the GCS ``bucket`` containing the object. + + :type object_name: str + :param object_name: The name of the GCS ``Appendable Object`` to be write. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. If None, a new object is created. + + :type write_handle: bytes + :param write_handle: (Optional) An existing handle for writing the object. + If provided, opening the bidi-gRPC connection will be faster. + """ + + def __init__( + self, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, # None means new object + write_handle: Optional[bytes] = None, + ) -> None: + if client is None: + raise ValueError("client must be provided") + if bucket_name is None: + raise ValueError("bucket_name must be provided") + if object_name is None: + raise ValueError("object_name must be provided") + + super().__init__( + bucket_name=bucket_name, + object_name=object_name, + generation_number=generation_number, + ) + self.client: AsyncGrpcClient.grpc_client = client + self.write_handle: Optional[bytes] = write_handle + + self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" + + self.rpc = self.client._client._transport._wrapped_methods[ + self.client._client._transport.bidi_write_object + ] + + self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) + self.socket_like_rpc: Optional[AsyncBidiRpc] = None + self._is_stream_open: bool = False + self.first_bidi_write_req = None + self.persisted_size = 0 + self.object_resource: Optional[_storage_v2.Object] = None + + async def open(self) -> None: + """Opening an object for write , should do it's state lookup + to know what's the persisted size is. + """ + raise NotImplementedError( + "open() is not implemented yet in _AsyncWriteObjectStream" + ) + + async def close(self) -> None: + """Closes the bidi-gRPC connection.""" + raise NotImplementedError( + "close() is not implemented yet in _AsyncWriteObjectStream" + ) + + async def send( + self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest + ) -> None: + """Sends a request message on the stream. + + Args: + bidi_write_object_request (:class:`~google.cloud._storage_v2.types.BidiReadObjectRequest`): + The request message to send. This is typically used to specify + the read offset and limit. + """ + raise NotImplementedError( + "send() is not implemented yet in _AsyncWriteObjectStream" + ) + + async def recv(self) -> _storage_v2.BidiWriteObjectResponse: + """Receives a response from the stream. + + This method waits for the next message from the server, which could + contain object data or metadata. + + Returns: + :class:`~google.cloud._storage_v2.types.BidiWriteObjectResponse`: + The response message from the server. + """ + raise NotImplementedError( + "recv() is not implemented yet in _AsyncWriteObjectStream" + ) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index f03807ca7..3764c7a53 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -73,6 +73,7 @@ def _buckets_page_start(iterator, page, response): ) page.unreachable = unreachable + class Client(ClientWithProject): """Client to bundle configuration needed for API requests. diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py new file mode 100644 index 000000000..9834b79c9 --- /dev/null +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -0,0 +1,108 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from unittest import mock + +from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( + _AsyncWriteObjectStream, +) +from google.cloud import _storage_v2 + +BUCKET = "my-bucket" +OBJECT = "my-object" + + +@pytest.fixture +def mock_client(): + """Mock the async gRPC client.""" + mock_transport = mock.AsyncMock() + mock_transport.bidi_write_object = mock.sentinel.bidi_write_object + mock_transport._wrapped_methods = { + mock.sentinel.bidi_write_object: mock.sentinel.wrapped_bidi_write_object + } + + mock_gapic_client = mock.AsyncMock() + mock_gapic_client._transport = mock_transport + + client = mock.AsyncMock() + client._client = mock_gapic_client + return client + + +def test_async_write_object_stream_init(mock_client): + """Test the constructor of _AsyncWriteObjectStream.""" + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + + assert stream.client == mock_client + assert stream.bucket_name == BUCKET + assert stream.object_name == OBJECT + assert stream.generation_number is None + assert stream.write_handle is None + assert stream._full_bucket_name == f"projects/_/buckets/{BUCKET}" + assert stream.rpc == mock.sentinel.wrapped_bidi_write_object + assert stream.metadata == ( + ("x-goog-request-params", f"bucket=projects/_/buckets/{BUCKET}"), + ) + assert stream.socket_like_rpc is None + assert not stream._is_stream_open + assert stream.first_bidi_write_req is None + assert stream.persisted_size == 0 + assert stream.object_resource is None + + +def test_async_write_object_stream_init_with_generation_and_handle(mock_client): + """Test the constructor with optional arguments.""" + generation = 12345 + write_handle = b"test-handle" + stream = _AsyncWriteObjectStream( + mock_client, + BUCKET, + OBJECT, + generation_number=generation, + write_handle=write_handle, + ) + + assert stream.generation_number == generation + assert stream.write_handle == write_handle + + +def test_async_write_object_stream_init_raises_value_error(): + """Test that the constructor raises ValueError for missing arguments.""" + with pytest.raises(ValueError, match="client must be provided"): + _AsyncWriteObjectStream(None, BUCKET, OBJECT) + + with pytest.raises(ValueError, match="bucket_name must be provided"): + _AsyncWriteObjectStream(mock.Mock(), None, OBJECT) + + with pytest.raises(ValueError, match="object_name must be provided"): + _AsyncWriteObjectStream(mock.Mock(), BUCKET, None) + + +@pytest.mark.asyncio +async def test_unimplemented_methods_raise_error(mock_client): + """Test that unimplemented methods raise NotImplementedError.""" + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + + with pytest.raises(NotImplementedError): + await stream.open() + + with pytest.raises(NotImplementedError): + await stream.close() + + with pytest.raises(NotImplementedError): + await stream.send(_storage_v2.BidiWriteObjectRequest()) + + with pytest.raises(NotImplementedError): + await stream.recv() diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 331f40d66..0bda14974 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -3145,6 +3145,7 @@ def test_list_buckets_w_partial_success(self): page_start=_buckets_page_start, ) + class Test__item_to_bucket(unittest.TestCase): def _call_fut(self, iterator, item): from google.cloud.storage.client import _item_to_bucket From 0b70a288d238ef192952f5d9024395e17f74abcf Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:35:52 +0530 Subject: [PATCH 411/509] chore(main): release 3.6.0 (#1603) :robot: I have created a release *beep* *boop* --- ## [3.6.0](https://github.com/googleapis/python-storage/compare/v3.5.0...v3.6.0) (2025-11-17) ### Features * Add support for partial list buckets ([#1606](https://github.com/googleapis/python-storage/issues/1606)) ([92fc2b0](https://github.com/googleapis/python-storage/commit/92fc2b00429415b9fbe7cba0167778eee60449e2)) * Make return_partial_success and unreachable fields public for list Bucket ([#1601](https://github.com/googleapis/python-storage/issues/1601)) ([323cddd](https://github.com/googleapis/python-storage/commit/323cddd5d439e04e12614106eab1928fd4008c0b)) * **zb-experimental:** Add async write object stream ([5ab8103](https://github.com/googleapis/python-storage/commit/5ab81032268e875f82a66431d666fe61c9eb394b)) * **zb-experimental:** Add async write object stream ([#1612](https://github.com/googleapis/python-storage/issues/1612)) ([5ab8103](https://github.com/googleapis/python-storage/commit/5ab81032268e875f82a66431d666fe61c9eb394b)) ### Bug Fixes * Dont pass credentials to StorageClient ([#1608](https://github.com/googleapis/python-storage/issues/1608)) ([195d644](https://github.com/googleapis/python-storage/commit/195d644c4d4feec98e9a9cd9fad67fc774c50dc8)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 329740c33..3ee1c7beb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.6.0](https://github.com/googleapis/python-storage/compare/v3.5.0...v3.6.0) (2025-11-17) + + +### Features + +* Add support for partial list buckets ([#1606](https://github.com/googleapis/python-storage/issues/1606)) ([92fc2b0](https://github.com/googleapis/python-storage/commit/92fc2b00429415b9fbe7cba0167778eee60449e2)) +* Make return_partial_success and unreachable fields public for list Bucket ([#1601](https://github.com/googleapis/python-storage/issues/1601)) ([323cddd](https://github.com/googleapis/python-storage/commit/323cddd5d439e04e12614106eab1928fd4008c0b)) +* **zb-experimental:** Add async write object stream ([5ab8103](https://github.com/googleapis/python-storage/commit/5ab81032268e875f82a66431d666fe61c9eb394b)) +* **zb-experimental:** Add async write object stream ([#1612](https://github.com/googleapis/python-storage/issues/1612)) ([5ab8103](https://github.com/googleapis/python-storage/commit/5ab81032268e875f82a66431d666fe61c9eb394b)) + + +### Bug Fixes + +* Dont pass credentials to StorageClient ([#1608](https://github.com/googleapis/python-storage/issues/1608)) ([195d644](https://github.com/googleapis/python-storage/commit/195d644c4d4feec98e9a9cd9fad67fc774c50dc8)) + ## [3.5.0](https://github.com/googleapis/python-storage/compare/v3.4.1...v3.5.0) (2025-11-05) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 13194aa56..102b96095 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.5.0" +__version__ = "3.6.0" From 786af5556023144001f1375f1c6265bd46326b24 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 17 Nov 2025 18:52:23 +0530 Subject: [PATCH 412/509] feat(zb-experimental): implement "open" for write_object_stream (#1613) feat(zb-experimental): implement "open" for write_object_stream --- .../asyncio/async_write_object_stream.py | 52 +++++- .../asyncio/test_async_write_object_stream.py | 164 +++++++++++++++++- 2 files changed, 211 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 07263ddd8..037bcd07d 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -95,10 +95,54 @@ async def open(self) -> None: """Opening an object for write , should do it's state lookup to know what's the persisted size is. """ - raise NotImplementedError( - "open() is not implemented yet in _AsyncWriteObjectStream" + if self._is_stream_open: + raise ValueError("Stream is already open") + + # Create a new object or overwrite existing one if generation_number + # is None. This makes it consistent with GCS JSON API behavior. + # Created object type would be Appendable Object. + if self.generation_number is None: + self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( + write_object_spec=_storage_v2.WriteObjectSpec( + resource=_storage_v2.Object( + name=self.object_name, bucket=self._full_bucket_name + ), + appendable=True, + ), + ) + else: + self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( + append_object_spec=_storage_v2.AppendObjectSpec( + bucket=self._full_bucket_name, + object=self.object_name, + generation=self.generation_number, + ), + state_lookup=True, + ) + + self.socket_like_rpc = AsyncBidiRpc( + self.rpc, initial_request=self.first_bidi_write_req, metadata=self.metadata ) + await self.socket_like_rpc.open() # this is actually 1 send + response = await self.socket_like_rpc.recv() + self._is_stream_open = True + + if not response.resource: + raise ValueError( + "Failed to obtain object resource after opening the stream" + ) + if not response.resource.generation: + raise ValueError( + "Failed to obtain object generation after opening the stream" + ) + self.generation_number = response.resource.generation + + if not response.write_handle: + raise ValueError("Failed to obtain write_handle after opening the stream") + + self.write_handle = response.write_handle + async def close(self) -> None: """Closes the bidi-gRPC connection.""" raise NotImplementedError( @@ -132,3 +176,7 @@ async def recv(self) -> _storage_v2.BidiWriteObjectResponse: raise NotImplementedError( "recv() is not implemented yet in _AsyncWriteObjectStream" ) + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 9834b79c9..f159ba3e7 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -22,6 +22,8 @@ BUCKET = "my-bucket" OBJECT = "my-object" +GENERATION = 12345 +WRITE_HANDLE = b"test-handle" @pytest.fixture @@ -91,13 +93,169 @@ def test_async_write_object_stream_init_raises_value_error(): @pytest.mark.asyncio -async def test_unimplemented_methods_raise_error(mock_client): - """Test that unimplemented methods raise NotImplementedError.""" +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): + """Test opening a stream for a new object.""" + # Arrange + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = mock.AsyncMock() + + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.generation = GENERATION + mock_response.write_handle = WRITE_HANDLE + socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - with pytest.raises(NotImplementedError): + # Act + await stream.open() + + # Assert + assert stream._is_stream_open + socket_like_rpc.open.assert_called_once() + socket_like_rpc.recv.assert_called_once() + assert stream.generation_number == GENERATION + assert stream.write_handle == WRITE_HANDLE + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client): + """Test opening a stream for an existing object.""" + # Arrange + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = mock.AsyncMock() + + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.generation = GENERATION + mock_response.write_handle = WRITE_HANDLE + socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) + + stream = _AsyncWriteObjectStream( + mock_client, BUCKET, OBJECT, generation_number=GENERATION + ) + + # Act + await stream.open() + + # Assert + assert stream._is_stream_open + socket_like_rpc.open.assert_called_once() + socket_like_rpc.recv.assert_called_once() + assert stream.generation_number == GENERATION + assert stream.write_handle == WRITE_HANDLE + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_when_already_open_raises_error(mock_async_bidi_rpc, mock_client): + """Test that opening an already open stream raises a ValueError.""" + # Arrange + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = mock.AsyncMock() + + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.generation = GENERATION + mock_response.write_handle = WRITE_HANDLE + socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + await stream.open() + + # Act & Assert + with pytest.raises(ValueError, match="Stream is already open"): await stream.open() + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_raises_error_on_missing_object_resource( + mock_async_bidi_rpc, mock_client +): + """Test that open raises ValueError if object_resource is not in the response.""" + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + + mock_reponse = mock.AsyncMock() + type(mock_reponse).resource = mock.PropertyMock(return_value=None) + socket_like_rpc.recv.return_value = mock_reponse + + # Note: Don't use below code as unittest library automatically assigns an + # `AsyncMock` object to an attribute, if not set. + # socket_like_rpc.recv.return_value = mock.AsyncMock( + # return_value=_storage_v2.BidiWriteObjectResponse(resource=None) + # ) + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, match="Failed to obtain object resource after opening the stream" + ): + await stream.open() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_raises_error_on_missing_generation( + mock_async_bidi_rpc, mock_client +): + """Test that open raises ValueError if generation is not in the response.""" + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + + # Configure the mock response object + mock_response = mock.AsyncMock() + type(mock_response.resource).generation = mock.PropertyMock(return_value=None) + socket_like_rpc.recv.return_value = mock_response + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, match="Failed to obtain object generation after opening the stream" + ): + await stream.open() + # assert stream.generation_number is None + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_raises_error_on_missing_write_handle( + mock_async_bidi_rpc, mock_client +): + """Test that open raises ValueError if write_handle is not in the response.""" + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse( + resource=_storage_v2.Object(generation=GENERATION), write_handle=None + ) + ) + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + with pytest.raises(ValueError, match="Failed to obtain write_handle"): + await stream.open() + + +@pytest.mark.asyncio +async def test_unimplemented_methods_raise_error(mock_client): + """Test that unimplemented methods raise NotImplementedError.""" + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + with pytest.raises(NotImplementedError): await stream.close() From 7a532216a9a3da728bd3d7f196372f8f6528ef75 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 17 Nov 2025 19:36:21 +0530 Subject: [PATCH 413/509] feat(zb-experimental): implement close (#1614) feat(zb-experimental): implement close --- .../asyncio/async_write_object_stream.py | 7 +- .../asyncio/test_async_write_object_stream.py | 69 +++++++++++++++++-- 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 037bcd07d..b84dea5a4 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -145,9 +145,10 @@ async def open(self) -> None: async def close(self) -> None: """Closes the bidi-gRPC connection.""" - raise NotImplementedError( - "close() is not implemented yet in _AsyncWriteObjectStream" - ) + if not self._is_stream_open: + raise ValueError("Stream is not open") + await self.socket_like_rpc.close() + self._is_stream_open = False async def send( self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index f159ba3e7..ad83669c3 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -15,6 +15,7 @@ import pytest from unittest import mock +from unittest.mock import AsyncMock from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( _AsyncWriteObjectStream, ) @@ -43,6 +44,27 @@ def mock_client(): return client +async def instantiate_write_obj_stream(mock_client, mock_cls_async_bidi_rpc, open=True): + """Helper to create an instance of _AsyncWriteObjectStream and open it by default.""" + socket_like_rpc = AsyncMock() + mock_cls_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = AsyncMock() + socket_like_rpc.close = AsyncMock() + + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.generation = GENERATION + mock_response.write_handle = WRITE_HANDLE + socket_like_rpc.recv = AsyncMock(return_value=mock_response) + + write_obj_stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + + if open: + await write_obj_stream.open() + + return write_obj_stream + + def test_async_write_object_stream_init(mock_client): """Test the constructor of _AsyncWriteObjectStream.""" stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) @@ -228,7 +250,6 @@ async def test_open_raises_error_on_missing_generation( ValueError, match="Failed to obtain object generation after opening the stream" ): await stream.open() - # assert stream.generation_number is None @pytest.mark.asyncio @@ -252,13 +273,49 @@ async def test_open_raises_error_on_missing_write_handle( @pytest.mark.asyncio -async def test_unimplemented_methods_raise_error(mock_client): - """Test that unimplemented methods raise NotImplementedError.""" - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_close(mock_cls_async_bidi_rpc, mock_client): + """Test that close successfully closes the stream.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) - with pytest.raises(NotImplementedError): - await stream.close() + # Act + await write_obj_stream.close() + # Assert + write_obj_stream.socket_like_rpc.close.assert_called_once() + assert not write_obj_stream.is_stream_open + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_close_without_open_should_raise_error( + mock_cls_async_bidi_rpc, mock_client +): + """Test that closing a stream that is not open raises a ValueError.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # Act & Assert + with pytest.raises(ValueError, match="Stream is not open"): + await write_obj_stream.close() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_unimplemented_methods_raise_error(mock_async_bidi_rpc, mock_client): + """Test that unimplemented methods (send, recv) raise NotImplementedError.""" + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) with pytest.raises(NotImplementedError): await stream.send(_storage_v2.BidiWriteObjectRequest()) From 6da118652c97ba11d82c25347080188c7cf7a338 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 17 Nov 2025 20:43:45 +0530 Subject: [PATCH 414/509] feat(zb-experimental): implement send & recv (#1615) feat(zb-experimental): implement send & recv --- .../asyncio/async_write_object_stream.py | 12 +-- .../asyncio/test_async_write_object_stream.py | 81 +++++++++++++++++-- 2 files changed, 80 insertions(+), 13 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index b84dea5a4..6d1fd5b31 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -160,9 +160,9 @@ async def send( The request message to send. This is typically used to specify the read offset and limit. """ - raise NotImplementedError( - "send() is not implemented yet in _AsyncWriteObjectStream" - ) + if not self._is_stream_open: + raise ValueError("Stream is not open") + await self.socket_like_rpc.send(bidi_write_object_request) async def recv(self) -> _storage_v2.BidiWriteObjectResponse: """Receives a response from the stream. @@ -174,9 +174,9 @@ async def recv(self) -> _storage_v2.BidiWriteObjectResponse: :class:`~google.cloud._storage_v2.types.BidiWriteObjectResponse`: The response message from the server. """ - raise NotImplementedError( - "recv() is not implemented yet in _AsyncWriteObjectStream" - ) + if not self._is_stream_open: + raise ValueError("Stream is not open") + return await self.socket_like_rpc.recv() @property def is_stream_open(self) -> bool: diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index ad83669c3..7fa2123c5 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -49,6 +49,7 @@ async def instantiate_write_obj_stream(mock_client, mock_cls_async_bidi_rpc, ope socket_like_rpc = AsyncMock() mock_cls_async_bidi_rpc.return_value = socket_like_rpc socket_like_rpc.open = AsyncMock() + socket_like_rpc.send = AsyncMock() socket_like_rpc.close = AsyncMock() mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) @@ -313,11 +314,77 @@ async def test_close_without_open_should_raise_error( @mock.patch( "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" ) -async def test_unimplemented_methods_raise_error(mock_async_bidi_rpc, mock_client): - """Test that unimplemented methods (send, recv) raise NotImplementedError.""" - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - with pytest.raises(NotImplementedError): - await stream.send(_storage_v2.BidiWriteObjectRequest()) +async def test_send(mock_cls_async_bidi_rpc, mock_client): + """Test that send calls the underlying rpc's send method.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + + # Act + bidi_write_object_request = _storage_v2.BidiWriteObjectRequest() + await write_obj_stream.send(bidi_write_object_request) + + # Assert + write_obj_stream.socket_like_rpc.send.assert_called_once_with( + bidi_write_object_request + ) + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_send_without_open_should_raise_error( + mock_cls_async_bidi_rpc, mock_client +): + """Test that sending on a stream that is not open raises a ValueError.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # Act & Assert + with pytest.raises(ValueError, match="Stream is not open"): + await write_obj_stream.send(_storage_v2.BidiWriteObjectRequest()) + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_recv(mock_cls_async_bidi_rpc, mock_client): + """Test that recv calls the underlying rpc's recv method.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + bidi_write_object_response = _storage_v2.BidiWriteObjectResponse() + write_obj_stream.socket_like_rpc.recv = AsyncMock( + return_value=bidi_write_object_response + ) + + # Act + response = await write_obj_stream.recv() + + # Assert + write_obj_stream.socket_like_rpc.recv.assert_called_once() + assert response == bidi_write_object_response + - with pytest.raises(NotImplementedError): - await stream.recv() +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_recv_without_open_should_raise_error( + mock_cls_async_bidi_rpc, mock_client +): + """Test that receiving on a stream that is not open raises a ValueError.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # Act & Assert + with pytest.raises(ValueError, match="Stream is not open"): + await write_obj_stream.recv() From fdd0a50146d7b5f50f04c1871d43329a10938ff5 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 17 Nov 2025 22:10:26 +0530 Subject: [PATCH 415/509] feat(zb-experimental): Add Async_appendable_object_writer.py (#1616) feat(zb-experimental): Add Async_appendable_object_writer.py --- .../asyncio/async_appendable_object_writer.py | 158 ++++++++++++++++++ .../test_async_appendable_object_writer.py | 115 +++++++++++++ 2 files changed, 273 insertions(+) create mode 100644 google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py create mode 100644 tests/unit/asyncio/test_async_appendable_object_writer.py diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py new file mode 100644 index 000000000..ca03c2b6d --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -0,0 +1,158 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +NOTE: +This is _experimental module for upcoming support for Rapid Storage. +(https://cloud.google.com/blog/products/storage-data-transfer/high-performance-storage-innovations-for-ai-hpc#:~:text=your%20AI%20workloads%3A-,Rapid%20Storage,-%3A%20A%20new) + +APIs may not work as intended and are not stable yet. Feature is not +GA(Generally Available) yet, please contact your TAM (Technical Account Manager) +if you want to use these Rapid Storage APIs. + +""" +from typing import Optional +from google.cloud.storage._experimental.asyncio.async_grpc_client import ( + AsyncGrpcClient, +) +from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( + _AsyncWriteObjectStream, +) + + +class AsyncAppendableObjectWriter: + """Class for appending data to a GCS Appendable Object asynchronously.""" + + def __init__( + self, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation=None, + write_handle=None, + ): + """ + Class for appending data to a GCS Appendable Object. + + Example usage: + + ``` + + from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient + from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import AsyncAppendableObjectWriter + import asyncio + + client = AsyncGrpcClient().grpc_client + bucket_name = "my-bucket" + object_name = "my-appendable-object" + + # instantiate the writer + writer = AsyncAppendableObjectWriter(client, bucket_name, object_name) + # open the writer, (underlying gRPC bidi-stream will be opened) + await writer.open() + + # append data, it can be called multiple times. + await writer.append(b"hello world") + await writer.append(b"some more data") + + # optionally flush data to persist. + await writer.flush() + + # close the gRPC stream. + # Please note closing the program will also close the stream, + # however it's recommended to close the stream if no more data to append + # to clean up gRPC connection (which means CPU/memory/network resources) + await writer.close() + ``` + + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :param client: async grpc client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the GCS bucket containing the object. + + :type object_name: str + :param object_name: The name of the GCS Appendable Object to be written. + + :type generation: int + :param generation: (Optional) If present, selects a specific revision of + that object. + If None, a new object is created. + If None and Object already exists then it'll will be + overwritten. + + :type write_handle: bytes + :param write_handle: (Optional) An existing handle for writing the object. + If provided, opening the bidi-gRPC connection will be faster. + """ + self.client = client + self.bucket_name = bucket_name + self.object_name = object_name + self.write_handle = write_handle + self.generation = generation + + self.write_obj_stream = _AsyncWriteObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation, + write_handle=self.write_handle, + ) + self._is_stream_open: bool = False + self.offset: Optional[int] = None + self.persisted_size: Optional[int] = None + + async def state_lookup(self): + """Returns the persisted_size.""" + raise NotImplementedError("state_lookup is not implemented yet.") + + async def open(self) -> None: + """Opens the underlying bidi-gRPC stream.""" + raise NotImplementedError("open is not implemented yet.") + + async def append(self, data: bytes): + raise NotImplementedError("append is not implemented yet.") + + async def flush(self) -> int: + """Returns persisted_size""" + raise NotImplementedError("flush is not implemented yet.") + + async def close(self, finalize_on_close=False) -> int: + """Returns persisted_size""" + raise NotImplementedError("close is not implemented yet.") + + async def finalize(self) -> int: + """Returns persisted_size + Note: Once finalized no more data can be appended. + """ + raise NotImplementedError("finalize is not implemented yet.") + + # helper methods. + async def append_from_string(self, data: str): + """ + str data will be encoded to bytes using utf-8 encoding calling + + self.append(data.encode("utf-8")) + """ + raise NotImplementedError("append_from_string is not implemented yet.") + + async def append_from_stream(self, stream_obj): + """ + At a time read a chunk of data (16MiB) from `stream_obj` + and call self.append(chunk) + """ + raise NotImplementedError("append_from_stream is not implemented yet.") + + async def append_from_file(self, file_path: str): + """Create a file object from `file_path` and call append_from_stream(file_obj)""" + raise NotImplementedError("append_from_file is not implemented yet.") diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py new file mode 100644 index 000000000..cf838ac05 --- /dev/null +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -0,0 +1,115 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from unittest import mock + +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) + +BUCKET = "test-bucket" +OBJECT = "test-object" +GENERATION = 123 +WRITE_HANDLE = b"test-write-handle" + + +@pytest.fixture +def mock_client(): + """Mock the async gRPC client.""" + return mock.AsyncMock() + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +def test_init(mock_write_object_stream, mock_client): + """Test the constructor of AsyncAppendableObjectWriter.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + + assert writer.client == mock_client + assert writer.bucket_name == BUCKET + assert writer.object_name == OBJECT + assert writer.generation is None + assert writer.write_handle is None + assert not writer._is_stream_open + assert writer.offset is None + assert writer.persisted_size is None + + mock_write_object_stream.assert_called_once_with( + client=mock_client, + bucket_name=BUCKET, + object_name=OBJECT, + generation_number=None, + write_handle=None, + ) + assert writer.write_obj_stream == mock_write_object_stream.return_value + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +def test_init_with_optional_args(mock_write_object_stream, mock_client): + """Test the constructor with optional arguments.""" + writer = AsyncAppendableObjectWriter( + mock_client, + BUCKET, + OBJECT, + generation=GENERATION, + write_handle=WRITE_HANDLE, + ) + + assert writer.generation == GENERATION + assert writer.write_handle == WRITE_HANDLE + + mock_write_object_stream.assert_called_once_with( + client=mock_client, + bucket_name=BUCKET, + object_name=OBJECT, + generation_number=GENERATION, + write_handle=WRITE_HANDLE, + ) + + +@pytest.mark.asyncio +async def test_unimplemented_methods_raise_error(mock_client): + """Test that all currently unimplemented methods raise NotImplementedError.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + + with pytest.raises(NotImplementedError): + await writer.state_lookup() + + with pytest.raises(NotImplementedError): + await writer.open() + + with pytest.raises(NotImplementedError): + await writer.append(b"data") + + with pytest.raises(NotImplementedError): + await writer.flush() + + with pytest.raises(NotImplementedError): + await writer.close() + + with pytest.raises(NotImplementedError): + await writer.finalize() + + with pytest.raises(NotImplementedError): + await writer.append_from_string("data") + + with pytest.raises(NotImplementedError): + await writer.append_from_stream(mock.Mock()) + + with pytest.raises(NotImplementedError): + await writer.append_from_file("file.txt") From 7d17922e671aa2d975262984ba50bfcfa29ff4a5 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 18 Nov 2025 12:19:28 +0530 Subject: [PATCH 416/509] feat(zb-experimental): implement state_lookup (#1617) feat(zb-experimental): implement state_lookup --- .../asyncio/async_appendable_object_writer.py | 12 +++++-- .../test_async_appendable_object_writer.py | 32 +++++++++++++++++-- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index ca03c2b6d..be992b641 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -22,6 +22,7 @@ """ from typing import Optional +from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import ( AsyncGrpcClient, ) @@ -112,9 +113,16 @@ def __init__( self.offset: Optional[int] = None self.persisted_size: Optional[int] = None - async def state_lookup(self): + async def state_lookup(self) -> int: """Returns the persisted_size.""" - raise NotImplementedError("state_lookup is not implemented yet.") + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + state_lookup=True, + ) + ) + response = await self.write_obj_stream.recv() + self.persisted_size = response.persisted_size + return self.persisted_size async def open(self) -> None: """Opens the underlying bidi-gRPC stream.""" diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index cf838ac05..d3a6d3830 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -18,11 +18,14 @@ from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) +from google.cloud import _storage_v2 + BUCKET = "test-bucket" OBJECT = "test-object" GENERATION = 123 WRITE_HANDLE = b"test-write-handle" +PERSISTED_SIZE = 456 @pytest.fixture @@ -82,14 +85,37 @@ def test_init_with_optional_args(mock_write_object_stream, mock_client): ) +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_state_lookup(mock_write_object_stream, mock_client): + """Test state_lookup method.""" + # Arrange + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=PERSISTED_SIZE) + ) + + expected_request = _storage_v2.BidiWriteObjectRequest(state_lookup=True) + + # Act + response = await writer.state_lookup() + + # Assert + mock_stream.send.assert_awaited_once_with(expected_request) + mock_stream.recv.assert_awaited_once() + assert writer.persisted_size == PERSISTED_SIZE + assert response == PERSISTED_SIZE + + @pytest.mark.asyncio async def test_unimplemented_methods_raise_error(mock_client): """Test that all currently unimplemented methods raise NotImplementedError.""" writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises(NotImplementedError): - await writer.state_lookup() - with pytest.raises(NotImplementedError): await writer.open() From ec470a270e189e137c7229cc359367d5a897cdb9 Mon Sep 17 00:00:00 2001 From: Rob Clevenger Date: Tue, 18 Nov 2025 01:28:52 -0800 Subject: [PATCH 417/509] fix(bucket): Move blob fails when the new blob name contains characters that need to be url encoded (#1605) fix(bucket): url encode new_name parameter in move_blob() The move_blob() method was not URL encoding the new_name parameter before passing it to the API call, unlike how the blob encodes its own path. This caused failures when moving blobs to paths with special characters. Added URL encoding for new_name to match the blob path encoding, as both names must fit in the API URL format: "{blob_path}/moveTo/o/{new_name}" Here's an example of what fails: ```python from google.cloud import storage gcs = storage.Client() bucket = gcs.bucket("") blob = bucket.get_blob("test/blob.csv") bucket.move_blob( blob, new_name="test/blob2.csv" ) ``` Fixes #1523 --------- Co-authored-by: Chandra Shekhar Sirimala --- google/cloud/storage/bucket.py | 6 +++++- tests/unit/test_bucket.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 0d1f9192b..1621f879e 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -41,6 +41,7 @@ from google.cloud.storage._opentelemetry_tracing import create_trace_span from google.cloud.storage.acl import BucketACL from google.cloud.storage.acl import DefaultObjectACL +from google.cloud.storage.blob import _quote from google.cloud.storage.blob import Blob from google.cloud.storage.constants import _DEFAULT_TIMEOUT from google.cloud.storage.constants import ARCHIVE_STORAGE_CLASS @@ -2360,7 +2361,10 @@ def move_blob( ) new_blob = Blob(bucket=self, name=new_name) - api_path = blob.path + "/moveTo/o/" + new_blob.name + api_path = "{blob_path}/moveTo/o/{new_name}".format( + blob_path=blob.path, new_name=_quote(new_blob.name) + ) + move_result = client._post_resource( api_path, None, diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 809b572e0..8e4132edf 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -18,6 +18,7 @@ import mock import pytest +from google.cloud.storage.blob import _quote from google.cloud.storage.retry import DEFAULT_RETRY from google.cloud.storage.retry import DEFAULT_RETRY_IF_ETAG_IN_JSON from google.cloud.storage.retry import DEFAULT_RETRY_IF_GENERATION_SPECIFIED @@ -2320,6 +2321,37 @@ def test_move_blob_w_no_retry_timeout_and_generation_match(self): _target_object=new_blob, ) + def test_move_blob_needs_url_encoding(self): + source_name = "source" + blob_name = "blob-name" + new_name = "new/name" + api_response = {} + client = mock.Mock(spec=["_post_resource"]) + client._post_resource.return_value = api_response + source = self._make_one(client=client, name=source_name) + blob = self._make_blob(source_name, blob_name) + + new_blob = source.move_blob( + blob, new_name, if_generation_match=0, retry=None, timeout=30 + ) + + self.assertIs(new_blob.bucket, source) + self.assertEqual(new_blob.name, new_name) + + expected_path = "/b/{}/o/{}/moveTo/o/{}".format( + source_name, blob_name, _quote(new_name) + ) + expected_data = None + expected_query_params = {"ifGenerationMatch": 0} + client._post_resource.assert_called_once_with( + expected_path, + expected_data, + query_params=expected_query_params, + timeout=30, + retry=None, + _target_object=new_blob, + ) + def test_move_blob_w_user_project(self): source_name = "source" blob_name = "blob-name" From dfe4566e4b087ee217a7d05fc388ab5bfb760f39 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 18 Nov 2025 19:49:59 +0530 Subject: [PATCH 418/509] feat(zb-experimental): implement open in writer (#1618) feat(zb-experimental): implement open in writer --------- Co-authored-by: Owl Bot --- .../asyncio/async_appendable_object_writer.py | 12 +++- .../test_async_appendable_object_writer.py | 55 ++++++++++++++++++- tests/unit/test_bucket.py | 2 +- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index be992b641..319c7964b 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -126,7 +126,17 @@ async def state_lookup(self) -> int: async def open(self) -> None: """Opens the underlying bidi-gRPC stream.""" - raise NotImplementedError("open is not implemented yet.") + if self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is already open") + + await self.write_obj_stream.open() + self._is_stream_open = True + if self.generation is None: + self.generation = self.write_obj_stream.generation_number + self.write_handle = self.write_obj_stream.write_handle + + # Update self.persisted_size + _ = await self.state_lookup() async def append(self, data: bytes): raise NotImplementedError("append is not implemented yet.") diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index d3a6d3830..67a074a11 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -112,13 +112,62 @@ async def test_state_lookup(mock_write_object_stream, mock_client): @pytest.mark.asyncio -async def test_unimplemented_methods_raise_error(mock_client): - """Test that all currently unimplemented methods raise NotImplementedError.""" +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_open_appendable_object_writer(mock_write_object_stream, mock_client): + """Test the open method.""" + # Arrange writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + mock_stream = mock_write_object_stream.return_value + mock_stream.open = mock.AsyncMock() + mock_stream.send = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock() - with pytest.raises(NotImplementedError): + mock_state_response = mock.MagicMock() + mock_state_response.persisted_size = 1024 + mock_stream.recv.return_value = mock_state_response + + mock_stream.generation_number = GENERATION + mock_stream.write_handle = WRITE_HANDLE + + # Act + await writer.open() + + # Assert + mock_stream.open.assert_awaited_once() + assert writer._is_stream_open + assert writer.generation == GENERATION + assert writer.write_handle == WRITE_HANDLE + + expected_request = _storage_v2.BidiWriteObjectRequest(state_lookup=True) + mock_stream.send.assert_awaited_once_with(expected_request) + mock_stream.recv.assert_awaited_once() + assert writer.persisted_size == 1024 + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_open_when_already_open_raises_error( + mock_write_object_stream, mock_client +): + """Test that opening an already open writer raises a ValueError.""" + # Arrange + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True # Manually set to open + + # Act & Assert + with pytest.raises(ValueError, match="Underlying bidi-gRPC stream is already open"): await writer.open() + +@pytest.mark.asyncio +async def test_unimplemented_methods_raise_error(mock_client): + """Test that all currently unimplemented methods raise NotImplementedError.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises(NotImplementedError): await writer.append(b"data") diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 8e4132edf..850e89d04 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2350,7 +2350,7 @@ def test_move_blob_needs_url_encoding(self): timeout=30, retry=None, _target_object=new_blob, - ) + ) def test_move_blob_w_user_project(self): source_name = "source" From 53ced015a7a584cbf88197424e92538f8f18915c Mon Sep 17 00:00:00 2001 From: Faizal Kassamali Date: Tue, 18 Nov 2025 14:24:35 -0800 Subject: [PATCH 419/509] fix: Skip flaky test (#1622) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test is causing failures in CI. Skipping until it can be fixed properly. Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [x] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/python-storage/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [x] Ensure the tests and linter pass - [x] Code coverage does not decrease (if any source code was changed) - [x] Appropriate docs were updated (if necessary) Fixes #1611 🦕 --- tests/system/test_bucket.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 602e407cc..de7074a92 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -1339,6 +1339,7 @@ def test_bucket_ip_filter_patch(storage_client, buckets_to_delete): assert len(reloaded_filter.vpc_network_sources) == 1 +@pytest.mark.skip(reason="[https://github.com/googleapis/python-storage/issues/1611]") def test_list_buckets_with_ip_filter(storage_client, buckets_to_delete): """Test that listing buckets returns a summarized IP filter.""" bucket_name = _helpers.unique_name("ip-filter-list") From 361235ac2268c6cfa2c2389cb681a1e67b5fce83 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 18 Nov 2025 20:22:25 -0500 Subject: [PATCH 420/509] chore(librarian): onboard to librarian (#1625) Towards https://github.com/googleapis/librarian/issues/2461 --- .../generator-input/.repo-metadata.json | 18 + .../generator-input/librarian.py | 36 +- .librarian/generator-input/noxfile.py | 408 ++++++++++++++++++ .librarian/generator-input/setup.py | 107 +++++ .librarian/state.yaml | 31 ++ google/cloud/_storage_v2/gapic_version.py | 2 +- noxfile.py | 4 +- .../snippet_metadata_google.storage.v2.json | 2 +- testing/constraints-3.7.txt | 2 +- testing/constraints-3.9.txt | 2 +- 10 files changed, 572 insertions(+), 40 deletions(-) create mode 100644 .librarian/generator-input/.repo-metadata.json rename owlbot.py => .librarian/generator-input/librarian.py (65%) create mode 100644 .librarian/generator-input/noxfile.py create mode 100644 .librarian/generator-input/setup.py create mode 100644 .librarian/state.yaml diff --git a/.librarian/generator-input/.repo-metadata.json b/.librarian/generator-input/.repo-metadata.json new file mode 100644 index 000000000..f644429bc --- /dev/null +++ b/.librarian/generator-input/.repo-metadata.json @@ -0,0 +1,18 @@ +{ + "name": "storage", + "name_pretty": "Google Cloud Storage", + "product_documentation": "https://cloud.google.com/storage", + "client_documentation": "https://cloud.google.com/python/docs/reference/storage/latest", + "issue_tracker": "https://issuetracker.google.com/savedsearches/559782", + "release_level": "stable", + "language": "python", + "library_type": "GAPIC_MANUAL", + "repo": "googleapis/python-storage", + "distribution_name": "google-cloud-storage", + "api_id": "storage.googleapis.com", + "requires_billing": true, + "default_version": "v2", + "codeowner_team": "@googleapis/gcs-sdk-team", + "api_shortname": "storage", + "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." +} diff --git a/owlbot.py b/.librarian/generator-input/librarian.py similarity index 65% rename from owlbot.py rename to .librarian/generator-input/librarian.py index 67b2369ce..ad0baa2a3 100644 --- a/owlbot.py +++ b/.librarian/generator-input/librarian.py @@ -98,41 +98,11 @@ "noxfile.py", "CONTRIBUTING.rst", "README.rst", - ".kokoro/continuous/continuous.cfg", - ".kokoro/presubmit/system-3.8.cfg", - ".kokoro/presubmit/prerelease-deps.cfg", - ".kokoro/continuous/prerelease-deps.cfg", - ".github/blunderbuss.yml", # blunderbuss assignment to python squad - ".github/workflows", # exclude gh actions as credentials are needed for tests - ".github/release-please.yml", # special support for a python2 branch in this repo + ".kokoro/**", + ".github/**", ], ) -s.replace( - ".kokoro/build.sh", - "export PYTHONUNBUFFERED=1", - """export PYTHONUNBUFFERED=1 - -# Export variable to override api endpoint -export API_ENDPOINT_OVERRIDE - -# Export variable to override api endpoint version -export API_VERSION_OVERRIDE - -# Export dual region locations -export DUAL_REGION_LOC_1 -export DUAL_REGION_LOC_2 - -# Setup universe domain testing needed environment variables. -export TEST_UNIVERSE_DOMAIN_CREDENTIAL=$(realpath ${KOKORO_GFILE_DIR}/secret_manager/client-library-test-universe-domain-credential) -export TEST_UNIVERSE_DOMAIN=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-domain) -export TEST_UNIVERSE_PROJECT_ID=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-project-id) -export TEST_UNIVERSE_LOCATION=$(gcloud secrets versions access latest --project cloud-devrel-kokoro-resources --secret=client-library-test-universe-storage-location) - -""") - python.py_samples(skip_readmes=True) -# Use a python runtime which is available in the owlbot post processor here -# https://github.com/googleapis/synthtool/blob/master/docker/owlbot/python/Dockerfile -s.shell.run(["nox", "-s", "blacken-3.10"], hide_output=False) +s.shell.run(["nox", "-s", "blacken"], hide_output=False) diff --git a/.librarian/generator-input/noxfile.py b/.librarian/generator-input/noxfile.py new file mode 100644 index 000000000..16cf97b01 --- /dev/null +++ b/.librarian/generator-input/noxfile.py @@ -0,0 +1,408 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +import os +import pathlib +import re +import shutil + +import nox + + +BLACK_VERSION = "black==23.7.0" +BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] + +DEFAULT_PYTHON_VERSION = "3.12" +SYSTEM_TEST_PYTHON_VERSIONS = ["3.12"] +UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.12"] + +CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() + +# Error if a python version is missing +nox.options.error_on_missing_interpreters = True + +nox.options.sessions = [ + "blacken", + "conftest_retry", + "docfx", + "docs", + "lint", + "lint_setup_py", + "system", + # TODO(https://github.com/googleapis/python-storage/issues/1499): + # Remove or restore testing for Python 3.7/3.8 + "unit-3.9", + "unit-3.10", + "unit-3.11", + "unit-3.12", + "unit-3.13", + # cover must be last to avoid error `No data to report` + "cover", +] + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def lint(session): + """Run linters. + + Returns a failure if the linters find linting errors or sufficiently + serious code quality issues. + """ + # Pin flake8 to 6.0.0 + # See https://github.com/googleapis/python-storage/issues/1102 + session.install("flake8==6.0.0", BLACK_VERSION) + session.run( + "black", + "--check", + *BLACK_PATHS, + ) + session.run("flake8", "google", "tests") + + +@nox.session(python="3.14") +def blacken(session): + """Run black. + + Format code to uniform standard. + """ + session.install(BLACK_VERSION) + session.run( + "black", + *BLACK_PATHS, + ) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def lint_setup_py(session): + """Verify that setup.py is valid (including RST check).""" + session.install("docutils", "pygments", "setuptools>=79.0.1") + session.run("python", "setup.py", "check", "--restructuredtext", "--strict") + + +def default(session, install_extras=True): + constraints_path = str( + CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" + ) + # Install all test dependencies, then install this package in-place. + session.install( + "mock", + "pytest", + "pytest-cov", + "pytest-asyncio", + "brotli", + "grpcio", + "grpcio-status", + "proto-plus", + "grpc-google-iam-v1", + "-c", + constraints_path, + ) + + if install_extras: + session.install("opentelemetry-api", "opentelemetry-sdk") + + session.install("-e", ".", "-c", constraints_path) + + # This dependency is included in setup.py for backwards compatibility only + # and the client library is expected to pass all tests without it. See + # setup.py and README for details. + session.run("pip", "uninstall", "-y", "google-resumable-media") + + # Run py.test against the unit tests. + session.run( + "py.test", + "--quiet", + f"--junitxml=unit_{session.python}_sponge_log.xml", + "--cov=google.cloud.storage", + "--cov=google.cloud", + "--cov=tests.unit", + "--cov-append", + "--cov-config=.coveragerc", + "--cov-report=", + "--cov-fail-under=0", + os.path.join("tests", "unit"), + os.path.join("tests", "resumable_media", "unit"), + *session.posargs, + ) + + +@nox.session(python=UNIT_TEST_PYTHON_VERSIONS) +def unit(session): + """Run the unit test suite.""" + default(session) + + +@nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS) +def system(session): + constraints_path = str( + CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" + ) + """Run the system test suite.""" + rerun_count = 0 + + # Check the value of `RUN_SYSTEM_TESTS` env var. It defaults to true. + if os.environ.get("RUN_SYSTEM_TESTS", "true") == "false": + session.skip("RUN_SYSTEM_TESTS is set to false, skipping") + # Environment check: Only run tests if the environment variable is set. + if not os.environ.get("GOOGLE_APPLICATION_CREDENTIALS", ""): + session.skip( + "Credentials must be set via environment variable GOOGLE_APPLICATION_CREDENTIALS" + ) + # mTLS tests requires pyopenssl. + if os.environ.get("GOOGLE_API_USE_CLIENT_CERTIFICATE", "") == "true": + session.install("pyopenssl") + # Check if endpoint is being overriden for rerun_count + if ( + os.getenv("API_ENDPOINT_OVERRIDE", "https://storage.googleapis.com") + != "https://storage.googleapis.com" + ): + rerun_count = 3 + + # Use pre-release gRPC for system tests. + # TODO: Remove ban of 1.52.0rc1 once grpc/grpc#31885 is resolved. + session.install("--pre", "grpcio!=1.52.0rc1") + + # Install all test dependencies, then install this package into the + # virtualenv's dist-packages. + # 2021-05-06: defer installing 'google-cloud-*' to after this package, + # in order to work around Python 2.7 googolapis-common-protos + # issue. + session.install("mock", "pytest", "pytest-rerunfailures", "-c", constraints_path) + session.install("-e", ".", "-c", constraints_path) + session.install( + "google-cloud-testutils", + "google-cloud-iam", + "google-cloud-pubsub", + "google-cloud-kms", + "brotli", + "-c", + constraints_path, + ) + + # Run py.test against the system tests. + session.run( + "py.test", + "--quiet", + f"--junitxml=system_{session.python}_sponge_log.xml", + "--reruns={}".format(rerun_count), + os.path.join("tests", "system"), + os.path.join("tests", "resumable_media", "system"), + *session.posargs, + ) + + +@nox.session(python=CONFORMANCE_TEST_PYTHON_VERSIONS) +def conftest_retry(session): + """Run the retry conformance test suite.""" + conformance_test_folder_path = os.path.join("tests", "conformance") + conformance_test_folder_exists = os.path.exists(conformance_test_folder_path) + # Environment check: only run tests if found. + if not conformance_test_folder_exists: + session.skip("Conformance tests were not found") + + # Install all test dependencies and pytest plugin to run tests in parallel. + # Then install this package in-place. + session.install("pytest", "pytest-xdist") + session.install("-e", ".") + + # Run #CPU processes in parallel if no test session arguments are passed in. + if session.posargs: + test_cmd = [ + "py.test", + "--quiet", + conformance_test_folder_path, + *session.posargs, + ] + else: + test_cmd = ["py.test", "-n", "auto", "--quiet", conformance_test_folder_path] + + # Run py.test against the conformance tests. + session.run(*test_cmd) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def cover(session): + """Run the final coverage report. + + This outputs the coverage report aggregating coverage from the unit + test runs (not system test runs), and then erases coverage data. + """ + session.install("coverage", "pytest-cov") + session.run("coverage", "report", "--show-missing", "--fail-under=99") + + session.run("coverage", "erase") + + +@nox.session(python="3.10") +def docs(session): + """Build the docs for this library.""" + + session.install("-e", ".") + session.install( + # We need to pin to specific versions of the `sphinxcontrib-*` packages + # which still support sphinx 4.x. + # See https://github.com/googleapis/sphinx-docfx-yaml/issues/344 + # and https://github.com/googleapis/sphinx-docfx-yaml/issues/345. + "sphinxcontrib-applehelp==1.0.4", + "sphinxcontrib-devhelp==1.0.2", + "sphinxcontrib-htmlhelp==2.0.1", + "sphinxcontrib-qthelp==1.0.3", + "sphinxcontrib-serializinghtml==1.1.5", + "sphinx==4.5.0", + "alabaster", + "recommonmark", + ) + + shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) + session.run( + "sphinx-build", + "-W", # warnings as errors + "-T", # show full traceback on exception + "-N", # no colors + "-b", + "html", + "-d", + os.path.join("docs", "_build", "doctrees", ""), + os.path.join("docs", ""), + os.path.join("docs", "_build", "html", ""), + ) + + +@nox.session(python="3.10") +def docfx(session): + """Build the docfx yaml files for this library.""" + + session.install("-e", ".") + session.install("grpcio") + session.install( + # We need to pin to specific versions of the `sphinxcontrib-*` packages + # which still support sphinx 4.x. + # See https://github.com/googleapis/sphinx-docfx-yaml/issues/344 + # and https://github.com/googleapis/sphinx-docfx-yaml/issues/345. + "sphinxcontrib-applehelp==1.0.4", + "sphinxcontrib-devhelp==1.0.2", + "sphinxcontrib-htmlhelp==2.0.1", + "sphinxcontrib-qthelp==1.0.3", + "sphinxcontrib-serializinghtml==1.1.5", + "gcp-sphinx-docfx-yaml", + "alabaster", + "recommonmark", + ) + + shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) + session.run( + "sphinx-build", + "-T", # show full traceback on exception + "-N", # no colors + "-D", + ( + "extensions=sphinx.ext.autodoc," + "sphinx.ext.autosummary," + "docfx_yaml.extension," + "sphinx.ext.intersphinx," + "sphinx.ext.coverage," + "sphinx.ext.napoleon," + "sphinx.ext.todo," + "sphinx.ext.viewcode," + "recommonmark" + ), + "-b", + "html", + "-d", + os.path.join("docs", "_build", "doctrees", ""), + os.path.join("docs", ""), + os.path.join("docs", "_build", "html", ""), + ) + + +@nox.session(python=UNIT_TEST_PYTHON_VERSIONS[-1]) +@nox.parametrize( + "protobuf_implementation", + ["python", "upb"], +) +def prerelease_deps(session, protobuf_implementation): + """Run all tests with prerelease versions of dependencies installed.""" + + # Install all test dependencies + session.install("mock", "pytest", "pytest-cov", "brotli") + + # Install dependencies needed for system tests + session.install( + "google-cloud-pubsub", + "google-cloud-kms", + "google-cloud-testutils", + "google-cloud-iam", + ) + + # Install all dependencies + session.install("-e", ".[protobuf, tracing]") + + prerel_deps = [ + "google-api-core", + "google-auth", + "google-cloud-core", + "google-crc32c", + "google-resumable-media", + "opentelemetry-api", + "protobuf", + ] + + package_namespaces = { + "google-api-core": "google.api_core", + "google-auth": "google.auth", + "google-cloud-core": "google.cloud.version", + "opentelemetry-api": "opentelemetry.version", + "protobuf": "google.protobuf", + } + + for dep in prerel_deps: + session.install("--pre", "--no-deps", "--upgrade", dep) + print(f"Installed {dep}") + + version_namespace = package_namespaces.get(dep) + + if version_namespace: + session.run( + "python", + "-c", + f"import {version_namespace}; print({version_namespace}.__version__)", + ) + # Remaining dependencies + other_deps = [ + "requests", + ] + session.install(*other_deps) + + session.run( + "py.test", + "tests/unit", + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) + + session.run( + "py.test", + "--verbose", + f"--junitxml=system_{session.python}_sponge_log.xml", + os.path.join("tests", "system"), + *session.posargs, + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) diff --git a/.librarian/generator-input/setup.py b/.librarian/generator-input/setup.py new file mode 100644 index 000000000..2c4504749 --- /dev/null +++ b/.librarian/generator-input/setup.py @@ -0,0 +1,107 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import io +import os + +import setuptools + + +# Package metadata. + +name = "google-cloud-storage" +description = "Google Cloud Storage API client library" +# Should be one of: +# 'Development Status :: 3 - Alpha' +# 'Development Status :: 4 - Beta' +# 'Development Status :: 5 - Production/Stable' +release_status = "Development Status :: 5 - Production/Stable" +dependencies = [ + "google-auth >= 2.26.1, < 3.0.0", + "google-api-core >= 2.27.0, < 3.0.0", + "google-cloud-core >= 2.4.2, < 3.0.0", + # The dependency "google-resumable-media" is no longer used. However, the + # dependency is still included here to accommodate users who may be + # importing exception classes from the google-resumable-media without + # installing it explicitly. See the python-storage README for details on + # exceptions and importing. Users who are not importing + # google-resumable-media classes in their application can safely disregard + # this dependency. + "google-resumable-media >= 2.7.2, < 3.0.0", + "requests >= 2.22.0, < 3.0.0", + "google-crc32c >= 1.1.3, < 2.0.0", +] +extras = { + "protobuf": ["protobuf >= 3.20.2, < 7.0.0"], + "tracing": [ + "opentelemetry-api >= 1.1.0, < 2.0.0", + ], +} + + +# Setup boilerplate below this line. + +package_root = os.path.abspath(os.path.dirname(__file__)) + +version = {} +with open(os.path.join(package_root, "google/cloud/storage/version.py")) as fp: + exec(fp.read(), version) +version = version["__version__"] + +readme_filename = os.path.join(package_root, "README.rst") +with io.open(readme_filename, encoding="utf-8") as readme_file: + readme = readme_file.read() + +# Only include packages under the 'google' namespace. Do not include tests, +# benchmarks, etc. +packages = [ + package + for package in setuptools.find_namespace_packages() + if package.startswith("google") +] + + +setuptools.setup( + name=name, + version=version, + description=description, + long_description=readme, + author="Google LLC", + author_email="googleapis-packages@google.com", + license="Apache 2.0", + url="https://github.com/googleapis/python-storage", + classifiers=[ + release_status, + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Operating System :: OS Independent", + "Topic :: Internet", + ], + platforms="Posix; MacOS X; Windows", + packages=packages, + install_requires=dependencies, + extras_require=extras, + python_requires=">=3.7", + include_package_data=True, + zip_safe=False, +) diff --git a/.librarian/state.yaml b/.librarian/state.yaml new file mode 100644 index 000000000..1502e804d --- /dev/null +++ b/.librarian/state.yaml @@ -0,0 +1,31 @@ +image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 +libraries: + - id: google-cloud-storage + version: 3.6.0 + last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab + apis: + - path: google/storage/v2 + service_config: storage_v2.yaml + source_roots: + - . + preserve_regex: [] + remove_regex: + - ^.flake8 + - ^.pre-commit-config.yaml + - ^.trampolinerc + - ^.repo-metadata.json + - ^LICENSE + - ^MANIFEST.in + - ^SECURITY.md + - ^mypy.ini + - ^noxfile.py + - ^renovate.json + - ^setup.py + - ^docs/summary_overview.md + - ^google/cloud/_storage_v2 + - ^samples/generated_samples + - ^testing/constraints-3.8.txt + - ^testing/constraints-3.1.* + - ^tests/__init__.py + - ^tests/unit/gapic + tag_format: v{version} diff --git a/google/cloud/_storage_v2/gapic_version.py b/google/cloud/_storage_v2/gapic_version.py index 20a9cd975..d69b0530e 100644 --- a/google/cloud/_storage_v2/gapic_version.py +++ b/google/cloud/_storage_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.0.0" # {x-release-please-version} +__version__ = "3.6.0" # {x-release-please-version} diff --git a/noxfile.py b/noxfile.py index 451fced3e..16cf97b01 100644 --- a/noxfile.py +++ b/noxfile.py @@ -74,9 +74,7 @@ def lint(session): session.run("flake8", "google", "tests") -# Use a python runtime which is available in the owlbot post processor here -# https://github.com/googleapis/synthtool/blob/master/docker/owlbot/python/Dockerfile -@nox.session(python=["3.10", DEFAULT_PYTHON_VERSION]) +@nox.session(python="3.14") def blacken(session): """Run black. diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json index b2448bff2..4af7ef641 100644 --- a/samples/generated_samples/snippet_metadata_google.storage.v2.json +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage", - "version": "0.0.0" + "version": "3.6.0" }, "snippets": [ { diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index 9c17b387b..151762409 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -5,7 +5,7 @@ # e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", # Then this file should have google-cloud-foo==1.14.0 google-auth==2.26.1 -google-api-core==2.15.0 +google-api-core==2.27.0 google-cloud-core==2.4.2 google-resumable-media==2.7.2 requests==2.22.0 diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index ccf6c1493..f022e9e1c 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -5,7 +5,7 @@ # e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", # Then this file should have google-cloud-foo==1.14.0 google-auth==2.26.1 -google-api-core>=2.15.0 +google-api-core==2.27.0 google-cloud-core==2.4.2 google-resumable-media==2.7.2 requests==2.22.0 From b4134054f57e8767df3d62ee36dcbe3a83e6bfaa Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 19 Nov 2025 15:58:52 +0530 Subject: [PATCH 421/509] feat(zb-experimental): implement flush, close and finalize (#1619) feat(zb-experimental): implement flush, close and finalize --- .../asyncio/async_appendable_object_writer.py | 44 +++++++-- .../test_async_appendable_object_writer.py | 97 +++++++++++++++++-- 2 files changed, 125 insertions(+), 16 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 319c7964b..90dabc829 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -114,7 +114,11 @@ def __init__( self.persisted_size: Optional[int] = None async def state_lookup(self) -> int: - """Returns the persisted_size.""" + """Returns the persisted_size + + :rtype: int + :returns: persisted size. + """ await self.write_obj_stream.send( _storage_v2.BidiWriteObjectRequest( state_lookup=True, @@ -142,18 +146,44 @@ async def append(self, data: bytes): raise NotImplementedError("append is not implemented yet.") async def flush(self) -> int: - """Returns persisted_size""" - raise NotImplementedError("flush is not implemented yet.") + """Flushes the data to the server. + + :rtype: int + :returns: The persisted size after flush. + """ + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + flush=True, + state_lookup=True, + ) + ) + response = await self.write_obj_stream.recv() + self.persisted_size = response.persisted_size + self.offset = self.persisted_size + return self.persisted_size async def close(self, finalize_on_close=False) -> int: """Returns persisted_size""" - raise NotImplementedError("close is not implemented yet.") + if finalize_on_close: + await self.finalize() + + await self.write_obj_stream.close() + self._is_stream_open = False + self.offset = None + + async def finalize(self) -> _storage_v2.Object: + """Finalizes the Appendable Object. - async def finalize(self) -> int: - """Returns persisted_size Note: Once finalized no more data can be appended. + + rtype: google.cloud.storage_v2.types.Object + returns: The finalized object resource. """ - raise NotImplementedError("finalize is not implemented yet.") + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest(finish_write=True) + ) + response = await self.write_obj_stream.recv() + self.object_resource = response.resource # helper methods. async def append_from_string(self, data: str): diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 67a074a11..18f7a8826 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -171,15 +171,6 @@ async def test_unimplemented_methods_raise_error(mock_client): with pytest.raises(NotImplementedError): await writer.append(b"data") - with pytest.raises(NotImplementedError): - await writer.flush() - - with pytest.raises(NotImplementedError): - await writer.close() - - with pytest.raises(NotImplementedError): - await writer.finalize() - with pytest.raises(NotImplementedError): await writer.append_from_string("data") @@ -188,3 +179,91 @@ async def test_unimplemented_methods_raise_error(mock_client): with pytest.raises(NotImplementedError): await writer.append_from_file("file.txt") + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_flush(mock_write_object_stream, mock_client): + """Test that flush sends the correct request and updates state.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=1024) + ) + + persisted_size = await writer.flush() + + expected_request = _storage_v2.BidiWriteObjectRequest(flush=True, state_lookup=True) + mock_stream.send.assert_awaited_once_with(expected_request) + mock_stream.recv.assert_awaited_once() + assert writer.persisted_size == 1024 + assert writer.offset == 1024 + assert persisted_size == 1024 + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_close_without_finalize(mock_write_object_stream, mock_client): + """Test close without finalizing.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.offset = 1024 + mock_stream = mock_write_object_stream.return_value + mock_stream.close = mock.AsyncMock() + writer.finalize = mock.AsyncMock() + + await writer.close(finalize_on_close=False) + + writer.finalize.assert_not_awaited() + mock_stream.close.assert_awaited_once() + assert not writer._is_stream_open + assert writer.offset is None + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_close_with_finalize(mock_write_object_stream, mock_client): + """Test close with finalizing.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.offset = 1024 + mock_stream = mock_write_object_stream.return_value + mock_stream.close = mock.AsyncMock() + writer.finalize = mock.AsyncMock() + + await writer.close(finalize_on_close=True) + + writer.finalize.assert_awaited_once() + mock_stream.close.assert_awaited_once() + assert not writer._is_stream_open + assert writer.offset is None + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_finalize(mock_write_object_stream, mock_client): + """Test that finalize sends the correct request and updates state.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + mock_resource = _storage_v2.Object(name=OBJECT, bucket=BUCKET) + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse(resource=mock_resource) + ) + + await writer.finalize() + + mock_stream.send.assert_awaited_once_with( + _storage_v2.BidiWriteObjectRequest(finish_write=True) + ) + mock_stream.recv.assert_awaited_once() + assert writer.object_resource == mock_resource From af2d1f1bf60482bd93795ebfa529a23c20d3a9fa Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Wed, 19 Nov 2025 12:04:18 -0500 Subject: [PATCH 422/509] chore(librarian): remove owlbot configs which was missed in #1625 (#1629) Follow up to #1625 --- .github/.OwlBot.lock.yaml | 17 ----------------- .github/.OwlBot.yaml | 29 ----------------------------- 2 files changed, 46 deletions(-) delete mode 100644 .github/.OwlBot.lock.yaml delete mode 100644 .github/.OwlBot.yaml diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml deleted file mode 100644 index 4a311db02..000000000 --- a/.github/.OwlBot.lock.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -docker: - image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:543e209e7c1c1ffe720eb4db1a3f045a75099304fb19aa11a47dc717b8aae2a9 -# created: 2025-10-09T14:48:42.914384887Z diff --git a/.github/.OwlBot.yaml b/.github/.OwlBot.yaml deleted file mode 100644 index 67768efb5..000000000 --- a/.github/.OwlBot.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -docker: - image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - -deep-remove-regex: - - /owl-bot-staging - -# In source, we've used two capturing groups (v2) and (.*) to match the version -# and the directory path. -# In dest, we use $1 to refer to the first capturing group (v2) and $2 to refer -# to the second capturing group (directory path). -deep-copy-regex: - - source: /google/storage/(v2)/storage-v2-py/(.*) - dest: /owl-bot-staging/$1/$2 - -begin-after-commit-hash: 6acf4a0a797f1082027985c55c4b14b60f673dd7 From 46a5728c76a12f6375d95cabce69f8b78490eab2 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Thu, 20 Nov 2025 11:58:56 +0530 Subject: [PATCH 423/509] samples: add samples for partial list bucket (#1627) Add samples for the partial list bucket feature. --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../storage_list_buckets_partial_success.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 samples/snippets/storage_list_buckets_partial_success.py diff --git a/samples/snippets/storage_list_buckets_partial_success.py b/samples/snippets/storage_list_buckets_partial_success.py new file mode 100644 index 000000000..bea4c9ed3 --- /dev/null +++ b/samples/snippets/storage_list_buckets_partial_success.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Copyright 2025 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_list_buckets_partial_success] +from google.cloud import storage + + +def list_buckets_with_partial_success(): + """Lists buckets and includes unreachable buckets in the response.""" + + storage_client = storage.Client() + + buckets_iterator = storage_client.list_buckets(return_partial_success=True) + + for page in buckets_iterator.pages: + if page.unreachable: + print("Unreachable locations in this page:") + for location in page.unreachable: + print(location) + + print("Reachable buckets in this page:") + for bucket in page: + print(bucket.name) + + +# [END storage_list_buckets_partial_success] + + +if __name__ == "__main__": + list_buckets_with_partial_success() From 8c25c1b5689fa0e8f3d38b9b03bc9d0267a9a2aa Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 20 Nov 2025 18:34:55 +0530 Subject: [PATCH 424/509] fix(zb-experimental): pass creds to grpc channel (#1623) fix(zb-experimental): pass creds to grpc channel --- .../asyncio/async_grpc_client.py | 6 +- tests/unit/asyncio/test_async_grpc_client.py | 77 ++++++++++++++++--- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py index 75e6f63d2..a5cccca59 100644 --- a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py +++ b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py @@ -65,8 +65,10 @@ def _create_async_grpc_client( transport_cls = storage_v2.StorageAsyncClient.get_transport_class( "grpc_asyncio" ) - channel = transport_cls.create_channel(attempt_direct_path=attempt_direct_path) - transport = transport_cls(credentials=credentials, channel=channel) + channel = transport_cls.create_channel( + attempt_direct_path=attempt_direct_path, credentials=credentials + ) + transport = transport_cls(channel=channel) return storage_v2.StorageAsyncClient( transport=transport, diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index 0e2bf9b50..eb06ab938 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -15,6 +15,7 @@ import unittest from unittest import mock from google.auth import credentials as auth_credentials +from google.auth.credentials import AnonymousCredentials def _make_credentials(spec=None): @@ -38,12 +39,10 @@ def test_constructor_default_options(self, mock_async_storage_client): "grpc_asyncio" ) mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=True + attempt_direct_path=True, credentials=mock_creds ) mock_channel = mock_transport_cls.create_channel.return_value - mock_transport_cls.assert_called_once_with( - credentials=mock_creds, channel=mock_channel - ) + mock_transport_cls.assert_called_once_with(channel=mock_channel) mock_transport = mock_transport_cls.return_value mock_async_storage_client.assert_called_once_with( transport=mock_transport, @@ -64,21 +63,77 @@ def test_constructor_disables_directpath(self, mock_async_storage_client): ) mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=False + attempt_direct_path=False, credentials=mock_creds ) mock_channel = mock_transport_cls.create_channel.return_value - mock_transport_cls.assert_called_once_with( - credentials=mock_creds, channel=mock_channel - ) + mock_transport_cls.assert_called_once_with(channel=mock_channel) @mock.patch("google.cloud._storage_v2.StorageAsyncClient") - def test_grpc_client_property(self, mock_async_storage_client): + def test_grpc_client_property(self, mock_grpc_gapic_client): from google.cloud.storage._experimental.asyncio import async_grpc_client + # Arrange + mock_transport_cls = mock.MagicMock() + mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls + channel_sentinel = mock.sentinel.channel + + mock_transport_cls.create_channel.return_value = channel_sentinel + mock_transport_cls.return_value = mock.sentinel.transport + mock_creds = _make_credentials() + mock_client_info = mock.sentinel.client_info + mock_client_options = mock.sentinel.client_options + mock_attempt_direct_path = mock.sentinel.attempt_direct_path + + # Act + client = async_grpc_client.AsyncGrpcClient( + credentials=mock_creds, + client_info=mock_client_info, + client_options=mock_client_options, + attempt_direct_path=mock_attempt_direct_path, + ) + + mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls + + mock_transport_cls.create_channel.return_value = channel_sentinel + mock_transport_instance = mock.sentinel.transport + mock_transport_cls.return_value = mock_transport_instance + + retrieved_client = client.grpc_client + + # Assert + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=mock_attempt_direct_path, credentials=mock_creds + ) + mock_transport_cls.assere_with(channel=channel_sentinel) + mock_grpc_gapic_client.assert_called_once_with( + transport=mock_transport_instance, + client_info=mock_client_info, + client_options=mock_client_options, + ) + self.assertIs(retrieved_client, mock_grpc_gapic_client.return_value) - client = async_grpc_client.AsyncGrpcClient(credentials=mock_creds) + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): + from google.cloud.storage._experimental.asyncio import async_grpc_client + # Arrange + mock_transport_cls = mock.MagicMock() + mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls + channel_sentinel = mock.sentinel.channel + + mock_transport_cls.create_channel.return_value = channel_sentinel + mock_transport_cls.return_value = mock.sentinel.transport + + # Act + anonymous_creds = AnonymousCredentials() + client = async_grpc_client.AsyncGrpcClient(credentials=anonymous_creds) retrieved_client = client.grpc_client - self.assertIs(retrieved_client, mock_async_storage_client.return_value) + # Assert + self.assertIs(retrieved_client, mock_grpc_gapic_client.return_value) + + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=True, credentials=anonymous_creds + ) + mock_transport_cls.assert_called_once_with(channel=channel_sentinel) From 1c6b76f055a5d37fa35197198bfa68902832d1b5 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 21 Nov 2025 12:00:24 +0530 Subject: [PATCH 425/509] feat(zb-experimental): implement append (#1620) feat(zb-experimental): implement append --- .../asyncio/async_appendable_object_writer.py | 106 ++++++++- .../test_async_appendable_object_writer.py | 225 ++++++++++++++++-- 2 files changed, 310 insertions(+), 21 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 90dabc829..5c3e54d71 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -21,7 +21,7 @@ if you want to use these Rapid Storage APIs. """ -from typing import Optional +from typing import Optional, Union from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import ( AsyncGrpcClient, @@ -31,6 +31,10 @@ ) +_MAX_CHUNK_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB +_MAX_BUFFER_SIZE_BYTES = 16 * 1024 * 1024 # 16 MiB + + class AsyncAppendableObjectWriter: """Class for appending data to a GCS Appendable Object asynchronously.""" @@ -118,7 +122,13 @@ async def state_lookup(self) -> int: :rtype: int :returns: persisted size. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before state_lookup().") + await self.write_obj_stream.send( _storage_v2.BidiWriteObjectRequest( state_lookup=True, @@ -129,7 +139,11 @@ async def state_lookup(self) -> int: return self.persisted_size async def open(self) -> None: - """Opens the underlying bidi-gRPC stream.""" + """Opens the underlying bidi-gRPC stream. + + :raises ValueError: If the stream is already open. + + """ if self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is already open") @@ -142,15 +156,65 @@ async def open(self) -> None: # Update self.persisted_size _ = await self.state_lookup() - async def append(self, data: bytes): - raise NotImplementedError("append is not implemented yet.") + async def append(self, data: bytes) -> None: + """Appends data to the Appendable object. + + This method sends the provided data to the GCS server in chunks. It + maintains an internal threshold `_MAX_BUFFER_SIZE_BYTES` and will + automatically flush the data to make it visible to readers when that + threshold has reached. + + :type data: bytes + :param data: The bytes to append to the object. + + :rtype: None + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + """ + + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before append().") + total_bytes = len(data) + if total_bytes == 0: + # TODO: add warning. + return + if self.offset is None: + assert self.persisted_size is not None + self.offset = self.persisted_size + + start_idx = 0 + bytes_to_flush = 0 + while start_idx < total_bytes: + end_idx = min(start_idx + _MAX_CHUNK_SIZE_BYTES, total_bytes) + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + write_offset=self.offset, + checksummed_data=_storage_v2.ChecksummedData( + content=data[start_idx:end_idx] + ), + ) + ) + chunk_size = end_idx - start_idx + self.offset += chunk_size + bytes_to_flush += chunk_size + if bytes_to_flush >= _MAX_BUFFER_SIZE_BYTES: + await self.flush() + bytes_to_flush = 0 + start_idx = end_idx async def flush(self) -> int: """Flushes the data to the server. :rtype: int :returns: The persisted size after flush. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before flush().") + await self.write_obj_stream.send( _storage_v2.BidiWriteObjectRequest( flush=True, @@ -162,14 +226,34 @@ async def flush(self) -> int: self.offset = self.persisted_size return self.persisted_size - async def close(self, finalize_on_close=False) -> int: - """Returns persisted_size""" + async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object]: + """Closes the underlying bidi-gRPC stream. + + :type finalize_on_close: bool + :param finalize_on_close: Finalizes the Appendable Object. No more data + can be appended. + + rtype: Union[int, _storage_v2.Object] + returns: Updated `self.persisted_size` by default after closing the + bidi-gRPC stream. However, if `finalize_on_close=True` is passed, + returns the finalized object resource. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before close().") + if finalize_on_close: await self.finalize() + else: + await self.flush() + await self.write_obj_stream.close() - await self.write_obj_stream.close() self._is_stream_open = False self.offset = None + return self.object_resource if finalize_on_close else self.persisted_size async def finalize(self) -> _storage_v2.Object: """Finalizes the Appendable Object. @@ -178,12 +262,20 @@ async def finalize(self) -> _storage_v2.Object: rtype: google.cloud.storage_v2.types.Object returns: The finalized object resource. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before finalize().") + await self.write_obj_stream.send( _storage_v2.BidiWriteObjectRequest(finish_write=True) ) response = await self.write_obj_stream.recv() self.object_resource = response.resource + self.persisted_size = self.object_resource.size + return self.object_resource # helper methods. async def append_from_string(self, data: str): diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 18f7a8826..902ed5f8b 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -93,6 +93,7 @@ async def test_state_lookup(mock_write_object_stream, mock_client): """Test state_lookup method.""" # Arrange writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() mock_stream.recv = mock.AsyncMock( @@ -111,6 +112,17 @@ async def test_state_lookup(mock_write_object_stream, mock_client): assert response == PERSISTED_SIZE +@pytest.mark.asyncio +async def test_state_lookup_without_open_raises_value_error(mock_client): + """Test that state_lookup raises an error if the stream is not open.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, + match="Stream is not open. Call open\\(\\) before state_lookup\\(\\).", + ): + await writer.state_lookup() + + @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" @@ -168,9 +180,6 @@ async def test_unimplemented_methods_raise_error(mock_client): """Test that all currently unimplemented methods raise NotImplementedError.""" writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises(NotImplementedError): - await writer.append(b"data") - with pytest.raises(NotImplementedError): await writer.append_from_string("data") @@ -188,6 +197,7 @@ async def test_unimplemented_methods_raise_error(mock_client): async def test_flush(mock_write_object_stream, mock_client): """Test that flush sends the correct request and updates state.""" writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() mock_stream.recv = mock.AsyncMock( @@ -204,46 +214,79 @@ async def test_flush(mock_write_object_stream, mock_client): assert persisted_size == 1024 +@pytest.mark.asyncio +async def test_flush_without_open_raises_value_error(mock_client): + """Test that flush raises an error if the stream is not open.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, match="Stream is not open. Call open\\(\\) before flush\\(\\)." + ): + await writer.flush() + + @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" ) -async def test_close_without_finalize(mock_write_object_stream, mock_client): - """Test close without finalizing.""" +async def test_close(mock_write_object_stream, mock_client): writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) writer._is_stream_open = True writer.offset = 1024 mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=1024) + ) mock_stream.close = mock.AsyncMock() writer.finalize = mock.AsyncMock() - await writer.close(finalize_on_close=False) + persisted_size = await writer.close() writer.finalize.assert_not_awaited() mock_stream.close.assert_awaited_once() - assert not writer._is_stream_open assert writer.offset is None + assert persisted_size == 1024 + assert not writer._is_stream_open + + +@pytest.mark.asyncio +async def test_close_without_open_raises_value_error(mock_client): + """Test that close raises an error if the stream is not open.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, match="Stream is not open. Call open\\(\\) before close\\(\\)." + ): + await writer.close() @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" ) -async def test_close_with_finalize(mock_write_object_stream, mock_client): +async def test_finalize_on_close(mock_write_object_stream, mock_client): """Test close with finalizing.""" + # Arrange + mock_resource = _storage_v2.Object(name=OBJECT, bucket=BUCKET, size=2048) writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) writer._is_stream_open = True writer.offset = 1024 mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse(resource=mock_resource) + ) mock_stream.close = mock.AsyncMock() - writer.finalize = mock.AsyncMock() - await writer.close(finalize_on_close=True) + # Act + result = await writer.close(finalize_on_close=True) - writer.finalize.assert_awaited_once() - mock_stream.close.assert_awaited_once() + # Assert + mock_stream.close.assert_not_awaited() # Based on new implementation assert not writer._is_stream_open assert writer.offset is None + assert writer.object_resource == mock_resource + assert writer.persisted_size == 2048 + assert result == mock_resource @pytest.mark.asyncio @@ -253,17 +296,171 @@ async def test_close_with_finalize(mock_write_object_stream, mock_client): async def test_finalize(mock_write_object_stream, mock_client): """Test that finalize sends the correct request and updates state.""" writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + mock_resource = _storage_v2.Object(name=OBJECT, bucket=BUCKET, size=123) mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - mock_resource = _storage_v2.Object(name=OBJECT, bucket=BUCKET) mock_stream.recv = mock.AsyncMock( return_value=_storage_v2.BidiWriteObjectResponse(resource=mock_resource) ) - await writer.finalize() + gcs_object = await writer.finalize() mock_stream.send.assert_awaited_once_with( _storage_v2.BidiWriteObjectRequest(finish_write=True) ) mock_stream.recv.assert_awaited_once() assert writer.object_resource == mock_resource + assert writer.persisted_size == 123 + assert gcs_object == mock_resource + + +@pytest.mark.asyncio +async def test_finalize_without_open_raises_value_error(mock_client): + """Test that finalize raises an error if the stream is not open.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, match="Stream is not open. Call open\\(\\) before finalize\\(\\)." + ): + await writer.finalize() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_append_raises_error_if_not_open(mock_write_object_stream, mock_client): + """Test that append raises an error if the stream is not open.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, match="Stream is not open. Call open\\(\\) before append\\(\\)." + ): + await writer.append(b"some data") + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_append_with_empty_data(mock_write_object_stream, mock_client): + """Test that append does nothing if data is empty.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + + await writer.append(b"") + + mock_stream.send.assert_not_awaited() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client): + """Test that append sends data in chunks and updates offset.""" + from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + _MAX_CHUNK_SIZE_BYTES, + ) + + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.persisted_size = 100 + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + writer.flush = mock.AsyncMock() + + data = b"a" * (_MAX_CHUNK_SIZE_BYTES + 1) + await writer.append(data) + + assert mock_stream.send.await_count == 2 + first_call = mock_stream.send.await_args_list[0] + second_call = mock_stream.send.await_args_list[1] + + # First chunk + assert first_call[0][0].write_offset == 100 + assert len(first_call[0][0].checksummed_data.content) == _MAX_CHUNK_SIZE_BYTES + + # Second chunk + assert second_call[0][0].write_offset == 100 + _MAX_CHUNK_SIZE_BYTES + assert len(second_call[0][0].checksummed_data.content) == 1 + + assert writer.offset == 100 + len(data) + writer.flush.assert_not_awaited() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_append_flushes_when_buffer_is_full( + mock_write_object_stream, mock_client +): + """Test that append flushes the stream when the buffer size is reached.""" + from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + _MAX_BUFFER_SIZE_BYTES, + ) + + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.persisted_size = 0 + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + writer.flush = mock.AsyncMock() + + data = b"a" * _MAX_BUFFER_SIZE_BYTES + await writer.append(data) + + writer.flush.assert_awaited_once() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_append_handles_large_data(mock_write_object_stream, mock_client): + """Test that append handles data larger than the buffer size.""" + from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + _MAX_BUFFER_SIZE_BYTES, + ) + + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.persisted_size = 0 + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + writer.flush = mock.AsyncMock() + + data = b"a" * (_MAX_BUFFER_SIZE_BYTES * 2 + 1) + await writer.append(data) + + assert writer.flush.await_count == 2 + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_append_data_two_times(mock_write_object_stream, mock_client): + """Test that append sends data correctly when called multiple times.""" + from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + _MAX_CHUNK_SIZE_BYTES, + ) + + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.persisted_size = 0 + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + writer.flush = mock.AsyncMock() + + data1 = b"a" * (_MAX_CHUNK_SIZE_BYTES + 10) + await writer.append(data1) + + data2 = b"b" * (_MAX_CHUNK_SIZE_BYTES + 20) + await writer.append(data2) + + total_data_length = len(data1) + len(data2) + assert writer.offset == total_data_length + assert writer.flush.await_count == 0 From fcda23375c52b994f3b57d005f074f7243ade8e7 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 26 Nov 2025 14:11:37 +0530 Subject: [PATCH 426/509] chore: Add Sys test for move blob where name needs url encoding (#1624) Sys test for move blob. Add System test for bukect.move_blob where blob name needs url encoding. The fix was done in https://github.com/googleapis/python-storage/pull/1605 --- tests/system/test_bucket.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index de7074a92..32806bd4c 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -472,6 +472,36 @@ def test_bucket_move_blob_hns( assert source_gen != dest.generation +def test_bucket_move_blob_with_name_needs_encoding( + storage_client, + buckets_to_delete, + blobs_to_delete, +): + payload = b"move_blob_with_name_which_has_a_char_that_needs_url_encoding" + + bucket_name = _helpers.unique_name("move-blob") + bucket_obj = storage_client.bucket(bucket_name) + created = _helpers.retry_429_503(storage_client.create_bucket)(bucket_obj) + buckets_to_delete.append(created) + + source = created.blob("source") + source_gen = source.generation + source.upload_from_string(payload) + blobs_to_delete.append(source) + + dest = created.move_blob( + source, + "dest/dest_file.txt", + if_source_generation_match=source.generation, + if_source_metageneration_match=source.metageneration, + ) + blobs_to_delete.append(dest) + + assert dest.download_as_bytes() == payload + assert dest.generation is not None + assert source_gen != dest.generation + + def test_bucket_get_blob_with_user_project( storage_client, buckets_to_delete, From 9e6fefdc24a12a9189f7119bc9119e84a061842f Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 28 Nov 2025 11:36:06 +0530 Subject: [PATCH 427/509] fix: Add simple flush for optimized writes (#1633) fix: Add simple flush for optimized writes --- .../asyncio/async_appendable_object_writer.py | 20 +++++++- .../test_async_appendable_object_writer.py | 48 +++++++++++++++---- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 5c3e54d71..d34c844d5 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -199,10 +199,28 @@ async def append(self, data: bytes) -> None: self.offset += chunk_size bytes_to_flush += chunk_size if bytes_to_flush >= _MAX_BUFFER_SIZE_BYTES: - await self.flush() + await self.simple_flush() bytes_to_flush = 0 start_idx = end_idx + async def simple_flush(self) -> None: + """Flushes the data to the server. + Please note: Unlike `flush` it does not do `state_lookup` + + :rtype: None + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before simple_flush().") + + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + flush=True, + ) + ) + async def flush(self) -> int: """Flushes the data to the server. diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 902ed5f8b..a75824f8b 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -224,6 +224,38 @@ async def test_flush_without_open_raises_value_error(mock_client): await writer.flush() +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_simple_flush(mock_write_object_stream, mock_client): + """Test that flush sends the correct request and updates state.""" + # Arrange + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + mock_stream = mock_write_object_stream.return_value + mock_stream.send = mock.AsyncMock() + + # Act + await writer.simple_flush() + + # Assert + mock_stream.send.assert_awaited_once_with( + _storage_v2.BidiWriteObjectRequest(flush=True) + ) + + +@pytest.mark.asyncio +async def test_simple_flush_without_open_raises_value_error(mock_client): + """Test that flush raises an error if the stream is not open.""" + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + with pytest.raises( + ValueError, + match="Stream is not open. Call open\\(\\) before simple_flush\\(\\).", + ): + await writer.simple_flush() + + @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" @@ -369,7 +401,7 @@ async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client writer.persisted_size = 100 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.flush = mock.AsyncMock() + writer.simple_flush = mock.AsyncMock() data = b"a" * (_MAX_CHUNK_SIZE_BYTES + 1) await writer.append(data) @@ -387,7 +419,7 @@ async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client assert len(second_call[0][0].checksummed_data.content) == 1 assert writer.offset == 100 + len(data) - writer.flush.assert_not_awaited() + writer.simple_flush.assert_not_awaited() @pytest.mark.asyncio @@ -407,12 +439,12 @@ async def test_append_flushes_when_buffer_is_full( writer.persisted_size = 0 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.flush = mock.AsyncMock() + writer.simple_flush = mock.AsyncMock() data = b"a" * _MAX_BUFFER_SIZE_BYTES await writer.append(data) - writer.flush.assert_awaited_once() + writer.simple_flush.assert_awaited_once() @pytest.mark.asyncio @@ -430,12 +462,12 @@ async def test_append_handles_large_data(mock_write_object_stream, mock_client): writer.persisted_size = 0 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.flush = mock.AsyncMock() + writer.simple_flush = mock.AsyncMock() data = b"a" * (_MAX_BUFFER_SIZE_BYTES * 2 + 1) await writer.append(data) - assert writer.flush.await_count == 2 + assert writer.simple_flush.await_count == 2 @pytest.mark.asyncio @@ -453,7 +485,7 @@ async def test_append_data_two_times(mock_write_object_stream, mock_client): writer.persisted_size = 0 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.flush = mock.AsyncMock() + writer.simple_flush = mock.AsyncMock() data1 = b"a" * (_MAX_CHUNK_SIZE_BYTES + 10) await writer.append(data1) @@ -463,4 +495,4 @@ async def test_append_data_two_times(mock_write_object_stream, mock_client): total_data_length = len(data1) + len(data2) assert writer.offset == total_data_length - assert writer.flush.await_count == 0 + assert writer.simple_flush.await_count == 0 From a1c25073e353c317574f9dbdad19e29566f96d65 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 4 Dec 2025 23:38:48 +0530 Subject: [PATCH 428/509] chore: fix conformance test failure due to VM's API version mismatch. (#1635) Conformance tests were failing due to Docker API version mismatch in the kokoro's VM and docker client. This PR pins the `DOCKER_API_VERSION` to 1.39 RCA for kokoro failures - https://screenshot.googleplex.com/4zsxoQ8UxqWnTky. `Error response from daemon: client version 1.52 is too new. Maximum supported API version is 1.39` --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 16cf97b01..b89b9d319 100644 --- a/noxfile.py +++ b/noxfile.py @@ -232,7 +232,7 @@ def conftest_retry(session): test_cmd = ["py.test", "-n", "auto", "--quiet", conformance_test_folder_path] # Run py.test against the conformance tests. - session.run(*test_cmd) + session.run(*test_cmd, env={"DOCKER_API_VERSION": "1.39"}) @nox.session(python=DEFAULT_PYTHON_VERSION) From 6ab8d9240ccade0a7a9570d03713ffb81a9efa86 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 5 Dec 2025 20:40:41 +0530 Subject: [PATCH 429/509] chore: Add gRPC packages under extra-dependencies (#1640) Add gRPC packages under extra-dependencies Since gRPC in Python SDK is still under `_experimental` directory. Keeping grpc packages under extra-dependencies. These should be moved into mandatory dependencies once gRPC is out of `_experimental` . See - b/465352227 --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- setup.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/setup.py b/setup.py index 2c4504749..374a71cf4 100644 --- a/setup.py +++ b/setup.py @@ -43,6 +43,18 @@ "google-crc32c >= 1.1.3, < 2.0.0", ] extras = { + # TODO: Make these extra dependencies as mandatory once gRPC out of + # experimental in this SDK. More info in b/465352227 + "grpc": [ + "google-api-core[grpc] >= 2.27.0, < 3.0.0", + "grpcio >= 1.33.2, < 2.0.0; python_version < '3.14'", + "grpcio >= 1.75.1, < 2.0.0; python_version >= '3.14'", + "grpcio-status >= 1.76.0, < 2.0.0", + "proto-plus >= 1.22.3, <2.0.0; python_version < '3.13'", + "proto-plus >= 1.25.0, <2.0.0; python_version >= '3.13'", + "protobuf>=3.20.2,<7.0.0,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0", + ], "protobuf": ["protobuf >= 3.20.2, < 7.0.0"], "tracing": [ "opentelemetry-api >= 1.1.0, < 2.0.0", From 6ed12b97126ab936b6033a16d5e61ef424e94b37 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 8 Dec 2025 09:50:49 +0530 Subject: [PATCH 430/509] chore: fix failing system test due to version upgrade of urllib3 (#1651) chore: fix failing system tests due to version upgrade of urllib3. [2.6.0](https://urllib3.readthedocs.io/en/stable/changelog.html#id1) of urllib3 added security fixes for compressed data reads, which caused issues from #1642 to #1649 This PR temporarily mitigates failing system test to unblock other PRs. Actual fix will be tracked in b/466813444 --- testing/constraints-3.12.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/testing/constraints-3.12.txt b/testing/constraints-3.12.txt index ef1c92fff..4e5f201e2 100644 --- a/testing/constraints-3.12.txt +++ b/testing/constraints-3.12.txt @@ -7,3 +7,4 @@ grpcio proto-plus protobuf grpc-google-iam-v1 +urllib3==2.5.0 \ No newline at end of file From 4c6d549c3f6f14ee73975de8250f9d975dd0fa10 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 8 Dec 2025 14:47:31 +0530 Subject: [PATCH 431/509] chore: setup system tests for zonal buckets in cloud build (#1639) Setup system tests for zonal buckets in cloud build. --- cloudbuild/run_zonal_tests.sh | 26 ++++++++ cloudbuild/zb-system-tests-cloudbuild.yaml | 70 ++++++++++++++++++++++ tests/system/test_zonal.py | 59 ++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 cloudbuild/run_zonal_tests.sh create mode 100644 cloudbuild/zb-system-tests-cloudbuild.yaml create mode 100644 tests/system/test_zonal.py diff --git a/cloudbuild/run_zonal_tests.sh b/cloudbuild/run_zonal_tests.sh new file mode 100644 index 000000000..ef94e629b --- /dev/null +++ b/cloudbuild/run_zonal_tests.sh @@ -0,0 +1,26 @@ + +set -euxo pipefail +echo '--- Installing git and cloning repository on VM ---' +sudo apt-get update && sudo apt-get install -y git python3-pip python3-venv + +# Clone the repository and checkout the specific commit from the build trigger. +git clone https://github.com/googleapis/python-storage.git +cd python-storage +git checkout ${COMMIT_SHA} + + +echo '--- Installing Python and dependencies on VM ---' +python3 -m venv env +source env/bin/activate + +echo 'Install testing libraries explicitly, as they are not in setup.py' +pip install --upgrade pip +pip install pytest pytest-timeout pytest-subtests pytest-asyncio +pip install google-cloud-testutils google-cloud-kms +pip install -e . + +echo '--- Setting up environment variables on VM ---' +export ZONAL_BUCKET=${_ZONAL_BUCKET} +export RUN_ZONAL_SYSTEM_TESTS=True +echo '--- Running Zonal tests on VM ---' +pytest -vv -s --log-format='%(asctime)s %(levelname)s %(message)s' --log-date-format='%H:%M:%S' tests/system/test_zonal.py diff --git a/cloudbuild/zb-system-tests-cloudbuild.yaml b/cloudbuild/zb-system-tests-cloudbuild.yaml new file mode 100644 index 000000000..be790ebd4 --- /dev/null +++ b/cloudbuild/zb-system-tests-cloudbuild.yaml @@ -0,0 +1,70 @@ +substitutions: + _REGION: "us-central1" + _ZONE: "us-central1-a" + _SHORT_BUILD_ID: ${BUILD_ID:0:8} + +steps: + + # Step 1 Create a GCE VM to run the tests. + # The VM is created in the same zone as the buckets to test rapid storage features. + # It's given the 'cloud-platform' scope to allow it to access GCS and other services. + - name: "gcr.io/google.com/cloudsdktool/cloud-sdk" + id: "create-vm" + entrypoint: "gcloud" + args: + - "compute" + - "instances" + - "create" + - "gcsfs-test-vm-${_SHORT_BUILD_ID}" + - "--project=${PROJECT_ID}" + - "--zone=${_ZONE}" + - "--machine-type=e2-medium" + - "--image-family=debian-13" + - "--image-project=debian-cloud" + - "--service-account=${_ZONAL_VM_SERVICE_ACCOUNT}" + - "--scopes=https://www.googleapis.com/auth/devstorage.full_control,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/devstorage.read_write" + - "--metadata=enable-oslogin=TRUE" + waitFor: ["-"] + + # Step 2: Run the integration tests inside the newly created VM and cleanup. + # This step uses 'gcloud compute ssh' to execute a remote script. + # The VM is deleted after tests are run, regardless of success. + - name: "gcr.io/google.com/cloudsdktool/cloud-sdk" + id: "run-tests-and-delete-vm" + entrypoint: "bash" + args: + - "-c" + - | + set -e + # Wait for the VM to be fully initialized and SSH to be ready. + for i in {1..10}; do + if gcloud compute ssh gcsfs-test-vm-${_SHORT_BUILD_ID} --zone=${_ZONE} --internal-ip --command="echo VM is ready"; then + break + fi + echo "Waiting for VM to become available... (attempt $i/10)" + sleep 15 + done + # copy the script to the VM + gcloud compute scp cloudbuild/run_zonal_tests.sh gcsfs-test-vm-${_SHORT_BUILD_ID}:~ --zone=${_ZONE} --internal-ip + + # Execute the script on the VM via SSH. + # Capture the exit code to ensure cleanup happens before the build fails. + set +e + gcloud compute ssh gcsfs-test-vm-${_SHORT_BUILD_ID} --zone=${_ZONE} --internal-ip --command="COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} bash run_zonal_tests.sh" + EXIT_CODE=$? + set -e + + echo "--- Deleting GCE VM ---" + gcloud compute instances delete "gcsfs-test-vm-${_SHORT_BUILD_ID}" --zone=${_ZONE} --quiet + + # Exit with the original exit code from the test script. + exit $$EXIT_CODE + waitFor: + - "create-vm" + +timeout: "3600s" # 60 minutes + +options: + logging: CLOUD_LOGGING_ONLY + pool: + name: "projects/${PROJECT_ID}/locations/us-central1/workerPools/cloud-build-worker-pool" \ No newline at end of file diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py new file mode 100644 index 000000000..909b9ddf1 --- /dev/null +++ b/tests/system/test_zonal.py @@ -0,0 +1,59 @@ +# py standard imports +import os +import uuid +from io import BytesIO + +# python additional imports +import pytest + +# current library imports +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + +pytestmark = pytest.mark.skipif( + os.getenv("RUN_ZONAL_SYSTEM_TESTS") != "True", + reason="Zonal system tests need to be explicitly enabled. This helps scheduling tests in Kokoro and Cloud Build.", +) + + +# TODO: replace this with a fixture once zonal bucket creation / deletion +# is supported in grpc client or json client client. +_ZONAL_BUCKET = os.getenv("ZONAL_BUCKET") + + +@pytest.mark.asyncio +async def test_basic_wrd(storage_client, blobs_to_delete): + bytes_to_upload = b"dummy_bytes_to_write_read_and_delete_appendable_object" + object_name = f"test_basic_wrd-{str(uuid.uuid4())}" + + # Client instantiation; it cannot be part of fixture because. + # grpc_client's event loop and event loop of coroutine running it + # (i.e. this test) must be same. + # Note: + # 1. @pytest.mark.asyncio ensures new event for each test. + # 2. we can keep the same event loop for entire module but that may + # create issues if tests are run in parallel and one test hogs the event + # loop slowing down other tests. + grpc_client = AsyncGrpcClient().grpc_client + + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(bytes_to_upload) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == len(bytes_to_upload) + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == bytes_to_upload + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) From 4e91c541363f0e583bf9dd1b81a95ff2cb618bac Mon Sep 17 00:00:00 2001 From: agrawalradhika-cell Date: Tue, 9 Dec 2025 00:26:23 +0530 Subject: [PATCH 432/509] feat: Auto enable mTLS when supported certificates are detected (#1637) The Python SDK will use a hybrid approach for mTLS enablement: If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable is set (either true or false or any value), the SDK will respect that setting. This is necessary for test scenarios and users who need to explicitly control mTLS behavior. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable is not set, the SDK will automatically enable mTLS only if it detects Managed Workload Identity (MWID) or X.509 Workforce Identity Federation (WIF) certificate sources. In other cases where the variable is not set, mTLS will remain disabled. --------- Signed-off-by: Radhika Agrawal Co-authored-by: Chandra Shekhar Sirimala --- .../_storage_v2/services/storage/client.py | 46 +++- google/cloud/storage/_helpers.py | 4 - google/cloud/storage/client.py | 14 +- tests/unit/gapic/storage_v2/test_storage.py | 254 ++++++++++++++++-- 4 files changed, 268 insertions(+), 50 deletions(-) diff --git a/google/cloud/_storage_v2/services/storage/client.py b/google/cloud/_storage_v2/services/storage/client.py index 16c76a01f..cdccf3fab 100644 --- a/google/cloud/_storage_v2/services/storage/client.py +++ b/google/cloud/_storage_v2/services/storage/client.py @@ -184,6 +184,34 @@ def _get_default_mtls_endpoint(api_endpoint): _DEFAULT_ENDPOINT_TEMPLATE = "storage.{UNIVERSE_DOMAIN}" _DEFAULT_UNIVERSE = "googleapis.com" + @staticmethod + def _use_client_cert_effective(): + """Returns whether client certificate should be used for mTLS if the + google-auth version supports should_use_client_cert automatic mTLS enablement. + + Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var. + + Returns: + bool: whether client certificate should be used for mTLS + Raises: + ValueError: (If using a version of google-auth without should_use_client_cert and + GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.) + """ + # check if google-auth version supports should_use_client_cert for automatic mTLS enablement + if hasattr(mtls, "should_use_client_cert"): + return mtls.should_use_client_cert() + else: + # if unsupported, fallback to reading from env var + use_client_cert_str = os.getenv( + "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false" + ).lower() + if use_client_cert_str not in ("true", "false"): + raise ValueError( + "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be" + " either `true` or `false`" + ) + return use_client_cert_str == "true" + @classmethod def from_service_account_info(cls, info: dict, *args, **kwargs): """Creates an instance of this client using the provided credentials @@ -390,12 +418,8 @@ def get_mtls_endpoint_and_cert_source( ) if client_options is None: client_options = client_options_lib.ClientOptions() - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_client_cert = StorageClient._use_client_cert_effective() use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") - if use_client_cert not in ("true", "false"): - raise ValueError( - "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - ) if use_mtls_endpoint not in ("auto", "never", "always"): raise MutualTLSChannelError( "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" @@ -403,7 +427,7 @@ def get_mtls_endpoint_and_cert_source( # Figure out the client cert source to use. client_cert_source = None - if use_client_cert == "true": + if use_client_cert: if client_options.client_cert_source: client_cert_source = client_options.client_cert_source elif mtls.has_default_client_cert_source(): @@ -435,20 +459,14 @@ def _read_environment_variables(): google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT is not any of ["auto", "never", "always"]. """ - use_client_cert = os.getenv( - "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false" - ).lower() + use_client_cert = StorageClient._use_client_cert_effective() use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") - if use_client_cert not in ("true", "false"): - raise ValueError( - "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - ) if use_mtls_endpoint not in ("auto", "never", "always"): raise MutualTLSChannelError( "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" ) - return use_client_cert == "true", use_mtls_endpoint, universe_domain_env + return use_client_cert, use_mtls_endpoint, universe_domain_env @staticmethod def _get_client_cert_source(provided_cert_source, use_cert_flag): diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py index 682f8784d..24f72ad71 100644 --- a/google/cloud/storage/_helpers.py +++ b/google/cloud/storage/_helpers.py @@ -111,10 +111,6 @@ def _virtual_hosted_style_base_url(url, bucket, trailing_slash=False): return base_url -def _use_client_cert(): - return os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true" - - def _get_environ_project(): return os.getenv( environment_vars.PROJECT, diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 3764c7a53..85575f067 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -20,11 +20,12 @@ import datetime import functools import json +import os import warnings import google.api_core.client_options from google.auth.credentials import AnonymousCredentials - +from google.auth.transport import mtls from google.api_core import page_iterator from google.cloud._helpers import _LocalStack from google.cloud.client import ClientWithProject @@ -35,7 +36,6 @@ from google.cloud.storage._helpers import _get_api_endpoint_override from google.cloud.storage._helpers import _get_environ_project from google.cloud.storage._helpers import _get_storage_emulator_override -from google.cloud.storage._helpers import _use_client_cert from google.cloud.storage._helpers import _virtual_hosted_style_base_url from google.cloud.storage._helpers import _DEFAULT_UNIVERSE_DOMAIN from google.cloud.storage._helpers import _DEFAULT_SCHEME @@ -218,7 +218,15 @@ def __init__( # The final decision of whether to use mTLS takes place in # google-auth-library-python. We peek at the environment variable # here only to issue an exception in case of a conflict. - if _use_client_cert(): + use_client_cert = False + if hasattr(mtls, "should_use_client_cert"): + use_client_cert = mtls.should_use_client_cert() + else: + use_client_cert = ( + os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE") == "true" + ) + + if use_client_cert: raise ValueError( 'The "GOOGLE_API_USE_CLIENT_CERTIFICATE" env variable is ' 'set to "true" and a non-default universe domain is ' diff --git a/tests/unit/gapic/storage_v2/test_storage.py b/tests/unit/gapic/storage_v2/test_storage.py index 20b680341..7b6340aa7 100644 --- a/tests/unit/gapic/storage_v2/test_storage.py +++ b/tests/unit/gapic/storage_v2/test_storage.py @@ -148,12 +148,19 @@ def test__read_environment_variables(): with mock.patch.dict( os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} ): - with pytest.raises(ValueError) as excinfo: - StorageClient._read_environment_variables() - assert ( - str(excinfo.value) - == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - ) + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with pytest.raises(ValueError) as excinfo: + StorageClient._read_environment_variables() + assert ( + str(excinfo.value) + == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + else: + assert StorageClient._read_environment_variables() == ( + False, + "auto", + None, + ) with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): assert StorageClient._read_environment_variables() == (False, "never", None) @@ -176,6 +183,105 @@ def test__read_environment_variables(): assert StorageClient._read_environment_variables() == (False, "auto", "foo.com") +def test_use_client_cert_effective(): + # Test case 1: Test when `should_use_client_cert` returns True. + # We mock the `should_use_client_cert` function to simulate a scenario where + # the google-auth library supports automatic mTLS and determines that a + # client certificate should be used. + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch( + "google.auth.transport.mtls.should_use_client_cert", return_value=True + ): + assert StorageClient._use_client_cert_effective() is True + + # Test case 2: Test when `should_use_client_cert` returns False. + # We mock the `should_use_client_cert` function to simulate a scenario where + # the google-auth library supports automatic mTLS and determines that a + # client certificate should NOT be used. + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch( + "google.auth.transport.mtls.should_use_client_cert", return_value=False + ): + assert StorageClient._use_client_cert_effective() is False + + # Test case 3: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "true". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + assert StorageClient._use_client_cert_effective() is True + + # Test case 4: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "false". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"} + ): + assert StorageClient._use_client_cert_effective() is False + + # Test case 5: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "True". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "True"}): + assert StorageClient._use_client_cert_effective() is True + + # Test case 6: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "False". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "False"} + ): + assert StorageClient._use_client_cert_effective() is False + + # Test case 7: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "TRUE". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "TRUE"}): + assert StorageClient._use_client_cert_effective() is True + + # Test case 8: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "FALSE". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "FALSE"} + ): + assert StorageClient._use_client_cert_effective() is False + + # Test case 9: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not set. + # In this case, the method should return False, which is the default value. + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict(os.environ, clear=True): + assert StorageClient._use_client_cert_effective() is False + + # Test case 10: Test when `should_use_client_cert` is unavailable and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to an invalid value. + # The method should raise a ValueError as the environment variable must be either + # "true" or "false". + if not hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "unsupported"} + ): + with pytest.raises(ValueError): + StorageClient._use_client_cert_effective() + + # Test case 11: Test when `should_use_client_cert` is available and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to an invalid value. + # The method should return False as the environment variable is set to an invalid value. + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "unsupported"} + ): + assert StorageClient._use_client_cert_effective() is False + + # Test case 12: Test when `should_use_client_cert` is available and the + # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is unset. Also, + # the GOOGLE_API_CONFIG environment variable is unset. + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": ""}): + with mock.patch.dict(os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": ""}): + assert StorageClient._use_client_cert_effective() is False + + def test__get_client_cert_source(): mock_provided_cert_source = mock.Mock() mock_default_cert_source = mock.Mock() @@ -515,17 +621,6 @@ def test_storage_client_client_options(client_class, transport_class, transport_ == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" ) - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict( - os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} - ): - with pytest.raises(ValueError) as excinfo: - client = client_class(transport=transport_name) - assert ( - str(excinfo.value) - == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - ) - # Check the case quota_project_id is provided options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: @@ -733,6 +828,119 @@ def test_storage_client_get_mtls_endpoint_and_cert_source(client_class): assert api_endpoint == mock_api_endpoint assert cert_source is None + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "Unsupported". + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} + ): + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, + api_endpoint=mock_api_endpoint, + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test cases for mTLS enablement when GOOGLE_API_USE_CLIENT_CERTIFICATE is unset. + test_cases = [ + ( + # With workloads present in config, mTLS is enabled. + { + "version": 1, + "cert_configs": { + "workload": { + "cert_path": "path/to/cert/file", + "key_path": "path/to/key/file", + } + }, + }, + mock_client_cert_source, + ), + ( + # With workloads not present in config, mTLS is disabled. + { + "version": 1, + "cert_configs": {}, + }, + None, + ), + ] + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + for config_data, expected_cert_source in test_cases: + env = os.environ.copy() + env.pop("GOOGLE_API_USE_CLIENT_CERTIFICATE", None) + with mock.patch.dict(os.environ, env, clear=True): + config_filename = "mock_certificate_config.json" + config_file_content = json.dumps(config_data) + m = mock.mock_open(read_data=config_file_content) + with mock.patch("builtins.open", m): + with mock.patch.dict( + os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": config_filename} + ): + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, + api_endpoint=mock_api_endpoint, + ) + ( + api_endpoint, + cert_source, + ) = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source is expected_cert_source + + # Test cases for mTLS enablement when GOOGLE_API_USE_CLIENT_CERTIFICATE is unset(empty). + test_cases = [ + ( + # With workloads present in config, mTLS is enabled. + { + "version": 1, + "cert_configs": { + "workload": { + "cert_path": "path/to/cert/file", + "key_path": "path/to/key/file", + } + }, + }, + mock_client_cert_source, + ), + ( + # With workloads not present in config, mTLS is disabled. + { + "version": 1, + "cert_configs": {}, + }, + None, + ), + ] + if hasattr(google.auth.transport.mtls, "should_use_client_cert"): + for config_data, expected_cert_source in test_cases: + env = os.environ.copy() + env.pop("GOOGLE_API_USE_CLIENT_CERTIFICATE", "") + with mock.patch.dict(os.environ, env, clear=True): + config_filename = "mock_certificate_config.json" + config_file_content = json.dumps(config_data) + m = mock.mock_open(read_data=config_file_content) + with mock.patch("builtins.open", m): + with mock.patch.dict( + os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": config_filename} + ): + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, + api_endpoint=mock_api_endpoint, + ) + ( + api_endpoint, + cert_source, + ) = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source is expected_cert_source + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() @@ -783,18 +991,6 @@ def test_storage_client_get_mtls_endpoint_and_cert_source(client_class): == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" ) - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict( - os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} - ): - with pytest.raises(ValueError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert ( - str(excinfo.value) - == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - ) - @pytest.mark.parametrize("client_class", [StorageClient, StorageAsyncClient]) @mock.patch.object( From ddce7e53a13e6c0487221bb14e88161da7ed9e08 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 9 Dec 2025 13:32:28 +0530 Subject: [PATCH 433/509] feat: send entire object checksum in the final api call of resumable upload (#1654) feat: send entire object checksum in the final api call of resumable upload fixes b/461994245 --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- google/cloud/storage/_media/_upload.py | 7 ++++ .../system/requests/test_upload.py | 24 ------------ tests/unit/test_blob.py | 37 +++++++++++++++++-- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/google/cloud/storage/_media/_upload.py b/google/cloud/storage/_media/_upload.py index 765716882..4a919d18a 100644 --- a/google/cloud/storage/_media/_upload.py +++ b/google/cloud/storage/_media/_upload.py @@ -688,6 +688,13 @@ def _prepare_request(self): _CONTENT_TYPE_HEADER: self._content_type, _helpers.CONTENT_RANGE_HEADER: content_range, } + if (start_byte + len(payload) == self._total_bytes) and ( + self._checksum_object is not None + ): + local_checksum = _helpers.prepare_checksum_digest( + self._checksum_object.digest() + ) + headers["x-goog-hash"] = f"{self._checksum_type}={local_checksum}" return _PUT, self.resumable_url, payload, headers def _update_checksum(self, start_byte, payload): diff --git a/tests/resumable_media/system/requests/test_upload.py b/tests/resumable_media/system/requests/test_upload.py index dd90aa53b..47f4f6003 100644 --- a/tests/resumable_media/system/requests/test_upload.py +++ b/tests/resumable_media/system/requests/test_upload.py @@ -27,7 +27,6 @@ import google.cloud.storage._media.requests as resumable_requests from google.cloud.storage._media import _helpers from .. import utils -from google.cloud.storage._media import _upload from google.cloud.storage.exceptions import InvalidResponse from google.cloud.storage.exceptions import DataCorruption @@ -372,29 +371,6 @@ def test_resumable_upload_with_headers( _resumable_upload_helper(authorized_transport, img_stream, cleanup, headers=headers) -@pytest.mark.parametrize("checksum", ["md5", "crc32c"]) -def test_resumable_upload_with_bad_checksum( - authorized_transport, img_stream, bucket, cleanup, checksum -): - fake_checksum_object = _helpers._get_checksum_object(checksum) - fake_checksum_object.update(b"bad data") - fake_prepared_checksum_digest = _helpers.prepare_checksum_digest( - fake_checksum_object.digest() - ) - with mock.patch.object( - _helpers, "prepare_checksum_digest", return_value=fake_prepared_checksum_digest - ): - with pytest.raises(DataCorruption) as exc_info: - _resumable_upload_helper( - authorized_transport, img_stream, cleanup, checksum=checksum - ) - expected_checksums = {"md5": "1bsd83IYNug8hd+V1ING3Q==", "crc32c": "YQGPxA=="} - expected_message = _upload._UPLOAD_CHECKSUM_MISMATCH_MESSAGE.format( - checksum.upper(), fake_prepared_checksum_digest, expected_checksums[checksum] - ) - assert exc_info.value.args[0] == expected_message - - def test_resumable_upload_bad_chunk_size(authorized_transport, img_stream): blob_name = os.path.basename(img_stream.name) # Create the actual upload object. diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index f3b6da5d1..cbf53b398 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -3049,7 +3049,14 @@ def test__initiate_resumable_upload_with_client_custom_headers(self): self._initiate_resumable_helper(client=client) def _make_resumable_transport( - self, headers1, headers2, headers3, total_bytes, data_corruption=False + self, + headers1, + headers2, + headers3, + total_bytes, + data_corruption=False, + md5_checksum_value=None, + crc32c_checksum_value=None, ): fake_transport = mock.Mock(spec=["request"]) @@ -3057,7 +3064,7 @@ def _make_resumable_transport( fake_response2 = self._mock_requests_response( http.client.PERMANENT_REDIRECT, headers2 ) - json_body = f'{{"size": "{total_bytes:d}"}}' + json_body = json.dumps({"size": str(total_bytes), "md5Hash": md5_checksum_value, "crc32c": crc32c_checksum_value}) if data_corruption: fake_response3 = DataCorruption(None) else: @@ -3151,6 +3158,9 @@ def _do_resumable_upload_call2( if_metageneration_match=None, if_metageneration_not_match=None, timeout=None, + checksum=None, + crc32c_checksum_value=None, + md5_checksum_value=None, ): # Third mock transport.request() does sends last chunk. content_range = f"bytes {blob.chunk_size:d}-{total_bytes - 1:d}/{total_bytes:d}" @@ -3161,6 +3171,11 @@ def _do_resumable_upload_call2( "content-type": content_type, "content-range": content_range, } + if checksum == "crc32c": + expected_headers["x-goog-hash"] = f"crc32c={crc32c_checksum_value}" + elif checksum == "md5": + expected_headers["x-goog-hash"] = f"md5={md5_checksum_value}" + payload = data[blob.chunk_size :] return mock.call( "PUT", @@ -3181,12 +3196,17 @@ def _do_resumable_helper( timeout=None, data_corruption=False, retry=None, + checksum=None, # None is also a valid value, when user decides to disable checksum validation. ): CHUNK_SIZE = 256 * 1024 USER_AGENT = "testing 1.2.3" content_type = "text/html" # Data to be uploaded. data = b"" + (b"A" * CHUNK_SIZE) + b"" + + # Data calcuated offline and entered here. (Unit test best practice). + crc32c_checksum_value = "mQ30hg==" + md5_checksum_value = "wajHeg1f2Q2u9afI6fjPOw==" total_bytes = len(data) if use_size: size = total_bytes @@ -3213,6 +3233,8 @@ def _do_resumable_helper( headers3, total_bytes, data_corruption=data_corruption, + md5_checksum_value=md5_checksum_value, + crc32c_checksum_value=crc32c_checksum_value, ) # Create some mock arguments and call the method under test. @@ -3247,7 +3269,7 @@ def _do_resumable_helper( if_generation_not_match, if_metageneration_match, if_metageneration_not_match, - checksum=None, + checksum=checksum, retry=retry, **timeout_kwarg, ) @@ -3296,6 +3318,9 @@ def _do_resumable_helper( if_metageneration_match=if_metageneration_match, if_metageneration_not_match=if_metageneration_not_match, timeout=expected_timeout, + checksum=checksum, + crc32c_checksum_value=crc32c_checksum_value, + md5_checksum_value=md5_checksum_value, ) self.assertEqual(transport.request.mock_calls, [call0, call1, call2]) @@ -3308,6 +3333,12 @@ def test__do_resumable_upload_no_size(self): def test__do_resumable_upload_with_size(self): self._do_resumable_helper(use_size=True) + def test__do_resumable_upload_with_size_with_crc32c_checksum(self): + self._do_resumable_helper(use_size=True, checksum="crc32c") + + def test__do_resumable_upload_with_size_with_md5_checksum(self): + self._do_resumable_helper(use_size=True, checksum="md5") + def test__do_resumable_upload_with_retry(self): self._do_resumable_helper(retry=DEFAULT_RETRY) From 57405e956a7ca579b20582bf6435cec42743c478 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 9 Dec 2025 20:37:39 +0530 Subject: [PATCH 434/509] feat: Support urllib3 >= 2.6.0 (#1658) feat: Support urllib3 >= 2.6.0 **Context**: * This library implements a custom decoders ( `_GzipDecoder` , `_BrotliDecoder` ) which inherit from `urllib3.response.ContentDecoder` * Interface of `urllib3.response.ContentDecoder` was changed in [2.6.0](https://urllib3.readthedocs.io/en/stable/changelog.html#id1) to fix security vulnerability for highly compressed data reads. (Decompression bombs) Hence we need to change our interfaces as well. **Changes** * Add `max_length` param on decompress method, provide default value of -1 (same as urllib3's decompress) * Provide backwards compatibility ( ie urllib3 <= 2.5.0) --- .../cloud/storage/_media/requests/download.py | 21 +++++++++++++++---- testing/constraints-3.12.txt | 1 - 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/google/cloud/storage/_media/requests/download.py b/google/cloud/storage/_media/requests/download.py index b8e2758e1..13e049bd3 100644 --- a/google/cloud/storage/_media/requests/download.py +++ b/google/cloud/storage/_media/requests/download.py @@ -711,7 +711,7 @@ def __init__(self, checksum): super().__init__() self._checksum = checksum - def decompress(self, data): + def decompress(self, data, max_length=-1): """Decompress the bytes. Args: @@ -721,7 +721,11 @@ def decompress(self, data): bytes: The decompressed bytes from ``data``. """ self._checksum.update(data) - return super().decompress(data) + try: + return super().decompress(data, max_length=max_length) + except TypeError: + # Fallback for urllib3 < 2.6.0 which lacks `max_length` support. + return super().decompress(data) # urllib3.response.BrotliDecoder might not exist depending on whether brotli is @@ -747,7 +751,7 @@ def __init__(self, checksum): self._decoder = urllib3.response.BrotliDecoder() self._checksum = checksum - def decompress(self, data): + def decompress(self, data, max_length=-1): """Decompress the bytes. Args: @@ -757,10 +761,19 @@ def decompress(self, data): bytes: The decompressed bytes from ``data``. """ self._checksum.update(data) - return self._decoder.decompress(data) + try: + return self._decoder.decompress(data, max_length=max_length) + except TypeError: + # Fallback for urllib3 < 2.6.0 which lacks `max_length` support. + return self._decoder.decompress(data) def flush(self): return self._decoder.flush() + @property + def has_unconsumed_tail(self) -> bool: + return self._decoder.has_unconsumed_tail + + else: # pragma: NO COVER _BrotliDecoder = None # type: ignore # pragma: NO COVER diff --git a/testing/constraints-3.12.txt b/testing/constraints-3.12.txt index 4e5f201e2..ef1c92fff 100644 --- a/testing/constraints-3.12.txt +++ b/testing/constraints-3.12.txt @@ -7,4 +7,3 @@ grpcio proto-plus protobuf grpc-google-iam-v1 -urllib3==2.5.0 \ No newline at end of file From 89a947a877f0d8f19be3a2bc45e5dfb8b8a977e5 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:49:23 +0530 Subject: [PATCH 435/509] chore(main): release 3.7.0 (#1621) :robot: I have created a release *beep* *boop* --- ## [3.7.0](https://github.com/googleapis/python-storage/compare/v3.6.0...v3.7.0) (2025-12-09) ### Features * Auto enable mTLS when supported certificates are detected ([#1637](https://github.com/googleapis/python-storage/issues/1637)) ([4e91c54](https://github.com/googleapis/python-storage/commit/4e91c541363f0e583bf9dd1b81a95ff2cb618bac)) * Send entire object checksum in the final api call of resumable upload ([#1654](https://github.com/googleapis/python-storage/issues/1654)) ([ddce7e5](https://github.com/googleapis/python-storage/commit/ddce7e53a13e6c0487221bb14e88161da7ed9e08)) * Support urllib3 >= 2.6.0 ([#1658](https://github.com/googleapis/python-storage/issues/1658)) ([57405e9](https://github.com/googleapis/python-storage/commit/57405e956a7ca579b20582bf6435cec42743c478)) ### Bug Fixes * **bucket:** Move blob fails when the new blob name contains characters that need to be url encoded ([#1605](https://github.com/googleapis/python-storage/issues/1605)) ([ec470a2](https://github.com/googleapis/python-storage/commit/ec470a270e189e137c7229cc359367d5a897cdb9)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Chandra Shekhar Sirimala --- CHANGELOG.md | 14 ++++++++++++++ google/cloud/storage/version.py | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ee1c7beb..da1f2149b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,20 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.7.0](https://github.com/googleapis/python-storage/compare/v3.6.0...v3.7.0) (2025-12-09) + + +### Features + +* Auto enable mTLS when supported certificates are detected ([#1637](https://github.com/googleapis/python-storage/issues/1637)) ([4e91c54](https://github.com/googleapis/python-storage/commit/4e91c541363f0e583bf9dd1b81a95ff2cb618bac)) +* Send entire object checksum in the final api call of resumable upload ([#1654](https://github.com/googleapis/python-storage/issues/1654)) ([ddce7e5](https://github.com/googleapis/python-storage/commit/ddce7e53a13e6c0487221bb14e88161da7ed9e08)) +* Support urllib3 >= 2.6.0 ([#1658](https://github.com/googleapis/python-storage/issues/1658)) ([57405e9](https://github.com/googleapis/python-storage/commit/57405e956a7ca579b20582bf6435cec42743c478)) + + +### Bug Fixes + +* Fix for [move_blob](https://github.com/googleapis/python-storage/blob/57405e956a7ca579b20582bf6435cec42743c478/google/cloud/storage/bucket.py#L2256) failure when the new blob name contains characters that need to be url encoded ([#1605](https://github.com/googleapis/python-storage/issues/1605)) ([ec470a2](https://github.com/googleapis/python-storage/commit/ec470a270e189e137c7229cc359367d5a897cdb9)) + ## [3.6.0](https://github.com/googleapis/python-storage/compare/v3.5.0...v3.6.0) (2025-11-17) diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 102b96095..dc87b3c5b 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.6.0" +__version__ = "3.7.0" From de2c8e9773d6499d09c72c5ca4e53eaa48c4cdf0 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 10 Dec 2025 13:35:46 +0530 Subject: [PATCH 436/509] chore: add gcs-fs as CODEOWNERS (#1660) chore: add gcs-fs as CODEOWNERS --- .github/CODEOWNERS | 3 +-- .librarian/generator-input/.repo-metadata.json | 2 +- .repo-metadata.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6df17303f..77a642659 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,10 +3,9 @@ # # For syntax help see: # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax -# Note: This file is autogenerated. To make changes to the codeowner team, please update .repo-metadata.json. # @googleapis/yoshi-python @googleapis/gcs-sdk-team are the default owners for changes in this repo -* @googleapis/yoshi-python @googleapis/gcs-sdk-team +* @googleapis/yoshi-python @googleapis/gcs-sdk-team @googleapis/gcs-fs # @googleapis/python-samples-reviewers @googleapis/gcs-sdk-team are the default owners for samples changes /samples/ @googleapis/python-samples-reviewers @googleapis/gcs-sdk-team diff --git a/.librarian/generator-input/.repo-metadata.json b/.librarian/generator-input/.repo-metadata.json index f644429bc..bd870f959 100644 --- a/.librarian/generator-input/.repo-metadata.json +++ b/.librarian/generator-input/.repo-metadata.json @@ -12,7 +12,7 @@ "api_id": "storage.googleapis.com", "requires_billing": true, "default_version": "v2", - "codeowner_team": "@googleapis/gcs-sdk-team", + "codeowner_team": "@googleapis/yoshi-python @googleapis/gcs-sdk-team @googleapis/gcs-fs", "api_shortname": "storage", "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." } diff --git a/.repo-metadata.json b/.repo-metadata.json index f644429bc..bd870f959 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -12,7 +12,7 @@ "api_id": "storage.googleapis.com", "requires_billing": true, "default_version": "v2", - "codeowner_team": "@googleapis/gcs-sdk-team", + "codeowner_team": "@googleapis/yoshi-python @googleapis/gcs-sdk-team @googleapis/gcs-fs", "api_shortname": "storage", "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." } From 4a609a4b3f4ba1396825911cb02f8a9649135cd5 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 11 Dec 2025 11:41:17 +0530 Subject: [PATCH 437/509] fix: close write object stream always (#1661) fix: close write object stream always. otherwise Task will remain for long time until GC kills it and it'll throw this `"Task was destroyed but it is pending!"` --- .../_experimental/asyncio/async_appendable_object_writer.py | 3 ++- tests/unit/asyncio/test_async_appendable_object_writer.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index d34c844d5..81dfacd6d 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -267,7 +267,8 @@ async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object] await self.finalize() else: await self.flush() - await self.write_obj_stream.close() + + await self.write_obj_stream.close() self._is_stream_open = False self.offset = None diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index a75824f8b..a26726f2a 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -313,7 +313,7 @@ async def test_finalize_on_close(mock_write_object_stream, mock_client): result = await writer.close(finalize_on_close=True) # Assert - mock_stream.close.assert_not_awaited() # Based on new implementation + mock_stream.close.assert_awaited_once() assert not writer._is_stream_open assert writer.offset is None assert writer.object_resource == mock_resource From 2d5a7b16846a69f3a911844971241899f60cce14 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 16 Dec 2025 19:53:03 +0530 Subject: [PATCH 438/509] fix(experimental): no state lookup while opening bidi-write stream (#1636) fix(experimental): no state lookup while opening bidi-write stream --- .../asyncio/async_appendable_object_writer.py | 18 ++++---- .../asyncio/async_multi_range_downloader.py | 3 +- .../asyncio/async_write_object_stream.py | 9 +++- .../test_async_appendable_object_writer.py | 41 ++++++++++++++----- .../asyncio/test_async_write_object_stream.py | 6 +++ 5 files changed, 57 insertions(+), 20 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 81dfacd6d..27c4b4f19 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -114,7 +114,11 @@ def __init__( write_handle=self.write_handle, ) self._is_stream_open: bool = False + # `offset` is the latest size of the object without staleless. self.offset: Optional[int] = None + # `persisted_size` is the total_bytes persisted in the GCS server. + # Please note: `offset` and `persisted_size` are same when the stream is + # opened. self.persisted_size: Optional[int] = None async def state_lookup(self) -> int: @@ -152,17 +156,17 @@ async def open(self) -> None: if self.generation is None: self.generation = self.write_obj_stream.generation_number self.write_handle = self.write_obj_stream.write_handle - - # Update self.persisted_size - _ = await self.state_lookup() + self.persisted_size = self.write_obj_stream.persisted_size async def append(self, data: bytes) -> None: """Appends data to the Appendable object. - This method sends the provided data to the GCS server in chunks. It - maintains an internal threshold `_MAX_BUFFER_SIZE_BYTES` and will - automatically flush the data to make it visible to readers when that - threshold has reached. + calling `self.append` will append bytes at the end of the current size + ie. `self.offset` bytes relative to the begining of the object. + + This method sends the provided `data` to the GCS server in chunks. + and persists data in GCS at every `_MAX_BUFFER_SIZE_BYTES` bytes by + calling `self.simple_flush`. :type data: bytes :param data: The bytes to append to the object. diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 16dce5025..32a0ff3d9 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -216,7 +216,8 @@ async def download_ranges( :type read_ranges: List[Tuple[int, int, "BytesIO"]] :param read_ranges: A list of tuples, where each tuple represents a - byte range (start_byte, bytes_to_read, writeable_buffer). Buffer has + combintaion of byte_range and writeable buffer in format - + (`start_byte`, `bytes_to_read`, `writeable_buffer`). Buffer has to be provided by the user, and user has to make sure appropriate memory is available in the application to avoid out-of-memory crash. diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 6d1fd5b31..183a8eeb1 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -117,7 +117,6 @@ async def open(self) -> None: object=self.object_name, generation=self.generation_number, ), - state_lookup=True, ) self.socket_like_rpc = AsyncBidiRpc( @@ -136,11 +135,17 @@ async def open(self) -> None: raise ValueError( "Failed to obtain object generation after opening the stream" ) - self.generation_number = response.resource.generation if not response.write_handle: raise ValueError("Failed to obtain write_handle after opening the stream") + if not response.resource.size: + # Appending to a 0 byte appendable object. + self.persisted_size = 0 + else: + self.persisted_size = response.resource.size + + self.generation_number = response.resource.generation self.write_handle = response.write_handle async def close(self) -> None: diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index a26726f2a..089c3d88f 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -133,15 +133,10 @@ async def test_open_appendable_object_writer(mock_write_object_stream, mock_clie writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) mock_stream = mock_write_object_stream.return_value mock_stream.open = mock.AsyncMock() - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock() - - mock_state_response = mock.MagicMock() - mock_state_response.persisted_size = 1024 - mock_stream.recv.return_value = mock_state_response mock_stream.generation_number = GENERATION mock_stream.write_handle = WRITE_HANDLE + mock_stream.persisted_size = 0 # Act await writer.open() @@ -151,11 +146,37 @@ async def test_open_appendable_object_writer(mock_write_object_stream, mock_clie assert writer._is_stream_open assert writer.generation == GENERATION assert writer.write_handle == WRITE_HANDLE + assert writer.persisted_size == 0 - expected_request = _storage_v2.BidiWriteObjectRequest(state_lookup=True) - mock_stream.send.assert_awaited_once_with(expected_request) - mock_stream.recv.assert_awaited_once() - assert writer.persisted_size == 1024 + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +async def test_open_appendable_object_writer_existing_object( + mock_write_object_stream, mock_client +): + """Test the open method.""" + # Arrange + writer = AsyncAppendableObjectWriter( + mock_client, BUCKET, OBJECT, generation=GENERATION + ) + mock_stream = mock_write_object_stream.return_value + mock_stream.open = mock.AsyncMock() + + mock_stream.generation_number = GENERATION + mock_stream.write_handle = WRITE_HANDLE + mock_stream.persisted_size = PERSISTED_SIZE + + # Act + await writer.open() + + # Assert + mock_stream.open.assert_awaited_once() + assert writer._is_stream_open + assert writer.generation == GENERATION + assert writer.write_handle == WRITE_HANDLE + assert writer.persisted_size == PERSISTED_SIZE @pytest.mark.asyncio diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 7fa2123c5..c6ea8a8ff 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -55,6 +55,7 @@ async def instantiate_write_obj_stream(mock_client, mock_cls_async_bidi_rpc, ope mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION + mock_response.resource.size = 0 mock_response.write_handle = WRITE_HANDLE socket_like_rpc.recv = AsyncMock(return_value=mock_response) @@ -129,6 +130,7 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION + mock_response.resource.size = 0 mock_response.write_handle = WRITE_HANDLE socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) @@ -143,6 +145,7 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): socket_like_rpc.recv.assert_called_once() assert stream.generation_number == GENERATION assert stream.write_handle == WRITE_HANDLE + assert stream.persisted_size == 0 @pytest.mark.asyncio @@ -158,6 +161,7 @@ async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client): mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.size = 1024 mock_response.resource.generation = GENERATION mock_response.write_handle = WRITE_HANDLE socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) @@ -175,6 +179,7 @@ async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client): socket_like_rpc.recv.assert_called_once() assert stream.generation_number == GENERATION assert stream.write_handle == WRITE_HANDLE + assert stream.persisted_size == 1024 @pytest.mark.asyncio @@ -191,6 +196,7 @@ async def test_open_when_already_open_raises_error(mock_async_bidi_rpc, mock_cli mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION + mock_response.resource.size = 0 mock_response.write_handle = WRITE_HANDLE socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) From fc95b35c7b3c4eefd1aef19dc0d79c830205867c Mon Sep 17 00:00:00 2001 From: Chalmer Lowe Date: Tue, 16 Dec 2025 12:06:34 -0500 Subject: [PATCH 439/509] chore(python): Add support for Python 3.14 (#1593) This PR adds support for Python 3.14 to the library. Key changes include: - Updating `setup.py` to include the Python 3.14 classifier. - Updating `testing/constraints-3.14.txt` to specify `grpcio >= 1.75.1`. - Updating `noxfile.py` to include 3.14 sessions and set default to 3.14. - Updating `.github/sync-repo-settings.yaml` to include 3.14 in required checks. Tests were run locally using the `python-multi` Docker image for Python 3.9 and 3.14. Some unit tests failed due to environment issues within the container, but these are not expected to occur in the CI environment. --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/sync-repo-settings.yaml | 2 +- .kokoro/presubmit/prerelease-deps.cfg | 7 ++++ .../{system-3.12.cfg => system-3.14.cfg} | 2 +- .kokoro/presubmit/system-3.9.cfg | 7 ++++ .librarian/generator-input/noxfile.py | 7 ++-- .librarian/generator-input/setup.py | 1 + CONTRIBUTING.rst | 36 +++++++++---------- noxfile.py | 18 +++++++--- setup.py | 1 + testing/constraints-3.14.txt | 2 +- 10 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 .kokoro/presubmit/prerelease-deps.cfg rename .kokoro/presubmit/{system-3.12.cfg => system-3.14.cfg} (91%) create mode 100644 .kokoro/presubmit/system-3.9.cfg diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 0d304cfe2..15380e200 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -9,7 +9,7 @@ branchProtectionRules: requiredStatusCheckContexts: - 'Kokoro' - 'cla/google' - - 'Kokoro system-3.12' + - 'Kokoro system-3.14' - 'OwlBot Post Processor' - pattern: python2 requiresCodeOwnerReviews: true diff --git a/.kokoro/presubmit/prerelease-deps.cfg b/.kokoro/presubmit/prerelease-deps.cfg new file mode 100644 index 000000000..3595fb43f --- /dev/null +++ b/.kokoro/presubmit/prerelease-deps.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "prerelease_deps" +} diff --git a/.kokoro/presubmit/system-3.12.cfg b/.kokoro/presubmit/system-3.14.cfg similarity index 91% rename from .kokoro/presubmit/system-3.12.cfg rename to .kokoro/presubmit/system-3.14.cfg index d4cca031b..fcc70a922 100644 --- a/.kokoro/presubmit/system-3.12.cfg +++ b/.kokoro/presubmit/system-3.14.cfg @@ -3,7 +3,7 @@ # Only run this nox session. env_vars: { key: "NOX_SESSION" - value: "system-3.12" + value: "system-3.14" } # Credentials needed to test universe domain. diff --git a/.kokoro/presubmit/system-3.9.cfg b/.kokoro/presubmit/system-3.9.cfg new file mode 100644 index 000000000..b8ae66b37 --- /dev/null +++ b/.kokoro/presubmit/system-3.9.cfg @@ -0,0 +1,7 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Only run this nox session. +env_vars: { + key: "NOX_SESSION" + value: "system-3.9" +} \ No newline at end of file diff --git a/.librarian/generator-input/noxfile.py b/.librarian/generator-input/noxfile.py index 16cf97b01..ca527decd 100644 --- a/.librarian/generator-input/noxfile.py +++ b/.librarian/generator-input/noxfile.py @@ -26,9 +26,9 @@ BLACK_VERSION = "black==23.7.0" BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] -DEFAULT_PYTHON_VERSION = "3.12" -SYSTEM_TEST_PYTHON_VERSIONS = ["3.12"] -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +DEFAULT_PYTHON_VERSION = "3.14" +SYSTEM_TEST_PYTHON_VERSIONS = ["3.9", "3.14"] +UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.12"] CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -51,6 +51,7 @@ "unit-3.11", "unit-3.12", "unit-3.13", + "unit-3.14", # cover must be last to avoid error `No data to report` "cover", ] diff --git a/.librarian/generator-input/setup.py b/.librarian/generator-input/setup.py index 2c4504749..89971aa33 100644 --- a/.librarian/generator-input/setup.py +++ b/.librarian/generator-input/setup.py @@ -94,6 +94,7 @@ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 316d8b266..1c1817212 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 and 3.13 on both UNIX and Windows. + 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13 and 3.14 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should @@ -69,8 +69,7 @@ We use `nox `__ to instrument our tests. - To test your changes, run unit tests with ``nox``:: - $ nox -s unit-2.7 - $ nox -s unit-3.7 + $ nox -s unit-3.9 $ ... .. note:: @@ -133,14 +132,11 @@ Running System Tests - To run system tests, you can execute:: - $ nox -s system-3.8 - $ nox -s system-2.7 + $ nox -s system-3.14 .. note:: - System tests are only configured to run under Python 2.7 and - Python 3.8. For expediency, we do not run them in older versions - of Python 3. + System tests are configured to run under Python 3.14 in ``noxfile.py``. This alone will not run the tests. You'll need to change some local auth settings and change some configuration in your project to @@ -202,25 +198,27 @@ Supported Python Versions We support: -- `Python 3.5`_ -- `Python 3.6`_ - `Python 3.7`_ - `Python 3.8`_ +- `Python 3.9`_ +- `Python 3.10`_ +- `Python 3.11`_ +- `Python 3.12`_ +- `Python 3.13`_ +- `Python 3.14`_ -.. _Python 3.5: https://docs.python.org/3.5/ -.. _Python 3.6: https://docs.python.org/3.6/ .. _Python 3.7: https://docs.python.org/3.7/ .. _Python 3.8: https://docs.python.org/3.8/ - +.. _Python 3.9: https://docs.python.org/3.9/ +.. _Python 3.10: https://docs.python.org/3.10/ +.. _Python 3.11: https://docs.python.org/3.11/ +.. _Python 3.12: https://docs.python.org/3.12/ +.. _Python 3.13: https://docs.python.org/3.13/ +.. _Python 3.14: https://docs.python.org/3.14/ Supported versions can be found in our ``noxfile.py`` `config`_. -.. _config: https://github.com/googleapis/python-storage/blob/main/noxfile.py - -Python 2.7 support is deprecated. All code changes should maintain Python 2.7 compatibility until January 1, 2020. - -We also explicitly decided to support Python 3 beginning with version -3.5. Reasons for this include: +We also explicitly decided to support Python 3 beginning with version 3.9. Reasons for this include: - Encouraging use of newest versions of Python 3 - Taking the lead of `prominent`_ open-source `projects`_ diff --git a/noxfile.py b/noxfile.py index b89b9d319..14dfb29d0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -26,9 +26,16 @@ BLACK_VERSION = "black==23.7.0" BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] -DEFAULT_PYTHON_VERSION = "3.12" -SYSTEM_TEST_PYTHON_VERSIONS = ["3.12"] -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +DEFAULT_PYTHON_VERSION = "3.14" +SYSTEM_TEST_PYTHON_VERSIONS = ["3.9", "3.14"] +UNIT_TEST_PYTHON_VERSIONS = [ + "3.9", + "3.10", + "3.11", + "3.12", + "3.13", + "3.14", +] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.12"] CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -51,6 +58,7 @@ "unit-3.11", "unit-3.12", "unit-3.13", + "unit-3.14", # cover must be last to avoid error `No data to report` "cover", ] @@ -65,7 +73,7 @@ def lint(session): """ # Pin flake8 to 6.0.0 # See https://github.com/googleapis/python-storage/issues/1102 - session.install("flake8==6.0.0", BLACK_VERSION) + session.install("flake8", BLACK_VERSION) session.run( "black", "--check", @@ -118,6 +126,8 @@ def default(session, install_extras=True): session.install("-e", ".", "-c", constraints_path) + session.run("python", "-m", "pip", "freeze") + # This dependency is included in setup.py for backwards compatibility only # and the client library is expected to pass all tests without it. See # setup.py and README for details. diff --git a/setup.py b/setup.py index 374a71cf4..b45053856 100644 --- a/setup.py +++ b/setup.py @@ -106,6 +106,7 @@ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/testing/constraints-3.14.txt b/testing/constraints-3.14.txt index 2ae5a677e..62739fc5d 100644 --- a/testing/constraints-3.14.txt +++ b/testing/constraints-3.14.txt @@ -7,7 +7,7 @@ # Then this file should have google-cloud-foo>=1 google-api-core>=2 google-auth>=2 -grpcio>=1 +grpcio>=1.75.1 proto-plus>=1 protobuf>=6 grpc-google-iam-v1>=0 From e0721335f7e0545150ad88f73c65c1a7f0b0f2a9 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 17 Dec 2025 16:19:19 +0530 Subject: [PATCH 440/509] chore: skip failing samples due to public access prevention enforcement (#1668) skip failing samples due to public access prevention enforcement. More Details on b/469643064 --- samples/snippets/snippets_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 91018f3dd..0edba46ca 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -399,6 +399,7 @@ def test_delete_blob(test_blob): storage_delete_file.delete_blob(test_blob.bucket.name, test_blob.name) +@pytest.mark.xfail(reason="wait until b/469643064 is fixed") def test_make_blob_public(test_public_blob): storage_make_public.make_blob_public( test_public_blob.bucket.name, test_public_blob.name @@ -620,6 +621,7 @@ def test_get_service_account(capsys): assert "@gs-project-accounts.iam.gserviceaccount.com" in out +@pytest.mark.xfail(reason="wait until b/469643064 is fixed") def test_download_public_file(test_public_blob): storage_make_public.make_blob_public( test_public_blob.bucket.name, test_public_blob.name From 18a0edf2b21ca702d04407976bac4544ca0a3156 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 17 Dec 2025 17:03:58 +0530 Subject: [PATCH 441/509] chore: add system test for cloud path (#1666) chore: add system test for cloud path --- tests/system/test_zonal.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 909b9ddf1..ffdab8744 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -24,28 +24,32 @@ # TODO: replace this with a fixture once zonal bucket creation / deletion # is supported in grpc client or json client client. _ZONAL_BUCKET = os.getenv("ZONAL_BUCKET") +_BYTES_TO_UPLOAD = b"dummy_bytes_to_write_read_and_delete_appendable_object" @pytest.mark.asyncio -async def test_basic_wrd(storage_client, blobs_to_delete): - bytes_to_upload = b"dummy_bytes_to_write_read_and_delete_appendable_object" +@pytest.mark.parametrize( + "attempt_direct_path", + [True, False], +) +async def test_basic_wrd(storage_client, blobs_to_delete, attempt_direct_path): object_name = f"test_basic_wrd-{str(uuid.uuid4())}" # Client instantiation; it cannot be part of fixture because. # grpc_client's event loop and event loop of coroutine running it # (i.e. this test) must be same. # Note: - # 1. @pytest.mark.asyncio ensures new event for each test. + # 1. @pytest.mark.asyncio ensures new event loop for each test. # 2. we can keep the same event loop for entire module but that may # create issues if tests are run in parallel and one test hogs the event # loop slowing down other tests. - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient(attempt_direct_path=attempt_direct_path).grpc_client writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) await writer.open() - await writer.append(bytes_to_upload) + await writer.append(_BYTES_TO_UPLOAD) object_metadata = await writer.close(finalize_on_close=True) - assert object_metadata.size == len(bytes_to_upload) + assert object_metadata.size == len(_BYTES_TO_UPLOAD) mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) buffer = BytesIO() @@ -53,7 +57,7 @@ async def test_basic_wrd(storage_client, blobs_to_delete): # (0, 0) means read the whole object await mrd.download_ranges([(0, 0, buffer)]) await mrd.close() - assert buffer.getvalue() == bytes_to_upload + assert buffer.getvalue() == _BYTES_TO_UPLOAD # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) From b8855b0e76a352036b1a3b7a688868b96e61ea4f Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 17 Dec 2025 19:58:02 +0530 Subject: [PATCH 442/509] chore: add system 3.9 tests as required (#1670) chore: add system 3.9 tests as required --- .github/sync-repo-settings.yaml | 8 +------- .kokoro/presubmit/presubmit.cfg | 3 ++- .kokoro/presubmit/system-3.9.cfg | 6 ++++++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 15380e200..19c1d0ba4 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -10,11 +10,5 @@ branchProtectionRules: - 'Kokoro' - 'cla/google' - 'Kokoro system-3.14' + - 'Kokoro system-3.9' - 'OwlBot Post Processor' -- pattern: python2 - requiresCodeOwnerReviews: true - requiresStrictStatusChecks: true - requiredStatusCheckContexts: - - 'Kokoro' - - 'cla/google' - - 'Kokoro system-2.7' diff --git a/.kokoro/presubmit/presubmit.cfg b/.kokoro/presubmit/presubmit.cfg index b158096f0..5423df92a 100644 --- a/.kokoro/presubmit/presubmit.cfg +++ b/.kokoro/presubmit/presubmit.cfg @@ -1,6 +1,7 @@ # Format: //devtools/kokoro/config/proto/build.proto -# Disable system tests. +# Disable system tests in this presubmit because they are run in separate +# presubmit jobs, whose configs are in system-3.xx.cfg files. env_vars: { key: "RUN_SYSTEM_TESTS" value: "false" diff --git a/.kokoro/presubmit/system-3.9.cfg b/.kokoro/presubmit/system-3.9.cfg index b8ae66b37..d21467d02 100644 --- a/.kokoro/presubmit/system-3.9.cfg +++ b/.kokoro/presubmit/system-3.9.cfg @@ -4,4 +4,10 @@ env_vars: { key: "NOX_SESSION" value: "system-3.9" +} + +# Credentials needed to test universe domain. +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "client-library-test-universe-domain-credential" } \ No newline at end of file From 0e2961bef285fc064174a5c18e3db05c7a682521 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 18 Dec 2025 09:28:12 +0530 Subject: [PATCH 443/509] feat: expose persisted size in mrd (#1671) feat: expose persisted size in MRD (MultiRangeReader) --- .../asyncio/async_multi_range_downloader.py | 3 +++ .../asyncio/async_read_object_stream.py | 10 ++++++-- tests/system/test_zonal.py | 24 +++++++++++++++++++ .../test_async_multi_range_downloader.py | 3 +++ .../asyncio/test_async_read_object_stream.py | 3 +++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 32a0ff3d9..fecd685d4 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -180,6 +180,7 @@ def __init__( self._read_id_to_writable_buffer_dict = {} self._read_id_to_download_ranges_id = {} self._download_ranges_id_to_pending_read_ids = {} + self.persisted_size: Optional[int] = None # updated after opening the stream async def open(self) -> None: """Opens the bidi-gRPC connection to read from the object. @@ -206,6 +207,8 @@ async def open(self) -> None: if self.generation_number is None: self.generation_number = self.read_obj_str.generation_number self.read_handle = self.read_obj_str.read_handle + if self.read_obj_str.persisted_size is not None: + self.persisted_size = self.read_obj_str.persisted_size return async def download_ranges( diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index ddaaf9a54..d66a3b027 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -92,6 +92,7 @@ def __init__( self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) self.socket_like_rpc: Optional[AsyncBidiRpc] = None self._is_stream_open: bool = False + self.persisted_size: Optional[int] = None async def open(self) -> None: """Opens the bidi-gRPC connection to read from the object. @@ -106,8 +107,13 @@ async def open(self) -> None: ) await self.socket_like_rpc.open() # this is actually 1 send response = await self.socket_like_rpc.recv() - if self.generation_number is None: - self.generation_number = response.metadata.generation + # populated only in the first response of bidi-stream and when opened + # without using `read_handle` + if response.metadata: + if self.generation_number is None: + self.generation_number = response.metadata.generation + # update persisted size + self.persisted_size = response.metadata.size self.read_handle = response.read_handle diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index ffdab8744..930bb8cf6 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -58,6 +58,30 @@ async def test_basic_wrd(storage_client, blobs_to_delete, attempt_direct_path): await mrd.download_ranges([(0, 0, buffer)]) await mrd.close() assert buffer.getvalue() == _BYTES_TO_UPLOAD + assert mrd.persisted_size == len(_BYTES_TO_UPLOAD) + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + +@pytest.mark.asyncio +async def test_read_unfinalized_appendable_object(storage_client, blobs_to_delete): + object_name = f"read_unfinalized_appendable_object-{str(uuid.uuid4())[:4]}" + grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client + + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.flush() + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + assert mrd.persisted_size == len(_BYTES_TO_UPLOAD) + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == _BYTES_TO_UPLOAD # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 668006627..1460e4df8 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -30,6 +30,7 @@ _TEST_BUCKET_NAME = "test-bucket" _TEST_OBJECT_NAME = "test-object" +_TEST_OBJECT_SIZE = 1024 * 1024 # 1 MiB _TEST_GENERATION_NUMBER = 123456789 _TEST_READ_HANDLE = b"test-handle" @@ -57,6 +58,7 @@ async def _make_mock_mrd( mock_stream = mock_cls_async_read_object_stream.return_value mock_stream.open = AsyncMock() mock_stream.generation_number = _TEST_GENERATION_NUMBER + mock_stream.persisted_size = _TEST_OBJECT_SIZE mock_stream.read_handle = _TEST_READ_HANDLE mrd = await AsyncMultiRangeDownloader.create_mrd( @@ -106,6 +108,7 @@ async def test_create_mrd( assert mrd.object_name == _TEST_OBJECT_NAME assert mrd.generation_number == _TEST_GENERATION_NUMBER assert mrd.read_handle == _TEST_READ_HANDLE + assert mrd.persisted_size == _TEST_OBJECT_SIZE assert mrd.is_stream_open @mock.patch( diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 4e4c93dd3..1b9ef898e 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -25,6 +25,7 @@ _TEST_BUCKET_NAME = "test-bucket" _TEST_OBJECT_NAME = "test-object" _TEST_GENERATION_NUMBER = 12345 +_TEST_OBJECT_SIZE = 1024 * 1024 # 1 MiB _TEST_READ_HANDLE = b"test-read-handle" @@ -37,6 +38,7 @@ async def instantiate_read_obj_stream(mock_client, mock_cls_async_bidi_rpc, open recv_response = mock.MagicMock(spec=_storage_v2.BidiReadObjectResponse) recv_response.metadata = mock.MagicMock(spec=_storage_v2.Object) recv_response.metadata.generation = _TEST_GENERATION_NUMBER + recv_response.metadata.size = _TEST_OBJECT_SIZE recv_response.read_handle = _TEST_READ_HANDLE socket_like_rpc.recv = AsyncMock(return_value=recv_response) @@ -112,6 +114,7 @@ async def test_open(mock_client, mock_cls_async_bidi_rpc): assert read_obj_stream.generation_number == _TEST_GENERATION_NUMBER assert read_obj_stream.read_handle == _TEST_READ_HANDLE + assert read_obj_stream.persisted_size == _TEST_OBJECT_SIZE assert read_obj_stream.is_stream_open From 6dc711dacd4d38c573aa4ca9ad71fe412c0e49c1 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 18 Dec 2025 16:54:24 +0530 Subject: [PATCH 444/509] fix: add system test for opening with read_handle (#1672) fix: add system test for opening with read_handle --- .../asyncio/async_multi_range_downloader.py | 17 +++--- .../asyncio/async_read_object_stream.py | 14 +++-- tests/system/test_zonal.py | 53 +++++++++++++++++ .../asyncio/test_async_read_object_stream.py | 58 ++++++++++++++++--- 4 files changed, 120 insertions(+), 22 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index fecd685d4..c05cb1c08 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -193,15 +193,13 @@ async def open(self) -> None: """ if self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is already open") - - if self.read_obj_str is None: - self.read_obj_str = _AsyncReadObjectStream( - client=self.client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation_number, - read_handle=self.read_handle, - ) + self.read_obj_str = _AsyncReadObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=self.read_handle, + ) await self.read_obj_str.open() self._is_stream_open = True if self.generation_number is None: @@ -342,6 +340,7 @@ async def close(self): if not self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is not open") await self.read_obj_str.close() + self.read_obj_str = None self._is_stream_open = False @property diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index d66a3b027..df2430ee6 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -84,11 +84,6 @@ def __init__( self.rpc = self.client._client._transport._wrapped_methods[ self.client._client._transport.bidi_read_object ] - self.first_bidi_read_req = _storage_v2.BidiReadObjectRequest( - read_object_spec=_storage_v2.BidiReadObjectSpec( - bucket=self._full_bucket_name, object=object_name - ), - ) self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) self.socket_like_rpc: Optional[AsyncBidiRpc] = None self._is_stream_open: bool = False @@ -102,6 +97,13 @@ async def open(self) -> None: """ if self._is_stream_open: raise ValueError("Stream is already open") + self.first_bidi_read_req = _storage_v2.BidiReadObjectRequest( + read_object_spec=_storage_v2.BidiReadObjectSpec( + bucket=self._full_bucket_name, + object=self.object_name, + read_handle=self.read_handle, + ), + ) self.socket_like_rpc = AsyncBidiRpc( self.rpc, initial_request=self.first_bidi_read_req, metadata=self.metadata ) @@ -109,7 +111,7 @@ async def open(self) -> None: response = await self.socket_like_rpc.recv() # populated only in the first response of bidi-stream and when opened # without using `read_handle` - if response.metadata: + if hasattr(response, "metadata") and response.metadata: if self.generation_number is None: self.generation_number = response.metadata.generation # update persisted size diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 930bb8cf6..05bb317d7 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -1,4 +1,5 @@ # py standard imports +import asyncio import os import uuid from io import BytesIO @@ -27,6 +28,36 @@ _BYTES_TO_UPLOAD = b"dummy_bytes_to_write_read_and_delete_appendable_object" +async def write_one_appendable_object( + bucket_name: str, + object_name: str, + data: bytes, +) -> None: + """Helper to write an appendable object.""" + grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client + writer = AsyncAppendableObjectWriter(grpc_client, bucket_name, object_name) + await writer.open() + await writer.append(data) + await writer.close() + + +@pytest.fixture(scope="function") +def appendable_object(storage_client, blobs_to_delete): + """Fixture to create and cleanup an appendable object.""" + object_name = f"appendable_obj_for_mrd-{str(uuid.uuid4())[:4]}" + asyncio.run( + write_one_appendable_object( + _ZONAL_BUCKET, + object_name, + _BYTES_TO_UPLOAD, + ) + ) + yield object_name + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + @pytest.mark.asyncio @pytest.mark.parametrize( "attempt_direct_path", @@ -85,3 +116,25 @@ async def test_read_unfinalized_appendable_object(storage_client, blobs_to_delet # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + +@pytest.mark.asyncio +async def test_mrd_open_with_read_handle(appendable_object): + grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, appendable_object) + await mrd.open() + read_handle = mrd.read_handle + await mrd.close() + + # Open a new MRD using the `read_handle` obtained above + new_mrd = AsyncMultiRangeDownloader( + grpc_client, _ZONAL_BUCKET, appendable_object, read_handle=read_handle + ) + await new_mrd.open() + # persisted_size not set when opened with read_handle + assert new_mrd.persisted_size is None + buffer = BytesIO() + await new_mrd.download_ranges([(0, 0, buffer)]) + await new_mrd.close() + assert buffer.getvalue() == _BYTES_TO_UPLOAD diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 1b9ef898e..4ba8d34a1 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -27,6 +27,7 @@ _TEST_GENERATION_NUMBER = 12345 _TEST_OBJECT_SIZE = 1024 * 1024 # 1 MiB _TEST_READ_HANDLE = b"test-read-handle" +_TEST_READ_HANDLE_NEW = b"test-read-handle-new" async def instantiate_read_obj_stream(mock_client, mock_cls_async_bidi_rpc, open=True): @@ -54,6 +55,30 @@ async def instantiate_read_obj_stream(mock_client, mock_cls_async_bidi_rpc, open return read_obj_stream +async def instantiate_read_obj_stream_with_read_handle( + mock_client, mock_cls_async_bidi_rpc, open=True +): + """Helper to create an instance of _AsyncReadObjectStream and open it by default.""" + socket_like_rpc = AsyncMock() + mock_cls_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = AsyncMock() + + recv_response = mock.MagicMock(spec=_storage_v2.BidiReadObjectResponse) + recv_response.read_handle = _TEST_READ_HANDLE_NEW + socket_like_rpc.recv = AsyncMock(return_value=recv_response) + + read_obj_stream = _AsyncReadObjectStream( + client=mock_client, + bucket_name=_TEST_BUCKET_NAME, + object_name=_TEST_OBJECT_NAME, + ) + + if open: + await read_obj_stream.open() + + return read_obj_stream + + @mock.patch( "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" ) @@ -67,12 +92,6 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): mock_client._client._transport._wrapped_methods = { "bidi_read_object_rpc": rpc_sentinel, } - full_bucket_name = f"projects/_/buckets/{_TEST_BUCKET_NAME}" - first_bidi_read_req = _storage_v2.BidiReadObjectRequest( - read_object_spec=_storage_v2.BidiReadObjectSpec( - bucket=full_bucket_name, object=_TEST_OBJECT_NAME - ), - ) # Act read_obj_stream = _AsyncReadObjectStream( @@ -88,7 +107,6 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): assert read_obj_stream.object_name == _TEST_OBJECT_NAME assert read_obj_stream.generation_number == _TEST_GENERATION_NUMBER assert read_obj_stream.read_handle == _TEST_READ_HANDLE - assert read_obj_stream.first_bidi_read_req == first_bidi_read_req assert read_obj_stream.rpc == rpc_sentinel @@ -118,6 +136,32 @@ async def test_open(mock_client, mock_cls_async_bidi_rpc): assert read_obj_stream.is_stream_open +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_open_with_read_handle(mock_client, mock_cls_async_bidi_rpc): + # arrange + read_obj_stream = await instantiate_read_obj_stream_with_read_handle( + mock_client, mock_cls_async_bidi_rpc, open=False + ) + + # act + await read_obj_stream.open() + + # assert + read_obj_stream.socket_like_rpc.open.assert_called_once() + read_obj_stream.socket_like_rpc.recv.assert_called_once() + + assert read_obj_stream.generation_number is None + assert read_obj_stream.persisted_size is None + assert read_obj_stream.read_handle == _TEST_READ_HANDLE_NEW + assert read_obj_stream.is_stream_open + + @mock.patch( "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" ) From d6b8f55bae035c7d0eae3895252130a107e0356e Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 19 Dec 2025 15:02:23 +0530 Subject: [PATCH 445/509] chore: Prevent OS Login key accumulation in e2e tests (#1688) chore: Prevent OS Login key accumulation in e2e tests --- cloudbuild/zb-system-tests-cloudbuild.yaml | 42 ++++++++++++++++++---- tests/system/test_notification.py | 5 +++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/cloudbuild/zb-system-tests-cloudbuild.yaml b/cloudbuild/zb-system-tests-cloudbuild.yaml index be790ebd4..383c4fa96 100644 --- a/cloudbuild/zb-system-tests-cloudbuild.yaml +++ b/cloudbuild/zb-system-tests-cloudbuild.yaml @@ -2,8 +2,25 @@ substitutions: _REGION: "us-central1" _ZONE: "us-central1-a" _SHORT_BUILD_ID: ${BUILD_ID:0:8} + _VM_NAME: "py-sdk-sys-test-${_SHORT_BUILD_ID}" + + steps: + # Step 0: Generate a persistent SSH key for this build run. + # This prevents gcloud from adding a new key to the OS Login profile on every ssh/scp command. + - name: "gcr.io/google.com/cloudsdktool/cloud-sdk" + id: "generate-ssh-key" + entrypoint: "bash" + args: + - "-c" + - | + mkdir -p /workspace/.ssh + # Generate the SSH key + ssh-keygen -t rsa -f /workspace/.ssh/google_compute_engine -N '' -C gcb + # Save the public key content to a file for the cleanup step + cat /workspace/.ssh/google_compute_engine.pub > /workspace/gcb_ssh_key.pub + waitFor: ["-"] # Step 1 Create a GCE VM to run the tests. # The VM is created in the same zone as the buckets to test rapid storage features. @@ -15,7 +32,7 @@ steps: - "compute" - "instances" - "create" - - "gcsfs-test-vm-${_SHORT_BUILD_ID}" + - "${_VM_NAME}" - "--project=${PROJECT_ID}" - "--zone=${_ZONE}" - "--machine-type=e2-medium" @@ -38,33 +55,46 @@ steps: set -e # Wait for the VM to be fully initialized and SSH to be ready. for i in {1..10}; do - if gcloud compute ssh gcsfs-test-vm-${_SHORT_BUILD_ID} --zone=${_ZONE} --internal-ip --command="echo VM is ready"; then + if gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="echo VM is ready"; then break fi echo "Waiting for VM to become available... (attempt $i/10)" sleep 15 done # copy the script to the VM - gcloud compute scp cloudbuild/run_zonal_tests.sh gcsfs-test-vm-${_SHORT_BUILD_ID}:~ --zone=${_ZONE} --internal-ip + gcloud compute scp cloudbuild/run_zonal_tests.sh ${_VM_NAME}:~ --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine # Execute the script on the VM via SSH. # Capture the exit code to ensure cleanup happens before the build fails. set +e - gcloud compute ssh gcsfs-test-vm-${_SHORT_BUILD_ID} --zone=${_ZONE} --internal-ip --command="COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} bash run_zonal_tests.sh" + gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} bash run_zonal_tests.sh" EXIT_CODE=$? set -e echo "--- Deleting GCE VM ---" - gcloud compute instances delete "gcsfs-test-vm-${_SHORT_BUILD_ID}" --zone=${_ZONE} --quiet + gcloud compute instances delete "${_VM_NAME}" --zone=${_ZONE} --quiet # Exit with the original exit code from the test script. exit $$EXIT_CODE waitFor: - "create-vm" + - "generate-ssh-key" + + - name: "gcr.io/google.com/cloudsdktool/cloud-sdk" + id: "cleanup-ssh-key" + entrypoint: "bash" + args: + - "-c" + - | + echo "--- Removing SSH key from OS Login profile to prevent accumulation ---" + gcloud compute os-login ssh-keys remove \ + --key-file=/workspace/gcb_ssh_key.pub || true + waitFor: + - "run-tests-and-delete-vm" timeout: "3600s" # 60 minutes options: logging: CLOUD_LOGGING_ONLY pool: - name: "projects/${PROJECT_ID}/locations/us-central1/workerPools/cloud-build-worker-pool" \ No newline at end of file + name: "projects/${PROJECT_ID}/locations/us-central1/workerPools/cloud-build-worker-pool" diff --git a/tests/system/test_notification.py b/tests/system/test_notification.py index 9b631c29b..c21d836a3 100644 --- a/tests/system/test_notification.py +++ b/tests/system/test_notification.py @@ -69,6 +69,7 @@ def notification_topic(storage_client, publisher_client, topic_path, no_mtls): publisher_client.set_iam_policy(request={"resource": topic_path, "policy": policy}) +@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_minimal( storage_client, buckets_to_delete, @@ -94,6 +95,7 @@ def test_notification_create_minimal( notification.delete() +@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_explicit( storage_client, buckets_to_delete, @@ -128,6 +130,7 @@ def test_notification_create_explicit( notification.delete() +@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_w_user_project( storage_client, buckets_to_delete, @@ -156,6 +159,7 @@ def test_notification_create_w_user_project( notification.delete() +@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_wo_topic_name( storage_client, buckets_to_delete, @@ -184,6 +188,7 @@ def test_notification_create_wo_topic_name( notification.create() +@pytest.mark.skip(reason="until b/470069573 is fixed") def test_bucket_get_notification( storage_client, buckets_to_delete, From 139390cb01f93a2d61e7ec201e3637dffe0b2a34 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 19 Dec 2025 16:21:39 +0530 Subject: [PATCH 446/509] feat: compute chunk wise checksum for bidi_writes (#1675) feat: compute chunk wise checksum for bidi_writes and send it via BidiWriteObjectRequest As a part of this change, also did a small refactoring * Moved the precondition check to __utils.py_ file --- .../storage/_experimental/asyncio/_utils.py | 34 +++++++++++++++++++ .../asyncio/async_appendable_object_writer.py | 9 ++++- .../asyncio/async_multi_range_downloader.py | 16 +++------ .../test_async_appendable_object_writer.py | 27 ++++++++++++++- .../test_async_multi_range_downloader.py | 6 ++-- 5 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 google/cloud/storage/_experimental/asyncio/_utils.py diff --git a/google/cloud/storage/_experimental/asyncio/_utils.py b/google/cloud/storage/_experimental/asyncio/_utils.py new file mode 100644 index 000000000..38eb659fc --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/_utils.py @@ -0,0 +1,34 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import google_crc32c + +from google.api_core import exceptions + +def raise_if_no_fast_crc32c(): + """Check if the C-accelerated version of google-crc32c is available. + + If not, raise an error to prevent silent performance degradation. + + raises google.api_core.exceptions.FailedPrecondition: If the C extension is not available. + returns: True if the C extension is available. + rtype: bool + + """ + if google_crc32c.implementation != "c": + raise exceptions.FailedPrecondition( + "The google-crc32c package is not installed with C support. " + "C extension is required for faster data integrity checks." + "For more information, see https://github.com/googleapis/python-crc32c." + ) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 27c4b4f19..0fa0e467e 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -22,6 +22,10 @@ """ from typing import Optional, Union + +from google_crc32c import Checksum + +from ._utils import raise_if_no_fast_crc32c from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import ( AsyncGrpcClient, @@ -100,6 +104,7 @@ def __init__( :param write_handle: (Optional) An existing handle for writing the object. If provided, opening the bidi-gRPC connection will be faster. """ + raise_if_no_fast_crc32c() self.client = client self.bucket_name = bucket_name self.object_name = object_name @@ -191,11 +196,13 @@ async def append(self, data: bytes) -> None: bytes_to_flush = 0 while start_idx < total_bytes: end_idx = min(start_idx + _MAX_CHUNK_SIZE_BYTES, total_bytes) + data_chunk = data[start_idx:end_idx] await self.write_obj_stream.send( _storage_v2.BidiWriteObjectRequest( write_offset=self.offset, checksummed_data=_storage_v2.ChecksummedData( - content=data[start_idx:end_idx] + content=data_chunk, + crc32c=int.from_bytes(Checksum(data_chunk).digest(), "big"), ), ) ) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index c05cb1c08..1beedd097 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -14,12 +14,11 @@ from __future__ import annotations import asyncio -import google_crc32c -from google.api_core import exceptions -from google_crc32c import Checksum - from typing import List, Optional, Tuple +from google_crc32c import Checksum + +from ._utils import raise_if_no_fast_crc32c from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( _AsyncReadObjectStream, ) @@ -160,14 +159,7 @@ def __init__( :param read_handle: (Optional) An existing read handle. """ - # Verify that the fast, C-accelerated version of crc32c is available. - # If not, raise an error to prevent silent performance degradation. - if google_crc32c.implementation != "c": - raise exceptions.NotFound( - "The google-crc32c package is not installed with C support. " - "Bidi reads require the C extension for data integrity checks." - "For more information, see https://github.com/googleapis/python-crc32c." - ) + raise_if_no_fast_crc32c() self.client = client self.bucket_name = bucket_name diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 089c3d88f..27ff291db 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -15,6 +15,9 @@ import pytest from unittest import mock +from google_crc32c import Checksum + +from google.api_core import exceptions from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) @@ -85,6 +88,23 @@ def test_init_with_optional_args(mock_write_object_stream, mock_client): ) +@mock.patch("google.cloud.storage._experimental.asyncio._utils.google_crc32c") +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +def test_init_raises_if_crc32c_c_extension_is_missing( + mock_grpc_client, mock_google_crc32c +): + mock_google_crc32c.implementation = "python" + + with pytest.raises(exceptions.FailedPrecondition) as exc_info: + AsyncAppendableObjectWriter(mock_grpc_client, "bucket", "object") + + assert "The google-crc32c package is not installed with C support" in str( + exc_info.value + ) + + @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" @@ -434,10 +454,15 @@ async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client # First chunk assert first_call[0][0].write_offset == 100 assert len(first_call[0][0].checksummed_data.content) == _MAX_CHUNK_SIZE_BYTES - + assert first_call[0][0].checksummed_data.crc32c == int.from_bytes( + Checksum(data[:_MAX_CHUNK_SIZE_BYTES]).digest(), byteorder="big" + ) # Second chunk assert second_call[0][0].write_offset == 100 + _MAX_CHUNK_SIZE_BYTES assert len(second_call[0][0].checksummed_data.content) == 1 + assert second_call[0][0].checksummed_data.crc32c == int.from_bytes( + Checksum(data[_MAX_CHUNK_SIZE_BYTES:]).digest(), byteorder="big" + ) assert writer.offset == 100 + len(data) writer.simple_flush.assert_not_awaited() diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 1460e4df8..8afef104b 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -349,9 +349,7 @@ async def test_downloading_without_opening_should_throw_error( assert str(exc.value) == "Underlying bidi-gRPC stream is not open" assert not mrd.is_stream_open - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.google_crc32c" - ) + @mock.patch("google.cloud.storage._experimental.asyncio._utils.google_crc32c") @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -360,7 +358,7 @@ def test_init_raises_if_crc32c_c_extension_is_missing( ): mock_google_crc32c.implementation = "python" - with pytest.raises(exceptions.NotFound) as exc_info: + with pytest.raises(exceptions.FailedPrecondition) as exc_info: AsyncMultiRangeDownloader(mock_grpc_client, "bucket", "object") assert "The google-crc32c package is not installed with C support" in str( From a0668ece32e50441684180455bb9fc6030fabc17 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 19 Dec 2025 20:22:05 +0530 Subject: [PATCH 447/509] chore: Add Sys test large obj (#1676) chore: Add Sys test large obj --- tests/system/test_zonal.py | 77 +++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 05bb317d7..9916fa21f 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -5,6 +5,8 @@ from io import BytesIO # python additional imports +import google_crc32c + import pytest # current library imports @@ -28,6 +30,11 @@ _BYTES_TO_UPLOAD = b"dummy_bytes_to_write_read_and_delete_appendable_object" +def _get_equal_dist(a: int, b: int) -> tuple[int, int]: + step = (b - a) // 3 + return a + step, a + 2 * step + + async def write_one_appendable_object( bucket_name: str, object_name: str, @@ -59,11 +66,21 @@ def appendable_object(storage_client, blobs_to_delete): @pytest.mark.asyncio +@pytest.mark.parametrize( + "object_size", + [ + 256, # less than _chunk size + 10 * 1024 * 1024, # less than _MAX_BUFFER_SIZE_BYTES + 20 * 1024 * 1024, # greater than _MAX_BUFFER_SIZE + ], +) @pytest.mark.parametrize( "attempt_direct_path", [True, False], ) -async def test_basic_wrd(storage_client, blobs_to_delete, attempt_direct_path): +async def test_basic_wrd( + storage_client, blobs_to_delete, attempt_direct_path, object_size +): object_name = f"test_basic_wrd-{str(uuid.uuid4())}" # Client instantiation; it cannot be part of fixture because. @@ -74,13 +91,16 @@ async def test_basic_wrd(storage_client, blobs_to_delete, attempt_direct_path): # 2. we can keep the same event loop for entire module but that may # create issues if tests are run in parallel and one test hogs the event # loop slowing down other tests. + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) grpc_client = AsyncGrpcClient(attempt_direct_path=attempt_direct_path).grpc_client writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) await writer.open() - await writer.append(_BYTES_TO_UPLOAD) + await writer.append(object_data) object_metadata = await writer.close(finalize_on_close=True) - assert object_metadata.size == len(_BYTES_TO_UPLOAD) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) buffer = BytesIO() @@ -88,8 +108,55 @@ async def test_basic_wrd(storage_client, blobs_to_delete, attempt_direct_path): # (0, 0) means read the whole object await mrd.download_ranges([(0, 0, buffer)]) await mrd.close() - assert buffer.getvalue() == _BYTES_TO_UPLOAD - assert mrd.persisted_size == len(_BYTES_TO_UPLOAD) + assert buffer.getvalue() == object_data + assert mrd.persisted_size == object_size + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "object_size", + [ + 10, # less than _chunk size, + 10 * 1024 * 1024, # less than _MAX_BUFFER_SIZE_BYTES + 20 * 1024 * 1024, # greater than _MAX_BUFFER_SIZE_BYTES + ], +) +async def test_basic_wrd_in_slices(storage_client, blobs_to_delete, object_size): + object_name = f"test_basic_wrd-{str(uuid.uuid4())}" + + # Client instantiation; it cannot be part of fixture because. + # grpc_client's event loop and event loop of coroutine running it + # (i.e. this test) must be same. + # Note: + # 1. @pytest.mark.asyncio ensures new event loop for each test. + # 2. we can keep the same event loop for entire module but that may + # create issues if tests are run in parallel and one test hogs the event + # loop slowing down other tests. + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) + grpc_client = AsyncGrpcClient().grpc_client + + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + mark1, mark2 = _get_equal_dist(0, object_size) + await writer.append(object_data[0:mark1]) + await writer.append(object_data[mark1:mark2]) + await writer.append(object_data[mark2:]) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == object_data + assert mrd.persisted_size == object_size # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) From f7095faf0a81239894ff9d277849788b62eb6ac5 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 19 Dec 2025 22:13:05 +0530 Subject: [PATCH 448/509] feat: make flush size configurable (#1677) feat: make flush size configurable --- .../asyncio/async_appendable_object_writer.py | 26 +++++-- tests/system/test_zonal.py | 54 +++++++++++++++ .../test_async_appendable_object_writer.py | 68 +++++++++++++++++-- 3 files changed, 139 insertions(+), 9 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 0fa0e467e..12a7a23ce 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -24,6 +24,7 @@ from typing import Optional, Union from google_crc32c import Checksum +from google.api_core import exceptions from ._utils import raise_if_no_fast_crc32c from google.cloud import _storage_v2 @@ -36,7 +37,7 @@ _MAX_CHUNK_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB -_MAX_BUFFER_SIZE_BYTES = 16 * 1024 * 1024 # 16 MiB +_DEFAULT_FLUSH_INTERVAL_BYTES = 16 * 1024 * 1024 # 16 MiB class AsyncAppendableObjectWriter: @@ -49,6 +50,7 @@ def __init__( object_name: str, generation=None, write_handle=None, + writer_options: Optional[dict] = None, ): """ Class for appending data to a GCS Appendable Object. @@ -125,6 +127,21 @@ def __init__( # Please note: `offset` and `persisted_size` are same when the stream is # opened. self.persisted_size: Optional[int] = None + if writer_options is None: + writer_options = {} + self.flush_interval = writer_options.get( + "FLUSH_INTERVAL_BYTES", _DEFAULT_FLUSH_INTERVAL_BYTES + ) + # TODO: add test case for this. + if self.flush_interval < _MAX_CHUNK_SIZE_BYTES: + raise exceptions.OutOfRange( + f"flush_interval must be >= {_MAX_CHUNK_SIZE_BYTES} , but provided {self.flush_interval}" + ) + if self.flush_interval % _MAX_CHUNK_SIZE_BYTES != 0: + raise exceptions.OutOfRange( + f"flush_interval must be a multiple of {_MAX_CHUNK_SIZE_BYTES}, but provided {self.flush_interval}" + ) + self.bytes_appended_since_last_flush = 0 async def state_lookup(self) -> int: """Returns the persisted_size @@ -193,7 +210,6 @@ async def append(self, data: bytes) -> None: self.offset = self.persisted_size start_idx = 0 - bytes_to_flush = 0 while start_idx < total_bytes: end_idx = min(start_idx + _MAX_CHUNK_SIZE_BYTES, total_bytes) data_chunk = data[start_idx:end_idx] @@ -208,10 +224,10 @@ async def append(self, data: bytes) -> None: ) chunk_size = end_idx - start_idx self.offset += chunk_size - bytes_to_flush += chunk_size - if bytes_to_flush >= _MAX_BUFFER_SIZE_BYTES: + self.bytes_appended_since_last_flush += chunk_size + if self.bytes_appended_since_last_flush >= self.flush_interval: await self.simple_flush() - bytes_to_flush = 0 + self.bytes_appended_since_last_flush = 0 start_idx = end_idx async def simple_flush(self) -> None: diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 9916fa21f..8697410b0 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -13,6 +13,7 @@ from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, + _DEFAULT_FLUSH_INTERVAL_BYTES, ) from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, @@ -162,6 +163,59 @@ async def test_basic_wrd_in_slices(storage_client, blobs_to_delete, object_size) blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) +@pytest.mark.asyncio +@pytest.mark.parametrize( + "flush_interval", + [2 * 1024 * 1024, 4 * 1024 * 1024, 8 * 1024 * 1024, _DEFAULT_FLUSH_INTERVAL_BYTES], +) +async def test_wrd_with_non_default_flush_interval( + storage_client, + blobs_to_delete, + flush_interval, +): + object_name = f"test_basic_wrd-{str(uuid.uuid4())}" + object_size = 9 * 1024 * 1024 + + # Client instantiation; it cannot be part of fixture because. + # grpc_client's event loop and event loop of coroutine running it + # (i.e. this test) must be same. + # Note: + # 1. @pytest.mark.asyncio ensures new event loop for each test. + # 2. we can keep the same event loop for entire module but that may + # create issues if tests are run in parallel and one test hogs the event + # loop slowing down other tests. + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) + grpc_client = AsyncGrpcClient().grpc_client + + writer = AsyncAppendableObjectWriter( + grpc_client, + _ZONAL_BUCKET, + object_name, + writer_options={"FLUSH_INTERVAL_BYTES": flush_interval}, + ) + await writer.open() + mark1, mark2 = _get_equal_dist(0, object_size) + await writer.append(object_data[0:mark1]) + await writer.append(object_data[mark1:mark2]) + await writer.append(object_data[mark2:]) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == object_data + assert mrd.persisted_size == object_size + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + @pytest.mark.asyncio async def test_read_unfinalized_appendable_object(storage_client, blobs_to_delete): object_name = f"read_unfinalized_appendable_object-{str(uuid.uuid4())[:4]}" diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 27ff291db..32dbed38a 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -21,6 +21,9 @@ from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + _MAX_CHUNK_SIZE_BYTES, +) from google.cloud import _storage_v2 @@ -29,6 +32,7 @@ GENERATION = 123 WRITE_HANDLE = b"test-write-handle" PERSISTED_SIZE = 456 +EIGHT_MIB = 8 * 1024 * 1024 @pytest.fixture @@ -52,6 +56,7 @@ def test_init(mock_write_object_stream, mock_client): assert not writer._is_stream_open assert writer.offset is None assert writer.persisted_size is None + assert writer.bytes_appended_since_last_flush == 0 mock_write_object_stream.assert_called_once_with( client=mock_client, @@ -78,6 +83,7 @@ def test_init_with_optional_args(mock_write_object_stream, mock_client): assert writer.generation == GENERATION assert writer.write_handle == WRITE_HANDLE + assert writer.bytes_appended_since_last_flush == 0 mock_write_object_stream.assert_called_once_with( client=mock_client, @@ -88,6 +94,60 @@ def test_init_with_optional_args(mock_write_object_stream, mock_client): ) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +def test_init_with_writer_options(mock_write_object_stream, mock_client): + """Test the constructor with optional arguments.""" + writer = AsyncAppendableObjectWriter( + mock_client, + BUCKET, + OBJECT, + writer_options={"FLUSH_INTERVAL_BYTES": EIGHT_MIB}, + ) + + assert writer.flush_interval == EIGHT_MIB + assert writer.bytes_appended_since_last_flush == 0 + + mock_write_object_stream.assert_called_once_with( + client=mock_client, + bucket_name=BUCKET, + object_name=OBJECT, + generation_number=None, + write_handle=None, + ) + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +def test_init_with_flush_interval_less_than_chunk_size_raises_error(mock_client): + """Test that an OutOfRange error is raised if flush_interval is less than the chunk size.""" + + with pytest.raises(exceptions.OutOfRange): + AsyncAppendableObjectWriter( + mock_client, + BUCKET, + OBJECT, + writer_options={"FLUSH_INTERVAL_BYTES": _MAX_CHUNK_SIZE_BYTES - 1}, + ) + + +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" +) +def test_init_with_flush_interval_not_multiple_of_chunk_size_raises_error(mock_client): + """Test that an OutOfRange error is raised if flush_interval is not a multiple of the chunk size.""" + + with pytest.raises(exceptions.OutOfRange): + AsyncAppendableObjectWriter( + mock_client, + BUCKET, + OBJECT, + writer_options={"FLUSH_INTERVAL_BYTES": _MAX_CHUNK_SIZE_BYTES + 1}, + ) + + @mock.patch("google.cloud.storage._experimental.asyncio._utils.google_crc32c") @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" @@ -477,7 +537,7 @@ async def test_append_flushes_when_buffer_is_full( ): """Test that append flushes the stream when the buffer size is reached.""" from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - _MAX_BUFFER_SIZE_BYTES, + _DEFAULT_FLUSH_INTERVAL_BYTES, ) writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) @@ -487,7 +547,7 @@ async def test_append_flushes_when_buffer_is_full( mock_stream.send = mock.AsyncMock() writer.simple_flush = mock.AsyncMock() - data = b"a" * _MAX_BUFFER_SIZE_BYTES + data = b"a" * _DEFAULT_FLUSH_INTERVAL_BYTES await writer.append(data) writer.simple_flush.assert_awaited_once() @@ -500,7 +560,7 @@ async def test_append_flushes_when_buffer_is_full( async def test_append_handles_large_data(mock_write_object_stream, mock_client): """Test that append handles data larger than the buffer size.""" from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - _MAX_BUFFER_SIZE_BYTES, + _DEFAULT_FLUSH_INTERVAL_BYTES, ) writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) @@ -510,7 +570,7 @@ async def test_append_handles_large_data(mock_write_object_stream, mock_client): mock_stream.send = mock.AsyncMock() writer.simple_flush = mock.AsyncMock() - data = b"a" * (_MAX_BUFFER_SIZE_BYTES * 2 + 1) + data = b"a" * (_DEFAULT_FLUSH_INTERVAL_BYTES * 2 + 1) await writer.append(data) assert writer.simple_flush.await_count == 2 From bee60894a41d1f9b1739e469d9eabd8b5af3d34d Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Sat, 20 Dec 2025 01:02:00 +0530 Subject: [PATCH 449/509] chore: skip kms tests until b/470276398 (#1690) chore: skip kms tests until b/470276398 --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- samples/snippets/snippets_test.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/samples/snippets/snippets_test.py b/samples/snippets/snippets_test.py index 0edba46ca..1d3c8c1c4 100644 --- a/samples/snippets/snippets_test.py +++ b/samples/snippets/snippets_test.py @@ -18,6 +18,7 @@ import tempfile import time import uuid +import sys from google.cloud import storage import google.cloud.exceptions @@ -99,8 +100,10 @@ import storage_upload_with_kms_key KMS_KEY = os.environ.get("CLOUD_KMS_KEY") +IS_PYTHON_3_14 = sys.version_info[:2] == (3, 14) +@pytest.mark.skipif(IS_PYTHON_3_14, reason="b/470276398") def test_enable_default_kms_key(test_bucket): storage_set_bucket_default_kms_key.enable_default_kms_key( bucket_name=test_bucket.name, kms_key_name=KMS_KEY @@ -305,6 +308,7 @@ def test_upload_blob_from_stream(test_bucket, capsys): assert "Stream data uploaded to test_upload_blob" in out +@pytest.mark.skipif(IS_PYTHON_3_14, reason="b/470276398") def test_upload_blob_with_kms(test_bucket): blob_name = f"test_upload_with_kms_{uuid.uuid4().hex}" with tempfile.NamedTemporaryFile() as source_file: @@ -598,6 +602,7 @@ def test_create_bucket_dual_region(test_bucket_create, capsys): assert "dual-region" in out +@pytest.mark.skipif(IS_PYTHON_3_14, reason="b/470276398") def test_bucket_delete_default_kms_key(test_bucket, capsys): test_bucket.default_kms_key_name = KMS_KEY test_bucket.patch() @@ -646,6 +651,7 @@ def test_define_bucket_website_configuration(test_bucket): assert bucket._properties["website"] == website_val +@pytest.mark.skipif(IS_PYTHON_3_14, reason="b/470276398") def test_object_get_kms_key(test_bucket): with tempfile.NamedTemporaryFile() as source_file: storage_upload_with_kms_key.upload_blob_with_kms( From fe6d7c930bf4e83187120eda52aeaab932502e9f Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 22 Dec 2025 17:34:20 +0530 Subject: [PATCH 450/509] chore: optimization to reduce number of open TCP connections while running zonal system tests (#1691) chore: optimization to reduce number of open TCP connections while running zonal system tests 1. Increase `ulimit -n 10000` before ssh'ing into the VM where system tests for zonal buckets are running. 2. Delete `mrd` and `writer` instance and trigger `gc.collect()` ( this alone should suffice but increasing doing the above optimization to avoid future issues. --- cloudbuild/run_zonal_tests.sh | 3 +- cloudbuild/zb-system-tests-cloudbuild.yaml | 3 +- tests/system/test_zonal.py | 68 ++++++++++------------ 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/cloudbuild/run_zonal_tests.sh b/cloudbuild/run_zonal_tests.sh index ef94e629b..c0f8eabc2 100644 --- a/cloudbuild/run_zonal_tests.sh +++ b/cloudbuild/run_zonal_tests.sh @@ -22,5 +22,6 @@ pip install -e . echo '--- Setting up environment variables on VM ---' export ZONAL_BUCKET=${_ZONAL_BUCKET} export RUN_ZONAL_SYSTEM_TESTS=True -echo '--- Running Zonal tests on VM ---' +CURRENT_ULIMIT=$(ulimit -n) +echo '--- Running Zonal tests on VM with ulimit set to ---' $CURRENT_ULIMIT pytest -vv -s --log-format='%(asctime)s %(levelname)s %(message)s' --log-date-format='%H:%M:%S' tests/system/test_zonal.py diff --git a/cloudbuild/zb-system-tests-cloudbuild.yaml b/cloudbuild/zb-system-tests-cloudbuild.yaml index 383c4fa96..db36b24fc 100644 --- a/cloudbuild/zb-system-tests-cloudbuild.yaml +++ b/cloudbuild/zb-system-tests-cloudbuild.yaml @@ -3,6 +3,7 @@ substitutions: _ZONE: "us-central1-a" _SHORT_BUILD_ID: ${BUILD_ID:0:8} _VM_NAME: "py-sdk-sys-test-${_SHORT_BUILD_ID}" + _ULIMIT: "10000" # 10k, for gRPC bidi streams @@ -67,7 +68,7 @@ steps: # Execute the script on the VM via SSH. # Capture the exit code to ensure cleanup happens before the build fails. set +e - gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} bash run_zonal_tests.sh" + gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="ulimit -n {_ULIMIT}; COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} bash run_zonal_tests.sh" EXIT_CODE=$? set -e diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 8697410b0..d8d20ba36 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -1,5 +1,4 @@ # py standard imports -import asyncio import os import uuid from io import BytesIO @@ -8,6 +7,7 @@ import google_crc32c import pytest +import gc # current library imports from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient @@ -19,6 +19,7 @@ AsyncMultiRangeDownloader, ) + pytestmark = pytest.mark.skipif( os.getenv("RUN_ZONAL_SYSTEM_TESTS") != "True", reason="Zonal system tests need to be explicitly enabled. This helps scheduling tests in Kokoro and Cloud Build.", @@ -36,36 +37,6 @@ def _get_equal_dist(a: int, b: int) -> tuple[int, int]: return a + step, a + 2 * step -async def write_one_appendable_object( - bucket_name: str, - object_name: str, - data: bytes, -) -> None: - """Helper to write an appendable object.""" - grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client - writer = AsyncAppendableObjectWriter(grpc_client, bucket_name, object_name) - await writer.open() - await writer.append(data) - await writer.close() - - -@pytest.fixture(scope="function") -def appendable_object(storage_client, blobs_to_delete): - """Fixture to create and cleanup an appendable object.""" - object_name = f"appendable_obj_for_mrd-{str(uuid.uuid4())[:4]}" - asyncio.run( - write_one_appendable_object( - _ZONAL_BUCKET, - object_name, - _BYTES_TO_UPLOAD, - ) - ) - yield object_name - - # Clean up; use json client (i.e. `storage_client` fixture) to delete. - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - - @pytest.mark.asyncio @pytest.mark.parametrize( "object_size", @@ -114,6 +85,9 @@ async def test_basic_wrd( # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() @pytest.mark.asyncio @@ -161,12 +135,20 @@ async def test_basic_wrd_in_slices(storage_client, blobs_to_delete, object_size) # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() @pytest.mark.asyncio @pytest.mark.parametrize( "flush_interval", - [2 * 1024 * 1024, 4 * 1024 * 1024, 8 * 1024 * 1024, _DEFAULT_FLUSH_INTERVAL_BYTES], + [ + 2 * 1024 * 1024, + 4 * 1024 * 1024, + 8 * 1024 * 1024, + _DEFAULT_FLUSH_INTERVAL_BYTES, + ], ) async def test_wrd_with_non_default_flush_interval( storage_client, @@ -214,6 +196,9 @@ async def test_wrd_with_non_default_flush_interval( # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() @pytest.mark.asyncio @@ -237,20 +222,28 @@ async def test_read_unfinalized_appendable_object(storage_client, blobs_to_delet # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() @pytest.mark.asyncio -async def test_mrd_open_with_read_handle(appendable_object): - grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client +async def test_mrd_open_with_read_handle(): + grpc_client = AsyncGrpcClient().grpc_client + object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}" + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.close() - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, appendable_object) + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) await mrd.open() read_handle = mrd.read_handle await mrd.close() # Open a new MRD using the `read_handle` obtained above new_mrd = AsyncMultiRangeDownloader( - grpc_client, _ZONAL_BUCKET, appendable_object, read_handle=read_handle + grpc_client, _ZONAL_BUCKET, object_name, read_handle=read_handle ) await new_mrd.open() # persisted_size not set when opened with read_handle @@ -259,3 +252,6 @@ async def test_mrd_open_with_read_handle(appendable_object): await new_mrd.download_ranges([(0, 0, buffer)]) await new_mrd.close() assert buffer.getvalue() == _BYTES_TO_UPLOAD + del mrd + del new_mrd + gc.collect() From 1333c956da18b4db753cda98c41c3619c84caf69 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 22 Dec 2025 18:09:32 +0530 Subject: [PATCH 451/509] feat: implement "append_from_file" (#1686) feat: implement `append_from_file` --- .../asyncio/async_appendable_object_writer.py | 17 ++++++-- .../test_async_appendable_object_writer.py | 40 ++++++++++++++----- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 12a7a23ce..b4f40b423 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -21,6 +21,7 @@ if you want to use these Rapid Storage APIs. """ +from io import BufferedReader from typing import Optional, Union from google_crc32c import Checksum @@ -339,6 +340,16 @@ async def append_from_stream(self, stream_obj): """ raise NotImplementedError("append_from_stream is not implemented yet.") - async def append_from_file(self, file_path: str): - """Create a file object from `file_path` and call append_from_stream(file_obj)""" - raise NotImplementedError("append_from_file is not implemented yet.") + async def append_from_file( + self, file_obj: BufferedReader, block_size: int = _DEFAULT_FLUSH_INTERVAL_BYTES + ): + """ + Appends data to an Appendable Object using file_handle which is opened + for reading in binary mode. + + :type file_obj: file + :param file_obj: A file handle opened in binary mode for reading. + + """ + while block := file_obj.read(block_size): + await self.append(block) diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 32dbed38a..31013f9a7 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from io import BytesIO import pytest from unittest import mock @@ -23,6 +24,7 @@ ) from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( _MAX_CHUNK_SIZE_BYTES, + _DEFAULT_FLUSH_INTERVAL_BYTES, ) from google.cloud import _storage_v2 @@ -287,9 +289,6 @@ async def test_unimplemented_methods_raise_error(mock_client): with pytest.raises(NotImplementedError): await writer.append_from_stream(mock.Mock()) - with pytest.raises(NotImplementedError): - await writer.append_from_file("file.txt") - @pytest.mark.asyncio @mock.patch( @@ -536,9 +535,6 @@ async def test_append_flushes_when_buffer_is_full( mock_write_object_stream, mock_client ): """Test that append flushes the stream when the buffer size is reached.""" - from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - _DEFAULT_FLUSH_INTERVAL_BYTES, - ) writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) writer._is_stream_open = True @@ -559,9 +555,6 @@ async def test_append_flushes_when_buffer_is_full( ) async def test_append_handles_large_data(mock_write_object_stream, mock_client): """Test that append handles data larger than the buffer size.""" - from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - _DEFAULT_FLUSH_INTERVAL_BYTES, - ) writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) writer._is_stream_open = True @@ -602,3 +595,32 @@ async def test_append_data_two_times(mock_write_object_stream, mock_client): total_data_length = len(data1) + len(data2) assert writer.offset == total_data_length assert writer.simple_flush.await_count == 0 + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "file_size, block_size", + [ + (10, 4 * 1024), + (0, _DEFAULT_FLUSH_INTERVAL_BYTES), + (20 * 1024 * 1024, _DEFAULT_FLUSH_INTERVAL_BYTES), + (16 * 1024 * 1024, _DEFAULT_FLUSH_INTERVAL_BYTES), + ], +) +async def test_append_from_file(file_size, block_size, mock_client): + # arrange + fp = BytesIO(b"a" * file_size) + writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) + writer._is_stream_open = True + writer.append = mock.AsyncMock() + + # act + await writer.append_from_file(fp, block_size=block_size) + + # assert + exepected_calls = ( + file_size // block_size + if file_size % block_size == 0 + else file_size // block_size + 1 + ) + assert writer.append.await_count == exepected_calls From dfc60b3e0167790a8ade61b1b2143f297514bdd1 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 23 Dec 2025 11:23:55 +0530 Subject: [PATCH 452/509] chore: delete topic after creation (#1687) chore:delete topic after creation part of b/470069573 --- tests/system/test_notification.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/system/test_notification.py b/tests/system/test_notification.py index c21d836a3..28c07aeb0 100644 --- a/tests/system/test_notification.py +++ b/tests/system/test_notification.py @@ -60,13 +60,19 @@ def topic_path(storage_client, topic_name): @pytest.fixture(scope="session") def notification_topic(storage_client, publisher_client, topic_path, no_mtls): _helpers.retry_429(publisher_client.create_topic)(request={"name": topic_path}) - policy = publisher_client.get_iam_policy(request={"resource": topic_path}) - binding = policy.bindings.add() - binding.role = "roles/pubsub.publisher" - binding.members.append( - f"serviceAccount:{storage_client.get_service_account_email()}" - ) - publisher_client.set_iam_policy(request={"resource": topic_path, "policy": policy}) + try: + policy = publisher_client.get_iam_policy(request={"resource": topic_path}) + binding = policy.bindings.add() + binding.role = "roles/pubsub.publisher" + binding.members.append( + f"serviceAccount:{storage_client.get_service_account_email()}" + ) + publisher_client.set_iam_policy( + request={"resource": topic_path, "policy": policy} + ) + yield topic_path + finally: + publisher_client.delete_topic(request={"topic": topic_path}) @pytest.mark.skip(reason="until b/470069573 is fixed") From a994dbf9c4d6f432a5eff9da08ec88840d47c159 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 23 Dec 2025 12:02:27 +0530 Subject: [PATCH 453/509] Revert "skip notification tests until b/470069573 is fixed" (#1694) Revert "skip notification tests until b/470069573 is fixed" --- tests/system/test_notification.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/system/test_notification.py b/tests/system/test_notification.py index 28c07aeb0..48c6c4ba8 100644 --- a/tests/system/test_notification.py +++ b/tests/system/test_notification.py @@ -75,7 +75,6 @@ def notification_topic(storage_client, publisher_client, topic_path, no_mtls): publisher_client.delete_topic(request={"topic": topic_path}) -@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_minimal( storage_client, buckets_to_delete, @@ -101,7 +100,6 @@ def test_notification_create_minimal( notification.delete() -@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_explicit( storage_client, buckets_to_delete, @@ -136,7 +134,6 @@ def test_notification_create_explicit( notification.delete() -@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_w_user_project( storage_client, buckets_to_delete, @@ -165,7 +162,6 @@ def test_notification_create_w_user_project( notification.delete() -@pytest.mark.skip(reason="until b/470069573 is fixed") def test_notification_create_wo_topic_name( storage_client, buckets_to_delete, @@ -194,7 +190,6 @@ def test_notification_create_wo_topic_name( notification.create() -@pytest.mark.skip(reason="until b/470069573 is fixed") def test_bucket_get_notification( storage_client, buckets_to_delete, From d90f0ee09902a21b186106bcf0a8cb0b81b34340 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:25:58 +0530 Subject: [PATCH 454/509] feat(experimental): add bidi stream retry manager. (#1632) - Add bidi stream retry manager. It will the main class that would be responsible for retries. - Integrate MRD with bidi stream retry manager and reads resumption strategy - Added conformance tests for all error scenarios and smart resumption for bidi reads - Refactored MRD's `download_ranges()` method, which will now use retry manager's `execute()` method to send the requests - Modified the logic to parse and handle the `BidiReadObjectRedirectedError`. - Modified cloud build configuration to also pull the latest changes of the current PR. - Formatted few more files using black formatter --- cloudbuild/run_zonal_tests.sh | 1 + cloudbuild/zb-system-tests-cloudbuild.yaml | 2 +- .../storage/_experimental/asyncio/_utils.py | 3 +- .../asyncio/async_multi_range_downloader.py | 380 ++++++++++++------ .../asyncio/async_read_object_stream.py | 44 +- .../_experimental/asyncio/retry/_helpers.py | 83 ++++ .../asyncio/retry/base_strategy.py | 14 + .../retry/bidi_stream_retry_manager.py | 69 ++++ .../retry/reads_resumption_strategy.py | 104 ++++- .../cloud/storage/_media/requests/download.py | 1 - noxfile.py | 16 +- tests/conformance/test_bidi_reads.py | 266 ++++++++++++ .../retry/test_bidi_stream_retry_manager.py | 156 +++++++ .../retry/test_reads_resumption_strategy.py | 352 ++++++++++------ .../test_async_multi_range_downloader.py | 82 ++-- tests/unit/test_blob.py | 8 +- 16 files changed, 1274 insertions(+), 307 deletions(-) create mode 100644 google/cloud/storage/_experimental/asyncio/retry/_helpers.py create mode 100644 google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py create mode 100644 tests/conformance/test_bidi_reads.py create mode 100644 tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py diff --git a/cloudbuild/run_zonal_tests.sh b/cloudbuild/run_zonal_tests.sh index c0f8eabc2..283ed6826 100644 --- a/cloudbuild/run_zonal_tests.sh +++ b/cloudbuild/run_zonal_tests.sh @@ -6,6 +6,7 @@ sudo apt-get update && sudo apt-get install -y git python3-pip python3-venv # Clone the repository and checkout the specific commit from the build trigger. git clone https://github.com/googleapis/python-storage.git cd python-storage +git fetch origin "refs/pull/${_PR_NUMBER}/head" git checkout ${COMMIT_SHA} diff --git a/cloudbuild/zb-system-tests-cloudbuild.yaml b/cloudbuild/zb-system-tests-cloudbuild.yaml index db36b24fc..562eae175 100644 --- a/cloudbuild/zb-system-tests-cloudbuild.yaml +++ b/cloudbuild/zb-system-tests-cloudbuild.yaml @@ -68,7 +68,7 @@ steps: # Execute the script on the VM via SSH. # Capture the exit code to ensure cleanup happens before the build fails. set +e - gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="ulimit -n {_ULIMIT}; COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} bash run_zonal_tests.sh" + gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="ulimit -n {_ULIMIT}; COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} _PR_NUMBER=${_PR_NUMBER} bash run_zonal_tests.sh" EXIT_CODE=$? set -e diff --git a/google/cloud/storage/_experimental/asyncio/_utils.py b/google/cloud/storage/_experimental/asyncio/_utils.py index 38eb659fc..32d83a586 100644 --- a/google/cloud/storage/_experimental/asyncio/_utils.py +++ b/google/cloud/storage/_experimental/asyncio/_utils.py @@ -16,6 +16,7 @@ from google.api_core import exceptions + def raise_if_no_fast_crc32c(): """Check if the C-accelerated version of google-crc32c is available. @@ -24,7 +25,7 @@ def raise_if_no_fast_crc32c(): raises google.api_core.exceptions.FailedPrecondition: If the C extension is not available. returns: True if the C extension is available. rtype: bool - + """ if google_crc32c.implementation != "c": raise exceptions.FailedPrecondition( diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 1beedd097..8f16294d8 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -14,9 +14,13 @@ from __future__ import annotations import asyncio -from typing import List, Optional, Tuple +import logging +from google.api_core import exceptions +from google.api_core.retry_async import AsyncRetry +from google.cloud.storage._experimental.asyncio.retry._helpers import _handle_redirect +from google.rpc import status_pb2 -from google_crc32c import Checksum +from typing import List, Optional, Tuple, Any, Dict from ._utils import raise_if_no_fast_crc32c from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( @@ -25,42 +29,65 @@ from google.cloud.storage._experimental.asyncio.async_grpc_client import ( AsyncGrpcClient, ) +from google.cloud.storage._experimental.asyncio.retry.bidi_stream_retry_manager import ( + _BidiStreamRetryManager, +) +from google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy import ( + _ReadResumptionStrategy, + _DownloadState, +) from io import BytesIO from google.cloud import _storage_v2 -from google.cloud.storage.exceptions import DataCorruption from google.cloud.storage._helpers import generate_random_56_bit_integer _MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 +_BIDI_READ_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +) +logger = logging.getLogger(__name__) + + +def _is_read_retryable(exc): + """Predicate to determine if a read operation should be retried.""" + if isinstance( + exc, + ( + exceptions.InternalServerError, + exceptions.ServiceUnavailable, + exceptions.DeadlineExceeded, + exceptions.TooManyRequests, + ), + ): + return True + + if not isinstance(exc, exceptions.Aborted) or not exc.errors: + return False + + try: + grpc_error = exc.errors[0] + trailers = grpc_error.trailing_metadata() + if not trailers: + return False + + status_details_bin = next( + (v for k, v in trailers if k == "grpc-status-details-bin"), None + ) -class Result: - """An instance of this class will be populated and retured for each - `read_range` provided to ``download_ranges`` method. - - """ - - def __init__(self, bytes_requested: int): - # only while instantiation, should not be edited later. - # hence there's no setter, only getter is provided. - self._bytes_requested: int = bytes_requested - self._bytes_written: int = 0 - - @property - def bytes_requested(self) -> int: - return self._bytes_requested - - @property - def bytes_written(self) -> int: - return self._bytes_written - - @bytes_written.setter - def bytes_written(self, value: int): - self._bytes_written = value + if not status_details_bin: + return False - def __repr__(self): - return f"bytes_requested: {self._bytes_requested}, bytes_written: {self._bytes_written}" + status_proto = status_pb2.Status() + status_proto.ParseFromString(status_details_bin) + return any( + detail.type_url == _BIDI_READ_REDIRECTED_TYPE_URL + for detail in status_proto.details + ) + except Exception as e: + logger.error(f"Error parsing status_details_bin: {e}") + return False class AsyncMultiRangeDownloader: @@ -103,6 +130,8 @@ async def create_mrd( object_name: str, generation_number: Optional[int] = None, read_handle: Optional[bytes] = None, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, ) -> AsyncMultiRangeDownloader: """Initializes a MultiRangeDownloader and opens the underlying bidi-gRPC object for reading. @@ -124,11 +153,17 @@ async def create_mrd( :param read_handle: (Optional) An existing handle for reading the object. If provided, opening the bidi-gRPC connection will be faster. + :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` + :param retry_policy: (Optional) The retry policy to use for the ``open`` operation. + + :type metadata: List[Tuple[str, str]] + :param metadata: (Optional) The metadata to be sent with the ``open`` request. + :rtype: :class:`~google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader` :returns: An initialized AsyncMultiRangeDownloader instance for reading. """ mrd = cls(client, bucket_name, object_name, generation_number, read_handle) - await mrd.open() + await mrd.open(retry_policy=retry_policy, metadata=metadata) return mrd def __init__( @@ -168,44 +203,103 @@ def __init__( self.read_handle = read_handle self.read_obj_str: Optional[_AsyncReadObjectStream] = None self._is_stream_open: bool = False - + self._routing_token: Optional[str] = None self._read_id_to_writable_buffer_dict = {} self._read_id_to_download_ranges_id = {} self._download_ranges_id_to_pending_read_ids = {} self.persisted_size: Optional[int] = None # updated after opening the stream - async def open(self) -> None: - """Opens the bidi-gRPC connection to read from the object. - - This method initializes and opens an `_AsyncReadObjectStream` (bidi-gRPC stream) to - for downloading ranges of data from GCS ``Object``. + def _on_open_error(self, exc): + """Extracts routing token and read handle on redirect error during open.""" + routing_token, read_handle = _handle_redirect(exc) + if routing_token: + self._routing_token = routing_token + if read_handle: + self.read_handle = read_handle - "Opening" constitutes fetching object metadata such as generation number - and read handle and sets them as attributes if not already set. - """ + async def open( + self, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: + """Opens the bidi-gRPC connection to read from the object.""" if self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is already open") - self.read_obj_str = _AsyncReadObjectStream( - client=self.client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation_number, - read_handle=self.read_handle, - ) - await self.read_obj_str.open() - self._is_stream_open = True - if self.generation_number is None: - self.generation_number = self.read_obj_str.generation_number - self.read_handle = self.read_obj_str.read_handle - if self.read_obj_str.persisted_size is not None: - self.persisted_size = self.read_obj_str.persisted_size - return + + if retry_policy is None: + retry_policy = AsyncRetry( + predicate=_is_read_retryable, on_error=self._on_open_error + ) + else: + original_on_error = retry_policy._on_error + + def combined_on_error(exc): + self._on_open_error(exc) + if original_on_error: + original_on_error(exc) + + retry_policy = AsyncRetry( + predicate=_is_read_retryable, + initial=retry_policy._initial, + maximum=retry_policy._maximum, + multiplier=retry_policy._multiplier, + deadline=retry_policy._deadline, + on_error=combined_on_error, + ) + + async def _do_open(): + current_metadata = list(metadata) if metadata else [] + + # Cleanup stream from previous failed attempt, if any. + if self.read_obj_str: + if self.read_obj_str.is_stream_open: + try: + await self.read_obj_str.close() + except exceptions.GoogleAPICallError as e: + logger.warning( + f"Failed to close existing stream during resumption: {e}" + ) + self.read_obj_str = None + self._is_stream_open = False + + self.read_obj_str = _AsyncReadObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=self.read_handle, + ) + + if self._routing_token: + current_metadata.append( + ("x-goog-request-params", f"routing_token={self._routing_token}") + ) + self._routing_token = None + + await self.read_obj_str.open( + metadata=current_metadata if current_metadata else None + ) + + if self.read_obj_str.generation_number: + self.generation_number = self.read_obj_str.generation_number + if self.read_obj_str.read_handle: + self.read_handle = self.read_obj_str.read_handle + if self.read_obj_str.persisted_size is not None: + self.persisted_size = self.read_obj_str.persisted_size + + self._is_stream_open = True + + await retry_policy(_do_open)() async def download_ranges( - self, read_ranges: List[Tuple[int, int, BytesIO]], lock: asyncio.Lock = None + self, + read_ranges: List[Tuple[int, int, BytesIO]], + lock: asyncio.Lock = None, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, ) -> None: """Downloads multiple byte ranges from the object into the buffers - provided by user. + provided by user with automatic retries. :type read_ranges: List[Tuple[int, int, "BytesIO"]] :param read_ranges: A list of tuples, where each tuple represents a @@ -240,6 +334,8 @@ async def download_ranges( ``` + :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` + :param retry_policy: (Optional) The retry policy to use for the operation. :raises ValueError: if the underlying bidi-GRPC stream is not open. :raises ValueError: if the length of read_ranges is more than 1000. @@ -258,72 +354,122 @@ async def download_ranges( if lock is None: lock = asyncio.Lock() - _func_id = generate_random_56_bit_integer() - read_ids_in_current_func = set() - for i in range(0, len(read_ranges), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST): - read_ranges_segment = read_ranges[ - i : i + _MAX_READ_RANGES_PER_BIDI_READ_REQUEST - ] + if retry_policy is None: + retry_policy = AsyncRetry(predicate=_is_read_retryable) + + # Initialize Global State for Retry Strategy + download_states = {} + for read_range in read_ranges: + read_id = generate_random_56_bit_integer() + download_states[read_id] = _DownloadState( + initial_offset=read_range[0], + initial_length=read_range[1], + user_buffer=read_range[2], + ) - read_ranges_for_bidi_req = [] - for j, read_range in enumerate(read_ranges_segment): - read_id = generate_random_56_bit_integer() - read_ids_in_current_func.add(read_id) - self._read_id_to_download_ranges_id[read_id] = _func_id - self._read_id_to_writable_buffer_dict[read_id] = read_range[2] - bytes_requested = read_range[1] - read_ranges_for_bidi_req.append( - _storage_v2.ReadRange( - read_offset=read_range[0], - read_length=bytes_requested, - read_id=read_id, + initial_state = { + "download_states": download_states, + "read_handle": self.read_handle, + "routing_token": None, + } + + # Track attempts to manage stream reuse + attempt_count = 0 + + def send_ranges_and_get_bytes( + requests: List[_storage_v2.ReadRange], + state: Dict[str, Any], + metadata: Optional[List[Tuple[str, str]]] = None, + ): + async def generator(): + nonlocal attempt_count + attempt_count += 1 + + if attempt_count > 1: + logger.info( + f"Resuming download (attempt {attempt_count - 1}) for {len(requests)} ranges." ) - ) - async with lock: - await self.read_obj_str.send( - _storage_v2.BidiReadObjectRequest( - read_ranges=read_ranges_for_bidi_req - ) - ) - self._download_ranges_id_to_pending_read_ids[ - _func_id - ] = read_ids_in_current_func - - while len(self._download_ranges_id_to_pending_read_ids[_func_id]) > 0: - async with lock: - response = await self.read_obj_str.recv() - - if response is None: - raise Exception("None response received, something went wrong.") - - for object_data_range in response.object_data_ranges: - if object_data_range.read_range is None: - raise Exception("Invalid response, read_range is None") - checksummed_data = object_data_range.checksummed_data - data = checksummed_data.content - server_checksum = checksummed_data.crc32c - - client_crc32c = Checksum(data).digest() - client_checksum = int.from_bytes(client_crc32c, "big") - - if server_checksum != client_checksum: - raise DataCorruption( - response, - f"Checksum mismatch for read_id {object_data_range.read_range.read_id}. " - f"Server sent {server_checksum}, client calculated {client_checksum}.", + async with lock: + current_handle = state.get("read_handle") + current_token = state.get("routing_token") + + # We reopen if it's a redirect (token exists) OR if this is a retry + # (not first attempt). This prevents trying to send data on a dead + # stream from a previous failed attempt. + should_reopen = ( + (attempt_count > 1) + or (current_token is not None) + or (metadata is not None) ) - read_id = object_data_range.read_range.read_id - buffer = self._read_id_to_writable_buffer_dict[read_id] - buffer.write(data) + if should_reopen: + if current_token: + logger.info( + f"Re-opening stream with routing token: {current_token}" + ) + # Close existing stream if any + if self.read_obj_str and self.read_obj_str.is_stream_open: + await self.read_obj_str.close() + + # Re-initialize stream + self.read_obj_str = _AsyncReadObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=current_handle, + ) + + # Inject routing_token into metadata if present + current_metadata = list(metadata) if metadata else [] + if current_token: + current_metadata.append( + ( + "x-goog-request-params", + f"routing_token={current_token}", + ) + ) + + await self.read_obj_str.open( + metadata=current_metadata if current_metadata else None + ) + self._is_stream_open = True + + pending_read_ids = {r.read_id for r in requests} + + # Send Requests + for i in range( + 0, len(requests), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST + ): + batch = requests[i : i + _MAX_READ_RANGES_PER_BIDI_READ_REQUEST] + await self.read_obj_str.send( + _storage_v2.BidiReadObjectRequest(read_ranges=batch) + ) + + while pending_read_ids: + response = await self.read_obj_str.recv() + if response is None: + break + if response.object_data_ranges: + for data_range in response.object_data_ranges: + if data_range.range_end: + pending_read_ids.discard( + data_range.read_range.read_id + ) + yield response + + return generator() + + strategy = _ReadResumptionStrategy() + retry_manager = _BidiStreamRetryManager( + strategy, lambda r, s: send_ranges_and_get_bytes(r, s, metadata=metadata) + ) - if object_data_range.range_end: - tmp_dn_ranges_id = self._read_id_to_download_ranges_id[read_id] - self._download_ranges_id_to_pending_read_ids[ - tmp_dn_ranges_id - ].remove(read_id) - del self._read_id_to_download_ranges_id[read_id] + await retry_manager.execute(initial_state, retry_policy) + + if initial_state.get("read_handle"): + self.read_handle = initial_state["read_handle"] async def close(self): """ @@ -331,7 +477,9 @@ async def close(self): """ if not self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is not open") - await self.read_obj_str.close() + + if self.read_obj_str: + await self.read_obj_str.close() self.read_obj_str = None self._is_stream_open = False diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index df2430ee6..7adcdd1c9 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -22,7 +22,7 @@ """ -from typing import Optional +from typing import List, Optional, Tuple from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( @@ -89,23 +89,48 @@ def __init__( self._is_stream_open: bool = False self.persisted_size: Optional[int] = None - async def open(self) -> None: + async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: """Opens the bidi-gRPC connection to read from the object. This method sends an initial request to start the stream and receives the first response containing metadata and a read handle. + + Args: + metadata (Optional[List[Tuple[str, str]]]): Additional metadata + to send with the initial stream request, e.g., for routing tokens. """ if self._is_stream_open: raise ValueError("Stream is already open") + + read_handle = self.read_handle if self.read_handle else None + + read_object_spec = _storage_v2.BidiReadObjectSpec( + bucket=self._full_bucket_name, + object=self.object_name, + generation=self.generation_number if self.generation_number else None, + read_handle=read_handle, + ) self.first_bidi_read_req = _storage_v2.BidiReadObjectRequest( - read_object_spec=_storage_v2.BidiReadObjectSpec( - bucket=self._full_bucket_name, - object=self.object_name, - read_handle=self.read_handle, - ), + read_object_spec=read_object_spec ) + + # Build the x-goog-request-params header + request_params = [f"bucket={self._full_bucket_name}"] + other_metadata = [] + if metadata: + for key, value in metadata: + if key == "x-goog-request-params": + request_params.append(value) + else: + other_metadata.append((key, value)) + + current_metadata = other_metadata + current_metadata.append(("x-goog-request-params", ",".join(request_params))) + self.socket_like_rpc = AsyncBidiRpc( - self.rpc, initial_request=self.first_bidi_read_req, metadata=self.metadata + self.rpc, + initial_request=self.first_bidi_read_req, + metadata=current_metadata, ) await self.socket_like_rpc.open() # this is actually 1 send response = await self.socket_like_rpc.recv() @@ -117,7 +142,8 @@ async def open(self) -> None: # update persisted size self.persisted_size = response.metadata.size - self.read_handle = response.read_handle + if response and response.read_handle: + self.read_handle = response.read_handle self._is_stream_open = True diff --git a/google/cloud/storage/_experimental/asyncio/retry/_helpers.py b/google/cloud/storage/_experimental/asyncio/retry/_helpers.py new file mode 100644 index 000000000..627bf5944 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/retry/_helpers.py @@ -0,0 +1,83 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Tuple, Optional + +from google.api_core import exceptions +from google.cloud._storage_v2.types import BidiReadObjectRedirectedError +from google.rpc import status_pb2 + +_BIDI_READ_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +) + + +def _handle_redirect( + exc: Exception, +) -> Tuple[Optional[str], Optional[bytes]]: + """ + Extracts routing token and read handle from a gRPC error. + + :type exc: Exception + :param exc: The exception to parse. + + :rtype: Tuple[Optional[str], Optional[bytes]] + :returns: A tuple of (routing_token, read_handle). + """ + routing_token = None + read_handle = None + + grpc_error = None + if isinstance(exc, exceptions.Aborted) and exc.errors: + grpc_error = exc.errors[0] + + if grpc_error: + if isinstance(grpc_error, BidiReadObjectRedirectedError): + routing_token = grpc_error.routing_token + if grpc_error.read_handle: + read_handle = grpc_error.read_handle + return routing_token, read_handle + + if hasattr(grpc_error, "trailing_metadata"): + trailers = grpc_error.trailing_metadata() + if not trailers: + return None, None + + status_details_bin = None + for key, value in trailers: + if key == "grpc-status-details-bin": + status_details_bin = value + break + + if status_details_bin: + status_proto = status_pb2.Status() + try: + status_proto.ParseFromString(status_details_bin) + for detail in status_proto.details: + if detail.type_url == _BIDI_READ_REDIRECTED_TYPE_URL: + redirect_proto = BidiReadObjectRedirectedError.deserialize( + detail.value + ) + if redirect_proto.routing_token: + routing_token = redirect_proto.routing_token + if redirect_proto.read_handle: + read_handle = redirect_proto.read_handle + break + except Exception as e: + logging.ERROR(f"Error unpacking redirect: {e}") + + return routing_token, read_handle diff --git a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py index e32125069..ff193f109 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py @@ -1,3 +1,17 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import abc from typing import Any, Iterable diff --git a/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py b/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py new file mode 100644 index 000000000..a8caae4eb --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py @@ -0,0 +1,69 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from typing import Any, AsyncIterator, Callable + +from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( + _BaseResumptionStrategy, +) + +logger = logging.getLogger(__name__) + + +class _BidiStreamRetryManager: + """Manages the generic retry loop for a bidi streaming operation.""" + + def __init__( + self, + strategy: _BaseResumptionStrategy, + send_and_recv: Callable[..., AsyncIterator[Any]], + ): + """Initializes the retry manager. + Args: + strategy: The strategy for managing the state of a specific + bidi operation (e.g., reads or writes). + send_and_recv: An async callable that opens a new gRPC stream. + """ + self._strategy = strategy + self._send_and_recv = send_and_recv + + async def execute(self, initial_state: Any, retry_policy): + """ + Executes the bidi operation with the configured retry policy. + Args: + initial_state: An object containing all state for the operation. + retry_policy: The `google.api_core.retry.AsyncRetry` object to + govern the retry behavior for this specific operation. + """ + state = initial_state + + async def attempt(): + requests = self._strategy.generate_requests(state) + stream = self._send_and_recv(requests, state) + try: + async for response in stream: + self._strategy.update_state_from_response(response, state) + return + except Exception as e: + if retry_policy._predicate(e): + logger.info( + f"Bidi stream operation failed: {e}. Attempting state recovery and retry." + ) + await self._strategy.recover_state_on_failure(e, state) + raise e + + wrapped_attempt = retry_policy(attempt) + + await wrapped_attempt() diff --git a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py index d5d080358..916b82e6e 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py @@ -1,11 +1,35 @@ -from typing import Any, List, IO +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Any, Dict, List, IO +import logging + +from google_crc32c import Checksum from google.cloud import _storage_v2 as storage_v2 from google.cloud.storage.exceptions import DataCorruption +from google.cloud.storage._experimental.asyncio.retry._helpers import ( + _handle_redirect, +) from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( _BaseResumptionStrategy, ) -from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError + + +_BIDI_READ_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +) +logger = logging.getLogger(__name__) class _DownloadState: @@ -25,7 +49,7 @@ def __init__( class _ReadResumptionStrategy(_BaseResumptionStrategy): """The concrete resumption strategy for bidi reads.""" - def generate_requests(self, state: dict) -> List[storage_v2.ReadRange]: + def generate_requests(self, state: Dict[str, Any]) -> List[storage_v2.ReadRange]: """Generates new ReadRange requests for all incomplete downloads. :type state: dict @@ -33,10 +57,17 @@ def generate_requests(self, state: dict) -> List[storage_v2.ReadRange]: _DownloadState object. """ pending_requests = [] - for read_id, read_state in state.items(): + download_states: Dict[int, _DownloadState] = state["download_states"] + + for read_id, read_state in download_states.items(): if not read_state.is_complete: new_offset = read_state.initial_offset + read_state.bytes_written - new_length = read_state.initial_length - read_state.bytes_written + + # Calculate remaining length. If initial_length is 0 (read to end), + # it stays 0. Otherwise, subtract bytes_written. + new_length = 0 + if read_state.initial_length > 0: + new_length = read_state.initial_length - read_state.bytes_written new_request = storage_v2.ReadRange( read_offset=new_offset, @@ -47,39 +78,80 @@ def generate_requests(self, state: dict) -> List[storage_v2.ReadRange]: return pending_requests def update_state_from_response( - self, response: storage_v2.BidiReadObjectResponse, state: dict + self, response: storage_v2.BidiReadObjectResponse, state: Dict[str, Any] ) -> None: """Processes a server response, performs integrity checks, and updates state.""" + + # Capture read_handle if provided. + if response.read_handle: + state["read_handle"] = response.read_handle + + download_states = state["download_states"] + for object_data_range in response.object_data_ranges: + # Ignore empty ranges or ranges for IDs not in our state + # (e.g., from a previously cancelled request on the same stream). + if not object_data_range.read_range: + logger.warning( + "Received response with missing read_range field; ignoring." + ) + continue + read_id = object_data_range.read_range.read_id - read_state = state[read_id] + if read_id not in download_states: + logger.warning( + f"Received data for unknown or stale read_id {read_id}; ignoring." + ) + continue + + read_state = download_states[read_id] # Offset Verification chunk_offset = object_data_range.read_range.read_offset if chunk_offset != read_state.next_expected_offset: - raise DataCorruption(response, f"Offset mismatch for read_id {read_id}") + raise DataCorruption( + response, + f"Offset mismatch for read_id {read_id}. " + f"Expected {read_state.next_expected_offset}, got {chunk_offset}", + ) + # Checksum Verification + # We must validate data before updating state or writing to buffer. data = object_data_range.checksummed_data.content + server_checksum = object_data_range.checksummed_data.crc32c + + if server_checksum is not None: + client_checksum = int.from_bytes(Checksum(data).digest(), "big") + if server_checksum != client_checksum: + raise DataCorruption( + response, + f"Checksum mismatch for read_id {read_id}. " + f"Server sent {server_checksum}, client calculated {client_checksum}.", + ) + + # Update State & Write Data chunk_size = len(data) + read_state.user_buffer.write(data) read_state.bytes_written += chunk_size read_state.next_expected_offset += chunk_size - read_state.user_buffer.write(data) # Final Byte Count Verification if object_data_range.range_end: read_state.is_complete = True if ( read_state.initial_length != 0 - and read_state.bytes_written != read_state.initial_length + and read_state.bytes_written > read_state.initial_length ): raise DataCorruption( - response, f"Byte count mismatch for read_id {read_id}" + response, + f"Byte count mismatch for read_id {read_id}. " + f"Expected {read_state.initial_length}, got {read_state.bytes_written}", ) async def recover_state_on_failure(self, error: Exception, state: Any) -> None: """Handles BidiReadObjectRedirectedError for reads.""" - # This would parse the gRPC error details, extract the routing_token, - # and store it on the shared state object. - cause = getattr(error, "cause", error) - if isinstance(cause, BidiReadObjectRedirectedError): - state["routing_token"] = cause.routing_token + routing_token, read_handle = _handle_redirect(error) + if routing_token: + state["routing_token"] = routing_token + if read_handle: + state["read_handle"] = read_handle diff --git a/google/cloud/storage/_media/requests/download.py b/google/cloud/storage/_media/requests/download.py index 13e049bd3..c5686fcb7 100644 --- a/google/cloud/storage/_media/requests/download.py +++ b/google/cloud/storage/_media/requests/download.py @@ -774,6 +774,5 @@ def flush(self): def has_unconsumed_tail(self) -> bool: return self._decoder.has_unconsumed_tail - else: # pragma: NO COVER _BrotliDecoder = None # type: ignore # pragma: NO COVER diff --git a/noxfile.py b/noxfile.py index 14dfb29d0..4f77d1e2d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -225,10 +225,22 @@ def conftest_retry(session): if not conformance_test_folder_exists: session.skip("Conformance tests were not found") + constraints_path = str( + CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" + ) + # Install all test dependencies and pytest plugin to run tests in parallel. # Then install this package in-place. - session.install("pytest", "pytest-xdist") - session.install("-e", ".") + session.install( + "pytest", + "pytest-xdist", + "grpcio", + "grpcio-status", + "grpc-google-iam-v1", + "-c", + constraints_path, + ) + session.install("-e", ".", "-c", constraints_path) # Run #CPU processes in parallel if no test session arguments are passed in. if session.posargs: diff --git a/tests/conformance/test_bidi_reads.py b/tests/conformance/test_bidi_reads.py new file mode 100644 index 000000000..4157182cb --- /dev/null +++ b/tests/conformance/test_bidi_reads.py @@ -0,0 +1,266 @@ +import asyncio +import io +import uuid +import grpc +import requests + +from google.api_core import exceptions +from google.auth import credentials as auth_credentials +from google.cloud import _storage_v2 as storage_v2 + +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + +# --- Configuration --- +PROJECT_NUMBER = "12345" # A dummy project number is fine for the testbench. +GRPC_ENDPOINT = "localhost:8888" +HTTP_ENDPOINT = "http://localhost:9000" +CONTENT_LENGTH = 1024 * 10 # 10 KB + + +def _is_retriable(exc): + """Predicate for identifying retriable errors.""" + return isinstance( + exc, + ( + exceptions.ServiceUnavailable, + exceptions.Aborted, # Required to retry on redirect + exceptions.InternalServerError, + exceptions.ResourceExhausted, + ), + ) + + +async def run_test_scenario( + gapic_client, http_client, bucket_name, object_name, scenario +): + """Runs a single fault-injection test scenario.""" + print(f"\n--- RUNNING SCENARIO: {scenario['name']} ---") + + retry_test_id = None + try: + # 1. Create a Retry Test resource on the testbench. + retry_test_config = { + "instructions": {scenario["method"]: [scenario["instruction"]]}, + "transport": "GRPC", + } + resp = http_client.post(f"{HTTP_ENDPOINT}/retry_test", json=retry_test_config) + resp.raise_for_status() + retry_test_id = resp.json()["id"] + + # 2. Set up downloader and metadata for fault injection. + downloader = await AsyncMultiRangeDownloader.create_mrd( + gapic_client, bucket_name, object_name + ) + fault_injection_metadata = (("x-retry-test-id", retry_test_id),) + + buffer = io.BytesIO() + + # 3. Execute the download and assert the outcome. + try: + await downloader.download_ranges( + [(0, 5 * 1024, buffer), (6 * 1024, 4 * 1024, buffer)], + metadata=fault_injection_metadata, + ) + # If an exception was expected, this line should not be reached. + if scenario["expected_error"] is not None: + raise AssertionError( + f"Expected exception {scenario['expected_error']} was not raised." + ) + + assert len(buffer.getvalue()) == 9 * 1024 + + except scenario["expected_error"] as e: + print(f"Caught expected exception for {scenario['name']}: {e}") + + await downloader.close() + + finally: + # 4. Clean up the Retry Test resource. + if retry_test_id: + http_client.delete(f"{HTTP_ENDPOINT}/retry_test/{retry_test_id}") + + +async def main(): + """Main function to set up resources and run all test scenarios.""" + channel = grpc.aio.insecure_channel(GRPC_ENDPOINT) + creds = auth_credentials.AnonymousCredentials() + transport = storage_v2.services.storage.transports.StorageGrpcAsyncIOTransport( + channel=channel, credentials=creds + ) + gapic_client = storage_v2.StorageAsyncClient(transport=transport) + http_client = requests.Session() + + bucket_name = f"grpc-test-bucket-{uuid.uuid4().hex[:8]}" + object_name = "retry-test-object" + + # Define all test scenarios + test_scenarios = [ + { + "name": "Retry on Service Unavailable (503)", + "method": "storage.objects.get", + "instruction": "return-503", + "expected_error": None, + }, + { + "name": "Retry on 500", + "method": "storage.objects.get", + "instruction": "return-500", + "expected_error": None, + }, + { + "name": "Retry on 504", + "method": "storage.objects.get", + "instruction": "return-504", + "expected_error": None, + }, + { + "name": "Retry on 429", + "method": "storage.objects.get", + "instruction": "return-429", + "expected_error": None, + }, + { + "name": "Smarter Resumption: Retry 503 after partial data", + "method": "storage.objects.get", + "instruction": "return-broken-stream-after-2K", + "expected_error": None, + }, + { + "name": "Retry on BidiReadObjectRedirectedError", + "method": "storage.objects.get", + "instruction": "redirect-send-handle-and-token-tokenval", # Testbench instruction for redirect + "expected_error": None, + }, + ] + + try: + # Create a single bucket and object for all tests to use. + content = b"A" * CONTENT_LENGTH + bucket_resource = storage_v2.Bucket(project=f"projects/{PROJECT_NUMBER}") + create_bucket_request = storage_v2.CreateBucketRequest( + parent="projects/_", bucket_id=bucket_name, bucket=bucket_resource + ) + await gapic_client.create_bucket(request=create_bucket_request) + + write_spec = storage_v2.WriteObjectSpec( + resource=storage_v2.Object( + bucket=f"projects/_/buckets/{bucket_name}", name=object_name + ) + ) + + async def write_req_gen(): + yield storage_v2.WriteObjectRequest( + write_object_spec=write_spec, + checksummed_data={"content": content}, + finish_write=True, + ) + + await gapic_client.write_object(requests=write_req_gen()) + + # Run all defined test scenarios. + for scenario in test_scenarios: + await run_test_scenario( + gapic_client, http_client, bucket_name, object_name, scenario + ) + + # Define and run test scenarios specifically for the open() method + open_test_scenarios = [ + { + "name": "Open: Retry on 503", + "method": "storage.objects.get", + "instruction": "return-503", + "expected_error": None, + }, + { + "name": "Open: Retry on BidiReadObjectRedirectedError", + "method": "storage.objects.get", + "instruction": "redirect-send-handle-and-token-tokenval", + "expected_error": None, + }, + { + "name": "Open: Fail Fast on 401", + "method": "storage.objects.get", + "instruction": "return-401", + "expected_error": exceptions.Unauthorized, + }, + ] + for scenario in open_test_scenarios: + await run_open_test_scenario( + gapic_client, http_client, bucket_name, object_name, scenario + ) + + except Exception: + import traceback + + traceback.print_exc() + finally: + # Clean up the test bucket. + try: + delete_object_req = storage_v2.DeleteObjectRequest( + bucket="projects/_/buckets/" + bucket_name, object=object_name + ) + await gapic_client.delete_object(request=delete_object_req) + + delete_bucket_req = storage_v2.DeleteBucketRequest( + name=f"projects/_/buckets/{bucket_name}" + ) + await gapic_client.delete_bucket(request=delete_bucket_req) + except Exception as e: + print(f"Warning: Cleanup failed: {e}") + + +async def run_open_test_scenario( + gapic_client, http_client, bucket_name, object_name, scenario +): + """Runs a fault-injection test scenario specifically for the open() method.""" + print(f"\n--- RUNNING SCENARIO: {scenario['name']} ---") + + retry_test_id = None + try: + # 1. Create a Retry Test resource on the testbench. + retry_test_config = { + "instructions": {scenario["method"]: [scenario["instruction"]]}, + "transport": "GRPC", + } + resp = http_client.post(f"{HTTP_ENDPOINT}/retry_test", json=retry_test_config) + resp.raise_for_status() + retry_test_id = resp.json()["id"] + print(f"Retry Test created with ID: {retry_test_id}") + + # 2. Set up metadata for fault injection. + fault_injection_metadata = (("x-retry-test-id", retry_test_id),) + + # 3. Execute the open (via create_mrd) and assert the outcome. + try: + downloader = await AsyncMultiRangeDownloader.create_mrd( + gapic_client, + bucket_name, + object_name, + metadata=fault_injection_metadata, + ) + + # If open was successful, perform a simple download to ensure the stream is usable. + buffer = io.BytesIO() + await downloader.download_ranges([(0, 1024, buffer)]) + await downloader.close() + assert len(buffer.getvalue()) == 1024 + + # If an exception was expected, this line should not be reached. + if scenario["expected_error"] is not None: + raise AssertionError( + f"Expected exception {scenario['expected_error']} was not raised." + ) + + except scenario["expected_error"] as e: + print(f"Caught expected exception for {scenario['name']}: {e}") + + finally: + # 4. Clean up the Retry Test resource. + if retry_test_id: + http_client.delete(f"{HTTP_ENDPOINT}/retry_test/{retry_test_id}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py b/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py new file mode 100644 index 000000000..6c837ec5c --- /dev/null +++ b/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py @@ -0,0 +1,156 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest import mock + +import pytest +from google.api_core import exceptions +from google.api_core.retry_async import AsyncRetry + +from google.cloud.storage._experimental.asyncio.retry import ( + bidi_stream_retry_manager as manager, +) +from google.cloud.storage._experimental.asyncio.retry import base_strategy + + +def _is_retriable(exc): + return isinstance(exc, exceptions.ServiceUnavailable) + + +DEFAULT_TEST_RETRY = AsyncRetry(predicate=_is_retriable, deadline=1) + + +class TestBidiStreamRetryManager: + @pytest.mark.asyncio + async def test_execute_success_on_first_try(self): + mock_strategy = mock.AsyncMock(spec=base_strategy._BaseResumptionStrategy) + + async def mock_send_and_recv(*args, **kwargs): + yield "response_1" + + retry_manager = manager._BidiStreamRetryManager( + strategy=mock_strategy, send_and_recv=mock_send_and_recv + ) + await retry_manager.execute(initial_state={}, retry_policy=DEFAULT_TEST_RETRY) + mock_strategy.generate_requests.assert_called_once() + mock_strategy.update_state_from_response.assert_called_once_with( + "response_1", {} + ) + mock_strategy.recover_state_on_failure.assert_not_called() + + @pytest.mark.asyncio + async def test_execute_success_on_empty_stream(self): + mock_strategy = mock.AsyncMock(spec=base_strategy._BaseResumptionStrategy) + + async def mock_send_and_recv(*args, **kwargs): + if False: + yield + + retry_manager = manager._BidiStreamRetryManager( + strategy=mock_strategy, send_and_recv=mock_send_and_recv + ) + await retry_manager.execute(initial_state={}, retry_policy=DEFAULT_TEST_RETRY) + + mock_strategy.generate_requests.assert_called_once() + mock_strategy.update_state_from_response.assert_not_called() + mock_strategy.recover_state_on_failure.assert_not_called() + + @pytest.mark.asyncio + async def test_execute_retries_on_initial_failure_and_succeeds(self): + mock_strategy = mock.AsyncMock(spec=base_strategy._BaseResumptionStrategy) + attempt_count = 0 + + async def mock_send_and_recv(*args, **kwargs): + nonlocal attempt_count + attempt_count += 1 + if attempt_count == 1: + raise exceptions.ServiceUnavailable("Service is down") + else: + yield "response_2" + + retry_manager = manager._BidiStreamRetryManager( + strategy=mock_strategy, send_and_recv=mock_send_and_recv + ) + retry_policy = AsyncRetry(predicate=_is_retriable, initial=0.01) + + with mock.patch("asyncio.sleep", new_callable=mock.AsyncMock): + await retry_manager.execute(initial_state={}, retry_policy=retry_policy) + + assert attempt_count == 2 + assert mock_strategy.generate_requests.call_count == 2 + mock_strategy.recover_state_on_failure.assert_called_once() + mock_strategy.update_state_from_response.assert_called_once_with( + "response_2", {} + ) + + @pytest.mark.asyncio + async def test_execute_retries_and_succeeds_mid_stream(self): + """Test retry logic for a stream that fails after yielding some data.""" + mock_strategy = mock.AsyncMock(spec=base_strategy._BaseResumptionStrategy) + attempt_count = 0 + # Use a list to simulate stream content for each attempt + stream_content = [ + ["response_1", exceptions.ServiceUnavailable("Service is down")], + ["response_2"], + ] + + async def mock_send_and_recv(*args, **kwargs): + nonlocal attempt_count + content = stream_content[attempt_count] + attempt_count += 1 + for item in content: + if isinstance(item, Exception): + raise item + else: + yield item + + retry_manager = manager._BidiStreamRetryManager( + strategy=mock_strategy, send_and_recv=mock_send_and_recv + ) + retry_policy = AsyncRetry(predicate=_is_retriable, initial=0.01) + + with mock.patch("asyncio.sleep", new_callable=mock.AsyncMock) as mock_sleep: + await retry_manager.execute(initial_state={}, retry_policy=retry_policy) + + assert attempt_count == 2 + mock_sleep.assert_called_once() + + assert mock_strategy.generate_requests.call_count == 2 + mock_strategy.recover_state_on_failure.assert_called_once() + assert mock_strategy.update_state_from_response.call_count == 2 + mock_strategy.update_state_from_response.assert_has_calls( + [ + mock.call("response_1", {}), + mock.call("response_2", {}), + ] + ) + + @pytest.mark.asyncio + async def test_execute_fails_immediately_on_non_retriable_error(self): + mock_strategy = mock.AsyncMock(spec=base_strategy._BaseResumptionStrategy) + + async def mock_send_and_recv(*args, **kwargs): + if False: + yield + raise exceptions.PermissionDenied("Auth error") + + retry_manager = manager._BidiStreamRetryManager( + strategy=mock_strategy, send_and_recv=mock_send_and_recv + ) + with pytest.raises(exceptions.PermissionDenied): + await retry_manager.execute( + initial_state={}, retry_policy=DEFAULT_TEST_RETRY + ) + + mock_strategy.recover_state_on_failure.assert_not_called() diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py index e6b343f86..2ddd87f1f 100644 --- a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -12,9 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import io import unittest -import pytest +from google_crc32c import Checksum from google.cloud.storage.exceptions import DataCorruption from google.api_core import exceptions @@ -26,6 +27,7 @@ from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError _READ_ID = 1 +LOGGER_NAME = "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy" class TestDownloadState(unittest.TestCase): @@ -45,14 +47,67 @@ def test_initialization(self): class TestReadResumptionStrategy(unittest.TestCase): + def setUp(self): + self.strategy = _ReadResumptionStrategy() + + self.state = {"download_states": {}, "read_handle": None, "routing_token": None} + + def _add_download(self, read_id, offset=0, length=100, buffer=None): + """Helper to inject a download state into the correct nested location.""" + if buffer is None: + buffer = io.BytesIO() + state = _DownloadState( + initial_offset=offset, initial_length=length, user_buffer=buffer + ) + self.state["download_states"][read_id] = state + return state + + def _create_response( + self, + content, + read_id, + offset, + crc=None, + range_end=False, + handle=None, + has_read_range=True, + ): + """Helper to create a response object.""" + checksummed_data = None + if content is not None: + if crc is None: + c = Checksum(content) + crc = int.from_bytes(c.digest(), "big") + checksummed_data = storage_v2.ChecksummedData(content=content, crc32c=crc) + + read_range = None + if has_read_range: + read_range = storage_v2.ReadRange(read_id=read_id, read_offset=offset) + + read_handle_message = None + if handle: + read_handle_message = storage_v2.BidiReadHandle(handle=handle) + self.state["read_handle"] = handle + + return storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + storage_v2.ObjectRangeData( + checksummed_data=checksummed_data, + read_range=read_range, + range_end=range_end, + ) + ], + read_handle=read_handle_message, + ) + + # --- Request Generation Tests --- + def test_generate_requests_single_incomplete(self): """Test generating a request for a single incomplete download.""" - read_state = _DownloadState(0, 100, io.BytesIO()) + read_state = self._add_download(_READ_ID, offset=0, length=100) read_state.bytes_written = 20 - state = {_READ_ID: read_state} - read_strategy = _ReadResumptionStrategy() - requests = read_strategy.generate_requests(state) + requests = self.strategy.generate_requests(self.state) self.assertEqual(len(requests), 1) self.assertEqual(requests[0].read_offset, 20) @@ -62,173 +117,238 @@ def test_generate_requests_single_incomplete(self): def test_generate_requests_multiple_incomplete(self): """Test generating requests for multiple incomplete downloads.""" read_id2 = 2 - read_state1 = _DownloadState(0, 100, io.BytesIO()) - read_state1.bytes_written = 50 - read_state2 = _DownloadState(200, 100, io.BytesIO()) - state = {_READ_ID: read_state1, read_id2: read_state2} + rs1 = self._add_download(_READ_ID, offset=0, length=100) + rs1.bytes_written = 50 + + self._add_download(read_id2, offset=200, length=100) - read_strategy = _ReadResumptionStrategy() - requests = read_strategy.generate_requests(state) + requests = self.strategy.generate_requests(self.state) self.assertEqual(len(requests), 2) - req1 = next(request for request in requests if request.read_id == _READ_ID) - req2 = next(request for request in requests if request.read_id == read_id2) + requests.sort(key=lambda r: r.read_id) + req1 = requests[0] + req2 = requests[1] + + self.assertEqual(req1.read_id, _READ_ID) self.assertEqual(req1.read_offset, 50) self.assertEqual(req1.read_length, 50) + + self.assertEqual(req2.read_id, read_id2) self.assertEqual(req2.read_offset, 200) self.assertEqual(req2.read_length, 100) + def test_generate_requests_read_to_end_resumption(self): + """Test resumption for 'read to end' (length=0) requests.""" + read_state = self._add_download(_READ_ID, offset=0, length=0) + read_state.bytes_written = 500 + + requests = self.strategy.generate_requests(self.state) + + self.assertEqual(len(requests), 1) + self.assertEqual(requests[0].read_offset, 500) + self.assertEqual(requests[0].read_length, 0) + def test_generate_requests_with_complete(self): """Test that no request is generated for a completed download.""" - read_state = _DownloadState(0, 100, io.BytesIO()) + read_state = self._add_download(_READ_ID) read_state.is_complete = True - state = {_READ_ID: read_state} - - read_strategy = _ReadResumptionStrategy() - requests = read_strategy.generate_requests(state) + requests = self.strategy.generate_requests(self.state) self.assertEqual(len(requests), 0) + def test_generate_requests_multiple_mixed_states(self): + """Test generating requests with mixed complete, partial, and fresh states.""" + s1 = self._add_download(1, length=100) + s1.is_complete = True + + s2 = self._add_download(2, offset=0, length=100) + s2.bytes_written = 50 + + s3 = self._add_download(3, offset=200, length=100) + s3.bytes_written = 0 + + requests = self.strategy.generate_requests(self.state) + + self.assertEqual(len(requests), 2) + requests.sort(key=lambda r: r.read_id) + + self.assertEqual(requests[0].read_id, 2) + self.assertEqual(requests[1].read_id, 3) + def test_generate_requests_empty_state(self): """Test generating requests with an empty state.""" - read_strategy = _ReadResumptionStrategy() - requests = read_strategy.generate_requests({}) + requests = self.strategy.generate_requests(self.state) self.assertEqual(len(requests), 0) + # --- Update State and response processing Tests --- + def test_update_state_processes_single_chunk_successfully(self): """Test updating state from a successful response.""" - buffer = io.BytesIO() - read_state = _DownloadState(0, 100, buffer) - state = {_READ_ID: read_state} + read_state = self._add_download(_READ_ID, offset=0, length=100) data = b"test_data" - read_strategy = _ReadResumptionStrategy() - response = storage_v2.BidiReadObjectResponse( - object_data_ranges=[ - storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange( - read_id=_READ_ID, read_offset=0, read_length=len(data) - ), - checksummed_data=storage_v2.ChecksummedData(content=data), - ) - ] - ) + response = self._create_response(data, _READ_ID, offset=0) - read_strategy.update_state_from_response(response, state) + self.strategy.update_state_from_response(response, self.state) self.assertEqual(read_state.bytes_written, len(data)) self.assertEqual(read_state.next_expected_offset, len(data)) self.assertFalse(read_state.is_complete) - self.assertEqual(buffer.getvalue(), data) + self.assertEqual(read_state.user_buffer.getvalue(), data) + + def test_update_state_accumulates_chunks(self): + """Verify that state updates correctly over multiple chunks.""" + read_state = self._add_download(_READ_ID, offset=0, length=8) + + resp1 = self._create_response(b"test", _READ_ID, offset=0) + self.strategy.update_state_from_response(resp1, self.state) + + self.assertEqual(read_state.bytes_written, 4) + self.assertEqual(read_state.user_buffer.getvalue(), b"test") + + resp2 = self._create_response(b"data", _READ_ID, offset=4, range_end=True) + self.strategy.update_state_from_response(resp2, self.state) + + self.assertEqual(read_state.bytes_written, 8) + self.assertTrue(read_state.is_complete) + self.assertEqual(read_state.user_buffer.getvalue(), b"testdata") + + def test_update_state_captures_read_handle(self): + """Verify read_handle is extracted from the response.""" + self._add_download(_READ_ID) + + new_handle = b"optimized_handle" + response = self._create_response(b"data", _READ_ID, 0, handle=new_handle) - def test_update_state_from_response_offset_mismatch(self): + self.strategy.update_state_from_response(response, self.state) + self.assertEqual(self.state["read_handle"].handle, new_handle) + + def test_update_state_unknown_id(self): + """Verify we ignore data for IDs not in our tracking state.""" + self._add_download(_READ_ID) + response = self._create_response(b"ghost", read_id=999, offset=0) + + self.strategy.update_state_from_response(response, self.state) + self.assertEqual(self.state["download_states"][_READ_ID].bytes_written, 0) + + def test_update_state_missing_read_range(self): + """Verify we ignore ranges without read_range metadata.""" + response = self._create_response(b"data", _READ_ID, 0, has_read_range=False) + self.strategy.update_state_from_response(response, self.state) + + def test_update_state_offset_mismatch(self): """Test that an offset mismatch raises DataCorruption.""" - read_state = _DownloadState(0, 100, io.BytesIO()) + read_state = self._add_download(_READ_ID, offset=0) read_state.next_expected_offset = 10 - state = {_READ_ID: read_state} - read_strategy = _ReadResumptionStrategy() - response = storage_v2.BidiReadObjectResponse( - object_data_ranges=[ - storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange( - read_id=_READ_ID, read_offset=0, read_length=4 - ), - checksummed_data=storage_v2.ChecksummedData(content=b"data"), - ) - ] - ) + response = self._create_response(b"data", _READ_ID, offset=0) - with pytest.raises(DataCorruption) as exc_info: - read_strategy.update_state_from_response(response, state) - assert "Offset mismatch" in str(exc_info.value) + with self.assertRaisesRegex(DataCorruption, "Offset mismatch"): + self.strategy.update_state_from_response(response, self.state) - def test_update_state_from_response_final_byte_count_mismatch(self): - """Test that a final byte count mismatch raises DataCorruption.""" - read_state = _DownloadState(0, 100, io.BytesIO()) - state = {_READ_ID: read_state} - read_strategy = _ReadResumptionStrategy() + def test_update_state_checksum_mismatch(self): + """Test that a CRC32C mismatch raises DataCorruption.""" + self._add_download(_READ_ID) + response = self._create_response(b"data", _READ_ID, offset=0, crc=999999) - response = storage_v2.BidiReadObjectResponse( - object_data_ranges=[ - storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange( - read_id=_READ_ID, read_offset=0, read_length=4 - ), - checksummed_data=storage_v2.ChecksummedData(content=b"data"), - range_end=True, - ) - ] - ) + with self.assertRaisesRegex(DataCorruption, "Checksum mismatch"): + self.strategy.update_state_from_response(response, self.state) + + def test_update_state_final_byte_count_mismatch(self): + """Test mismatch between expected length and actual bytes written on completion.""" + self._add_download(_READ_ID, length=100) - with pytest.raises(DataCorruption) as exc_info: - read_strategy.update_state_from_response(response, state) - assert "Byte count mismatch" in str(exc_info.value) + data = b"data" * 30 + response = self._create_response(data, _READ_ID, offset=0, range_end=True) - def test_update_state_from_response_completes_download(self): + with self.assertRaisesRegex(DataCorruption, "Byte count mismatch"): + self.strategy.update_state_from_response(response, self.state) + + def test_update_state_completes_download(self): """Test that the download is marked complete on range_end.""" - buffer = io.BytesIO() data = b"test_data" - read_state = _DownloadState(0, len(data), buffer) - state = {_READ_ID: read_state} - read_strategy = _ReadResumptionStrategy() + read_state = self._add_download(_READ_ID, length=len(data)) - response = storage_v2.BidiReadObjectResponse( - object_data_ranges=[ - storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange( - read_id=_READ_ID, read_offset=0, read_length=len(data) - ), - checksummed_data=storage_v2.ChecksummedData(content=data), - range_end=True, - ) - ] - ) + response = self._create_response(data, _READ_ID, offset=0, range_end=True) - read_strategy.update_state_from_response(response, state) + self.strategy.update_state_from_response(response, self.state) self.assertTrue(read_state.is_complete) self.assertEqual(read_state.bytes_written, len(data)) - self.assertEqual(buffer.getvalue(), data) - def test_update_state_from_response_completes_download_zero_length(self): + def test_update_state_completes_download_zero_length(self): """Test completion for a download with initial_length of 0.""" - buffer = io.BytesIO() + read_state = self._add_download(_READ_ID, length=0) data = b"test_data" - read_state = _DownloadState(0, 0, buffer) - state = {_READ_ID: read_state} - read_strategy = _ReadResumptionStrategy() - response = storage_v2.BidiReadObjectResponse( - object_data_ranges=[ - storage_v2.types.ObjectRangeData( - read_range=storage_v2.ReadRange( - read_id=_READ_ID, read_offset=0, read_length=len(data) - ), - checksummed_data=storage_v2.ChecksummedData(content=data), - range_end=True, - ) - ] - ) + response = self._create_response(data, _READ_ID, offset=0, range_end=True) - read_strategy.update_state_from_response(response, state) + self.strategy.update_state_from_response(response, self.state) self.assertTrue(read_state.is_complete) self.assertEqual(read_state.bytes_written, len(data)) - async def test_recover_state_on_failure_handles_redirect(self): + def test_update_state_zero_byte_file(self): + """Test downloading a completely empty file.""" + read_state = self._add_download(_READ_ID, length=0) + + response = self._create_response(b"", _READ_ID, offset=0, range_end=True) + + self.strategy.update_state_from_response(response, self.state) + + self.assertTrue(read_state.is_complete) + self.assertEqual(read_state.bytes_written, 0) + self.assertEqual(read_state.user_buffer.getvalue(), b"") + + def test_update_state_missing_read_range_logs_warning(self): + """Verify we log a warning and continue when read_range is missing.""" + response = self._create_response(b"data", _READ_ID, 0, has_read_range=False) + + # assertLogs captures logs for the given logger name and minimum level + with self.assertLogs(LOGGER_NAME, level="WARNING") as cm: + self.strategy.update_state_from_response(response, self.state) + + self.assertTrue(any("missing read_range field" in output for output in cm.output)) + + def test_update_state_unknown_id_logs_warning(self): + """Verify we log a warning and continue when read_id is unknown.""" + unknown_id = 999 + self._add_download(_READ_ID) + response = self._create_response(b"ghost", read_id=unknown_id, offset=0) + + with self.assertLogs(LOGGER_NAME, level="WARNING") as cm: + self.strategy.update_state_from_response(response, self.state) + + self.assertTrue(any(f"unknown or stale read_id {unknown_id}" in output for output in cm.output)) + + + # --- Recovery Tests --- + + def test_recover_state_on_failure_handles_redirect(self): """Verify recover_state_on_failure correctly extracts routing_token.""" - strategy = _ReadResumptionStrategy() + token = "dummy-routing-token" + redirect_error = BidiReadObjectRedirectedError(routing_token=token) + final_error = exceptions.Aborted("Retry failed", errors=[redirect_error]) + + async def run(): + await self.strategy.recover_state_on_failure(final_error, self.state) + + asyncio.new_event_loop().run_until_complete(run()) + + self.assertEqual(self.state["routing_token"], token) - state = {} - self.assertIsNone(state.get("routing_token")) + def test_recover_state_ignores_standard_errors(self): + """Verify that non-redirect errors do not corrupt the routing token.""" + self.state["routing_token"] = "existing-token" - dummy_token = "dummy-routing-token" - redirect_error = BidiReadObjectRedirectedError(routing_token=dummy_token) + std_error = exceptions.ServiceUnavailable("Maintenance") + final_error = exceptions.RetryError("Retry failed", cause=std_error) - final_error = exceptions.RetryError("Retry failed", cause=redirect_error) + async def run(): + await self.strategy.recover_state_on_failure(final_error, self.state) - await strategy.recover_state_on_failure(final_error, state) + asyncio.new_event_loop().run_until_complete(run()) - self.assertEqual(state.get("routing_token"), dummy_token) + # Token should remain unchanged + self.assertEqual(self.state["routing_token"], "existing-token") diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 8afef104b..2f0600f8d 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -39,9 +39,7 @@ class TestAsyncMultiRangeDownloader: def create_read_ranges(self, num_ranges): ranges = [] for i in range(num_ranges): - ranges.append( - _storage_v2.ReadRange(read_offset=i, read_length=1, read_id=i) - ) + ranges.append((i, 1, BytesIO())) return ranges # helper method @@ -91,16 +89,6 @@ async def test_create_mrd( read_handle=_TEST_READ_HANDLE, ) - mrd.read_obj_str.open.assert_called_once() - # Assert - mock_cls_async_read_object_stream.assert_called_once_with( - client=mock_grpc_client, - bucket_name=_TEST_BUCKET_NAME, - object_name=_TEST_OBJECT_NAME, - generation_number=_TEST_GENERATION_NUMBER, - read_handle=_TEST_READ_HANDLE, - ) - mrd.read_obj_str.open.assert_called_once() assert mrd.client == mock_grpc_client @@ -135,7 +123,9 @@ async def test_download_ranges_via_async_gather( mock_mrd = await self._make_mock_mrd( mock_grpc_client, mock_cls_async_read_object_stream ) - mock_random_int.side_effect = [123, 456, 789, 91011] # for _func_id and read_id + + mock_random_int.side_effect = [456, 91011] + mock_mrd.read_obj_str.send = AsyncMock() mock_mrd.read_obj_str.recv = AsyncMock() @@ -167,12 +157,14 @@ async def test_download_ranges_via_async_gather( ) ], ), + None, ] # Act buffer = BytesIO() second_buffer = BytesIO() lock = asyncio.Lock() + task1 = asyncio.create_task(mock_mrd.download_ranges([(0, 18, buffer)], lock)) task2 = asyncio.create_task( mock_mrd.download_ranges([(10, 6, second_buffer)], lock) @@ -180,18 +172,6 @@ async def test_download_ranges_via_async_gather( await asyncio.gather(task1, task2) # Assert - mock_mrd.read_obj_str.send.side_effect = [ - _storage_v2.BidiReadObjectRequest( - read_ranges=[ - _storage_v2.ReadRange(read_offset=0, read_length=18, read_id=456) - ] - ), - _storage_v2.BidiReadObjectRequest( - read_ranges=[ - _storage_v2.ReadRange(read_offset=10, read_length=6, read_id=91011) - ] - ), - ] assert buffer.getvalue() == data assert second_buffer.getvalue() == data[10:16] @@ -216,22 +196,27 @@ async def test_download_ranges( mock_mrd = await self._make_mock_mrd( mock_grpc_client, mock_cls_async_read_object_stream ) - mock_random_int.side_effect = [123, 456] # for _func_id and read_id + + mock_random_int.side_effect = [456] + mock_mrd.read_obj_str.send = AsyncMock() mock_mrd.read_obj_str.recv = AsyncMock() - mock_mrd.read_obj_str.recv.return_value = _storage_v2.BidiReadObjectResponse( - object_data_ranges=[ - _storage_v2.ObjectRangeData( - checksummed_data=_storage_v2.ChecksummedData( - content=data, crc32c=crc32c_int - ), - range_end=True, - read_range=_storage_v2.ReadRange( - read_offset=0, read_length=18, read_id=456 - ), - ) - ], - ) + mock_mrd.read_obj_str.recv.side_effect = [ + _storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + _storage_v2.ObjectRangeData( + checksummed_data=_storage_v2.ChecksummedData( + content=data, crc32c=crc32c_int + ), + range_end=True, + read_range=_storage_v2.ReadRange( + read_offset=0, read_length=18, read_id=456 + ), + ) + ], + ), + None, + ] # Act buffer = BytesIO() @@ -320,7 +305,6 @@ async def test_close_mrd_not_opened_should_throw_error(self, mock_grpc_client): mrd = AsyncMultiRangeDownloader( mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME ) - # Act + Assert with pytest.raises(ValueError) as exc: await mrd.close() @@ -367,7 +351,7 @@ def test_init_raises_if_crc32c_c_extension_is_missing( @pytest.mark.asyncio @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.Checksum" + "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy.Checksum" ) @mock.patch( "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" @@ -375,6 +359,10 @@ def test_init_raises_if_crc32c_c_extension_is_missing( async def test_download_ranges_raises_on_checksum_mismatch( self, mock_client, mock_checksum_class ): + from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, + ) + mock_stream = mock.AsyncMock( spec=async_read_object_stream._AsyncReadObjectStream ) @@ -390,7 +378,9 @@ async def test_download_ranges_raises_on_checksum_mismatch( checksummed_data=_storage_v2.ChecksummedData( content=test_data, crc32c=server_checksum ), - read_range=_storage_v2.ReadRange(read_id=0), + read_range=_storage_v2.ReadRange( + read_id=0, read_offset=0, read_length=len(test_data) + ), range_end=True, ) ] @@ -403,7 +393,11 @@ async def test_download_ranges_raises_on_checksum_mismatch( mrd._is_stream_open = True with pytest.raises(DataCorruption) as exc_info: - await mrd.download_ranges([(0, len(test_data), BytesIO())]) + with mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.generate_random_56_bit_integer", + return_value=0, + ): + await mrd.download_ranges([(0, len(test_data), BytesIO())]) assert "Checksum mismatch" in str(exc_info.value) mock_checksum_class.assert_called_once_with(test_data) diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index cbf53b398..a8abb1571 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -3064,7 +3064,13 @@ def _make_resumable_transport( fake_response2 = self._mock_requests_response( http.client.PERMANENT_REDIRECT, headers2 ) - json_body = json.dumps({"size": str(total_bytes), "md5Hash": md5_checksum_value, "crc32c": crc32c_checksum_value}) + json_body = json.dumps( + { + "size": str(total_bytes), + "md5Hash": md5_checksum_value, + "crc32c": crc32c_checksum_value, + } + ) if data_corruption: fake_response3 = DataCorruption(None) else: From 0c35d3f3dd767831259a188156140b18f7ff9927 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 31 Dec 2025 14:16:36 +0530 Subject: [PATCH 455/509] chore(tests): add test for reading unfinalized appendable objects with generation (#1698) chore(tests): add test for reading unfinalized appendable objects with generation --- tests/system/test_zonal.py | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index d8d20ba36..8dc1c5af9 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -255,3 +255,55 @@ async def test_mrd_open_with_read_handle(): del mrd del new_mrd gc.collect() + + +@pytest.mark.asyncio +async def test_read_unfinalized_appendable_object_with_generation( + storage_client, blobs_to_delete +): + object_name = f"read_unfinalized_appendable_object-{str(uuid.uuid4())[:4]}" + grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client + + async def _read_and_verify(expected_content, generation=None): + """Helper to read object content and verify against expected.""" + mrd = AsyncMultiRangeDownloader( + grpc_client, _ZONAL_BUCKET, object_name, generation + ) + buffer = BytesIO() + await mrd.open() + try: + assert mrd.persisted_size == len(expected_content) + await mrd.download_ranges([(0, 0, buffer)]) + assert buffer.getvalue() == expected_content + finally: + await mrd.close() + return mrd + + # First write + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.flush() + generation = writer.generation + + # First read + mrd = await _read_and_verify(_BYTES_TO_UPLOAD) + + # Second write, using generation from the first write. + writer_2 = AsyncAppendableObjectWriter( + grpc_client, _ZONAL_BUCKET, object_name, generation=generation + ) + await writer_2.open() + await writer_2.append(_BYTES_TO_UPLOAD) + await writer_2.flush() + + # Second read + mrd_2 = await _read_and_verify(_BYTES_TO_UPLOAD + _BYTES_TO_UPLOAD, generation) + + # Clean up + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del writer_2 + del mrd + del mrd_2 + gc.collect() From a57ea0ec786a84c7ae9ed82c6ae5d38ecadba4af Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Fri, 2 Jan 2026 16:18:37 +0530 Subject: [PATCH 456/509] feat(experimental): add write resumption strategy (#1663) Adding writes resumption strategy which will be used for error handling of bidi writes operation. --- .../retry/writes_resumption_strategy.py | 146 +++++++++ .../retry/test_reads_resumption_strategy.py | 16 +- .../retry/test_writes_resumption_strategy.py | 288 ++++++++++++++++++ 3 files changed, 446 insertions(+), 4 deletions(-) create mode 100644 google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py create mode 100644 tests/unit/asyncio/retry/test_writes_resumption_strategy.py diff --git a/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py new file mode 100644 index 000000000..c6ae36339 --- /dev/null +++ b/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py @@ -0,0 +1,146 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, Dict, IO, Iterable, Optional, Union + +import google_crc32c +from google.cloud._storage_v2.types import storage as storage_type +from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError +from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( + _BaseResumptionStrategy, +) + + +class _WriteState: + """A helper class to track the state of a single upload operation. + + :type spec: :class:`google.cloud.storage_v2.types.AppendObjectSpec` + :param spec: The specification for the object to write. + + :type chunk_size: int + :param chunk_size: The size of chunks to write to the server. + + :type user_buffer: IO[bytes] + :param user_buffer: The data source. + """ + + def __init__( + self, + spec: Union[storage_type.AppendObjectSpec, storage_type.WriteObjectSpec], + chunk_size: int, + user_buffer: IO[bytes], + ): + self.spec = spec + self.chunk_size = chunk_size + self.user_buffer = user_buffer + self.persisted_size: int = 0 + self.bytes_sent: int = 0 + self.write_handle: Union[bytes, storage_type.BidiWriteHandle, None] = None + self.routing_token: Optional[str] = None + self.is_finalized: bool = False + + +class _WriteResumptionStrategy(_BaseResumptionStrategy): + """The concrete resumption strategy for bidi writes.""" + + def generate_requests( + self, state: Dict[str, Any] + ) -> Iterable[storage_type.BidiWriteObjectRequest]: + """Generates BidiWriteObjectRequests to resume or continue the upload. + + For Appendable Objects, every stream opening should send an + AppendObjectSpec. If resuming, the `write_handle` is added to that spec. + + This method is not applicable for `open` methods. + """ + write_state: _WriteState = state["write_state"] + + initial_request = storage_type.BidiWriteObjectRequest() + + # Determine if we need to send WriteObjectSpec or AppendObjectSpec + if isinstance(write_state.spec, storage_type.WriteObjectSpec): + initial_request.write_object_spec = write_state.spec + else: + if write_state.write_handle: + write_state.spec.write_handle = write_state.write_handle + + if write_state.routing_token: + write_state.spec.routing_token = write_state.routing_token + initial_request.append_object_spec = write_state.spec + + yield initial_request + + # The buffer should already be seeked to the correct position (persisted_size) + # by the `recover_state_on_failure` method before this is called. + while not write_state.is_finalized: + chunk = write_state.user_buffer.read(write_state.chunk_size) + + # End of File detection + if not chunk: + return + + checksummed_data = storage_type.ChecksummedData(content=chunk) + checksum = google_crc32c.Checksum(chunk) + checksummed_data.crc32c = int.from_bytes(checksum.digest(), "big") + + request = storage_type.BidiWriteObjectRequest( + write_offset=write_state.bytes_sent, + checksummed_data=checksummed_data, + ) + write_state.bytes_sent += len(chunk) + + yield request + + def update_state_from_response( + self, response: storage_type.BidiWriteObjectResponse, state: Dict[str, Any] + ) -> None: + """Processes a server response and updates the write state.""" + write_state: _WriteState = state["write_state"] + + if response.persisted_size: + write_state.persisted_size = response.persisted_size + + if response.write_handle: + write_state.write_handle = response.write_handle + + if response.resource: + write_state.persisted_size = response.resource.size + if response.resource.finalize_time: + write_state.is_finalized = True + + async def recover_state_on_failure( + self, error: Exception, state: Dict[str, Any] + ) -> None: + """ + Handles errors, specifically BidiWriteObjectRedirectedError, and rewinds state. + + This method rewinds the user buffer and internal byte tracking to the + last confirmed 'persisted_size' from the server. + """ + write_state: _WriteState = state["write_state"] + cause = getattr(error, "cause", error) + + # Extract routing token and potentially a new write handle for redirection. + if isinstance(cause, BidiWriteObjectRedirectedError): + if cause.routing_token: + write_state.routing_token = cause.routing_token + + redirect_handle = getattr(cause, "write_handle", None) + if redirect_handle: + write_state.write_handle = redirect_handle + + # We must assume any data sent beyond 'persisted_size' was lost. + # Reset the user buffer to the last known good byte confirmed by the server. + write_state.user_buffer.seek(write_state.persisted_size) + write_state.bytes_sent = write_state.persisted_size diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py index 2ddd87f1f..62a05f19a 100644 --- a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -27,7 +27,9 @@ from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError _READ_ID = 1 -LOGGER_NAME = "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy" +LOGGER_NAME = ( + "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy" +) class TestDownloadState(unittest.TestCase): @@ -309,7 +311,9 @@ def test_update_state_missing_read_range_logs_warning(self): with self.assertLogs(LOGGER_NAME, level="WARNING") as cm: self.strategy.update_state_from_response(response, self.state) - self.assertTrue(any("missing read_range field" in output for output in cm.output)) + self.assertTrue( + any("missing read_range field" in output for output in cm.output) + ) def test_update_state_unknown_id_logs_warning(self): """Verify we log a warning and continue when read_id is unknown.""" @@ -320,8 +324,12 @@ def test_update_state_unknown_id_logs_warning(self): with self.assertLogs(LOGGER_NAME, level="WARNING") as cm: self.strategy.update_state_from_response(response, self.state) - self.assertTrue(any(f"unknown or stale read_id {unknown_id}" in output for output in cm.output)) - + self.assertTrue( + any( + f"unknown or stale read_id {unknown_id}" in output + for output in cm.output + ) + ) # --- Recovery Tests --- diff --git a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py new file mode 100644 index 000000000..a68578636 --- /dev/null +++ b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py @@ -0,0 +1,288 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import io +import unittest +import unittest.mock as mock +from datetime import datetime + +import pytest +import google_crc32c + +from google.cloud._storage_v2.types import storage as storage_type +from google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy import ( + _WriteState, + _WriteResumptionStrategy, +) +from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError + + +class TestWriteResumptionStrategy(unittest.TestCase): + def _get_target_class(self): + return _WriteResumptionStrategy + + def _make_one(self, *args, **kwargs): + return self._get_target_class()(*args, **kwargs) + + def test_ctor(self): + strategy = self._make_one() + self.assertIsInstance(strategy, self._get_target_class()) + + def test_generate_requests_initial_new_object(self): + """ + Verify the initial request sequence for a new upload (WriteObjectSpec). + """ + strategy = self._make_one() + mock_buffer = io.BytesIO(b"0123456789") + # Use WriteObjectSpec for new objects + mock_spec = storage_type.WriteObjectSpec( + resource=storage_type.Object(name="test-object") + ) + state = { + "write_state": _WriteState( + mock_spec, chunk_size=4, user_buffer=mock_buffer + ), + } + + requests = list(strategy.generate_requests(state)) + + # Check first request (Spec) + self.assertEqual(requests[0].write_object_spec, mock_spec) + self.assertFalse(requests[0].state_lookup) + + # Check data chunks + self.assertEqual(requests[1].write_offset, 0) + self.assertEqual(requests[1].checksummed_data.content, b"0123") + self.assertEqual(requests[2].write_offset, 4) + self.assertEqual(requests[2].checksummed_data.content, b"4567") + self.assertEqual(requests[3].write_offset, 8) + self.assertEqual(requests[3].checksummed_data.content, b"89") + + # Total requests: 1 Spec + 3 Chunks + self.assertEqual(len(requests), 4) + + def test_generate_requests_initial_existing_object(self): + """ + Verify the initial request sequence for appending to an existing object (AppendObjectSpec). + """ + strategy = self._make_one() + mock_buffer = io.BytesIO(b"0123") + # Use AppendObjectSpec for existing objects + mock_spec = storage_type.AppendObjectSpec( + object_="test-object", bucket="test-bucket" + ) + state = { + "write_state": _WriteState( + mock_spec, chunk_size=4, user_buffer=mock_buffer + ), + } + + requests = list(strategy.generate_requests(state)) + + # Check first request (Spec) + self.assertEqual(requests[0].append_object_spec, mock_spec) + self.assertFalse(requests[0].state_lookup) + + # Check data chunk + self.assertEqual(requests[1].write_offset, 0) + self.assertEqual(requests[1].checksummed_data.content, b"0123") + + def test_generate_requests_empty_file(self): + """ + Verify request sequence for an empty file. Should just be the Spec. + """ + strategy = self._make_one() + mock_buffer = io.BytesIO(b"") + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + state = { + "write_state": _WriteState( + mock_spec, chunk_size=4, user_buffer=mock_buffer + ), + } + + requests = list(strategy.generate_requests(state)) + + self.assertEqual(len(requests), 1) + self.assertEqual(requests[0].append_object_spec, mock_spec) + + def test_generate_requests_resumption(self): + """ + Verify request sequence when resuming an upload. + """ + strategy = self._make_one() + mock_buffer = io.BytesIO(b"0123456789") + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + + write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) + write_state.persisted_size = 4 + write_state.bytes_sent = 4 + write_state.write_handle = storage_type.BidiWriteHandle(handle=b"test-handle") + mock_buffer.seek(4) + + state = {"write_state": write_state} + + requests = list(strategy.generate_requests(state)) + + # Check first request has handle and lookup + self.assertEqual( + requests[0].append_object_spec.write_handle.handle, b"test-handle" + ) + + # Check data starts from offset 4 + self.assertEqual(requests[1].write_offset, 4) + self.assertEqual(requests[1].checksummed_data.content, b"4567") + self.assertEqual(requests[2].write_offset, 8) + self.assertEqual(requests[2].checksummed_data.content, b"89") + + @pytest.mark.asyncio + async def test_generate_requests_after_failure_and_recovery(self): + """ + Verify recovery and resumption flow. + """ + strategy = self._make_one() + mock_buffer = io.BytesIO(b"0123456789abcdef") + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + state = { + "write_state": _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) + } + write_state = state["write_state"] + + write_state.bytes_sent = 8 + mock_buffer.seek(8) + + strategy.update_state_from_response( + storage_type.BidiWriteObjectResponse( + persisted_size=4, + write_handle=storage_type.BidiWriteHandle(handle=b"handle-1"), + ), + state, + ) + + await strategy.recover_state_on_failure(Exception("network error"), state) + + self.assertEqual(mock_buffer.tell(), 4) + self.assertEqual(write_state.bytes_sent, 4) + + requests = list(strategy.generate_requests(state)) + + self.assertTrue(requests[0].state_lookup) + self.assertEqual( + requests[0].append_object_spec.write_handle.handle, b"handle-1" + ) + + self.assertEqual(requests[1].write_offset, 4) + self.assertEqual(requests[1].checksummed_data.content, b"4567") + + def test_update_state_from_response(self): + """Verify state updates from server responses.""" + strategy = self._make_one() + mock_buffer = io.BytesIO(b"0123456789") + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + state = { + "write_state": _WriteState( + mock_spec, chunk_size=4, user_buffer=mock_buffer + ), + } + write_state = state["write_state"] + + response1 = storage_type.BidiWriteObjectResponse( + write_handle=storage_type.BidiWriteHandle(handle=b"handle-1") + ) + strategy.update_state_from_response(response1, state) + self.assertEqual(write_state.write_handle.handle, b"handle-1") + + response2 = storage_type.BidiWriteObjectResponse(persisted_size=1024) + strategy.update_state_from_response(response2, state) + self.assertEqual(write_state.persisted_size, 1024) + + final_resource = storage_type.Object(name="test-object", bucket="b", size=2048, finalize_time=datetime.now()) + response3 = storage_type.BidiWriteObjectResponse(resource=final_resource) + strategy.update_state_from_response(response3, state) + self.assertEqual(write_state.persisted_size, 2048) + self.assertTrue(write_state.is_finalized) + + @pytest.mark.asyncio + async def test_recover_state_on_failure_handles_redirect(self): + """ + Verify redirection error handling. + """ + strategy = self._make_one() + mock_buffer = mock.MagicMock(spec=io.BytesIO) + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + + write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) + state = {"write_state": write_state} + + redirect_error = BidiWriteObjectRedirectedError(routing_token="new-token-123") + wrapped_error = Exception("RPC error") + wrapped_error.cause = redirect_error + + await strategy.recover_state_on_failure(wrapped_error, state) + + self.assertEqual(write_state.routing_token, "new-token-123") + mock_buffer.seek.assert_called_with(0) + + @pytest.mark.asyncio + async def test_recover_state_on_failure_handles_redirect_with_handle(self): + """Verify redirection that includes a write handle.""" + strategy = self._make_one() + mock_buffer = mock.MagicMock(spec=io.BytesIO) + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + + write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) + state = {"write_state": write_state} + + redirect_error = BidiWriteObjectRedirectedError( + routing_token="new-token-456", write_handle=b"redirect-handle" + ) + wrapped_error = Exception("RPC error") + wrapped_error.cause = redirect_error + + await strategy.recover_state_on_failure(wrapped_error, state) + + self.assertEqual(write_state.routing_token, "new-token-456") + self.assertEqual(write_state.write_handle, b"redirect-handle") + + mock_buffer.seek.assert_called_with(0) + + def test_generate_requests_sends_crc32c_checksum(self): + strategy = self._make_one() + mock_buffer = io.BytesIO(b"0123") + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + state = { + "write_state": _WriteState( + mock_spec, chunk_size=4, user_buffer=mock_buffer + ), + } + + requests = list(strategy.generate_requests(state)) + + expected_crc = google_crc32c.Checksum(b"0123") + expected_crc_int = int.from_bytes(expected_crc.digest(), "big") + self.assertEqual(requests[1].checksummed_data.crc32c, expected_crc_int) + + def test_generate_requests_with_routing_token(self): + strategy = self._make_one() + mock_buffer = io.BytesIO(b"") + mock_spec = storage_type.AppendObjectSpec(object_="test-object") + + write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) + write_state.routing_token = "redirected-token" + state = {"write_state": write_state} + + requests = list(strategy.generate_requests(state)) + + self.assertEqual( + requests[0].append_object_spec.routing_token, "redirected-token" + ) From 89bfe7a5fcd0391da35e9ceccc185279782b5420 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 12 Jan 2026 00:51:04 +0530 Subject: [PATCH 457/509] feat(experimental): flush the last chunk in append method (#1699) Earlier the last chunk was being flushed while calling the close() method. Now it will be done inside the append method itself. --- .../asyncio/async_appendable_object_writer.py | 38 +++++++-- noxfile.py | 9 +- tests/system/test_zonal.py | 53 ++++++++++++ .../retry/test_writes_resumption_strategy.py | 4 +- .../test_async_appendable_object_writer.py | 85 +++++++++++++++---- 5 files changed, 162 insertions(+), 27 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index b4f40b423..c808cb52a 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -188,8 +188,9 @@ async def append(self, data: bytes) -> None: ie. `self.offset` bytes relative to the begining of the object. This method sends the provided `data` to the GCS server in chunks. - and persists data in GCS at every `_MAX_BUFFER_SIZE_BYTES` bytes by - calling `self.simple_flush`. + and persists data in GCS at every `_DEFAULT_FLUSH_INTERVAL_BYTES` bytes + or at the last chunk whichever is earlier. Persisting is done by setting + `flush=True` on request. :type data: bytes :param data: The bytes to append to the object. @@ -214,6 +215,8 @@ async def append(self, data: bytes) -> None: while start_idx < total_bytes: end_idx = min(start_idx + _MAX_CHUNK_SIZE_BYTES, total_bytes) data_chunk = data[start_idx:end_idx] + is_last_chunk = end_idx == total_bytes + chunk_size = end_idx - start_idx await self.write_obj_stream.send( _storage_v2.BidiWriteObjectRequest( write_offset=self.offset, @@ -221,13 +224,24 @@ async def append(self, data: bytes) -> None: content=data_chunk, crc32c=int.from_bytes(Checksum(data_chunk).digest(), "big"), ), + state_lookup=is_last_chunk, + flush=is_last_chunk + or ( + self.bytes_appended_since_last_flush + chunk_size + >= self.flush_interval + ), ) ) - chunk_size = end_idx - start_idx self.offset += chunk_size self.bytes_appended_since_last_flush += chunk_size + if self.bytes_appended_since_last_flush >= self.flush_interval: - await self.simple_flush() + self.bytes_appended_since_last_flush = 0 + + if is_last_chunk: + response = await self.write_obj_stream.recv() + self.persisted_size = response.persisted_size + self.offset = self.persisted_size self.bytes_appended_since_last_flush = 0 start_idx = end_idx @@ -292,20 +306,24 @@ async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object] raise ValueError("Stream is not open. Call open() before close().") if finalize_on_close: - await self.finalize() - else: - await self.flush() + return await self.finalize() await self.write_obj_stream.close() self._is_stream_open = False self.offset = None - return self.object_resource if finalize_on_close else self.persisted_size + return self.persisted_size async def finalize(self) -> _storage_v2.Object: """Finalizes the Appendable Object. Note: Once finalized no more data can be appended. + This method is different from `close`. if `.close()` is called data may + still be appended to object at a later point in time by opening with + generation number. + (i.e. `open(..., generation=)`. + However if `.finalize()` is called no more data can be appended to the + object. rtype: google.cloud.storage_v2.types.Object returns: The finalized object resource. @@ -322,6 +340,10 @@ async def finalize(self) -> _storage_v2.Object: response = await self.write_obj_stream.recv() self.object_resource = response.resource self.persisted_size = self.object_resource.size + await self.write_obj_stream.close() + + self._is_stream_open = False + self.offset = None return self.object_resource # helper methods. diff --git a/noxfile.py b/noxfile.py index 4f77d1e2d..1cef2a75f 100644 --- a/noxfile.py +++ b/noxfile.py @@ -192,7 +192,14 @@ def system(session): # 2021-05-06: defer installing 'google-cloud-*' to after this package, # in order to work around Python 2.7 googolapis-common-protos # issue. - session.install("mock", "pytest", "pytest-rerunfailures", "-c", constraints_path) + session.install( + "mock", + "pytest", + "pytest-rerunfailures", + "pytest-asyncio", + "-c", + constraints_path, + ) session.install("-e", ".", "-c", constraints_path) session.install( "google-cloud-testutils", diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 8dc1c5af9..2ade654ad 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -307,3 +307,56 @@ async def _read_and_verify(expected_content, generation=None): del mrd del mrd_2 gc.collect() + + +@pytest.mark.asyncio +async def test_append_flushes_and_state_lookup(storage_client, blobs_to_delete): + """ + System test for AsyncAppendableObjectWriter, verifying flushing behavior + for both small and large appends. + """ + object_name = f"test-append-flush-varied-size-{uuid.uuid4()}" + grpc_client = AsyncGrpcClient().grpc_client + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + + # Schedule for cleanup + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + # --- Part 1: Test with small data --- + small_data = b"small data" + + await writer.open() + assert writer._is_stream_open + + await writer.append(small_data) + persisted_size = await writer.state_lookup() + assert persisted_size == len(small_data) + + # --- Part 2: Test with large data --- + large_data = os.urandom(38 * 1024 * 1024) + + # Append data larger than the default flush interval (16 MiB). + # This should trigger the interval-based flushing logic. + await writer.append(large_data) + + # Verify the total data has been persisted. + total_size = len(small_data) + len(large_data) + persisted_size = await writer.state_lookup() + assert persisted_size == total_size + + # --- Part 3: Finalize and verify --- + final_object = await writer.close(finalize_on_close=True) + + assert not writer._is_stream_open + assert final_object.size == total_size + + # Verify the full content of the object. + full_data = small_data + large_data + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + content = buffer.getvalue() + assert content == full_data diff --git a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py index a68578636..7d8b7934e 100644 --- a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py @@ -206,7 +206,9 @@ def test_update_state_from_response(self): strategy.update_state_from_response(response2, state) self.assertEqual(write_state.persisted_size, 1024) - final_resource = storage_type.Object(name="test-object", bucket="b", size=2048, finalize_time=datetime.now()) + final_resource = storage_type.Object( + name="test-object", bucket="b", size=2048, finalize_time=datetime.now() + ) response3 = storage_type.BidiWriteObjectResponse(resource=final_resource) strategy.update_state_from_response(response3, state) self.assertEqual(write_state.persisted_size, 2048) diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 31013f9a7..07f7047d8 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -364,6 +364,7 @@ async def test_close(mock_write_object_stream, mock_client): writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) writer._is_stream_open = True writer.offset = 1024 + writer.persisted_size = 1024 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() mock_stream.recv = mock.AsyncMock( @@ -435,6 +436,7 @@ async def test_finalize(mock_write_object_stream, mock_client): mock_stream.recv = mock.AsyncMock( return_value=_storage_v2.BidiWriteObjectResponse(resource=mock_resource) ) + mock_stream.close = mock.AsyncMock() gcs_object = await writer.finalize() @@ -442,9 +444,12 @@ async def test_finalize(mock_write_object_stream, mock_client): _storage_v2.BidiWriteObjectRequest(finish_write=True) ) mock_stream.recv.assert_awaited_once() + mock_stream.close.assert_awaited_once() assert writer.object_resource == mock_resource assert writer.persisted_size == 123 assert gcs_object == mock_resource + assert writer._is_stream_open is False + assert writer.offset is None @pytest.mark.asyncio @@ -501,30 +506,39 @@ async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client writer.persisted_size = 100 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.simple_flush = mock.AsyncMock() data = b"a" * (_MAX_CHUNK_SIZE_BYTES + 1) + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse( + persisted_size=100 + len(data) + ) + ) + await writer.append(data) assert mock_stream.send.await_count == 2 - first_call = mock_stream.send.await_args_list[0] - second_call = mock_stream.send.await_args_list[1] + first_request = mock_stream.send.await_args_list[0].args[0] + second_request = mock_stream.send.await_args_list[1].args[0] # First chunk - assert first_call[0][0].write_offset == 100 - assert len(first_call[0][0].checksummed_data.content) == _MAX_CHUNK_SIZE_BYTES - assert first_call[0][0].checksummed_data.crc32c == int.from_bytes( + assert first_request.write_offset == 100 + assert len(first_request.checksummed_data.content) == _MAX_CHUNK_SIZE_BYTES + assert first_request.checksummed_data.crc32c == int.from_bytes( Checksum(data[:_MAX_CHUNK_SIZE_BYTES]).digest(), byteorder="big" ) - # Second chunk - assert second_call[0][0].write_offset == 100 + _MAX_CHUNK_SIZE_BYTES - assert len(second_call[0][0].checksummed_data.content) == 1 - assert second_call[0][0].checksummed_data.crc32c == int.from_bytes( + assert not first_request.flush + assert not first_request.state_lookup + + # Second chunk (last chunk) + assert second_request.write_offset == 100 + _MAX_CHUNK_SIZE_BYTES + assert len(second_request.checksummed_data.content) == 1 + assert second_request.checksummed_data.crc32c == int.from_bytes( Checksum(data[_MAX_CHUNK_SIZE_BYTES:]).digest(), byteorder="big" ) + assert second_request.flush + assert second_request.state_lookup assert writer.offset == 100 + len(data) - writer.simple_flush.assert_not_awaited() @pytest.mark.asyncio @@ -541,12 +555,25 @@ async def test_append_flushes_when_buffer_is_full( writer.persisted_size = 0 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.simple_flush = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock() data = b"a" * _DEFAULT_FLUSH_INTERVAL_BYTES await writer.append(data) - writer.simple_flush.assert_awaited_once() + num_chunks = _DEFAULT_FLUSH_INTERVAL_BYTES // _MAX_CHUNK_SIZE_BYTES + assert mock_stream.send.await_count == num_chunks + + # All but the last request should not have flush or state_lookup set. + for i in range(num_chunks - 1): + request = mock_stream.send.await_args_list[i].args[0] + assert not request.flush + assert not request.state_lookup + + # The last request should have flush and state_lookup set. + last_request = mock_stream.send.await_args_list[-1].args[0] + assert last_request.flush + assert last_request.state_lookup + assert writer.bytes_appended_since_last_flush == 0 @pytest.mark.asyncio @@ -561,12 +588,18 @@ async def test_append_handles_large_data(mock_write_object_stream, mock_client): writer.persisted_size = 0 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.simple_flush = mock.AsyncMock() + mock_stream.recv = mock.AsyncMock() data = b"a" * (_DEFAULT_FLUSH_INTERVAL_BYTES * 2 + 1) await writer.append(data) - assert writer.simple_flush.await_count == 2 + flushed_requests = [ + call.args[0] for call in mock_stream.send.await_args_list if call.args[0].flush + ] + assert len(flushed_requests) == 3 + + last_request = mock_stream.send.await_args_list[-1].args[0] + assert last_request.state_lookup @pytest.mark.asyncio @@ -584,17 +617,35 @@ async def test_append_data_two_times(mock_write_object_stream, mock_client): writer.persisted_size = 0 mock_stream = mock_write_object_stream.return_value mock_stream.send = mock.AsyncMock() - writer.simple_flush = mock.AsyncMock() data1 = b"a" * (_MAX_CHUNK_SIZE_BYTES + 10) + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse( + persisted_size= len(data1) + ) + ) await writer.append(data1) + assert mock_stream.send.await_count == 2 + last_request_data1 = mock_stream.send.await_args_list[-1].args[0] + assert last_request_data1.flush + assert last_request_data1.state_lookup + data2 = b"b" * (_MAX_CHUNK_SIZE_BYTES + 20) + mock_stream.recv = mock.AsyncMock( + return_value=_storage_v2.BidiWriteObjectResponse( + persisted_size= len(data2) + len(data1) + ) + ) await writer.append(data2) + assert mock_stream.send.await_count == 4 + last_request_data2 = mock_stream.send.await_args_list[-1].args[0] + assert last_request_data2.flush + assert last_request_data2.state_lookup + total_data_length = len(data1) + len(data2) assert writer.offset == total_data_length - assert writer.simple_flush.await_count == 0 @pytest.mark.asyncio From 94ad8952cecfbfaf0e7917fbf4a362f4996f0c78 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 13 Jan 2026 09:41:33 -0500 Subject: [PATCH 458/509] chore(librarian): bump library version to 3.7.0 (#1703) Bump the current version in `.librarian/state.yaml` to `3.7.0` to cater for https://github.com/googleapis/python-storage/pull/1621 which was released on December 9 2025. This will address the issue in https://github.com/googleapis/python-storage/pull/1701 where librarian sets the version to `3.7.0` which has already been released. The reason that this manual PR is needed is because the release on December 9th used a different tool `release-please` which does not update the `.librarian/state.yaml` file. --- .librarian/state.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index 1502e804d..a2eac134d 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -1,7 +1,7 @@ image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 libraries: - id: google-cloud-storage - version: 3.6.0 + version: 3.7.0 last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab apis: - path: google/storage/v2 From 16cf512c2e05a6eb0e4ba7280814886e35b2942b Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 13 Jan 2026 13:20:23 -0500 Subject: [PATCH 459/509] chore: librarian release pull request: 20260113T144551Z (#1704) PR created by the Librarian CLI to initialize a release. Merging this PR will auto trigger a release. Librarian Version: v0.7.0 Language Image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91
    google-cloud-storage: 3.8.0 ## [3.8.0](https://github.com/googleapis/python-storage/compare/v3.7.0...v3.8.0) (2026-01-13) ### Features * expose persisted size in mrd (#1671) ([0e2961be](https://github.com/googleapis/python-storage/commit/0e2961be)) * implement "append_from_file" (#1686) ([1333c956](https://github.com/googleapis/python-storage/commit/1333c956)) * compute chunk wise checksum for bidi_writes (#1675) ([139390cb](https://github.com/googleapis/python-storage/commit/139390cb)) * flush the last chunk in append method (#1699) ([89bfe7a5](https://github.com/googleapis/python-storage/commit/89bfe7a5)) * add write resumption strategy (#1663) ([a57ea0ec](https://github.com/googleapis/python-storage/commit/a57ea0ec)) * add bidi stream retry manager. (#1632) ([d90f0ee0](https://github.com/googleapis/python-storage/commit/d90f0ee0)) * make flush size configurable (#1677) ([f7095faf](https://github.com/googleapis/python-storage/commit/f7095faf)) ### Bug Fixes * no state lookup while opening bidi-write stream ([2d5a7b16](https://github.com/googleapis/python-storage/commit/2d5a7b16)) * no state lookup while opening bidi-write stream (#1636) ([2d5a7b16](https://github.com/googleapis/python-storage/commit/2d5a7b16)) * close write object stream always (#1661) ([4a609a4b](https://github.com/googleapis/python-storage/commit/4a609a4b)) * add system test for opening with read_handle (#1672) ([6dc711da](https://github.com/googleapis/python-storage/commit/6dc711da))
    --------- Co-authored-by: Victor Chudnovsky --- .librarian/state.yaml | 2 +- CHANGELOG.md | 20 +++++++++++++++++++ google/cloud/_storage_v2/gapic_version.py | 2 +- google/cloud/storage/version.py | 2 +- .../snippet_metadata_google.storage.v2.json | 2 +- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index a2eac134d..e20e4bc40 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -1,7 +1,7 @@ image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 libraries: - id: google-cloud-storage - version: 3.7.0 + version: 3.8.0 last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab apis: - path: google/storage/v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index da1f2149b..e371dd766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.8.0](https://github.com/googleapis/python-storage/compare/v3.7.0...v3.8.0) (2026-01-13) + + +### Features + +* flush the last chunk in append method (#1699) ([89bfe7a5fcd0391da35e9ceccc185279782b5420](https://github.com/googleapis/python-storage/commit/89bfe7a5fcd0391da35e9ceccc185279782b5420)) +* add write resumption strategy (#1663) ([a57ea0ec786a84c7ae9ed82c6ae5d38ecadba4af](https://github.com/googleapis/python-storage/commit/a57ea0ec786a84c7ae9ed82c6ae5d38ecadba4af)) +* add bidi stream retry manager. (#1632) ([d90f0ee09902a21b186106bcf0a8cb0b81b34340](https://github.com/googleapis/python-storage/commit/d90f0ee09902a21b186106bcf0a8cb0b81b34340)) +* implement "append_from_file" (#1686) ([1333c956da18b4db753cda98c41c3619c84caf69](https://github.com/googleapis/python-storage/commit/1333c956da18b4db753cda98c41c3619c84caf69)) +* make flush size configurable (#1677) ([f7095faf0a81239894ff9d277849788b62eb6ac5](https://github.com/googleapis/python-storage/commit/f7095faf0a81239894ff9d277849788b62eb6ac5)) +* compute chunk wise checksum for bidi_writes (#1675) ([139390cb01f93a2d61e7ec201e3637dffe0b2a34](https://github.com/googleapis/python-storage/commit/139390cb01f93a2d61e7ec201e3637dffe0b2a34)) +* expose persisted size in mrd (#1671) ([0e2961bef285fc064174a5c18e3db05c7a682521](https://github.com/googleapis/python-storage/commit/0e2961bef285fc064174a5c18e3db05c7a682521)) + + +### Bug Fixes + +* add system test for opening with read_handle (#1672) ([6dc711dacd4d38c573aa4ca9ad71fe412c0e49c1](https://github.com/googleapis/python-storage/commit/6dc711dacd4d38c573aa4ca9ad71fe412c0e49c1)) +* no state lookup while opening bidi-write stream (#1636) ([2d5a7b16846a69f3a911844971241899f60cce14](https://github.com/googleapis/python-storage/commit/2d5a7b16846a69f3a911844971241899f60cce14)) +* close write object stream always (#1661) ([4a609a4b3f4ba1396825911cb02f8a9649135cd5](https://github.com/googleapis/python-storage/commit/4a609a4b3f4ba1396825911cb02f8a9649135cd5)) + ## [3.7.0](https://github.com/googleapis/python-storage/compare/v3.6.0...v3.7.0) (2025-12-09) diff --git a/google/cloud/_storage_v2/gapic_version.py b/google/cloud/_storage_v2/gapic_version.py index d69b0530e..4a7c666d6 100644 --- a/google/cloud/_storage_v2/gapic_version.py +++ b/google/cloud/_storage_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.6.0" # {x-release-please-version} +__version__ = "3.8.0" # {x-release-please-version} diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index dc87b3c5b..8f4ba4810 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.7.0" +__version__ = "3.8.0" diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json index 4af7ef641..7fcd587f3 100644 --- a/samples/generated_samples/snippet_metadata_google.storage.v2.json +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage", - "version": "3.6.0" + "version": "3.8.0" }, "snippets": [ { From 6c160794afded5e8f4179399f1fe5248e32bf707 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 16 Jan 2026 01:17:59 +0530 Subject: [PATCH 460/509] fix(experimental): implement requests_done method to signal end of requests in async streams. Gracefully close streams. (#1700) fix(experimental): implement requests_done method to signal end of requests in async streams. Gracefully close streams. --- .../asyncio/async_read_object_stream.py | 7 +++++ .../asyncio/async_write_object_stream.py | 8 ++++++ .../asyncio/test_async_read_object_stream.py | 26 +++++++++++++++++++ .../asyncio/test_async_write_object_stream.py | 23 ++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index 7adcdd1c9..5e84485d5 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -151,9 +151,16 @@ async def close(self) -> None: """Closes the bidi-gRPC connection.""" if not self._is_stream_open: raise ValueError("Stream is not open") + await self.requests_done() await self.socket_like_rpc.close() self._is_stream_open = False + async def requests_done(self): + """Signals that all requests have been sent.""" + + await self.socket_like_rpc.send(None) + await self.socket_like_rpc.recv() + async def send( self, bidi_read_object_request: _storage_v2.BidiReadObjectRequest ) -> None: diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 183a8eeb1..a0ebaa498 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -152,9 +152,16 @@ async def close(self) -> None: """Closes the bidi-gRPC connection.""" if not self._is_stream_open: raise ValueError("Stream is not open") + await self.requests_done() await self.socket_like_rpc.close() self._is_stream_open = False + async def requests_done(self): + """Signals that all requests have been sent.""" + + await self.socket_like_rpc.send(None) + await self.socket_like_rpc.recv() + async def send( self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest ) -> None: @@ -186,3 +193,4 @@ async def recv(self) -> _storage_v2.BidiWriteObjectResponse: @property def is_stream_open(self) -> bool: return self._is_stream_open + diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 4ba8d34a1..18e0c464d 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -197,15 +197,41 @@ async def test_close(mock_client, mock_cls_async_bidi_rpc): read_obj_stream = await instantiate_read_obj_stream( mock_client, mock_cls_async_bidi_rpc, open=True ) + read_obj_stream.requests_done = AsyncMock() # act await read_obj_stream.close() # assert + read_obj_stream.requests_done.assert_called_once() read_obj_stream.socket_like_rpc.close.assert_called_once() assert not read_obj_stream.is_stream_open +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" +) +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" +) +@pytest.mark.asyncio +async def test_requests_done(mock_client, mock_cls_async_bidi_rpc): + """Test that requests_done signals the end of requests.""" + # Arrange + read_obj_stream = await instantiate_read_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + read_obj_stream.socket_like_rpc.send = AsyncMock() + read_obj_stream.socket_like_rpc.recv = AsyncMock() + + # Act + await read_obj_stream.requests_done() + + # Assert + read_obj_stream.socket_like_rpc.send.assert_called_once_with(None) + read_obj_stream.socket_like_rpc.recv.assert_called_once() + + @mock.patch( "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" ) diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index c6ea8a8ff..63b5495bd 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -289,11 +289,13 @@ async def test_close(mock_cls_async_bidi_rpc, mock_client): write_obj_stream = await instantiate_write_obj_stream( mock_client, mock_cls_async_bidi_rpc, open=True ) + write_obj_stream.requests_done = AsyncMock() # Act await write_obj_stream.close() # Assert + write_obj_stream.requests_done.assert_called_once() write_obj_stream.socket_like_rpc.close.assert_called_once() assert not write_obj_stream.is_stream_open @@ -394,3 +396,24 @@ async def test_recv_without_open_should_raise_error( # Act & Assert with pytest.raises(ValueError, match="Stream is not open"): await write_obj_stream.recv() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_requests_done(mock_cls_async_bidi_rpc, mock_client): + """Test that requests_done signals the end of requests.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + write_obj_stream.socket_like_rpc.send = AsyncMock() + write_obj_stream.socket_like_rpc.recv = AsyncMock() + + # Act + await write_obj_stream.requests_done() + + # Assert + write_obj_stream.socket_like_rpc.send.assert_called_once_with(None) + write_obj_stream.socket_like_rpc.recv.assert_called_once() \ No newline at end of file From ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 16 Jan 2026 23:24:52 +0530 Subject: [PATCH 461/509] feat(ZonalBuckets): add support for `generation=0` to avoid overwriting existing objects and add `is_stream_open` support (#1709) feat(ZonalBuckets): add support for `generation=0` to prevent overwriting existing objects feat(ZonalBuckets): add `is_stream_open` property to AsyncAppendableObjectWriter for stream status check --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../asyncio/async_appendable_object_writer.py | 34 ++++++--- .../asyncio/async_write_object_stream.py | 19 +++-- tests/system/test_zonal.py | 72 +++++++++++++++++++ .../test_async_appendable_object_writer.py | 12 ++-- .../asyncio/test_async_write_object_stream.py | 36 ++++++++++ 5 files changed, 155 insertions(+), 18 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index c808cb52a..444e8d030 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -97,15 +97,29 @@ def __init__( :param object_name: The name of the GCS Appendable Object to be written. :type generation: int - :param generation: (Optional) If present, selects a specific revision of - that object. - If None, a new object is created. - If None and Object already exists then it'll will be - overwritten. + :param generation: (Optional) If present, creates writer for that + specific revision of that object. Use this to append data to an + existing Appendable Object. + + Setting to ``0`` makes the `writer.open()` succeed only if + object doesn't exist in the bucket (useful for not accidentally + overwriting existing objects). + + Warning: If `None`, a new object is created. If an object with the + same name already exists, it will be overwritten the moment + `writer.open()` is called. :type write_handle: bytes - :param write_handle: (Optional) An existing handle for writing the object. - If provided, opening the bidi-gRPC connection will be faster. + :param write_handle: (Optional) An handle for writing the object. + If provided, opening the bidi-gRPC connection will be faster. + + :type writer_options: dict + :param writer_options: (Optional) A dictionary of writer options. + Supported options: + - "FLUSH_INTERVAL_BYTES": int + The number of bytes to append before "persisting" data in GCS + servers. Default is `_DEFAULT_FLUSH_INTERVAL_BYTES`. + Must be a multiple of `_MAX_CHUNK_SIZE_BYTES`. """ raise_if_no_fast_crc32c() self.client = client @@ -133,7 +147,6 @@ def __init__( self.flush_interval = writer_options.get( "FLUSH_INTERVAL_BYTES", _DEFAULT_FLUSH_INTERVAL_BYTES ) - # TODO: add test case for this. if self.flush_interval < _MAX_CHUNK_SIZE_BYTES: raise exceptions.OutOfRange( f"flush_interval must be >= {_MAX_CHUNK_SIZE_BYTES} , but provided {self.flush_interval}" @@ -346,6 +359,11 @@ async def finalize(self) -> _storage_v2.Object: self.offset = None return self.object_resource + @property + def is_stream_open(self) -> bool: + return self._is_stream_open + + # helper methods. async def append_from_string(self, data: str): """ diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index a0ebaa498..1454803ad 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -47,8 +47,17 @@ class _AsyncWriteObjectStream(_AsyncAbstractObjectStream): :param object_name: The name of the GCS ``Appendable Object`` to be write. :type generation_number: int - :param generation_number: (Optional) If present, selects a specific revision of - this object. If None, a new object is created. + :param generation_number: (Optional) If present, creates writer for that + specific revision of that object. Use this to append data to an + existing Appendable Object. + + Setting to ``0`` makes the `writer.open()` succeed only if + object doesn't exist in the bucket (useful for not accidentally + overwriting existing objects). + + Warning: If `None`, a new object is created. If an object with the + same name already exists, it will be overwritten the moment + `writer.open()` is called. :type write_handle: bytes :param write_handle: (Optional) An existing handle for writing the object. @@ -101,13 +110,16 @@ async def open(self) -> None: # Create a new object or overwrite existing one if generation_number # is None. This makes it consistent with GCS JSON API behavior. # Created object type would be Appendable Object. - if self.generation_number is None: + # if `generation_number` == 0 new object will be created only if there + # isn't any existing object. + if self.generation_number is None or self.generation_number == 0: self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( write_object_spec=_storage_v2.WriteObjectSpec( resource=_storage_v2.Object( name=self.object_name, bucket=self._full_bucket_name ), appendable=True, + if_generation_match=self.generation_number, ), ) else: @@ -118,7 +130,6 @@ async def open(self) -> None: generation=self.generation_number, ), ) - self.socket_like_rpc = AsyncBidiRpc( self.rpc, initial_request=self.first_bidi_write_req, metadata=self.metadata ) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 2ade654ad..b5942365a 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -18,6 +18,7 @@ from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) +from google.api_core.exceptions import FailedPrecondition pytestmark = pytest.mark.skipif( @@ -360,3 +361,74 @@ async def test_append_flushes_and_state_lookup(storage_client, blobs_to_delete): await mrd.close() content = buffer.getvalue() assert content == full_data + +@pytest.mark.asyncio +async def test_open_with_generation_zero(storage_client, blobs_to_delete): + """Tests that using `generation=0` fails if the object already exists. + + This test verifies that: + 1. An object can be created using `AsyncAppendableObjectWriter` with `generation=0`. + 2. Attempting to create the same object again with `generation=0` raises a + `FailedPrecondition` error with a 400 status code, because the + precondition (object must not exist) is not met. + """ + object_name = f"test_append_with_generation-{uuid.uuid4()}" + grpc_client = AsyncGrpcClient().grpc_client + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name, generation=0) + + # Empty object is created. + await writer.open() + assert writer.is_stream_open + + await writer.close() + assert not writer.is_stream_open + + + with pytest.raises(FailedPrecondition) as exc_info: + writer = AsyncAppendableObjectWriter( + grpc_client, _ZONAL_BUCKET, object_name, generation=0 + ) + await writer.open() + assert exc_info.value.code == 400 + + # cleanup + del writer + gc.collect() + + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + +@pytest.mark.asyncio +async def test_open_existing_object_with_gen_None_overrides_existing(storage_client, blobs_to_delete): + """ + Test that a new writer when specifies `None` overrides the existing object. + """ + object_name = f"test_append_with_generation-{uuid.uuid4()}" + + grpc_client = AsyncGrpcClient().grpc_client + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name, generation=0) + + # Empty object is created. + await writer.open() + assert writer.is_stream_open + old_gen = writer.generation + + + await writer.close() + assert not writer.is_stream_open + + + + new_writer = AsyncAppendableObjectWriter( + grpc_client, _ZONAL_BUCKET, object_name, generation=None + ) + await new_writer.open() + assert new_writer.generation != old_gen + + # assert exc_info.value.code == 400 + + # cleanup + del writer + del new_writer + gc.collect() + + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) \ No newline at end of file diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 07f7047d8..c19622238 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -55,7 +55,7 @@ def test_init(mock_write_object_stream, mock_client): assert writer.object_name == OBJECT assert writer.generation is None assert writer.write_handle is None - assert not writer._is_stream_open + assert not writer.is_stream_open assert writer.offset is None assert writer.persisted_size is None assert writer.bytes_appended_since_last_flush == 0 @@ -225,7 +225,7 @@ async def test_open_appendable_object_writer(mock_write_object_stream, mock_clie # Assert mock_stream.open.assert_awaited_once() - assert writer._is_stream_open + assert writer.is_stream_open assert writer.generation == GENERATION assert writer.write_handle == WRITE_HANDLE assert writer.persisted_size == 0 @@ -255,7 +255,7 @@ async def test_open_appendable_object_writer_existing_object( # Assert mock_stream.open.assert_awaited_once() - assert writer._is_stream_open + assert writer.is_stream_open assert writer.generation == GENERATION assert writer.write_handle == WRITE_HANDLE assert writer.persisted_size == PERSISTED_SIZE @@ -379,7 +379,7 @@ async def test_close(mock_write_object_stream, mock_client): mock_stream.close.assert_awaited_once() assert writer.offset is None assert persisted_size == 1024 - assert not writer._is_stream_open + assert not writer.is_stream_open @pytest.mark.asyncio @@ -415,7 +415,7 @@ async def test_finalize_on_close(mock_write_object_stream, mock_client): # Assert mock_stream.close.assert_awaited_once() - assert not writer._is_stream_open + assert not writer.is_stream_open assert writer.offset is None assert writer.object_resource == mock_resource assert writer.persisted_size == 2048 @@ -448,7 +448,7 @@ async def test_finalize(mock_write_object_stream, mock_client): assert writer.object_resource == mock_resource assert writer.persisted_size == 123 assert gcs_object == mock_resource - assert writer._is_stream_open is False + assert not writer.is_stream_open assert writer.offset is None diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 63b5495bd..f0d90543f 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -148,6 +148,42 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): assert stream.persisted_size == 0 +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_for_new_object_with_generation_zero(mock_async_bidi_rpc, mock_client): + """Test opening a stream for a new object.""" + # Arrange + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = mock.AsyncMock() + + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.generation = GENERATION + mock_response.resource.size = 0 + mock_response.write_handle = WRITE_HANDLE + socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT, generation_number=0) + + # Act + await stream.open() + + # Assert + mock_async_bidi_rpc.assert_called_once() + _, call_kwargs = mock_async_bidi_rpc.call_args + initial_request = call_kwargs["initial_request"] + assert initial_request.write_object_spec.if_generation_match == 0 + assert stream._is_stream_open + socket_like_rpc.open.assert_called_once() + socket_like_rpc.recv.assert_called_once() + assert stream.generation_number == GENERATION + assert stream.write_handle == WRITE_HANDLE + assert stream.persisted_size == 0 + + @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" From 2e1a1eb5cbe1c909f1f892a0cc74fe63c8ef36ff Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 20 Jan 2026 18:20:24 +0530 Subject: [PATCH 462/509] feat(samples): add samples for appendable objects writes and reads (#1705) feat(samples): add samples for appendable objects writes and reads --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- cloudbuild/run_zonal_tests.sh | 1 + .../asyncio/async_multi_range_downloader.py | 10 +- .../asyncio/async_write_object_stream.py | 12 +- ...rage_create_and_write_appendable_object.py | 77 ++++++ ...orage_finalize_appendable_object_upload.py | 78 ++++++ ...orage_open_multiple_objects_ranged_read.py | 85 ++++++ ...torage_open_object_multiple_ranged_read.py | 85 ++++++ .../storage_open_object_read_full_object.py | 72 +++++ .../storage_open_object_single_ranged_read.py | 77 ++++++ ...rage_pause_and_resume_appendable_upload.py | 94 +++++++ .../storage_read_appendable_object_tail.py | 141 ++++++++++ .../zonal_buckets/zonal_snippets_test.py | 260 ++++++++++++++++++ setup.py | 18 ++ .../test_async_appendable_object_writer.py | 10 +- 14 files changed, 1010 insertions(+), 10 deletions(-) create mode 100644 samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py create mode 100644 samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py create mode 100644 samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py create mode 100644 samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py create mode 100644 samples/snippets/zonal_buckets/storage_open_object_read_full_object.py create mode 100644 samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py create mode 100644 samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py create mode 100644 samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py create mode 100644 samples/snippets/zonal_buckets/zonal_snippets_test.py diff --git a/cloudbuild/run_zonal_tests.sh b/cloudbuild/run_zonal_tests.sh index 283ed6826..22ca8fe4b 100644 --- a/cloudbuild/run_zonal_tests.sh +++ b/cloudbuild/run_zonal_tests.sh @@ -26,3 +26,4 @@ export RUN_ZONAL_SYSTEM_TESTS=True CURRENT_ULIMIT=$(ulimit -n) echo '--- Running Zonal tests on VM with ulimit set to ---' $CURRENT_ULIMIT pytest -vv -s --log-format='%(asctime)s %(levelname)s %(message)s' --log-date-format='%H:%M:%S' tests/system/test_zonal.py +pytest -vv -s --log-format='%(asctime)s %(levelname)s %(message)s' --log-date-format='%H:%M:%S' samples/snippets/zonal_buckets/zonal_snippets_test.py diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 8f16294d8..dedff67e2 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -303,11 +303,19 @@ async def download_ranges( :type read_ranges: List[Tuple[int, int, "BytesIO"]] :param read_ranges: A list of tuples, where each tuple represents a - combintaion of byte_range and writeable buffer in format - + combination of byte_range and writeable buffer in format - (`start_byte`, `bytes_to_read`, `writeable_buffer`). Buffer has to be provided by the user, and user has to make sure appropriate memory is available in the application to avoid out-of-memory crash. + Special cases: + if the value of `bytes_to_read` is 0, it'll be interpreted as + download all contents until the end of the file from `start_byte`. + Examples: + * (0, 0, buffer) : downloads 0 to end , i.e. entire object. + * (100, 0, buffer) : downloads from 100 to end. + + :type lock: asyncio.Lock :param lock: (Optional) An asyncio lock to synchronize sends and recvs on the underlying bidi-GRPC stream. This is required when multiple diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 1454803ad..b79e707f2 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -101,8 +101,16 @@ def __init__( self.object_resource: Optional[_storage_v2.Object] = None async def open(self) -> None: - """Opening an object for write , should do it's state lookup - to know what's the persisted size is. + """ + Opens the bidi-gRPC connection to write to the object. + + This method sends an initial request to start the stream and receives + the first response containing metadata and a write handle. + + :rtype: None + :raises ValueError: If the stream is already open. + :raises google.api_core.exceptions.FailedPrecondition: + if `generation_number` is 0 and object already exists. """ if self._is_stream_open: raise ValueError("Stream is already open") diff --git a/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py b/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py new file mode 100644 index 000000000..87da6cfdd --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio + +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient + + +# [START storage_create_and_write_appendable_object] + + +async def storage_create_and_write_appendable_object( + bucket_name, object_name, grpc_client=None +): + """Uploads an appendable object to zonal bucket. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + writer = AsyncAppendableObjectWriter( + client=grpc_client, + bucket_name=bucket_name, + object_name=object_name, + generation=0, # throws `FailedPrecondition` if object already exists. + ) + # This creates a new appendable object of size 0 and opens it for appending. + await writer.open() + + # appends data to the object + # you can perform `.append` multiple times as needed. Data will be appended + # to the end of the object. + await writer.append(b"Some data") + + # Once all appends are done, close the gRPC bidirectional stream. + await writer.close() + + print( + f"Appended object {object_name} created of size {writer.persisted_size} bytes." + ) + + +# [END storage_create_and_write_appendable_object] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument("--object_name", help="Your Cloud Storage object name.") + + args = parser.parse_args() + + asyncio.run( + storage_create_and_write_appendable_object( + bucket_name=args.bucket_name, + object_name=args.object_name, + ) + ) diff --git a/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py b/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py new file mode 100644 index 000000000..4a4b64289 --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio + +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient + + +# [START storage_finalize_appendable_object_upload] +async def storage_finalize_appendable_object_upload( + bucket_name, object_name, grpc_client=None +): + """Creates, writes to, and finalizes an appendable object. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + writer = AsyncAppendableObjectWriter( + client=grpc_client, + bucket_name=bucket_name, + object_name=object_name, + generation=0, # throws `FailedPrecondition` if object already exists. + ) + # This creates a new appendable object of size 0 and opens it for appending. + await writer.open() + + # Appends data to the object. + await writer.append(b"Some data") + + # finalize the appendable object, + # NOTE: + # 1. once finalized no more appends can be done to the object. + # 2. If you don't want to finalize, you can simply call `writer.close` + # 3. calling `.finalize()` also closes the grpc-bidi stream, calling + # `.close` after `.finalize` may lead to undefined behavior. + object_resource = await writer.finalize() + + print(f"Appendable object {object_name} created and finalized.") + print("Object Metadata:") + print(object_resource) + + +# [END storage_finalize_appendable_object_upload] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument("--object_name", help="Your Cloud Storage object name.") + + args = parser.parse_args() + + asyncio.run( + storage_finalize_appendable_object_upload( + bucket_name=args.bucket_name, + object_name=args.object_name, + ) + ) diff --git a/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py new file mode 100644 index 000000000..c22023a5c --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Downloads a range of bytes from multiple objects concurrently.""" +import argparse +import asyncio +from io import BytesIO + +from google.cloud.storage._experimental.asyncio.async_grpc_client import ( + AsyncGrpcClient, +) +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + + +# [START storage_open_multiple_objects_ranged_read] +async def storage_open_multiple_objects_ranged_read( + bucket_name, object_names, grpc_client=None +): + """Downloads a range of bytes from multiple objects concurrently. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + + async def _download_range(object_name): + """Helper coroutine to download a range from a single object.""" + mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) + try: + # Open the object, mrd always opens in read mode. + await mrd.open() + + # Each object downloads the first 100 bytes. + start_byte = 0 + size = 100 + + # requested range will be downloaded into this buffer, user may provide + # their own buffer or file-like object. + output_buffer = BytesIO() + await mrd.download_ranges([(start_byte, size, output_buffer)]) + finally: + if mrd.is_stream_open: + await mrd.close() + + # Downloaded size can differ from requested size if object is smaller. + # mrd will download at most up to the end of the object. + downloaded_size = output_buffer.getbuffer().nbytes + print(f"Downloaded {downloaded_size} bytes from {object_name}") + + download_tasks = [_download_range(name) for name in object_names] + await asyncio.gather(*download_tasks) + + +# [END storage_open_multiple_objects_ranged_read] + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument( + "--object_names", nargs="+", help="Your Cloud Storage object name(s)." + ) + + args = parser.parse_args() + + asyncio.run( + storage_open_multiple_objects_ranged_read(args.bucket_name, args.object_names) + ) diff --git a/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py new file mode 100644 index 000000000..55d92d9da --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +from io import BytesIO + +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + + +# [START storage_open_object_multiple_ranged_read] +async def storage_open_object_multiple_ranged_read( + bucket_name, object_name, grpc_client=None +): + """Downloads multiple ranges of bytes from a single object into different buffers. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + + mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) + + try: + # Open the object, mrd always opens in read mode. + await mrd.open() + + # Specify four different buffers to download ranges into. + buffers = [BytesIO(), BytesIO(), BytesIO(), BytesIO()] + + # Define the ranges to download. Each range is a tuple of (start_byte, size, buffer). + # All ranges will download 10 bytes from different starting positions. + # We choose arbitrary start bytes for this example. An object should be large enough. + # A user can choose any start byte between 0 and `object_size`. + # If `start_bytes` is greater than `object_size`, mrd will throw an error. + ranges = [ + (0, 10, buffers[0]), + (20, 10, buffers[1]), + (40, 10, buffers[2]), + (60, 10, buffers[3]), + ] + + await mrd.download_ranges(ranges) + + finally: + await mrd.close() + + # Print the downloaded content from each buffer. + for i, output_buffer in enumerate(buffers): + downloaded_size = output_buffer.getbuffer().nbytes + print( + f"Downloaded {downloaded_size} bytes into buffer {i + 1} from start byte {ranges[i][0]}: {output_buffer.getvalue()}" + ) + + +# [END storage_open_object_multiple_ranged_read] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument("--object_name", help="Your Cloud Storage object name.") + + args = parser.parse_args() + + asyncio.run( + storage_open_object_multiple_ranged_read(args.bucket_name, args.object_name) + ) diff --git a/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py b/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py new file mode 100644 index 000000000..044c42b71 --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +from io import BytesIO + +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + + +# [START storage_open_object_read_full_object] +async def storage_open_object_read_full_object( + bucket_name, object_name, grpc_client=None +): + """Downloads the entire content of an object using a multi-range downloader. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + + # mrd = Multi-Range-Downloader + mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) + + try: + # Open the object, mrd always opens in read mode. + await mrd.open() + + # This could be any buffer or file-like object. + output_buffer = BytesIO() + # A download range of (0, 0) means to read from the beginning to the end. + await mrd.download_ranges([(0, 0, output_buffer)]) + finally: + if mrd.is_stream_open: + await mrd.close() + + downloaded_bytes = output_buffer.getvalue() + print( + f"Downloaded all {len(downloaded_bytes)} bytes from object {object_name} in bucket {bucket_name}." + ) + + +# [END storage_open_object_read_full_object] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument("--object_name", help="Your Cloud Storage object name.") + + args = parser.parse_args() + + asyncio.run( + storage_open_object_read_full_object(args.bucket_name, args.object_name) + ) diff --git a/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py new file mode 100644 index 000000000..41effce36 --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +from io import BytesIO + +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + + +# [START storage_open_object_single_ranged_read] +async def storage_open_object_single_ranged_read( + bucket_name, object_name, start_byte, size, grpc_client=None +): + """Downloads a range of bytes from an object. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + + mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) + + try: + # Open the object, mrd always opens in read mode. + await mrd.open() + + # requested range will be downloaded into this buffer, user may provide + # their own buffer or file-like object. + output_buffer = BytesIO() + await mrd.download_ranges([(start_byte, size, output_buffer)]) + finally: + if mrd.is_stream_open: + await mrd.close() + + # Downloaded size can differ from requested size if object is smaller. + # mrd will download at most up to the end of the object. + downloaded_size = output_buffer.getbuffer().nbytes + print(f"Downloaded {downloaded_size} bytes from {object_name}") + + +# [END storage_open_object_single_ranged_read] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument("--object_name", help="Your Cloud Storage object name.") + parser.add_argument( + "--start_byte", type=int, help="The starting byte of the range." + ) + parser.add_argument("--size", type=int, help="The number of bytes to download.") + + args = parser.parse_args() + + asyncio.run( + storage_open_object_single_ranged_read( + args.bucket_name, args.object_name, args.start_byte, args.size + ) + ) diff --git a/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py b/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py new file mode 100644 index 000000000..db54bb821 --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio + +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient + + +# [START storage_pause_and_resume_appendable_upload] +async def storage_pause_and_resume_appendable_upload( + bucket_name, object_name, grpc_client=None +): + """Demonstrates pausing and resuming an appendable object upload. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + + writer1 = AsyncAppendableObjectWriter( + client=grpc_client, + bucket_name=bucket_name, + object_name=object_name, + ) + await writer1.open() + await writer1.append(b"First part of the data. ") + print(f"Appended {writer1.persisted_size} bytes with the first writer.") + + # 2. After appending some data, close the writer to "pause" the upload. + # NOTE: you can pause indefinitely and still read the conetent uploaded so far using MRD. + await writer1.close() + + print("First writer closed. Upload is 'paused'.") + + # 3. Create a new writer, passing the generation number from the previous + # writer. This is a precondition to ensure that the object hasn't been + # modified since we last accessed it. + generation_to_resume = writer1.generation + print(f"Generation to resume from is: {generation_to_resume}") + + writer2 = AsyncAppendableObjectWriter( + client=grpc_client, + bucket_name=bucket_name, + object_name=object_name, + generation=generation_to_resume, + ) + # 4. Open the new writer. + try: + await writer2.open() + + # 5. Append some more data using the new writer. + await writer2.append(b"Second part of the data.") + print(f"Appended more data. Total size is now {writer2.persisted_size} bytes.") + finally: + # 6. Finally, close the new writer. + if writer2._is_stream_open: + await writer2.close() + print("Second writer closed. Full object uploaded.") + + +# [END storage_pause_and_resume_appendable_upload] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument("--object_name", help="Your Cloud Storage object name.") + + args = parser.parse_args() + + asyncio.run( + storage_pause_and_resume_appendable_upload( + bucket_name=args.bucket_name, + object_name=args.object_name, + ) + ) diff --git a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py new file mode 100644 index 000000000..587513056 --- /dev/null +++ b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python + +# Copyright 2026 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import time +from datetime import datetime +from io import BytesIO + +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) + +BYTES_TO_APPEND = b"fav_bytes." +NUM_BYTES_TO_APPEND_EVERY_SECOND = len(BYTES_TO_APPEND) + + +# [START storage_read_appendable_object_tail] +async def appender(writer: AsyncAppendableObjectWriter, duration: int): + """Appends 10 bytes to the object every second for a given duration.""" + print("Appender started.") + bytes_appended = 0 + for i in range(duration): + await writer.append(BYTES_TO_APPEND) + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + bytes_appended += NUM_BYTES_TO_APPEND_EVERY_SECOND + print( + f"[{now}] Appended {NUM_BYTES_TO_APPEND_EVERY_SECOND} new bytes. Total appended: {bytes_appended} bytes." + ) + await asyncio.sleep(1) + print("Appender finished.") + + +async def tailer( + bucket_name: str, object_name: str, duration: int, client: AsyncGrpcClient +): + """Tails the object by reading new data as it is appended.""" + print("Tailer started.") + start_byte = 0 + start_time = time.monotonic() + mrd = AsyncMultiRangeDownloader(client, bucket_name, object_name) + try: + await mrd.open() + # Run the tailer for the specified duration. + while time.monotonic() - start_time < duration: + output_buffer = BytesIO() + # A download range of (start, 0) means to read from 'start' to the end. + await mrd.download_ranges([(start_byte, 0, output_buffer)]) + + bytes_downloaded = output_buffer.getbuffer().nbytes + if bytes_downloaded > 0: + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + print( + f"[{now}] Tailer read {bytes_downloaded} new bytes: {output_buffer.getvalue()}" + ) + start_byte += bytes_downloaded + + await asyncio.sleep(0.1) # Poll for new data every 0.1 seconds. + finally: + if mrd.is_stream_open: + await mrd.close() + print("Tailer finished.") + + +# read_appendable_object_tail simulates a "tail -f" command on a GCS object. It +# repeatedly polls an appendable object for new content. In a real +# application, the object would be written to by a separate process. +async def read_appendable_object_tail( + bucket_name: str, object_name: str, duration: int, grpc_client=None +): + """Main function to create an appendable object and run tasks. + + grpc_client: an existing grpc_client to use, this is only for testing. + """ + if grpc_client is None: + grpc_client = AsyncGrpcClient().grpc_client + writer = AsyncAppendableObjectWriter( + client=grpc_client, + bucket_name=bucket_name, + object_name=object_name, + ) + # 1. Create an empty appendable object. + try: + # 1. Create an empty appendable object. + await writer.open() + print(f"Created empty appendable object: {object_name}") + + # 2. Create the appender and tailer coroutines. + appender_task = asyncio.create_task(appender(writer, duration)) + tailer_task = asyncio.create_task( + tailer(bucket_name, object_name, duration, grpc_client) + ) + + # 3. Execute the coroutines concurrently. + await asyncio.gather(appender_task, tailer_task) + finally: + if writer._is_stream_open: + await writer.close() + print("Writer closed.") + + +# [END storage_read_appendable_object_tail] + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Demonstrates tailing an appendable GCS object.", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("--bucket_name", help="Your Cloud Storage bucket name.") + parser.add_argument( + "--object_name", help="Your Cloud Storage object name to be created." + ) + parser.add_argument( + "--duration", + type=int, + default=60, + help="Duration in seconds to run the demo.", + ) + + args = parser.parse_args() + + asyncio.run( + read_appendable_object_tail(args.bucket_name, args.object_name, args.duration) + ) diff --git a/samples/snippets/zonal_buckets/zonal_snippets_test.py b/samples/snippets/zonal_buckets/zonal_snippets_test.py new file mode 100644 index 000000000..e45d21c47 --- /dev/null +++ b/samples/snippets/zonal_buckets/zonal_snippets_test.py @@ -0,0 +1,260 @@ +# Copyright 2025 Google, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import uuid +import os + +import pytest +from google.cloud.storage import Client +import contextlib + +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) + +# Import all the snippets +import storage_create_and_write_appendable_object +import storage_finalize_appendable_object_upload +import storage_open_multiple_objects_ranged_read +import storage_open_object_multiple_ranged_read +import storage_open_object_read_full_object +import storage_open_object_single_ranged_read +import storage_pause_and_resume_appendable_upload +import storage_read_appendable_object_tail + +pytestmark = pytest.mark.skipif( + os.getenv("RUN_ZONAL_SYSTEM_TESTS") != "True", + reason="Zonal system tests need to be explicitly enabled. This helps scheduling tests in Kokoro and Cloud Build.", +) + + +# TODO: replace this with a fixture once zonal bucket creation / deletion +# is supported in grpc client or json client client. +_ZONAL_BUCKET = os.getenv("ZONAL_BUCKET") + + +async def create_async_grpc_client(): + """Initializes async client and gets the current event loop.""" + return AsyncGrpcClient().grpc_client + + +# Forcing a single event loop for the whole test session +@pytest.fixture(scope="session") +def event_loop(): + """Redefine pytest-asyncio's event_loop fixture to be session-scoped.""" + loop = asyncio.get_event_loop_policy().new_event_loop() + yield loop + loop.close() + + +@pytest.fixture(scope="session") +def async_grpc_client(event_loop): + """Yields a StorageAsyncClient that is closed after the test session.""" + grpc_client = event_loop.run_until_complete(create_async_grpc_client()) + yield grpc_client + + +@pytest.fixture(scope="session") +def json_client(): + client = Client() + with contextlib.closing(client): + yield client + + +async def create_appendable_object(grpc_client, object_name, data): + writer = AsyncAppendableObjectWriter( + client=grpc_client, + bucket_name=_ZONAL_BUCKET, + object_name=object_name, + generation=0, # throws `FailedPrecondition` if object already exists. + ) + await writer.open() + await writer.append(data) + await writer.close() + return writer.generation + + +# TODO: replace this with a fixture once zonal bucket creation / deletion +# is supported in grpc client or json client client. +_ZONAL_BUCKET = os.getenv("ZONAL_BUCKET") + + +def test_storage_create_and_write_appendable_object( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"zonal-snippets-test-{uuid.uuid4()}" + + event_loop.run_until_complete( + storage_create_and_write_appendable_object.storage_create_and_write_appendable_object( + _ZONAL_BUCKET, object_name, grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert f"Appended object {object_name} created of size" in out + + blob = json_client.bucket(_ZONAL_BUCKET).blob(object_name) + blob.delete() + + +def test_storage_finalize_appendable_object_upload( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"test-finalize-appendable-{uuid.uuid4()}" + event_loop.run_until_complete( + storage_finalize_appendable_object_upload.storage_finalize_appendable_object_upload( + _ZONAL_BUCKET, object_name, grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert f"Appendable object {object_name} created and finalized." in out + blob = json_client.bucket(_ZONAL_BUCKET).get_blob(object_name) + blob.delete() + + +def test_storage_pause_and_resume_appendable_upload( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"test-pause-resume-{uuid.uuid4()}" + event_loop.run_until_complete( + storage_pause_and_resume_appendable_upload.storage_pause_and_resume_appendable_upload( + _ZONAL_BUCKET, object_name, grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert "First writer closed. Upload is 'paused'." in out + assert "Second writer closed. Full object uploaded." in out + + blob = json_client.bucket(_ZONAL_BUCKET).get_blob(object_name) + blob.delete() + + +def test_storage_read_appendable_object_tail( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"test-read-tail-{uuid.uuid4()}" + event_loop.run_until_complete( + storage_read_appendable_object_tail.read_appendable_object_tail( + _ZONAL_BUCKET, object_name, duration=3, grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert f"Created empty appendable object: {object_name}" in out + assert "Appender started." in out + assert "Tailer started." in out + assert "Tailer read" in out + assert "Tailer finished." in out + assert "Writer closed." in out + + bucket = json_client.bucket(_ZONAL_BUCKET) + blob = bucket.blob(object_name) + blob.delete() + + +def test_storage_open_object_read_full_object( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"test-open-read-full-{uuid.uuid4()}" + data = b"Hello, is it me you're looking for?" + event_loop.run_until_complete( + create_appendable_object(async_grpc_client, object_name, data) + ) + event_loop.run_until_complete( + storage_open_object_read_full_object.storage_open_object_read_full_object( + _ZONAL_BUCKET, object_name, grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert ( + f"Downloaded all {len(data)} bytes from object {object_name} in bucket {_ZONAL_BUCKET}." + in out + ) + blob = json_client.bucket(_ZONAL_BUCKET).blob(object_name) + blob.delete() + + +def test_storage_open_object_single_ranged_read( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"test-open-single-range-{uuid.uuid4()}" + event_loop.run_until_complete( + create_appendable_object( + async_grpc_client, object_name, b"Hello, is it me you're looking for?" + ) + ) + download_size = 5 + event_loop.run_until_complete( + storage_open_object_single_ranged_read.storage_open_object_single_ranged_read( + _ZONAL_BUCKET, + object_name, + start_byte=0, + size=download_size, + grpc_client=async_grpc_client, + ) + ) + out, _ = capsys.readouterr() + assert f"Downloaded {download_size} bytes from {object_name}" in out + blob = json_client.bucket(_ZONAL_BUCKET).blob(object_name) + blob.delete() + + +def test_storage_open_object_multiple_ranged_read( + async_grpc_client, json_client, event_loop, capsys +): + object_name = f"test-open-multi-range-{uuid.uuid4()}" + data = b"a" * 100 + event_loop.run_until_complete( + create_appendable_object(async_grpc_client, object_name, data) + ) + event_loop.run_until_complete( + storage_open_object_multiple_ranged_read.storage_open_object_multiple_ranged_read( + _ZONAL_BUCKET, object_name, grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert "Downloaded 10 bytes into buffer 1 from start byte 0: b'aaaaaaaaaa'" in out + assert "Downloaded 10 bytes into buffer 2 from start byte 20: b'aaaaaaaaaa'" in out + assert "Downloaded 10 bytes into buffer 3 from start byte 40: b'aaaaaaaaaa'" in out + assert "Downloaded 10 bytes into buffer 4 from start byte 60: b'aaaaaaaaaa'" in out + blob = json_client.bucket(_ZONAL_BUCKET).blob(object_name) + blob.delete() + + +def test_storage_open_multiple_objects_ranged_read( + async_grpc_client, json_client, event_loop, capsys +): + blob1_name = f"multi-obj-1-{uuid.uuid4()}" + blob2_name = f"multi-obj-2-{uuid.uuid4()}" + data1 = b"Content of object 1" + data2 = b"Content of object 2" + event_loop.run_until_complete( + create_appendable_object(async_grpc_client, blob1_name, data1) + ) + event_loop.run_until_complete( + create_appendable_object(async_grpc_client, blob2_name, data2) + ) + + event_loop.run_until_complete( + storage_open_multiple_objects_ranged_read.storage_open_multiple_objects_ranged_read( + _ZONAL_BUCKET, [blob1_name, blob2_name], grpc_client=async_grpc_client + ) + ) + out, _ = capsys.readouterr() + assert f"Downloaded {len(data1)} bytes from {blob1_name}" in out + assert f"Downloaded {len(data2)} bytes from {blob2_name}" in out + blob1 = json_client.bucket(_ZONAL_BUCKET).blob(blob1_name) + blob2 = json_client.bucket(_ZONAL_BUCKET).blob(blob2_name) + blob1.delete() + blob2.delete() diff --git a/setup.py b/setup.py index b45053856..8ac6cc8b5 100644 --- a/setup.py +++ b/setup.py @@ -59,6 +59,24 @@ "tracing": [ "opentelemetry-api >= 1.1.0, < 2.0.0", ], + "testing": [ + "mock", + "pytest", + "pytest-cov", + "pytest-asyncio", + "pytest-rerunfailures", + "pytest-xdist", + "google-cloud-testutils", + "google-cloud-iam", + "google-cloud-pubsub", + "google-cloud-kms", + "brotli", + "coverage", + "pyopenssl", + "opentelemetry-sdk", + "flake8" + "black" + ], } diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index c19622238..2a9747f28 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -509,9 +509,7 @@ async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client data = b"a" * (_MAX_CHUNK_SIZE_BYTES + 1) mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse( - persisted_size=100 + len(data) - ) + return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=100 + len(data)) ) await writer.append(data) @@ -620,9 +618,7 @@ async def test_append_data_two_times(mock_write_object_stream, mock_client): data1 = b"a" * (_MAX_CHUNK_SIZE_BYTES + 10) mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse( - persisted_size= len(data1) - ) + return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=len(data1)) ) await writer.append(data1) @@ -634,7 +630,7 @@ async def test_append_data_two_times(mock_write_object_stream, mock_client): data2 = b"b" * (_MAX_CHUNK_SIZE_BYTES + 20) mock_stream.recv = mock.AsyncMock( return_value=_storage_v2.BidiWriteObjectResponse( - persisted_size= len(data2) + len(data1) + persisted_size=len(data2) + len(data1) ) ) await writer.append(data2) From cdb2486bb051dcbfbffc2510aff6aacede5e54d3 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 21 Jan 2026 12:01:06 +0530 Subject: [PATCH 463/509] feat(grpc_user_agent): send `user_agent` to grpc channel (#1712) * feat(async_grpc_client): send `user_agent` to grpc channel by providing it as channel arg - "grpc.primary_user_agent". * This will send "user_agent" to all RPC calls. --- .../asyncio/async_grpc_client.py | 15 ++++- tests/unit/asyncio/test_async_grpc_client.py | 67 ++++++++++++++++--- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py index a5cccca59..b455b1c29 100644 --- a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py +++ b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py @@ -15,6 +15,9 @@ """An async client for interacting with Google Cloud Storage using the gRPC API.""" from google.cloud import _storage_v2 as storage_v2 +from google.cloud._storage_v2.services.storage.transports.base import ( + DEFAULT_CLIENT_INFO, +) class AsyncGrpcClient: @@ -30,7 +33,7 @@ class AsyncGrpcClient: The client info used to send a user-agent string along with API requests. If ``None``, then default info will be used. - :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` + :type client_options: :class:`~google.api_core.client_options.ClientOptions` :param client_options: (Optional) Client options used to set user options on the client. @@ -39,7 +42,6 @@ class AsyncGrpcClient: (Optional) Whether to attempt to use DirectPath for gRPC connections. Defaults to ``True``. """ - def __init__( self, credentials=None, @@ -65,8 +67,15 @@ def _create_async_grpc_client( transport_cls = storage_v2.StorageAsyncClient.get_transport_class( "grpc_asyncio" ) + + if client_info is None: + client_info = DEFAULT_CLIENT_INFO + primary_user_agent = client_info.to_user_agent() + channel = transport_cls.create_channel( - attempt_direct_path=attempt_direct_path, credentials=credentials + attempt_direct_path=attempt_direct_path, + credentials=credentials, + options=(("grpc.primary_user_agent", primary_user_agent),), ) transport = transport_cls(channel=channel) diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index eb06ab938..02b416f6b 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -16,6 +16,11 @@ from unittest import mock from google.auth import credentials as auth_credentials from google.auth.credentials import AnonymousCredentials +from google.api_core import client_info as client_info_lib +from google.cloud.storage._experimental.asyncio import async_grpc_client +from google.cloud.storage._experimental.asyncio.async_grpc_client import ( + DEFAULT_CLIENT_INFO, +) def _make_credentials(spec=None): @@ -27,19 +32,25 @@ def _make_credentials(spec=None): class TestAsyncGrpcClient(unittest.TestCase): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_default_options(self, mock_async_storage_client): - from google.cloud.storage._experimental.asyncio import async_grpc_client - + # Arrange mock_transport_cls = mock.MagicMock() mock_async_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials() + primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() + expected_options = (("grpc.primary_user_agent", primary_user_agent),) + + # Act async_grpc_client.AsyncGrpcClient(credentials=mock_creds) + # Assert mock_async_storage_client.get_transport_class.assert_called_once_with( "grpc_asyncio" ) mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=True, credentials=mock_creds + attempt_direct_path=True, + credentials=mock_creds, + options=expected_options, ) mock_channel = mock_transport_cls.create_channel.return_value mock_transport_cls.assert_called_once_with(channel=mock_channel) @@ -47,12 +58,34 @@ def test_constructor_default_options(self, mock_async_storage_client): mock_async_storage_client.assert_called_once_with( transport=mock_transport, client_options=None, - client_info=None, + client_info=DEFAULT_CLIENT_INFO, + ) + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + def test_constructor_with_client_info(self, mock_async_storage_client): + + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials() + client_info = client_info_lib.ClientInfo( + client_library_version="1.2.3", + ) + + async_grpc_client.AsyncGrpcClient( + credentials=mock_creds, client_info=client_info + ) + + primary_user_agent = client_info.to_user_agent() + expected_options = (("grpc.primary_user_agent", primary_user_agent),) + + mock_transport_cls.create_channel.assert_called_once_with( + attempt_direct_path=True, + credentials=mock_creds, + options=expected_options, ) @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_disables_directpath(self, mock_async_storage_client): - from google.cloud.storage._experimental.asyncio import async_grpc_client mock_transport_cls = mock.MagicMock() mock_async_storage_client.get_transport_class.return_value = mock_transport_cls @@ -62,15 +95,19 @@ def test_constructor_disables_directpath(self, mock_async_storage_client): credentials=mock_creds, attempt_direct_path=False ) + primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() + expected_options = (("grpc.primary_user_agent", primary_user_agent),) + mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=False, credentials=mock_creds + attempt_direct_path=False, + credentials=mock_creds, + options=expected_options, ) mock_channel = mock_transport_cls.create_channel.return_value mock_transport_cls.assert_called_once_with(channel=mock_channel) @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_grpc_client_property(self, mock_grpc_gapic_client): - from google.cloud.storage._experimental.asyncio import async_grpc_client # Arrange mock_transport_cls = mock.MagicMock() @@ -81,7 +118,8 @@ def test_grpc_client_property(self, mock_grpc_gapic_client): mock_transport_cls.return_value = mock.sentinel.transport mock_creds = _make_credentials() - mock_client_info = mock.sentinel.client_info + mock_client_info = mock.MagicMock(spec=client_info_lib.ClientInfo) + mock_client_info.to_user_agent.return_value = "test-user-agent" mock_client_options = mock.sentinel.client_options mock_attempt_direct_path = mock.sentinel.attempt_direct_path @@ -102,8 +140,11 @@ def test_grpc_client_property(self, mock_grpc_gapic_client): retrieved_client = client.grpc_client # Assert + expected_options = (("grpc.primary_user_agent", "test-user-agent"),) mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=mock_attempt_direct_path, credentials=mock_creds + attempt_direct_path=mock_attempt_direct_path, + credentials=mock_creds, + options=expected_options, ) mock_transport_cls.assere_with(channel=channel_sentinel) mock_grpc_gapic_client.assert_called_once_with( @@ -115,7 +156,6 @@ def test_grpc_client_property(self, mock_grpc_gapic_client): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): - from google.cloud.storage._experimental.asyncio import async_grpc_client # Arrange mock_transport_cls = mock.MagicMock() @@ -133,7 +173,12 @@ def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): # Assert self.assertIs(retrieved_client, mock_grpc_gapic_client.return_value) + primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() + expected_options = (("grpc.primary_user_agent", primary_user_agent),) + mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=True, credentials=anonymous_creds + attempt_direct_path=True, + credentials=anonymous_creds, + options=expected_options, ) mock_transport_cls.assert_called_once_with(channel=channel_sentinel) From cc4831d7e253b265b0b96e08b5479f4c759be442 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 21 Jan 2026 16:25:26 +0530 Subject: [PATCH 464/509] fix: Fix formatting in setup.py dependencies list (#1713) Fix formatting in setup.py dependencies list --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 8ac6cc8b5..8a10fc8de 100644 --- a/setup.py +++ b/setup.py @@ -74,8 +74,8 @@ "coverage", "pyopenssl", "opentelemetry-sdk", - "flake8" - "black" + "flake8", + "black", ], } From 1917649fac41481da1adea6c2a9f4ab1298a34c4 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 21 Jan 2026 16:51:18 +0530 Subject: [PATCH 465/509] feat: Add micro-benchmarks for reads comparing standard (regional) vs rapid (zonal) buckets. (#1697) * Add performance microbenchmarking suite for Sequential and Random Reads * This compares Regional (Standard Storage) with Zonal (Rapid Storage) buckets. * Regional uses JSON wheres Zonal uses gRPC bidi --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .gitignore | 3 + setup.py | 6 + tests/perf/__init__.py | 0 tests/perf/microbenchmarks/README.md | 38 ++ tests/perf/microbenchmarks/__init__.py | 13 + tests/perf/microbenchmarks/_utils.py | 163 +++++++ tests/perf/microbenchmarks/conftest.py | 144 ++++++ tests/perf/microbenchmarks/json_to_csv.py | 190 ++++++++ tests/perf/microbenchmarks/parameters.py | 28 ++ tests/perf/microbenchmarks/reads/__init__.py | 0 tests/perf/microbenchmarks/reads/config.py | 108 +++++ tests/perf/microbenchmarks/reads/config.yaml | 49 +++ .../perf/microbenchmarks/reads/parameters.py | 20 + .../perf/microbenchmarks/reads/test_reads.py | 415 ++++++++++++++++++ .../perf/microbenchmarks/resource_monitor.py | 99 +++++ 15 files changed, 1276 insertions(+) create mode 100644 tests/perf/__init__.py create mode 100644 tests/perf/microbenchmarks/README.md create mode 100644 tests/perf/microbenchmarks/__init__.py create mode 100644 tests/perf/microbenchmarks/_utils.py create mode 100644 tests/perf/microbenchmarks/conftest.py create mode 100644 tests/perf/microbenchmarks/json_to_csv.py create mode 100644 tests/perf/microbenchmarks/parameters.py create mode 100644 tests/perf/microbenchmarks/reads/__init__.py create mode 100644 tests/perf/microbenchmarks/reads/config.py create mode 100644 tests/perf/microbenchmarks/reads/config.yaml create mode 100644 tests/perf/microbenchmarks/reads/parameters.py create mode 100644 tests/perf/microbenchmarks/reads/test_reads.py create mode 100644 tests/perf/microbenchmarks/resource_monitor.py diff --git a/.gitignore b/.gitignore index d083ea1dd..220056c20 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,6 @@ system_tests/local_test_setup # Make sure a generated file isn't accidentally committed. pylintrc pylintrc.test + +# Benchmarking results and logs +__benchmark_results__/** diff --git a/setup.py b/setup.py index 8a10fc8de..02cd11140 100644 --- a/setup.py +++ b/setup.py @@ -60,6 +60,12 @@ "opentelemetry-api >= 1.1.0, < 2.0.0", ], "testing": [ + "google-cloud-testutils", + "numpy", + "psutil", + "py-cpuinfo", + "pytest-benchmark", + "PyYAML", "mock", "pytest", "pytest-cov", diff --git a/tests/perf/__init__.py b/tests/perf/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/perf/microbenchmarks/README.md b/tests/perf/microbenchmarks/README.md new file mode 100644 index 000000000..0219a5bd9 --- /dev/null +++ b/tests/perf/microbenchmarks/README.md @@ -0,0 +1,38 @@ +# Performance Microbenchmarks + +This directory contains performance microbenchmarks for the Python Storage client library. + +## Usage + +To run the benchmarks, use `pytest` with the `--benchmark-json` flag to specify an output file for the results. + +Example: +```bash +pytest --benchmark-json=output.json -vv -s tests/perf/microbenchmarks/reads/test_reads.py +``` + +### Running a Specific Test + +To run a single test, append `::` followed by the test name to the file path. + +Example: +```bash +pytest --benchmark-json=output.json -vv -s tests/perf/microbenchmarks/reads/test_reads.py::test_downloads_single_proc_single_coro +``` + +## Configuration + +The benchmarks are configured using `config.yaml` files located in the respective subdirectories (e.g., `reads/config.yaml`). + +## Overriding Buckets + +You can override the buckets used in the benchmarks by setting environment variables. Please refer to the specific benchmark implementation for the environment variable names. + +## Output + +The benchmarks produce a JSON file with the results. This file can be converted to a CSV file for easier analysis in spreadsheets using the provided `json_to_csv.py` script. + +Example: +```bash +python3 tests/perf/microbenchmarks/json_to_csv.py output.json +``` diff --git a/tests/perf/microbenchmarks/__init__.py b/tests/perf/microbenchmarks/__init__.py new file mode 100644 index 000000000..58d482ea3 --- /dev/null +++ b/tests/perf/microbenchmarks/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/perf/microbenchmarks/_utils.py b/tests/perf/microbenchmarks/_utils.py new file mode 100644 index 000000000..b2589f2ac --- /dev/null +++ b/tests/perf/microbenchmarks/_utils.py @@ -0,0 +1,163 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Any, List +import statistics +import io +import os + + +def publish_benchmark_extra_info( + benchmark: Any, + params: Any, + benchmark_group: str = "read", + true_times: List[float] = [], +) -> None: + """ + Helper function to publish benchmark parameters to the extra_info property. + """ + + benchmark.extra_info["num_files"] = params.num_files + benchmark.extra_info["file_size"] = params.file_size_bytes + benchmark.extra_info["chunk_size"] = params.chunk_size_bytes + if benchmark_group == "write": + benchmark.extra_info["pattern"] = "seq" + else: + benchmark.extra_info["pattern"] = params.pattern + benchmark.extra_info["coros"] = params.num_coros + benchmark.extra_info["rounds"] = params.rounds + benchmark.extra_info["bucket_name"] = params.bucket_name + benchmark.extra_info["bucket_type"] = params.bucket_type + benchmark.extra_info["processes"] = params.num_processes + benchmark.group = benchmark_group + + object_size = params.file_size_bytes + num_files = params.num_files + total_uploaded_mib = (object_size / (1024 * 1024) * num_files) + min_throughput = total_uploaded_mib / benchmark.stats["max"] + max_throughput = total_uploaded_mib / benchmark.stats["min"] + mean_throughput = total_uploaded_mib / benchmark.stats["mean"] + median_throughput = total_uploaded_mib / benchmark.stats["median"] + + benchmark.extra_info["throughput_MiB_s_min"] = min_throughput + benchmark.extra_info["throughput_MiB_s_max"] = max_throughput + benchmark.extra_info["throughput_MiB_s_mean"] = mean_throughput + benchmark.extra_info["throughput_MiB_s_median"] = median_throughput + + print("\nThroughput Statistics (MiB/s):") + print(f" Min: {min_throughput:.2f} (from max time)") + print(f" Max: {max_throughput:.2f} (from min time)") + print(f" Mean: {mean_throughput:.2f} (approx, from mean time)") + print(f" Median: {median_throughput:.2f} (approx, from median time)") + + if true_times: + throughputs = [total_uploaded_mib / t for t in true_times] + true_min_throughput = min(throughputs) + true_max_throughput = max(throughputs) + true_mean_throughput = statistics.mean(throughputs) + true_median_throughput = statistics.median(throughputs) + + benchmark.extra_info["true_throughput_MiB_s_min"] = true_min_throughput + benchmark.extra_info["true_throughput_MiB_s_max"] = true_max_throughput + benchmark.extra_info["true_throughput_MiB_s_mean"] = true_mean_throughput + benchmark.extra_info["true_throughput_MiB_s_median"] = true_median_throughput + + print("\nThroughput Statistics from true_times (MiB/s):") + print(f" Min: {true_min_throughput:.2f}") + print(f" Max: {true_max_throughput:.2f}") + print(f" Mean: {true_mean_throughput:.2f}") + print(f" Median: {true_median_throughput:.2f}") + + # Get benchmark name, rounds, and iterations + name = benchmark.name + rounds = benchmark.stats['rounds'] + iterations = benchmark.stats['iterations'] + + # Header for throughput table + header = "\n\n" + "-" * 125 + "\n" + header += "Throughput Benchmark (MiB/s)\n" + header += "-" * 125 + "\n" + header += f"{'Name':<50} {'Min':>10} {'Max':>10} {'Mean':>10} {'StdDev':>10} {'Median':>10} {'Rounds':>8} {'Iterations':>12}\n" + header += "-" * 125 + + # Data row for throughput table + # The table headers (Min, Max) refer to the throughput values. + row = f"{name:<50} {min_throughput:>10.4f} {max_throughput:>10.4f} {mean_throughput:>10.4f} {'N/A':>10} {median_throughput:>10.4f} {rounds:>8} {iterations:>12}" + + print(header) + print(row) + print("-" * 125) + +class RandomBytesIO(io.RawIOBase): + """ + A file-like object that generates random bytes using os.urandom. + It enforces a fixed size and an upper safety cap. + """ + # 10 GiB default safety cap + DEFAULT_CAP = 10 * 1024 * 1024 * 1024 + + def __init__(self, size, max_size=DEFAULT_CAP): + """ + Args: + size (int): The exact size of the virtual file in bytes. + max_size (int): The maximum allowed size to prevent safety issues. + """ + if size is None: + raise ValueError("Size must be defined (cannot be infinite).") + + if size > max_size: + raise ValueError(f"Requested size {size} exceeds the maximum limit of {max_size} bytes (10 GiB).") + + self._size = size + self._pos = 0 + + def read(self, n=-1): + # 1. Handle "read all" (n=-1) + if n is None or n < 0: + n = self._size - self._pos + + # 2. Handle EOF (End of File) + if self._pos >= self._size: + return b"" + + # 3. Clamp read amount to remaining size + # This ensures we stop exactly at `size` bytes. + n = min(n, self._size - self._pos) + + # 4. Generate data + data = os.urandom(n) + self._pos += len(data) + return data + + def readable(self): + return True + + def seekable(self): + return True + + def tell(self): + return self._pos + + def seek(self, offset, whence=io.SEEK_SET): + if whence == io.SEEK_SET: + new_pos = offset + elif whence == io.SEEK_CUR: + new_pos = self._pos + offset + elif whence == io.SEEK_END: + new_pos = self._size + offset + else: + raise ValueError(f"Invalid whence: {whence}") + + # Clamp position to valid range [0, size] + self._pos = max(0, min(new_pos, self._size)) + return self._pos diff --git a/tests/perf/microbenchmarks/conftest.py b/tests/perf/microbenchmarks/conftest.py new file mode 100644 index 000000000..7637d2e2a --- /dev/null +++ b/tests/perf/microbenchmarks/conftest.py @@ -0,0 +1,144 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import contextlib +from typing import Any +from tests.perf.microbenchmarks.resource_monitor import ResourceMonitor +import pytest +from tests.system._helpers import delete_blob + +import asyncio +import multiprocessing +import os +import uuid +from google.cloud import storage +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient + +_OBJECT_NAME_PREFIX = "micro-benchmark" + + +@pytest.fixture(scope="function") +def blobs_to_delete(): + blobs_to_delete = [] + + yield blobs_to_delete + + for blob in blobs_to_delete: + delete_blob(blob) + + +@pytest.fixture(scope="session") +def storage_client(): + from google.cloud.storage import Client + + client = Client() + with contextlib.closing(client): + yield client + +@pytest.fixture +def monitor(): + """ + Provides the ResourceMonitor class. + Usage: with monitor() as m: ... + """ + return ResourceMonitor + +def publish_resource_metrics(benchmark: Any, monitor: ResourceMonitor) -> None: + """ + Helper function to publish resource monitor results to the extra_info property. + """ + benchmark.extra_info.update( + { + "cpu_max_global": f"{monitor.max_cpu:.2f}", + "mem_max": f"{monitor.max_mem:.2f}", + "net_throughput_mb_s": f"{monitor.throughput_mb_s:.2f}", + "vcpus": monitor.vcpus, + } + ) + + +async def upload_appendable_object(bucket_name, object_name, object_size, chunk_size): + # flush interval set to little over 1GiB to minimize number of flushes. + # this method is to write "appendable" objects which will be used for + # benchmarking reads, hence not concerned performance of writes here. + writer = AsyncAppendableObjectWriter( + AsyncGrpcClient().grpc_client, bucket_name, object_name, writer_options={"FLUSH_INTERVAL_BYTES": 1026 * 1024 ** 2} + ) + await writer.open() + uploaded_bytes = 0 + while uploaded_bytes < object_size: + bytes_to_upload = min(chunk_size, object_size - uploaded_bytes) + await writer.append(os.urandom(bytes_to_upload)) + uploaded_bytes += bytes_to_upload + object_metdata = await writer.close(finalize_on_close=True) + assert object_metdata.size == uploaded_bytes + return uploaded_bytes + + +def upload_simple_object(bucket_name, object_name, object_size, chunk_size): + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(object_name) + blob.chunk_size = chunk_size + data = os.urandom(object_size) + blob.upload_from_string(data) + return object_size + + +def _upload_worker(args): + bucket_name, object_name, object_size, chunk_size, bucket_type = args + if bucket_type == "zonal": + uploaded_bytes = asyncio.run( + upload_appendable_object(bucket_name, object_name, object_size, chunk_size) + ) + else: + uploaded_bytes = upload_simple_object(bucket_name, object_name, object_size, chunk_size) + return object_name, uploaded_bytes + + +def _create_files(num_files, bucket_name, bucket_type, object_size, chunk_size=1024 * 1024 * 1024): + """ + Create/Upload objects for benchmarking and return a list of their names. + """ + object_names = [ + f"{_OBJECT_NAME_PREFIX}-{uuid.uuid4().hex[:5]}" for _ in range(num_files) + ] + + args_list = [ + (bucket_name, object_names[i], object_size, chunk_size, bucket_type) + for i in range(num_files) + ] + + ctx = multiprocessing.get_context("spawn") + with ctx.Pool() as pool: + results = pool.map(_upload_worker, args_list) + + total_uploaded_bytes = sum(r[1] for r in results) + assert total_uploaded_bytes == object_size * num_files + + return [r[0] for r in results] + + +@pytest.fixture +def workload_params(request): + params = request.param + files_names = _create_files( + params.num_files, + params.bucket_name, + params.bucket_type, + params.file_size_bytes, + ) + return params, files_names \ No newline at end of file diff --git a/tests/perf/microbenchmarks/json_to_csv.py b/tests/perf/microbenchmarks/json_to_csv.py new file mode 100644 index 000000000..1ef58f907 --- /dev/null +++ b/tests/perf/microbenchmarks/json_to_csv.py @@ -0,0 +1,190 @@ +import json +import csv +import argparse +import logging +import numpy as np + +MB = 1024 * 1024 + + +def _process_benchmark_result(bench, headers, extra_info_headers, stats_headers): + """ + Process a single benchmark result and prepare it for CSV reporting. + + This function extracts relevant statistics and metadata from a benchmark + run, calculates derived metrics like percentiles and throughput, and + formats it as a dictionary. + + Args: + bench (dict): The dictionary for a single benchmark from the JSON output. + headers (list): The list of all header names for the CSV. + extra_info_headers (list): Headers from the 'extra_info' section. + stats_headers (list): Headers from the 'stats' section. + + """ + row = {h: "" for h in headers} + row["name"] = bench.get("name", "") + row["group"] = bench.get("group", "") + + extra_info = bench.get("extra_info", {}) + + # Populate extra_info and stats + for key in extra_info_headers: + row[key] = extra_info.get(key) + for key in stats_headers: + row[key] = bench.get("stats", {}).get(key) + + # Handle threads/coros mapping + if "threads" in row: + row["threads"] = extra_info.get("num_coros", extra_info.get("coros")) + + # Calculate percentiles + timings = bench.get("stats", {}).get("data") + if timings: + row["p90"] = np.percentile(timings, 90) + row["p95"] = np.percentile(timings, 95) + row["p99"] = np.percentile(timings, 99) + + # Calculate max throughput + file_size = extra_info.get("file_size_bytes", extra_info.get("file_size", 0)) + num_files = extra_info.get("num_files", 1) + total_bytes = file_size * num_files + + min_time = bench.get("stats", {}).get("min") + if min_time and min_time > 0: + row["max_throughput_mb_s"] = (total_bytes / min_time) / MB + else: + row["max_throughput_mb_s"] = 0.0 + + return row + + +def _generate_report(json_path, csv_path): + """Generate a CSV summary report from the pytest-benchmark JSON output. + + Args: + json_path (str): The path to the JSON file containing benchmark results. + csv_path (str): The path where the CSV report will be saved. + + Returns: + str: The path to the generated CSV report file. + + """ + logging.info(f"Generating CSV report from {json_path}") + + with open(json_path, "r") as f: + data = json.load(f) + + benchmarks = data.get("benchmarks", []) + if not benchmarks: + logging.warning("No benchmarks found in the JSON file.") + return + + # headers order - name group block_size bucket_name bucket_type chunk_size cpu_max_global file_size mem_max net_throughput_mb_s num_files pattern processes rounds threads vcpus min max mean median stddev p90 p95 p99 max_throughput_mb_s + # if there are any other column keep it at the afterwards. + ordered_headers = [ + "name", + "group", + "block_size", + "bucket_name", + "bucket_type", + "chunk_size", + "cpu_max_global", + "file_size", + "mem_max", + "net_throughput_mb_s", + "num_files", + "pattern", + "processes", + "rounds", + "threads", + "vcpus", + "min", + "max", + "mean", + "median", + "stddev", + "p90", + "p95", + "p99", + "max_throughput_mb_s", + ] + + # Gather all available headers from the data + all_available_headers = set(["name", "group"]) + stats_headers = ["min", "max", "mean", "median", "stddev"] + custom_headers = ["p90", "p95", "p99", "max_throughput_mb_s"] + + all_available_headers.update(stats_headers) + all_available_headers.update(custom_headers) + + extra_info_keys = set() + for bench in benchmarks: + if "extra_info" in bench and isinstance(bench["extra_info"], dict): + extra_info_keys.update(bench["extra_info"].keys()) + all_available_headers.update(extra_info_keys) + + # Construct the final header list + final_headers = list(ordered_headers) + + # Add any headers from the data that are not in the ordered list + for header in sorted(list(all_available_headers)): + if header not in final_headers: + final_headers.append(header) + + # We still need the full list of extra_info headers for _process_benchmark_result + extra_info_headers = sorted(list(extra_info_keys)) + + with open(csv_path, "w", newline="") as f: + writer = csv.writer(f) + writer.writerow(final_headers) + + for bench in benchmarks: + row = _process_benchmark_result( + bench, final_headers, extra_info_headers, stats_headers + ) + writer.writerow([row.get(h, "") for h in final_headers]) + + logging.info(f"CSV report generated at {csv_path}") + return csv_path + + +def main(): + """ + Converts a JSON benchmark file to a CSV file. + + The CSV file will contain the 'name' of each benchmark and all fields + from the 'extra_info' section. + """ + parser = argparse.ArgumentParser(description="Convert benchmark JSON to CSV.") + parser.add_argument( + "--input_file", + nargs="?", + default="output.json", + help="Path to the input JSON file (default: output.json)", + ) + parser.add_argument( + "--output_file", + nargs="?", + default="output.csv", + help="Path to the output CSV file (default: output.csv)", + ) + args = parser.parse_args() + + logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" + ) + + try: + _generate_report(args.input_file, args.output_file) + print(f"Successfully converted {args.input_file} to {args.output_file}") + except FileNotFoundError: + logging.error(f"Error: Input file not found at {args.input_file}") + except json.JSONDecodeError: + logging.error(f"Error: Could not decode JSON from {args.input_file}") + except Exception as e: + logging.error(f"An unexpected error occurred: {e}") + + +if __name__ == "__main__": + main() diff --git a/tests/perf/microbenchmarks/parameters.py b/tests/perf/microbenchmarks/parameters.py new file mode 100644 index 000000000..72b8476b6 --- /dev/null +++ b/tests/perf/microbenchmarks/parameters.py @@ -0,0 +1,28 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from dataclasses import dataclass + + +@dataclass +class IOBenchmarkParameters: + name: str + workload_name: str + bucket_name: str + bucket_type: str + num_coros: int + num_processes: int + num_files: int + rounds: int + chunk_size_bytes: int + file_size_bytes: int diff --git a/tests/perf/microbenchmarks/reads/__init__.py b/tests/perf/microbenchmarks/reads/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/perf/microbenchmarks/reads/config.py b/tests/perf/microbenchmarks/reads/config.py new file mode 100644 index 000000000..b9cfb1a92 --- /dev/null +++ b/tests/perf/microbenchmarks/reads/config.py @@ -0,0 +1,108 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import itertools +import os +from typing import Dict, List + +import yaml + +try: + from tests.perf.microbenchmarks.reads.parameters import ReadParameters +except ModuleNotFoundError: + from reads.parameters import ReadParameters + + +def _get_params() -> Dict[str, List[ReadParameters]]: + """Generates a dictionary of benchmark parameters for read operations. + + This function reads configuration from a `config.yaml` file, which defines + common parameters (like bucket types, file sizes) and different workloads. + It then generates all possible combinations of these parameters for each + workload using `itertools.product`. + + The resulting parameter sets are encapsulated in `ReadParameters` objects + and organized by workload name in the returned dictionary. + + Bucket names can be overridden by setting the `DEFAULT_RAPID_ZONAL_BUCKET` + and `DEFAULT_STANDARD_BUCKET` environment variables. + + Returns: + Dict[str, List[ReadParameters]]: A dictionary where keys are workload + names (e.g., 'read_seq', 'read_rand_multi_coros') and values are lists + of `ReadParameters` objects, each representing a unique benchmark scenario. + """ + params: Dict[str, List[ReadParameters]] = {} + config_path = os.path.join(os.path.dirname(__file__), "config.yaml") + with open(config_path, "r") as f: + config = yaml.safe_load(f) + + common_params = config["common"] + bucket_types = common_params["bucket_types"] + file_sizes_mib = common_params["file_sizes_mib"] + chunk_sizes_mib = common_params["chunk_sizes_mib"] + rounds = common_params["rounds"] + + bucket_map = { + "zonal": os.environ.get("DEFAULT_RAPID_ZONAL_BUCKET", config['defaults']['DEFAULT_RAPID_ZONAL_BUCKET']), + "regional": os.environ.get("DEFAULT_STANDARD_BUCKET", config['defaults']['DEFAULT_STANDARD_BUCKET']) + } + + for workload in config["workload"]: + workload_name = workload["name"] + params[workload_name] = [] + pattern = workload["pattern"] + processes = workload["processes"] + coros = workload["coros"] + + # Create a product of all parameter combinations + product = itertools.product( + bucket_types, + file_sizes_mib, + chunk_sizes_mib, + processes, + coros, + ) + + for ( + bucket_type, + file_size_mib, + chunk_size_mib, + num_processes, + num_coros, + ) in product: + file_size_bytes = file_size_mib * 1024 * 1024 + chunk_size_bytes = chunk_size_mib * 1024 * 1024 + bucket_name = bucket_map[bucket_type] + + num_files = num_processes * num_coros + + # Create a descriptive name for the parameter set + name = f"{pattern}_{bucket_type}_{num_processes}p_{num_coros}c" + + params[workload_name].append( + ReadParameters( + name=name, + workload_name=workload_name, + pattern=pattern, + bucket_name=bucket_name, + bucket_type=bucket_type, + num_coros=num_coros, + num_processes=num_processes, + num_files=num_files, + rounds=rounds, + chunk_size_bytes=chunk_size_bytes, + file_size_bytes=file_size_bytes, + ) + ) + return params diff --git a/tests/perf/microbenchmarks/reads/config.yaml b/tests/perf/microbenchmarks/reads/config.yaml new file mode 100644 index 000000000..25bfd92c8 --- /dev/null +++ b/tests/perf/microbenchmarks/reads/config.yaml @@ -0,0 +1,49 @@ +common: + bucket_types: + - "regional" + - "zonal" + file_sizes_mib: + - 1024 # 1GiB + chunk_sizes_mib: [100] + rounds: 10 + +workload: + + ############# single process single coroutine ######### + - name: "read_seq" + pattern: "seq" + coros: [1] + processes: [1] + + - name: "read_rand" + pattern: "rand" + coros: [1] + processes: [1] + + ############# single process multi coroutine ######### + + - name: "read_seq_multi_coros" + pattern: "seq" + coros: [2, 4, 8, 16] + processes: [1] + + - name: "read_rand_multi_coros" + pattern: "rand" + coros: [2, 4, 8, 16] + processes: [1] + + ############# multi process multi coroutine ######### + - name: "read_seq_multi_process" + pattern: "seq" + coros: [1, 2, 4] + processes: [2, 16, 48, 96] + + - name: "read_rand_multi_process" + pattern: "rand" + coros: [1, 2, 4] + processes: [2, 16, 48, 96] + + +defaults: + DEFAULT_RAPID_ZONAL_BUCKET: "chandrasiri-benchmarks-zb" + DEFAULT_STANDARD_BUCKET: "chandrasiri-benchmarks-rb" diff --git a/tests/perf/microbenchmarks/reads/parameters.py b/tests/perf/microbenchmarks/reads/parameters.py new file mode 100644 index 000000000..0785a4147 --- /dev/null +++ b/tests/perf/microbenchmarks/reads/parameters.py @@ -0,0 +1,20 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from dataclasses import dataclass +from ..parameters import IOBenchmarkParameters + + +@dataclass +class ReadParameters(IOBenchmarkParameters): + pattern: str diff --git a/tests/perf/microbenchmarks/reads/test_reads.py b/tests/perf/microbenchmarks/reads/test_reads.py new file mode 100644 index 000000000..81f180d75 --- /dev/null +++ b/tests/perf/microbenchmarks/reads/test_reads.py @@ -0,0 +1,415 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Microbenchmarks for Google Cloud Storage read operations. + +This module contains performance benchmarks for various read patterns from Google Cloud Storage. +It includes three main test functions: +- `test_downloads_single_proc_single_coro`: Benchmarks reads using a single process and a single coroutine. +- `test_downloads_single_proc_multi_coro`: Benchmarks reads using a single process and multiple coroutines. +- `test_downloads_multi_proc_multi_coro`: Benchmarks reads using multiple processes and multiple coroutines. + +All other functions in this module are helper methods for these three tests. +""" + +import time +import asyncio +import random +from io import BytesIO +import logging + +import pytest + +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) +from tests.perf.microbenchmarks._utils import publish_benchmark_extra_info +from tests.perf.microbenchmarks.conftest import ( + publish_resource_metrics, +) +import tests.perf.microbenchmarks.reads.config as config +from concurrent.futures import ThreadPoolExecutor +import multiprocessing + +all_params = config._get_params() + + +async def create_client(): + """Initializes async client and gets the current event loop.""" + return AsyncGrpcClient().grpc_client + + +async def download_chunks_using_mrd_async(client, filename, other_params, chunks): + # start timer. + start_time = time.monotonic_ns() + + total_bytes_downloaded = 0 + mrd = AsyncMultiRangeDownloader(client, other_params.bucket_name, filename) + await mrd.open() + for offset, size in chunks: + buffer = BytesIO() + await mrd.download_ranges([(offset, size, buffer)]) + total_bytes_downloaded += buffer.tell() + await mrd.close() + + assert total_bytes_downloaded == other_params.file_size_bytes + + # end timer. + end_time = time.monotonic_ns() + elapsed_time = end_time - start_time + return elapsed_time / 1_000_000_000 + + +def download_chunks_using_mrd(loop, client, filename, other_params, chunks): + return loop.run_until_complete( + download_chunks_using_mrd_async(client, filename, other_params, chunks) + ) + + +def download_chunks_using_json(_, json_client, filename, other_params, chunks): + bucket = json_client.bucket(other_params.bucket_name) + blob = bucket.blob(filename) + start_time = time.monotonic_ns() + for offset, size in chunks: + _ = blob.download_as_bytes(start=offset, end=offset + size - 1) + return (time.monotonic_ns() - start_time) / 1_000_000_000 + + +@pytest.mark.parametrize( + "workload_params", + all_params["read_rand"] + all_params["read_seq"], + indirect=True, + ids=lambda p: p.name, +) +def test_downloads_single_proc_single_coro( + benchmark, storage_client, blobs_to_delete, monitor, workload_params +): + """ + Benchmarks reads using a single process and a single coroutine. + It creates chunks based on object size and chunk_size, then passes them to either + `download_chunks_using_mrd` (for zonal buckets) or `download_chunks_using_json` (for regional buckets) + for benchmarking using `benchmark.pedantic`. + """ + params, files_names = workload_params + + object_size = params.file_size_bytes + chunk_size = params.chunk_size_bytes + chunks = [] + for offset in range(0, object_size, chunk_size): + size = min(chunk_size, object_size - offset) + chunks.append((offset, size)) + + if params.pattern == "rand": + logging.info("randomizing chunks") + random.shuffle(chunks) + + if params.bucket_type == "zonal": + logging.info("bucket type zonal") + target_func = download_chunks_using_mrd + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + client = loop.run_until_complete(create_client()) + else: + logging.info("bucket type regional") + target_func = download_chunks_using_json + loop = None + client = storage_client + + output_times = [] + + def target_wrapper(*args, **kwargs): + result = target_func(*args, **kwargs) + output_times.append(result) + return output_times + + try: + with monitor() as m: + output_times = benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=( + loop, + client, + files_names[0], + params, + chunks, + ), + ) + finally: + if loop is not None: + tasks = asyncio.all_tasks(loop=loop) + for task in tasks: + task.cancel() + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + loop.close() + publish_benchmark_extra_info(benchmark, params, true_times=output_times) + publish_resource_metrics(benchmark, m) + + blobs_to_delete.extend( + storage_client.bucket(params.bucket_name).blob(f) for f in files_names + ) + + +def download_files_using_mrd_multi_coro(loop, client, files, other_params, chunks): + """ + Downloads multiple files concurrently using AsyncMultiRangeDownloader (MRD) with asyncio. + + For each file, it creates a coroutine to download its chunks using `download_chunks_using_mrd_async`. + All coroutines are then executed concurrently using `asyncio.gather`. + The function returns the maximum latency observed among all coroutines. + + Args: + loop: The asyncio event loop. + client: The AsyncGrpcClient instance. + files (list): A list of filenames to download. + other_params: An object containing benchmark parameters (e.g., bucket_name, file_size_bytes). + chunks (list): A list of (offset, size) tuples representing the parts of each file to download. + + Returns: + float: The maximum latency (in seconds) among all coroutines. + """ + async def main(): + if len(files) == 1: + result = await download_chunks_using_mrd_async( + client, files[0], other_params, chunks + ) + return [result] + else: + tasks = [] + for f in files: + tasks.append( + download_chunks_using_mrd_async(client, f, other_params, chunks) + ) + return await asyncio.gather(*tasks) + + results = loop.run_until_complete(main()) + return max(results) + + +def download_files_using_json_multi_threaded( + _, json_client, files, other_params, chunks +): + """ + Downloads multiple files concurrently using the JSON API with a ThreadPoolExecutor. + + For each file, it submits a task to a `ThreadPoolExecutor` to download its chunks + using `download_chunks_using_json`. The number of concurrent downloads is + determined by `other_params.num_coros` (which acts as `max_workers`). + The function returns the maximum latency among all concurrent downloads. + + The `chunks` parameter is a list of (offset, size) tuples representing + the parts of each file to download. + """ + results = [] + # In the context of multi-coro, num_coros is the number of files to download concurrently. + # So we can use it as max_workers for the thread pool. + with ThreadPoolExecutor(max_workers=other_params.num_coros) as executor: + futures = [] + for f in files: + future = executor.submit( + download_chunks_using_json, None, json_client, f, other_params, chunks + ) + futures.append(future) + + for future in futures: + results.append(future.result()) + + return max(results) + + +@pytest.mark.parametrize( + "workload_params", + all_params["read_seq_multi_coros"] + all_params["read_rand_multi_coros"], + indirect=True, + ids=lambda p: p.name, +) +def test_downloads_single_proc_multi_coro( + benchmark, storage_client, blobs_to_delete, monitor, workload_params +): + params, files_names = workload_params + + object_size = params.file_size_bytes + chunk_size = params.chunk_size_bytes + chunks = [] + for offset in range(0, object_size, chunk_size): + size = min(chunk_size, object_size - offset) + chunks.append((offset, size)) + + if params.pattern == "rand": + logging.info("randomizing chunks") + random.shuffle(chunks) + + if params.bucket_type == "zonal": + logging.info("bucket type zonal") + target_func = download_files_using_mrd_multi_coro + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + client = loop.run_until_complete(create_client()) + else: + logging.info("bucket type regional") + target_func = download_files_using_json_multi_threaded + loop = None + client = storage_client + + output_times = [] + + def target_wrapper(*args, **kwargs): + result = target_func(*args, **kwargs) + output_times.append(result) + return output_times + + try: + with monitor() as m: + output_times = benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=( + loop, + client, + files_names, + params, + chunks, + ), + ) + finally: + if loop is not None: + tasks = asyncio.all_tasks(loop=loop) + for task in tasks: + task.cancel() + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + loop.close() + publish_benchmark_extra_info(benchmark, params, true_times=output_times) + publish_resource_metrics(benchmark, m) + + blobs_to_delete.extend( + storage_client.bucket(params.bucket_name).blob(f) for f in files_names + ) + + +def _download_files_worker(files_to_download, other_params, chunks, bucket_type): + # For regional buckets, a new client must be created for each process. + # For zonal, the same is done for consistency. + if bucket_type == "zonal": + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + client = loop.run_until_complete(create_client()) + try: + # download_files_using_mrd_multi_coro returns max latency of coros + result = download_files_using_mrd_multi_coro( + loop, client, files_to_download, other_params, chunks + ) + finally: + tasks = asyncio.all_tasks(loop=loop) + for task in tasks: + task.cancel() + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + loop.close() + return result + else: # regional + from google.cloud import storage + + json_client = storage.Client() + # download_files_using_json_multi_threaded returns max latency of threads + return download_files_using_json_multi_threaded( + None, json_client, files_to_download, other_params, chunks + ) + + +def download_files_mp_mc_wrapper(files_names, params, chunks, bucket_type): + num_processes = params.num_processes + num_coros = params.num_coros # This is n, number of files per process + + # Distribute filenames to processes + filenames_per_process = [ + files_names[i : i + num_coros] for i in range(0, len(files_names), num_coros) + ] + + args = [ + ( + filenames, + params, + chunks, + bucket_type, + ) + for filenames in filenames_per_process + ] + + ctx = multiprocessing.get_context("spawn") + with ctx.Pool(processes=num_processes) as pool: + results = pool.starmap(_download_files_worker, args) + + return max(results) + + +@pytest.mark.parametrize( + "workload_params", + all_params["read_seq_multi_process"] + + all_params["read_rand_multi_process"], + indirect=True, + ids=lambda p: p.name, +) +def test_downloads_multi_proc_multi_coro( + benchmark, storage_client, blobs_to_delete, monitor, workload_params +): + """ + Benchmarks reads using multiple processes and multiple coroutines. + + This test distributes `m*n` files among `m` processes, where each process + downloads `n` files concurrently using `n` coroutines. The processes are spawned + in "spawn" mode. The reported latency for each round is the maximum latency + observed across all processes. + """ + params, files_names = workload_params + logging.info(f"num files: {len(files_names)}") + + object_size = params.file_size_bytes + chunk_size = params.chunk_size_bytes + chunks = [] + for offset in range(0, object_size, chunk_size): + size = min(chunk_size, object_size - offset) + chunks.append((offset, size)) + + if params.pattern == "rand": + logging.info("randomizing chunks") + random.shuffle(chunks) + + output_times = [] + + def target_wrapper(*args, **kwargs): + result = download_files_mp_mc_wrapper(*args, **kwargs) + output_times.append(result) + return output_times + + try: + with monitor() as m: + output_times = benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=( + files_names, + params, + chunks, + params.bucket_type, + ), + ) + finally: + publish_benchmark_extra_info(benchmark, params, true_times=output_times) + publish_resource_metrics(benchmark, m) + + blobs_to_delete.extend( + storage_client.bucket(params.bucket_name).blob(f) for f in files_names + ) \ No newline at end of file diff --git a/tests/perf/microbenchmarks/resource_monitor.py b/tests/perf/microbenchmarks/resource_monitor.py new file mode 100644 index 000000000..be6ae7025 --- /dev/null +++ b/tests/perf/microbenchmarks/resource_monitor.py @@ -0,0 +1,99 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import threading +import time + +import psutil + + +class ResourceMonitor: + def __init__(self): + self.interval = 1.0 + + self.vcpus = psutil.cpu_count() or 1 + self.max_cpu = 0.0 + self.max_mem = 0.0 + + # Network and Time tracking + self.start_time = 0.0 + self.duration = 0.0 + self.start_net = None + self.net_sent_mb = 0.0 + self.net_recv_mb = 0.0 + + self._stop_event = threading.Event() + self._thread = None + + def __enter__(self): + self.start_net = psutil.net_io_counters() + self.start_time = time.perf_counter() + self.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.stop() + self.duration = time.perf_counter() - self.start_time + end_net = psutil.net_io_counters() + + self.net_sent_mb = (end_net.bytes_sent - self.start_net.bytes_sent) / ( + 1024 * 1024 + ) + self.net_recv_mb = (end_net.bytes_recv - self.start_net.bytes_recv) / ( + 1024 * 1024 + ) + + def _monitor(self): + psutil.cpu_percent(interval=None) + current_process = psutil.Process() + while not self._stop_event.is_set(): + try: + # CPU and Memory tracking for current process tree + total_cpu = current_process.cpu_percent(interval=None) + current_mem = current_process.memory_info().rss + for child in current_process.children(recursive=True): + try: + total_cpu += child.cpu_percent(interval=None) + current_mem += child.memory_info().rss + except (psutil.NoSuchProcess, psutil.AccessDenied): + continue + + # Normalize CPU by number of vcpus + global_cpu = total_cpu / self.vcpus + + mem = current_mem + + if global_cpu > self.max_cpu: + self.max_cpu = global_cpu + if mem > self.max_mem: + self.max_mem = mem + except psutil.NoSuchProcess: + pass + + time.sleep(self.interval) + + def start(self): + self._thread = threading.Thread(target=self._monitor, daemon=True) + self._thread.start() + + def stop(self): + self._stop_event.set() + if self._thread: + self._thread.join() + + @property + def throughput_mb_s(self): + """Calculates combined network throughput.""" + if self.duration <= 0: + return 0.0 + return (self.net_sent_mb + self.net_recv_mb) / self.duration \ No newline at end of file From dbe9d8b89d975dfbed8c830a5687ccfafea51d5f Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 21 Jan 2026 21:04:18 +0530 Subject: [PATCH 466/509] feat: Add micro-benchmarks for writes comparing standard (regional) vs rapid (zonal) buckets. (#1707) * Add performance microbenchmarking suite for Writes * This compares Regional (Standard Storage) with Zonal (Rapid Storage) buckets. * Regional uses JSON wheres Zonal uses gRPC bidi --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- tests/perf/microbenchmarks/README.md | 5 +- tests/perf/microbenchmarks/conftest.py | 19 +- tests/perf/microbenchmarks/writes/__init__.py | 0 tests/perf/microbenchmarks/writes/config.py | 100 +++++ tests/perf/microbenchmarks/writes/config.yaml | 34 ++ .../perf/microbenchmarks/writes/parameters.py | 20 + .../microbenchmarks/writes/test_writes.py | 414 ++++++++++++++++++ 7 files changed, 585 insertions(+), 7 deletions(-) create mode 100644 tests/perf/microbenchmarks/writes/__init__.py create mode 100644 tests/perf/microbenchmarks/writes/config.py create mode 100644 tests/perf/microbenchmarks/writes/config.yaml create mode 100644 tests/perf/microbenchmarks/writes/parameters.py create mode 100644 tests/perf/microbenchmarks/writes/test_writes.py diff --git a/tests/perf/microbenchmarks/README.md b/tests/perf/microbenchmarks/README.md index 0219a5bd9..a3e045682 100644 --- a/tests/perf/microbenchmarks/README.md +++ b/tests/perf/microbenchmarks/README.md @@ -15,10 +15,13 @@ pytest --benchmark-json=output.json -vv -s tests/perf/microbenchmarks/reads/test To run a single test, append `::` followed by the test name to the file path. -Example: +Examples: ```bash pytest --benchmark-json=output.json -vv -s tests/perf/microbenchmarks/reads/test_reads.py::test_downloads_single_proc_single_coro ``` +```bash +pytest --benchmark-json=output.json -vv -s tests/perf/microbenchmarks/writes/test_writes.py::test_uploads_single_proc_single_coro +``` ## Configuration diff --git a/tests/perf/microbenchmarks/conftest.py b/tests/perf/microbenchmarks/conftest.py index 7637d2e2a..f66f9bf6c 100644 --- a/tests/perf/microbenchmarks/conftest.py +++ b/tests/perf/microbenchmarks/conftest.py @@ -26,6 +26,7 @@ AsyncAppendableObjectWriter, ) from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from tests.perf.microbenchmarks.writes.parameters import WriteParameters _OBJECT_NAME_PREFIX = "micro-benchmark" @@ -135,10 +136,16 @@ def _create_files(num_files, bucket_name, bucket_type, object_size, chunk_size=1 @pytest.fixture def workload_params(request): params = request.param - files_names = _create_files( - params.num_files, - params.bucket_name, - params.bucket_type, - params.file_size_bytes, - ) + if isinstance(params, WriteParameters): + files_names = [ + f"{_OBJECT_NAME_PREFIX}-{uuid.uuid4().hex[:5]}" + for _ in range(params.num_files) + ] + else: + files_names = _create_files( + params.num_files, + params.bucket_name, + params.bucket_type, + params.file_size_bytes, + ) return params, files_names \ No newline at end of file diff --git a/tests/perf/microbenchmarks/writes/__init__.py b/tests/perf/microbenchmarks/writes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/perf/microbenchmarks/writes/config.py b/tests/perf/microbenchmarks/writes/config.py new file mode 100644 index 000000000..bc1548511 --- /dev/null +++ b/tests/perf/microbenchmarks/writes/config.py @@ -0,0 +1,100 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import itertools +import os +from typing import Dict, List + +import yaml + +try: + from tests.perf.microbenchmarks.writes.parameters import WriteParameters +except ModuleNotFoundError: + from parameters import WriteParameters + + +def get_write_params() -> Dict[str, List[WriteParameters]]: + """Generates benchmark parameters from a YAML configuration file. + + This function reads the configuration from `config.yaml`, located in the + same directory, and generates all possible combinations of write parameters + based on the defined workloads. It uses `itertools.product` to create + a Cartesian product of parameters like bucket types, file sizes, etc. + + Returns: + Dict[str, List[WriteParameters]]: A dictionary where keys are workload + names and values are lists of `WriteParameters` instances for that + workload. + """ + params: Dict[str, List[WriteParameters]] = {} + config_path = os.path.join(os.path.dirname(__file__), "config.yaml") + with open(config_path, "r") as f: + config = yaml.safe_load(f) + + common_params = config["common"] + bucket_types = common_params["bucket_types"] + file_sizes_mib = common_params["file_sizes_mib"] + chunk_sizes_mib = common_params["chunk_sizes_mib"] + rounds = common_params["rounds"] + + bucket_map = { + "zonal": os.environ.get("DEFAULT_RAPID_ZONAL_BUCKET", config['defaults']['DEFAULT_RAPID_ZONAL_BUCKET']), + "regional": os.environ.get("DEFAULT_STANDARD_BUCKET", config['defaults']['DEFAULT_STANDARD_BUCKET']) + } + + for workload in config["workload"]: + workload_name = workload["name"] + params[workload_name] = [] + processes = workload["processes"] + coros = workload["coros"] + + # Create a product of all parameter combinations + product = itertools.product( + bucket_types, + file_sizes_mib, + chunk_sizes_mib, + processes, + coros, + ) + + for ( + bucket_type, + file_size_mib, + chunk_size_mib, + num_processes, + num_coros, + ) in product: + file_size_bytes = file_size_mib * 1024 * 1024 + chunk_size_bytes = chunk_size_mib * 1024 * 1024 + bucket_name = bucket_map[bucket_type] + + num_files = num_processes * num_coros + + # Create a descriptive name for the parameter set + name = f"{workload_name}_{bucket_type}_{num_processes}p_{num_coros}c" + + params[workload_name].append( + WriteParameters( + name=name, + workload_name=workload_name, + bucket_name=bucket_name, + bucket_type=bucket_type, + num_coros=num_coros, + num_processes=num_processes, + num_files=num_files, + rounds=rounds, + chunk_size_bytes=chunk_size_bytes, + file_size_bytes=file_size_bytes, + ) + ) + return params diff --git a/tests/perf/microbenchmarks/writes/config.yaml b/tests/perf/microbenchmarks/writes/config.yaml new file mode 100644 index 000000000..b4d93ba52 --- /dev/null +++ b/tests/perf/microbenchmarks/writes/config.yaml @@ -0,0 +1,34 @@ +common: + bucket_types: + - "regional" + - "zonal" + file_sizes_mib: + - 1024 # 1GiB + chunk_sizes_mib: [100] + rounds: 10 + +workload: + + ############# single proc single coroutines ######### + - name: "write_seq" + pattern: "seq" + coros: [1] + processes: [1] + + ############# single proc multiple coroutines ######### + + - name: "write_seq_multi_coros" + pattern: "seq" + coros: [2, 4, 8, 16] + processes: [1] + + ############# multiple proc multiple coroutines ######### + - name: "write_seq_multi_process" + pattern: "seq" + coros: [1, 2] + processes: [8, 16, 32, 64] + + +defaults: + DEFAULT_RAPID_ZONAL_BUCKET: "chandrasiri-benchmarks-zb" + DEFAULT_STANDARD_BUCKET: "chandrasiri-benchmarks-rb" diff --git a/tests/perf/microbenchmarks/writes/parameters.py b/tests/perf/microbenchmarks/writes/parameters.py new file mode 100644 index 000000000..8d44b93dc --- /dev/null +++ b/tests/perf/microbenchmarks/writes/parameters.py @@ -0,0 +1,20 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from dataclasses import dataclass +from ..parameters import IOBenchmarkParameters + + +@dataclass +class WriteParameters(IOBenchmarkParameters): + pass diff --git a/tests/perf/microbenchmarks/writes/test_writes.py b/tests/perf/microbenchmarks/writes/test_writes.py new file mode 100644 index 000000000..2b3c57abd --- /dev/null +++ b/tests/perf/microbenchmarks/writes/test_writes.py @@ -0,0 +1,414 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Microbenchmarks for Google Cloud Storage write operations. + +This module contains performance benchmarks for various write patterns to Google Cloud Storage. +It includes three main test functions: +- `test_uploads_single_proc_single_coro`: Benchmarks uploads using a single process and a single coroutine. +- `test_uploads_single_proc_multi_coro`: Benchmarks uploads using a single process and multiple coroutines. +- `test_uploads_multi_proc_multi_coro`: Benchmarks uploads using multiple processes and multiple coroutines. + +All other functions in this module are helper methods for these three tests. +""" + +import os +import time +import asyncio +from concurrent.futures import ThreadPoolExecutor +import multiprocessing +import logging + +import pytest +from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import AsyncAppendableObjectWriter + +from tests.perf.microbenchmarks._utils import publish_benchmark_extra_info, RandomBytesIO +from tests.perf.microbenchmarks.conftest import publish_resource_metrics +import tests.perf.microbenchmarks.writes.config as config +from google.cloud import storage + +# Get write parameters +all_params = config.get_write_params() + +async def create_client(): + """Initializes async client and gets the current event loop.""" + return AsyncGrpcClient().grpc_client + +async def upload_chunks_using_grpc_async(client, filename, other_params): + """Uploads a file in chunks using the gRPC API asynchronously. + + Args: + client: The async gRPC client. + filename (str): The name of the object to create. + other_params: An object containing benchmark parameters like bucket_name, + file_size_bytes, and chunk_size_bytes. + + Returns: + float: The total time taken for the upload in seconds. + """ + start_time = time.monotonic_ns() + + writer = AsyncAppendableObjectWriter( + client=client, bucket_name=other_params.bucket_name, object_name=filename + ) + await writer.open() + + uploaded_bytes = 0 + upload_size = other_params.file_size_bytes + chunk_size = other_params.chunk_size_bytes + + while uploaded_bytes < upload_size: + bytes_to_upload = min(chunk_size, upload_size - uploaded_bytes) + data = os.urandom(bytes_to_upload) + await writer.append(data) + uploaded_bytes += bytes_to_upload + await writer.close() + + assert uploaded_bytes == upload_size + + end_time = time.monotonic_ns() + elapsed_time = end_time - start_time + return elapsed_time / 1_000_000_000 + +def upload_chunks_using_grpc(loop, client, filename, other_params): + """Wrapper to run the async gRPC upload in a synchronous context. + + Args: + loop: The asyncio event loop. + client: The async gRPC client. + filename (str): The name of the object to create. + other_params: An object containing benchmark parameters. + + Returns: + float: The total time taken for the upload in seconds. + """ + return loop.run_until_complete( + upload_chunks_using_grpc_async(client, filename, other_params) + ) + +def upload_using_json(_, json_client, filename, other_params): + """Uploads a file using the JSON API. + + Args: + _ (any): Unused. + json_client: The standard Python Storage client. + filename (str): The name of the object to create. + other_params: An object containing benchmark parameters like bucket_name + and file_size_bytes. + + Returns: + float: The total time taken for the upload in seconds. + """ + start_time = time.monotonic_ns() + + bucket = json_client.bucket(other_params.bucket_name) + blob = bucket.blob(filename) + upload_size = other_params.file_size_bytes + # Don't use BytesIO because it'll report high memory usage for large files. + # `RandomBytesIO` generates random bytes on the fly. + in_mem_file = RandomBytesIO(upload_size) + blob.upload_from_file(in_mem_file) + + end_time = time.monotonic_ns() + elapsed_time = end_time - start_time + return elapsed_time / 1_000_000_000 + +@pytest.mark.parametrize( + "workload_params", + all_params["write_seq"], + indirect=True, + ids=lambda p: p.name, +) +def test_uploads_single_proc_single_coro( + benchmark, storage_client, blobs_to_delete, monitor, workload_params +): + """ + Benchmarks uploads using a single process and a single coroutine. + It passes the workload to either `upload_chunks_using_grpc` (for zonal buckets) + or `upload_using_json` (for regional buckets) for benchmarking using `benchmark.pedantic`. + """ + params, files_names = workload_params + + if params.bucket_type == "zonal": + logging.info("bucket type zonal") + target_func = upload_chunks_using_grpc + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + client = loop.run_until_complete(create_client()) + else: + logging.info("bucket type regional") + target_func = upload_using_json + loop = None + client = storage_client + + output_times = [] + + def target_wrapper(*args, **kwargs): + result = target_func(*args, **kwargs) + output_times.append(result) + return output_times + + try: + with monitor() as m: + output_times = benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=( + loop, + client, + files_names[0], + params, + ), + ) + finally: + if loop is not None: + tasks = asyncio.all_tasks(loop=loop) + for task in tasks: + task.cancel() + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + loop.close() + publish_benchmark_extra_info(benchmark, params, benchmark_group="write", true_times=output_times) + publish_resource_metrics(benchmark, m) + + blobs_to_delete.extend( + storage_client.bucket(params.bucket_name).blob(f) for f in files_names + ) + +def upload_files_using_grpc_multi_coro(loop, client, files, other_params): + """Uploads multiple files concurrently using gRPC with asyncio. + + Args: + loop: The asyncio event loop. + client: The async gRPC client. + files (list): A list of filenames to upload. + other_params: An object containing benchmark parameters. + + Returns: + float: The maximum latency observed among all coroutines. + """ + async def main(): + tasks = [] + for f in files: + tasks.append( + upload_chunks_using_grpc_async(client, f, other_params) + ) + return await asyncio.gather(*tasks) + + results = loop.run_until_complete(main()) + return max(results) + +def upload_files_using_json_multi_threaded(_, json_client, files, other_params): + """Uploads multiple files concurrently using the JSON API with a ThreadPoolExecutor. + + Args: + _ (any): Unused. + json_client: The standard Python Storage client. + files (list): A list of filenames to upload. + other_params: An object containing benchmark parameters. + + Returns: + float: The maximum latency observed among all concurrent uploads. + """ + results = [] + with ThreadPoolExecutor(max_workers=other_params.num_coros) as executor: + futures = [] + for f in files: + future = executor.submit( + upload_using_json, None, json_client, f, other_params + ) + futures.append(future) + + for future in futures: + results.append(future.result()) + + return max(results) + +@pytest.mark.parametrize( + "workload_params", + all_params["write_seq_multi_coros"], + indirect=True, + ids=lambda p: p.name, +) +def test_uploads_single_proc_multi_coro( + benchmark, storage_client, blobs_to_delete, monitor, workload_params +): + """ + Benchmarks uploads using a single process and multiple coroutines. + + For zonal buckets, it uses `upload_files_using_grpc_multi_coro` to upload + multiple files concurrently with asyncio. For regional buckets, it uses + `upload_files_using_json_multi_threaded` with a ThreadPoolExecutor. + """ + params, files_names = workload_params + + if params.bucket_type == "zonal": + logging.info("bucket type zonal") + target_func = upload_files_using_grpc_multi_coro + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + client = loop.run_until_complete(create_client()) + else: + logging.info("bucket type regional") + target_func = upload_files_using_json_multi_threaded + loop = None + client = storage_client + + output_times = [] + + def target_wrapper(*args, **kwargs): + result = target_func(*args, **kwargs) + output_times.append(result) + return output_times + + try: + with monitor() as m: + output_times = benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=( + loop, + client, + files_names, + params, + ), + ) + finally: + if loop is not None: + tasks = asyncio.all_tasks(loop=loop) + for task in tasks: + task.cancel() + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + loop.close() + publish_benchmark_extra_info(benchmark, params, benchmark_group="write", true_times=output_times) + publish_resource_metrics(benchmark, m) + + blobs_to_delete.extend( + storage_client.bucket(params.bucket_name).blob(f) for f in files_names + ) + +def _upload_files_worker(files_to_upload, other_params, bucket_type): + """A worker function for multi-processing uploads. + + Initializes a client and calls the appropriate multi-coroutine upload function. + This function is intended to be called in a separate process. + + Args: + files_to_upload (list): List of filenames for this worker to upload. + other_params: An object containing benchmark parameters. + bucket_type (str): The type of bucket ('zonal' or 'regional'). + + Returns: + float: The maximum latency from the uploads performed by this worker. + """ + if bucket_type == "zonal": + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + client = loop.run_until_complete(create_client()) + try: + result = upload_files_using_grpc_multi_coro( + loop, client, files_to_upload, other_params + ) + finally: + # cleanup loop + tasks = asyncio.all_tasks(loop=loop) + for task in tasks: + task.cancel() + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + loop.close() + return result + else: # regional + + json_client = storage.Client() + return upload_files_using_json_multi_threaded( + None, json_client, files_to_upload, other_params + ) + +def upload_files_mp_mc_wrapper(files_names, params): + """Wrapper for multi-process, multi-coroutine uploads. + + Distributes files among a pool of processes and calls the worker function. + + Args: + files_names (list): The full list of filenames to upload. + params: An object containing benchmark parameters (num_processes, num_coros). + + Returns: + float: The maximum latency observed across all processes. + """ + num_processes = params.num_processes + num_coros = params.num_coros + + filenames_per_process = [ + files_names[i : i + num_coros] for i in range(0, len(files_names), num_coros) + ] + + args = [ + ( + filenames, + params, + params.bucket_type, + ) + for filenames in filenames_per_process + ] + + ctx = multiprocessing.get_context("spawn") + with ctx.Pool(processes=num_processes) as pool: + results = pool.starmap(_upload_files_worker, args) + + return max(results) + +@pytest.mark.parametrize( + "workload_params", + all_params["write_seq_multi_process"], + indirect=True, + ids=lambda p: p.name, +) +def test_uploads_multi_proc_multi_coro( + benchmark, storage_client, blobs_to_delete, monitor, workload_params +): + """ + Benchmarks uploads using multiple processes and multiple coroutines. + + This test distributes files among a pool of processes using `upload_files_mp_mc_wrapper`. + The reported latency for each round is the maximum latency observed across all processes. + """ + params, files_names = workload_params + + output_times = [] + + def target_wrapper(*args, **kwargs): + result = upload_files_mp_mc_wrapper(*args, **kwargs) + output_times.append(result) + return output_times + + try: + with monitor() as m: + output_times = benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=( + files_names, + params, + ), + ) + finally: + publish_benchmark_extra_info(benchmark, params, benchmark_group="write", true_times=output_times) + publish_resource_metrics(benchmark, m) + + blobs_to_delete.extend( + storage_client.bucket(params.bucket_name).blob(f) for f in files_names + ) \ No newline at end of file From f751f1e8ff4b9b737edb310ca9e21985675cba3f Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 22 Jan 2026 11:29:02 +0530 Subject: [PATCH 467/509] refactor: move system tests to single event loop (#1714) refactor: move system tests to single event loop. * Without this more adding more tests were "shaky" , some of them crashed due to segmentation fault in underlying gRPC's c layer. --- tests/system/test_zonal.py | 692 +++++++++++++++++++++---------------- 1 file changed, 390 insertions(+), 302 deletions(-) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index b5942365a..b5291ca08 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -2,6 +2,7 @@ import os import uuid from io import BytesIO +import asyncio # python additional imports import google_crc32c @@ -33,12 +34,55 @@ _BYTES_TO_UPLOAD = b"dummy_bytes_to_write_read_and_delete_appendable_object" +async def create_async_grpc_client(attempt_direct_path=True): + """Initializes async client and gets the current event loop.""" + return AsyncGrpcClient(attempt_direct_path=attempt_direct_path).grpc_client + + +@pytest.fixture(scope="session") +def event_loop(): + """Redefine pytest-asyncio's event_loop fixture to be session-scoped.""" + loop = asyncio.new_event_loop() + yield loop + loop.close() + + +@pytest.fixture(scope="session") +def grpc_clients(event_loop): + + # grpc clients has to be instantiated in the event loop, + # otherwise grpc creates it's own event loop and attaches to the client. + # Which will lead to deadlock because client running in one event loop and + # MRD or Appendable-Writer in another. + # https://github.com/grpc/grpc/blob/61fe9b40a986792ab7d4eb8924027b671faf26ba/src/python/grpcio/grpc/aio/_channel.py#L369 + # https://github.com/grpc/grpc/blob/61fe9b40a986792ab7d4eb8924027b671faf26ba/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi#L249 + clients = { + True: event_loop.run_until_complete( + create_async_grpc_client(attempt_direct_path=True) + ), + False: event_loop.run_until_complete( + create_async_grpc_client(attempt_direct_path=False) + ), + } + return clients + + +# This fixture is for tests that are NOT parametrized by attempt_direct_path +@pytest.fixture +def grpc_client(grpc_clients): + return grpc_clients[False] + + +@pytest.fixture +def grpc_client_direct(grpc_clients): + return grpc_clients[True] + + def _get_equal_dist(a: int, b: int) -> tuple[int, int]: step = (b - a) // 3 return a + step, a + 2 * step -@pytest.mark.asyncio @pytest.mark.parametrize( "object_size", [ @@ -51,47 +95,46 @@ def _get_equal_dist(a: int, b: int) -> tuple[int, int]: "attempt_direct_path", [True, False], ) -async def test_basic_wrd( - storage_client, blobs_to_delete, attempt_direct_path, object_size +def test_basic_wrd( + storage_client, + blobs_to_delete, + attempt_direct_path, + object_size, + event_loop, + grpc_clients, ): object_name = f"test_basic_wrd-{str(uuid.uuid4())}" - # Client instantiation; it cannot be part of fixture because. - # grpc_client's event loop and event loop of coroutine running it - # (i.e. this test) must be same. - # Note: - # 1. @pytest.mark.asyncio ensures new event loop for each test. - # 2. we can keep the same event loop for entire module but that may - # create issues if tests are run in parallel and one test hogs the event - # loop slowing down other tests. - object_data = os.urandom(object_size) - object_checksum = google_crc32c.value(object_data) - grpc_client = AsyncGrpcClient(attempt_direct_path=attempt_direct_path).grpc_client - - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - await writer.open() - await writer.append(object_data) - object_metadata = await writer.close(finalize_on_close=True) - assert object_metadata.size == object_size - assert int(object_metadata.checksums.crc32c) == object_checksum - - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - buffer = BytesIO() - await mrd.open() - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() - assert buffer.getvalue() == object_data - assert mrd.persisted_size == object_size - - # Clean up; use json client (i.e. `storage_client` fixture) to delete. - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - del writer - del mrd - gc.collect() - - -@pytest.mark.asyncio + async def _run(): + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) + grpc_client = grpc_clients[attempt_direct_path] + + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(object_data) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == object_data + assert mrd.persisted_size == object_size + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + @pytest.mark.parametrize( "object_size", [ @@ -100,48 +143,43 @@ async def test_basic_wrd( 20 * 1024 * 1024, # greater than _MAX_BUFFER_SIZE_BYTES ], ) -async def test_basic_wrd_in_slices(storage_client, blobs_to_delete, object_size): +def test_basic_wrd_in_slices( + storage_client, blobs_to_delete, object_size, event_loop, grpc_client +): object_name = f"test_basic_wrd-{str(uuid.uuid4())}" - # Client instantiation; it cannot be part of fixture because. - # grpc_client's event loop and event loop of coroutine running it - # (i.e. this test) must be same. - # Note: - # 1. @pytest.mark.asyncio ensures new event loop for each test. - # 2. we can keep the same event loop for entire module but that may - # create issues if tests are run in parallel and one test hogs the event - # loop slowing down other tests. - object_data = os.urandom(object_size) - object_checksum = google_crc32c.value(object_data) - grpc_client = AsyncGrpcClient().grpc_client - - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - await writer.open() - mark1, mark2 = _get_equal_dist(0, object_size) - await writer.append(object_data[0:mark1]) - await writer.append(object_data[mark1:mark2]) - await writer.append(object_data[mark2:]) - object_metadata = await writer.close(finalize_on_close=True) - assert object_metadata.size == object_size - assert int(object_metadata.checksums.crc32c) == object_checksum - - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - buffer = BytesIO() - await mrd.open() - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() - assert buffer.getvalue() == object_data - assert mrd.persisted_size == object_size - - # Clean up; use json client (i.e. `storage_client` fixture) to delete. - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - del writer - del mrd - gc.collect() - - -@pytest.mark.asyncio + async def _run(): + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) + + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + mark1, mark2 = _get_equal_dist(0, object_size) + await writer.append(object_data[0:mark1]) + await writer.append(object_data[mark1:mark2]) + await writer.append(object_data[mark2:]) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == object_data + assert mrd.persisted_size == object_size + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + @pytest.mark.parametrize( "flush_interval", [ @@ -151,219 +189,264 @@ async def test_basic_wrd_in_slices(storage_client, blobs_to_delete, object_size) _DEFAULT_FLUSH_INTERVAL_BYTES, ], ) -async def test_wrd_with_non_default_flush_interval( +def test_wrd_with_non_default_flush_interval( storage_client, blobs_to_delete, flush_interval, + event_loop, + grpc_client, ): object_name = f"test_basic_wrd-{str(uuid.uuid4())}" object_size = 9 * 1024 * 1024 - # Client instantiation; it cannot be part of fixture because. - # grpc_client's event loop and event loop of coroutine running it - # (i.e. this test) must be same. - # Note: - # 1. @pytest.mark.asyncio ensures new event loop for each test. - # 2. we can keep the same event loop for entire module but that may - # create issues if tests are run in parallel and one test hogs the event - # loop slowing down other tests. - object_data = os.urandom(object_size) - object_checksum = google_crc32c.value(object_data) - grpc_client = AsyncGrpcClient().grpc_client - - writer = AsyncAppendableObjectWriter( - grpc_client, - _ZONAL_BUCKET, - object_name, - writer_options={"FLUSH_INTERVAL_BYTES": flush_interval}, - ) - await writer.open() - mark1, mark2 = _get_equal_dist(0, object_size) - await writer.append(object_data[0:mark1]) - await writer.append(object_data[mark1:mark2]) - await writer.append(object_data[mark2:]) - object_metadata = await writer.close(finalize_on_close=True) - assert object_metadata.size == object_size - assert int(object_metadata.checksums.crc32c) == object_checksum - - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - buffer = BytesIO() - await mrd.open() - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() - assert buffer.getvalue() == object_data - assert mrd.persisted_size == object_size - - # Clean up; use json client (i.e. `storage_client` fixture) to delete. - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - del writer - del mrd - gc.collect() - - -@pytest.mark.asyncio -async def test_read_unfinalized_appendable_object(storage_client, blobs_to_delete): - object_name = f"read_unfinalized_appendable_object-{str(uuid.uuid4())[:4]}" - grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client - - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - await writer.open() - await writer.append(_BYTES_TO_UPLOAD) - await writer.flush() - - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - buffer = BytesIO() - await mrd.open() - assert mrd.persisted_size == len(_BYTES_TO_UPLOAD) - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() - assert buffer.getvalue() == _BYTES_TO_UPLOAD - - # Clean up; use json client (i.e. `storage_client` fixture) to delete. - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - del writer - del mrd - gc.collect() - - -@pytest.mark.asyncio -async def test_mrd_open_with_read_handle(): - grpc_client = AsyncGrpcClient().grpc_client - object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}" - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - await writer.open() - await writer.append(_BYTES_TO_UPLOAD) - await writer.close() - - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - await mrd.open() - read_handle = mrd.read_handle - await mrd.close() - - # Open a new MRD using the `read_handle` obtained above - new_mrd = AsyncMultiRangeDownloader( - grpc_client, _ZONAL_BUCKET, object_name, read_handle=read_handle - ) - await new_mrd.open() - # persisted_size not set when opened with read_handle - assert new_mrd.persisted_size is None - buffer = BytesIO() - await new_mrd.download_ranges([(0, 0, buffer)]) - await new_mrd.close() - assert buffer.getvalue() == _BYTES_TO_UPLOAD - del mrd - del new_mrd - gc.collect() - - -@pytest.mark.asyncio -async def test_read_unfinalized_appendable_object_with_generation( - storage_client, blobs_to_delete + async def _run(): + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) + + writer = AsyncAppendableObjectWriter( + grpc_client, + _ZONAL_BUCKET, + object_name, + writer_options={"FLUSH_INTERVAL_BYTES": flush_interval}, + ) + await writer.open() + mark1, mark2 = _get_equal_dist(0, object_size) + await writer.append(object_data[0:mark1]) + await writer.append(object_data[mark1:mark2]) + await writer.append(object_data[mark2:]) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == object_data + assert mrd.persisted_size == object_size + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + +def test_read_unfinalized_appendable_object( + storage_client, blobs_to_delete, event_loop, grpc_client_direct ): object_name = f"read_unfinalized_appendable_object-{str(uuid.uuid4())[:4]}" - grpc_client = AsyncGrpcClient(attempt_direct_path=True).grpc_client - async def _read_and_verify(expected_content, generation=None): - """Helper to read object content and verify against expected.""" - mrd = AsyncMultiRangeDownloader( - grpc_client, _ZONAL_BUCKET, object_name, generation + async def _run(): + grpc_client = grpc_client_direct + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.flush() + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + assert mrd.persisted_size == len(_BYTES_TO_UPLOAD) + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == _BYTES_TO_UPLOAD + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + +def test_mrd_open_with_read_handle(event_loop, grpc_client_direct): + object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}" + + async def _run(): + writer = AsyncAppendableObjectWriter( + grpc_client_direct, _ZONAL_BUCKET, object_name + ) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.close() + + mrd = AsyncMultiRangeDownloader(grpc_client_direct, _ZONAL_BUCKET, object_name) + await mrd.open() + read_handle = mrd.read_handle + await mrd.close() + + # Open a new MRD using the `read_handle` obtained above + new_mrd = AsyncMultiRangeDownloader( + grpc_client_direct, _ZONAL_BUCKET, object_name, read_handle=read_handle ) + await new_mrd.open() + # persisted_size not set when opened with read_handle + assert new_mrd.persisted_size is None buffer = BytesIO() + await new_mrd.download_ranges([(0, 0, buffer)]) + await new_mrd.close() + assert buffer.getvalue() == _BYTES_TO_UPLOAD + del mrd + del new_mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + +def test_mrd_open_with_read_handle_over_cloud_path(event_loop, grpc_client): + object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}" + + async def _run(): + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.close() + + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) await mrd.open() - try: - assert mrd.persisted_size == len(expected_content) - await mrd.download_ranges([(0, 0, buffer)]) - assert buffer.getvalue() == expected_content - finally: - await mrd.close() - return mrd - - # First write - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - await writer.open() - await writer.append(_BYTES_TO_UPLOAD) - await writer.flush() - generation = writer.generation - - # First read - mrd = await _read_and_verify(_BYTES_TO_UPLOAD) - - # Second write, using generation from the first write. - writer_2 = AsyncAppendableObjectWriter( - grpc_client, _ZONAL_BUCKET, object_name, generation=generation - ) - await writer_2.open() - await writer_2.append(_BYTES_TO_UPLOAD) - await writer_2.flush() - - # Second read - mrd_2 = await _read_and_verify(_BYTES_TO_UPLOAD + _BYTES_TO_UPLOAD, generation) - - # Clean up - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - del writer - del writer_2 - del mrd - del mrd_2 - gc.collect() - - -@pytest.mark.asyncio -async def test_append_flushes_and_state_lookup(storage_client, blobs_to_delete): + read_handle = mrd.read_handle + await mrd.close() + + # Open a new MRD using the `read_handle` obtained above + new_mrd = AsyncMultiRangeDownloader( + grpc_client, _ZONAL_BUCKET, object_name, read_handle=read_handle + ) + await new_mrd.open() + # persisted_size is set regardless of whether we use read_handle or not + # because read_handle won't work in CLOUD_PATH. + assert new_mrd.persisted_size == len(_BYTES_TO_UPLOAD) + buffer = BytesIO() + await new_mrd.download_ranges([(0, 0, buffer)]) + await new_mrd.close() + assert buffer.getvalue() == _BYTES_TO_UPLOAD + del mrd + del new_mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + +def test_read_unfinalized_appendable_object_with_generation( + storage_client, blobs_to_delete, event_loop, grpc_client_direct +): + object_name = f"read_unfinalized_appendable_object-{str(uuid.uuid4())[:4]}" + grpc_client = grpc_client_direct + + async def _run(): + async def _read_and_verify(expected_content, generation=None): + """Helper to read object content and verify against expected.""" + mrd = AsyncMultiRangeDownloader( + grpc_client, _ZONAL_BUCKET, object_name, generation + ) + buffer = BytesIO() + await mrd.open() + try: + assert mrd.persisted_size == len(expected_content) + await mrd.download_ranges([(0, 0, buffer)]) + assert buffer.getvalue() == expected_content + finally: + await mrd.close() + return mrd + + # First write + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + await writer.open() + await writer.append(_BYTES_TO_UPLOAD) + await writer.flush() + generation = writer.generation + + # First read + mrd = await _read_and_verify(_BYTES_TO_UPLOAD) + + # Second write, using generation from the first write. + writer_2 = AsyncAppendableObjectWriter( + grpc_client, _ZONAL_BUCKET, object_name, generation=generation + ) + await writer_2.open() + await writer_2.append(_BYTES_TO_UPLOAD) + await writer_2.flush() + + # Second read + mrd_2 = await _read_and_verify(_BYTES_TO_UPLOAD + _BYTES_TO_UPLOAD, generation) + + # Clean up + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del writer_2 + del mrd + del mrd_2 + gc.collect() + + event_loop.run_until_complete(_run()) + + +def test_append_flushes_and_state_lookup( + storage_client, blobs_to_delete, event_loop, grpc_client +): """ System test for AsyncAppendableObjectWriter, verifying flushing behavior for both small and large appends. """ object_name = f"test-append-flush-varied-size-{uuid.uuid4()}" - grpc_client = AsyncGrpcClient().grpc_client - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - # Schedule for cleanup - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + async def _run(): + writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) + + # Schedule for cleanup + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + # --- Part 1: Test with small data --- + small_data = b"small data" + + await writer.open() + assert writer._is_stream_open - # --- Part 1: Test with small data --- - small_data = b"small data" + await writer.append(small_data) + persisted_size = await writer.state_lookup() + assert persisted_size == len(small_data) - await writer.open() - assert writer._is_stream_open + # --- Part 2: Test with large data --- + large_data = os.urandom(38 * 1024 * 1024) - await writer.append(small_data) - persisted_size = await writer.state_lookup() - assert persisted_size == len(small_data) + # Append data larger than the default flush interval (16 MiB). + # This should trigger the interval-based flushing logic. + await writer.append(large_data) - # --- Part 2: Test with large data --- - large_data = os.urandom(38 * 1024 * 1024) + # Verify the total data has been persisted. + total_size = len(small_data) + len(large_data) + persisted_size = await writer.state_lookup() + assert persisted_size == total_size - # Append data larger than the default flush interval (16 MiB). - # This should trigger the interval-based flushing logic. - await writer.append(large_data) + # --- Part 3: Finalize and verify --- + final_object = await writer.close(finalize_on_close=True) - # Verify the total data has been persisted. - total_size = len(small_data) + len(large_data) - persisted_size = await writer.state_lookup() - assert persisted_size == total_size + assert not writer._is_stream_open + assert final_object.size == total_size - # --- Part 3: Finalize and verify --- - final_object = await writer.close(finalize_on_close=True) + # Verify the full content of the object. + full_data = small_data + large_data + mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + content = buffer.getvalue() + assert content == full_data - assert not writer._is_stream_open - assert final_object.size == total_size + event_loop.run_until_complete(_run()) - # Verify the full content of the object. - full_data = small_data + large_data - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - buffer = BytesIO() - await mrd.open() - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() - content = buffer.getvalue() - assert content == full_data -@pytest.mark.asyncio -async def test_open_with_generation_zero(storage_client, blobs_to_delete): +def test_open_with_generation_zero( + storage_client, blobs_to_delete, event_loop, grpc_client +): """Tests that using `generation=0` fails if the object already exists. This test verifies that: @@ -373,62 +456,67 @@ async def test_open_with_generation_zero(storage_client, blobs_to_delete): precondition (object must not exist) is not met. """ object_name = f"test_append_with_generation-{uuid.uuid4()}" - grpc_client = AsyncGrpcClient().grpc_client - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name, generation=0) - - # Empty object is created. - await writer.open() - assert writer.is_stream_open - await writer.close() - assert not writer.is_stream_open - - - with pytest.raises(FailedPrecondition) as exc_info: + async def _run(): writer = AsyncAppendableObjectWriter( grpc_client, _ZONAL_BUCKET, object_name, generation=0 ) + + # Empty object is created. await writer.open() - assert exc_info.value.code == 400 + assert writer.is_stream_open - # cleanup - del writer - gc.collect() + await writer.close() + assert not writer.is_stream_open - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + with pytest.raises(FailedPrecondition) as exc_info: + writer_fail = AsyncAppendableObjectWriter( + grpc_client, _ZONAL_BUCKET, object_name, generation=0 + ) + await writer_fail.open() + assert exc_info.value.code == 400 -@pytest.mark.asyncio -async def test_open_existing_object_with_gen_None_overrides_existing(storage_client, blobs_to_delete): + # cleanup + del writer + gc.collect() + + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + + event_loop.run_until_complete(_run()) + + +def test_open_existing_object_with_gen_None_overrides_existing( + storage_client, blobs_to_delete, event_loop, grpc_client +): """ Test that a new writer when specifies `None` overrides the existing object. """ object_name = f"test_append_with_generation-{uuid.uuid4()}" - grpc_client = AsyncGrpcClient().grpc_client - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name, generation=0) - - # Empty object is created. - await writer.open() - assert writer.is_stream_open - old_gen = writer.generation - - - await writer.close() - assert not writer.is_stream_open + async def _run(): + writer = AsyncAppendableObjectWriter( + grpc_client, _ZONAL_BUCKET, object_name, generation=0 + ) + # Empty object is created. + await writer.open() + assert writer.is_stream_open + old_gen = writer.generation + await writer.close() + assert not writer.is_stream_open - new_writer = AsyncAppendableObjectWriter( + new_writer = AsyncAppendableObjectWriter( grpc_client, _ZONAL_BUCKET, object_name, generation=None - ) - await new_writer.open() - assert new_writer.generation != old_gen + ) + await new_writer.open() + assert new_writer.generation != old_gen - # assert exc_info.value.code == 400 + # cleanup + del writer + del new_writer + gc.collect() - # cleanup - del writer - del new_writer - gc.collect() + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) \ No newline at end of file + event_loop.run_until_complete(_run()) From 2bc15fa570683ba584230c51b439d189dbdcd580 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 22 Jan 2026 13:00:03 +0530 Subject: [PATCH 468/509] feat: Add support for opening via `write_handle` and fix `write_handle` type (#1715) feat: Add support for opening via `write_handle` and fix `write_handle` type --- .../asyncio/async_abstract_object_stream.py | 6 +- .../asyncio/async_appendable_object_writer.py | 11 ++-- .../asyncio/async_multi_range_downloader.py | 12 ++-- .../asyncio/async_read_object_stream.py | 8 +-- .../asyncio/async_write_object_stream.py | 48 ++++++++------ tests/system/test_zonal.py | 50 +++++++++++++++ .../asyncio/test_async_write_object_stream.py | 64 ++++++++++++++----- 7 files changed, 146 insertions(+), 53 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py index 49d7a293a..26cbab7a0 100644 --- a/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py @@ -32,7 +32,7 @@ class _AsyncAbstractObjectStream(abc.ABC): :param generation_number: (Optional) If present, selects a specific revision of this object. - :type handle: bytes + :type handle: Any :param handle: (Optional) The handle for the object, could be read_handle or write_handle, based on how the stream is used. """ @@ -42,13 +42,13 @@ def __init__( bucket_name: str, object_name: str, generation_number: Optional[int] = None, - handle: Optional[bytes] = None, + handle: Optional[Any] = None, ) -> None: super().__init__() self.bucket_name: str = bucket_name self.object_name: str = object_name self.generation_number: Optional[int] = generation_number - self.handle: Optional[bytes] = handle + self.handle: Optional[Any] = handle @abc.abstractmethod async def open(self) -> None: diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 444e8d030..c961fbefb 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -49,8 +49,8 @@ def __init__( client: AsyncGrpcClient.grpc_client, bucket_name: str, object_name: str, - generation=None, - write_handle=None, + generation: Optional[int] = None, + write_handle: Optional[_storage_v2.BidiWriteHandle] = None, writer_options: Optional[dict] = None, ): """ @@ -96,7 +96,7 @@ def __init__( :type object_name: str :param object_name: The name of the GCS Appendable Object to be written. - :type generation: int + :type generation: Optional[int] :param generation: (Optional) If present, creates writer for that specific revision of that object. Use this to append data to an existing Appendable Object. @@ -106,10 +106,10 @@ def __init__( overwriting existing objects). Warning: If `None`, a new object is created. If an object with the - same name already exists, it will be overwritten the moment + same name already exists, it will be overwritten the moment `writer.open()` is called. - :type write_handle: bytes + :type write_handle: _storage_v2.BidiWriteHandle :param write_handle: (Optional) An handle for writing the object. If provided, opening the bidi-gRPC connection will be faster. @@ -363,7 +363,6 @@ async def finalize(self) -> _storage_v2.Object: def is_stream_open(self) -> bool: return self._is_stream_open - # helper methods. async def append_from_string(self, data: str): """ diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index dedff67e2..66a9f0057 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -129,7 +129,7 @@ async def create_mrd( bucket_name: str, object_name: str, generation_number: Optional[int] = None, - read_handle: Optional[bytes] = None, + read_handle: Optional[_storage_v2.BidiReadHandle] = None, retry_policy: Optional[AsyncRetry] = None, metadata: Optional[List[Tuple[str, str]]] = None, ) -> AsyncMultiRangeDownloader: @@ -149,7 +149,7 @@ async def create_mrd( :param generation_number: (Optional) If present, selects a specific revision of this object. - :type read_handle: bytes + :type read_handle: _storage_v2.BidiReadHandle :param read_handle: (Optional) An existing handle for reading the object. If provided, opening the bidi-gRPC connection will be faster. @@ -172,7 +172,7 @@ def __init__( bucket_name: str, object_name: str, generation_number: Optional[int] = None, - read_handle: Optional[bytes] = None, + read_handle: Optional[_storage_v2.BidiReadHandle] = None, ) -> None: """Constructor for AsyncMultiRangeDownloader, clients are not adviced to use it directly. Instead it's adviced to use the classmethod `create_mrd`. @@ -190,7 +190,7 @@ def __init__( :param generation_number: (Optional) If present, selects a specific revision of this object. - :type read_handle: bytes + :type read_handle: _storage_v2.BidiReadHandle :param read_handle: (Optional) An existing read handle. """ @@ -200,7 +200,7 @@ def __init__( self.bucket_name = bucket_name self.object_name = object_name self.generation_number = generation_number - self.read_handle = read_handle + self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle self.read_obj_str: Optional[_AsyncReadObjectStream] = None self._is_stream_open: bool = False self._routing_token: Optional[str] = None @@ -493,4 +493,4 @@ async def close(self): @property def is_stream_open(self) -> bool: - return self._is_stream_open + return self._is_stream_open \ No newline at end of file diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index 5e84485d5..15772da87 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -51,7 +51,7 @@ class _AsyncReadObjectStream(_AsyncAbstractObjectStream): :param generation_number: (Optional) If present, selects a specific revision of this object. - :type read_handle: bytes + :type read_handle: _storage_v2.BidiReadHandle :param read_handle: (Optional) An existing handle for reading the object. If provided, opening the bidi-gRPC connection will be faster. """ @@ -62,7 +62,7 @@ def __init__( bucket_name: str, object_name: str, generation_number: Optional[int] = None, - read_handle: Optional[bytes] = None, + read_handle: Optional[_storage_v2.BidiReadHandle] = None, ) -> None: if client is None: raise ValueError("client must be provided") @@ -77,7 +77,7 @@ def __init__( generation_number=generation_number, ) self.client: AsyncGrpcClient.grpc_client = client - self.read_handle: Optional[bytes] = read_handle + self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" @@ -195,4 +195,4 @@ async def recv(self) -> _storage_v2.BidiReadObjectResponse: @property def is_stream_open(self) -> bool: - return self._is_stream_open + return self._is_stream_open \ No newline at end of file diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index b79e707f2..731b18e45 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -59,7 +59,7 @@ class _AsyncWriteObjectStream(_AsyncAbstractObjectStream): same name already exists, it will be overwritten the moment `writer.open()` is called. - :type write_handle: bytes + :type write_handle: _storage_v2.BidiWriteHandle :param write_handle: (Optional) An existing handle for writing the object. If provided, opening the bidi-gRPC connection will be faster. """ @@ -70,7 +70,7 @@ def __init__( bucket_name: str, object_name: str, generation_number: Optional[int] = None, # None means new object - write_handle: Optional[bytes] = None, + write_handle: Optional[_storage_v2.BidiWriteHandle] = None, ) -> None: if client is None: raise ValueError("client must be provided") @@ -85,7 +85,7 @@ def __init__( generation_number=generation_number, ) self.client: AsyncGrpcClient.grpc_client = client - self.write_handle: Optional[bytes] = write_handle + self.write_handle: Optional[_storage_v2.BidiWriteHandle] = write_handle self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" @@ -120,6 +120,9 @@ async def open(self) -> None: # Created object type would be Appendable Object. # if `generation_number` == 0 new object will be created only if there # isn't any existing object. + is_open_via_write_handle = ( + self.write_handle is not None and self.generation_number + ) if self.generation_number is None or self.generation_number == 0: self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( write_object_spec=_storage_v2.WriteObjectSpec( @@ -136,6 +139,7 @@ async def open(self) -> None: bucket=self._full_bucket_name, object=self.object_name, generation=self.generation_number, + write_handle=self.write_handle, ), ) self.socket_like_rpc = AsyncBidiRpc( @@ -145,25 +149,32 @@ async def open(self) -> None: await self.socket_like_rpc.open() # this is actually 1 send response = await self.socket_like_rpc.recv() self._is_stream_open = True - - if not response.resource: - raise ValueError( - "Failed to obtain object resource after opening the stream" - ) - if not response.resource.generation: - raise ValueError( - "Failed to obtain object generation after opening the stream" - ) + if is_open_via_write_handle: + # Don't use if not response.persisted_size because this will be true + # if persisted_size==0 (0 is considered "Falsy" in Python) + if response.persisted_size is None: + raise ValueError( + "Failed to obtain persisted_size after opening the stream via write_handle" + ) + self.persisted_size = response.persisted_size + else: + if not response.resource: + raise ValueError( + "Failed to obtain object resource after opening the stream" + ) + if not response.resource.generation: + raise ValueError( + "Failed to obtain object generation after opening the stream" + ) + if not response.resource.size: + # Appending to a 0 byte appendable object. + self.persisted_size = 0 + else: + self.persisted_size = response.resource.size if not response.write_handle: raise ValueError("Failed to obtain write_handle after opening the stream") - if not response.resource.size: - # Appending to a 0 byte appendable object. - self.persisted_size = 0 - else: - self.persisted_size = response.resource.size - self.generation_number = response.resource.generation self.write_handle = response.write_handle @@ -212,4 +223,3 @@ async def recv(self) -> _storage_v2.BidiWriteObjectResponse: @property def is_stream_open(self) -> bool: return self._is_stream_open - diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index b5291ca08..0bd61ff53 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -333,6 +333,56 @@ async def _run(): event_loop.run_until_complete(_run()) +def test_wrd_open_with_write_handle( + event_loop, grpc_client_direct, storage_client, blobs_to_delete +): + object_name = f"test_write_handl-{str(uuid.uuid4())[:4]}" + + async def _run(): + # 1. Create an object and get its write_handle + writer = AsyncAppendableObjectWriter( + grpc_client_direct, _ZONAL_BUCKET, object_name + ) + await writer.open() + write_handle = writer.write_handle + await writer.close() + + # 2. Open a new writer using the obtained `write_handle` and generation + new_writer = AsyncAppendableObjectWriter( + grpc_client_direct, + _ZONAL_BUCKET, + object_name, + write_handle=write_handle, + generation=writer.generation, + ) + await new_writer.open() + # Verify that the new writer is open and has the same write_handle + assert new_writer.is_stream_open + assert new_writer.generation == writer.generation + + # 3. Append some data using the new writer + test_data = b"data_from_new_writer" + await new_writer.append(test_data) + await new_writer.close() + + # 4. Verify the data was written correctly by reading it back + mrd = AsyncMultiRangeDownloader(grpc_client_direct, _ZONAL_BUCKET, object_name) + buffer = BytesIO() + await mrd.open() + await mrd.download_ranges([(0, 0, buffer)]) + await mrd.close() + assert buffer.getvalue() == test_data + + # Clean up + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + del new_writer + del mrd + gc.collect() + + event_loop.run_until_complete(_run()) + + def test_read_unfinalized_appendable_object_with_generation( storage_client, blobs_to_delete, event_loop, grpc_client_direct ): diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index f0d90543f..619d5f7e6 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -25,6 +25,7 @@ OBJECT = "my-object" GENERATION = 12345 WRITE_HANDLE = b"test-handle" +WRITE_HANDLE_PROTO = _storage_v2.BidiWriteHandle(handle=WRITE_HANDLE) @pytest.fixture @@ -56,7 +57,7 @@ async def instantiate_write_obj_stream(mock_client, mock_cls_async_bidi_rpc, ope mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE + mock_response.write_handle = WRITE_HANDLE_PROTO socket_like_rpc.recv = AsyncMock(return_value=mock_response) write_obj_stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) @@ -90,18 +91,16 @@ def test_async_write_object_stream_init(mock_client): def test_async_write_object_stream_init_with_generation_and_handle(mock_client): """Test the constructor with optional arguments.""" - generation = 12345 - write_handle = b"test-handle" stream = _AsyncWriteObjectStream( mock_client, BUCKET, OBJECT, - generation_number=generation, - write_handle=write_handle, + generation_number=GENERATION, + write_handle=WRITE_HANDLE_PROTO, ) - assert stream.generation_number == generation - assert stream.write_handle == write_handle + assert stream.generation_number == GENERATION + assert stream.write_handle == WRITE_HANDLE_PROTO def test_async_write_object_stream_init_raises_value_error(): @@ -131,7 +130,7 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE + mock_response.write_handle = WRITE_HANDLE_PROTO socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) @@ -144,7 +143,7 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): socket_like_rpc.open.assert_called_once() socket_like_rpc.recv.assert_called_once() assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE + assert stream.write_handle == WRITE_HANDLE_PROTO assert stream.persisted_size == 0 @@ -163,7 +162,7 @@ async def test_open_for_new_object_with_generation_zero(mock_async_bidi_rpc, moc mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE + mock_response.write_handle = WRITE_HANDLE_PROTO socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT, generation_number=0) @@ -180,7 +179,7 @@ async def test_open_for_new_object_with_generation_zero(mock_async_bidi_rpc, moc socket_like_rpc.open.assert_called_once() socket_like_rpc.recv.assert_called_once() assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE + assert stream.write_handle == WRITE_HANDLE_PROTO assert stream.persisted_size == 0 @@ -199,7 +198,7 @@ async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client): mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.size = 1024 mock_response.resource.generation = GENERATION - mock_response.write_handle = WRITE_HANDLE + mock_response.write_handle = WRITE_HANDLE_PROTO socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) stream = _AsyncWriteObjectStream( @@ -214,7 +213,7 @@ async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client): socket_like_rpc.open.assert_called_once() socket_like_rpc.recv.assert_called_once() assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE + assert stream.write_handle == WRITE_HANDLE_PROTO assert stream.persisted_size == 1024 @@ -233,7 +232,7 @@ async def test_open_when_already_open_raises_error(mock_async_bidi_rpc, mock_cli mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) mock_response.resource.generation = GENERATION mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE + mock_response.write_handle = WRITE_HANDLE_PROTO socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) @@ -315,6 +314,41 @@ async def test_open_raises_error_on_missing_write_handle( await stream.open() +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_raises_error_on_missing_persisted_size_with_write_handle( + mock_async_bidi_rpc, mock_client +): + """Test that open raises ValueError if persisted_size is None when opened via write_handle.""" + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + + # + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.persisted_size = None # This is the key part of the test + mock_response.write_handle = ( + WRITE_HANDLE_PROTO # Ensure write_handle is present to avoid that error + ) + socket_like_rpc.recv.return_value = mock_response + + # ACT + stream = _AsyncWriteObjectStream( + mock_client, + BUCKET, + OBJECT, + write_handle=WRITE_HANDLE_PROTO, + generation_number=GENERATION, + ) + + with pytest.raises( + ValueError, + match="Failed to obtain persisted_size after opening the stream via write_handle", + ): + await stream.open() + + @pytest.mark.asyncio @mock.patch( "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" @@ -452,4 +486,4 @@ async def test_requests_done(mock_cls_async_bidi_rpc, mock_client): # Assert write_obj_stream.socket_like_rpc.send.assert_called_once_with(None) - write_obj_stream.socket_like_rpc.recv.assert_called_once() \ No newline at end of file + write_obj_stream.socket_like_rpc.recv.assert_called_once() From 5d9fafe1466b5ccb1db4a814967a5cc8465148a2 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 22 Jan 2026 14:56:53 +0530 Subject: [PATCH 469/509] fix: update write handle on every recv() (#1716) fix: update `write_handle` on every `recv()` from write object stream. --- .../storage/_experimental/asyncio/_utils.py | 6 ++ .../asyncio/async_appendable_object_writer.py | 8 +- .../asyncio/async_write_object_stream.py | 7 +- .../asyncio/test_async_write_object_stream.py | 102 +++++++++++++++++- 4 files changed, 116 insertions(+), 7 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/_utils.py b/google/cloud/storage/_experimental/asyncio/_utils.py index 32d83a586..170a0cfae 100644 --- a/google/cloud/storage/_experimental/asyncio/_utils.py +++ b/google/cloud/storage/_experimental/asyncio/_utils.py @@ -33,3 +33,9 @@ def raise_if_no_fast_crc32c(): "C extension is required for faster data integrity checks." "For more information, see https://github.com/googleapis/python-crc32c." ) + + +def update_write_handle_if_exists(obj, response): + """Update the write_handle attribute of an object if it exists in the response.""" + if hasattr(response, "write_handle") and response.write_handle is not None: + obj.write_handle = response.write_handle diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index c961fbefb..eda21019d 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -27,7 +27,7 @@ from google_crc32c import Checksum from google.api_core import exceptions -from ._utils import raise_if_no_fast_crc32c +from . import _utils from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import ( AsyncGrpcClient, @@ -121,7 +121,7 @@ def __init__( servers. Default is `_DEFAULT_FLUSH_INTERVAL_BYTES`. Must be a multiple of `_MAX_CHUNK_SIZE_BYTES`. """ - raise_if_no_fast_crc32c() + _utils.raise_if_no_fast_crc32c() self.client = client self.bucket_name = bucket_name self.object_name = object_name @@ -175,6 +175,7 @@ async def state_lookup(self) -> int: ) ) response = await self.write_obj_stream.recv() + _utils.update_write_handle_if_exists(self, response) self.persisted_size = response.persisted_size return self.persisted_size @@ -253,6 +254,7 @@ async def append(self, data: bytes) -> None: if is_last_chunk: response = await self.write_obj_stream.recv() + _utils.update_write_handle_if_exists(self, response) self.persisted_size = response.persisted_size self.offset = self.persisted_size self.bytes_appended_since_last_flush = 0 @@ -295,6 +297,7 @@ async def flush(self) -> int: ) ) response = await self.write_obj_stream.recv() + _utils.update_write_handle_if_exists(self, response) self.persisted_size = response.persisted_size self.offset = self.persisted_size return self.persisted_size @@ -351,6 +354,7 @@ async def finalize(self) -> _storage_v2.Object: _storage_v2.BidiWriteObjectRequest(finish_write=True) ) response = await self.write_obj_stream.recv() + _utils.update_write_handle_if_exists(self, response) self.object_resource = response.resource self.persisted_size = self.object_resource.size await self.write_obj_stream.close() diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 731b18e45..682438dea 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -22,6 +22,7 @@ """ from typing import Optional +from . import _utils from google.cloud import _storage_v2 from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( @@ -190,7 +191,7 @@ async def requests_done(self): """Signals that all requests have been sent.""" await self.socket_like_rpc.send(None) - await self.socket_like_rpc.recv() + _utils.update_write_handle_if_exists(self, await self.socket_like_rpc.recv()) async def send( self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest @@ -218,7 +219,9 @@ async def recv(self) -> _storage_v2.BidiWriteObjectResponse: """ if not self._is_stream_open: raise ValueError("Stream is not open") - return await self.socket_like_rpc.recv() + response = await self.socket_like_rpc.recv() + _utils.update_write_handle_if_exists(self, response) + return response @property def is_stream_open(self) -> bool: diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 619d5f7e6..92ba2925a 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -24,8 +24,10 @@ BUCKET = "my-bucket" OBJECT = "my-object" GENERATION = 12345 -WRITE_HANDLE = b"test-handle" -WRITE_HANDLE_PROTO = _storage_v2.BidiWriteHandle(handle=WRITE_HANDLE) +WRITE_HANDLE_BYTES = b"test-handle" +NEW_WRITE_HANDLE_BYTES = b"new-test-handle" +WRITE_HANDLE_PROTO = _storage_v2.BidiWriteHandle(handle=WRITE_HANDLE_BYTES) +NEW_WRITE_HANDLE_PROTO = _storage_v2.BidiWriteHandle(handle=NEW_WRITE_HANDLE_BYTES) @pytest.fixture @@ -151,7 +153,9 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): @mock.patch( "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" ) -async def test_open_for_new_object_with_generation_zero(mock_async_bidi_rpc, mock_client): +async def test_open_for_new_object_with_generation_zero( + mock_async_bidi_rpc, mock_client +): """Test opening a stream for a new object.""" # Arrange socket_like_rpc = mock.AsyncMock() @@ -487,3 +491,95 @@ async def test_requests_done(mock_cls_async_bidi_rpc, mock_client): # Assert write_obj_stream.socket_like_rpc.send.assert_called_once_with(None) write_obj_stream.socket_like_rpc.recv.assert_called_once() + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_open_for_existing_object_with_none_size( + mock_async_bidi_rpc, mock_client +): + """Test opening a stream for an existing object where size is None.""" + # Arrange + socket_like_rpc = mock.AsyncMock() + mock_async_bidi_rpc.return_value = socket_like_rpc + socket_like_rpc.open = mock.AsyncMock() + + mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) + mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) + mock_response.resource.size = None + mock_response.resource.generation = GENERATION + mock_response.write_handle = WRITE_HANDLE_PROTO + socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) + + stream = _AsyncWriteObjectStream( + mock_client, BUCKET, OBJECT, generation_number=GENERATION + ) + + # Act + await stream.open() + + # Assert + assert stream.persisted_size == 0 + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_recv_updates_write_handle(mock_cls_async_bidi_rpc, mock_client): + """Test that recv updates the write_handle if present in the response.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + + assert write_obj_stream.write_handle == WRITE_HANDLE_PROTO # Initial handle + + # GCS can periodicallly update write handle in their responses. + bidi_write_object_response = _storage_v2.BidiWriteObjectResponse( + write_handle=NEW_WRITE_HANDLE_PROTO + ) + write_obj_stream.socket_like_rpc.recv = AsyncMock( + return_value=bidi_write_object_response + ) + + # Act + response = await write_obj_stream.recv() + + # Assert + write_obj_stream.socket_like_rpc.recv.assert_called_once() + assert response == bidi_write_object_response + # asserts that new write handle has been updated. + assert write_obj_stream.write_handle == NEW_WRITE_HANDLE_PROTO + + +@pytest.mark.asyncio +@mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" +) +async def test_requests_done_updates_write_handle(mock_cls_async_bidi_rpc, mock_client): + """Test that requests_done updates the write_handle if present in the response.""" + # Arrange + write_obj_stream = await instantiate_write_obj_stream( + mock_client, mock_cls_async_bidi_rpc, open=True + ) + assert write_obj_stream.write_handle == WRITE_HANDLE_PROTO # Initial handle + + # new_write_handle = b"new-test-handle" + bidi_write_object_response = _storage_v2.BidiWriteObjectResponse( + write_handle=NEW_WRITE_HANDLE_PROTO + ) + write_obj_stream.socket_like_rpc.send = AsyncMock() + write_obj_stream.socket_like_rpc.recv = AsyncMock( + return_value=bidi_write_object_response + ) + + # Act + await write_obj_stream.requests_done() + + # Assert + write_obj_stream.socket_like_rpc.send.assert_called_once_with(None) + write_obj_stream.socket_like_rpc.recv.assert_called_once() + assert write_obj_stream.write_handle == NEW_WRITE_HANDLE_PROTO From dbd162b3583e32e6f705a51f5c3fef333a9b89d0 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:19:22 +0530 Subject: [PATCH 470/509] feat(experimental): integrate writes strategy and appendable object writer (#1695) Integrate all the components required for bidi writes retries --- .../asyncio/async_appendable_object_writer.py | 325 ++++-- .../asyncio/async_grpc_client.py | 1 + .../asyncio/async_multi_range_downloader.py | 2 +- .../asyncio/async_read_object_stream.py | 2 +- .../asyncio/async_write_object_stream.py | 68 +- .../_experimental/asyncio/retry/_helpers.py | 46 +- .../retry/writes_resumption_strategy.py | 75 +- tests/conformance/test_bidi_writes.py | 267 +++++ tests/perf/microbenchmarks/_utils.py | 22 +- tests/perf/microbenchmarks/conftest.py | 19 +- tests/perf/microbenchmarks/reads/config.py | 9 +- .../perf/microbenchmarks/reads/test_reads.py | 6 +- .../perf/microbenchmarks/resource_monitor.py | 2 +- tests/perf/microbenchmarks/writes/config.py | 9 +- .../microbenchmarks/writes/test_writes.py | 40 +- tests/system/test_zonal.py | 1 - .../retry/test_writes_resumption_strategy.py | 457 +++++---- .../test_async_appendable_object_writer.py | 963 +++++++----------- tests/unit/asyncio/test_async_grpc_client.py | 11 +- .../asyncio/test_async_write_object_stream.py | 716 ++++--------- 20 files changed, 1526 insertions(+), 1515 deletions(-) create mode 100644 tests/conformance/test_bidi_writes.py diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index eda21019d..7795a2ac5 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -22,10 +22,16 @@ """ from io import BufferedReader -from typing import Optional, Union +import io +import logging +from typing import List, Optional, Tuple, Union -from google_crc32c import Checksum from google.api_core import exceptions +from google.api_core.retry_async import AsyncRetry +from google.rpc import status_pb2 +from google.cloud._storage_v2.types import BidiWriteObjectRedirectedError +from google.cloud._storage_v2.types.storage import BidiWriteObjectRequest + from . import _utils from google.cloud import _storage_v2 @@ -35,10 +41,72 @@ from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( _AsyncWriteObjectStream, ) +from google.cloud.storage._experimental.asyncio.retry.bidi_stream_retry_manager import ( + _BidiStreamRetryManager, +) +from google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy import ( + _WriteResumptionStrategy, + _WriteState, +) +from google.cloud.storage._experimental.asyncio.retry._helpers import ( + _extract_bidi_writes_redirect_proto, +) _MAX_CHUNK_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB _DEFAULT_FLUSH_INTERVAL_BYTES = 16 * 1024 * 1024 # 16 MiB +_BIDI_WRITE_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" +) +logger = logging.getLogger(__name__) + + +def _is_write_retryable(exc): + """Predicate to determine if a write operation should be retried.""" + + if isinstance( + exc, + ( + exceptions.InternalServerError, + exceptions.ServiceUnavailable, + exceptions.DeadlineExceeded, + exceptions.TooManyRequests, + BidiWriteObjectRedirectedError, + ), + ): + logger.warning(f"Retryable write exception encountered: {exc}") + return True + + grpc_error = None + if isinstance(exc, exceptions.Aborted) and exc.errors: + grpc_error = exc.errors[0] + if isinstance(grpc_error, BidiWriteObjectRedirectedError): + return True + + trailers = grpc_error.trailing_metadata() + if not trailers: + return False + + status_details_bin = None + for key, value in trailers: + if key == "grpc-status-details-bin": + status_details_bin = value + break + + if status_details_bin: + status_proto = status_pb2.Status() + try: + status_proto.ParseFromString(status_details_bin) + for detail in status_proto.details: + if detail.type_url == _BIDI_WRITE_REDIRECTED_TYPE_URL: + return True + except Exception: + logger.error( + "Error unpacking redirect details from gRPC error. Exception: ", + {exc}, + ) + return False + return False class AsyncAppendableObjectWriter: @@ -128,13 +196,7 @@ def __init__( self.write_handle = write_handle self.generation = generation - self.write_obj_stream = _AsyncWriteObjectStream( - client=self.client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation, - write_handle=self.write_handle, - ) + self.write_obj_stream: Optional[_AsyncWriteObjectStream] = None self._is_stream_open: bool = False # `offset` is the latest size of the object without staleless. self.offset: Optional[int] = None @@ -156,6 +218,8 @@ def __init__( f"flush_interval must be a multiple of {_MAX_CHUNK_SIZE_BYTES}, but provided {self.flush_interval}" ) self.bytes_appended_since_last_flush = 0 + self._routing_token: Optional[str] = None + self.object_resource: Optional[_storage_v2.Object] = None async def state_lookup(self) -> int: """Returns the persisted_size @@ -175,11 +239,25 @@ async def state_lookup(self) -> int: ) ) response = await self.write_obj_stream.recv() - _utils.update_write_handle_if_exists(self, response) self.persisted_size = response.persisted_size return self.persisted_size - async def open(self) -> None: + def _on_open_error(self, exc): + """Extracts routing token and write handle on redirect error during open.""" + redirect_proto = _extract_bidi_writes_redirect_proto(exc) + if redirect_proto: + if redirect_proto.routing_token: + self._routing_token = redirect_proto.routing_token + if redirect_proto.write_handle: + self.write_handle = redirect_proto.write_handle + if redirect_proto.generation: + self.generation = redirect_proto.generation + + async def open( + self, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: """Opens the underlying bidi-gRPC stream. :raises ValueError: If the stream is already open. @@ -188,15 +266,80 @@ async def open(self) -> None: if self._is_stream_open: raise ValueError("Underlying bidi-gRPC stream is already open") - await self.write_obj_stream.open() - self._is_stream_open = True - if self.generation is None: - self.generation = self.write_obj_stream.generation_number - self.write_handle = self.write_obj_stream.write_handle - self.persisted_size = self.write_obj_stream.persisted_size + if retry_policy is None: + retry_policy = AsyncRetry( + predicate=_is_write_retryable, on_error=self._on_open_error + ) + else: + original_on_error = retry_policy._on_error + + def combined_on_error(exc): + self._on_open_error(exc) + if original_on_error: + original_on_error(exc) + + retry_policy = AsyncRetry( + predicate=_is_write_retryable, + initial=retry_policy._initial, + maximum=retry_policy._maximum, + multiplier=retry_policy._multiplier, + deadline=retry_policy._deadline, + on_error=combined_on_error, + ) + + async def _do_open(): + current_metadata = list(metadata) if metadata else [] + + # Cleanup stream from previous failed attempt, if any. + if self.write_obj_stream: + if self.write_obj_stream.is_stream_open: + try: + await self.write_obj_stream.close() + except Exception as e: + logger.warning( + "Error closing previous write stream during open retry. Got exception: ", + {e}, + ) + self.write_obj_stream = None + self._is_stream_open = False + + self.write_obj_stream = _AsyncWriteObjectStream( + client=self.client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation, + write_handle=self.write_handle, + routing_token=self._routing_token, + ) + + if self._routing_token: + current_metadata.append( + ("x-goog-request-params", f"routing_token={self._routing_token}") + ) + + await self.write_obj_stream.open( + metadata=current_metadata if metadata else None + ) + + if self.write_obj_stream.generation_number: + self.generation = self.write_obj_stream.generation_number + if self.write_obj_stream.write_handle: + self.write_handle = self.write_obj_stream.write_handle + if self.write_obj_stream.persisted_size is not None: + self.persisted_size = self.write_obj_stream.persisted_size + + self._is_stream_open = True + self._routing_token = None - async def append(self, data: bytes) -> None: - """Appends data to the Appendable object. + await retry_policy(_do_open)() + + async def append( + self, + data: bytes, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: + """Appends data to the Appendable object with automatic retries. calling `self.append` will append bytes at the end of the current size ie. `self.offset` bytes relative to the begining of the object. @@ -209,56 +352,110 @@ async def append(self, data: bytes) -> None: :type data: bytes :param data: The bytes to append to the object. - :rtype: None + :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` + :param retry_policy: (Optional) The retry policy to use for the operation. - :raises ValueError: If the stream is not open (i.e., `open()` has not - been called). - """ + :type metadata: List[Tuple[str, str]] + :param metadata: (Optional) The metadata to be sent with the request. + :raises ValueError: If the stream is not open. + """ if not self._is_stream_open: raise ValueError("Stream is not open. Call open() before append().") - total_bytes = len(data) - if total_bytes == 0: - # TODO: add warning. + if not data: + logger.debug("No data provided to append; returning without action.") return - if self.offset is None: - assert self.persisted_size is not None - self.offset = self.persisted_size - - start_idx = 0 - while start_idx < total_bytes: - end_idx = min(start_idx + _MAX_CHUNK_SIZE_BYTES, total_bytes) - data_chunk = data[start_idx:end_idx] - is_last_chunk = end_idx == total_bytes - chunk_size = end_idx - start_idx - await self.write_obj_stream.send( - _storage_v2.BidiWriteObjectRequest( - write_offset=self.offset, - checksummed_data=_storage_v2.ChecksummedData( - content=data_chunk, - crc32c=int.from_bytes(Checksum(data_chunk).digest(), "big"), - ), - state_lookup=is_last_chunk, - flush=is_last_chunk - or ( - self.bytes_appended_since_last_flush + chunk_size - >= self.flush_interval - ), - ) - ) - self.offset += chunk_size - self.bytes_appended_since_last_flush += chunk_size - if self.bytes_appended_since_last_flush >= self.flush_interval: - self.bytes_appended_since_last_flush = 0 + if retry_policy is None: + retry_policy = AsyncRetry(predicate=_is_write_retryable) + + strategy = _WriteResumptionStrategy() + buffer = io.BytesIO(data) + attempt_count = 0 + + def send_and_recv_generator( + requests: List[BidiWriteObjectRequest], + state: dict[str, _WriteState], + metadata: Optional[List[Tuple[str, str]]] = None, + ): + async def generator(): + nonlocal attempt_count + nonlocal requests + attempt_count += 1 + resp = None + write_state = state["write_state"] + # If this is a retry or redirect, we must re-open the stream + if attempt_count > 1 or write_state.routing_token: + logger.info( + f"Re-opening the stream with attempt_count: {attempt_count}" + ) + if self.write_obj_stream and self.write_obj_stream.is_stream_open: + await self.write_obj_stream.close() + + current_metadata = list(metadata) if metadata else [] + if write_state.routing_token: + current_metadata.append( + ( + "x-goog-request-params", + f"routing_token={write_state.routing_token}", + ) + ) + self._routing_token = write_state.routing_token + + self._is_stream_open = False + await self.open(metadata=current_metadata) + + write_state.persisted_size = self.persisted_size + write_state.write_handle = self.write_handle + write_state.routing_token = None + + write_state.user_buffer.seek(write_state.persisted_size) + write_state.bytes_sent = write_state.persisted_size + write_state.bytes_since_last_flush = 0 + + requests = strategy.generate_requests(state) + + num_requests = len(requests) + for i, chunk_req in enumerate(requests): + if i == num_requests - 1: + chunk_req.state_lookup = True + chunk_req.flush = True + await self.write_obj_stream.send(chunk_req) + + resp = await self.write_obj_stream.recv() + if resp: + if resp.persisted_size is not None: + self.persisted_size = resp.persisted_size + state["write_state"].persisted_size = resp.persisted_size + self.offset = self.persisted_size + if resp.write_handle: + self.write_handle = resp.write_handle + state["write_state"].write_handle = resp.write_handle + self.bytes_appended_since_last_flush = 0 + + yield resp + + return generator() + + # State initialization + write_state = _WriteState(_MAX_CHUNK_SIZE_BYTES, buffer, self.flush_interval) + write_state.write_handle = self.write_handle + write_state.persisted_size = self.persisted_size + write_state.bytes_sent = self.persisted_size + write_state.bytes_since_last_flush = self.bytes_appended_since_last_flush + + retry_manager = _BidiStreamRetryManager( + _WriteResumptionStrategy(), + lambda r, s: send_and_recv_generator(r, s, metadata), + ) + await retry_manager.execute({"write_state": write_state}, retry_policy) - if is_last_chunk: - response = await self.write_obj_stream.recv() - _utils.update_write_handle_if_exists(self, response) - self.persisted_size = response.persisted_size - self.offset = self.persisted_size - self.bytes_appended_since_last_flush = 0 - start_idx = end_idx + # Sync local markers + self.write_obj_stream.persisted_size = write_state.persisted_size + self.write_obj_stream.write_handle = write_state.write_handle + self.bytes_appended_since_last_flush = write_state.bytes_since_last_flush + self.persisted_size = write_state.persisted_size + self.offset = write_state.persisted_size async def simple_flush(self) -> None: """Flushes the data to the server. @@ -277,6 +474,7 @@ async def simple_flush(self) -> None: flush=True, ) ) + self.bytes_appended_since_last_flush = 0 async def flush(self) -> int: """Flushes the data to the server. @@ -297,9 +495,9 @@ async def flush(self) -> int: ) ) response = await self.write_obj_stream.recv() - _utils.update_write_handle_if_exists(self, response) self.persisted_size = response.persisted_size self.offset = self.persisted_size + self.bytes_appended_since_last_flush = 0 return self.persisted_size async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object]: @@ -354,7 +552,6 @@ async def finalize(self) -> _storage_v2.Object: _storage_v2.BidiWriteObjectRequest(finish_write=True) ) response = await self.write_obj_stream.recv() - _utils.update_write_handle_if_exists(self, response) self.object_resource = response.resource self.persisted_size = self.object_resource.size await self.write_obj_stream.close() diff --git a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py index b455b1c29..e985f2252 100644 --- a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py +++ b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py @@ -42,6 +42,7 @@ class AsyncGrpcClient: (Optional) Whether to attempt to use DirectPath for gRPC connections. Defaults to ``True``. """ + def __init__( self, credentials=None, diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 66a9f0057..1d1c63efd 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -493,4 +493,4 @@ async def close(self): @property def is_stream_open(self) -> bool: - return self._is_stream_open \ No newline at end of file + return self._is_stream_open diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index 15772da87..b59c7d162 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -195,4 +195,4 @@ async def recv(self) -> _storage_v2.BidiReadObjectResponse: @property def is_stream_open(self) -> bool: - return self._is_stream_open \ No newline at end of file + return self._is_stream_open diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index 682438dea..b73a43d1b 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -21,9 +21,9 @@ if you want to use these Rapid Storage APIs. """ -from typing import Optional -from . import _utils +from typing import List, Optional, Tuple from google.cloud import _storage_v2 +from google.cloud.storage._experimental.asyncio import _utils from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( _AsyncAbstractObjectStream, @@ -72,6 +72,7 @@ def __init__( object_name: str, generation_number: Optional[int] = None, # None means new object write_handle: Optional[_storage_v2.BidiWriteHandle] = None, + routing_token: Optional[str] = None, ) -> None: if client is None: raise ValueError("client must be provided") @@ -87,6 +88,7 @@ def __init__( ) self.client: AsyncGrpcClient.grpc_client = client self.write_handle: Optional[_storage_v2.BidiWriteHandle] = write_handle + self.routing_token: Optional[str] = routing_token self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" @@ -101,7 +103,7 @@ def __init__( self.persisted_size = 0 self.object_resource: Optional[_storage_v2.Object] = None - async def open(self) -> None: + async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: """ Opens the bidi-gRPC connection to write to the object. @@ -110,7 +112,7 @@ async def open(self) -> None: :rtype: None :raises ValueError: If the stream is already open. - :raises google.api_core.exceptions.FailedPrecondition: + :raises google.api_core.exceptions.FailedPrecondition: if `generation_number` is 0 and object already exists. """ if self._is_stream_open: @@ -121,9 +123,6 @@ async def open(self) -> None: # Created object type would be Appendable Object. # if `generation_number` == 0 new object will be created only if there # isn't any existing object. - is_open_via_write_handle = ( - self.write_handle is not None and self.generation_number - ) if self.generation_number is None or self.generation_number == 0: self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( write_object_spec=_storage_v2.WriteObjectSpec( @@ -140,44 +139,46 @@ async def open(self) -> None: bucket=self._full_bucket_name, object=self.object_name, generation=self.generation_number, - write_handle=self.write_handle, + write_handle=self.write_handle if self.write_handle else None, + routing_token=self.routing_token if self.routing_token else None, ), ) + + request_param_values = [f"bucket={self._full_bucket_name}"] + final_metadata = [] + if metadata: + for key, value in metadata: + if key == "x-goog-request-params": + request_param_values.append(value) + else: + final_metadata.append((key, value)) + + final_metadata.append(("x-goog-request-params", ",".join(request_param_values))) + self.socket_like_rpc = AsyncBidiRpc( - self.rpc, initial_request=self.first_bidi_write_req, metadata=self.metadata + self.rpc, + initial_request=self.first_bidi_write_req, + metadata=final_metadata, ) await self.socket_like_rpc.open() # this is actually 1 send response = await self.socket_like_rpc.recv() self._is_stream_open = True - if is_open_via_write_handle: - # Don't use if not response.persisted_size because this will be true - # if persisted_size==0 (0 is considered "Falsy" in Python) - if response.persisted_size is None: - raise ValueError( - "Failed to obtain persisted_size after opening the stream via write_handle" - ) + + if response.persisted_size: self.persisted_size = response.persisted_size - else: - if not response.resource: - raise ValueError( - "Failed to obtain object resource after opening the stream" - ) - if not response.resource.generation: - raise ValueError( - "Failed to obtain object generation after opening the stream" - ) + + if response.resource: if not response.resource.size: # Appending to a 0 byte appendable object. self.persisted_size = 0 else: self.persisted_size = response.resource.size - if not response.write_handle: - raise ValueError("Failed to obtain write_handle after opening the stream") + self.generation_number = response.resource.generation - self.generation_number = response.resource.generation - self.write_handle = response.write_handle + if response.write_handle: + self.write_handle = response.write_handle async def close(self) -> None: """Closes the bidi-gRPC connection.""" @@ -220,7 +221,14 @@ async def recv(self) -> _storage_v2.BidiWriteObjectResponse: if not self._is_stream_open: raise ValueError("Stream is not open") response = await self.socket_like_rpc.recv() - _utils.update_write_handle_if_exists(self, response) + # Update write_handle if present in response + if response: + if response.write_handle: + self.write_handle = response.write_handle + if response.persisted_size is not None: + self.persisted_size = response.persisted_size + if response.resource and response.resource.size: + self.persisted_size = response.resource.size return response @property diff --git a/google/cloud/storage/_experimental/asyncio/retry/_helpers.py b/google/cloud/storage/_experimental/asyncio/retry/_helpers.py index 627bf5944..d9ad2462e 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/_helpers.py +++ b/google/cloud/storage/_experimental/asyncio/retry/_helpers.py @@ -18,12 +18,19 @@ from typing import Tuple, Optional from google.api_core import exceptions -from google.cloud._storage_v2.types import BidiReadObjectRedirectedError +from google.cloud._storage_v2.types import ( + BidiReadObjectRedirectedError, + BidiWriteObjectRedirectedError, +) from google.rpc import status_pb2 _BIDI_READ_REDIRECTED_TYPE_URL = ( "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" ) +_BIDI_WRITE_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" +) +logger = logging.getLogger(__name__) def _handle_redirect( @@ -78,6 +85,41 @@ def _handle_redirect( read_handle = redirect_proto.read_handle break except Exception as e: - logging.ERROR(f"Error unpacking redirect: {e}") + logger.error(f"Error unpacking redirect: {e}") return routing_token, read_handle + + +def _extract_bidi_writes_redirect_proto(exc: Exception): + grpc_error = None + if isinstance(exc, exceptions.Aborted) and exc.errors: + grpc_error = exc.errors[0] + + if grpc_error: + if isinstance(grpc_error, BidiWriteObjectRedirectedError): + return grpc_error + + if hasattr(grpc_error, "trailing_metadata"): + trailers = grpc_error.trailing_metadata() + if not trailers: + return + + status_details_bin = None + for key, value in trailers: + if key == "grpc-status-details-bin": + status_details_bin = value + break + + if status_details_bin: + status_proto = status_pb2.Status() + try: + status_proto.ParseFromString(status_details_bin) + for detail in status_proto.details: + if detail.type_url == _BIDI_WRITE_REDIRECTED_TYPE_URL: + redirect_proto = BidiWriteObjectRedirectedError.deserialize( + detail.value + ) + return redirect_proto + except Exception: + logger.error("Error unpacking redirect details from gRPC error.") + pass diff --git a/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py index c6ae36339..09b22cb8e 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Dict, IO, Iterable, Optional, Union +from typing import Any, Dict, IO, List, Optional, Union import google_crc32c from google.cloud._storage_v2.types import storage as storage_type @@ -20,32 +20,36 @@ from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( _BaseResumptionStrategy, ) +from google.cloud.storage._experimental.asyncio.retry._helpers import ( + _extract_bidi_writes_redirect_proto, +) class _WriteState: """A helper class to track the state of a single upload operation. - :type spec: :class:`google.cloud.storage_v2.types.AppendObjectSpec` - :param spec: The specification for the object to write. - :type chunk_size: int :param chunk_size: The size of chunks to write to the server. :type user_buffer: IO[bytes] :param user_buffer: The data source. + + :type flush_interval: int + :param flush_interval: The flush interval at which the data is flushed. """ def __init__( self, - spec: Union[storage_type.AppendObjectSpec, storage_type.WriteObjectSpec], chunk_size: int, user_buffer: IO[bytes], + flush_interval: int, ): - self.spec = spec self.chunk_size = chunk_size self.user_buffer = user_buffer self.persisted_size: int = 0 self.bytes_sent: int = 0 + self.bytes_since_last_flush: int = 0 + self.flush_interval: int = flush_interval self.write_handle: Union[bytes, storage_type.BidiWriteHandle, None] = None self.routing_token: Optional[str] = None self.is_finalized: bool = False @@ -56,31 +60,14 @@ class _WriteResumptionStrategy(_BaseResumptionStrategy): def generate_requests( self, state: Dict[str, Any] - ) -> Iterable[storage_type.BidiWriteObjectRequest]: + ) -> List[storage_type.BidiWriteObjectRequest]: """Generates BidiWriteObjectRequests to resume or continue the upload. - For Appendable Objects, every stream opening should send an - AppendObjectSpec. If resuming, the `write_handle` is added to that spec. - This method is not applicable for `open` methods. """ write_state: _WriteState = state["write_state"] - initial_request = storage_type.BidiWriteObjectRequest() - - # Determine if we need to send WriteObjectSpec or AppendObjectSpec - if isinstance(write_state.spec, storage_type.WriteObjectSpec): - initial_request.write_object_spec = write_state.spec - else: - if write_state.write_handle: - write_state.spec.write_handle = write_state.write_handle - - if write_state.routing_token: - write_state.spec.routing_token = write_state.routing_token - initial_request.append_object_spec = write_state.spec - - yield initial_request - + requests = [] # The buffer should already be seeked to the correct position (persisted_size) # by the `recover_state_on_failure` method before this is called. while not write_state.is_finalized: @@ -88,7 +75,7 @@ def generate_requests( # End of File detection if not chunk: - return + break checksummed_data = storage_type.ChecksummedData(content=chunk) checksum = google_crc32c.Checksum(chunk) @@ -98,16 +85,25 @@ def generate_requests( write_offset=write_state.bytes_sent, checksummed_data=checksummed_data, ) - write_state.bytes_sent += len(chunk) + chunk_len = len(chunk) + write_state.bytes_sent += chunk_len + write_state.bytes_since_last_flush += chunk_len + + if write_state.bytes_since_last_flush >= write_state.flush_interval: + request.flush = True + # reset counter after marking flush + write_state.bytes_since_last_flush = 0 - yield request + requests.append(request) + return requests def update_state_from_response( self, response: storage_type.BidiWriteObjectResponse, state: Dict[str, Any] ) -> None: """Processes a server response and updates the write state.""" write_state: _WriteState = state["write_state"] - + if response is None: + return if response.persisted_size: write_state.persisted_size = response.persisted_size @@ -129,18 +125,23 @@ async def recover_state_on_failure( last confirmed 'persisted_size' from the server. """ write_state: _WriteState = state["write_state"] - cause = getattr(error, "cause", error) - # Extract routing token and potentially a new write handle for redirection. - if isinstance(cause, BidiWriteObjectRedirectedError): - if cause.routing_token: - write_state.routing_token = cause.routing_token + redirect_proto = None - redirect_handle = getattr(cause, "write_handle", None) - if redirect_handle: - write_state.write_handle = redirect_handle + if isinstance(error, BidiWriteObjectRedirectedError): + redirect_proto = error + else: + redirect_proto = _extract_bidi_writes_redirect_proto(error) + + # Extract routing token and potentially a new write handle for redirection. + if redirect_proto: + if redirect_proto.routing_token: + write_state.routing_token = redirect_proto.routing_token + if redirect_proto.write_handle: + write_state.write_handle = redirect_proto.write_handle # We must assume any data sent beyond 'persisted_size' was lost. # Reset the user buffer to the last known good byte confirmed by the server. write_state.user_buffer.seek(write_state.persisted_size) write_state.bytes_sent = write_state.persisted_size + write_state.bytes_since_last_flush = 0 diff --git a/tests/conformance/test_bidi_writes.py b/tests/conformance/test_bidi_writes.py new file mode 100644 index 000000000..90dfaf5f8 --- /dev/null +++ b/tests/conformance/test_bidi_writes.py @@ -0,0 +1,267 @@ +import asyncio +import uuid +import grpc +import requests + +from google.api_core import exceptions +from google.auth import credentials as auth_credentials +from google.cloud import _storage_v2 as storage_v2 + +from google.api_core.retry_async import AsyncRetry +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) + +# --- Configuration --- +PROJECT_NUMBER = "12345" # A dummy project number is fine for the testbench. +GRPC_ENDPOINT = "localhost:8888" +HTTP_ENDPOINT = "http://localhost:9000" +CONTENT = b"A" * 1024 * 10 # 10 KB + + +def _is_retryable(exc): + return isinstance( + exc, + ( + exceptions.InternalServerError, + exceptions.ServiceUnavailable, + exceptions.DeadlineExceeded, + exceptions.TooManyRequests, + exceptions.Aborted, # For Redirects + ), + ) + + +async def run_test_scenario( + gapic_client, + http_client, + bucket_name, + object_name, + scenario, +): + """Runs a single fault-injection test scenario.""" + print(f"\n--- RUNNING SCENARIO: {scenario['name']} ---") + retry_count = 0 + + def on_retry_error(exc): + nonlocal retry_count + retry_count += 1 + print(f"Retry attempt {retry_count} triggered by: {type(exc).__name__}") + + custom_retry = AsyncRetry( + predicate=_is_retryable, + on_error=on_retry_error, + initial=0.1, # Short backoff for fast tests + multiplier=1.0, + ) + + use_default = scenario.get("use_default_policy", False) + policy_to_pass = None if use_default else custom_retry + + retry_test_id = None + try: + # 1. Create a Retry Test resource on the testbench. + retry_test_config = { + "instructions": {scenario["method"]: [scenario["instruction"]]}, + "transport": "GRPC", + } + resp = http_client.post(f"{HTTP_ENDPOINT}/retry_test", json=retry_test_config) + resp.raise_for_status() + retry_test_id = resp.json()["id"] + + # 2. Set up writer and metadata for fault injection. + writer = AsyncAppendableObjectWriter( + gapic_client, + bucket_name, + object_name, + ) + fault_injection_metadata = (("x-retry-test-id", retry_test_id),) + + # 3. Execute the write and assert the outcome. + try: + await writer.open( + metadata=fault_injection_metadata, retry_policy=policy_to_pass + ) + await writer.append( + CONTENT, metadata=fault_injection_metadata, retry_policy=policy_to_pass + ) + # await writer.finalize() + await writer.close(finalize_on_close=True) + + # If an exception was expected, this line should not be reached. + if scenario["expected_error"] is not None: + raise AssertionError( + f"Expected exception {scenario['expected_error']} was not raised." + ) + + # 4. Verify the object content. + read_request = storage_v2.ReadObjectRequest( + bucket=f"projects/_/buckets/{bucket_name}", + object=object_name, + ) + read_stream = await gapic_client.read_object(request=read_request) + data = b"" + async for chunk in read_stream: + data += chunk.checksummed_data.content + assert data == CONTENT + if scenario["expected_error"] is None: + # Scenarios like 503, 500, smarter resumption, and redirects + # SHOULD trigger at least one retry attempt. + if not use_default: + assert ( + retry_count > 0 + ), f"Test passed but no retry was actually triggered for {scenario['name']}!" + else: + print("Successfully recovered using library's default policy.") + print(f"Success: {scenario['name']}") + + except Exception as e: + if scenario["expected_error"] is None or not isinstance( + e, scenario["expected_error"] + ): + raise + + if not use_default: + assert ( + retry_count == 0 + ), f"Retry was incorrectly triggered for non-retriable error in {scenario['name']}!" + print(f"Success: caught expected exception for {scenario['name']}: {e}") + + finally: + # 5. Clean up the Retry Test resource. + if retry_test_id: + http_client.delete(f"{HTTP_ENDPOINT}/retry_test/{retry_test_id}") + + +async def main(): + """Main function to set up resources and run all test scenarios.""" + channel = grpc.aio.insecure_channel(GRPC_ENDPOINT) + creds = auth_credentials.AnonymousCredentials() + transport = storage_v2.services.storage.transports.StorageGrpcAsyncIOTransport( + channel=channel, + credentials=creds, + ) + gapic_client = storage_v2.StorageAsyncClient(transport=transport) + http_client = requests.Session() + + bucket_name = f"grpc-test-bucket-{uuid.uuid4().hex[:8]}" + object_name_prefix = "retry-test-object-" + + # Define all test scenarios + test_scenarios = [ + { + "name": "Retry on Service Unavailable (503)", + "method": "storage.objects.insert", + "instruction": "return-503", + "expected_error": None, + }, + { + "name": "Retry on 500", + "method": "storage.objects.insert", + "instruction": "return-500", + "expected_error": None, + }, + { + "name": "Retry on 504", + "method": "storage.objects.insert", + "instruction": "return-504", + "expected_error": None, + }, + { + "name": "Retry on 429", + "method": "storage.objects.insert", + "instruction": "return-429", + "expected_error": None, + }, + { + "name": "Smarter Resumption: Retry 503 after partial data", + "method": "storage.objects.insert", + "instruction": "return-503-after-2K", + "expected_error": None, + }, + { + "name": "Retry on BidiWriteObjectRedirectedError", + "method": "storage.objects.insert", + "instruction": "redirect-send-handle-and-token-tokenval", + "expected_error": None, + }, + { + "name": "Fail on 401", + "method": "storage.objects.insert", + "instruction": "return-401", + "expected_error": exceptions.Unauthorized, + }, + { + "name": "Default Policy: Retry on 503", + "method": "storage.objects.insert", + "instruction": "return-503", + "expected_error": None, + "use_default_policy": True, + }, + { + "name": "Default Policy: Retry on 503", + "method": "storage.objects.insert", + "instruction": "return-500", + "expected_error": None, + "use_default_policy": True, + }, + { + "name": "Default Policy: Retry on BidiWriteObjectRedirectedError", + "method": "storage.objects.insert", + "instruction": "redirect-send-handle-and-token-tokenval", + "expected_error": None, + "use_default_policy": True, + }, + { + "name": "Default Policy: Smarter Ressumption", + "method": "storage.objects.insert", + "instruction": "return-503-after-2K", + "expected_error": None, + "use_default_policy": True, + }, + ] + + try: + bucket_resource = storage_v2.Bucket(project=f"projects/{PROJECT_NUMBER}") + create_bucket_request = storage_v2.CreateBucketRequest( + parent="projects/_", bucket_id=bucket_name, bucket=bucket_resource + ) + await gapic_client.create_bucket(request=create_bucket_request) + + for i, scenario in enumerate(test_scenarios): + object_name = f"{object_name_prefix}{i}" + await run_test_scenario( + gapic_client, + http_client, + bucket_name, + object_name, + scenario, + ) + + except Exception: + import traceback + + traceback.print_exc() + finally: + # Clean up the test bucket. + try: + list_objects_req = storage_v2.ListObjectsRequest( + parent=f"projects/_/buckets/{bucket_name}", + ) + list_objects_res = await gapic_client.list_objects(request=list_objects_req) + async for obj in list_objects_res: + delete_object_req = storage_v2.DeleteObjectRequest( + bucket=f"projects/_/buckets/{bucket_name}", object=obj.name + ) + await gapic_client.delete_object(request=delete_object_req) + + delete_bucket_req = storage_v2.DeleteBucketRequest( + name=f"projects/_/buckets/{bucket_name}" + ) + await gapic_client.delete_bucket(request=delete_bucket_req) + except Exception as e: + print(f"Warning: Cleanup failed: {e}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/tests/perf/microbenchmarks/_utils.py b/tests/perf/microbenchmarks/_utils.py index b2589f2ac..ff29b8783 100644 --- a/tests/perf/microbenchmarks/_utils.py +++ b/tests/perf/microbenchmarks/_utils.py @@ -43,7 +43,7 @@ def publish_benchmark_extra_info( object_size = params.file_size_bytes num_files = params.num_files - total_uploaded_mib = (object_size / (1024 * 1024) * num_files) + total_uploaded_mib = object_size / (1024 * 1024) * num_files min_throughput = total_uploaded_mib / benchmark.stats["max"] max_throughput = total_uploaded_mib / benchmark.stats["min"] mean_throughput = total_uploaded_mib / benchmark.stats["mean"] @@ -80,8 +80,8 @@ def publish_benchmark_extra_info( # Get benchmark name, rounds, and iterations name = benchmark.name - rounds = benchmark.stats['rounds'] - iterations = benchmark.stats['iterations'] + rounds = benchmark.stats["rounds"] + iterations = benchmark.stats["iterations"] # Header for throughput table header = "\n\n" + "-" * 125 + "\n" @@ -98,13 +98,15 @@ def publish_benchmark_extra_info( print(row) print("-" * 125) + class RandomBytesIO(io.RawIOBase): """ A file-like object that generates random bytes using os.urandom. It enforces a fixed size and an upper safety cap. """ + # 10 GiB default safety cap - DEFAULT_CAP = 10 * 1024 * 1024 * 1024 + DEFAULT_CAP = 10 * 1024 * 1024 * 1024 def __init__(self, size, max_size=DEFAULT_CAP): """ @@ -114,9 +116,11 @@ def __init__(self, size, max_size=DEFAULT_CAP): """ if size is None: raise ValueError("Size must be defined (cannot be infinite).") - + if size > max_size: - raise ValueError(f"Requested size {size} exceeds the maximum limit of {max_size} bytes (10 GiB).") + raise ValueError( + f"Requested size {size} exceeds the maximum limit of {max_size} bytes (10 GiB)." + ) self._size = size self._pos = 0 @@ -125,15 +129,15 @@ def read(self, n=-1): # 1. Handle "read all" (n=-1) if n is None or n < 0: n = self._size - self._pos - + # 2. Handle EOF (End of File) if self._pos >= self._size: return b"" - + # 3. Clamp read amount to remaining size # This ensures we stop exactly at `size` bytes. n = min(n, self._size - self._pos) - + # 4. Generate data data = os.urandom(n) self._pos += len(data) diff --git a/tests/perf/microbenchmarks/conftest.py b/tests/perf/microbenchmarks/conftest.py index f66f9bf6c..8caf4d656 100644 --- a/tests/perf/microbenchmarks/conftest.py +++ b/tests/perf/microbenchmarks/conftest.py @@ -49,6 +49,7 @@ def storage_client(): with contextlib.closing(client): yield client + @pytest.fixture def monitor(): """ @@ -57,6 +58,7 @@ def monitor(): """ return ResourceMonitor + def publish_resource_metrics(benchmark: Any, monitor: ResourceMonitor) -> None: """ Helper function to publish resource monitor results to the extra_info property. @@ -73,10 +75,13 @@ def publish_resource_metrics(benchmark: Any, monitor: ResourceMonitor) -> None: async def upload_appendable_object(bucket_name, object_name, object_size, chunk_size): # flush interval set to little over 1GiB to minimize number of flushes. - # this method is to write "appendable" objects which will be used for + # this method is to write "appendable" objects which will be used for # benchmarking reads, hence not concerned performance of writes here. writer = AsyncAppendableObjectWriter( - AsyncGrpcClient().grpc_client, bucket_name, object_name, writer_options={"FLUSH_INTERVAL_BYTES": 1026 * 1024 ** 2} + AsyncGrpcClient().grpc_client, + bucket_name, + object_name, + writer_options={"FLUSH_INTERVAL_BYTES": 1026 * 1024**2}, ) await writer.open() uploaded_bytes = 0 @@ -106,11 +111,15 @@ def _upload_worker(args): upload_appendable_object(bucket_name, object_name, object_size, chunk_size) ) else: - uploaded_bytes = upload_simple_object(bucket_name, object_name, object_size, chunk_size) + uploaded_bytes = upload_simple_object( + bucket_name, object_name, object_size, chunk_size + ) return object_name, uploaded_bytes -def _create_files(num_files, bucket_name, bucket_type, object_size, chunk_size=1024 * 1024 * 1024): +def _create_files( + num_files, bucket_name, bucket_type, object_size, chunk_size=1024 * 1024 * 1024 +): """ Create/Upload objects for benchmarking and return a list of their names. """ @@ -148,4 +157,4 @@ def workload_params(request): params.bucket_type, params.file_size_bytes, ) - return params, files_names \ No newline at end of file + return params, files_names diff --git a/tests/perf/microbenchmarks/reads/config.py b/tests/perf/microbenchmarks/reads/config.py index b9cfb1a92..7d83e3f8e 100644 --- a/tests/perf/microbenchmarks/reads/config.py +++ b/tests/perf/microbenchmarks/reads/config.py @@ -54,8 +54,13 @@ def _get_params() -> Dict[str, List[ReadParameters]]: rounds = common_params["rounds"] bucket_map = { - "zonal": os.environ.get("DEFAULT_RAPID_ZONAL_BUCKET", config['defaults']['DEFAULT_RAPID_ZONAL_BUCKET']), - "regional": os.environ.get("DEFAULT_STANDARD_BUCKET", config['defaults']['DEFAULT_STANDARD_BUCKET']) + "zonal": os.environ.get( + "DEFAULT_RAPID_ZONAL_BUCKET", + config["defaults"]["DEFAULT_RAPID_ZONAL_BUCKET"], + ), + "regional": os.environ.get( + "DEFAULT_STANDARD_BUCKET", config["defaults"]["DEFAULT_STANDARD_BUCKET"] + ), } for workload in config["workload"]: diff --git a/tests/perf/microbenchmarks/reads/test_reads.py b/tests/perf/microbenchmarks/reads/test_reads.py index 81f180d75..13a0a49b3 100644 --- a/tests/perf/microbenchmarks/reads/test_reads.py +++ b/tests/perf/microbenchmarks/reads/test_reads.py @@ -180,6 +180,7 @@ def download_files_using_mrd_multi_coro(loop, client, files, other_params, chunk Returns: float: The maximum latency (in seconds) among all coroutines. """ + async def main(): if len(files) == 1: result = await download_chunks_using_mrd_async( @@ -356,8 +357,7 @@ def download_files_mp_mc_wrapper(files_names, params, chunks, bucket_type): @pytest.mark.parametrize( "workload_params", - all_params["read_seq_multi_process"] + - all_params["read_rand_multi_process"], + all_params["read_seq_multi_process"] + all_params["read_rand_multi_process"], indirect=True, ids=lambda p: p.name, ) @@ -412,4 +412,4 @@ def target_wrapper(*args, **kwargs): blobs_to_delete.extend( storage_client.bucket(params.bucket_name).blob(f) for f in files_names - ) \ No newline at end of file + ) diff --git a/tests/perf/microbenchmarks/resource_monitor.py b/tests/perf/microbenchmarks/resource_monitor.py index be6ae7025..8ad2a27b7 100644 --- a/tests/perf/microbenchmarks/resource_monitor.py +++ b/tests/perf/microbenchmarks/resource_monitor.py @@ -96,4 +96,4 @@ def throughput_mb_s(self): """Calculates combined network throughput.""" if self.duration <= 0: return 0.0 - return (self.net_sent_mb + self.net_recv_mb) / self.duration \ No newline at end of file + return (self.net_sent_mb + self.net_recv_mb) / self.duration diff --git a/tests/perf/microbenchmarks/writes/config.py b/tests/perf/microbenchmarks/writes/config.py index bc1548511..d823260f9 100644 --- a/tests/perf/microbenchmarks/writes/config.py +++ b/tests/perf/microbenchmarks/writes/config.py @@ -48,8 +48,13 @@ def get_write_params() -> Dict[str, List[WriteParameters]]: rounds = common_params["rounds"] bucket_map = { - "zonal": os.environ.get("DEFAULT_RAPID_ZONAL_BUCKET", config['defaults']['DEFAULT_RAPID_ZONAL_BUCKET']), - "regional": os.environ.get("DEFAULT_STANDARD_BUCKET", config['defaults']['DEFAULT_STANDARD_BUCKET']) + "zonal": os.environ.get( + "DEFAULT_RAPID_ZONAL_BUCKET", + config["defaults"]["DEFAULT_RAPID_ZONAL_BUCKET"], + ), + "regional": os.environ.get( + "DEFAULT_STANDARD_BUCKET", config["defaults"]["DEFAULT_STANDARD_BUCKET"] + ), } for workload in config["workload"]: diff --git a/tests/perf/microbenchmarks/writes/test_writes.py b/tests/perf/microbenchmarks/writes/test_writes.py index 2b3c57abd..d952b1f87 100644 --- a/tests/perf/microbenchmarks/writes/test_writes.py +++ b/tests/perf/microbenchmarks/writes/test_writes.py @@ -31,9 +31,14 @@ import pytest from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import AsyncAppendableObjectWriter +from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) -from tests.perf.microbenchmarks._utils import publish_benchmark_extra_info, RandomBytesIO +from tests.perf.microbenchmarks._utils import ( + publish_benchmark_extra_info, + RandomBytesIO, +) from tests.perf.microbenchmarks.conftest import publish_resource_metrics import tests.perf.microbenchmarks.writes.config as config from google.cloud import storage @@ -41,10 +46,12 @@ # Get write parameters all_params = config.get_write_params() + async def create_client(): """Initializes async client and gets the current event loop.""" return AsyncGrpcClient().grpc_client + async def upload_chunks_using_grpc_async(client, filename, other_params): """Uploads a file in chunks using the gRPC API asynchronously. @@ -81,6 +88,7 @@ async def upload_chunks_using_grpc_async(client, filename, other_params): elapsed_time = end_time - start_time return elapsed_time / 1_000_000_000 + def upload_chunks_using_grpc(loop, client, filename, other_params): """Wrapper to run the async gRPC upload in a synchronous context. @@ -97,6 +105,7 @@ def upload_chunks_using_grpc(loop, client, filename, other_params): upload_chunks_using_grpc_async(client, filename, other_params) ) + def upload_using_json(_, json_client, filename, other_params): """Uploads a file using the JSON API. @@ -124,6 +133,7 @@ def upload_using_json(_, json_client, filename, other_params): elapsed_time = end_time - start_time return elapsed_time / 1_000_000_000 + @pytest.mark.parametrize( "workload_params", all_params["write_seq"], @@ -179,13 +189,16 @@ def target_wrapper(*args, **kwargs): task.cancel() loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) loop.close() - publish_benchmark_extra_info(benchmark, params, benchmark_group="write", true_times=output_times) + publish_benchmark_extra_info( + benchmark, params, benchmark_group="write", true_times=output_times + ) publish_resource_metrics(benchmark, m) blobs_to_delete.extend( storage_client.bucket(params.bucket_name).blob(f) for f in files_names ) + def upload_files_using_grpc_multi_coro(loop, client, files, other_params): """Uploads multiple files concurrently using gRPC with asyncio. @@ -198,17 +211,17 @@ def upload_files_using_grpc_multi_coro(loop, client, files, other_params): Returns: float: The maximum latency observed among all coroutines. """ + async def main(): tasks = [] for f in files: - tasks.append( - upload_chunks_using_grpc_async(client, f, other_params) - ) + tasks.append(upload_chunks_using_grpc_async(client, f, other_params)) return await asyncio.gather(*tasks) results = loop.run_until_complete(main()) return max(results) + def upload_files_using_json_multi_threaded(_, json_client, files, other_params): """Uploads multiple files concurrently using the JSON API with a ThreadPoolExecutor. @@ -235,6 +248,7 @@ def upload_files_using_json_multi_threaded(_, json_client, files, other_params): return max(results) + @pytest.mark.parametrize( "workload_params", all_params["write_seq_multi_coros"], @@ -292,13 +306,16 @@ def target_wrapper(*args, **kwargs): task.cancel() loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) loop.close() - publish_benchmark_extra_info(benchmark, params, benchmark_group="write", true_times=output_times) + publish_benchmark_extra_info( + benchmark, params, benchmark_group="write", true_times=output_times + ) publish_resource_metrics(benchmark, m) blobs_to_delete.extend( storage_client.bucket(params.bucket_name).blob(f) for f in files_names ) + def _upload_files_worker(files_to_upload, other_params, bucket_type): """A worker function for multi-processing uploads. @@ -330,12 +347,12 @@ def _upload_files_worker(files_to_upload, other_params, bucket_type): loop.close() return result else: # regional - json_client = storage.Client() return upload_files_using_json_multi_threaded( None, json_client, files_to_upload, other_params ) + def upload_files_mp_mc_wrapper(files_names, params): """Wrapper for multi-process, multi-coroutine uploads. @@ -370,6 +387,7 @@ def upload_files_mp_mc_wrapper(files_names, params): return max(results) + @pytest.mark.parametrize( "workload_params", all_params["write_seq_multi_process"], @@ -406,9 +424,11 @@ def target_wrapper(*args, **kwargs): ), ) finally: - publish_benchmark_extra_info(benchmark, params, benchmark_group="write", true_times=output_times) + publish_benchmark_extra_info( + benchmark, params, benchmark_group="write", true_times=output_times + ) publish_resource_metrics(benchmark, m) blobs_to_delete.extend( storage_client.bucket(params.bucket_name).blob(f) for f in files_names - ) \ No newline at end of file + ) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 0bd61ff53..40c84a2fb 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -49,7 +49,6 @@ def event_loop(): @pytest.fixture(scope="session") def grpc_clients(event_loop): - # grpc clients has to be instantiated in the event loop, # otherwise grpc creates it's own event loop and attaches to the client. # Which will lead to deadlock because client running in one event loop and diff --git a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py index 7d8b7934e..ce48e21c7 100644 --- a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py @@ -13,12 +13,13 @@ # limitations under the License. import io -import unittest import unittest.mock as mock from datetime import datetime import pytest import google_crc32c +from google.rpc import status_pb2 +from google.api_core import exceptions from google.cloud._storage_v2.types import storage as storage_type from google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy import ( @@ -28,136 +29,173 @@ from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError -class TestWriteResumptionStrategy(unittest.TestCase): - def _get_target_class(self): - return _WriteResumptionStrategy +@pytest.fixture +def strategy(): + """Fixture to provide a WriteResumptionStrategy instance.""" + return _WriteResumptionStrategy() - def _make_one(self, *args, **kwargs): - return self._get_target_class()(*args, **kwargs) - def test_ctor(self): - strategy = self._make_one() - self.assertIsInstance(strategy, self._get_target_class()) +class TestWriteResumptionStrategy: + """Test suite for WriteResumptionStrategy.""" - def test_generate_requests_initial_new_object(self): - """ - Verify the initial request sequence for a new upload (WriteObjectSpec). - """ - strategy = self._make_one() - mock_buffer = io.BytesIO(b"0123456789") - # Use WriteObjectSpec for new objects - mock_spec = storage_type.WriteObjectSpec( - resource=storage_type.Object(name="test-object") + # ------------------------------------------------------------------------- + # Tests for generate_requests + # ------------------------------------------------------------------------- + + def test_generate_requests_initial_chunking(self, strategy): + """Verify initial data generation starts at offset 0 and chunks correctly.""" + mock_buffer = io.BytesIO(b"abcdefghij") + write_state = _WriteState( + chunk_size=3, user_buffer=mock_buffer, flush_interval=10 ) - state = { - "write_state": _WriteState( - mock_spec, chunk_size=4, user_buffer=mock_buffer - ), - } + state = {"write_state": write_state} + + requests = strategy.generate_requests(state) + + # Expected: 4 requests (3, 3, 3, 1) + assert len(requests) == 4 - requests = list(strategy.generate_requests(state)) + # Verify Request 1 + assert requests[0].write_offset == 0 + assert requests[0].checksummed_data.content == b"abc" - # Check first request (Spec) - self.assertEqual(requests[0].write_object_spec, mock_spec) - self.assertFalse(requests[0].state_lookup) + # Verify Request 2 + assert requests[1].write_offset == 3 + assert requests[1].checksummed_data.content == b"def" - # Check data chunks - self.assertEqual(requests[1].write_offset, 0) - self.assertEqual(requests[1].checksummed_data.content, b"0123") - self.assertEqual(requests[2].write_offset, 4) - self.assertEqual(requests[2].checksummed_data.content, b"4567") - self.assertEqual(requests[3].write_offset, 8) - self.assertEqual(requests[3].checksummed_data.content, b"89") + # Verify Request 3 + assert requests[2].write_offset == 6 + assert requests[2].checksummed_data.content == b"ghi" - # Total requests: 1 Spec + 3 Chunks - self.assertEqual(len(requests), 4) + # Verify Request 4 + assert requests[3].write_offset == 9 + assert requests[3].checksummed_data.content == b"j" - def test_generate_requests_initial_existing_object(self): + def test_generate_requests_resumption(self, strategy): """ - Verify the initial request sequence for appending to an existing object (AppendObjectSpec). + Verify request generation when resuming. + The strategy should generate chunks starting from the current 'bytes_sent'. """ - strategy = self._make_one() - mock_buffer = io.BytesIO(b"0123") - # Use AppendObjectSpec for existing objects - mock_spec = storage_type.AppendObjectSpec( - object_="test-object", bucket="test-bucket" + mock_buffer = io.BytesIO(b"0123456789") + write_state = _WriteState( + chunk_size=4, user_buffer=mock_buffer, flush_interval=10 ) - state = { - "write_state": _WriteState( - mock_spec, chunk_size=4, user_buffer=mock_buffer - ), - } - requests = list(strategy.generate_requests(state)) + # Simulate resumption state: 4 bytes already sent/persisted + write_state.persisted_size = 4 + write_state.bytes_sent = 4 + # Buffer must be seeked to 4 before calling generate + mock_buffer.seek(4) - # Check first request (Spec) - self.assertEqual(requests[0].append_object_spec, mock_spec) - self.assertFalse(requests[0].state_lookup) + state = {"write_state": write_state} - # Check data chunk - self.assertEqual(requests[1].write_offset, 0) - self.assertEqual(requests[1].checksummed_data.content, b"0123") + requests = strategy.generate_requests(state) - def test_generate_requests_empty_file(self): - """ - Verify request sequence for an empty file. Should just be the Spec. - """ - strategy = self._make_one() + # Since 4 bytes are done, we expect remaining 6 bytes: [4 bytes, 2 bytes] + assert len(requests) == 2 + + # Check first generated request starts at offset 4 + assert requests[0].write_offset == 4 + assert requests[0].checksummed_data.content == b"4567" + + # Check second generated request starts at offset 8 + assert requests[1].write_offset == 8 + assert requests[1].checksummed_data.content == b"89" + + def test_generate_requests_empty_file(self, strategy): + """Verify request sequence for an empty file.""" mock_buffer = io.BytesIO(b"") - mock_spec = storage_type.AppendObjectSpec(object_="test-object") - state = { - "write_state": _WriteState( - mock_spec, chunk_size=4, user_buffer=mock_buffer - ), - } + write_state = _WriteState( + chunk_size=4, user_buffer=mock_buffer, flush_interval=10 + ) + state = {"write_state": write_state} - requests = list(strategy.generate_requests(state)) + requests = strategy.generate_requests(state) - self.assertEqual(len(requests), 1) - self.assertEqual(requests[0].append_object_spec, mock_spec) + assert len(requests) == 0 - def test_generate_requests_resumption(self): - """ - Verify request sequence when resuming an upload. - """ - strategy = self._make_one() - mock_buffer = io.BytesIO(b"0123456789") - mock_spec = storage_type.AppendObjectSpec(object_="test-object") + def test_generate_requests_checksum_verification(self, strategy): + """Verify CRC32C is calculated correctly for each chunk.""" + chunk_data = b"test_data" + mock_buffer = io.BytesIO(chunk_data) + write_state = _WriteState( + chunk_size=10, user_buffer=mock_buffer, flush_interval=10 + ) + state = {"write_state": write_state} - write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) - write_state.persisted_size = 4 - write_state.bytes_sent = 4 - write_state.write_handle = storage_type.BidiWriteHandle(handle=b"test-handle") - mock_buffer.seek(4) + requests = strategy.generate_requests(state) + + expected_crc = google_crc32c.Checksum(chunk_data).digest() + expected_int = int.from_bytes(expected_crc, "big") + assert requests[0].checksummed_data.crc32c == expected_int + + def test_generate_requests_flush_logic_exact_interval(self, strategy): + """Verify the flush bit is set exactly when the interval is reached.""" + mock_buffer = io.BytesIO(b"A" * 12) + # 2 byte chunks, flush every 4 bytes + write_state = _WriteState( + chunk_size=2, user_buffer=mock_buffer, flush_interval=4 + ) + state = {"write_state": write_state} + + requests = strategy.generate_requests(state) + + # Request index 1 (4 bytes total) should have flush=True + assert requests[0].flush is False + assert requests[1].flush is True + + # Request index 2 (8 bytes total) should have flush=True + assert requests[2].flush is False + assert requests[3].flush is True + + # Request index 3 (12 bytes total) should have flush=True + assert requests[4].flush is False + assert requests[5].flush is True + + # Verify counter reset in state + assert write_state.bytes_since_last_flush == 0 + def test_generate_requests_flush_logic_data_less_than_interval(self, strategy): + """Verify flush is not set if data sent is less than interval.""" + mock_buffer = io.BytesIO(b"A" * 5) + # Flush every 10 bytes + write_state = _WriteState( + chunk_size=2, user_buffer=mock_buffer, flush_interval=10 + ) state = {"write_state": write_state} - requests = list(strategy.generate_requests(state)) + requests = strategy.generate_requests(state) + + # Total 5 bytes < 10 bytes interval + for req in requests: + assert req.flush is False + + assert write_state.bytes_since_last_flush == 5 - # Check first request has handle and lookup - self.assertEqual( - requests[0].append_object_spec.write_handle.handle, b"test-handle" + def test_generate_requests_honors_finalized_state(self, strategy): + """If state is already finalized, no requests should be generated.""" + mock_buffer = io.BytesIO(b"data") + write_state = _WriteState( + chunk_size=4, user_buffer=mock_buffer, flush_interval=10 ) + write_state.is_finalized = True + state = {"write_state": write_state} - # Check data starts from offset 4 - self.assertEqual(requests[1].write_offset, 4) - self.assertEqual(requests[1].checksummed_data.content, b"4567") - self.assertEqual(requests[2].write_offset, 8) - self.assertEqual(requests[2].checksummed_data.content, b"89") + requests = strategy.generate_requests(state) + assert len(requests) == 0 @pytest.mark.asyncio - async def test_generate_requests_after_failure_and_recovery(self): + async def test_generate_requests_after_failure_and_recovery(self, strategy): """ - Verify recovery and resumption flow. + Verify recovery and resumption flow (Integration of recover + generate). """ - strategy = self._make_one() - mock_buffer = io.BytesIO(b"0123456789abcdef") - mock_spec = storage_type.AppendObjectSpec(object_="test-object") - state = { - "write_state": _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) - } - write_state = state["write_state"] + mock_buffer = io.BytesIO(b"0123456789abcdef") # 16 bytes + write_state = _WriteState( + chunk_size=4, user_buffer=mock_buffer, flush_interval=10 + ) + state = {"write_state": write_state} + # Simulate initial progress: sent 8 bytes write_state.bytes_sent = 8 mock_buffer.seek(8) @@ -169,122 +207,167 @@ async def test_generate_requests_after_failure_and_recovery(self): state, ) + # Simulate Failure Triggering Recovery await strategy.recover_state_on_failure(Exception("network error"), state) - self.assertEqual(mock_buffer.tell(), 4) - self.assertEqual(write_state.bytes_sent, 4) + # Assertions after recovery + # 1. Buffer should rewind to persisted_size (4) + assert mock_buffer.tell() == 4 + # 2. bytes_sent should track persisted_size (4) + assert write_state.bytes_sent == 4 - requests = list(strategy.generate_requests(state)) + requests = strategy.generate_requests(state) - self.assertTrue(requests[0].state_lookup) - self.assertEqual( - requests[0].append_object_spec.write_handle.handle, b"handle-1" - ) + # Remaining data from offset 4 to 16 (12 bytes total) + # Chunks: [4-8], [8-12], [12-16] + assert len(requests) == 3 - self.assertEqual(requests[1].write_offset, 4) - self.assertEqual(requests[1].checksummed_data.content, b"4567") + # Verify resumption offset + assert requests[0].write_offset == 4 + assert requests[0].checksummed_data.content == b"4567" - def test_update_state_from_response(self): - """Verify state updates from server responses.""" - strategy = self._make_one() - mock_buffer = io.BytesIO(b"0123456789") - mock_spec = storage_type.AppendObjectSpec(object_="test-object") - state = { - "write_state": _WriteState( - mock_spec, chunk_size=4, user_buffer=mock_buffer - ), - } - write_state = state["write_state"] + # ------------------------------------------------------------------------- + # Tests for update_state_from_response + # ------------------------------------------------------------------------- - response1 = storage_type.BidiWriteObjectResponse( - write_handle=storage_type.BidiWriteHandle(handle=b"handle-1") + def test_update_state_from_response_all_fields(self, strategy): + """Verify all fields from a BidiWriteObjectResponse update the state.""" + write_state = _WriteState( + chunk_size=4, user_buffer=io.BytesIO(), flush_interval=10 ) - strategy.update_state_from_response(response1, state) - self.assertEqual(write_state.write_handle.handle, b"handle-1") + state = {"write_state": write_state} - response2 = storage_type.BidiWriteObjectResponse(persisted_size=1024) - strategy.update_state_from_response(response2, state) - self.assertEqual(write_state.persisted_size, 1024) + # 1. Update persisted_size + strategy.update_state_from_response( + storage_type.BidiWriteObjectResponse(persisted_size=123), state + ) + assert write_state.persisted_size == 123 - final_resource = storage_type.Object( - name="test-object", bucket="b", size=2048, finalize_time=datetime.now() + # 2. Update write_handle + handle = storage_type.BidiWriteHandle(handle=b"new-handle") + strategy.update_state_from_response( + storage_type.BidiWriteObjectResponse(write_handle=handle), state ) - response3 = storage_type.BidiWriteObjectResponse(resource=final_resource) - strategy.update_state_from_response(response3, state) - self.assertEqual(write_state.persisted_size, 2048) - self.assertTrue(write_state.is_finalized) + assert write_state.write_handle == handle - @pytest.mark.asyncio - async def test_recover_state_on_failure_handles_redirect(self): - """ - Verify redirection error handling. - """ - strategy = self._make_one() - mock_buffer = mock.MagicMock(spec=io.BytesIO) - mock_spec = storage_type.AppendObjectSpec(object_="test-object") + # 3. Update from Resource (finalization) + resource = storage_type.Object(size=1000, finalize_time=datetime.now()) + strategy.update_state_from_response( + storage_type.BidiWriteObjectResponse(resource=resource), state + ) + assert write_state.persisted_size == 1000 + assert write_state.is_finalized - write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) + def test_update_state_from_response_none(self, strategy): + """Verify None response doesn't crash.""" + write_state = _WriteState( + chunk_size=4, user_buffer=io.BytesIO(), flush_interval=10 + ) state = {"write_state": write_state} + strategy.update_state_from_response(None, state) + assert write_state.persisted_size == 0 - redirect_error = BidiWriteObjectRedirectedError(routing_token="new-token-123") - wrapped_error = Exception("RPC error") - wrapped_error.cause = redirect_error - - await strategy.recover_state_on_failure(wrapped_error, state) - - self.assertEqual(write_state.routing_token, "new-token-123") - mock_buffer.seek.assert_called_with(0) + # ------------------------------------------------------------------------- + # Tests for recover_state_on_failure + # ------------------------------------------------------------------------- @pytest.mark.asyncio - async def test_recover_state_on_failure_handles_redirect_with_handle(self): - """Verify redirection that includes a write handle.""" - strategy = self._make_one() - mock_buffer = mock.MagicMock(spec=io.BytesIO) - mock_spec = storage_type.AppendObjectSpec(object_="test-object") + async def test_recover_state_on_failure_rewind_logic(self, strategy): + """Verify buffer seek and counter resets on generic failure (Non-redirect).""" + mock_buffer = io.BytesIO(b"0123456789") + write_state = _WriteState( + chunk_size=2, user_buffer=mock_buffer, flush_interval=100 + ) - write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) - state = {"write_state": write_state} + # Simulate progress: sent 8 bytes, but server only persisted 4 + write_state.bytes_sent = 8 + write_state.persisted_size = 4 + write_state.bytes_since_last_flush = 2 + mock_buffer.seek(8) - redirect_error = BidiWriteObjectRedirectedError( - routing_token="new-token-456", write_handle=b"redirect-handle" + # Simulate generic 503 error without trailers + await strategy.recover_state_on_failure( + exceptions.ServiceUnavailable("busy"), {"write_state": write_state} ) - wrapped_error = Exception("RPC error") - wrapped_error.cause = redirect_error - await strategy.recover_state_on_failure(wrapped_error, state) + # Buffer must be seeked back to 4 + assert mock_buffer.tell() == 4 + assert write_state.bytes_sent == 4 + # Flush counter must be reset to avoid incorrect firing after resume + assert write_state.bytes_since_last_flush == 0 - self.assertEqual(write_state.routing_token, "new-token-456") - self.assertEqual(write_state.write_handle, b"redirect-handle") + @pytest.mark.asyncio + async def test_recover_state_on_failure_direct_redirect(self, strategy): + """Verify handling when the error is a BidiWriteObjectRedirectedError.""" + write_state = _WriteState( + chunk_size=4, user_buffer=io.BytesIO(), flush_interval=100 + ) + state = {"write_state": write_state} - mock_buffer.seek.assert_called_with(0) + redirect = BidiWriteObjectRedirectedError( + routing_token="tok-1", + write_handle=storage_type.BidiWriteHandle(handle=b"h-1"), + ) - def test_generate_requests_sends_crc32c_checksum(self): - strategy = self._make_one() - mock_buffer = io.BytesIO(b"0123") - mock_spec = storage_type.AppendObjectSpec(object_="test-object") - state = { - "write_state": _WriteState( - mock_spec, chunk_size=4, user_buffer=mock_buffer - ), - } + await strategy.recover_state_on_failure(redirect, state) - requests = list(strategy.generate_requests(state)) + assert write_state.routing_token == "tok-1" + assert write_state.write_handle.handle == b"h-1" - expected_crc = google_crc32c.Checksum(b"0123") - expected_crc_int = int.from_bytes(expected_crc.digest(), "big") - self.assertEqual(requests[1].checksummed_data.crc32c, expected_crc_int) + @pytest.mark.asyncio + async def test_recover_state_on_failure_wrapped_redirect(self, strategy): + """Verify handling when RedirectedError is inside Aborted.errors.""" + write_state = _WriteState( + chunk_size=4, user_buffer=io.BytesIO(), flush_interval=10 + ) - def test_generate_requests_with_routing_token(self): - strategy = self._make_one() - mock_buffer = io.BytesIO(b"") - mock_spec = storage_type.AppendObjectSpec(object_="test-object") + redirect = BidiWriteObjectRedirectedError(routing_token="tok-wrapped") + # google-api-core Aborted often wraps multiple errors + error = exceptions.Aborted("conflict", errors=[redirect]) - write_state = _WriteState(mock_spec, chunk_size=4, user_buffer=mock_buffer) - write_state.routing_token = "redirected-token" - state = {"write_state": write_state} + await strategy.recover_state_on_failure(error, {"write_state": write_state}) + + assert write_state.routing_token == "tok-wrapped" - requests = list(strategy.generate_requests(state)) + @pytest.mark.asyncio + async def test_recover_state_on_failure_trailer_metadata_redirect(self, strategy): + """Verify complex parsing from 'grpc-status-details-bin' in trailers.""" + write_state = _WriteState( + chunk_size=4, user_buffer=io.BytesIO(), flush_interval=10 + ) - self.assertEqual( - requests[0].append_object_spec.routing_token, "redirected-token" + redirect_proto = BidiWriteObjectRedirectedError(routing_token="metadata-token") + status = status_pb2.Status() + detail = status.details.add() + detail.type_url = ( + "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" ) + detail.value = BidiWriteObjectRedirectedError.serialize(redirect_proto) + + # FIX: No spec= here, because Aborted doesn't have trailing_metadata in its base definition + mock_error = mock.MagicMock() + mock_error.errors = [] + mock_error.trailing_metadata.return_value = [ + ("grpc-status-details-bin", status.SerializeToString()) + ] + + with mock.patch( + "google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy._extract_bidi_writes_redirect_proto", + return_value=redirect_proto, + ): + await strategy.recover_state_on_failure( + mock_error, {"write_state": write_state} + ) + + assert write_state.routing_token == "metadata-token" + + def test_write_state_initialization(self): + """Verify WriteState starts with clean counters.""" + buffer = io.BytesIO(b"test") + ws = _WriteState(chunk_size=10, user_buffer=buffer, flush_interval=100) + + assert ws.persisted_size == 0 + assert ws.bytes_sent == 0 + assert ws.bytes_since_last_flush == 0 + assert ws.flush_interval == 100 + assert not ws.is_finalized diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 2a9747f28..abb26be7a 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -12,23 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -from io import BytesIO +import io +import unittest.mock as mock +from unittest.mock import AsyncMock, MagicMock import pytest -from unittest import mock - -from google_crc32c import Checksum from google.api_core import exceptions +from google.rpc import status_pb2 +from google.cloud._storage_v2.types import storage as storage_type +from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, -) -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( + _is_write_retryable, _MAX_CHUNK_SIZE_BYTES, _DEFAULT_FLUSH_INTERVAL_BYTES, ) -from google.cloud import _storage_v2 - +# Constants BUCKET = "test-bucket" OBJECT = "test-object" GENERATION = 123 @@ -37,637 +37,378 @@ EIGHT_MIB = 8 * 1024 * 1024 -@pytest.fixture -def mock_client(): - """Mock the async gRPC client.""" - return mock.AsyncMock() - - -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -def test_init(mock_write_object_stream, mock_client): - """Test the constructor of AsyncAppendableObjectWriter.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - - assert writer.client == mock_client - assert writer.bucket_name == BUCKET - assert writer.object_name == OBJECT - assert writer.generation is None - assert writer.write_handle is None - assert not writer.is_stream_open - assert writer.offset is None - assert writer.persisted_size is None - assert writer.bytes_appended_since_last_flush == 0 - - mock_write_object_stream.assert_called_once_with( - client=mock_client, - bucket_name=BUCKET, - object_name=OBJECT, - generation_number=None, - write_handle=None, - ) - assert writer.write_obj_stream == mock_write_object_stream.return_value - - -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -def test_init_with_optional_args(mock_write_object_stream, mock_client): - """Test the constructor with optional arguments.""" - writer = AsyncAppendableObjectWriter( - mock_client, - BUCKET, - OBJECT, - generation=GENERATION, - write_handle=WRITE_HANDLE, - ) - - assert writer.generation == GENERATION - assert writer.write_handle == WRITE_HANDLE - assert writer.bytes_appended_since_last_flush == 0 - - mock_write_object_stream.assert_called_once_with( - client=mock_client, - bucket_name=BUCKET, - object_name=OBJECT, - generation_number=GENERATION, - write_handle=WRITE_HANDLE, - ) - - -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -def test_init_with_writer_options(mock_write_object_stream, mock_client): - """Test the constructor with optional arguments.""" - writer = AsyncAppendableObjectWriter( - mock_client, - BUCKET, - OBJECT, - writer_options={"FLUSH_INTERVAL_BYTES": EIGHT_MIB}, - ) - - assert writer.flush_interval == EIGHT_MIB - assert writer.bytes_appended_since_last_flush == 0 - - mock_write_object_stream.assert_called_once_with( - client=mock_client, - bucket_name=BUCKET, - object_name=OBJECT, - generation_number=None, - write_handle=None, - ) - - -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -def test_init_with_flush_interval_less_than_chunk_size_raises_error(mock_client): - """Test that an OutOfRange error is raised if flush_interval is less than the chunk size.""" - - with pytest.raises(exceptions.OutOfRange): - AsyncAppendableObjectWriter( - mock_client, - BUCKET, - OBJECT, - writer_options={"FLUSH_INTERVAL_BYTES": _MAX_CHUNK_SIZE_BYTES - 1}, +class TestIsWriteRetryable: + """Exhaustive tests for retry predicate logic.""" + + def test_standard_transient_errors(self, mock_appendable_writer): + for exc in [ + exceptions.InternalServerError("500"), + exceptions.ServiceUnavailable("503"), + exceptions.DeadlineExceeded("timeout"), + exceptions.TooManyRequests("429"), + ]: + assert _is_write_retryable(exc) + + def test_aborted_with_redirect_proto(self, mock_appendable_writer): + # Direct redirect error wrapped in Aborted + redirect = BidiWriteObjectRedirectedError(routing_token="token") + exc = exceptions.Aborted("aborted", errors=[redirect]) + assert _is_write_retryable(exc) + + def test_aborted_with_trailers(self, mock_appendable_writer): + # Setup Status with Redirect Detail + status = status_pb2.Status() + detail = status.details.add() + detail.type_url = ( + "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" ) + # Mock error with trailing_metadata method + mock_grpc_error = MagicMock() + mock_grpc_error.trailing_metadata.return_value = [ + ("grpc-status-details-bin", status.SerializeToString()) + ] -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -def test_init_with_flush_interval_not_multiple_of_chunk_size_raises_error(mock_client): - """Test that an OutOfRange error is raised if flush_interval is not a multiple of the chunk size.""" - - with pytest.raises(exceptions.OutOfRange): - AsyncAppendableObjectWriter( - mock_client, - BUCKET, - OBJECT, - writer_options={"FLUSH_INTERVAL_BYTES": _MAX_CHUNK_SIZE_BYTES + 1}, - ) + # Aborted wraps the grpc error + exc = exceptions.Aborted("aborted", errors=[mock_grpc_error]) + assert _is_write_retryable(exc) + def test_aborted_without_metadata(self, mock_appendable_writer): + mock_grpc_error = MagicMock() + mock_grpc_error.trailing_metadata.return_value = [] + exc = exceptions.Aborted("bare aborted", errors=[mock_grpc_error]) + assert not _is_write_retryable(exc) -@mock.patch("google.cloud.storage._experimental.asyncio._utils.google_crc32c") -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" -) -def test_init_raises_if_crc32c_c_extension_is_missing( - mock_grpc_client, mock_google_crc32c -): - mock_google_crc32c.implementation = "python" - - with pytest.raises(exceptions.FailedPrecondition) as exc_info: - AsyncAppendableObjectWriter(mock_grpc_client, "bucket", "object") + def test_non_retryable_errors(self, mock_appendable_writer): + assert not _is_write_retryable(exceptions.BadRequest("400")) + assert not _is_write_retryable(exceptions.NotFound("404")) - assert "The google-crc32c package is not installed with C support" in str( - exc_info.value - ) - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_state_lookup(mock_write_object_stream, mock_client): - """Test state_lookup method.""" - # Arrange - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=PERSISTED_SIZE) +@pytest.fixture +def mock_appendable_writer(): + """Fixture to provide a mock AsyncAppendableObjectWriter setup.""" + mock_client = mock.AsyncMock() + # Internal stream class patch + stream_patcher = mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" ) + mock_stream_cls = stream_patcher.start() + mock_stream = mock_stream_cls.return_value - expected_request = _storage_v2.BidiWriteObjectRequest(state_lookup=True) - - # Act - response = await writer.state_lookup() - - # Assert - mock_stream.send.assert_awaited_once_with(expected_request) - mock_stream.recv.assert_awaited_once() - assert writer.persisted_size == PERSISTED_SIZE - assert response == PERSISTED_SIZE - - -@pytest.mark.asyncio -async def test_state_lookup_without_open_raises_value_error(mock_client): - """Test that state_lookup raises an error if the stream is not open.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, - match="Stream is not open. Call open\\(\\) before state_lookup\\(\\).", - ): - await writer.state_lookup() - + # Configure all async methods explicitly + mock_stream.open = AsyncMock() + mock_stream.close = AsyncMock() + mock_stream.send = AsyncMock() + mock_stream.recv = AsyncMock() -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_open_appendable_object_writer(mock_write_object_stream, mock_client): - """Test the open method.""" - # Arrange - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - mock_stream = mock_write_object_stream.return_value - mock_stream.open = mock.AsyncMock() - - mock_stream.generation_number = GENERATION - mock_stream.write_handle = WRITE_HANDLE + # Default mock properties + mock_stream.is_stream_open = False mock_stream.persisted_size = 0 - - # Act - await writer.open() - - # Assert - mock_stream.open.assert_awaited_once() - assert writer.is_stream_open - assert writer.generation == GENERATION - assert writer.write_handle == WRITE_HANDLE - assert writer.persisted_size == 0 - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_open_appendable_object_writer_existing_object( - mock_write_object_stream, mock_client -): - """Test the open method.""" - # Arrange - writer = AsyncAppendableObjectWriter( - mock_client, BUCKET, OBJECT, generation=GENERATION - ) - mock_stream = mock_write_object_stream.return_value - mock_stream.open = mock.AsyncMock() - mock_stream.generation_number = GENERATION mock_stream.write_handle = WRITE_HANDLE - mock_stream.persisted_size = PERSISTED_SIZE - # Act - await writer.open() + yield { + "mock_client": mock_client, + "mock_stream_cls": mock_stream_cls, + "mock_stream": mock_stream, + } - # Assert - mock_stream.open.assert_awaited_once() - assert writer.is_stream_open - assert writer.generation == GENERATION - assert writer.write_handle == WRITE_HANDLE - assert writer.persisted_size == PERSISTED_SIZE - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_open_when_already_open_raises_error( - mock_write_object_stream, mock_client -): - """Test that opening an already open writer raises a ValueError.""" - # Arrange - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True # Manually set to open - - # Act & Assert - with pytest.raises(ValueError, match="Underlying bidi-gRPC stream is already open"): - await writer.open() + stream_patcher.stop() -@pytest.mark.asyncio -async def test_unimplemented_methods_raise_error(mock_client): - """Test that all currently unimplemented methods raise NotImplementedError.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) +class TestAsyncAppendableObjectWriter: + def _make_one(self, mock_client, **kwargs): + return AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT, **kwargs) - with pytest.raises(NotImplementedError): - await writer.append_from_string("data") + # ------------------------------------------------------------------------- + # Initialization & Configuration Tests + # ------------------------------------------------------------------------- - with pytest.raises(NotImplementedError): - await writer.append_from_stream(mock.Mock()) + def test_init_defaults(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + assert writer.bucket_name == BUCKET + assert writer.object_name == OBJECT + assert writer.persisted_size is None + assert writer.bytes_appended_since_last_flush == 0 + assert writer.flush_interval == _DEFAULT_FLUSH_INTERVAL_BYTES + def test_init_with_writer_options(self, mock_appendable_writer): + writer = self._make_one( + mock_appendable_writer["mock_client"], + writer_options={"FLUSH_INTERVAL_BYTES": EIGHT_MIB}, + ) + assert writer.flush_interval == EIGHT_MIB + + def test_init_validation_chunk_size_raises(self, mock_appendable_writer): + with pytest.raises(exceptions.OutOfRange): + self._make_one( + mock_appendable_writer["mock_client"], + writer_options={"FLUSH_INTERVAL_BYTES": _MAX_CHUNK_SIZE_BYTES - 1}, + ) + + def test_init_validation_multiple_raises(self, mock_appendable_writer): + with pytest.raises(exceptions.OutOfRange): + self._make_one( + mock_appendable_writer["mock_client"], + writer_options={"FLUSH_INTERVAL_BYTES": _MAX_CHUNK_SIZE_BYTES + 1}, + ) + + def test_init_raises_if_crc32c_missing(self, mock_appendable_writer): + with mock.patch( + "google.cloud.storage._experimental.asyncio._utils.google_crc32c" + ) as mock_crc: + mock_crc.implementation = "python" + with pytest.raises(exceptions.FailedPrecondition): + self._make_one(mock_appendable_writer["mock_client"]) + + # ------------------------------------------------------------------------- + # Stream Lifecycle Tests + # ------------------------------------------------------------------------- + + @pytest.mark.asyncio + async def test_state_lookup(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + + mock_appendable_writer[ + "mock_stream" + ].recv.return_value = storage_type.BidiWriteObjectResponse(persisted_size=100) + + size = await writer.state_lookup() + + mock_appendable_writer["mock_stream"].send.assert_awaited_once() + assert size == 100 + assert writer.persisted_size == 100 + + @pytest.mark.asyncio + async def test_open_success(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + mock_appendable_writer["mock_stream"].generation_number = 456 + mock_appendable_writer["mock_stream"].write_handle = b"new-h" + mock_appendable_writer["mock_stream"].persisted_size = 0 -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_flush(mock_write_object_stream, mock_client): - """Test that flush sends the correct request and updates state.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=1024) - ) - - persisted_size = await writer.flush() + await writer.open() - expected_request = _storage_v2.BidiWriteObjectRequest(flush=True, state_lookup=True) - mock_stream.send.assert_awaited_once_with(expected_request) - mock_stream.recv.assert_awaited_once() - assert writer.persisted_size == 1024 - assert writer.offset == 1024 - assert persisted_size == 1024 + assert writer._is_stream_open + assert writer.generation == 456 + assert writer.write_handle == b"new-h" + mock_appendable_writer["mock_stream"].open.assert_awaited_once() + + def test_on_open_error_redirection(self, mock_appendable_writer): + """Verify redirect info is extracted from helper.""" + writer = self._make_one(mock_appendable_writer["mock_client"]) + redirect = BidiWriteObjectRedirectedError( + routing_token="rt1", + write_handle=storage_type.BidiWriteHandle(handle=b"h1"), + generation=777, + ) + with mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._extract_bidi_writes_redirect_proto", + return_value=redirect, + ): + writer._on_open_error(exceptions.Aborted("redirect")) + + assert writer._routing_token == "rt1" + assert writer.write_handle.handle == b"h1" + assert writer.generation == 777 + + # ------------------------------------------------------------------------- + # Append Tests + # ------------------------------------------------------------------------- + + @pytest.mark.asyncio + async def test_append_basic_success(self, mock_appendable_writer): + """Verify append orchestrates manager and drives the internal generator.""" + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer.persisted_size = 0 + + data = b"test-data" + + with mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._BidiStreamRetryManager" + ) as MockManager: + + async def mock_execute(state, policy): + factory = MockManager.call_args[0][1] + dummy_reqs = [storage_type.BidiWriteObjectRequest()] + gen = factory(dummy_reqs, state) + + mock_appendable_writer["mock_stream"].recv.side_effect = [ + storage_type.BidiWriteObjectResponse( + persisted_size=len(data), + write_handle=storage_type.BidiWriteHandle(handle=b"h2"), + ), + None, + ] + async for _ in gen: + pass + + MockManager.return_value.execute.side_effect = mock_execute + await writer.append(data) + + assert writer.persisted_size == len(data) + sent_req = mock_appendable_writer["mock_stream"].send.call_args[0][0] + assert sent_req.state_lookup + assert sent_req.flush + + @pytest.mark.asyncio + async def test_append_recovery_reopens_stream(self, mock_appendable_writer): + """Verifies re-opening logic on retry.""" + writer = self._make_one( + mock_appendable_writer["mock_client"], write_handle=b"h1" + ) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + # Setup mock to allow close() call + mock_appendable_writer["mock_stream"].is_stream_open = True + + async def mock_open(metadata=None): + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer._is_stream_open = True + writer.persisted_size = 5 + writer.write_handle = b"h_recovered" + + with mock.patch.object( + writer, "open", side_effect=mock_open + ) as mock_writer_open: + with mock.patch( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._BidiStreamRetryManager" + ) as MockManager: + + async def mock_execute(state, policy): + factory = MockManager.call_args[0][1] + # Simulate Attempt 1 fail + gen1 = factory([], state) + try: + await gen1.__anext__() + except Exception: + pass + # Simulate Attempt 2 + gen2 = factory([], state) + mock_appendable_writer["mock_stream"].recv.return_value = None + async for _ in gen2: + pass + + MockManager.return_value.execute.side_effect = mock_execute + await writer.append(b"0123456789") + + mock_appendable_writer["mock_stream"].close.assert_awaited() + mock_writer_open.assert_awaited() + assert writer.persisted_size == 5 + + @pytest.mark.asyncio + async def test_append_unimplemented_string_raises(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + with pytest.raises(NotImplementedError): + await writer.append_from_string("test") + + # ------------------------------------------------------------------------- + # Flush, Close, Finalize + # ------------------------------------------------------------------------- + + @pytest.mark.asyncio + async def test_flush_resets_counters(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer.bytes_appended_since_last_flush = 100 + + mock_appendable_writer[ + "mock_stream" + ].recv.return_value = storage_type.BidiWriteObjectResponse(persisted_size=200) -@pytest.mark.asyncio -async def test_flush_without_open_raises_value_error(mock_client): - """Test that flush raises an error if the stream is not open.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, match="Stream is not open. Call open\\(\\) before flush\\(\\)." - ): await writer.flush() + assert writer.bytes_appended_since_last_flush == 0 + assert writer.persisted_size == 200 -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_simple_flush(mock_write_object_stream, mock_client): - """Test that flush sends the correct request and updates state.""" - # Arrange - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - - # Act - await writer.simple_flush() - - # Assert - mock_stream.send.assert_awaited_once_with( - _storage_v2.BidiWriteObjectRequest(flush=True) - ) + @pytest.mark.asyncio + async def test_simple_flush(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer.bytes_appended_since_last_flush = 50 - -@pytest.mark.asyncio -async def test_simple_flush_without_open_raises_value_error(mock_client): - """Test that flush raises an error if the stream is not open.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, - match="Stream is not open. Call open\\(\\) before simple_flush\\(\\).", - ): await writer.simple_flush() - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_close(mock_write_object_stream, mock_client): - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.offset = 1024 - writer.persisted_size = 1024 - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=1024) - ) - mock_stream.close = mock.AsyncMock() - writer.finalize = mock.AsyncMock() - - persisted_size = await writer.close() - - writer.finalize.assert_not_awaited() - mock_stream.close.assert_awaited_once() - assert writer.offset is None - assert persisted_size == 1024 - assert not writer.is_stream_open - - -@pytest.mark.asyncio -async def test_close_without_open_raises_value_error(mock_client): - """Test that close raises an error if the stream is not open.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, match="Stream is not open. Call open\\(\\) before close\\(\\)." - ): - await writer.close() - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_finalize_on_close(mock_write_object_stream, mock_client): - """Test close with finalizing.""" - # Arrange - mock_resource = _storage_v2.Object(name=OBJECT, bucket=BUCKET, size=2048) - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.offset = 1024 - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(resource=mock_resource) - ) - mock_stream.close = mock.AsyncMock() - - # Act - result = await writer.close(finalize_on_close=True) - - # Assert - mock_stream.close.assert_awaited_once() - assert not writer.is_stream_open - assert writer.offset is None - assert writer.object_resource == mock_resource - assert writer.persisted_size == 2048 - assert result == mock_resource - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_finalize(mock_write_object_stream, mock_client): - """Test that finalize sends the correct request and updates state.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - mock_resource = _storage_v2.Object(name=OBJECT, bucket=BUCKET, size=123) - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(resource=mock_resource) - ) - mock_stream.close = mock.AsyncMock() - - gcs_object = await writer.finalize() - - mock_stream.send.assert_awaited_once_with( - _storage_v2.BidiWriteObjectRequest(finish_write=True) - ) - mock_stream.recv.assert_awaited_once() - mock_stream.close.assert_awaited_once() - assert writer.object_resource == mock_resource - assert writer.persisted_size == 123 - assert gcs_object == mock_resource - assert not writer.is_stream_open - assert writer.offset is None - - -@pytest.mark.asyncio -async def test_finalize_without_open_raises_value_error(mock_client): - """Test that finalize raises an error if the stream is not open.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, match="Stream is not open. Call open\\(\\) before finalize\\(\\)." - ): - await writer.finalize() - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_append_raises_error_if_not_open(mock_write_object_stream, mock_client): - """Test that append raises an error if the stream is not open.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, match="Stream is not open. Call open\\(\\) before append\\(\\)." - ): - await writer.append(b"some data") - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_append_with_empty_data(mock_write_object_stream, mock_client): - """Test that append does nothing if data is empty.""" - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - - await writer.append(b"") - - mock_stream.send.assert_not_awaited() - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_append_sends_data_in_chunks(mock_write_object_stream, mock_client): - """Test that append sends data in chunks and updates offset.""" - from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - _MAX_CHUNK_SIZE_BYTES, - ) - - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.persisted_size = 100 - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - - data = b"a" * (_MAX_CHUNK_SIZE_BYTES + 1) - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=100 + len(data)) - ) - - await writer.append(data) - - assert mock_stream.send.await_count == 2 - first_request = mock_stream.send.await_args_list[0].args[0] - second_request = mock_stream.send.await_args_list[1].args[0] - - # First chunk - assert first_request.write_offset == 100 - assert len(first_request.checksummed_data.content) == _MAX_CHUNK_SIZE_BYTES - assert first_request.checksummed_data.crc32c == int.from_bytes( - Checksum(data[:_MAX_CHUNK_SIZE_BYTES]).digest(), byteorder="big" - ) - assert not first_request.flush - assert not first_request.state_lookup - - # Second chunk (last chunk) - assert second_request.write_offset == 100 + _MAX_CHUNK_SIZE_BYTES - assert len(second_request.checksummed_data.content) == 1 - assert second_request.checksummed_data.crc32c == int.from_bytes( - Checksum(data[_MAX_CHUNK_SIZE_BYTES:]).digest(), byteorder="big" - ) - assert second_request.flush - assert second_request.state_lookup - - assert writer.offset == 100 + len(data) - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_append_flushes_when_buffer_is_full( - mock_write_object_stream, mock_client -): - """Test that append flushes the stream when the buffer size is reached.""" - - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.persisted_size = 0 - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock() - - data = b"a" * _DEFAULT_FLUSH_INTERVAL_BYTES - await writer.append(data) - - num_chunks = _DEFAULT_FLUSH_INTERVAL_BYTES // _MAX_CHUNK_SIZE_BYTES - assert mock_stream.send.await_count == num_chunks - - # All but the last request should not have flush or state_lookup set. - for i in range(num_chunks - 1): - request = mock_stream.send.await_args_list[i].args[0] - assert not request.flush - assert not request.state_lookup - - # The last request should have flush and state_lookup set. - last_request = mock_stream.send.await_args_list[-1].args[0] - assert last_request.flush - assert last_request.state_lookup - assert writer.bytes_appended_since_last_flush == 0 - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_append_handles_large_data(mock_write_object_stream, mock_client): - """Test that append handles data larger than the buffer size.""" - - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.persisted_size = 0 - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - mock_stream.recv = mock.AsyncMock() - - data = b"a" * (_DEFAULT_FLUSH_INTERVAL_BYTES * 2 + 1) - await writer.append(data) - - flushed_requests = [ - call.args[0] for call in mock_stream.send.await_args_list if call.args[0].flush - ] - assert len(flushed_requests) == 3 - - last_request = mock_stream.send.await_args_list[-1].args[0] - assert last_request.state_lookup - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" -) -async def test_append_data_two_times(mock_write_object_stream, mock_client): - """Test that append sends data correctly when called multiple times.""" - from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - _MAX_CHUNK_SIZE_BYTES, - ) - - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.persisted_size = 0 - mock_stream = mock_write_object_stream.return_value - mock_stream.send = mock.AsyncMock() - - data1 = b"a" * (_MAX_CHUNK_SIZE_BYTES + 10) - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=len(data1)) - ) - await writer.append(data1) - - assert mock_stream.send.await_count == 2 - last_request_data1 = mock_stream.send.await_args_list[-1].args[0] - assert last_request_data1.flush - assert last_request_data1.state_lookup - - data2 = b"b" * (_MAX_CHUNK_SIZE_BYTES + 20) - mock_stream.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse( - persisted_size=len(data2) + len(data1) + mock_appendable_writer["mock_stream"].send.assert_awaited_with( + storage_type.BidiWriteObjectRequest(flush=True) ) - ) - await writer.append(data2) - - assert mock_stream.send.await_count == 4 - last_request_data2 = mock_stream.send.await_args_list[-1].args[0] - assert last_request_data2.flush - assert last_request_data2.state_lookup - - total_data_length = len(data1) + len(data2) - assert writer.offset == total_data_length - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "file_size, block_size", - [ - (10, 4 * 1024), - (0, _DEFAULT_FLUSH_INTERVAL_BYTES), - (20 * 1024 * 1024, _DEFAULT_FLUSH_INTERVAL_BYTES), - (16 * 1024 * 1024, _DEFAULT_FLUSH_INTERVAL_BYTES), - ], -) -async def test_append_from_file(file_size, block_size, mock_client): - # arrange - fp = BytesIO(b"a" * file_size) - writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT) - writer._is_stream_open = True - writer.append = mock.AsyncMock() - - # act - await writer.append_from_file(fp, block_size=block_size) - - # assert - exepected_calls = ( - file_size // block_size - if file_size % block_size == 0 - else file_size // block_size + 1 - ) - assert writer.append.await_count == exepected_calls + assert writer.bytes_appended_since_last_flush == 0 + + @pytest.mark.asyncio + async def test_close_without_finalize(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer.persisted_size = 50 + + size = await writer.close() + + mock_appendable_writer["mock_stream"].close.assert_awaited() + assert not writer._is_stream_open + assert size == 50 + + @pytest.mark.asyncio + async def test_finalize_lifecycle(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + + resource = storage_type.Object(size=999) + mock_appendable_writer[ + "mock_stream" + ].recv.return_value = storage_type.BidiWriteObjectResponse(resource=resource) + + res = await writer.finalize() + + assert res == resource + assert writer.persisted_size == 999 + mock_appendable_writer["mock_stream"].send.assert_awaited_with( + storage_type.BidiWriteObjectRequest(finish_write=True) + ) + mock_appendable_writer["mock_stream"].close.assert_awaited() + assert not writer._is_stream_open + + @pytest.mark.asyncio + async def test_close_with_finalize_on_close(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.finalize = AsyncMock() + + await writer.close(finalize_on_close=True) + writer.finalize.assert_awaited_once() + + # ------------------------------------------------------------------------- + # Helper Tests + # ------------------------------------------------------------------------- + + @pytest.mark.asyncio + async def test_append_from_file(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True + writer.append = AsyncMock() + + fp = io.BytesIO(b"a" * 12) + await writer.append_from_file(fp, block_size=4) + + assert writer.append.await_count == 3 + + @pytest.mark.asyncio + async def test_methods_require_open_stream_raises(self, mock_appendable_writer): + writer = self._make_one(mock_appendable_writer["mock_client"]) + methods = [ + writer.append(b"data"), + writer.flush(), + writer.simple_flush(), + writer.close(), + writer.finalize(), + writer.state_lookup(), + ] + for coro in methods: + with pytest.raises(ValueError, match="Stream is not open"): + await coro diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index 02b416f6b..f94729516 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest from unittest import mock from google.auth import credentials as auth_credentials from google.auth.credentials import AnonymousCredentials @@ -29,7 +28,7 @@ def _make_credentials(spec=None): return mock.Mock(spec=spec) -class TestAsyncGrpcClient(unittest.TestCase): +class TestAsyncGrpcClient: @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_default_options(self, mock_async_storage_client): # Arrange @@ -63,7 +62,6 @@ def test_constructor_default_options(self, mock_async_storage_client): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_with_client_info(self, mock_async_storage_client): - mock_transport_cls = mock.MagicMock() mock_async_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials() @@ -86,7 +84,6 @@ def test_constructor_with_client_info(self, mock_async_storage_client): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_disables_directpath(self, mock_async_storage_client): - mock_transport_cls = mock.MagicMock() mock_async_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials() @@ -108,7 +105,6 @@ def test_constructor_disables_directpath(self, mock_async_storage_client): @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_grpc_client_property(self, mock_grpc_gapic_client): - # Arrange mock_transport_cls = mock.MagicMock() mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls @@ -152,11 +148,10 @@ def test_grpc_client_property(self, mock_grpc_gapic_client): client_info=mock_client_info, client_options=mock_client_options, ) - self.assertIs(retrieved_client, mock_grpc_gapic_client.return_value) + assert retrieved_client is mock_grpc_gapic_client.return_value @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): - # Arrange mock_transport_cls = mock.MagicMock() mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls @@ -171,7 +166,7 @@ def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): retrieved_client = client.grpc_client # Assert - self.assertIs(retrieved_client, mock_grpc_gapic_client.return_value) + assert retrieved_client is mock_grpc_gapic_client.return_value primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() expected_options = (("grpc.primary_user_agent", primary_user_agent),) diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 92ba2925a..7bfa2cea0 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +import unittest.mock as mock +from unittest.mock import AsyncMock, MagicMock import pytest -from unittest import mock -from unittest.mock import AsyncMock from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( _AsyncWriteObjectStream, ) @@ -24,562 +24,196 @@ BUCKET = "my-bucket" OBJECT = "my-object" GENERATION = 12345 -WRITE_HANDLE_BYTES = b"test-handle" -NEW_WRITE_HANDLE_BYTES = b"new-test-handle" -WRITE_HANDLE_PROTO = _storage_v2.BidiWriteHandle(handle=WRITE_HANDLE_BYTES) -NEW_WRITE_HANDLE_PROTO = _storage_v2.BidiWriteHandle(handle=NEW_WRITE_HANDLE_BYTES) +WRITE_HANDLE = b"test-handle" +FULL_BUCKET_PATH = f"projects/_/buckets/{BUCKET}" @pytest.fixture def mock_client(): - """Mock the async gRPC client.""" - mock_transport = mock.AsyncMock() + """Fixture to provide a mock gRPC client.""" + client = MagicMock() + # Mocking transport internal structures + mock_transport = MagicMock() mock_transport.bidi_write_object = mock.sentinel.bidi_write_object mock_transport._wrapped_methods = { mock.sentinel.bidi_write_object: mock.sentinel.wrapped_bidi_write_object } - - mock_gapic_client = mock.AsyncMock() - mock_gapic_client._transport = mock_transport - - client = mock.AsyncMock() - client._client = mock_gapic_client + client._client._transport = mock_transport return client -async def instantiate_write_obj_stream(mock_client, mock_cls_async_bidi_rpc, open=True): - """Helper to create an instance of _AsyncWriteObjectStream and open it by default.""" - socket_like_rpc = AsyncMock() - mock_cls_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.open = AsyncMock() - socket_like_rpc.send = AsyncMock() - socket_like_rpc.close = AsyncMock() - - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) - mock_response.resource.generation = GENERATION - mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE_PROTO - socket_like_rpc.recv = AsyncMock(return_value=mock_response) - - write_obj_stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - - if open: - await write_obj_stream.open() - - return write_obj_stream - - -def test_async_write_object_stream_init(mock_client): - """Test the constructor of _AsyncWriteObjectStream.""" - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - - assert stream.client == mock_client - assert stream.bucket_name == BUCKET - assert stream.object_name == OBJECT - assert stream.generation_number is None - assert stream.write_handle is None - assert stream._full_bucket_name == f"projects/_/buckets/{BUCKET}" - assert stream.rpc == mock.sentinel.wrapped_bidi_write_object - assert stream.metadata == ( - ("x-goog-request-params", f"bucket=projects/_/buckets/{BUCKET}"), - ) - assert stream.socket_like_rpc is None - assert not stream._is_stream_open - assert stream.first_bidi_write_req is None - assert stream.persisted_size == 0 - assert stream.object_resource is None - - -def test_async_write_object_stream_init_with_generation_and_handle(mock_client): - """Test the constructor with optional arguments.""" - stream = _AsyncWriteObjectStream( - mock_client, - BUCKET, - OBJECT, - generation_number=GENERATION, - write_handle=WRITE_HANDLE_PROTO, - ) - - assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE_PROTO - - -def test_async_write_object_stream_init_raises_value_error(): - """Test that the constructor raises ValueError for missing arguments.""" - with pytest.raises(ValueError, match="client must be provided"): - _AsyncWriteObjectStream(None, BUCKET, OBJECT) - - with pytest.raises(ValueError, match="bucket_name must be provided"): - _AsyncWriteObjectStream(mock.Mock(), None, OBJECT) - - with pytest.raises(ValueError, match="object_name must be provided"): - _AsyncWriteObjectStream(mock.Mock(), BUCKET, None) - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_for_new_object(mock_async_bidi_rpc, mock_client): - """Test opening a stream for a new object.""" - # Arrange - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.open = mock.AsyncMock() - - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) - mock_response.resource.generation = GENERATION - mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE_PROTO - socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) - - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - - # Act - await stream.open() - - # Assert - assert stream._is_stream_open - socket_like_rpc.open.assert_called_once() - socket_like_rpc.recv.assert_called_once() - assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE_PROTO - assert stream.persisted_size == 0 - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_for_new_object_with_generation_zero( - mock_async_bidi_rpc, mock_client -): - """Test opening a stream for a new object.""" - # Arrange - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.open = mock.AsyncMock() - - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) - mock_response.resource.generation = GENERATION - mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE_PROTO - socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) - - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT, generation_number=0) - - # Act - await stream.open() - - # Assert - mock_async_bidi_rpc.assert_called_once() - _, call_kwargs = mock_async_bidi_rpc.call_args - initial_request = call_kwargs["initial_request"] - assert initial_request.write_object_spec.if_generation_match == 0 - assert stream._is_stream_open - socket_like_rpc.open.assert_called_once() - socket_like_rpc.recv.assert_called_once() - assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE_PROTO - assert stream.persisted_size == 0 - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client): - """Test opening a stream for an existing object.""" - # Arrange - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.open = mock.AsyncMock() - - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) - mock_response.resource.size = 1024 - mock_response.resource.generation = GENERATION - mock_response.write_handle = WRITE_HANDLE_PROTO - socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) - - stream = _AsyncWriteObjectStream( - mock_client, BUCKET, OBJECT, generation_number=GENERATION - ) - - # Act - await stream.open() - - # Assert - assert stream._is_stream_open - socket_like_rpc.open.assert_called_once() - socket_like_rpc.recv.assert_called_once() - assert stream.generation_number == GENERATION - assert stream.write_handle == WRITE_HANDLE_PROTO - assert stream.persisted_size == 1024 - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_when_already_open_raises_error(mock_async_bidi_rpc, mock_client): - """Test that opening an already open stream raises a ValueError.""" - # Arrange - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.open = mock.AsyncMock() - - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) - mock_response.resource.generation = GENERATION - mock_response.resource.size = 0 - mock_response.write_handle = WRITE_HANDLE_PROTO - socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) - - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - await stream.open() - - # Act & Assert - with pytest.raises(ValueError, match="Stream is already open"): - await stream.open() - +class TestAsyncWriteObjectStream: + """Test suite for AsyncWriteObjectStream.""" -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_raises_error_on_missing_object_resource( - mock_async_bidi_rpc, mock_client -): - """Test that open raises ValueError if object_resource is not in the response.""" - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - - mock_reponse = mock.AsyncMock() - type(mock_reponse).resource = mock.PropertyMock(return_value=None) - socket_like_rpc.recv.return_value = mock_reponse - - # Note: Don't use below code as unittest library automatically assigns an - # `AsyncMock` object to an attribute, if not set. - # socket_like_rpc.recv.return_value = mock.AsyncMock( - # return_value=_storage_v2.BidiWriteObjectResponse(resource=None) - # ) - - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, match="Failed to obtain object resource after opening the stream" - ): - await stream.open() + # ------------------------------------------------------------------------- + # Initialization Tests + # ------------------------------------------------------------------------- - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_raises_error_on_missing_generation( - mock_async_bidi_rpc, mock_client -): - """Test that open raises ValueError if generation is not in the response.""" - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - - # Configure the mock response object - mock_response = mock.AsyncMock() - type(mock_response.resource).generation = mock.PropertyMock(return_value=None) - socket_like_rpc.recv.return_value = mock_response - - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - with pytest.raises( - ValueError, match="Failed to obtain object generation after opening the stream" - ): + def test_init_basic(self, mock_client): + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + assert stream.bucket_name == BUCKET + assert stream.object_name == OBJECT + assert stream._full_bucket_name == FULL_BUCKET_PATH + assert stream.metadata == ( + ("x-goog-request-params", f"bucket={FULL_BUCKET_PATH}"), + ) + assert not stream.is_stream_open + + def test_init_raises_value_error(self, mock_client): + with pytest.raises(ValueError, match="client must be provided"): + _AsyncWriteObjectStream(None, BUCKET, OBJECT) + with pytest.raises(ValueError, match="bucket_name must be provided"): + _AsyncWriteObjectStream(mock_client, None, OBJECT) + with pytest.raises(ValueError, match="object_name must be provided"): + _AsyncWriteObjectStream(mock_client, BUCKET, None) + + # ------------------------------------------------------------------------- + # Open Stream Tests + # ------------------------------------------------------------------------- + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + ) + @pytest.mark.asyncio + async def test_open_new_object(self, mock_rpc_cls, mock_client): + mock_rpc = mock_rpc_cls.return_value + mock_rpc.open = AsyncMock() + + # We don't use spec here to avoid descriptor issues with nested protos + mock_response = MagicMock() + mock_response.persisted_size = 0 + mock_response.resource.generation = GENERATION + mock_response.resource.size = 0 + mock_response.write_handle = WRITE_HANDLE + mock_rpc.recv = AsyncMock(return_value=mock_response) + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) await stream.open() - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_raises_error_on_missing_write_handle( - mock_async_bidi_rpc, mock_client -): - """Test that open raises ValueError if write_handle is not in the response.""" - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.recv = mock.AsyncMock( - return_value=_storage_v2.BidiWriteObjectResponse( - resource=_storage_v2.Object(generation=GENERATION), write_handle=None + # Check if BidiRpc was initialized with WriteObjectSpec + call_args = mock_rpc_cls.call_args + initial_request = call_args.kwargs["initial_request"] + assert initial_request.write_object_spec is not None + assert initial_request.write_object_spec.resource.name == OBJECT + assert initial_request.write_object_spec.appendable + + assert stream.is_stream_open + assert stream.write_handle == WRITE_HANDLE + assert stream.generation_number == GENERATION + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + ) + @pytest.mark.asyncio + async def test_open_existing_object_with_token(self, mock_rpc_cls, mock_client): + mock_rpc = mock_rpc_cls.return_value + mock_rpc.open = AsyncMock() + + # Ensure resource is None so persisted_size logic doesn't get overwritten by child mocks + mock_response = MagicMock() + mock_response.persisted_size = 1024 + mock_response.resource = None + mock_response.write_handle = WRITE_HANDLE + mock_rpc.recv = AsyncMock(return_value=mock_response) + + stream = _AsyncWriteObjectStream( + mock_client, + BUCKET, + OBJECT, + generation_number=GENERATION, + routing_token="token-123", ) - ) - stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) - with pytest.raises(ValueError, match="Failed to obtain write_handle"): await stream.open() - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_raises_error_on_missing_persisted_size_with_write_handle( - mock_async_bidi_rpc, mock_client -): - """Test that open raises ValueError if persisted_size is None when opened via write_handle.""" - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - - # - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.persisted_size = None # This is the key part of the test - mock_response.write_handle = ( - WRITE_HANDLE_PROTO # Ensure write_handle is present to avoid that error - ) - socket_like_rpc.recv.return_value = mock_response - - # ACT - stream = _AsyncWriteObjectStream( - mock_client, - BUCKET, - OBJECT, - write_handle=WRITE_HANDLE_PROTO, - generation_number=GENERATION, - ) - - with pytest.raises( - ValueError, - match="Failed to obtain persisted_size after opening the stream via write_handle", - ): + # Verify AppendObjectSpec attributes + initial_request = mock_rpc_cls.call_args.kwargs["initial_request"] + assert initial_request.append_object_spec is not None + assert initial_request.append_object_spec.generation == GENERATION + assert initial_request.append_object_spec.routing_token == "token-123" + assert stream.persisted_size == 1024 + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + ) + @pytest.mark.asyncio + async def test_open_metadata_merging(self, mock_rpc_cls, mock_client): + mock_rpc = mock_rpc_cls.return_value + mock_rpc.open = AsyncMock() + mock_rpc.recv = AsyncMock(return_value=MagicMock(resource=None)) + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + extra_metadata = [("x-custom", "val"), ("x-goog-request-params", "extra=param")] + + await stream.open(metadata=extra_metadata) + + # Verify that metadata combined bucket and extra params + passed_metadata = mock_rpc_cls.call_args.kwargs["metadata"] + meta_dict = dict(passed_metadata) + assert meta_dict["x-custom"] == "val" + # Params should be comma separated + params = meta_dict["x-goog-request-params"] + assert f"bucket={FULL_BUCKET_PATH}" in params + assert "extra=param" in params + + @pytest.mark.asyncio + async def test_open_already_open_raises(self, mock_client): + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + stream._is_stream_open = True + with pytest.raises(ValueError, match="already open"): + await stream.open() + + # ------------------------------------------------------------------------- + # Send & Recv & Close Tests + # ------------------------------------------------------------------------- + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + ) + @pytest.mark.asyncio + async def test_send_and_recv_logic(self, mock_rpc_cls, mock_client): + # Setup open stream + mock_rpc = mock_rpc_cls.return_value + mock_rpc.open = AsyncMock() + mock_rpc.send = AsyncMock() # Crucial: Must be AsyncMock + mock_rpc.recv = AsyncMock(return_value=MagicMock(resource=None)) + + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) await stream.open() - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_close(mock_cls_async_bidi_rpc, mock_client): - """Test that close successfully closes the stream.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=True - ) - write_obj_stream.requests_done = AsyncMock() - - # Act - await write_obj_stream.close() - - # Assert - write_obj_stream.requests_done.assert_called_once() - write_obj_stream.socket_like_rpc.close.assert_called_once() - assert not write_obj_stream.is_stream_open - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_close_without_open_should_raise_error( - mock_cls_async_bidi_rpc, mock_client -): - """Test that closing a stream that is not open raises a ValueError.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=False - ) - - # Act & Assert - with pytest.raises(ValueError, match="Stream is not open"): - await write_obj_stream.close() - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_send(mock_cls_async_bidi_rpc, mock_client): - """Test that send calls the underlying rpc's send method.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=True - ) - - # Act - bidi_write_object_request = _storage_v2.BidiWriteObjectRequest() - await write_obj_stream.send(bidi_write_object_request) - - # Assert - write_obj_stream.socket_like_rpc.send.assert_called_once_with( - bidi_write_object_request - ) - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_send_without_open_should_raise_error( - mock_cls_async_bidi_rpc, mock_client -): - """Test that sending on a stream that is not open raises a ValueError.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=False - ) - - # Act & Assert - with pytest.raises(ValueError, match="Stream is not open"): - await write_obj_stream.send(_storage_v2.BidiWriteObjectRequest()) - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_recv(mock_cls_async_bidi_rpc, mock_client): - """Test that recv calls the underlying rpc's recv method.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=True - ) - bidi_write_object_response = _storage_v2.BidiWriteObjectResponse() - write_obj_stream.socket_like_rpc.recv = AsyncMock( - return_value=bidi_write_object_response - ) - - # Act - response = await write_obj_stream.recv() - - # Assert - write_obj_stream.socket_like_rpc.recv.assert_called_once() - assert response == bidi_write_object_response - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_recv_without_open_should_raise_error( - mock_cls_async_bidi_rpc, mock_client -): - """Test that receiving on a stream that is not open raises a ValueError.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=False - ) - - # Act & Assert - with pytest.raises(ValueError, match="Stream is not open"): - await write_obj_stream.recv() - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_requests_done(mock_cls_async_bidi_rpc, mock_client): - """Test that requests_done signals the end of requests.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=True - ) - write_obj_stream.socket_like_rpc.send = AsyncMock() - write_obj_stream.socket_like_rpc.recv = AsyncMock() - - # Act - await write_obj_stream.requests_done() - - # Assert - write_obj_stream.socket_like_rpc.send.assert_called_once_with(None) - write_obj_stream.socket_like_rpc.recv.assert_called_once() - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_open_for_existing_object_with_none_size( - mock_async_bidi_rpc, mock_client -): - """Test opening a stream for an existing object where size is None.""" - # Arrange - socket_like_rpc = mock.AsyncMock() - mock_async_bidi_rpc.return_value = socket_like_rpc - socket_like_rpc.open = mock.AsyncMock() - - mock_response = mock.MagicMock(spec=_storage_v2.BidiWriteObjectResponse) - mock_response.resource = mock.MagicMock(spec=_storage_v2.Object) - mock_response.resource.size = None - mock_response.resource.generation = GENERATION - mock_response.write_handle = WRITE_HANDLE_PROTO - socket_like_rpc.recv = mock.AsyncMock(return_value=mock_response) - - stream = _AsyncWriteObjectStream( - mock_client, BUCKET, OBJECT, generation_number=GENERATION - ) - - # Act - await stream.open() - - # Assert - assert stream.persisted_size == 0 - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_recv_updates_write_handle(mock_cls_async_bidi_rpc, mock_client): - """Test that recv updates the write_handle if present in the response.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=True - ) - - assert write_obj_stream.write_handle == WRITE_HANDLE_PROTO # Initial handle - - # GCS can periodicallly update write handle in their responses. - bidi_write_object_response = _storage_v2.BidiWriteObjectResponse( - write_handle=NEW_WRITE_HANDLE_PROTO - ) - write_obj_stream.socket_like_rpc.recv = AsyncMock( - return_value=bidi_write_object_response - ) - - # Act - response = await write_obj_stream.recv() - - # Assert - write_obj_stream.socket_like_rpc.recv.assert_called_once() - assert response == bidi_write_object_response - # asserts that new write handle has been updated. - assert write_obj_stream.write_handle == NEW_WRITE_HANDLE_PROTO - - -@pytest.mark.asyncio -@mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" -) -async def test_requests_done_updates_write_handle(mock_cls_async_bidi_rpc, mock_client): - """Test that requests_done updates the write_handle if present in the response.""" - # Arrange - write_obj_stream = await instantiate_write_obj_stream( - mock_client, mock_cls_async_bidi_rpc, open=True - ) - assert write_obj_stream.write_handle == WRITE_HANDLE_PROTO # Initial handle - - # new_write_handle = b"new-test-handle" - bidi_write_object_response = _storage_v2.BidiWriteObjectResponse( - write_handle=NEW_WRITE_HANDLE_PROTO - ) - write_obj_stream.socket_like_rpc.send = AsyncMock() - write_obj_stream.socket_like_rpc.recv = AsyncMock( - return_value=bidi_write_object_response - ) - - # Act - await write_obj_stream.requests_done() - - # Assert - write_obj_stream.socket_like_rpc.send.assert_called_once_with(None) - write_obj_stream.socket_like_rpc.recv.assert_called_once() - assert write_obj_stream.write_handle == NEW_WRITE_HANDLE_PROTO + # Test Send + req = _storage_v2.BidiWriteObjectRequest(write_offset=0) + await stream.send(req) + mock_rpc.send.assert_awaited_with(req) + + # Test Recv with state update + mock_response = MagicMock() + mock_response.persisted_size = 5000 + mock_response.write_handle = b"new-handle" + mock_response.resource = None + mock_rpc.recv.return_value = mock_response + + res = await stream.recv() + assert res.persisted_size == 5000 + assert stream.persisted_size == 5000 + assert stream.write_handle == b"new-handle" + + @pytest.mark.asyncio + async def test_close_success(self, mock_client): + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + stream._is_stream_open = True + stream.socket_like_rpc = AsyncMock() + stream.socket_like_rpc.close = AsyncMock() + + await stream.close() + stream.socket_like_rpc.close.assert_awaited_once() + assert not stream.is_stream_open + + @pytest.mark.asyncio + async def test_methods_require_open_raises(self, mock_client): + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + with pytest.raises(ValueError, match="Stream is not open"): + await stream.send(MagicMock()) + with pytest.raises(ValueError, match="Stream is not open"): + await stream.recv() + with pytest.raises(ValueError, match="Stream is not open"): + await stream.close() From 5ac2808a69195c688ed42c3604d4bfadbb602a66 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 28 Jan 2026 15:36:37 +0530 Subject: [PATCH 471/509] feat: add context manager to mrd (#1724) feat: add context manager to mrd --- .../asyncio/async_multi_range_downloader.py | 10 +++++ tests/system/test_zonal.py | 14 +++---- .../test_async_multi_range_downloader.py | 41 +++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 1d1c63efd..5981ff7fc 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -209,6 +209,16 @@ def __init__( self._download_ranges_id_to_pending_read_ids = {} self.persisted_size: Optional[int] = None # updated after opening the stream + async def __aenter__(self): + """Opens the underlying bidi-gRPC connection to read from the object.""" + await self.open() + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Closes the underlying bidi-gRPC connection.""" + if self.is_stream_open: + await self.close() + def _on_open_error(self, exc): """Extracts routing token and read handle on redirect error during open.""" routing_token, read_handle = _handle_redirect(exc) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 40c84a2fb..8019156dd 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -116,19 +116,19 @@ async def _run(): assert object_metadata.size == object_size assert int(object_metadata.checksums.crc32c) == object_checksum - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) buffer = BytesIO() - await mrd.open() - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() + async with AsyncMultiRangeDownloader( + grpc_client, _ZONAL_BUCKET, object_name + ) as mrd: + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + assert mrd.persisted_size == object_size + assert buffer.getvalue() == object_data - assert mrd.persisted_size == object_size # Clean up; use json client (i.e. `storage_client` fixture) to delete. blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) del writer - del mrd gc.collect() event_loop.run_until_complete(_run()) diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 2f0600f8d..5a8d6c6f1 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -401,3 +401,44 @@ async def test_download_ranges_raises_on_checksum_mismatch( assert "Checksum mismatch" in str(exc_info.value) mock_checksum_class.assert_called_once_with(test_data) + + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.open", + new_callable=AsyncMock, + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.close", + new_callable=AsyncMock, + ) + @mock.patch( + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + ) + @pytest.mark.asyncio + async def test_async_context_manager_calls_open_and_close( + self, mock_grpc_client, mock_close, mock_open + ): + # Arrange + mrd = AsyncMultiRangeDownloader( + mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + + # To simulate the behavior of open and close changing the stream state + async def open_side_effect(): + mrd._is_stream_open = True + + async def close_side_effect(): + mrd._is_stream_open = False + + mock_open.side_effect = open_side_effect + mock_close.side_effect = close_side_effect + mrd._is_stream_open = False + + # Act + async with mrd as downloader: + # Assert + mock_open.assert_called_once() + assert downloader == mrd + assert mrd.is_stream_open + + mock_close.assert_called_once() + assert not mrd.is_stream_open From 721ea2dd6c6db2aa91fd3b90e56a831aaaa64061 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 28 Jan 2026 16:35:32 +0530 Subject: [PATCH 472/509] fix: instance grpc client once per process in benchmarks (#1725) fix: instance grpc client once per process in benchmarks. Other Changes * One gRPC client per process * One async io event loop per process * One process pool per benchmark. Fixes b/474536663 , b/473669384 --- .../perf/microbenchmarks/reads/test_reads.py | 63 ++++++++++--------- tests/system/test_zonal.py | 2 +- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/tests/perf/microbenchmarks/reads/test_reads.py b/tests/perf/microbenchmarks/reads/test_reads.py index 13a0a49b3..324938e94 100644 --- a/tests/perf/microbenchmarks/reads/test_reads.py +++ b/tests/perf/microbenchmarks/reads/test_reads.py @@ -300,44 +300,46 @@ def target_wrapper(*args, **kwargs): ) -def _download_files_worker(files_to_download, other_params, chunks, bucket_type): - # For regional buckets, a new client must be created for each process. - # For zonal, the same is done for consistency. +# --- Global Variables for Worker Process --- +worker_loop = None +worker_client = None +worker_json_client = None + + +def _worker_init(bucket_type): + """Initializes a persistent event loop and client for each worker process.""" + global worker_loop, worker_client, worker_json_client if bucket_type == "zonal": - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - client = loop.run_until_complete(create_client()) - try: - # download_files_using_mrd_multi_coro returns max latency of coros - result = download_files_using_mrd_multi_coro( - loop, client, files_to_download, other_params, chunks - ) - finally: - tasks = asyncio.all_tasks(loop=loop) - for task in tasks: - task.cancel() - loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) - loop.close() - return result + worker_loop = asyncio.new_event_loop() + asyncio.set_event_loop(worker_loop) + worker_client = worker_loop.run_until_complete(create_client()) else: # regional from google.cloud import storage - json_client = storage.Client() + worker_json_client = storage.Client() + + +def _download_files_worker(files_to_download, other_params, chunks, bucket_type): + if bucket_type == "zonal": + # The loop and client are already initialized in _worker_init. + # download_files_using_mrd_multi_coro returns max latency of coros + return download_files_using_mrd_multi_coro( + worker_loop, worker_client, files_to_download, other_params, chunks + ) + else: # regional # download_files_using_json_multi_threaded returns max latency of threads return download_files_using_json_multi_threaded( - None, json_client, files_to_download, other_params, chunks + None, worker_json_client, files_to_download, other_params, chunks ) -def download_files_mp_mc_wrapper(files_names, params, chunks, bucket_type): - num_processes = params.num_processes +def download_files_mp_mc_wrapper(pool, files_names, params, chunks, bucket_type): num_coros = params.num_coros # This is n, number of files per process # Distribute filenames to processes filenames_per_process = [ files_names[i : i + num_coros] for i in range(0, len(files_names), num_coros) ] - args = [ ( filenames, @@ -348,10 +350,7 @@ def download_files_mp_mc_wrapper(files_names, params, chunks, bucket_type): for filenames in filenames_per_process ] - ctx = multiprocessing.get_context("spawn") - with ctx.Pool(processes=num_processes) as pool: - results = pool.starmap(_download_files_worker, args) - + results = pool.starmap(_download_files_worker, args) return max(results) @@ -386,10 +385,16 @@ def test_downloads_multi_proc_multi_coro( logging.info("randomizing chunks") random.shuffle(chunks) + ctx = multiprocessing.get_context("spawn") + pool = ctx.Pool( + processes=params.num_processes, + initializer=_worker_init, + initargs=(params.bucket_type,), + ) output_times = [] def target_wrapper(*args, **kwargs): - result = download_files_mp_mc_wrapper(*args, **kwargs) + result = download_files_mp_mc_wrapper(pool, *args, **kwargs) output_times.append(result) return output_times @@ -407,6 +412,8 @@ def target_wrapper(*args, **kwargs): ), ) finally: + pool.close() + pool.join() publish_benchmark_extra_info(benchmark, params, true_times=output_times) publish_resource_metrics(benchmark, m) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 8019156dd..eb9df582c 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -264,7 +264,7 @@ async def _run(): event_loop.run_until_complete(_run()) - +@pytest.mark.skip(reason='Flaky test b/478129078') def test_mrd_open_with_read_handle(event_loop, grpc_client_direct): object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}" From 8e21a7fe54d0a043f31937671003630a1985a5d2 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 28 Jan 2026 16:54:59 +0530 Subject: [PATCH 473/509] feat: expose finalized_time in blob.py applicable for GET_OBJECT in ZB (#1719) feat: expose finalized_time in blob.py applicable for GET_OBJECT in ZB --- google/cloud/storage/blob.py | 13 +++++++++++++ samples/snippets/storage_get_metadata.py | 1 + tests/unit/test_blob.py | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 746334d1c..0b022985f 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -5034,6 +5034,19 @@ def hard_delete_time(self): if hard_delete_time is not None: return _rfc3339_nanos_to_datetime(hard_delete_time) + @property + def finalized_time(self): + """If this object has been soft-deleted, returns the time at which it will be permanently deleted. + + :rtype: :class:`datetime.datetime` or ``NoneType`` + :returns: + (readonly) The time that the object will be permanently deleted. + Note this property is only set for soft-deleted objects. + """ + finalize_time = self._properties.get("finalizedTime", None) + if finalize_time is not None: + return _rfc3339_nanos_to_datetime(finalize_time) + def _get_host_name(connection): """Returns the host name from the given connection. diff --git a/samples/snippets/storage_get_metadata.py b/samples/snippets/storage_get_metadata.py index 7216efdb4..1e332b445 100644 --- a/samples/snippets/storage_get_metadata.py +++ b/samples/snippets/storage_get_metadata.py @@ -34,6 +34,7 @@ def blob_metadata(bucket_name, blob_name): blob = bucket.get_blob(blob_name) print(f"Blob: {blob.name}") + print(f"Blob finalization: {blob.finalized_time}") print(f"Bucket: {blob.bucket.name}") print(f"Storage class: {blob.storage_class}") print(f"ID: {blob.id}") diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index a8abb1571..2359de501 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -228,6 +228,29 @@ def test__set_properties_w_kms_key_name(self): ) self._set_properties_helper(kms_key_name=kms_resource) + def test_finalized_time_property_is_none(self): + BLOB_NAME = "blob-name" + bucket = _Bucket() + blob = self._make_one(BLOB_NAME, bucket=bucket) + self.assertIsNone(blob.finalized_time) + + def test_finalized_time_property_is_not_none(self): + from google.cloud.storage import blob as blob_module + + BLOB_NAME = "blob-name" + bucket = _Bucket() + blob = self._make_one(BLOB_NAME, bucket=bucket) + + timestamp = "2024-07-29T12:34:56.123456Z" + blob._properties["finalizedTime"] = timestamp + + mock_datetime = mock.Mock() + with mock.patch.object( + blob_module, "_rfc3339_nanos_to_datetime", return_value=mock_datetime + ) as mocked: + self.assertEqual(blob.finalized_time, mock_datetime) + mocked.assert_called_once_with(timestamp) + def test_chunk_size_ctor(self): from google.cloud.storage.blob import Blob From e730bf50c4584f737ab86b2e409ddb27b40d2cec Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 28 Jan 2026 19:21:08 +0530 Subject: [PATCH 474/509] fix!: Change contructors of MRD and AAOW AsyncGrpcClient.grpc_client to AsyncGrpcClient (#1727) Change contructors of MRD and AAOW `AsyncGrpcClient.grpc_client` to `AsyncGrpcClient`. This will help us extend multiple methods in AsyncGrpcClient in future. More details in b/479030029 --- .../asyncio/async_appendable_object_writer.py | 6 +- .../asyncio/async_multi_range_downloader.py | 12 +- ...rage_create_and_write_appendable_object.py | 2 +- ...orage_finalize_appendable_object_upload.py | 2 +- ...orage_open_multiple_objects_ranged_read.py | 2 +- ...torage_open_object_multiple_ranged_read.py | 2 +- .../storage_open_object_read_full_object.py | 2 +- .../storage_open_object_single_ranged_read.py | 2 +- ...rage_pause_and_resume_appendable_upload.py | 2 +- .../storage_read_appendable_object_tail.py | 2 +- .../zonal_buckets/zonal_snippets_test.py | 2 +- tests/perf/microbenchmarks/conftest.py | 2 +- .../perf/microbenchmarks/reads/test_reads.py | 2 +- .../microbenchmarks/writes/test_writes.py | 2 +- tests/system/test_zonal.py | 2 +- .../test_async_appendable_object_writer.py | 3 +- .../test_async_multi_range_downloader.py | 109 ++++++------------ 17 files changed, 60 insertions(+), 96 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 7795a2ac5..1cc099043 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -114,7 +114,7 @@ class AsyncAppendableObjectWriter: def __init__( self, - client: AsyncGrpcClient.grpc_client, + client: AsyncGrpcClient, bucket_name: str, object_name: str, generation: Optional[int] = None, @@ -155,7 +155,7 @@ def __init__( await writer.close() ``` - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient` :param client: async grpc client to use for making API requests. :type bucket_name: str @@ -304,7 +304,7 @@ async def _do_open(): self._is_stream_open = False self.write_obj_stream = _AsyncWriteObjectStream( - client=self.client, + client=self.client.grpc_client, bucket_name=self.bucket_name, object_name=self.object_name, generation_number=self.generation, diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 5981ff7fc..340f087da 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -125,7 +125,7 @@ class AsyncMultiRangeDownloader: @classmethod async def create_mrd( cls, - client: AsyncGrpcClient.grpc_client, + client: AsyncGrpcClient, bucket_name: str, object_name: str, generation_number: Optional[int] = None, @@ -136,7 +136,7 @@ async def create_mrd( """Initializes a MultiRangeDownloader and opens the underlying bidi-gRPC object for reading. - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient` :param client: The asynchronous client to use for making API requests. :type bucket_name: str @@ -168,7 +168,7 @@ async def create_mrd( def __init__( self, - client: AsyncGrpcClient.grpc_client, + client: AsyncGrpcClient, bucket_name: str, object_name: str, generation_number: Optional[int] = None, @@ -177,7 +177,7 @@ def __init__( """Constructor for AsyncMultiRangeDownloader, clients are not adviced to use it directly. Instead it's adviced to use the classmethod `create_mrd`. - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient` :param client: The asynchronous client to use for making API requests. :type bucket_name: str @@ -273,7 +273,7 @@ async def _do_open(): self._is_stream_open = False self.read_obj_str = _AsyncReadObjectStream( - client=self.client, + client=self.client.grpc_client, bucket_name=self.bucket_name, object_name=self.object_name, generation_number=self.generation_number, @@ -432,7 +432,7 @@ async def generator(): # Re-initialize stream self.read_obj_str = _AsyncReadObjectStream( - client=self.client, + client=self.client.grpc_client, bucket_name=self.bucket_name, object_name=self.object_name, generation_number=self.generation_number, diff --git a/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py b/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py index 87da6cfdd..f00a6ba80 100644 --- a/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py +++ b/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py @@ -35,7 +35,7 @@ async def storage_create_and_write_appendable_object( """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() writer = AsyncAppendableObjectWriter( client=grpc_client, bucket_name=bucket_name, diff --git a/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py b/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py index 4a4b64289..971658997 100644 --- a/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py +++ b/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py @@ -33,7 +33,7 @@ async def storage_finalize_appendable_object_upload( """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() writer = AsyncAppendableObjectWriter( client=grpc_client, bucket_name=bucket_name, diff --git a/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py index c22023a5c..ce2ba678b 100644 --- a/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py +++ b/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py @@ -36,7 +36,7 @@ async def storage_open_multiple_objects_ranged_read( grpc_client: an existing grpc_client to use, this is only for testing. """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() async def _download_range(object_name): """Helper coroutine to download a range from a single object.""" diff --git a/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py index 55d92d9da..02c3bace5 100644 --- a/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py +++ b/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py @@ -33,7 +33,7 @@ async def storage_open_object_multiple_ranged_read( grpc_client: an existing grpc_client to use, this is only for testing. """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) diff --git a/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py b/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py index 044c42b71..b4cad6718 100644 --- a/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py +++ b/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py @@ -33,7 +33,7 @@ async def storage_open_object_read_full_object( grpc_client: an existing grpc_client to use, this is only for testing. """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() # mrd = Multi-Range-Downloader mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) diff --git a/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py index 41effce36..b013cc938 100644 --- a/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py +++ b/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py @@ -33,7 +33,7 @@ async def storage_open_object_single_ranged_read( grpc_client: an existing grpc_client to use, this is only for testing. """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() mrd = AsyncMultiRangeDownloader(grpc_client, bucket_name, object_name) diff --git a/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py b/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py index db54bb821..3fb17ceae 100644 --- a/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py +++ b/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py @@ -32,7 +32,7 @@ async def storage_pause_and_resume_appendable_upload( grpc_client: an existing grpc_client to use, this is only for testing. """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() writer1 = AsyncAppendableObjectWriter( client=grpc_client, diff --git a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py index 587513056..1134f28d6 100644 --- a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py +++ b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py @@ -90,7 +90,7 @@ async def read_appendable_object_tail( grpc_client: an existing grpc_client to use, this is only for testing. """ if grpc_client is None: - grpc_client = AsyncGrpcClient().grpc_client + grpc_client = AsyncGrpcClient() writer = AsyncAppendableObjectWriter( client=grpc_client, bucket_name=bucket_name, diff --git a/samples/snippets/zonal_buckets/zonal_snippets_test.py b/samples/snippets/zonal_buckets/zonal_snippets_test.py index e45d21c47..736576eb5 100644 --- a/samples/snippets/zonal_buckets/zonal_snippets_test.py +++ b/samples/snippets/zonal_buckets/zonal_snippets_test.py @@ -48,7 +48,7 @@ async def create_async_grpc_client(): """Initializes async client and gets the current event loop.""" - return AsyncGrpcClient().grpc_client + return AsyncGrpcClient() # Forcing a single event loop for the whole test session diff --git a/tests/perf/microbenchmarks/conftest.py b/tests/perf/microbenchmarks/conftest.py index 8caf4d656..c09e9ce93 100644 --- a/tests/perf/microbenchmarks/conftest.py +++ b/tests/perf/microbenchmarks/conftest.py @@ -78,7 +78,7 @@ async def upload_appendable_object(bucket_name, object_name, object_size, chunk_ # this method is to write "appendable" objects which will be used for # benchmarking reads, hence not concerned performance of writes here. writer = AsyncAppendableObjectWriter( - AsyncGrpcClient().grpc_client, + AsyncGrpcClient(), bucket_name, object_name, writer_options={"FLUSH_INTERVAL_BYTES": 1026 * 1024**2}, diff --git a/tests/perf/microbenchmarks/reads/test_reads.py b/tests/perf/microbenchmarks/reads/test_reads.py index 324938e94..2b5f80d42 100644 --- a/tests/perf/microbenchmarks/reads/test_reads.py +++ b/tests/perf/microbenchmarks/reads/test_reads.py @@ -47,7 +47,7 @@ async def create_client(): """Initializes async client and gets the current event loop.""" - return AsyncGrpcClient().grpc_client + return AsyncGrpcClient() async def download_chunks_using_mrd_async(client, filename, other_params, chunks): diff --git a/tests/perf/microbenchmarks/writes/test_writes.py b/tests/perf/microbenchmarks/writes/test_writes.py index d952b1f87..5648ada0d 100644 --- a/tests/perf/microbenchmarks/writes/test_writes.py +++ b/tests/perf/microbenchmarks/writes/test_writes.py @@ -49,7 +49,7 @@ async def create_client(): """Initializes async client and gets the current event loop.""" - return AsyncGrpcClient().grpc_client + return AsyncGrpcClient() async def upload_chunks_using_grpc_async(client, filename, other_params): diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index eb9df582c..4d46353e2 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -36,7 +36,7 @@ async def create_async_grpc_client(attempt_direct_path=True): """Initializes async client and gets the current event loop.""" - return AsyncGrpcClient(attempt_direct_path=attempt_direct_path).grpc_client + return AsyncGrpcClient(attempt_direct_path=attempt_direct_path) @pytest.fixture(scope="session") diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index abb26be7a..88f4864de 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -87,7 +87,8 @@ def test_non_retryable_errors(self, mock_appendable_writer): @pytest.fixture def mock_appendable_writer(): """Fixture to provide a mock AsyncAppendableObjectWriter setup.""" - mock_client = mock.AsyncMock() + mock_client = mock.MagicMock() + mock_client.grpc_client = mock.AsyncMock() # Internal stream class patch stream_patcher = mock.patch( "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 5a8d6c6f1..09cf0fa09 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -46,13 +46,15 @@ def create_read_ranges(self, num_ranges): @pytest.mark.asyncio async def _make_mock_mrd( self, - mock_grpc_client, mock_cls_async_read_object_stream, bucket_name=_TEST_BUCKET_NAME, object_name=_TEST_OBJECT_NAME, generation_number=_TEST_GENERATION_NUMBER, read_handle=_TEST_READ_HANDLE, ): + mock_client = mock.MagicMock() + mock_client.grpc_client = mock.AsyncMock() + mock_stream = mock_cls_async_read_object_stream.return_value mock_stream.open = AsyncMock() mock_stream.generation_number = _TEST_GENERATION_NUMBER @@ -60,29 +62,22 @@ async def _make_mock_mrd( mock_stream.read_handle = _TEST_READ_HANDLE mrd = await AsyncMultiRangeDownloader.create_mrd( - mock_grpc_client, bucket_name, object_name, generation_number, read_handle + mock_client, bucket_name, object_name, generation_number, read_handle ) - return mrd + return mrd, mock_client @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio - async def test_create_mrd( - self, mock_grpc_client, mock_cls_async_read_object_stream - ): + async def test_create_mrd(self, mock_cls_async_read_object_stream): # Arrange & Act - mrd = await self._make_mock_mrd( - mock_grpc_client, mock_cls_async_read_object_stream - ) + mrd, mock_client = await self._make_mock_mrd(mock_cls_async_read_object_stream) # Assert mock_cls_async_read_object_stream.assert_called_once_with( - client=mock_grpc_client, + client=mock_client.grpc_client, bucket_name=_TEST_BUCKET_NAME, object_name=_TEST_OBJECT_NAME, generation_number=_TEST_GENERATION_NUMBER, @@ -91,7 +86,7 @@ async def test_create_mrd( mrd.read_obj_str.open.assert_called_once() - assert mrd.client == mock_grpc_client + assert mrd.client == mock_client assert mrd.bucket_name == _TEST_BUCKET_NAME assert mrd.object_name == _TEST_OBJECT_NAME assert mrd.generation_number == _TEST_GENERATION_NUMBER @@ -105,12 +100,9 @@ async def test_create_mrd( @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio async def test_download_ranges_via_async_gather( - self, mock_grpc_client, mock_cls_async_read_object_stream, mock_random_int + self, mock_cls_async_read_object_stream, mock_random_int ): # Arrange data = b"these_are_18_chars" @@ -120,9 +112,7 @@ async def test_download_ranges_via_async_gather( Checksum(data[10:16]).digest(), "big" ) - mock_mrd = await self._make_mock_mrd( - mock_grpc_client, mock_cls_async_read_object_stream - ) + mock_mrd, _ = await self._make_mock_mrd(mock_cls_async_read_object_stream) mock_random_int.side_effect = [456, 91011] @@ -181,21 +171,16 @@ async def test_download_ranges_via_async_gather( @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio async def test_download_ranges( - self, mock_grpc_client, mock_cls_async_read_object_stream, mock_random_int + self, mock_cls_async_read_object_stream, mock_random_int ): # Arrange data = b"these_are_18_chars" crc32c = Checksum(data).digest() crc32c_int = int.from_bytes(crc32c, "big") - mock_mrd = await self._make_mock_mrd( - mock_grpc_client, mock_cls_async_read_object_stream - ) + mock_mrd, _ = await self._make_mock_mrd(mock_cls_async_read_object_stream) mock_random_int.side_effect = [456] @@ -232,16 +217,12 @@ async def test_download_ranges( ) assert buffer.getvalue() == data - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio - async def test_downloading_ranges_with_more_than_1000_should_throw_error( - self, mock_grpc_client - ): + async def test_downloading_ranges_with_more_than_1000_should_throw_error(self): # Arrange + mock_client = mock.MagicMock() mrd = AsyncMultiRangeDownloader( - mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + mock_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME ) # Act + Assert @@ -257,16 +238,13 @@ async def test_downloading_ranges_with_more_than_1000_should_throw_error( @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio async def test_opening_mrd_more_than_once_should_throw_error( - self, mock_grpc_client, mock_cls_async_read_object_stream + self, mock_cls_async_read_object_stream ): # Arrange - mrd = await self._make_mock_mrd( - mock_grpc_client, mock_cls_async_read_object_stream + mrd, _ = await self._make_mock_mrd( + mock_cls_async_read_object_stream ) # mock mrd is already opened # Act + Assert @@ -279,14 +257,11 @@ async def test_opening_mrd_more_than_once_should_throw_error( @mock.patch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio - async def test_close_mrd(self, mock_grpc_client, mock_cls_async_read_object_stream): + async def test_close_mrd(self, mock_cls_async_read_object_stream): # Arrange - mrd = await self._make_mock_mrd( - mock_grpc_client, mock_cls_async_read_object_stream + mrd, _ = await self._make_mock_mrd( + mock_cls_async_read_object_stream ) # mock mrd is already opened mrd.read_obj_str.close = AsyncMock() @@ -296,14 +271,12 @@ async def test_close_mrd(self, mock_grpc_client, mock_cls_async_read_object_stre # Assert assert not mrd.is_stream_open - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio - async def test_close_mrd_not_opened_should_throw_error(self, mock_grpc_client): + async def test_close_mrd_not_opened_should_throw_error(self): # Arrange + mock_client = mock.MagicMock() mrd = AsyncMultiRangeDownloader( - mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + mock_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME ) # Act + Assert with pytest.raises(ValueError) as exc: @@ -313,16 +286,12 @@ async def test_close_mrd_not_opened_should_throw_error(self, mock_grpc_client): assert str(exc.value) == "Underlying bidi-gRPC stream is not open" assert not mrd.is_stream_open - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio - async def test_downloading_without_opening_should_throw_error( - self, mock_grpc_client - ): + async def test_downloading_without_opening_should_throw_error(self): # Arrange + mock_client = mock.MagicMock() mrd = AsyncMultiRangeDownloader( - mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + mock_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME ) # Act + Assert @@ -334,16 +303,14 @@ async def test_downloading_without_opening_should_throw_error( assert not mrd.is_stream_open @mock.patch("google.cloud.storage._experimental.asyncio._utils.google_crc32c") - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) def test_init_raises_if_crc32c_c_extension_is_missing( - self, mock_grpc_client, mock_google_crc32c + self, mock_google_crc32c ): mock_google_crc32c.implementation = "python" + mock_client = mock.MagicMock() with pytest.raises(exceptions.FailedPrecondition) as exc_info: - AsyncMultiRangeDownloader(mock_grpc_client, "bucket", "object") + AsyncMultiRangeDownloader(mock_client, "bucket", "object") assert "The google-crc32c package is not installed with C support" in str( exc_info.value @@ -353,16 +320,14 @@ def test_init_raises_if_crc32c_c_extension_is_missing( @mock.patch( "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy.Checksum" ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) async def test_download_ranges_raises_on_checksum_mismatch( - self, mock_client, mock_checksum_class + self, mock_checksum_class ): from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) + mock_client = mock.MagicMock() mock_stream = mock.AsyncMock( spec=async_read_object_stream._AsyncReadObjectStream ) @@ -410,16 +375,14 @@ async def test_download_ranges_raises_on_checksum_mismatch( "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.close", new_callable=AsyncMock, ) - @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" - ) @pytest.mark.asyncio async def test_async_context_manager_calls_open_and_close( - self, mock_grpc_client, mock_close, mock_open + self, mock_close, mock_open ): # Arrange + mock_client = mock.MagicMock() mrd = AsyncMultiRangeDownloader( - mock_grpc_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + mock_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME ) # To simulate the behavior of open and close changing the stream state From 7b319469d2e495ea0bf7367f3949190e8f5d9fff Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Thu, 29 Jan 2026 08:41:32 +0530 Subject: [PATCH 475/509] feat: add default user agent for grpc (#1726) Adding a default gcloud-python/{__version__} for grpc client just like the json client --- .../asyncio/async_grpc_client.py | 19 ++-- tests/unit/asyncio/test_async_grpc_client.py | 90 +++++++++++++------ 2 files changed, 74 insertions(+), 35 deletions(-) diff --git a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py index e985f2252..47c371cd6 100644 --- a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py +++ b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py @@ -18,25 +18,22 @@ from google.cloud._storage_v2.services.storage.transports.base import ( DEFAULT_CLIENT_INFO, ) +from google.cloud.storage import __version__ class AsyncGrpcClient: """An asynchronous client for interacting with Google Cloud Storage using the gRPC API. - :type credentials: :class:`~google.auth.credentials.Credentials` :param credentials: (Optional) The OAuth2 Credentials to use for this client. If not passed, falls back to the default inferred from the environment. - :type client_info: :class:`~google.api_core.client_info.ClientInfo` :param client_info: The client info used to send a user-agent string along with API requests. If ``None``, then default info will be used. - :type client_options: :class:`~google.api_core.client_options.ClientOptions` :param client_options: (Optional) Client options used to set user options on the client. - :type attempt_direct_path: bool :param attempt_direct_path: (Optional) Whether to attempt to use DirectPath for gRPC connections. @@ -51,6 +48,18 @@ def __init__( *, attempt_direct_path=True, ): + if client_info is None: + client_info = DEFAULT_CLIENT_INFO + else: + client_info = client_info + client_info.client_library_version = __version__ + # TODO: When metrics all use gccl, this should be removed #9552 + if client_info.user_agent is None: # pragma: no branch + client_info.user_agent = "" + agent_version = f"gcloud-python/{__version__}" + if agent_version not in client_info.user_agent: + client_info.user_agent += f" {agent_version} " + self._grpc_client = self._create_async_grpc_client( credentials=credentials, client_info=client_info, @@ -69,8 +78,6 @@ def _create_async_grpc_client( "grpc_asyncio" ) - if client_info is None: - client_info = DEFAULT_CLIENT_INFO primary_user_agent = client_info.to_user_agent() channel = transport_cls.create_channel( diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index f94729516..b0edfafa6 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -16,10 +16,8 @@ from google.auth import credentials as auth_credentials from google.auth.credentials import AnonymousCredentials from google.api_core import client_info as client_info_lib +from google.cloud.storage import __version__ from google.cloud.storage._experimental.asyncio import async_grpc_client -from google.cloud.storage._experimental.asyncio.async_grpc_client import ( - DEFAULT_CLIENT_INFO, -) def _make_credentials(spec=None): @@ -36,9 +34,6 @@ def test_constructor_default_options(self, mock_async_storage_client): mock_async_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials() - primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() - expected_options = (("grpc.primary_user_agent", primary_user_agent),) - # Act async_grpc_client.AsyncGrpcClient(credentials=mock_creds) @@ -46,6 +41,13 @@ def test_constructor_default_options(self, mock_async_storage_client): mock_async_storage_client.get_transport_class.assert_called_once_with( "grpc_asyncio" ) + kwargs = mock_async_storage_client.call_args.kwargs + client_info = kwargs["client_info"] + agent_version = f"gcloud-python/{__version__}" + assert agent_version in client_info.user_agent + primary_user_agent = client_info.to_user_agent() + expected_options = (("grpc.primary_user_agent", primary_user_agent),) + mock_transport_cls.create_channel.assert_called_once_with( attempt_direct_path=True, credentials=mock_creds, @@ -54,11 +56,8 @@ def test_constructor_default_options(self, mock_async_storage_client): mock_channel = mock_transport_cls.create_channel.return_value mock_transport_cls.assert_called_once_with(channel=mock_channel) mock_transport = mock_transport_cls.return_value - mock_async_storage_client.assert_called_once_with( - transport=mock_transport, - client_options=None, - client_info=DEFAULT_CLIENT_INFO, - ) + assert kwargs["transport"] is mock_transport + assert kwargs["client_options"] is None @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_constructor_with_client_info(self, mock_async_storage_client): @@ -73,6 +72,8 @@ def test_constructor_with_client_info(self, mock_async_storage_client): credentials=mock_creds, client_info=client_info ) + agent_version = f"gcloud-python/{__version__}" + assert agent_version in client_info.user_agent primary_user_agent = client_info.to_user_agent() expected_options = (("grpc.primary_user_agent", primary_user_agent),) @@ -92,7 +93,11 @@ def test_constructor_disables_directpath(self, mock_async_storage_client): credentials=mock_creds, attempt_direct_path=False ) - primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() + kwargs = mock_async_storage_client.call_args.kwargs + client_info = kwargs["client_info"] + agent_version = f"gcloud-python/{__version__}" + assert agent_version in client_info.user_agent + primary_user_agent = client_info.to_user_agent() expected_options = (("grpc.primary_user_agent", primary_user_agent),) mock_transport_cls.create_channel.assert_called_once_with( @@ -109,43 +114,43 @@ def test_grpc_client_property(self, mock_grpc_gapic_client): mock_transport_cls = mock.MagicMock() mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls channel_sentinel = mock.sentinel.channel - mock_transport_cls.create_channel.return_value = channel_sentinel - mock_transport_cls.return_value = mock.sentinel.transport + mock_transport_instance = mock.sentinel.transport + mock_transport_cls.return_value = mock_transport_instance mock_creds = _make_credentials() - mock_client_info = mock.MagicMock(spec=client_info_lib.ClientInfo) - mock_client_info.to_user_agent.return_value = "test-user-agent" + # Use a real ClientInfo instance instead of a mock to properly test user agent logic + client_info = client_info_lib.ClientInfo(user_agent="test-user-agent") mock_client_options = mock.sentinel.client_options mock_attempt_direct_path = mock.sentinel.attempt_direct_path # Act client = async_grpc_client.AsyncGrpcClient( credentials=mock_creds, - client_info=mock_client_info, + client_info=client_info, client_options=mock_client_options, attempt_direct_path=mock_attempt_direct_path, ) + retrieved_client = client.grpc_client # This is what is being tested - mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls + # Assert - verify that gcloud-python agent version was added + agent_version = f"gcloud-python/{__version__}" + assert agent_version in client_info.user_agent + # Also verify original user_agent is still there + assert "test-user-agent" in client_info.user_agent - mock_transport_cls.create_channel.return_value = channel_sentinel - mock_transport_instance = mock.sentinel.transport - mock_transport_cls.return_value = mock_transport_instance - - retrieved_client = client.grpc_client + primary_user_agent = client_info.to_user_agent() + expected_options = (("grpc.primary_user_agent", primary_user_agent),) - # Assert - expected_options = (("grpc.primary_user_agent", "test-user-agent"),) mock_transport_cls.create_channel.assert_called_once_with( attempt_direct_path=mock_attempt_direct_path, credentials=mock_creds, options=expected_options, ) - mock_transport_cls.assere_with(channel=channel_sentinel) + mock_transport_cls.assert_called_once_with(channel=channel_sentinel) mock_grpc_gapic_client.assert_called_once_with( transport=mock_transport_instance, - client_info=mock_client_info, + client_info=client_info, client_options=mock_client_options, ) assert retrieved_client is mock_grpc_gapic_client.return_value @@ -168,7 +173,11 @@ def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): # Assert assert retrieved_client is mock_grpc_gapic_client.return_value - primary_user_agent = DEFAULT_CLIENT_INFO.to_user_agent() + kwargs = mock_grpc_gapic_client.call_args.kwargs + client_info = kwargs["client_info"] + agent_version = f"gcloud-python/{__version__}" + assert agent_version in client_info.user_agent + primary_user_agent = client_info.to_user_agent() expected_options = (("grpc.primary_user_agent", primary_user_agent),) mock_transport_cls.create_channel.assert_called_once_with( @@ -176,4 +185,27 @@ def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): credentials=anonymous_creds, options=expected_options, ) - mock_transport_cls.assert_called_once_with(channel=channel_sentinel) + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + def test_user_agent_with_custom_client_info(self, mock_async_storage_client): + """Test that gcloud-python user agent is appended to existing user agent. + + Regression test similar to test__http.py::TestConnection::test_duplicate_user_agent + """ + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_creds = _make_credentials() + + # Create a client_info with an existing user_agent + client_info = client_info_lib.ClientInfo(user_agent="custom-app/1.0") + + # Act + async_grpc_client.AsyncGrpcClient( + credentials=mock_creds, + client_info=client_info, + ) + + # Assert - verify that gcloud-python version was appended + agent_version = f"gcloud-python/{__version__}" + expected_user_agent = f"custom-app/1.0 {agent_version} " + assert client_info.user_agent == expected_user_agent From 74c9ecc54173420bfcd48498a8956088a035af50 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 29 Jan 2026 14:28:28 +0530 Subject: [PATCH 476/509] feat: Move Zonal Buckets features of `_experimental` (#1728) feat: Move Zonal Buckets features of `_experimental` to --- .../storage/_experimental/asyncio/_utils.py | 48 +- .../asyncio/async_abstract_object_stream.py | 74 +-- .../asyncio/async_appendable_object_writer.py | 600 +----------------- .../asyncio/async_grpc_client.py | 112 +--- .../asyncio/async_multi_range_downloader.py | 511 +-------------- .../asyncio/async_read_object_stream.py | 203 +----- .../asyncio/async_write_object_stream.py | 241 +------ .../_experimental/asyncio/retry/_helpers.py | 130 +--- .../asyncio/retry/base_strategy.py | 90 +-- .../retry/bidi_stream_retry_manager.py | 74 +-- .../retry/reads_resumption_strategy.py | 162 +---- .../retry/writes_resumption_strategy.py | 152 +---- .../storage/_experimental/grpc_client.py | 129 +--- google/cloud/storage/asyncio/_utils.py | 41 ++ .../asyncio/async_abstract_object_stream.py | 67 ++ .../asyncio/async_appendable_object_writer.py | 586 +++++++++++++++++ .../storage/asyncio/async_grpc_client.py | 108 ++++ .../asyncio/async_multi_range_downloader.py | 506 +++++++++++++++ .../asyncio/async_read_object_stream.py | 188 ++++++ .../asyncio/async_write_object_stream.py | 227 +++++++ .../cloud/storage/asyncio/retry/_helpers.py | 125 ++++ .../storage/asyncio/retry/base_strategy.py | 83 +++ .../retry/bidi_stream_retry_manager.py | 69 ++ .../retry/reads_resumption_strategy.py | 157 +++++ .../retry/writes_resumption_strategy.py | 147 +++++ google/cloud/storage/grpc_client.py | 122 ++++ ...rage_create_and_write_appendable_object.py | 4 +- ...orage_finalize_appendable_object_upload.py | 4 +- ...orage_open_multiple_objects_ranged_read.py | 11 +- ...torage_open_object_multiple_ranged_read.py | 4 +- .../storage_open_object_read_full_object.py | 4 +- .../storage_open_object_single_ranged_read.py | 4 +- ...rage_pause_and_resume_appendable_upload.py | 4 +- .../storage_read_appendable_object_tail.py | 6 +- .../zonal_buckets/zonal_snippets_test.py | 4 +- tests/perf/microbenchmarks/conftest.py | 4 +- .../perf/microbenchmarks/reads/test_reads.py | 4 +- .../microbenchmarks/writes/test_writes.py | 4 +- tests/system/test_zonal.py | 6 +- .../retry/test_bidi_stream_retry_manager.py | 4 +- .../retry/test_reads_resumption_strategy.py | 4 +- .../retry/test_writes_resumption_strategy.py | 4 +- .../test_async_appendable_object_writer.py | 12 +- tests/unit/asyncio/test_async_grpc_client.py | 2 +- .../test_async_multi_range_downloader.py | 30 +- .../asyncio/test_async_read_object_stream.py | 52 +- .../asyncio/test_async_write_object_stream.py | 10 +- tests/unit/test_grpc_client.py | 17 +- 48 files changed, 2633 insertions(+), 2517 deletions(-) create mode 100644 google/cloud/storage/asyncio/_utils.py create mode 100644 google/cloud/storage/asyncio/async_abstract_object_stream.py create mode 100644 google/cloud/storage/asyncio/async_appendable_object_writer.py create mode 100644 google/cloud/storage/asyncio/async_grpc_client.py create mode 100644 google/cloud/storage/asyncio/async_multi_range_downloader.py create mode 100644 google/cloud/storage/asyncio/async_read_object_stream.py create mode 100644 google/cloud/storage/asyncio/async_write_object_stream.py create mode 100644 google/cloud/storage/asyncio/retry/_helpers.py create mode 100644 google/cloud/storage/asyncio/retry/base_strategy.py create mode 100644 google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py create mode 100644 google/cloud/storage/asyncio/retry/reads_resumption_strategy.py create mode 100644 google/cloud/storage/asyncio/retry/writes_resumption_strategy.py create mode 100644 google/cloud/storage/grpc_client.py diff --git a/google/cloud/storage/_experimental/asyncio/_utils.py b/google/cloud/storage/_experimental/asyncio/_utils.py index 170a0cfae..7e81a4bc7 100644 --- a/google/cloud/storage/_experimental/asyncio/_utils.py +++ b/google/cloud/storage/_experimental/asyncio/_utils.py @@ -1,41 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -import google_crc32c +# Import everything from the new stable module +from google.cloud.storage.asyncio._utils import * # noqa -from google.api_core import exceptions - - -def raise_if_no_fast_crc32c(): - """Check if the C-accelerated version of google-crc32c is available. - - If not, raise an error to prevent silent performance degradation. - - raises google.api_core.exceptions.FailedPrecondition: If the C extension is not available. - returns: True if the C extension is available. - rtype: bool - - """ - if google_crc32c.implementation != "c": - raise exceptions.FailedPrecondition( - "The google-crc32c package is not installed with C support. " - "C extension is required for faster data integrity checks." - "For more information, see https://github.com/googleapis/python-crc32c." - ) - - -def update_write_handle_if_exists(obj, response): - """Update the write_handle attribute of an object if it exists in the response.""" - if hasattr(response, "write_handle") and response.write_handle is not None: - obj.write_handle = response.write_handle +warnings.warn( + "google.cloud.storage._experimental.asyncio._utils has been moved to google.cloud.storage.asyncio._utils. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, +) diff --git a/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py index 26cbab7a0..538241bd2 100644 --- a/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_abstract_object_stream.py @@ -1,67 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -import abc -from typing import Any, Optional +# Import everything from the new stable module +from google.cloud.storage.asyncio.async_abstract_object_stream import * # noqa - -class _AsyncAbstractObjectStream(abc.ABC): - """Abstract base class to represent gRPC bidi-stream for GCS ``Object``. - - Concrete implementation of this class could be ``_AsyncReadObjectStream`` - or ``_AsyncWriteObjectStream``. - - :type bucket_name: str - :param bucket_name: (Optional) The name of the bucket containing the object. - - :type object_name: str - :param object_name: (Optional) The name of the object. - - :type generation_number: int - :param generation_number: (Optional) If present, selects a specific revision of - this object. - - :type handle: Any - :param handle: (Optional) The handle for the object, could be read_handle or - write_handle, based on how the stream is used. - """ - - def __init__( - self, - bucket_name: str, - object_name: str, - generation_number: Optional[int] = None, - handle: Optional[Any] = None, - ) -> None: - super().__init__() - self.bucket_name: str = bucket_name - self.object_name: str = object_name - self.generation_number: Optional[int] = generation_number - self.handle: Optional[Any] = handle - - @abc.abstractmethod - async def open(self) -> None: - pass - - @abc.abstractmethod - async def close(self) -> None: - pass - - @abc.abstractmethod - async def send(self, protobuf: Any) -> None: - pass - - @abc.abstractmethod - async def recv(self) -> Any: - pass +warnings.warn( + "google.cloud.storage._experimental.asyncio.async_abstract_object_stream has been moved to google.cloud.storage.asyncio.async_abstract_object_stream. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, +) diff --git a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py index 1cc099043..53b813643 100644 --- a/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py @@ -1,595 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -NOTE: -This is _experimental module for upcoming support for Rapid Storage. -(https://cloud.google.com/blog/products/storage-data-transfer/high-performance-storage-innovations-for-ai-hpc#:~:text=your%20AI%20workloads%3A-,Rapid%20Storage,-%3A%20A%20new) +import warnings -APIs may not work as intended and are not stable yet. Feature is not -GA(Generally Available) yet, please contact your TAM (Technical Account Manager) -if you want to use these Rapid Storage APIs. +# Import everything from the new stable module +from google.cloud.storage.asyncio.async_appendable_object_writer import * # noqa -""" -from io import BufferedReader -import io -import logging -from typing import List, Optional, Tuple, Union - -from google.api_core import exceptions -from google.api_core.retry_async import AsyncRetry -from google.rpc import status_pb2 -from google.cloud._storage_v2.types import BidiWriteObjectRedirectedError -from google.cloud._storage_v2.types.storage import BidiWriteObjectRequest - - -from . import _utils -from google.cloud import _storage_v2 -from google.cloud.storage._experimental.asyncio.async_grpc_client import ( - AsyncGrpcClient, -) -from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( - _AsyncWriteObjectStream, -) -from google.cloud.storage._experimental.asyncio.retry.bidi_stream_retry_manager import ( - _BidiStreamRetryManager, -) -from google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy import ( - _WriteResumptionStrategy, - _WriteState, -) -from google.cloud.storage._experimental.asyncio.retry._helpers import ( - _extract_bidi_writes_redirect_proto, +warnings.warn( + "google.cloud.storage._experimental.asyncio.async_appendable_object_writer has been moved to google.cloud.storage.asyncio.async_appendable_object_writer. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) - - -_MAX_CHUNK_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB -_DEFAULT_FLUSH_INTERVAL_BYTES = 16 * 1024 * 1024 # 16 MiB -_BIDI_WRITE_REDIRECTED_TYPE_URL = ( - "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" -) -logger = logging.getLogger(__name__) - - -def _is_write_retryable(exc): - """Predicate to determine if a write operation should be retried.""" - - if isinstance( - exc, - ( - exceptions.InternalServerError, - exceptions.ServiceUnavailable, - exceptions.DeadlineExceeded, - exceptions.TooManyRequests, - BidiWriteObjectRedirectedError, - ), - ): - logger.warning(f"Retryable write exception encountered: {exc}") - return True - - grpc_error = None - if isinstance(exc, exceptions.Aborted) and exc.errors: - grpc_error = exc.errors[0] - if isinstance(grpc_error, BidiWriteObjectRedirectedError): - return True - - trailers = grpc_error.trailing_metadata() - if not trailers: - return False - - status_details_bin = None - for key, value in trailers: - if key == "grpc-status-details-bin": - status_details_bin = value - break - - if status_details_bin: - status_proto = status_pb2.Status() - try: - status_proto.ParseFromString(status_details_bin) - for detail in status_proto.details: - if detail.type_url == _BIDI_WRITE_REDIRECTED_TYPE_URL: - return True - except Exception: - logger.error( - "Error unpacking redirect details from gRPC error. Exception: ", - {exc}, - ) - return False - return False - - -class AsyncAppendableObjectWriter: - """Class for appending data to a GCS Appendable Object asynchronously.""" - - def __init__( - self, - client: AsyncGrpcClient, - bucket_name: str, - object_name: str, - generation: Optional[int] = None, - write_handle: Optional[_storage_v2.BidiWriteHandle] = None, - writer_options: Optional[dict] = None, - ): - """ - Class for appending data to a GCS Appendable Object. - - Example usage: - - ``` - - from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient - from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import AsyncAppendableObjectWriter - import asyncio - - client = AsyncGrpcClient().grpc_client - bucket_name = "my-bucket" - object_name = "my-appendable-object" - - # instantiate the writer - writer = AsyncAppendableObjectWriter(client, bucket_name, object_name) - # open the writer, (underlying gRPC bidi-stream will be opened) - await writer.open() - - # append data, it can be called multiple times. - await writer.append(b"hello world") - await writer.append(b"some more data") - - # optionally flush data to persist. - await writer.flush() - - # close the gRPC stream. - # Please note closing the program will also close the stream, - # however it's recommended to close the stream if no more data to append - # to clean up gRPC connection (which means CPU/memory/network resources) - await writer.close() - ``` - - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient` - :param client: async grpc client to use for making API requests. - - :type bucket_name: str - :param bucket_name: The name of the GCS bucket containing the object. - - :type object_name: str - :param object_name: The name of the GCS Appendable Object to be written. - - :type generation: Optional[int] - :param generation: (Optional) If present, creates writer for that - specific revision of that object. Use this to append data to an - existing Appendable Object. - - Setting to ``0`` makes the `writer.open()` succeed only if - object doesn't exist in the bucket (useful for not accidentally - overwriting existing objects). - - Warning: If `None`, a new object is created. If an object with the - same name already exists, it will be overwritten the moment - `writer.open()` is called. - - :type write_handle: _storage_v2.BidiWriteHandle - :param write_handle: (Optional) An handle for writing the object. - If provided, opening the bidi-gRPC connection will be faster. - - :type writer_options: dict - :param writer_options: (Optional) A dictionary of writer options. - Supported options: - - "FLUSH_INTERVAL_BYTES": int - The number of bytes to append before "persisting" data in GCS - servers. Default is `_DEFAULT_FLUSH_INTERVAL_BYTES`. - Must be a multiple of `_MAX_CHUNK_SIZE_BYTES`. - """ - _utils.raise_if_no_fast_crc32c() - self.client = client - self.bucket_name = bucket_name - self.object_name = object_name - self.write_handle = write_handle - self.generation = generation - - self.write_obj_stream: Optional[_AsyncWriteObjectStream] = None - self._is_stream_open: bool = False - # `offset` is the latest size of the object without staleless. - self.offset: Optional[int] = None - # `persisted_size` is the total_bytes persisted in the GCS server. - # Please note: `offset` and `persisted_size` are same when the stream is - # opened. - self.persisted_size: Optional[int] = None - if writer_options is None: - writer_options = {} - self.flush_interval = writer_options.get( - "FLUSH_INTERVAL_BYTES", _DEFAULT_FLUSH_INTERVAL_BYTES - ) - if self.flush_interval < _MAX_CHUNK_SIZE_BYTES: - raise exceptions.OutOfRange( - f"flush_interval must be >= {_MAX_CHUNK_SIZE_BYTES} , but provided {self.flush_interval}" - ) - if self.flush_interval % _MAX_CHUNK_SIZE_BYTES != 0: - raise exceptions.OutOfRange( - f"flush_interval must be a multiple of {_MAX_CHUNK_SIZE_BYTES}, but provided {self.flush_interval}" - ) - self.bytes_appended_since_last_flush = 0 - self._routing_token: Optional[str] = None - self.object_resource: Optional[_storage_v2.Object] = None - - async def state_lookup(self) -> int: - """Returns the persisted_size - - :rtype: int - :returns: persisted size. - - :raises ValueError: If the stream is not open (i.e., `open()` has not - been called). - """ - if not self._is_stream_open: - raise ValueError("Stream is not open. Call open() before state_lookup().") - - await self.write_obj_stream.send( - _storage_v2.BidiWriteObjectRequest( - state_lookup=True, - ) - ) - response = await self.write_obj_stream.recv() - self.persisted_size = response.persisted_size - return self.persisted_size - - def _on_open_error(self, exc): - """Extracts routing token and write handle on redirect error during open.""" - redirect_proto = _extract_bidi_writes_redirect_proto(exc) - if redirect_proto: - if redirect_proto.routing_token: - self._routing_token = redirect_proto.routing_token - if redirect_proto.write_handle: - self.write_handle = redirect_proto.write_handle - if redirect_proto.generation: - self.generation = redirect_proto.generation - - async def open( - self, - retry_policy: Optional[AsyncRetry] = None, - metadata: Optional[List[Tuple[str, str]]] = None, - ) -> None: - """Opens the underlying bidi-gRPC stream. - - :raises ValueError: If the stream is already open. - - """ - if self._is_stream_open: - raise ValueError("Underlying bidi-gRPC stream is already open") - - if retry_policy is None: - retry_policy = AsyncRetry( - predicate=_is_write_retryable, on_error=self._on_open_error - ) - else: - original_on_error = retry_policy._on_error - - def combined_on_error(exc): - self._on_open_error(exc) - if original_on_error: - original_on_error(exc) - - retry_policy = AsyncRetry( - predicate=_is_write_retryable, - initial=retry_policy._initial, - maximum=retry_policy._maximum, - multiplier=retry_policy._multiplier, - deadline=retry_policy._deadline, - on_error=combined_on_error, - ) - - async def _do_open(): - current_metadata = list(metadata) if metadata else [] - - # Cleanup stream from previous failed attempt, if any. - if self.write_obj_stream: - if self.write_obj_stream.is_stream_open: - try: - await self.write_obj_stream.close() - except Exception as e: - logger.warning( - "Error closing previous write stream during open retry. Got exception: ", - {e}, - ) - self.write_obj_stream = None - self._is_stream_open = False - - self.write_obj_stream = _AsyncWriteObjectStream( - client=self.client.grpc_client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation, - write_handle=self.write_handle, - routing_token=self._routing_token, - ) - - if self._routing_token: - current_metadata.append( - ("x-goog-request-params", f"routing_token={self._routing_token}") - ) - - await self.write_obj_stream.open( - metadata=current_metadata if metadata else None - ) - - if self.write_obj_stream.generation_number: - self.generation = self.write_obj_stream.generation_number - if self.write_obj_stream.write_handle: - self.write_handle = self.write_obj_stream.write_handle - if self.write_obj_stream.persisted_size is not None: - self.persisted_size = self.write_obj_stream.persisted_size - - self._is_stream_open = True - self._routing_token = None - - await retry_policy(_do_open)() - - async def append( - self, - data: bytes, - retry_policy: Optional[AsyncRetry] = None, - metadata: Optional[List[Tuple[str, str]]] = None, - ) -> None: - """Appends data to the Appendable object with automatic retries. - - calling `self.append` will append bytes at the end of the current size - ie. `self.offset` bytes relative to the begining of the object. - - This method sends the provided `data` to the GCS server in chunks. - and persists data in GCS at every `_DEFAULT_FLUSH_INTERVAL_BYTES` bytes - or at the last chunk whichever is earlier. Persisting is done by setting - `flush=True` on request. - - :type data: bytes - :param data: The bytes to append to the object. - - :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` - :param retry_policy: (Optional) The retry policy to use for the operation. - - :type metadata: List[Tuple[str, str]] - :param metadata: (Optional) The metadata to be sent with the request. - - :raises ValueError: If the stream is not open. - """ - if not self._is_stream_open: - raise ValueError("Stream is not open. Call open() before append().") - if not data: - logger.debug("No data provided to append; returning without action.") - return - - if retry_policy is None: - retry_policy = AsyncRetry(predicate=_is_write_retryable) - - strategy = _WriteResumptionStrategy() - buffer = io.BytesIO(data) - attempt_count = 0 - - def send_and_recv_generator( - requests: List[BidiWriteObjectRequest], - state: dict[str, _WriteState], - metadata: Optional[List[Tuple[str, str]]] = None, - ): - async def generator(): - nonlocal attempt_count - nonlocal requests - attempt_count += 1 - resp = None - write_state = state["write_state"] - # If this is a retry or redirect, we must re-open the stream - if attempt_count > 1 or write_state.routing_token: - logger.info( - f"Re-opening the stream with attempt_count: {attempt_count}" - ) - if self.write_obj_stream and self.write_obj_stream.is_stream_open: - await self.write_obj_stream.close() - - current_metadata = list(metadata) if metadata else [] - if write_state.routing_token: - current_metadata.append( - ( - "x-goog-request-params", - f"routing_token={write_state.routing_token}", - ) - ) - self._routing_token = write_state.routing_token - - self._is_stream_open = False - await self.open(metadata=current_metadata) - - write_state.persisted_size = self.persisted_size - write_state.write_handle = self.write_handle - write_state.routing_token = None - - write_state.user_buffer.seek(write_state.persisted_size) - write_state.bytes_sent = write_state.persisted_size - write_state.bytes_since_last_flush = 0 - - requests = strategy.generate_requests(state) - - num_requests = len(requests) - for i, chunk_req in enumerate(requests): - if i == num_requests - 1: - chunk_req.state_lookup = True - chunk_req.flush = True - await self.write_obj_stream.send(chunk_req) - - resp = await self.write_obj_stream.recv() - if resp: - if resp.persisted_size is not None: - self.persisted_size = resp.persisted_size - state["write_state"].persisted_size = resp.persisted_size - self.offset = self.persisted_size - if resp.write_handle: - self.write_handle = resp.write_handle - state["write_state"].write_handle = resp.write_handle - self.bytes_appended_since_last_flush = 0 - - yield resp - - return generator() - - # State initialization - write_state = _WriteState(_MAX_CHUNK_SIZE_BYTES, buffer, self.flush_interval) - write_state.write_handle = self.write_handle - write_state.persisted_size = self.persisted_size - write_state.bytes_sent = self.persisted_size - write_state.bytes_since_last_flush = self.bytes_appended_since_last_flush - - retry_manager = _BidiStreamRetryManager( - _WriteResumptionStrategy(), - lambda r, s: send_and_recv_generator(r, s, metadata), - ) - await retry_manager.execute({"write_state": write_state}, retry_policy) - - # Sync local markers - self.write_obj_stream.persisted_size = write_state.persisted_size - self.write_obj_stream.write_handle = write_state.write_handle - self.bytes_appended_since_last_flush = write_state.bytes_since_last_flush - self.persisted_size = write_state.persisted_size - self.offset = write_state.persisted_size - - async def simple_flush(self) -> None: - """Flushes the data to the server. - Please note: Unlike `flush` it does not do `state_lookup` - - :rtype: None - - :raises ValueError: If the stream is not open (i.e., `open()` has not - been called). - """ - if not self._is_stream_open: - raise ValueError("Stream is not open. Call open() before simple_flush().") - - await self.write_obj_stream.send( - _storage_v2.BidiWriteObjectRequest( - flush=True, - ) - ) - self.bytes_appended_since_last_flush = 0 - - async def flush(self) -> int: - """Flushes the data to the server. - - :rtype: int - :returns: The persisted size after flush. - - :raises ValueError: If the stream is not open (i.e., `open()` has not - been called). - """ - if not self._is_stream_open: - raise ValueError("Stream is not open. Call open() before flush().") - - await self.write_obj_stream.send( - _storage_v2.BidiWriteObjectRequest( - flush=True, - state_lookup=True, - ) - ) - response = await self.write_obj_stream.recv() - self.persisted_size = response.persisted_size - self.offset = self.persisted_size - self.bytes_appended_since_last_flush = 0 - return self.persisted_size - - async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object]: - """Closes the underlying bidi-gRPC stream. - - :type finalize_on_close: bool - :param finalize_on_close: Finalizes the Appendable Object. No more data - can be appended. - - rtype: Union[int, _storage_v2.Object] - returns: Updated `self.persisted_size` by default after closing the - bidi-gRPC stream. However, if `finalize_on_close=True` is passed, - returns the finalized object resource. - - :raises ValueError: If the stream is not open (i.e., `open()` has not - been called). - - """ - if not self._is_stream_open: - raise ValueError("Stream is not open. Call open() before close().") - - if finalize_on_close: - return await self.finalize() - - await self.write_obj_stream.close() - - self._is_stream_open = False - self.offset = None - return self.persisted_size - - async def finalize(self) -> _storage_v2.Object: - """Finalizes the Appendable Object. - - Note: Once finalized no more data can be appended. - This method is different from `close`. if `.close()` is called data may - still be appended to object at a later point in time by opening with - generation number. - (i.e. `open(..., generation=)`. - However if `.finalize()` is called no more data can be appended to the - object. - - rtype: google.cloud.storage_v2.types.Object - returns: The finalized object resource. - - :raises ValueError: If the stream is not open (i.e., `open()` has not - been called). - """ - if not self._is_stream_open: - raise ValueError("Stream is not open. Call open() before finalize().") - - await self.write_obj_stream.send( - _storage_v2.BidiWriteObjectRequest(finish_write=True) - ) - response = await self.write_obj_stream.recv() - self.object_resource = response.resource - self.persisted_size = self.object_resource.size - await self.write_obj_stream.close() - - self._is_stream_open = False - self.offset = None - return self.object_resource - - @property - def is_stream_open(self) -> bool: - return self._is_stream_open - - # helper methods. - async def append_from_string(self, data: str): - """ - str data will be encoded to bytes using utf-8 encoding calling - - self.append(data.encode("utf-8")) - """ - raise NotImplementedError("append_from_string is not implemented yet.") - - async def append_from_stream(self, stream_obj): - """ - At a time read a chunk of data (16MiB) from `stream_obj` - and call self.append(chunk) - """ - raise NotImplementedError("append_from_stream is not implemented yet.") - - async def append_from_file( - self, file_obj: BufferedReader, block_size: int = _DEFAULT_FLUSH_INTERVAL_BYTES - ): - """ - Appends data to an Appendable Object using file_handle which is opened - for reading in binary mode. - - :type file_obj: file - :param file_obj: A file handle opened in binary mode for reading. - - """ - while block := file_obj.read(block_size): - await self.append(block) diff --git a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py index 47c371cd6..558ff0c5a 100644 --- a/google/cloud/storage/_experimental/asyncio/async_grpc_client.py +++ b/google/cloud/storage/_experimental/asyncio/async_grpc_client.py @@ -1,107 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -"""An async client for interacting with Google Cloud Storage using the gRPC API.""" +# Import everything from the new stable module +from google.cloud.storage.asyncio.async_grpc_client import * # noqa -from google.cloud import _storage_v2 as storage_v2 -from google.cloud._storage_v2.services.storage.transports.base import ( - DEFAULT_CLIENT_INFO, +warnings.warn( + "google.cloud.storage._experimental.asyncio.async_grpc_client has been moved to google.cloud.storage.asyncio.async_grpc_client. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) -from google.cloud.storage import __version__ - - -class AsyncGrpcClient: - """An asynchronous client for interacting with Google Cloud Storage using the gRPC API. - :type credentials: :class:`~google.auth.credentials.Credentials` - :param credentials: (Optional) The OAuth2 Credentials to use for this - client. If not passed, falls back to the default - inferred from the environment. - :type client_info: :class:`~google.api_core.client_info.ClientInfo` - :param client_info: - The client info used to send a user-agent string along with API - requests. If ``None``, then default info will be used. - :type client_options: :class:`~google.api_core.client_options.ClientOptions` - :param client_options: (Optional) Client options used to set user options - on the client. - :type attempt_direct_path: bool - :param attempt_direct_path: - (Optional) Whether to attempt to use DirectPath for gRPC connections. - Defaults to ``True``. - """ - - def __init__( - self, - credentials=None, - client_info=None, - client_options=None, - *, - attempt_direct_path=True, - ): - if client_info is None: - client_info = DEFAULT_CLIENT_INFO - else: - client_info = client_info - client_info.client_library_version = __version__ - # TODO: When metrics all use gccl, this should be removed #9552 - if client_info.user_agent is None: # pragma: no branch - client_info.user_agent = "" - agent_version = f"gcloud-python/{__version__}" - if agent_version not in client_info.user_agent: - client_info.user_agent += f" {agent_version} " - - self._grpc_client = self._create_async_grpc_client( - credentials=credentials, - client_info=client_info, - client_options=client_options, - attempt_direct_path=attempt_direct_path, - ) - - def _create_async_grpc_client( - self, - credentials=None, - client_info=None, - client_options=None, - attempt_direct_path=True, - ): - transport_cls = storage_v2.StorageAsyncClient.get_transport_class( - "grpc_asyncio" - ) - - primary_user_agent = client_info.to_user_agent() - - channel = transport_cls.create_channel( - attempt_direct_path=attempt_direct_path, - credentials=credentials, - options=(("grpc.primary_user_agent", primary_user_agent),), - ) - transport = transport_cls(channel=channel) - - return storage_v2.StorageAsyncClient( - transport=transport, - client_info=client_info, - client_options=client_options, - ) - - @property - def grpc_client(self): - """The underlying gRPC client. - - This property gives users direct access to the `_storage_v2.StorageAsyncClient` - instance. This can be useful for accessing - newly added or experimental RPCs that are not yet exposed through - the high-level GrpcClient. - Returns: - google.cloud._storage_v2.StorageAsyncClient: The configured GAPIC client. - """ - return self._grpc_client diff --git a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py index 340f087da..bfc2c7c2b 100644 --- a/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/_experimental/asyncio/async_multi_range_downloader.py @@ -1,506 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -from __future__ import annotations -import asyncio -import logging -from google.api_core import exceptions -from google.api_core.retry_async import AsyncRetry -from google.cloud.storage._experimental.asyncio.retry._helpers import _handle_redirect -from google.rpc import status_pb2 +# Import everything from the new stable module +from google.cloud.storage.asyncio.async_multi_range_downloader import * # noqa -from typing import List, Optional, Tuple, Any, Dict - -from ._utils import raise_if_no_fast_crc32c -from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( - _AsyncReadObjectStream, -) -from google.cloud.storage._experimental.asyncio.async_grpc_client import ( - AsyncGrpcClient, -) -from google.cloud.storage._experimental.asyncio.retry.bidi_stream_retry_manager import ( - _BidiStreamRetryManager, -) -from google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy import ( - _ReadResumptionStrategy, - _DownloadState, -) - -from io import BytesIO -from google.cloud import _storage_v2 -from google.cloud.storage._helpers import generate_random_56_bit_integer - - -_MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 -_BIDI_READ_REDIRECTED_TYPE_URL = ( - "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +warnings.warn( + "google.cloud.storage._experimental.asyncio.async_multi_range_downloader has been moved to google.cloud.storage.asyncio.async_multi_range_downloader. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) - -logger = logging.getLogger(__name__) - - -def _is_read_retryable(exc): - """Predicate to determine if a read operation should be retried.""" - if isinstance( - exc, - ( - exceptions.InternalServerError, - exceptions.ServiceUnavailable, - exceptions.DeadlineExceeded, - exceptions.TooManyRequests, - ), - ): - return True - - if not isinstance(exc, exceptions.Aborted) or not exc.errors: - return False - - try: - grpc_error = exc.errors[0] - trailers = grpc_error.trailing_metadata() - if not trailers: - return False - - status_details_bin = next( - (v for k, v in trailers if k == "grpc-status-details-bin"), None - ) - - if not status_details_bin: - return False - - status_proto = status_pb2.Status() - status_proto.ParseFromString(status_details_bin) - return any( - detail.type_url == _BIDI_READ_REDIRECTED_TYPE_URL - for detail in status_proto.details - ) - except Exception as e: - logger.error(f"Error parsing status_details_bin: {e}") - return False - - -class AsyncMultiRangeDownloader: - """Provides an interface for downloading multiple ranges of a GCS ``Object`` - concurrently. - - Example usage: - - .. code-block:: python - - client = AsyncGrpcClient().grpc_client - mrd = await AsyncMultiRangeDownloader.create_mrd( - client, bucket_name="chandrasiri-rs", object_name="test_open9" - ) - my_buff1 = open('my_fav_file.txt', 'wb') - my_buff2 = BytesIO() - my_buff3 = BytesIO() - my_buff4 = any_object_which_provides_BytesIO_like_interface() - await mrd.download_ranges( - [ - # (start_byte, bytes_to_read, writeable_buffer) - (0, 100, my_buff1), - (100, 20, my_buff2), - (200, 123, my_buff3), - (300, 789, my_buff4), - ] - ) - - # verify data in buffers... - assert my_buff2.getbuffer().nbytes == 20 - - - """ - - @classmethod - async def create_mrd( - cls, - client: AsyncGrpcClient, - bucket_name: str, - object_name: str, - generation_number: Optional[int] = None, - read_handle: Optional[_storage_v2.BidiReadHandle] = None, - retry_policy: Optional[AsyncRetry] = None, - metadata: Optional[List[Tuple[str, str]]] = None, - ) -> AsyncMultiRangeDownloader: - """Initializes a MultiRangeDownloader and opens the underlying bidi-gRPC - object for reading. - - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient` - :param client: The asynchronous client to use for making API requests. - - :type bucket_name: str - :param bucket_name: The name of the bucket containing the object. - - :type object_name: str - :param object_name: The name of the object to be read. - - :type generation_number: int - :param generation_number: (Optional) If present, selects a specific - revision of this object. - - :type read_handle: _storage_v2.BidiReadHandle - :param read_handle: (Optional) An existing handle for reading the object. - If provided, opening the bidi-gRPC connection will be faster. - - :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` - :param retry_policy: (Optional) The retry policy to use for the ``open`` operation. - - :type metadata: List[Tuple[str, str]] - :param metadata: (Optional) The metadata to be sent with the ``open`` request. - - :rtype: :class:`~google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader` - :returns: An initialized AsyncMultiRangeDownloader instance for reading. - """ - mrd = cls(client, bucket_name, object_name, generation_number, read_handle) - await mrd.open(retry_policy=retry_policy, metadata=metadata) - return mrd - - def __init__( - self, - client: AsyncGrpcClient, - bucket_name: str, - object_name: str, - generation_number: Optional[int] = None, - read_handle: Optional[_storage_v2.BidiReadHandle] = None, - ) -> None: - """Constructor for AsyncMultiRangeDownloader, clients are not adviced to - use it directly. Instead it's adviced to use the classmethod `create_mrd`. - - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient` - :param client: The asynchronous client to use for making API requests. - - :type bucket_name: str - :param bucket_name: The name of the bucket containing the object. - - :type object_name: str - :param object_name: The name of the object to be read. - - :type generation_number: int - :param generation_number: (Optional) If present, selects a specific revision of - this object. - - :type read_handle: _storage_v2.BidiReadHandle - :param read_handle: (Optional) An existing read handle. - """ - - raise_if_no_fast_crc32c() - - self.client = client - self.bucket_name = bucket_name - self.object_name = object_name - self.generation_number = generation_number - self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle - self.read_obj_str: Optional[_AsyncReadObjectStream] = None - self._is_stream_open: bool = False - self._routing_token: Optional[str] = None - self._read_id_to_writable_buffer_dict = {} - self._read_id_to_download_ranges_id = {} - self._download_ranges_id_to_pending_read_ids = {} - self.persisted_size: Optional[int] = None # updated after opening the stream - - async def __aenter__(self): - """Opens the underlying bidi-gRPC connection to read from the object.""" - await self.open() - return self - - async def __aexit__(self, exc_type, exc_val, exc_tb): - """Closes the underlying bidi-gRPC connection.""" - if self.is_stream_open: - await self.close() - - def _on_open_error(self, exc): - """Extracts routing token and read handle on redirect error during open.""" - routing_token, read_handle = _handle_redirect(exc) - if routing_token: - self._routing_token = routing_token - if read_handle: - self.read_handle = read_handle - - async def open( - self, - retry_policy: Optional[AsyncRetry] = None, - metadata: Optional[List[Tuple[str, str]]] = None, - ) -> None: - """Opens the bidi-gRPC connection to read from the object.""" - if self._is_stream_open: - raise ValueError("Underlying bidi-gRPC stream is already open") - - if retry_policy is None: - retry_policy = AsyncRetry( - predicate=_is_read_retryable, on_error=self._on_open_error - ) - else: - original_on_error = retry_policy._on_error - - def combined_on_error(exc): - self._on_open_error(exc) - if original_on_error: - original_on_error(exc) - - retry_policy = AsyncRetry( - predicate=_is_read_retryable, - initial=retry_policy._initial, - maximum=retry_policy._maximum, - multiplier=retry_policy._multiplier, - deadline=retry_policy._deadline, - on_error=combined_on_error, - ) - - async def _do_open(): - current_metadata = list(metadata) if metadata else [] - - # Cleanup stream from previous failed attempt, if any. - if self.read_obj_str: - if self.read_obj_str.is_stream_open: - try: - await self.read_obj_str.close() - except exceptions.GoogleAPICallError as e: - logger.warning( - f"Failed to close existing stream during resumption: {e}" - ) - self.read_obj_str = None - self._is_stream_open = False - - self.read_obj_str = _AsyncReadObjectStream( - client=self.client.grpc_client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation_number, - read_handle=self.read_handle, - ) - - if self._routing_token: - current_metadata.append( - ("x-goog-request-params", f"routing_token={self._routing_token}") - ) - self._routing_token = None - - await self.read_obj_str.open( - metadata=current_metadata if current_metadata else None - ) - - if self.read_obj_str.generation_number: - self.generation_number = self.read_obj_str.generation_number - if self.read_obj_str.read_handle: - self.read_handle = self.read_obj_str.read_handle - if self.read_obj_str.persisted_size is not None: - self.persisted_size = self.read_obj_str.persisted_size - - self._is_stream_open = True - - await retry_policy(_do_open)() - - async def download_ranges( - self, - read_ranges: List[Tuple[int, int, BytesIO]], - lock: asyncio.Lock = None, - retry_policy: Optional[AsyncRetry] = None, - metadata: Optional[List[Tuple[str, str]]] = None, - ) -> None: - """Downloads multiple byte ranges from the object into the buffers - provided by user with automatic retries. - - :type read_ranges: List[Tuple[int, int, "BytesIO"]] - :param read_ranges: A list of tuples, where each tuple represents a - combination of byte_range and writeable buffer in format - - (`start_byte`, `bytes_to_read`, `writeable_buffer`). Buffer has - to be provided by the user, and user has to make sure appropriate - memory is available in the application to avoid out-of-memory crash. - - Special cases: - if the value of `bytes_to_read` is 0, it'll be interpreted as - download all contents until the end of the file from `start_byte`. - Examples: - * (0, 0, buffer) : downloads 0 to end , i.e. entire object. - * (100, 0, buffer) : downloads from 100 to end. - - - :type lock: asyncio.Lock - :param lock: (Optional) An asyncio lock to synchronize sends and recvs - on the underlying bidi-GRPC stream. This is required when multiple - coroutines are calling this method concurrently. - - i.e. Example usage with multiple coroutines: - - ``` - lock = asyncio.Lock() - task1 = asyncio.create_task(mrd.download_ranges(ranges1, lock)) - task2 = asyncio.create_task(mrd.download_ranges(ranges2, lock)) - await asyncio.gather(task1, task2) - - ``` - - If user want to call this method serially from multiple coroutines, - then providing a lock is not necessary. - - ``` - await mrd.download_ranges(ranges1) - await mrd.download_ranges(ranges2) - - # ... some other code code... - - ``` - - :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` - :param retry_policy: (Optional) The retry policy to use for the operation. - - :raises ValueError: if the underlying bidi-GRPC stream is not open. - :raises ValueError: if the length of read_ranges is more than 1000. - :raises DataCorruption: if a checksum mismatch is detected while reading data. - - """ - - if len(read_ranges) > 1000: - raise ValueError( - "Invalid input - length of read_ranges cannot be more than 1000" - ) - - if not self._is_stream_open: - raise ValueError("Underlying bidi-gRPC stream is not open") - - if lock is None: - lock = asyncio.Lock() - - if retry_policy is None: - retry_policy = AsyncRetry(predicate=_is_read_retryable) - - # Initialize Global State for Retry Strategy - download_states = {} - for read_range in read_ranges: - read_id = generate_random_56_bit_integer() - download_states[read_id] = _DownloadState( - initial_offset=read_range[0], - initial_length=read_range[1], - user_buffer=read_range[2], - ) - - initial_state = { - "download_states": download_states, - "read_handle": self.read_handle, - "routing_token": None, - } - - # Track attempts to manage stream reuse - attempt_count = 0 - - def send_ranges_and_get_bytes( - requests: List[_storage_v2.ReadRange], - state: Dict[str, Any], - metadata: Optional[List[Tuple[str, str]]] = None, - ): - async def generator(): - nonlocal attempt_count - attempt_count += 1 - - if attempt_count > 1: - logger.info( - f"Resuming download (attempt {attempt_count - 1}) for {len(requests)} ranges." - ) - - async with lock: - current_handle = state.get("read_handle") - current_token = state.get("routing_token") - - # We reopen if it's a redirect (token exists) OR if this is a retry - # (not first attempt). This prevents trying to send data on a dead - # stream from a previous failed attempt. - should_reopen = ( - (attempt_count > 1) - or (current_token is not None) - or (metadata is not None) - ) - - if should_reopen: - if current_token: - logger.info( - f"Re-opening stream with routing token: {current_token}" - ) - # Close existing stream if any - if self.read_obj_str and self.read_obj_str.is_stream_open: - await self.read_obj_str.close() - - # Re-initialize stream - self.read_obj_str = _AsyncReadObjectStream( - client=self.client.grpc_client, - bucket_name=self.bucket_name, - object_name=self.object_name, - generation_number=self.generation_number, - read_handle=current_handle, - ) - - # Inject routing_token into metadata if present - current_metadata = list(metadata) if metadata else [] - if current_token: - current_metadata.append( - ( - "x-goog-request-params", - f"routing_token={current_token}", - ) - ) - - await self.read_obj_str.open( - metadata=current_metadata if current_metadata else None - ) - self._is_stream_open = True - - pending_read_ids = {r.read_id for r in requests} - - # Send Requests - for i in range( - 0, len(requests), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST - ): - batch = requests[i : i + _MAX_READ_RANGES_PER_BIDI_READ_REQUEST] - await self.read_obj_str.send( - _storage_v2.BidiReadObjectRequest(read_ranges=batch) - ) - - while pending_read_ids: - response = await self.read_obj_str.recv() - if response is None: - break - if response.object_data_ranges: - for data_range in response.object_data_ranges: - if data_range.range_end: - pending_read_ids.discard( - data_range.read_range.read_id - ) - yield response - - return generator() - - strategy = _ReadResumptionStrategy() - retry_manager = _BidiStreamRetryManager( - strategy, lambda r, s: send_ranges_and_get_bytes(r, s, metadata=metadata) - ) - - await retry_manager.execute(initial_state, retry_policy) - - if initial_state.get("read_handle"): - self.read_handle = initial_state["read_handle"] - - async def close(self): - """ - Closes the underlying bidi-gRPC connection. - """ - if not self._is_stream_open: - raise ValueError("Underlying bidi-gRPC stream is not open") - - if self.read_obj_str: - await self.read_obj_str.close() - self.read_obj_str = None - self._is_stream_open = False - - @property - def is_stream_open(self) -> bool: - return self._is_stream_open diff --git a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py index b59c7d162..cb39386f2 100644 --- a/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_read_object_stream.py @@ -1,198 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -NOTE: -This is _experimental module for upcoming support for Rapid Storage. -(https://cloud.google.com/blog/products/storage-data-transfer/high-performance-storage-innovations-for-ai-hpc#:~:text=your%20AI%20workloads%3A-,Rapid%20Storage,-%3A%20A%20new) +import warnings -APIs may not work as intended and are not stable yet. Feature is not -GA(Generally Available) yet, please contact your TAM(Technical Account Manager) -if you want to use these APIs. +# Import everything from the new stable module +from google.cloud.storage.asyncio.async_read_object_stream import * # noqa -""" - -from typing import List, Optional, Tuple -from google.cloud import _storage_v2 -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( - _AsyncAbstractObjectStream, +warnings.warn( + "google.cloud.storage._experimental.asyncio.async_read_object_stream has been moved to google.cloud.storage.asyncio.async_read_object_stream. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) - -from google.api_core.bidi_async import AsyncBidiRpc - - -class _AsyncReadObjectStream(_AsyncAbstractObjectStream): - """Class representing a gRPC bidi-stream for reading data from a GCS ``Object``. - - This class provides a unix socket-like interface to a GCS ``Object``, with - methods like ``open``, ``close``, ``send``, and ``recv``. - - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` - :param client: async grpc client to use for making API requests. - - :type bucket_name: str - :param bucket_name: The name of the GCS ``bucket`` containing the object. - - :type object_name: str - :param object_name: The name of the GCS ``object`` to be read. - - :type generation_number: int - :param generation_number: (Optional) If present, selects a specific revision of - this object. - - :type read_handle: _storage_v2.BidiReadHandle - :param read_handle: (Optional) An existing handle for reading the object. - If provided, opening the bidi-gRPC connection will be faster. - """ - - def __init__( - self, - client: AsyncGrpcClient.grpc_client, - bucket_name: str, - object_name: str, - generation_number: Optional[int] = None, - read_handle: Optional[_storage_v2.BidiReadHandle] = None, - ) -> None: - if client is None: - raise ValueError("client must be provided") - if bucket_name is None: - raise ValueError("bucket_name must be provided") - if object_name is None: - raise ValueError("object_name must be provided") - - super().__init__( - bucket_name=bucket_name, - object_name=object_name, - generation_number=generation_number, - ) - self.client: AsyncGrpcClient.grpc_client = client - self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle - - self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" - - self.rpc = self.client._client._transport._wrapped_methods[ - self.client._client._transport.bidi_read_object - ] - self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) - self.socket_like_rpc: Optional[AsyncBidiRpc] = None - self._is_stream_open: bool = False - self.persisted_size: Optional[int] = None - - async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: - """Opens the bidi-gRPC connection to read from the object. - - This method sends an initial request to start the stream and receives - the first response containing metadata and a read handle. - - Args: - metadata (Optional[List[Tuple[str, str]]]): Additional metadata - to send with the initial stream request, e.g., for routing tokens. - """ - if self._is_stream_open: - raise ValueError("Stream is already open") - - read_handle = self.read_handle if self.read_handle else None - - read_object_spec = _storage_v2.BidiReadObjectSpec( - bucket=self._full_bucket_name, - object=self.object_name, - generation=self.generation_number if self.generation_number else None, - read_handle=read_handle, - ) - self.first_bidi_read_req = _storage_v2.BidiReadObjectRequest( - read_object_spec=read_object_spec - ) - - # Build the x-goog-request-params header - request_params = [f"bucket={self._full_bucket_name}"] - other_metadata = [] - if metadata: - for key, value in metadata: - if key == "x-goog-request-params": - request_params.append(value) - else: - other_metadata.append((key, value)) - - current_metadata = other_metadata - current_metadata.append(("x-goog-request-params", ",".join(request_params))) - - self.socket_like_rpc = AsyncBidiRpc( - self.rpc, - initial_request=self.first_bidi_read_req, - metadata=current_metadata, - ) - await self.socket_like_rpc.open() # this is actually 1 send - response = await self.socket_like_rpc.recv() - # populated only in the first response of bidi-stream and when opened - # without using `read_handle` - if hasattr(response, "metadata") and response.metadata: - if self.generation_number is None: - self.generation_number = response.metadata.generation - # update persisted size - self.persisted_size = response.metadata.size - - if response and response.read_handle: - self.read_handle = response.read_handle - - self._is_stream_open = True - - async def close(self) -> None: - """Closes the bidi-gRPC connection.""" - if not self._is_stream_open: - raise ValueError("Stream is not open") - await self.requests_done() - await self.socket_like_rpc.close() - self._is_stream_open = False - - async def requests_done(self): - """Signals that all requests have been sent.""" - - await self.socket_like_rpc.send(None) - await self.socket_like_rpc.recv() - - async def send( - self, bidi_read_object_request: _storage_v2.BidiReadObjectRequest - ) -> None: - """Sends a request message on the stream. - - Args: - bidi_read_object_request (:class:`~google.cloud._storage_v2.types.BidiReadObjectRequest`): - The request message to send. This is typically used to specify - the read offset and limit. - """ - if not self._is_stream_open: - raise ValueError("Stream is not open") - await self.socket_like_rpc.send(bidi_read_object_request) - - async def recv(self) -> _storage_v2.BidiReadObjectResponse: - """Receives a response from the stream. - - This method waits for the next message from the server, which could - contain object data or metadata. - - Returns: - :class:`~google.cloud._storage_v2.types.BidiReadObjectResponse`: - The response message from the server. - """ - if not self._is_stream_open: - raise ValueError("Stream is not open") - response = await self.socket_like_rpc.recv() - # Update read_handle if present in response - if response and response.read_handle: - self.read_handle = response.read_handle - return response - - @property - def is_stream_open(self) -> bool: - return self._is_stream_open diff --git a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py index b73a43d1b..132e2c9d0 100644 --- a/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/_experimental/asyncio/async_write_object_stream.py @@ -1,236 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -NOTE: -This is _experimental module for upcoming support for Rapid Storage. -(https://cloud.google.com/blog/products/storage-data-transfer/high-performance-storage-innovations-for-ai-hpc#:~:text=your%20AI%20workloads%3A-,Rapid%20Storage,-%3A%20A%20new) +import warnings -APIs may not work as intended and are not stable yet. Feature is not -GA(Generally Available) yet, please contact your TAM(Technical Account Manager) -if you want to use these Rapid Storage APIs. +# Import everything from the new stable module +from google.cloud.storage.asyncio.async_write_object_stream import * # noqa -""" -from typing import List, Optional, Tuple -from google.cloud import _storage_v2 -from google.cloud.storage._experimental.asyncio import _utils -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( - _AsyncAbstractObjectStream, +warnings.warn( + "google.cloud.storage._experimental.asyncio.async_write_object_stream has been moved to google.cloud.storage.asyncio.async_write_object_stream. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) -from google.api_core.bidi_async import AsyncBidiRpc - - -class _AsyncWriteObjectStream(_AsyncAbstractObjectStream): - """Class representing a gRPC bidi-stream for writing data from a GCS - ``Appendable Object``. - - This class provides a unix socket-like interface to a GCS ``Object``, with - methods like ``open``, ``close``, ``send``, and ``recv``. - - :type client: :class:`~google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` - :param client: async grpc client to use for making API requests. - - :type bucket_name: str - :param bucket_name: The name of the GCS ``bucket`` containing the object. - - :type object_name: str - :param object_name: The name of the GCS ``Appendable Object`` to be write. - - :type generation_number: int - :param generation_number: (Optional) If present, creates writer for that - specific revision of that object. Use this to append data to an - existing Appendable Object. - - Setting to ``0`` makes the `writer.open()` succeed only if - object doesn't exist in the bucket (useful for not accidentally - overwriting existing objects). - - Warning: If `None`, a new object is created. If an object with the - same name already exists, it will be overwritten the moment - `writer.open()` is called. - - :type write_handle: _storage_v2.BidiWriteHandle - :param write_handle: (Optional) An existing handle for writing the object. - If provided, opening the bidi-gRPC connection will be faster. - """ - - def __init__( - self, - client: AsyncGrpcClient.grpc_client, - bucket_name: str, - object_name: str, - generation_number: Optional[int] = None, # None means new object - write_handle: Optional[_storage_v2.BidiWriteHandle] = None, - routing_token: Optional[str] = None, - ) -> None: - if client is None: - raise ValueError("client must be provided") - if bucket_name is None: - raise ValueError("bucket_name must be provided") - if object_name is None: - raise ValueError("object_name must be provided") - - super().__init__( - bucket_name=bucket_name, - object_name=object_name, - generation_number=generation_number, - ) - self.client: AsyncGrpcClient.grpc_client = client - self.write_handle: Optional[_storage_v2.BidiWriteHandle] = write_handle - self.routing_token: Optional[str] = routing_token - - self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" - - self.rpc = self.client._client._transport._wrapped_methods[ - self.client._client._transport.bidi_write_object - ] - - self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) - self.socket_like_rpc: Optional[AsyncBidiRpc] = None - self._is_stream_open: bool = False - self.first_bidi_write_req = None - self.persisted_size = 0 - self.object_resource: Optional[_storage_v2.Object] = None - - async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: - """ - Opens the bidi-gRPC connection to write to the object. - - This method sends an initial request to start the stream and receives - the first response containing metadata and a write handle. - - :rtype: None - :raises ValueError: If the stream is already open. - :raises google.api_core.exceptions.FailedPrecondition: - if `generation_number` is 0 and object already exists. - """ - if self._is_stream_open: - raise ValueError("Stream is already open") - - # Create a new object or overwrite existing one if generation_number - # is None. This makes it consistent with GCS JSON API behavior. - # Created object type would be Appendable Object. - # if `generation_number` == 0 new object will be created only if there - # isn't any existing object. - if self.generation_number is None or self.generation_number == 0: - self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( - write_object_spec=_storage_v2.WriteObjectSpec( - resource=_storage_v2.Object( - name=self.object_name, bucket=self._full_bucket_name - ), - appendable=True, - if_generation_match=self.generation_number, - ), - ) - else: - self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( - append_object_spec=_storage_v2.AppendObjectSpec( - bucket=self._full_bucket_name, - object=self.object_name, - generation=self.generation_number, - write_handle=self.write_handle if self.write_handle else None, - routing_token=self.routing_token if self.routing_token else None, - ), - ) - - request_param_values = [f"bucket={self._full_bucket_name}"] - final_metadata = [] - if metadata: - for key, value in metadata: - if key == "x-goog-request-params": - request_param_values.append(value) - else: - final_metadata.append((key, value)) - - final_metadata.append(("x-goog-request-params", ",".join(request_param_values))) - - self.socket_like_rpc = AsyncBidiRpc( - self.rpc, - initial_request=self.first_bidi_write_req, - metadata=final_metadata, - ) - - await self.socket_like_rpc.open() # this is actually 1 send - response = await self.socket_like_rpc.recv() - self._is_stream_open = True - - if response.persisted_size: - self.persisted_size = response.persisted_size - - if response.resource: - if not response.resource.size: - # Appending to a 0 byte appendable object. - self.persisted_size = 0 - else: - self.persisted_size = response.resource.size - - self.generation_number = response.resource.generation - - if response.write_handle: - self.write_handle = response.write_handle - - async def close(self) -> None: - """Closes the bidi-gRPC connection.""" - if not self._is_stream_open: - raise ValueError("Stream is not open") - await self.requests_done() - await self.socket_like_rpc.close() - self._is_stream_open = False - - async def requests_done(self): - """Signals that all requests have been sent.""" - - await self.socket_like_rpc.send(None) - _utils.update_write_handle_if_exists(self, await self.socket_like_rpc.recv()) - - async def send( - self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest - ) -> None: - """Sends a request message on the stream. - - Args: - bidi_write_object_request (:class:`~google.cloud._storage_v2.types.BidiReadObjectRequest`): - The request message to send. This is typically used to specify - the read offset and limit. - """ - if not self._is_stream_open: - raise ValueError("Stream is not open") - await self.socket_like_rpc.send(bidi_write_object_request) - - async def recv(self) -> _storage_v2.BidiWriteObjectResponse: - """Receives a response from the stream. - - This method waits for the next message from the server, which could - contain object data or metadata. - - Returns: - :class:`~google.cloud._storage_v2.types.BidiWriteObjectResponse`: - The response message from the server. - """ - if not self._is_stream_open: - raise ValueError("Stream is not open") - response = await self.socket_like_rpc.recv() - # Update write_handle if present in response - if response: - if response.write_handle: - self.write_handle = response.write_handle - if response.persisted_size is not None: - self.persisted_size = response.persisted_size - if response.resource and response.resource.size: - self.persisted_size = response.resource.size - return response - - @property - def is_stream_open(self) -> bool: - return self._is_stream_open diff --git a/google/cloud/storage/_experimental/asyncio/retry/_helpers.py b/google/cloud/storage/_experimental/asyncio/retry/_helpers.py index d9ad2462e..092986f58 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/_helpers.py +++ b/google/cloud/storage/_experimental/asyncio/retry/_helpers.py @@ -1,125 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -from __future__ import annotations +# Import everything from the new stable module +from google.cloud.storage.asyncio.retry._helpers import * # noqa -import logging -from typing import Tuple, Optional - -from google.api_core import exceptions -from google.cloud._storage_v2.types import ( - BidiReadObjectRedirectedError, - BidiWriteObjectRedirectedError, -) -from google.rpc import status_pb2 - -_BIDI_READ_REDIRECTED_TYPE_URL = ( - "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +warnings.warn( + "google.cloud.storage._experimental.asyncio.retry._helpers has been moved to google.cloud.storage.asyncio.retry._helpers. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) -_BIDI_WRITE_REDIRECTED_TYPE_URL = ( - "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" -) -logger = logging.getLogger(__name__) - - -def _handle_redirect( - exc: Exception, -) -> Tuple[Optional[str], Optional[bytes]]: - """ - Extracts routing token and read handle from a gRPC error. - - :type exc: Exception - :param exc: The exception to parse. - - :rtype: Tuple[Optional[str], Optional[bytes]] - :returns: A tuple of (routing_token, read_handle). - """ - routing_token = None - read_handle = None - - grpc_error = None - if isinstance(exc, exceptions.Aborted) and exc.errors: - grpc_error = exc.errors[0] - - if grpc_error: - if isinstance(grpc_error, BidiReadObjectRedirectedError): - routing_token = grpc_error.routing_token - if grpc_error.read_handle: - read_handle = grpc_error.read_handle - return routing_token, read_handle - - if hasattr(grpc_error, "trailing_metadata"): - trailers = grpc_error.trailing_metadata() - if not trailers: - return None, None - - status_details_bin = None - for key, value in trailers: - if key == "grpc-status-details-bin": - status_details_bin = value - break - - if status_details_bin: - status_proto = status_pb2.Status() - try: - status_proto.ParseFromString(status_details_bin) - for detail in status_proto.details: - if detail.type_url == _BIDI_READ_REDIRECTED_TYPE_URL: - redirect_proto = BidiReadObjectRedirectedError.deserialize( - detail.value - ) - if redirect_proto.routing_token: - routing_token = redirect_proto.routing_token - if redirect_proto.read_handle: - read_handle = redirect_proto.read_handle - break - except Exception as e: - logger.error(f"Error unpacking redirect: {e}") - - return routing_token, read_handle - - -def _extract_bidi_writes_redirect_proto(exc: Exception): - grpc_error = None - if isinstance(exc, exceptions.Aborted) and exc.errors: - grpc_error = exc.errors[0] - - if grpc_error: - if isinstance(grpc_error, BidiWriteObjectRedirectedError): - return grpc_error - - if hasattr(grpc_error, "trailing_metadata"): - trailers = grpc_error.trailing_metadata() - if not trailers: - return - - status_details_bin = None - for key, value in trailers: - if key == "grpc-status-details-bin": - status_details_bin = value - break - - if status_details_bin: - status_proto = status_pb2.Status() - try: - status_proto.ParseFromString(status_details_bin) - for detail in status_proto.details: - if detail.type_url == _BIDI_WRITE_REDIRECTED_TYPE_URL: - redirect_proto = BidiWriteObjectRedirectedError.deserialize( - detail.value - ) - return redirect_proto - except Exception: - logger.error("Error unpacking redirect details from gRPC error.") - pass diff --git a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py index ff193f109..58c58136c 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/base_strategy.py @@ -1,83 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -import abc -from typing import Any, Iterable +# Import everything from the new stable module +from google.cloud.storage.asyncio.retry.base_strategy import * # noqa - -class _BaseResumptionStrategy(abc.ABC): - """Abstract base class defining the interface for a bidi stream resumption strategy. - - This class defines the skeleton for a pluggable strategy that contains - all the service-specific logic for a given bidi operation (e.g., reads - or writes). This allows a generic retry manager to handle the common - retry loop while sending the state management and request generation - to a concrete implementation of this class. - """ - - @abc.abstractmethod - def generate_requests(self, state: Any) -> Iterable[Any]: - """Generates the next batch of requests based on the current state. - - This method is called at the beginning of each retry attempt. It should - inspect the provided state object and generate the appropriate list of - request protos to send to the server. For example, a read strategy - would use this to implement "Smarter Resumption" by creating smaller - `ReadRange` requests for partially downloaded ranges. For bidi-writes, - it will set the `write_offset` field to the persisted size received - from the server in the next request. - - :type state: Any - :param state: An object containing all the state needed for the - operation (e.g., requested ranges, user buffers, - bytes written). - """ - pass - - @abc.abstractmethod - def update_state_from_response(self, response: Any, state: Any) -> None: - """Updates the state based on a successful server response. - - This method is called for every message received from the server. It is - responsible for processing the response and updating the shared state - object. - - :type response: Any - :param response: The response message received from the server. - - :type state: Any - :param state: The shared state object for the operation, which will be - mutated by this method. - """ - pass - - @abc.abstractmethod - async def recover_state_on_failure(self, error: Exception, state: Any) -> None: - """Prepares the state for the next retry attempt after a failure. - - This method is called when a retriable gRPC error occurs. It is - responsible for performing any necessary actions to ensure the next - retry attempt can succeed. For bidi reads, its primary role is to - handle the `BidiReadObjectRedirectError` by extracting the - `routing_token` and updating the state. For bidi writes, it will update - the state to reflect any bytes that were successfully persisted before - the failure. - - :type error: :class:`Exception` - :param error: The exception that was caught by the retry engine. - - :type state: Any - :param state: The shared state object for the operation. - """ - pass +warnings.warn( + "google.cloud.storage._experimental.asyncio.retry.base_strategy has been moved to google.cloud.storage.asyncio.retry.base_strategy. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, +) diff --git a/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py b/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py index a8caae4eb..331ee1326 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py +++ b/google/cloud/storage/_experimental/asyncio/retry/bidi_stream_retry_manager.py @@ -1,69 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -import logging -from typing import Any, AsyncIterator, Callable +# Import everything from the new stable module +from google.cloud.storage.asyncio.retry.bidi_stream_retry_manager import * # noqa -from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( - _BaseResumptionStrategy, +warnings.warn( + "google.cloud.storage._experimental.asyncio.retry.bidi_stream_retry_manager has been moved to google.cloud.storage.asyncio.retry.bidi_stream_retry_manager. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) - -logger = logging.getLogger(__name__) - - -class _BidiStreamRetryManager: - """Manages the generic retry loop for a bidi streaming operation.""" - - def __init__( - self, - strategy: _BaseResumptionStrategy, - send_and_recv: Callable[..., AsyncIterator[Any]], - ): - """Initializes the retry manager. - Args: - strategy: The strategy for managing the state of a specific - bidi operation (e.g., reads or writes). - send_and_recv: An async callable that opens a new gRPC stream. - """ - self._strategy = strategy - self._send_and_recv = send_and_recv - - async def execute(self, initial_state: Any, retry_policy): - """ - Executes the bidi operation with the configured retry policy. - Args: - initial_state: An object containing all state for the operation. - retry_policy: The `google.api_core.retry.AsyncRetry` object to - govern the retry behavior for this specific operation. - """ - state = initial_state - - async def attempt(): - requests = self._strategy.generate_requests(state) - stream = self._send_and_recv(requests, state) - try: - async for response in stream: - self._strategy.update_state_from_response(response, state) - return - except Exception as e: - if retry_policy._predicate(e): - logger.info( - f"Bidi stream operation failed: {e}. Attempting state recovery and retry." - ) - await self._strategy.recover_state_on_failure(e, state) - raise e - - wrapped_attempt = retry_policy(attempt) - - await wrapped_attempt() diff --git a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py index 916b82e6e..8f7051b6a 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/reads_resumption_strategy.py @@ -1,157 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -from typing import Any, Dict, List, IO -import logging +# Import everything from the new stable module +from google.cloud.storage.asyncio.retry.reads_resumption_strategy import * # noqa -from google_crc32c import Checksum -from google.cloud import _storage_v2 as storage_v2 -from google.cloud.storage.exceptions import DataCorruption -from google.cloud.storage._experimental.asyncio.retry._helpers import ( - _handle_redirect, +warnings.warn( + "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy has been moved to google.cloud.storage.asyncio.retry.reads_resumption_strategy. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) -from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( - _BaseResumptionStrategy, -) - - -_BIDI_READ_REDIRECTED_TYPE_URL = ( - "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" -) -logger = logging.getLogger(__name__) - - -class _DownloadState: - """A helper class to track the state of a single range download.""" - - def __init__( - self, initial_offset: int, initial_length: int, user_buffer: IO[bytes] - ): - self.initial_offset = initial_offset - self.initial_length = initial_length - self.user_buffer = user_buffer - self.bytes_written = 0 - self.next_expected_offset = initial_offset - self.is_complete = False - - -class _ReadResumptionStrategy(_BaseResumptionStrategy): - """The concrete resumption strategy for bidi reads.""" - - def generate_requests(self, state: Dict[str, Any]) -> List[storage_v2.ReadRange]: - """Generates new ReadRange requests for all incomplete downloads. - - :type state: dict - :param state: A dictionary mapping a read_id to its corresponding - _DownloadState object. - """ - pending_requests = [] - download_states: Dict[int, _DownloadState] = state["download_states"] - - for read_id, read_state in download_states.items(): - if not read_state.is_complete: - new_offset = read_state.initial_offset + read_state.bytes_written - - # Calculate remaining length. If initial_length is 0 (read to end), - # it stays 0. Otherwise, subtract bytes_written. - new_length = 0 - if read_state.initial_length > 0: - new_length = read_state.initial_length - read_state.bytes_written - - new_request = storage_v2.ReadRange( - read_offset=new_offset, - read_length=new_length, - read_id=read_id, - ) - pending_requests.append(new_request) - return pending_requests - - def update_state_from_response( - self, response: storage_v2.BidiReadObjectResponse, state: Dict[str, Any] - ) -> None: - """Processes a server response, performs integrity checks, and updates state.""" - - # Capture read_handle if provided. - if response.read_handle: - state["read_handle"] = response.read_handle - - download_states = state["download_states"] - - for object_data_range in response.object_data_ranges: - # Ignore empty ranges or ranges for IDs not in our state - # (e.g., from a previously cancelled request on the same stream). - if not object_data_range.read_range: - logger.warning( - "Received response with missing read_range field; ignoring." - ) - continue - - read_id = object_data_range.read_range.read_id - if read_id not in download_states: - logger.warning( - f"Received data for unknown or stale read_id {read_id}; ignoring." - ) - continue - - read_state = download_states[read_id] - - # Offset Verification - chunk_offset = object_data_range.read_range.read_offset - if chunk_offset != read_state.next_expected_offset: - raise DataCorruption( - response, - f"Offset mismatch for read_id {read_id}. " - f"Expected {read_state.next_expected_offset}, got {chunk_offset}", - ) - - # Checksum Verification - # We must validate data before updating state or writing to buffer. - data = object_data_range.checksummed_data.content - server_checksum = object_data_range.checksummed_data.crc32c - - if server_checksum is not None: - client_checksum = int.from_bytes(Checksum(data).digest(), "big") - if server_checksum != client_checksum: - raise DataCorruption( - response, - f"Checksum mismatch for read_id {read_id}. " - f"Server sent {server_checksum}, client calculated {client_checksum}.", - ) - - # Update State & Write Data - chunk_size = len(data) - read_state.user_buffer.write(data) - read_state.bytes_written += chunk_size - read_state.next_expected_offset += chunk_size - - # Final Byte Count Verification - if object_data_range.range_end: - read_state.is_complete = True - if ( - read_state.initial_length != 0 - and read_state.bytes_written > read_state.initial_length - ): - raise DataCorruption( - response, - f"Byte count mismatch for read_id {read_id}. " - f"Expected {read_state.initial_length}, got {read_state.bytes_written}", - ) - - async def recover_state_on_failure(self, error: Exception, state: Any) -> None: - """Handles BidiReadObjectRedirectedError for reads.""" - routing_token, read_handle = _handle_redirect(error) - if routing_token: - state["routing_token"] = routing_token - if read_handle: - state["read_handle"] = read_handle diff --git a/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py b/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py index 09b22cb8e..7d2493841 100644 --- a/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py +++ b/google/cloud/storage/_experimental/asyncio/retry/writes_resumption_strategy.py @@ -1,147 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -from typing import Any, Dict, IO, List, Optional, Union +# Import everything from the new stable module +from google.cloud.storage.asyncio.retry.writes_resumption_strategy import * # noqa -import google_crc32c -from google.cloud._storage_v2.types import storage as storage_type -from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError -from google.cloud.storage._experimental.asyncio.retry.base_strategy import ( - _BaseResumptionStrategy, +warnings.warn( + "google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy has been moved to google.cloud.storage.asyncio.retry.writes_resumption_strategy. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, ) -from google.cloud.storage._experimental.asyncio.retry._helpers import ( - _extract_bidi_writes_redirect_proto, -) - - -class _WriteState: - """A helper class to track the state of a single upload operation. - - :type chunk_size: int - :param chunk_size: The size of chunks to write to the server. - - :type user_buffer: IO[bytes] - :param user_buffer: The data source. - - :type flush_interval: int - :param flush_interval: The flush interval at which the data is flushed. - """ - - def __init__( - self, - chunk_size: int, - user_buffer: IO[bytes], - flush_interval: int, - ): - self.chunk_size = chunk_size - self.user_buffer = user_buffer - self.persisted_size: int = 0 - self.bytes_sent: int = 0 - self.bytes_since_last_flush: int = 0 - self.flush_interval: int = flush_interval - self.write_handle: Union[bytes, storage_type.BidiWriteHandle, None] = None - self.routing_token: Optional[str] = None - self.is_finalized: bool = False - - -class _WriteResumptionStrategy(_BaseResumptionStrategy): - """The concrete resumption strategy for bidi writes.""" - - def generate_requests( - self, state: Dict[str, Any] - ) -> List[storage_type.BidiWriteObjectRequest]: - """Generates BidiWriteObjectRequests to resume or continue the upload. - - This method is not applicable for `open` methods. - """ - write_state: _WriteState = state["write_state"] - - requests = [] - # The buffer should already be seeked to the correct position (persisted_size) - # by the `recover_state_on_failure` method before this is called. - while not write_state.is_finalized: - chunk = write_state.user_buffer.read(write_state.chunk_size) - - # End of File detection - if not chunk: - break - - checksummed_data = storage_type.ChecksummedData(content=chunk) - checksum = google_crc32c.Checksum(chunk) - checksummed_data.crc32c = int.from_bytes(checksum.digest(), "big") - - request = storage_type.BidiWriteObjectRequest( - write_offset=write_state.bytes_sent, - checksummed_data=checksummed_data, - ) - chunk_len = len(chunk) - write_state.bytes_sent += chunk_len - write_state.bytes_since_last_flush += chunk_len - - if write_state.bytes_since_last_flush >= write_state.flush_interval: - request.flush = True - # reset counter after marking flush - write_state.bytes_since_last_flush = 0 - - requests.append(request) - return requests - - def update_state_from_response( - self, response: storage_type.BidiWriteObjectResponse, state: Dict[str, Any] - ) -> None: - """Processes a server response and updates the write state.""" - write_state: _WriteState = state["write_state"] - if response is None: - return - if response.persisted_size: - write_state.persisted_size = response.persisted_size - - if response.write_handle: - write_state.write_handle = response.write_handle - - if response.resource: - write_state.persisted_size = response.resource.size - if response.resource.finalize_time: - write_state.is_finalized = True - - async def recover_state_on_failure( - self, error: Exception, state: Dict[str, Any] - ) -> None: - """ - Handles errors, specifically BidiWriteObjectRedirectedError, and rewinds state. - - This method rewinds the user buffer and internal byte tracking to the - last confirmed 'persisted_size' from the server. - """ - write_state: _WriteState = state["write_state"] - - redirect_proto = None - - if isinstance(error, BidiWriteObjectRedirectedError): - redirect_proto = error - else: - redirect_proto = _extract_bidi_writes_redirect_proto(error) - - # Extract routing token and potentially a new write handle for redirection. - if redirect_proto: - if redirect_proto.routing_token: - write_state.routing_token = redirect_proto.routing_token - if redirect_proto.write_handle: - write_state.write_handle = redirect_proto.write_handle - - # We must assume any data sent beyond 'persisted_size' was lost. - # Reset the user buffer to the last known good byte confirmed by the server. - write_state.user_buffer.seek(write_state.persisted_size) - write_state.bytes_sent = write_state.persisted_size - write_state.bytes_since_last_flush = 0 diff --git a/google/cloud/storage/_experimental/grpc_client.py b/google/cloud/storage/_experimental/grpc_client.py index 7a739b7b7..99ecbe044 100644 --- a/google/cloud/storage/_experimental/grpc_client.py +++ b/google/cloud/storage/_experimental/grpc_client.py @@ -1,122 +1,11 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +import warnings -"""A client for interacting with Google Cloud Storage using the gRPC API.""" +# Import everything from the new stable module +from google.cloud.storage.grpc_client import * # noqa -from google.cloud.client import ClientWithProject -from google.cloud import _storage_v2 as storage_v2 - -_marker = object() - - -class GrpcClient(ClientWithProject): - """A client for interacting with Google Cloud Storage using the gRPC API. - - :type project: str or None - :param project: The project which the client acts on behalf of. If not - passed, falls back to the default inferred from the - environment. - - :type credentials: :class:`~google.auth.credentials.Credentials` - :param credentials: (Optional) The OAuth2 Credentials to use for this - client. If not passed, falls back to the default - inferred from the environment. - - :type client_info: :class:`~google.api_core.client_info.ClientInfo` - :param client_info: - The client info used to send a user-agent string along with API - requests. If ``None``, then default info will be used. Generally, - you only need to set this if you're developing your own library - or partner tool. - - :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` - :param client_options: (Optional) Client options used to set user options - on the client. A non-default universe domain or API endpoint should be - set through client_options. - - :type api_key: string - :param api_key: - (Optional) An API key. Mutually exclusive with any other credentials. - This parameter is an alias for setting `client_options.api_key` and - will supersede any API key set in the `client_options` parameter. - - :type attempt_direct_path: bool - :param attempt_direct_path: - (Optional) Whether to attempt to use DirectPath for gRPC connections. - This provides a direct, unproxied connection to GCS for lower latency - and higher throughput, and is highly recommended when running on Google - Cloud infrastructure. Defaults to ``True``. - """ - - def __init__( - self, - project=_marker, - credentials=None, - client_info=None, - client_options=None, - *, - api_key=None, - attempt_direct_path=True, - ): - super(GrpcClient, self).__init__(project=project, credentials=credentials) - - if isinstance(client_options, dict): - if api_key: - client_options["api_key"] = api_key - elif client_options is None: - client_options = {} if not api_key else {"api_key": api_key} - elif api_key: - client_options.api_key = api_key - - self._grpc_client = self._create_gapic_client( - credentials=credentials, - client_info=client_info, - client_options=client_options, - attempt_direct_path=attempt_direct_path, - ) - - def _create_gapic_client( - self, - credentials=None, - client_info=None, - client_options=None, - attempt_direct_path=True, - ): - """Creates and configures the low-level GAPIC `storage_v2` client.""" - transport_cls = storage_v2.StorageClient.get_transport_class("grpc") - - channel = transport_cls.create_channel(attempt_direct_path=attempt_direct_path) - - transport = transport_cls(credentials=credentials, channel=channel) - - return storage_v2.StorageClient( - credentials=credentials, - transport=transport, - client_info=client_info, - client_options=client_options, - ) - - @property - def grpc_client(self): - """The underlying gRPC client. - - This property gives users direct access to the `storage_v2.StorageClient` - instance. This can be useful for accessing - newly added or experimental RPCs that are not yet exposed through - the high-level GrpcClient. - - Returns: - google.cloud.storage_v2.StorageClient: The configured GAPIC client. - """ - return self._grpc_client +warnings.warn( + "google.cloud.storage._experimental.grpc_client has been moved to google.cloud.storage.grpc_client. " + "Please update your imports.", + DeprecationWarning, + stacklevel=2, +) diff --git a/google/cloud/storage/asyncio/_utils.py b/google/cloud/storage/asyncio/_utils.py new file mode 100644 index 000000000..170a0cfae --- /dev/null +++ b/google/cloud/storage/asyncio/_utils.py @@ -0,0 +1,41 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import google_crc32c + +from google.api_core import exceptions + + +def raise_if_no_fast_crc32c(): + """Check if the C-accelerated version of google-crc32c is available. + + If not, raise an error to prevent silent performance degradation. + + raises google.api_core.exceptions.FailedPrecondition: If the C extension is not available. + returns: True if the C extension is available. + rtype: bool + + """ + if google_crc32c.implementation != "c": + raise exceptions.FailedPrecondition( + "The google-crc32c package is not installed with C support. " + "C extension is required for faster data integrity checks." + "For more information, see https://github.com/googleapis/python-crc32c." + ) + + +def update_write_handle_if_exists(obj, response): + """Update the write_handle attribute of an object if it exists in the response.""" + if hasattr(response, "write_handle") and response.write_handle is not None: + obj.write_handle = response.write_handle diff --git a/google/cloud/storage/asyncio/async_abstract_object_stream.py b/google/cloud/storage/asyncio/async_abstract_object_stream.py new file mode 100644 index 000000000..26cbab7a0 --- /dev/null +++ b/google/cloud/storage/asyncio/async_abstract_object_stream.py @@ -0,0 +1,67 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import abc +from typing import Any, Optional + + +class _AsyncAbstractObjectStream(abc.ABC): + """Abstract base class to represent gRPC bidi-stream for GCS ``Object``. + + Concrete implementation of this class could be ``_AsyncReadObjectStream`` + or ``_AsyncWriteObjectStream``. + + :type bucket_name: str + :param bucket_name: (Optional) The name of the bucket containing the object. + + :type object_name: str + :param object_name: (Optional) The name of the object. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. + + :type handle: Any + :param handle: (Optional) The handle for the object, could be read_handle or + write_handle, based on how the stream is used. + """ + + def __init__( + self, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + handle: Optional[Any] = None, + ) -> None: + super().__init__() + self.bucket_name: str = bucket_name + self.object_name: str = object_name + self.generation_number: Optional[int] = generation_number + self.handle: Optional[Any] = handle + + @abc.abstractmethod + async def open(self) -> None: + pass + + @abc.abstractmethod + async def close(self) -> None: + pass + + @abc.abstractmethod + async def send(self, protobuf: Any) -> None: + pass + + @abc.abstractmethod + async def recv(self) -> Any: + pass diff --git a/google/cloud/storage/asyncio/async_appendable_object_writer.py b/google/cloud/storage/asyncio/async_appendable_object_writer.py new file mode 100644 index 000000000..3ab06f8ba --- /dev/null +++ b/google/cloud/storage/asyncio/async_appendable_object_writer.py @@ -0,0 +1,586 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from io import BufferedReader +import io +import logging +from typing import List, Optional, Tuple, Union + +from google.api_core import exceptions +from google.api_core.retry_async import AsyncRetry +from google.rpc import status_pb2 +from google.cloud._storage_v2.types import BidiWriteObjectRedirectedError +from google.cloud._storage_v2.types.storage import BidiWriteObjectRequest + + +from . import _utils +from google.cloud import _storage_v2 +from google.cloud.storage.asyncio.async_grpc_client import ( + AsyncGrpcClient, +) +from google.cloud.storage.asyncio.async_write_object_stream import ( + _AsyncWriteObjectStream, +) +from google.cloud.storage.asyncio.retry.bidi_stream_retry_manager import ( + _BidiStreamRetryManager, +) +from google.cloud.storage.asyncio.retry.writes_resumption_strategy import ( + _WriteResumptionStrategy, + _WriteState, +) +from google.cloud.storage.asyncio.retry._helpers import ( + _extract_bidi_writes_redirect_proto, +) + + +_MAX_CHUNK_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB +_DEFAULT_FLUSH_INTERVAL_BYTES = 16 * 1024 * 1024 # 16 MiB +_BIDI_WRITE_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" +) +logger = logging.getLogger(__name__) + + +def _is_write_retryable(exc): + """Predicate to determine if a write operation should be retried.""" + + if isinstance( + exc, + ( + exceptions.InternalServerError, + exceptions.ServiceUnavailable, + exceptions.DeadlineExceeded, + exceptions.TooManyRequests, + BidiWriteObjectRedirectedError, + ), + ): + logger.warning(f"Retryable write exception encountered: {exc}") + return True + + grpc_error = None + if isinstance(exc, exceptions.Aborted) and exc.errors: + grpc_error = exc.errors[0] + if isinstance(grpc_error, BidiWriteObjectRedirectedError): + return True + + trailers = grpc_error.trailing_metadata() + if not trailers: + return False + + status_details_bin = None + for key, value in trailers: + if key == "grpc-status-details-bin": + status_details_bin = value + break + + if status_details_bin: + status_proto = status_pb2.Status() + try: + status_proto.ParseFromString(status_details_bin) + for detail in status_proto.details: + if detail.type_url == _BIDI_WRITE_REDIRECTED_TYPE_URL: + return True + except Exception: + logger.error( + "Error unpacking redirect details from gRPC error. Exception: ", + {exc}, + ) + return False + return False + + +class AsyncAppendableObjectWriter: + """Class for appending data to a GCS Appendable Object asynchronously.""" + + def __init__( + self, + client: AsyncGrpcClient, + bucket_name: str, + object_name: str, + generation: Optional[int] = None, + write_handle: Optional[_storage_v2.BidiWriteHandle] = None, + writer_options: Optional[dict] = None, + ): + """ + Class for appending data to a GCS Appendable Object. + + Example usage: + + ``` + + from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient + from google.cloud.storage.asyncio.async_appendable_object_writer import AsyncAppendableObjectWriter + import asyncio + + client = AsyncGrpcClient() + bucket_name = "my-bucket" + object_name = "my-appendable-object" + + # instantiate the writer + writer = AsyncAppendableObjectWriter(client, bucket_name, object_name) + # open the writer, (underlying gRPC bidi-stream will be opened) + await writer.open() + + # append data, it can be called multiple times. + await writer.append(b"hello world") + await writer.append(b"some more data") + + # optionally flush data to persist. + await writer.flush() + + # close the gRPC stream. + # Please note closing the program will also close the stream, + # however it's recommended to close the stream if no more data to append + # to clean up gRPC connection (which means CPU/memory/network resources) + await writer.close() + ``` + + :type client: :class:`~google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient` + :param client: async grpc client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the GCS bucket containing the object. + + :type object_name: str + :param object_name: The name of the GCS Appendable Object to be written. + + :type generation: Optional[int] + :param generation: (Optional) If present, creates writer for that + specific revision of that object. Use this to append data to an + existing Appendable Object. + + Setting to ``0`` makes the `writer.open()` succeed only if + object doesn't exist in the bucket (useful for not accidentally + overwriting existing objects). + + Warning: If `None`, a new object is created. If an object with the + same name already exists, it will be overwritten the moment + `writer.open()` is called. + + :type write_handle: _storage_v2.BidiWriteHandle + :param write_handle: (Optional) An handle for writing the object. + If provided, opening the bidi-gRPC connection will be faster. + + :type writer_options: dict + :param writer_options: (Optional) A dictionary of writer options. + Supported options: + - "FLUSH_INTERVAL_BYTES": int + The number of bytes to append before "persisting" data in GCS + servers. Default is `_DEFAULT_FLUSH_INTERVAL_BYTES`. + Must be a multiple of `_MAX_CHUNK_SIZE_BYTES`. + """ + _utils.raise_if_no_fast_crc32c() + self.client = client + self.bucket_name = bucket_name + self.object_name = object_name + self.write_handle = write_handle + self.generation = generation + + self.write_obj_stream: Optional[_AsyncWriteObjectStream] = None + self._is_stream_open: bool = False + # `offset` is the latest size of the object without staleless. + self.offset: Optional[int] = None + # `persisted_size` is the total_bytes persisted in the GCS server. + # Please note: `offset` and `persisted_size` are same when the stream is + # opened. + self.persisted_size: Optional[int] = None + if writer_options is None: + writer_options = {} + self.flush_interval = writer_options.get( + "FLUSH_INTERVAL_BYTES", _DEFAULT_FLUSH_INTERVAL_BYTES + ) + if self.flush_interval < _MAX_CHUNK_SIZE_BYTES: + raise exceptions.OutOfRange( + f"flush_interval must be >= {_MAX_CHUNK_SIZE_BYTES} , but provided {self.flush_interval}" + ) + if self.flush_interval % _MAX_CHUNK_SIZE_BYTES != 0: + raise exceptions.OutOfRange( + f"flush_interval must be a multiple of {_MAX_CHUNK_SIZE_BYTES}, but provided {self.flush_interval}" + ) + self.bytes_appended_since_last_flush = 0 + self._routing_token: Optional[str] = None + self.object_resource: Optional[_storage_v2.Object] = None + + async def state_lookup(self) -> int: + """Returns the persisted_size + + :rtype: int + :returns: persisted size. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before state_lookup().") + + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + state_lookup=True, + ) + ) + response = await self.write_obj_stream.recv() + self.persisted_size = response.persisted_size + return self.persisted_size + + def _on_open_error(self, exc): + """Extracts routing token and write handle on redirect error during open.""" + redirect_proto = _extract_bidi_writes_redirect_proto(exc) + if redirect_proto: + if redirect_proto.routing_token: + self._routing_token = redirect_proto.routing_token + if redirect_proto.write_handle: + self.write_handle = redirect_proto.write_handle + if redirect_proto.generation: + self.generation = redirect_proto.generation + + async def open( + self, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: + """Opens the underlying bidi-gRPC stream. + + :raises ValueError: If the stream is already open. + + """ + if self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is already open") + + if retry_policy is None: + retry_policy = AsyncRetry( + predicate=_is_write_retryable, on_error=self._on_open_error + ) + else: + original_on_error = retry_policy._on_error + + def combined_on_error(exc): + self._on_open_error(exc) + if original_on_error: + original_on_error(exc) + + retry_policy = AsyncRetry( + predicate=_is_write_retryable, + initial=retry_policy._initial, + maximum=retry_policy._maximum, + multiplier=retry_policy._multiplier, + deadline=retry_policy._deadline, + on_error=combined_on_error, + ) + + async def _do_open(): + current_metadata = list(metadata) if metadata else [] + + # Cleanup stream from previous failed attempt, if any. + if self.write_obj_stream: + if self.write_obj_stream.is_stream_open: + try: + await self.write_obj_stream.close() + except Exception as e: + logger.warning( + "Error closing previous write stream during open retry. Got exception: ", + {e}, + ) + self.write_obj_stream = None + self._is_stream_open = False + + self.write_obj_stream = _AsyncWriteObjectStream( + client=self.client.grpc_client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation, + write_handle=self.write_handle, + routing_token=self._routing_token, + ) + + if self._routing_token: + current_metadata.append( + ("x-goog-request-params", f"routing_token={self._routing_token}") + ) + + await self.write_obj_stream.open( + metadata=current_metadata if metadata else None + ) + + if self.write_obj_stream.generation_number: + self.generation = self.write_obj_stream.generation_number + if self.write_obj_stream.write_handle: + self.write_handle = self.write_obj_stream.write_handle + if self.write_obj_stream.persisted_size is not None: + self.persisted_size = self.write_obj_stream.persisted_size + + self._is_stream_open = True + self._routing_token = None + + await retry_policy(_do_open)() + + async def append( + self, + data: bytes, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: + """Appends data to the Appendable object with automatic retries. + + calling `self.append` will append bytes at the end of the current size + ie. `self.offset` bytes relative to the begining of the object. + + This method sends the provided `data` to the GCS server in chunks. + and persists data in GCS at every `_DEFAULT_FLUSH_INTERVAL_BYTES` bytes + or at the last chunk whichever is earlier. Persisting is done by setting + `flush=True` on request. + + :type data: bytes + :param data: The bytes to append to the object. + + :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` + :param retry_policy: (Optional) The retry policy to use for the operation. + + :type metadata: List[Tuple[str, str]] + :param metadata: (Optional) The metadata to be sent with the request. + + :raises ValueError: If the stream is not open. + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before append().") + if not data: + logger.debug("No data provided to append; returning without action.") + return + + if retry_policy is None: + retry_policy = AsyncRetry(predicate=_is_write_retryable) + + strategy = _WriteResumptionStrategy() + buffer = io.BytesIO(data) + attempt_count = 0 + + def send_and_recv_generator( + requests: List[BidiWriteObjectRequest], + state: dict[str, _WriteState], + metadata: Optional[List[Tuple[str, str]]] = None, + ): + async def generator(): + nonlocal attempt_count + nonlocal requests + attempt_count += 1 + resp = None + write_state = state["write_state"] + # If this is a retry or redirect, we must re-open the stream + if attempt_count > 1 or write_state.routing_token: + logger.info( + f"Re-opening the stream with attempt_count: {attempt_count}" + ) + if self.write_obj_stream and self.write_obj_stream.is_stream_open: + await self.write_obj_stream.close() + + current_metadata = list(metadata) if metadata else [] + if write_state.routing_token: + current_metadata.append( + ( + "x-goog-request-params", + f"routing_token={write_state.routing_token}", + ) + ) + self._routing_token = write_state.routing_token + + self._is_stream_open = False + await self.open(metadata=current_metadata) + + write_state.persisted_size = self.persisted_size + write_state.write_handle = self.write_handle + write_state.routing_token = None + + write_state.user_buffer.seek(write_state.persisted_size) + write_state.bytes_sent = write_state.persisted_size + write_state.bytes_since_last_flush = 0 + + requests = strategy.generate_requests(state) + + num_requests = len(requests) + for i, chunk_req in enumerate(requests): + if i == num_requests - 1: + chunk_req.state_lookup = True + chunk_req.flush = True + await self.write_obj_stream.send(chunk_req) + + resp = await self.write_obj_stream.recv() + if resp: + if resp.persisted_size is not None: + self.persisted_size = resp.persisted_size + state["write_state"].persisted_size = resp.persisted_size + self.offset = self.persisted_size + if resp.write_handle: + self.write_handle = resp.write_handle + state["write_state"].write_handle = resp.write_handle + self.bytes_appended_since_last_flush = 0 + + yield resp + + return generator() + + # State initialization + write_state = _WriteState(_MAX_CHUNK_SIZE_BYTES, buffer, self.flush_interval) + write_state.write_handle = self.write_handle + write_state.persisted_size = self.persisted_size + write_state.bytes_sent = self.persisted_size + write_state.bytes_since_last_flush = self.bytes_appended_since_last_flush + + retry_manager = _BidiStreamRetryManager( + _WriteResumptionStrategy(), + lambda r, s: send_and_recv_generator(r, s, metadata), + ) + await retry_manager.execute({"write_state": write_state}, retry_policy) + + # Sync local markers + self.write_obj_stream.persisted_size = write_state.persisted_size + self.write_obj_stream.write_handle = write_state.write_handle + self.bytes_appended_since_last_flush = write_state.bytes_since_last_flush + self.persisted_size = write_state.persisted_size + self.offset = write_state.persisted_size + + async def simple_flush(self) -> None: + """Flushes the data to the server. + Please note: Unlike `flush` it does not do `state_lookup` + + :rtype: None + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before simple_flush().") + + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + flush=True, + ) + ) + self.bytes_appended_since_last_flush = 0 + + async def flush(self) -> int: + """Flushes the data to the server. + + :rtype: int + :returns: The persisted size after flush. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before flush().") + + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest( + flush=True, + state_lookup=True, + ) + ) + response = await self.write_obj_stream.recv() + self.persisted_size = response.persisted_size + self.offset = self.persisted_size + self.bytes_appended_since_last_flush = 0 + return self.persisted_size + + async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object]: + """Closes the underlying bidi-gRPC stream. + + :type finalize_on_close: bool + :param finalize_on_close: Finalizes the Appendable Object. No more data + can be appended. + + rtype: Union[int, _storage_v2.Object] + returns: Updated `self.persisted_size` by default after closing the + bidi-gRPC stream. However, if `finalize_on_close=True` is passed, + returns the finalized object resource. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before close().") + + if finalize_on_close: + return await self.finalize() + + await self.write_obj_stream.close() + + self._is_stream_open = False + self.offset = None + return self.persisted_size + + async def finalize(self) -> _storage_v2.Object: + """Finalizes the Appendable Object. + + Note: Once finalized no more data can be appended. + This method is different from `close`. if `.close()` is called data may + still be appended to object at a later point in time by opening with + generation number. + (i.e. `open(..., generation=)`. + However if `.finalize()` is called no more data can be appended to the + object. + + rtype: google.cloud.storage_v2.types.Object + returns: The finalized object resource. + + :raises ValueError: If the stream is not open (i.e., `open()` has not + been called). + """ + if not self._is_stream_open: + raise ValueError("Stream is not open. Call open() before finalize().") + + await self.write_obj_stream.send( + _storage_v2.BidiWriteObjectRequest(finish_write=True) + ) + response = await self.write_obj_stream.recv() + self.object_resource = response.resource + self.persisted_size = self.object_resource.size + await self.write_obj_stream.close() + + self._is_stream_open = False + self.offset = None + return self.object_resource + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open + + # helper methods. + async def append_from_string(self, data: str): + """ + str data will be encoded to bytes using utf-8 encoding calling + + self.append(data.encode("utf-8")) + """ + raise NotImplementedError("append_from_string is not implemented yet.") + + async def append_from_stream(self, stream_obj): + """ + At a time read a chunk of data (16MiB) from `stream_obj` + and call self.append(chunk) + """ + raise NotImplementedError("append_from_stream is not implemented yet.") + + async def append_from_file( + self, file_obj: BufferedReader, block_size: int = _DEFAULT_FLUSH_INTERVAL_BYTES + ): + """ + Appends data to an Appendable Object using file_handle which is opened + for reading in binary mode. + + :type file_obj: file + :param file_obj: A file handle opened in binary mode for reading. + + """ + while block := file_obj.read(block_size): + await self.append(block) diff --git a/google/cloud/storage/asyncio/async_grpc_client.py b/google/cloud/storage/asyncio/async_grpc_client.py new file mode 100644 index 000000000..474b961b4 --- /dev/null +++ b/google/cloud/storage/asyncio/async_grpc_client.py @@ -0,0 +1,108 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""An async client for interacting with Google Cloud Storage using the gRPC API.""" + +from google.cloud import _storage_v2 as storage_v2 +from google.cloud._storage_v2.services.storage.transports.base import ( + DEFAULT_CLIENT_INFO, +) +from google.cloud.storage import __version__ + + +class AsyncGrpcClient: + """An asynchronous client for interacting with Google Cloud Storage using the gRPC API. + + :type credentials: :class:`~google.auth.credentials.Credentials` + :param credentials: (Optional) The OAuth2 Credentials to use for this + client. If not passed, falls back to the default + inferred from the environment. + + :type client_info: :class:`~google.api_core.client_info.ClientInfo` + :param client_info: + The client info used to send a user-agent string along with API + requests. If ``None``, then default info will be used. + + :type client_options: :class:`~google.api_core.client_options.ClientOptions` + :param client_options: (Optional) Client options used to set user options + on the client. + + :type attempt_direct_path: bool + :param attempt_direct_path: + (Optional) Whether to attempt to use DirectPath for gRPC connections. + Defaults to ``True``. + """ + + def __init__( + self, + credentials=None, + client_info=None, + client_options=None, + *, + attempt_direct_path=True, + ): + if client_info is None: + client_info = DEFAULT_CLIENT_INFO + client_info.client_library_version = __version__ + if client_info.user_agent is None: + client_info.user_agent = "" + agent_version = f"gcloud-python/{__version__}" + if agent_version not in client_info.user_agent: + client_info.user_agent += f" {agent_version} " + + self._grpc_client = self._create_async_grpc_client( + credentials=credentials, + client_info=client_info, + client_options=client_options, + attempt_direct_path=attempt_direct_path, + ) + + def _create_async_grpc_client( + self, + credentials=None, + client_info=None, + client_options=None, + attempt_direct_path=True, + ): + transport_cls = storage_v2.StorageAsyncClient.get_transport_class( + "grpc_asyncio" + ) + + primary_user_agent = client_info.to_user_agent() + + channel = transport_cls.create_channel( + attempt_direct_path=attempt_direct_path, + credentials=credentials, + options=(("grpc.primary_user_agent", primary_user_agent),), + ) + transport = transport_cls(channel=channel) + + return storage_v2.StorageAsyncClient( + transport=transport, + client_info=client_info, + client_options=client_options, + ) + + @property + def grpc_client(self): + """The underlying gRPC client. + + This property gives users direct access to the `_storage_v2.StorageAsyncClient` + instance. This can be useful for accessing + newly added or experimental RPCs that are not yet exposed through + the high-level GrpcClient. + Returns: + google.cloud._storage_v2.StorageAsyncClient: The configured GAPIC client. + """ + return self._grpc_client diff --git a/google/cloud/storage/asyncio/async_multi_range_downloader.py b/google/cloud/storage/asyncio/async_multi_range_downloader.py new file mode 100644 index 000000000..993fc9522 --- /dev/null +++ b/google/cloud/storage/asyncio/async_multi_range_downloader.py @@ -0,0 +1,506 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations +import asyncio +import logging +from google.api_core import exceptions +from google.api_core.retry_async import AsyncRetry +from google.cloud.storage.asyncio.retry._helpers import _handle_redirect +from google.rpc import status_pb2 + +from typing import List, Optional, Tuple, Any, Dict + +from ._utils import raise_if_no_fast_crc32c +from google.cloud.storage.asyncio.async_read_object_stream import ( + _AsyncReadObjectStream, +) +from google.cloud.storage.asyncio.async_grpc_client import ( + AsyncGrpcClient, +) +from google.cloud.storage.asyncio.retry.bidi_stream_retry_manager import ( + _BidiStreamRetryManager, +) +from google.cloud.storage.asyncio.retry.reads_resumption_strategy import ( + _ReadResumptionStrategy, + _DownloadState, +) + +from io import BytesIO +from google.cloud import _storage_v2 +from google.cloud.storage._helpers import generate_random_56_bit_integer + + +_MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 +_BIDI_READ_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +) + +logger = logging.getLogger(__name__) + + +def _is_read_retryable(exc): + """Predicate to determine if a read operation should be retried.""" + if isinstance( + exc, + ( + exceptions.InternalServerError, + exceptions.ServiceUnavailable, + exceptions.DeadlineExceeded, + exceptions.TooManyRequests, + ), + ): + return True + + if not isinstance(exc, exceptions.Aborted) or not exc.errors: + return False + + try: + grpc_error = exc.errors[0] + trailers = grpc_error.trailing_metadata() + if not trailers: + return False + + status_details_bin = next( + (v for k, v in trailers if k == "grpc-status-details-bin"), None + ) + + if not status_details_bin: + return False + + status_proto = status_pb2.Status() + status_proto.ParseFromString(status_details_bin) + return any( + detail.type_url == _BIDI_READ_REDIRECTED_TYPE_URL + for detail in status_proto.details + ) + except Exception as e: + logger.error(f"Error parsing status_details_bin: {e}") + return False + + +class AsyncMultiRangeDownloader: + """Provides an interface for downloading multiple ranges of a GCS ``Object`` + concurrently. + + Example usage: + + .. code-block:: python + + client = AsyncGrpcClient() + mrd = await AsyncMultiRangeDownloader.create_mrd( + client, bucket_name="chandrasiri-rs", object_name="test_open9" + ) + my_buff1 = open('my_fav_file.txt', 'wb') + my_buff2 = BytesIO() + my_buff3 = BytesIO() + my_buff4 = any_object_which_provides_BytesIO_like_interface() + await mrd.download_ranges( + [ + # (start_byte, bytes_to_read, writeable_buffer) + (0, 100, my_buff1), + (100, 20, my_buff2), + (200, 123, my_buff3), + (300, 789, my_buff4), + ] + ) + + # verify data in buffers... + assert my_buff2.getbuffer().nbytes == 20 + + + """ + + @classmethod + async def create_mrd( + cls, + client: AsyncGrpcClient, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + read_handle: Optional[_storage_v2.BidiReadHandle] = None, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> AsyncMultiRangeDownloader: + """Initializes a MultiRangeDownloader and opens the underlying bidi-gRPC + object for reading. + + :type client: :class:`~google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient` + :param client: The asynchronous client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the bucket containing the object. + + :type object_name: str + :param object_name: The name of the object to be read. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific + revision of this object. + + :type read_handle: _storage_v2.BidiReadHandle + :param read_handle: (Optional) An existing handle for reading the object. + If provided, opening the bidi-gRPC connection will be faster. + + :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` + :param retry_policy: (Optional) The retry policy to use for the ``open`` operation. + + :type metadata: List[Tuple[str, str]] + :param metadata: (Optional) The metadata to be sent with the ``open`` request. + + :rtype: :class:`~google.cloud.storage.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader` + :returns: An initialized AsyncMultiRangeDownloader instance for reading. + """ + mrd = cls(client, bucket_name, object_name, generation_number, read_handle) + await mrd.open(retry_policy=retry_policy, metadata=metadata) + return mrd + + def __init__( + self, + client: AsyncGrpcClient, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + read_handle: Optional[_storage_v2.BidiReadHandle] = None, + ) -> None: + """Constructor for AsyncMultiRangeDownloader, clients are not adviced to + use it directly. Instead it's adviced to use the classmethod `create_mrd`. + + :type client: :class:`~google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient` + :param client: The asynchronous client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the bucket containing the object. + + :type object_name: str + :param object_name: The name of the object to be read. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. + + :type read_handle: _storage_v2.BidiReadHandle + :param read_handle: (Optional) An existing read handle. + """ + + raise_if_no_fast_crc32c() + + self.client = client + self.bucket_name = bucket_name + self.object_name = object_name + self.generation_number = generation_number + self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle + self.read_obj_str: Optional[_AsyncReadObjectStream] = None + self._is_stream_open: bool = False + self._routing_token: Optional[str] = None + self._read_id_to_writable_buffer_dict = {} + self._read_id_to_download_ranges_id = {} + self._download_ranges_id_to_pending_read_ids = {} + self.persisted_size: Optional[int] = None # updated after opening the stream + + async def __aenter__(self): + """Opens the underlying bidi-gRPC connection to read from the object.""" + await self.open() + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Closes the underlying bidi-gRPC connection.""" + if self.is_stream_open: + await self.close() + + def _on_open_error(self, exc): + """Extracts routing token and read handle on redirect error during open.""" + routing_token, read_handle = _handle_redirect(exc) + if routing_token: + self._routing_token = routing_token + if read_handle: + self.read_handle = read_handle + + async def open( + self, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: + """Opens the bidi-gRPC connection to read from the object.""" + if self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is already open") + + if retry_policy is None: + retry_policy = AsyncRetry( + predicate=_is_read_retryable, on_error=self._on_open_error + ) + else: + original_on_error = retry_policy._on_error + + def combined_on_error(exc): + self._on_open_error(exc) + if original_on_error: + original_on_error(exc) + + retry_policy = AsyncRetry( + predicate=_is_read_retryable, + initial=retry_policy._initial, + maximum=retry_policy._maximum, + multiplier=retry_policy._multiplier, + deadline=retry_policy._deadline, + on_error=combined_on_error, + ) + + async def _do_open(): + current_metadata = list(metadata) if metadata else [] + + # Cleanup stream from previous failed attempt, if any. + if self.read_obj_str: + if self.read_obj_str.is_stream_open: + try: + await self.read_obj_str.close() + except exceptions.GoogleAPICallError as e: + logger.warning( + f"Failed to close existing stream during resumption: {e}" + ) + self.read_obj_str = None + self._is_stream_open = False + + self.read_obj_str = _AsyncReadObjectStream( + client=self.client.grpc_client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=self.read_handle, + ) + + if self._routing_token: + current_metadata.append( + ("x-goog-request-params", f"routing_token={self._routing_token}") + ) + self._routing_token = None + + await self.read_obj_str.open( + metadata=current_metadata if current_metadata else None + ) + + if self.read_obj_str.generation_number: + self.generation_number = self.read_obj_str.generation_number + if self.read_obj_str.read_handle: + self.read_handle = self.read_obj_str.read_handle + if self.read_obj_str.persisted_size is not None: + self.persisted_size = self.read_obj_str.persisted_size + + self._is_stream_open = True + + await retry_policy(_do_open)() + + async def download_ranges( + self, + read_ranges: List[Tuple[int, int, BytesIO]], + lock: asyncio.Lock = None, + retry_policy: Optional[AsyncRetry] = None, + metadata: Optional[List[Tuple[str, str]]] = None, + ) -> None: + """Downloads multiple byte ranges from the object into the buffers + provided by user with automatic retries. + + :type read_ranges: List[Tuple[int, int, "BytesIO"]] + :param read_ranges: A list of tuples, where each tuple represents a + combination of byte_range and writeable buffer in format - + (`start_byte`, `bytes_to_read`, `writeable_buffer`). Buffer has + to be provided by the user, and user has to make sure appropriate + memory is available in the application to avoid out-of-memory crash. + + Special cases: + if the value of `bytes_to_read` is 0, it'll be interpreted as + download all contents until the end of the file from `start_byte`. + Examples: + * (0, 0, buffer) : downloads 0 to end , i.e. entire object. + * (100, 0, buffer) : downloads from 100 to end. + + + :type lock: asyncio.Lock + :param lock: (Optional) An asyncio lock to synchronize sends and recvs + on the underlying bidi-GRPC stream. This is required when multiple + coroutines are calling this method concurrently. + + i.e. Example usage with multiple coroutines: + + ``` + lock = asyncio.Lock() + task1 = asyncio.create_task(mrd.download_ranges(ranges1, lock)) + task2 = asyncio.create_task(mrd.download_ranges(ranges2, lock)) + await asyncio.gather(task1, task2) + + ``` + + If user want to call this method serially from multiple coroutines, + then providing a lock is not necessary. + + ``` + await mrd.download_ranges(ranges1) + await mrd.download_ranges(ranges2) + + # ... some other code code... + + ``` + + :type retry_policy: :class:`~google.api_core.retry_async.AsyncRetry` + :param retry_policy: (Optional) The retry policy to use for the operation. + + :raises ValueError: if the underlying bidi-GRPC stream is not open. + :raises ValueError: if the length of read_ranges is more than 1000. + :raises DataCorruption: if a checksum mismatch is detected while reading data. + + """ + + if len(read_ranges) > 1000: + raise ValueError( + "Invalid input - length of read_ranges cannot be more than 1000" + ) + + if not self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is not open") + + if lock is None: + lock = asyncio.Lock() + + if retry_policy is None: + retry_policy = AsyncRetry(predicate=_is_read_retryable) + + # Initialize Global State for Retry Strategy + download_states = {} + for read_range in read_ranges: + read_id = generate_random_56_bit_integer() + download_states[read_id] = _DownloadState( + initial_offset=read_range[0], + initial_length=read_range[1], + user_buffer=read_range[2], + ) + + initial_state = { + "download_states": download_states, + "read_handle": self.read_handle, + "routing_token": None, + } + + # Track attempts to manage stream reuse + attempt_count = 0 + + def send_ranges_and_get_bytes( + requests: List[_storage_v2.ReadRange], + state: Dict[str, Any], + metadata: Optional[List[Tuple[str, str]]] = None, + ): + async def generator(): + nonlocal attempt_count + attempt_count += 1 + + if attempt_count > 1: + logger.info( + f"Resuming download (attempt {attempt_count - 1}) for {len(requests)} ranges." + ) + + async with lock: + current_handle = state.get("read_handle") + current_token = state.get("routing_token") + + # We reopen if it's a redirect (token exists) OR if this is a retry + # (not first attempt). This prevents trying to send data on a dead + # stream from a previous failed attempt. + should_reopen = ( + (attempt_count > 1) + or (current_token is not None) + or (metadata is not None) + ) + + if should_reopen: + if current_token: + logger.info( + f"Re-opening stream with routing token: {current_token}" + ) + # Close existing stream if any + if self.read_obj_str and self.read_obj_str.is_stream_open: + await self.read_obj_str.close() + + # Re-initialize stream + self.read_obj_str = _AsyncReadObjectStream( + client=self.client.grpc_client, + bucket_name=self.bucket_name, + object_name=self.object_name, + generation_number=self.generation_number, + read_handle=current_handle, + ) + + # Inject routing_token into metadata if present + current_metadata = list(metadata) if metadata else [] + if current_token: + current_metadata.append( + ( + "x-goog-request-params", + f"routing_token={current_token}", + ) + ) + + await self.read_obj_str.open( + metadata=current_metadata if current_metadata else None + ) + self._is_stream_open = True + + pending_read_ids = {r.read_id for r in requests} + + # Send Requests + for i in range( + 0, len(requests), _MAX_READ_RANGES_PER_BIDI_READ_REQUEST + ): + batch = requests[i : i + _MAX_READ_RANGES_PER_BIDI_READ_REQUEST] + await self.read_obj_str.send( + _storage_v2.BidiReadObjectRequest(read_ranges=batch) + ) + + while pending_read_ids: + response = await self.read_obj_str.recv() + if response is None: + break + if response.object_data_ranges: + for data_range in response.object_data_ranges: + if data_range.range_end: + pending_read_ids.discard( + data_range.read_range.read_id + ) + yield response + + return generator() + + strategy = _ReadResumptionStrategy() + retry_manager = _BidiStreamRetryManager( + strategy, lambda r, s: send_ranges_and_get_bytes(r, s, metadata=metadata) + ) + + await retry_manager.execute(initial_state, retry_policy) + + if initial_state.get("read_handle"): + self.read_handle = initial_state["read_handle"] + + async def close(self): + """ + Closes the underlying bidi-gRPC connection. + """ + if not self._is_stream_open: + raise ValueError("Underlying bidi-gRPC stream is not open") + + if self.read_obj_str: + await self.read_obj_str.close() + self.read_obj_str = None + self._is_stream_open = False + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open diff --git a/google/cloud/storage/asyncio/async_read_object_stream.py b/google/cloud/storage/asyncio/async_read_object_stream.py new file mode 100644 index 000000000..d456f16cc --- /dev/null +++ b/google/cloud/storage/asyncio/async_read_object_stream.py @@ -0,0 +1,188 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List, Optional, Tuple +from google.cloud import _storage_v2 +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_abstract_object_stream import ( + _AsyncAbstractObjectStream, +) + +from google.api_core.bidi_async import AsyncBidiRpc + + +class _AsyncReadObjectStream(_AsyncAbstractObjectStream): + """Class representing a gRPC bidi-stream for reading data from a GCS ``Object``. + + This class provides a unix socket-like interface to a GCS ``Object``, with + methods like ``open``, ``close``, ``send``, and ``recv``. + + :type client: :class:`~google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :param client: async grpc client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the GCS ``bucket`` containing the object. + + :type object_name: str + :param object_name: The name of the GCS ``object`` to be read. + + :type generation_number: int + :param generation_number: (Optional) If present, selects a specific revision of + this object. + + :type read_handle: _storage_v2.BidiReadHandle + :param read_handle: (Optional) An existing handle for reading the object. + If provided, opening the bidi-gRPC connection will be faster. + """ + + def __init__( + self, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, + read_handle: Optional[_storage_v2.BidiReadHandle] = None, + ) -> None: + if client is None: + raise ValueError("client must be provided") + if bucket_name is None: + raise ValueError("bucket_name must be provided") + if object_name is None: + raise ValueError("object_name must be provided") + + super().__init__( + bucket_name=bucket_name, + object_name=object_name, + generation_number=generation_number, + ) + self.client: AsyncGrpcClient.grpc_client = client + self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle + + self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" + + self.rpc = self.client._client._transport._wrapped_methods[ + self.client._client._transport.bidi_read_object + ] + self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) + self.socket_like_rpc: Optional[AsyncBidiRpc] = None + self._is_stream_open: bool = False + self.persisted_size: Optional[int] = None + + async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: + """Opens the bidi-gRPC connection to read from the object. + + This method sends an initial request to start the stream and receives + the first response containing metadata and a read handle. + + Args: + metadata (Optional[List[Tuple[str, str]]]): Additional metadata + to send with the initial stream request, e.g., for routing tokens. + """ + if self._is_stream_open: + raise ValueError("Stream is already open") + + read_handle = self.read_handle if self.read_handle else None + + read_object_spec = _storage_v2.BidiReadObjectSpec( + bucket=self._full_bucket_name, + object=self.object_name, + generation=self.generation_number if self.generation_number else None, + read_handle=read_handle, + ) + self.first_bidi_read_req = _storage_v2.BidiReadObjectRequest( + read_object_spec=read_object_spec + ) + + # Build the x-goog-request-params header + request_params = [f"bucket={self._full_bucket_name}"] + other_metadata = [] + if metadata: + for key, value in metadata: + if key == "x-goog-request-params": + request_params.append(value) + else: + other_metadata.append((key, value)) + + current_metadata = other_metadata + current_metadata.append(("x-goog-request-params", ",".join(request_params))) + + self.socket_like_rpc = AsyncBidiRpc( + self.rpc, + initial_request=self.first_bidi_read_req, + metadata=current_metadata, + ) + await self.socket_like_rpc.open() # this is actually 1 send + response = await self.socket_like_rpc.recv() + # populated only in the first response of bidi-stream and when opened + # without using `read_handle` + if hasattr(response, "metadata") and response.metadata: + if self.generation_number is None: + self.generation_number = response.metadata.generation + # update persisted size + self.persisted_size = response.metadata.size + + if response and response.read_handle: + self.read_handle = response.read_handle + + self._is_stream_open = True + + async def close(self) -> None: + """Closes the bidi-gRPC connection.""" + if not self._is_stream_open: + raise ValueError("Stream is not open") + await self.requests_done() + await self.socket_like_rpc.close() + self._is_stream_open = False + + async def requests_done(self): + """Signals that all requests have been sent.""" + + await self.socket_like_rpc.send(None) + await self.socket_like_rpc.recv() + + async def send( + self, bidi_read_object_request: _storage_v2.BidiReadObjectRequest + ) -> None: + """Sends a request message on the stream. + + Args: + bidi_read_object_request (:class:`~google.cloud._storage_v2.types.BidiReadObjectRequest`): + The request message to send. This is typically used to specify + the read offset and limit. + """ + if not self._is_stream_open: + raise ValueError("Stream is not open") + await self.socket_like_rpc.send(bidi_read_object_request) + + async def recv(self) -> _storage_v2.BidiReadObjectResponse: + """Receives a response from the stream. + + This method waits for the next message from the server, which could + contain object data or metadata. + + Returns: + :class:`~google.cloud._storage_v2.types.BidiReadObjectResponse`: + The response message from the server. + """ + if not self._is_stream_open: + raise ValueError("Stream is not open") + response = await self.socket_like_rpc.recv() + # Update read_handle if present in response + if response and response.read_handle: + self.read_handle = response.read_handle + return response + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open diff --git a/google/cloud/storage/asyncio/async_write_object_stream.py b/google/cloud/storage/asyncio/async_write_object_stream.py new file mode 100644 index 000000000..721183962 --- /dev/null +++ b/google/cloud/storage/asyncio/async_write_object_stream.py @@ -0,0 +1,227 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List, Optional, Tuple +from google.cloud import _storage_v2 +from google.cloud.storage.asyncio import _utils +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_abstract_object_stream import ( + _AsyncAbstractObjectStream, +) +from google.api_core.bidi_async import AsyncBidiRpc + + +class _AsyncWriteObjectStream(_AsyncAbstractObjectStream): + """Class representing a gRPC bidi-stream for writing data from a GCS + ``Appendable Object``. + + This class provides a unix socket-like interface to a GCS ``Object``, with + methods like ``open``, ``close``, ``send``, and ``recv``. + + :type client: :class:`~google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client` + :param client: async grpc client to use for making API requests. + + :type bucket_name: str + :param bucket_name: The name of the GCS ``bucket`` containing the object. + + :type object_name: str + :param object_name: The name of the GCS ``Appendable Object`` to be write. + + :type generation_number: int + :param generation_number: (Optional) If present, creates writer for that + specific revision of that object. Use this to append data to an + existing Appendable Object. + + Setting to ``0`` makes the `writer.open()` succeed only if + object doesn't exist in the bucket (useful for not accidentally + overwriting existing objects). + + Warning: If `None`, a new object is created. If an object with the + same name already exists, it will be overwritten the moment + `writer.open()` is called. + + :type write_handle: _storage_v2.BidiWriteHandle + :param write_handle: (Optional) An existing handle for writing the object. + If provided, opening the bidi-gRPC connection will be faster. + """ + + def __init__( + self, + client: AsyncGrpcClient.grpc_client, + bucket_name: str, + object_name: str, + generation_number: Optional[int] = None, # None means new object + write_handle: Optional[_storage_v2.BidiWriteHandle] = None, + routing_token: Optional[str] = None, + ) -> None: + if client is None: + raise ValueError("client must be provided") + if bucket_name is None: + raise ValueError("bucket_name must be provided") + if object_name is None: + raise ValueError("object_name must be provided") + + super().__init__( + bucket_name=bucket_name, + object_name=object_name, + generation_number=generation_number, + ) + self.client: AsyncGrpcClient.grpc_client = client + self.write_handle: Optional[_storage_v2.BidiWriteHandle] = write_handle + self.routing_token: Optional[str] = routing_token + + self._full_bucket_name = f"projects/_/buckets/{self.bucket_name}" + + self.rpc = self.client._client._transport._wrapped_methods[ + self.client._client._transport.bidi_write_object + ] + + self.metadata = (("x-goog-request-params", f"bucket={self._full_bucket_name}"),) + self.socket_like_rpc: Optional[AsyncBidiRpc] = None + self._is_stream_open: bool = False + self.first_bidi_write_req = None + self.persisted_size = 0 + self.object_resource: Optional[_storage_v2.Object] = None + + async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: + """ + Opens the bidi-gRPC connection to write to the object. + + This method sends an initial request to start the stream and receives + the first response containing metadata and a write handle. + + :rtype: None + :raises ValueError: If the stream is already open. + :raises google.api_core.exceptions.FailedPrecondition: + if `generation_number` is 0 and object already exists. + """ + if self._is_stream_open: + raise ValueError("Stream is already open") + + # Create a new object or overwrite existing one if generation_number + # is None. This makes it consistent with GCS JSON API behavior. + # Created object type would be Appendable Object. + # if `generation_number` == 0 new object will be created only if there + # isn't any existing object. + if self.generation_number is None or self.generation_number == 0: + self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( + write_object_spec=_storage_v2.WriteObjectSpec( + resource=_storage_v2.Object( + name=self.object_name, bucket=self._full_bucket_name + ), + appendable=True, + if_generation_match=self.generation_number, + ), + ) + else: + self.first_bidi_write_req = _storage_v2.BidiWriteObjectRequest( + append_object_spec=_storage_v2.AppendObjectSpec( + bucket=self._full_bucket_name, + object=self.object_name, + generation=self.generation_number, + write_handle=self.write_handle if self.write_handle else None, + routing_token=self.routing_token if self.routing_token else None, + ), + ) + + request_param_values = [f"bucket={self._full_bucket_name}"] + final_metadata = [] + if metadata: + for key, value in metadata: + if key == "x-goog-request-params": + request_param_values.append(value) + else: + final_metadata.append((key, value)) + + final_metadata.append(("x-goog-request-params", ",".join(request_param_values))) + + self.socket_like_rpc = AsyncBidiRpc( + self.rpc, + initial_request=self.first_bidi_write_req, + metadata=final_metadata, + ) + + await self.socket_like_rpc.open() # this is actually 1 send + response = await self.socket_like_rpc.recv() + self._is_stream_open = True + + if response.persisted_size: + self.persisted_size = response.persisted_size + + if response.resource: + if not response.resource.size: + # Appending to a 0 byte appendable object. + self.persisted_size = 0 + else: + self.persisted_size = response.resource.size + + self.generation_number = response.resource.generation + + if response.write_handle: + self.write_handle = response.write_handle + + async def close(self) -> None: + """Closes the bidi-gRPC connection.""" + if not self._is_stream_open: + raise ValueError("Stream is not open") + await self.requests_done() + await self.socket_like_rpc.close() + self._is_stream_open = False + + async def requests_done(self): + """Signals that all requests have been sent.""" + + await self.socket_like_rpc.send(None) + _utils.update_write_handle_if_exists(self, await self.socket_like_rpc.recv()) + + async def send( + self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest + ) -> None: + """Sends a request message on the stream. + + Args: + bidi_write_object_request (:class:`~google.cloud._storage_v2.types.BidiReadObjectRequest`): + The request message to send. This is typically used to specify + the read offset and limit. + """ + if not self._is_stream_open: + raise ValueError("Stream is not open") + await self.socket_like_rpc.send(bidi_write_object_request) + + async def recv(self) -> _storage_v2.BidiWriteObjectResponse: + """Receives a response from the stream. + + This method waits for the next message from the server, which could + contain object data or metadata. + + Returns: + :class:`~google.cloud._storage_v2.types.BidiWriteObjectResponse`: + The response message from the server. + """ + if not self._is_stream_open: + raise ValueError("Stream is not open") + response = await self.socket_like_rpc.recv() + # Update write_handle if present in response + if response: + if response.write_handle: + self.write_handle = response.write_handle + if response.persisted_size is not None: + self.persisted_size = response.persisted_size + if response.resource and response.resource.size: + self.persisted_size = response.resource.size + return response + + @property + def is_stream_open(self) -> bool: + return self._is_stream_open diff --git a/google/cloud/storage/asyncio/retry/_helpers.py b/google/cloud/storage/asyncio/retry/_helpers.py new file mode 100644 index 000000000..d9ad2462e --- /dev/null +++ b/google/cloud/storage/asyncio/retry/_helpers.py @@ -0,0 +1,125 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Tuple, Optional + +from google.api_core import exceptions +from google.cloud._storage_v2.types import ( + BidiReadObjectRedirectedError, + BidiWriteObjectRedirectedError, +) +from google.rpc import status_pb2 + +_BIDI_READ_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +) +_BIDI_WRITE_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiWriteObjectRedirectedError" +) +logger = logging.getLogger(__name__) + + +def _handle_redirect( + exc: Exception, +) -> Tuple[Optional[str], Optional[bytes]]: + """ + Extracts routing token and read handle from a gRPC error. + + :type exc: Exception + :param exc: The exception to parse. + + :rtype: Tuple[Optional[str], Optional[bytes]] + :returns: A tuple of (routing_token, read_handle). + """ + routing_token = None + read_handle = None + + grpc_error = None + if isinstance(exc, exceptions.Aborted) and exc.errors: + grpc_error = exc.errors[0] + + if grpc_error: + if isinstance(grpc_error, BidiReadObjectRedirectedError): + routing_token = grpc_error.routing_token + if grpc_error.read_handle: + read_handle = grpc_error.read_handle + return routing_token, read_handle + + if hasattr(grpc_error, "trailing_metadata"): + trailers = grpc_error.trailing_metadata() + if not trailers: + return None, None + + status_details_bin = None + for key, value in trailers: + if key == "grpc-status-details-bin": + status_details_bin = value + break + + if status_details_bin: + status_proto = status_pb2.Status() + try: + status_proto.ParseFromString(status_details_bin) + for detail in status_proto.details: + if detail.type_url == _BIDI_READ_REDIRECTED_TYPE_URL: + redirect_proto = BidiReadObjectRedirectedError.deserialize( + detail.value + ) + if redirect_proto.routing_token: + routing_token = redirect_proto.routing_token + if redirect_proto.read_handle: + read_handle = redirect_proto.read_handle + break + except Exception as e: + logger.error(f"Error unpacking redirect: {e}") + + return routing_token, read_handle + + +def _extract_bidi_writes_redirect_proto(exc: Exception): + grpc_error = None + if isinstance(exc, exceptions.Aborted) and exc.errors: + grpc_error = exc.errors[0] + + if grpc_error: + if isinstance(grpc_error, BidiWriteObjectRedirectedError): + return grpc_error + + if hasattr(grpc_error, "trailing_metadata"): + trailers = grpc_error.trailing_metadata() + if not trailers: + return + + status_details_bin = None + for key, value in trailers: + if key == "grpc-status-details-bin": + status_details_bin = value + break + + if status_details_bin: + status_proto = status_pb2.Status() + try: + status_proto.ParseFromString(status_details_bin) + for detail in status_proto.details: + if detail.type_url == _BIDI_WRITE_REDIRECTED_TYPE_URL: + redirect_proto = BidiWriteObjectRedirectedError.deserialize( + detail.value + ) + return redirect_proto + except Exception: + logger.error("Error unpacking redirect details from gRPC error.") + pass diff --git a/google/cloud/storage/asyncio/retry/base_strategy.py b/google/cloud/storage/asyncio/retry/base_strategy.py new file mode 100644 index 000000000..ff193f109 --- /dev/null +++ b/google/cloud/storage/asyncio/retry/base_strategy.py @@ -0,0 +1,83 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import abc +from typing import Any, Iterable + + +class _BaseResumptionStrategy(abc.ABC): + """Abstract base class defining the interface for a bidi stream resumption strategy. + + This class defines the skeleton for a pluggable strategy that contains + all the service-specific logic for a given bidi operation (e.g., reads + or writes). This allows a generic retry manager to handle the common + retry loop while sending the state management and request generation + to a concrete implementation of this class. + """ + + @abc.abstractmethod + def generate_requests(self, state: Any) -> Iterable[Any]: + """Generates the next batch of requests based on the current state. + + This method is called at the beginning of each retry attempt. It should + inspect the provided state object and generate the appropriate list of + request protos to send to the server. For example, a read strategy + would use this to implement "Smarter Resumption" by creating smaller + `ReadRange` requests for partially downloaded ranges. For bidi-writes, + it will set the `write_offset` field to the persisted size received + from the server in the next request. + + :type state: Any + :param state: An object containing all the state needed for the + operation (e.g., requested ranges, user buffers, + bytes written). + """ + pass + + @abc.abstractmethod + def update_state_from_response(self, response: Any, state: Any) -> None: + """Updates the state based on a successful server response. + + This method is called for every message received from the server. It is + responsible for processing the response and updating the shared state + object. + + :type response: Any + :param response: The response message received from the server. + + :type state: Any + :param state: The shared state object for the operation, which will be + mutated by this method. + """ + pass + + @abc.abstractmethod + async def recover_state_on_failure(self, error: Exception, state: Any) -> None: + """Prepares the state for the next retry attempt after a failure. + + This method is called when a retriable gRPC error occurs. It is + responsible for performing any necessary actions to ensure the next + retry attempt can succeed. For bidi reads, its primary role is to + handle the `BidiReadObjectRedirectError` by extracting the + `routing_token` and updating the state. For bidi writes, it will update + the state to reflect any bytes that were successfully persisted before + the failure. + + :type error: :class:`Exception` + :param error: The exception that was caught by the retry engine. + + :type state: Any + :param state: The shared state object for the operation. + """ + pass diff --git a/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py b/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py new file mode 100644 index 000000000..23bffb63d --- /dev/null +++ b/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py @@ -0,0 +1,69 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from typing import Any, AsyncIterator, Callable + +from google.cloud.storage.asyncio.retry.base_strategy import ( + _BaseResumptionStrategy, +) + +logger = logging.getLogger(__name__) + + +class _BidiStreamRetryManager: + """Manages the generic retry loop for a bidi streaming operation.""" + + def __init__( + self, + strategy: _BaseResumptionStrategy, + send_and_recv: Callable[..., AsyncIterator[Any]], + ): + """Initializes the retry manager. + Args: + strategy: The strategy for managing the state of a specific + bidi operation (e.g., reads or writes). + send_and_recv: An async callable that opens a new gRPC stream. + """ + self._strategy = strategy + self._send_and_recv = send_and_recv + + async def execute(self, initial_state: Any, retry_policy): + """ + Executes the bidi operation with the configured retry policy. + Args: + initial_state: An object containing all state for the operation. + retry_policy: The `google.api_core.retry.AsyncRetry` object to + govern the retry behavior for this specific operation. + """ + state = initial_state + + async def attempt(): + requests = self._strategy.generate_requests(state) + stream = self._send_and_recv(requests, state) + try: + async for response in stream: + self._strategy.update_state_from_response(response, state) + return + except Exception as e: + if retry_policy._predicate(e): + logger.info( + f"Bidi stream operation failed: {e}. Attempting state recovery and retry." + ) + await self._strategy.recover_state_on_failure(e, state) + raise e + + wrapped_attempt = retry_policy(attempt) + + await wrapped_attempt() diff --git a/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py new file mode 100644 index 000000000..468954332 --- /dev/null +++ b/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py @@ -0,0 +1,157 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, Dict, List, IO +import logging + +from google_crc32c import Checksum +from google.cloud import _storage_v2 as storage_v2 +from google.cloud.storage.exceptions import DataCorruption +from google.cloud.storage.asyncio.retry._helpers import ( + _handle_redirect, +) +from google.cloud.storage.asyncio.retry.base_strategy import ( + _BaseResumptionStrategy, +) + + +_BIDI_READ_REDIRECTED_TYPE_URL = ( + "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" +) +logger = logging.getLogger(__name__) + + +class _DownloadState: + """A helper class to track the state of a single range download.""" + + def __init__( + self, initial_offset: int, initial_length: int, user_buffer: IO[bytes] + ): + self.initial_offset = initial_offset + self.initial_length = initial_length + self.user_buffer = user_buffer + self.bytes_written = 0 + self.next_expected_offset = initial_offset + self.is_complete = False + + +class _ReadResumptionStrategy(_BaseResumptionStrategy): + """The concrete resumption strategy for bidi reads.""" + + def generate_requests(self, state: Dict[str, Any]) -> List[storage_v2.ReadRange]: + """Generates new ReadRange requests for all incomplete downloads. + + :type state: dict + :param state: A dictionary mapping a read_id to its corresponding + _DownloadState object. + """ + pending_requests = [] + download_states: Dict[int, _DownloadState] = state["download_states"] + + for read_id, read_state in download_states.items(): + if not read_state.is_complete: + new_offset = read_state.initial_offset + read_state.bytes_written + + # Calculate remaining length. If initial_length is 0 (read to end), + # it stays 0. Otherwise, subtract bytes_written. + new_length = 0 + if read_state.initial_length > 0: + new_length = read_state.initial_length - read_state.bytes_written + + new_request = storage_v2.ReadRange( + read_offset=new_offset, + read_length=new_length, + read_id=read_id, + ) + pending_requests.append(new_request) + return pending_requests + + def update_state_from_response( + self, response: storage_v2.BidiReadObjectResponse, state: Dict[str, Any] + ) -> None: + """Processes a server response, performs integrity checks, and updates state.""" + + # Capture read_handle if provided. + if response.read_handle: + state["read_handle"] = response.read_handle + + download_states = state["download_states"] + + for object_data_range in response.object_data_ranges: + # Ignore empty ranges or ranges for IDs not in our state + # (e.g., from a previously cancelled request on the same stream). + if not object_data_range.read_range: + logger.warning( + "Received response with missing read_range field; ignoring." + ) + continue + + read_id = object_data_range.read_range.read_id + if read_id not in download_states: + logger.warning( + f"Received data for unknown or stale read_id {read_id}; ignoring." + ) + continue + + read_state = download_states[read_id] + + # Offset Verification + chunk_offset = object_data_range.read_range.read_offset + if chunk_offset != read_state.next_expected_offset: + raise DataCorruption( + response, + f"Offset mismatch for read_id {read_id}. " + f"Expected {read_state.next_expected_offset}, got {chunk_offset}", + ) + + # Checksum Verification + # We must validate data before updating state or writing to buffer. + data = object_data_range.checksummed_data.content + server_checksum = object_data_range.checksummed_data.crc32c + + if server_checksum is not None: + client_checksum = int.from_bytes(Checksum(data).digest(), "big") + if server_checksum != client_checksum: + raise DataCorruption( + response, + f"Checksum mismatch for read_id {read_id}. " + f"Server sent {server_checksum}, client calculated {client_checksum}.", + ) + + # Update State & Write Data + chunk_size = len(data) + read_state.user_buffer.write(data) + read_state.bytes_written += chunk_size + read_state.next_expected_offset += chunk_size + + # Final Byte Count Verification + if object_data_range.range_end: + read_state.is_complete = True + if ( + read_state.initial_length != 0 + and read_state.bytes_written > read_state.initial_length + ): + raise DataCorruption( + response, + f"Byte count mismatch for read_id {read_id}. " + f"Expected {read_state.initial_length}, got {read_state.bytes_written}", + ) + + async def recover_state_on_failure(self, error: Exception, state: Any) -> None: + """Handles BidiReadObjectRedirectedError for reads.""" + routing_token, read_handle = _handle_redirect(error) + if routing_token: + state["routing_token"] = routing_token + if read_handle: + state["read_handle"] = read_handle diff --git a/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py b/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py new file mode 100644 index 000000000..b98b9b2e7 --- /dev/null +++ b/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py @@ -0,0 +1,147 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, Dict, IO, List, Optional, Union + +import google_crc32c +from google.cloud._storage_v2.types import storage as storage_type +from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError +from google.cloud.storage.asyncio.retry.base_strategy import ( + _BaseResumptionStrategy, +) +from google.cloud.storage.asyncio.retry._helpers import ( + _extract_bidi_writes_redirect_proto, +) + + +class _WriteState: + """A helper class to track the state of a single upload operation. + + :type chunk_size: int + :param chunk_size: The size of chunks to write to the server. + + :type user_buffer: IO[bytes] + :param user_buffer: The data source. + + :type flush_interval: int + :param flush_interval: The flush interval at which the data is flushed. + """ + + def __init__( + self, + chunk_size: int, + user_buffer: IO[bytes], + flush_interval: int, + ): + self.chunk_size = chunk_size + self.user_buffer = user_buffer + self.persisted_size: int = 0 + self.bytes_sent: int = 0 + self.bytes_since_last_flush: int = 0 + self.flush_interval: int = flush_interval + self.write_handle: Union[bytes, storage_type.BidiWriteHandle, None] = None + self.routing_token: Optional[str] = None + self.is_finalized: bool = False + + +class _WriteResumptionStrategy(_BaseResumptionStrategy): + """The concrete resumption strategy for bidi writes.""" + + def generate_requests( + self, state: Dict[str, Any] + ) -> List[storage_type.BidiWriteObjectRequest]: + """Generates BidiWriteObjectRequests to resume or continue the upload. + + This method is not applicable for `open` methods. + """ + write_state: _WriteState = state["write_state"] + + requests = [] + # The buffer should already be seeked to the correct position (persisted_size) + # by the `recover_state_on_failure` method before this is called. + while not write_state.is_finalized: + chunk = write_state.user_buffer.read(write_state.chunk_size) + + # End of File detection + if not chunk: + break + + checksummed_data = storage_type.ChecksummedData(content=chunk) + checksum = google_crc32c.Checksum(chunk) + checksummed_data.crc32c = int.from_bytes(checksum.digest(), "big") + + request = storage_type.BidiWriteObjectRequest( + write_offset=write_state.bytes_sent, + checksummed_data=checksummed_data, + ) + chunk_len = len(chunk) + write_state.bytes_sent += chunk_len + write_state.bytes_since_last_flush += chunk_len + + if write_state.bytes_since_last_flush >= write_state.flush_interval: + request.flush = True + # reset counter after marking flush + write_state.bytes_since_last_flush = 0 + + requests.append(request) + return requests + + def update_state_from_response( + self, response: storage_type.BidiWriteObjectResponse, state: Dict[str, Any] + ) -> None: + """Processes a server response and updates the write state.""" + write_state: _WriteState = state["write_state"] + if response is None: + return + if response.persisted_size: + write_state.persisted_size = response.persisted_size + + if response.write_handle: + write_state.write_handle = response.write_handle + + if response.resource: + write_state.persisted_size = response.resource.size + if response.resource.finalize_time: + write_state.is_finalized = True + + async def recover_state_on_failure( + self, error: Exception, state: Dict[str, Any] + ) -> None: + """ + Handles errors, specifically BidiWriteObjectRedirectedError, and rewinds state. + + This method rewinds the user buffer and internal byte tracking to the + last confirmed 'persisted_size' from the server. + """ + write_state: _WriteState = state["write_state"] + + redirect_proto = None + + if isinstance(error, BidiWriteObjectRedirectedError): + redirect_proto = error + else: + redirect_proto = _extract_bidi_writes_redirect_proto(error) + + # Extract routing token and potentially a new write handle for redirection. + if redirect_proto: + if redirect_proto.routing_token: + write_state.routing_token = redirect_proto.routing_token + if redirect_proto.write_handle: + write_state.write_handle = redirect_proto.write_handle + + # We must assume any data sent beyond 'persisted_size' was lost. + # Reset the user buffer to the last known good byte confirmed by the server. + write_state.user_buffer.seek(write_state.persisted_size) + write_state.bytes_sent = write_state.persisted_size + write_state.bytes_since_last_flush = 0 diff --git a/google/cloud/storage/grpc_client.py b/google/cloud/storage/grpc_client.py new file mode 100644 index 000000000..7a739b7b7 --- /dev/null +++ b/google/cloud/storage/grpc_client.py @@ -0,0 +1,122 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A client for interacting with Google Cloud Storage using the gRPC API.""" + +from google.cloud.client import ClientWithProject +from google.cloud import _storage_v2 as storage_v2 + +_marker = object() + + +class GrpcClient(ClientWithProject): + """A client for interacting with Google Cloud Storage using the gRPC API. + + :type project: str or None + :param project: The project which the client acts on behalf of. If not + passed, falls back to the default inferred from the + environment. + + :type credentials: :class:`~google.auth.credentials.Credentials` + :param credentials: (Optional) The OAuth2 Credentials to use for this + client. If not passed, falls back to the default + inferred from the environment. + + :type client_info: :class:`~google.api_core.client_info.ClientInfo` + :param client_info: + The client info used to send a user-agent string along with API + requests. If ``None``, then default info will be used. Generally, + you only need to set this if you're developing your own library + or partner tool. + + :type client_options: :class:`~google.api_core.client_options.ClientOptions` or :class:`dict` + :param client_options: (Optional) Client options used to set user options + on the client. A non-default universe domain or API endpoint should be + set through client_options. + + :type api_key: string + :param api_key: + (Optional) An API key. Mutually exclusive with any other credentials. + This parameter is an alias for setting `client_options.api_key` and + will supersede any API key set in the `client_options` parameter. + + :type attempt_direct_path: bool + :param attempt_direct_path: + (Optional) Whether to attempt to use DirectPath for gRPC connections. + This provides a direct, unproxied connection to GCS for lower latency + and higher throughput, and is highly recommended when running on Google + Cloud infrastructure. Defaults to ``True``. + """ + + def __init__( + self, + project=_marker, + credentials=None, + client_info=None, + client_options=None, + *, + api_key=None, + attempt_direct_path=True, + ): + super(GrpcClient, self).__init__(project=project, credentials=credentials) + + if isinstance(client_options, dict): + if api_key: + client_options["api_key"] = api_key + elif client_options is None: + client_options = {} if not api_key else {"api_key": api_key} + elif api_key: + client_options.api_key = api_key + + self._grpc_client = self._create_gapic_client( + credentials=credentials, + client_info=client_info, + client_options=client_options, + attempt_direct_path=attempt_direct_path, + ) + + def _create_gapic_client( + self, + credentials=None, + client_info=None, + client_options=None, + attempt_direct_path=True, + ): + """Creates and configures the low-level GAPIC `storage_v2` client.""" + transport_cls = storage_v2.StorageClient.get_transport_class("grpc") + + channel = transport_cls.create_channel(attempt_direct_path=attempt_direct_path) + + transport = transport_cls(credentials=credentials, channel=channel) + + return storage_v2.StorageClient( + credentials=credentials, + transport=transport, + client_info=client_info, + client_options=client_options, + ) + + @property + def grpc_client(self): + """The underlying gRPC client. + + This property gives users direct access to the `storage_v2.StorageClient` + instance. This can be useful for accessing + newly added or experimental RPCs that are not yet exposed through + the high-level GrpcClient. + + Returns: + google.cloud.storage_v2.StorageClient: The configured GAPIC client. + """ + return self._grpc_client diff --git a/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py b/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py index f00a6ba80..725eeb2bd 100644 --- a/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py +++ b/samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py @@ -17,10 +17,10 @@ import argparse import asyncio -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient # [START storage_create_and_write_appendable_object] diff --git a/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py b/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py index 971658997..807fe40a5 100644 --- a/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py +++ b/samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py @@ -17,10 +17,10 @@ import argparse import asyncio -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient # [START storage_finalize_appendable_object_upload] diff --git a/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py index ce2ba678b..bed580d36 100644 --- a/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py +++ b/samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py @@ -14,15 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Downloads a range of bytes from multiple objects concurrently.""" +"""Downloads a range of bytes from multiple objects concurrently. +Example usage: + ```python samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py \ + --bucket_name \ + --object_names ``` +""" import argparse import asyncio from io import BytesIO -from google.cloud.storage._experimental.asyncio.async_grpc_client import ( +from google.cloud.storage.asyncio.async_grpc_client import ( AsyncGrpcClient, ) -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) diff --git a/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py index 02c3bace5..b0f64c486 100644 --- a/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py +++ b/samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py @@ -18,8 +18,8 @@ import asyncio from io import BytesIO -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) diff --git a/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py b/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py index b4cad6718..2e18caabe 100644 --- a/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py +++ b/samples/snippets/zonal_buckets/storage_open_object_read_full_object.py @@ -18,8 +18,8 @@ import asyncio from io import BytesIO -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) diff --git a/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py b/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py index b013cc938..74bec43f6 100644 --- a/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py +++ b/samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py @@ -18,8 +18,8 @@ import asyncio from io import BytesIO -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) diff --git a/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py b/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py index 3fb17ceae..c758dc641 100644 --- a/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py +++ b/samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py @@ -17,10 +17,10 @@ import argparse import asyncio -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient # [START storage_pause_and_resume_appendable_upload] diff --git a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py index 1134f28d6..9e4dcd738 100644 --- a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py +++ b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py @@ -20,11 +20,11 @@ from datetime import datetime from io import BytesIO -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) diff --git a/samples/snippets/zonal_buckets/zonal_snippets_test.py b/samples/snippets/zonal_buckets/zonal_snippets_test.py index 736576eb5..6852efe22 100644 --- a/samples/snippets/zonal_buckets/zonal_snippets_test.py +++ b/samples/snippets/zonal_buckets/zonal_snippets_test.py @@ -20,8 +20,8 @@ from google.cloud.storage import Client import contextlib -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) diff --git a/tests/perf/microbenchmarks/conftest.py b/tests/perf/microbenchmarks/conftest.py index c09e9ce93..e748c6e43 100644 --- a/tests/perf/microbenchmarks/conftest.py +++ b/tests/perf/microbenchmarks/conftest.py @@ -22,10 +22,10 @@ import os import uuid from google.cloud import storage -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient from tests.perf.microbenchmarks.writes.parameters import WriteParameters _OBJECT_NAME_PREFIX = "micro-benchmark" diff --git a/tests/perf/microbenchmarks/reads/test_reads.py b/tests/perf/microbenchmarks/reads/test_reads.py index 2b5f80d42..d51102cea 100644 --- a/tests/perf/microbenchmarks/reads/test_reads.py +++ b/tests/perf/microbenchmarks/reads/test_reads.py @@ -30,8 +30,8 @@ import pytest -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) from tests.perf.microbenchmarks._utils import publish_benchmark_extra_info diff --git a/tests/perf/microbenchmarks/writes/test_writes.py b/tests/perf/microbenchmarks/writes/test_writes.py index 5648ada0d..02a0f5e4f 100644 --- a/tests/perf/microbenchmarks/writes/test_writes.py +++ b/tests/perf/microbenchmarks/writes/test_writes.py @@ -30,8 +30,8 @@ import logging import pytest -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, ) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 4d46353e2..ed59f9a4a 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -11,12 +11,12 @@ import gc # current library imports -from google.cloud.storage._experimental.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, _DEFAULT_FLUSH_INTERVAL_BYTES, ) -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) from google.api_core.exceptions import FailedPrecondition diff --git a/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py b/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py index 6c837ec5c..e0eba9030 100644 --- a/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py +++ b/tests/unit/asyncio/retry/test_bidi_stream_retry_manager.py @@ -18,10 +18,10 @@ from google.api_core import exceptions from google.api_core.retry_async import AsyncRetry -from google.cloud.storage._experimental.asyncio.retry import ( +from google.cloud.storage.asyncio.retry import ( bidi_stream_retry_manager as manager, ) -from google.cloud.storage._experimental.asyncio.retry import base_strategy +from google.cloud.storage.asyncio.retry import base_strategy def _is_retriable(exc): diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py index 62a05f19a..1e31961b6 100644 --- a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -20,7 +20,7 @@ from google.api_core import exceptions from google.cloud import _storage_v2 as storage_v2 -from google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy import ( +from google.cloud.storage.asyncio.retry.reads_resumption_strategy import ( _DownloadState, _ReadResumptionStrategy, ) @@ -28,7 +28,7 @@ _READ_ID = 1 LOGGER_NAME = ( - "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy" + "google.cloud.storage.asyncio.retry.reads_resumption_strategy" ) diff --git a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py index ce48e21c7..ca354e84a 100644 --- a/tests/unit/asyncio/retry/test_writes_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_writes_resumption_strategy.py @@ -22,7 +22,7 @@ from google.api_core import exceptions from google.cloud._storage_v2.types import storage as storage_type -from google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy import ( +from google.cloud.storage.asyncio.retry.writes_resumption_strategy import ( _WriteState, _WriteResumptionStrategy, ) @@ -352,7 +352,7 @@ async def test_recover_state_on_failure_trailer_metadata_redirect(self, strategy ] with mock.patch( - "google.cloud.storage._experimental.asyncio.retry.writes_resumption_strategy._extract_bidi_writes_redirect_proto", + "google.cloud.storage.asyncio.retry.writes_resumption_strategy._extract_bidi_writes_redirect_proto", return_value=redirect_proto, ): await strategy.recover_state_on_failure( diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 88f4864de..02fb3238d 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -21,7 +21,7 @@ from google.rpc import status_pb2 from google.cloud._storage_v2.types import storage as storage_type from google.cloud._storage_v2.types.storage import BidiWriteObjectRedirectedError -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( +from google.cloud.storage.asyncio.async_appendable_object_writer import ( AsyncAppendableObjectWriter, _is_write_retryable, _MAX_CHUNK_SIZE_BYTES, @@ -91,7 +91,7 @@ def mock_appendable_writer(): mock_client.grpc_client = mock.AsyncMock() # Internal stream class patch stream_patcher = mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" + "google.cloud.storage.asyncio.async_appendable_object_writer._AsyncWriteObjectStream" ) mock_stream_cls = stream_patcher.start() mock_stream = mock_stream_cls.return_value @@ -156,7 +156,7 @@ def test_init_validation_multiple_raises(self, mock_appendable_writer): def test_init_raises_if_crc32c_missing(self, mock_appendable_writer): with mock.patch( - "google.cloud.storage._experimental.asyncio._utils.google_crc32c" + "google.cloud.storage.asyncio._utils.google_crc32c" ) as mock_crc: mock_crc.implementation = "python" with pytest.raises(exceptions.FailedPrecondition): @@ -206,7 +206,7 @@ def test_on_open_error_redirection(self, mock_appendable_writer): ) with mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._extract_bidi_writes_redirect_proto", + "google.cloud.storage.asyncio.async_appendable_object_writer._extract_bidi_writes_redirect_proto", return_value=redirect, ): writer._on_open_error(exceptions.Aborted("redirect")) @@ -230,7 +230,7 @@ async def test_append_basic_success(self, mock_appendable_writer): data = b"test-data" with mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._BidiStreamRetryManager" + "google.cloud.storage.asyncio.async_appendable_object_writer._BidiStreamRetryManager" ) as MockManager: async def mock_execute(state, policy): @@ -277,7 +277,7 @@ async def mock_open(metadata=None): writer, "open", side_effect=mock_open ) as mock_writer_open: with mock.patch( - "google.cloud.storage._experimental.asyncio.async_appendable_object_writer._BidiStreamRetryManager" + "google.cloud.storage.asyncio.async_appendable_object_writer._BidiStreamRetryManager" ) as MockManager: async def mock_execute(state, policy): diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index b0edfafa6..3d897d336 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -16,8 +16,8 @@ from google.auth import credentials as auth_credentials from google.auth.credentials import AnonymousCredentials from google.api_core import client_info as client_info_lib +from google.cloud.storage.asyncio import async_grpc_client from google.cloud.storage import __version__ -from google.cloud.storage._experimental.asyncio import async_grpc_client def _make_credentials(spec=None): diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 09cf0fa09..8d4d6d31d 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -20,10 +20,10 @@ from google.api_core import exceptions from google_crc32c import Checksum -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( +from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) -from google.cloud.storage._experimental.asyncio import async_read_object_stream +from google.cloud.storage.asyncio import async_read_object_stream from io import BytesIO from google.cloud.storage.exceptions import DataCorruption @@ -68,7 +68,7 @@ async def _make_mock_mrd( return mrd, mock_client @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) @pytest.mark.asyncio async def test_create_mrd(self, mock_cls_async_read_object_stream): @@ -95,10 +95,10 @@ async def test_create_mrd(self, mock_cls_async_read_object_stream): assert mrd.is_stream_open @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" + "google.cloud.storage.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) @pytest.mark.asyncio async def test_download_ranges_via_async_gather( @@ -166,10 +166,10 @@ async def test_download_ranges_via_async_gather( assert second_buffer.getvalue() == data[10:16] @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" + "google.cloud.storage.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) @pytest.mark.asyncio async def test_download_ranges( @@ -236,7 +236,7 @@ async def test_downloading_ranges_with_more_than_1000_should_throw_error(self): ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) @pytest.mark.asyncio async def test_opening_mrd_more_than_once_should_throw_error( @@ -255,7 +255,7 @@ async def test_opening_mrd_more_than_once_should_throw_error( assert str(exc.value) == "Underlying bidi-gRPC stream is already open" @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" ) @pytest.mark.asyncio async def test_close_mrd(self, mock_cls_async_read_object_stream): @@ -302,7 +302,7 @@ async def test_downloading_without_opening_should_throw_error(self): assert str(exc.value) == "Underlying bidi-gRPC stream is not open" assert not mrd.is_stream_open - @mock.patch("google.cloud.storage._experimental.asyncio._utils.google_crc32c") + @mock.patch("google.cloud.storage.asyncio._utils.google_crc32c") def test_init_raises_if_crc32c_c_extension_is_missing( self, mock_google_crc32c ): @@ -318,12 +318,12 @@ def test_init_raises_if_crc32c_c_extension_is_missing( @pytest.mark.asyncio @mock.patch( - "google.cloud.storage._experimental.asyncio.retry.reads_resumption_strategy.Checksum" + "google.cloud.storage.asyncio.retry.reads_resumption_strategy.Checksum" ) async def test_download_ranges_raises_on_checksum_mismatch( self, mock_checksum_class ): - from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( + from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) @@ -359,7 +359,7 @@ async def test_download_ranges_raises_on_checksum_mismatch( with pytest.raises(DataCorruption) as exc_info: with mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.generate_random_56_bit_integer", + "google.cloud.storage.asyncio.async_multi_range_downloader.generate_random_56_bit_integer", return_value=0, ): await mrd.download_ranges([(0, len(test_data), BytesIO())]) @@ -368,11 +368,11 @@ async def test_download_ranges_raises_on_checksum_mismatch( mock_checksum_class.assert_called_once_with(test_data) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.open", + "google.cloud.storage.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.open", new_callable=AsyncMock, ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.close", + "google.cloud.storage.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.close", new_callable=AsyncMock, ) @pytest.mark.asyncio diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 18e0c464d..4e8a494b5 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -17,8 +17,8 @@ from unittest.mock import AsyncMock from google.cloud import _storage_v2 -from google.cloud.storage._experimental.asyncio import async_read_object_stream -from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( +from google.cloud.storage.asyncio import async_read_object_stream +from google.cloud.storage.asyncio.async_read_object_stream import ( _AsyncReadObjectStream, ) @@ -80,10 +80,10 @@ async def instantiate_read_obj_stream_with_read_handle( @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): # Arrange @@ -111,10 +111,10 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_open(mock_client, mock_cls_async_bidi_rpc): @@ -137,10 +137,10 @@ async def test_open(mock_client, mock_cls_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_open_with_read_handle(mock_client, mock_cls_async_bidi_rpc): @@ -163,10 +163,10 @@ async def test_open_with_read_handle(mock_client, mock_cls_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_open_when_already_open_should_raise_error( @@ -186,10 +186,10 @@ async def test_open_when_already_open_should_raise_error( @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_close(mock_client, mock_cls_async_bidi_rpc): @@ -209,10 +209,10 @@ async def test_close(mock_client, mock_cls_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_requests_done(mock_client, mock_cls_async_bidi_rpc): @@ -233,10 +233,10 @@ async def test_requests_done(mock_client, mock_cls_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_close_without_open_should_raise_error( @@ -256,10 +256,10 @@ async def test_close_without_open_should_raise_error( @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_send(mock_client, mock_cls_async_bidi_rpc): @@ -279,10 +279,10 @@ async def test_send(mock_client, mock_cls_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_send_without_open_should_raise_error( @@ -302,10 +302,10 @@ async def test_send_without_open_should_raise_error( @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_recv(mock_client, mock_cls_async_bidi_rpc): @@ -327,10 +327,10 @@ async def test_recv(mock_client, mock_cls_async_bidi_rpc): @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_recv_without_open_should_raise_error( @@ -350,10 +350,10 @@ async def test_recv_without_open_should_raise_error( @mock.patch( - "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" ) @mock.patch( - "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" + "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @pytest.mark.asyncio async def test_recv_updates_read_handle_on_refresh( diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 7bfa2cea0..f4a7862d6 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -16,7 +16,7 @@ from unittest.mock import AsyncMock, MagicMock import pytest -from google.cloud.storage._experimental.asyncio.async_write_object_stream import ( +from google.cloud.storage.asyncio.async_write_object_stream import ( _AsyncWriteObjectStream, ) from google.cloud import _storage_v2 @@ -72,7 +72,7 @@ def test_init_raises_value_error(self, mock_client): # ------------------------------------------------------------------------- @mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" ) @pytest.mark.asyncio async def test_open_new_object(self, mock_rpc_cls, mock_client): @@ -102,7 +102,7 @@ async def test_open_new_object(self, mock_rpc_cls, mock_client): assert stream.generation_number == GENERATION @mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" ) @pytest.mark.asyncio async def test_open_existing_object_with_token(self, mock_rpc_cls, mock_client): @@ -133,7 +133,7 @@ async def test_open_existing_object_with_token(self, mock_rpc_cls, mock_client): assert stream.persisted_size == 1024 @mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" ) @pytest.mark.asyncio async def test_open_metadata_merging(self, mock_rpc_cls, mock_client): @@ -167,7 +167,7 @@ async def test_open_already_open_raises(self, mock_client): # ------------------------------------------------------------------------- @mock.patch( - "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc" + "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" ) @pytest.mark.asyncio async def test_send_and_recv_logic(self, mock_rpc_cls, mock_client): diff --git a/tests/unit/test_grpc_client.py b/tests/unit/test_grpc_client.py index 9eca1b280..eb048ff42 100644 --- a/tests/unit/test_grpc_client.py +++ b/tests/unit/test_grpc_client.py @@ -16,6 +16,7 @@ from unittest import mock from google.auth import credentials as auth_credentials from google.api_core import client_options as client_options_lib +from google.cloud.storage import grpc_client def _make_credentials(spec=None): @@ -30,7 +31,6 @@ class TestGrpcClient(unittest.TestCase): def test_constructor_defaults_and_options( self, mock_storage_client, mock_base_client ): - from google.cloud.storage._experimental import grpc_client mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls @@ -71,12 +71,11 @@ def test_constructor_defaults_and_options( # 4. Assert the client instance holds the mocked GAPIC client. self.assertIs(client.grpc_client, mock_storage_client.return_value) - @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud.storage.grpc_client.ClientWithProject") @mock.patch("google.cloud._storage_v2.StorageClient") def test_constructor_disables_direct_path( self, mock_storage_client, mock_base_client ): - from google.cloud.storage._experimental import grpc_client mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls @@ -94,12 +93,11 @@ def test_constructor_disables_direct_path( attempt_direct_path=False ) - @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud.storage.grpc_client.ClientWithProject") @mock.patch("google.cloud._storage_v2.StorageClient") def test_constructor_initialize_with_api_key( self, mock_storage_client, mock_base_client ): - from google.cloud.storage._experimental import grpc_client mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls @@ -124,10 +122,9 @@ def test_constructor_initialize_with_api_key( client_options={"api_key": "test-api-key"}, ) - @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud.storage.grpc_client.ClientWithProject") @mock.patch("google.cloud._storage_v2.StorageClient") def test_grpc_client_property(self, mock_storage_client, mock_base_client): - from google.cloud.storage._experimental import grpc_client mock_creds = _make_credentials() mock_base_client.return_value._credentials = mock_creds @@ -138,12 +135,11 @@ def test_grpc_client_property(self, mock_storage_client, mock_base_client): self.assertIs(retrieved_client, mock_storage_client.return_value) - @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud.storage.grpc_client.ClientWithProject") @mock.patch("google.cloud._storage_v2.StorageClient") def test_constructor_with_api_key_and_client_options( self, mock_storage_client, mock_base_client ): - from google.cloud.storage._experimental import grpc_client mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls @@ -173,12 +169,11 @@ def test_constructor_with_api_key_and_client_options( ) self.assertEqual(client_options_obj.api_key, "new-test-key") - @mock.patch("google.cloud.storage._experimental.grpc_client.ClientWithProject") + @mock.patch("google.cloud.storage.grpc_client.ClientWithProject") @mock.patch("google.cloud._storage_v2.StorageClient") def test_constructor_with_api_key_and_dict_options( self, mock_storage_client, mock_base_client ): - from google.cloud.storage._experimental import grpc_client mock_creds = _make_credentials() mock_base_instance = mock_base_client.return_value From 08bc7082db7392f13bc8c51511b4afa9c7b157c9 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Thu, 29 Jan 2026 16:09:57 +0530 Subject: [PATCH 477/509] feat: update generation for MRD (#1730) Adding a support to pass `generation` in the constructor of MRD. It is done to make it compatible with the other public interfaces. Earlier, `generation_number` was exposed as the parameter which would still be valid after these changes. But using `generation` is more preferred. --- .../asyncio/async_multi_range_downloader.py | 38 ++++++++---- tests/system/test_zonal.py | 3 +- .../retry/test_reads_resumption_strategy.py | 4 +- .../test_async_multi_range_downloader.py | 58 ++++++++++++++++--- .../asyncio/test_async_read_object_stream.py | 48 ++++----------- .../asyncio/test_async_write_object_stream.py | 16 ++--- tests/unit/test_grpc_client.py | 6 -- 7 files changed, 95 insertions(+), 78 deletions(-) diff --git a/google/cloud/storage/asyncio/async_multi_range_downloader.py b/google/cloud/storage/asyncio/async_multi_range_downloader.py index 993fc9522..8ad4d319f 100644 --- a/google/cloud/storage/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/asyncio/async_multi_range_downloader.py @@ -128,10 +128,11 @@ async def create_mrd( client: AsyncGrpcClient, bucket_name: str, object_name: str, - generation_number: Optional[int] = None, + generation: Optional[int] = None, read_handle: Optional[_storage_v2.BidiReadHandle] = None, retry_policy: Optional[AsyncRetry] = None, metadata: Optional[List[Tuple[str, str]]] = None, + **kwargs, ) -> AsyncMultiRangeDownloader: """Initializes a MultiRangeDownloader and opens the underlying bidi-gRPC object for reading. @@ -145,8 +146,8 @@ async def create_mrd( :type object_name: str :param object_name: The name of the object to be read. - :type generation_number: int - :param generation_number: (Optional) If present, selects a specific + :type generation: int + :param generation: (Optional) If present, selects a specific revision of this object. :type read_handle: _storage_v2.BidiReadHandle @@ -162,7 +163,14 @@ async def create_mrd( :rtype: :class:`~google.cloud.storage.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader` :returns: An initialized AsyncMultiRangeDownloader instance for reading. """ - mrd = cls(client, bucket_name, object_name, generation_number, read_handle) + mrd = cls( + client, + bucket_name, + object_name, + generation=generation, + read_handle=read_handle, + **kwargs, + ) await mrd.open(retry_policy=retry_policy, metadata=metadata) return mrd @@ -171,8 +179,9 @@ def __init__( client: AsyncGrpcClient, bucket_name: str, object_name: str, - generation_number: Optional[int] = None, + generation: Optional[int] = None, read_handle: Optional[_storage_v2.BidiReadHandle] = None, + **kwargs, ) -> None: """Constructor for AsyncMultiRangeDownloader, clients are not adviced to use it directly. Instead it's adviced to use the classmethod `create_mrd`. @@ -186,20 +195,27 @@ def __init__( :type object_name: str :param object_name: The name of the object to be read. - :type generation_number: int - :param generation_number: (Optional) If present, selects a specific revision of + :type generation: int + :param generation: (Optional) If present, selects a specific revision of this object. :type read_handle: _storage_v2.BidiReadHandle :param read_handle: (Optional) An existing read handle. """ + if "generation_number" in kwargs: + if generation is not None: + raise TypeError( + "Cannot set both 'generation' and 'generation_number'. " + "Use 'generation' for new code." + ) + generation = kwargs.pop("generation_number") raise_if_no_fast_crc32c() self.client = client self.bucket_name = bucket_name self.object_name = object_name - self.generation_number = generation_number + self.generation = generation self.read_handle: Optional[_storage_v2.BidiReadHandle] = read_handle self.read_obj_str: Optional[_AsyncReadObjectStream] = None self._is_stream_open: bool = False @@ -276,7 +292,7 @@ async def _do_open(): client=self.client.grpc_client, bucket_name=self.bucket_name, object_name=self.object_name, - generation_number=self.generation_number, + generation_number=self.generation, read_handle=self.read_handle, ) @@ -291,7 +307,7 @@ async def _do_open(): ) if self.read_obj_str.generation_number: - self.generation_number = self.read_obj_str.generation_number + self.generation = self.read_obj_str.generation_number if self.read_obj_str.read_handle: self.read_handle = self.read_obj_str.read_handle if self.read_obj_str.persisted_size is not None: @@ -435,7 +451,7 @@ async def generator(): client=self.client.grpc_client, bucket_name=self.bucket_name, object_name=self.object_name, - generation_number=self.generation_number, + generation_number=self.generation, read_handle=current_handle, ) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index ed59f9a4a..42164d364 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -264,7 +264,8 @@ async def _run(): event_loop.run_until_complete(_run()) -@pytest.mark.skip(reason='Flaky test b/478129078') + +@pytest.mark.skip(reason="Flaky test b/478129078") def test_mrd_open_with_read_handle(event_loop, grpc_client_direct): object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}" diff --git a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py index 1e31961b6..1055127eb 100644 --- a/tests/unit/asyncio/retry/test_reads_resumption_strategy.py +++ b/tests/unit/asyncio/retry/test_reads_resumption_strategy.py @@ -27,9 +27,7 @@ from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError _READ_ID = 1 -LOGGER_NAME = ( - "google.cloud.storage.asyncio.retry.reads_resumption_strategy" -) +LOGGER_NAME = "google.cloud.storage.asyncio.retry.reads_resumption_strategy" class TestDownloadState(unittest.TestCase): diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 8d4d6d31d..c912dc995 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -49,7 +49,7 @@ async def _make_mock_mrd( mock_cls_async_read_object_stream, bucket_name=_TEST_BUCKET_NAME, object_name=_TEST_OBJECT_NAME, - generation_number=_TEST_GENERATION_NUMBER, + generation=_TEST_GENERATION_NUMBER, read_handle=_TEST_READ_HANDLE, ): mock_client = mock.MagicMock() @@ -62,7 +62,7 @@ async def _make_mock_mrd( mock_stream.read_handle = _TEST_READ_HANDLE mrd = await AsyncMultiRangeDownloader.create_mrd( - mock_client, bucket_name, object_name, generation_number, read_handle + mock_client, bucket_name, object_name, generation, read_handle ) return mrd, mock_client @@ -89,7 +89,7 @@ async def test_create_mrd(self, mock_cls_async_read_object_stream): assert mrd.client == mock_client assert mrd.bucket_name == _TEST_BUCKET_NAME assert mrd.object_name == _TEST_OBJECT_NAME - assert mrd.generation_number == _TEST_GENERATION_NUMBER + assert mrd.generation == _TEST_GENERATION_NUMBER assert mrd.read_handle == _TEST_READ_HANDLE assert mrd.persisted_size == _TEST_OBJECT_SIZE assert mrd.is_stream_open @@ -303,9 +303,7 @@ async def test_downloading_without_opening_should_throw_error(self): assert not mrd.is_stream_open @mock.patch("google.cloud.storage.asyncio._utils.google_crc32c") - def test_init_raises_if_crc32c_c_extension_is_missing( - self, mock_google_crc32c - ): + def test_init_raises_if_crc32c_c_extension_is_missing(self, mock_google_crc32c): mock_google_crc32c.implementation = "python" mock_client = mock.MagicMock() @@ -317,9 +315,7 @@ def test_init_raises_if_crc32c_c_extension_is_missing( ) @pytest.mark.asyncio - @mock.patch( - "google.cloud.storage.asyncio.retry.reads_resumption_strategy.Checksum" - ) + @mock.patch("google.cloud.storage.asyncio.retry.reads_resumption_strategy.Checksum") async def test_download_ranges_raises_on_checksum_mismatch( self, mock_checksum_class ): @@ -405,3 +401,47 @@ async def close_side_effect(): mock_close.assert_called_once() assert not mrd.is_stream_open + + @mock.patch( + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @pytest.mark.asyncio + async def test_create_mrd_with_generation_number( + self, mock_cls_async_read_object_stream + ): + # Arrange + mock_client = mock.MagicMock() + mock_client.grpc_client = mock.AsyncMock() + + mock_stream = mock_cls_async_read_object_stream.return_value + mock_stream.open = AsyncMock() + mock_stream.generation_number = _TEST_GENERATION_NUMBER + mock_stream.persisted_size = _TEST_OBJECT_SIZE + mock_stream.read_handle = _TEST_READ_HANDLE + + # Act + mrd = await AsyncMultiRangeDownloader.create_mrd( + mock_client, + _TEST_BUCKET_NAME, + _TEST_OBJECT_NAME, + generation_number=_TEST_GENERATION_NUMBER, + read_handle=_TEST_READ_HANDLE, + ) + + # Assert + assert mrd.generation == _TEST_GENERATION_NUMBER + + @pytest.mark.asyncio + async def test_create_mrd_with_both_generation_and_generation_number(self): + # Arrange + mock_client = mock.MagicMock() + + # Act & Assert + with pytest.raises(TypeError): + await AsyncMultiRangeDownloader.create_mrd( + mock_client, + _TEST_BUCKET_NAME, + _TEST_OBJECT_NAME, + generation=_TEST_GENERATION_NUMBER, + generation_number=_TEST_GENERATION_NUMBER, + ) diff --git a/tests/unit/asyncio/test_async_read_object_stream.py b/tests/unit/asyncio/test_async_read_object_stream.py index 4e8a494b5..2d2f28edd 100644 --- a/tests/unit/asyncio/test_async_read_object_stream.py +++ b/tests/unit/asyncio/test_async_read_object_stream.py @@ -79,9 +79,7 @@ async def instantiate_read_obj_stream_with_read_handle( return read_obj_stream -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -110,9 +108,7 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): assert read_obj_stream.rpc == rpc_sentinel -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -136,9 +132,7 @@ async def test_open(mock_client, mock_cls_async_bidi_rpc): assert read_obj_stream.is_stream_open -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -162,9 +156,7 @@ async def test_open_with_read_handle(mock_client, mock_cls_async_bidi_rpc): assert read_obj_stream.is_stream_open -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -185,9 +177,7 @@ async def test_open_when_already_open_should_raise_error( assert str(exc.value) == "Stream is already open" -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -208,9 +198,7 @@ async def test_close(mock_client, mock_cls_async_bidi_rpc): assert not read_obj_stream.is_stream_open -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -232,9 +220,7 @@ async def test_requests_done(mock_client, mock_cls_async_bidi_rpc): read_obj_stream.socket_like_rpc.recv.assert_called_once() -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -255,9 +241,7 @@ async def test_close_without_open_should_raise_error( assert str(exc.value) == "Stream is not open" -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -278,9 +262,7 @@ async def test_send(mock_client, mock_cls_async_bidi_rpc): ) -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -301,9 +283,7 @@ async def test_send_without_open_should_raise_error( assert str(exc.value) == "Stream is not open" -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -326,9 +306,7 @@ async def test_recv(mock_client, mock_cls_async_bidi_rpc): assert response == bidi_read_object_response -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) @@ -349,9 +327,7 @@ async def test_recv_without_open_should_raise_error( assert str(exc.value) == "Stream is not open" -@mock.patch( - "google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc" -) +@mock.patch("google.cloud.storage.asyncio.async_read_object_stream.AsyncBidiRpc") @mock.patch( "google.cloud.storage.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" ) diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index f4a7862d6..77e2ef091 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -71,9 +71,7 @@ def test_init_raises_value_error(self, mock_client): # Open Stream Tests # ------------------------------------------------------------------------- - @mock.patch( - "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" - ) + @mock.patch("google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc") @pytest.mark.asyncio async def test_open_new_object(self, mock_rpc_cls, mock_client): mock_rpc = mock_rpc_cls.return_value @@ -101,9 +99,7 @@ async def test_open_new_object(self, mock_rpc_cls, mock_client): assert stream.write_handle == WRITE_HANDLE assert stream.generation_number == GENERATION - @mock.patch( - "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" - ) + @mock.patch("google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc") @pytest.mark.asyncio async def test_open_existing_object_with_token(self, mock_rpc_cls, mock_client): mock_rpc = mock_rpc_cls.return_value @@ -132,9 +128,7 @@ async def test_open_existing_object_with_token(self, mock_rpc_cls, mock_client): assert initial_request.append_object_spec.routing_token == "token-123" assert stream.persisted_size == 1024 - @mock.patch( - "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" - ) + @mock.patch("google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc") @pytest.mark.asyncio async def test_open_metadata_merging(self, mock_rpc_cls, mock_client): mock_rpc = mock_rpc_cls.return_value @@ -166,9 +160,7 @@ async def test_open_already_open_raises(self, mock_client): # Send & Recv & Close Tests # ------------------------------------------------------------------------- - @mock.patch( - "google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc" - ) + @mock.patch("google.cloud.storage.asyncio.async_write_object_stream.AsyncBidiRpc") @pytest.mark.asyncio async def test_send_and_recv_logic(self, mock_rpc_cls, mock_client): # Setup open stream diff --git a/tests/unit/test_grpc_client.py b/tests/unit/test_grpc_client.py index eb048ff42..6dbbfbaa6 100644 --- a/tests/unit/test_grpc_client.py +++ b/tests/unit/test_grpc_client.py @@ -31,7 +31,6 @@ class TestGrpcClient(unittest.TestCase): def test_constructor_defaults_and_options( self, mock_storage_client, mock_base_client ): - mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials(spec=["_base", "_get_project_id"]) @@ -76,7 +75,6 @@ def test_constructor_defaults_and_options( def test_constructor_disables_direct_path( self, mock_storage_client, mock_base_client ): - mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials() @@ -98,7 +96,6 @@ def test_constructor_disables_direct_path( def test_constructor_initialize_with_api_key( self, mock_storage_client, mock_base_client ): - mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls mock_creds = _make_credentials() @@ -125,7 +122,6 @@ def test_constructor_initialize_with_api_key( @mock.patch("google.cloud.storage.grpc_client.ClientWithProject") @mock.patch("google.cloud._storage_v2.StorageClient") def test_grpc_client_property(self, mock_storage_client, mock_base_client): - mock_creds = _make_credentials() mock_base_client.return_value._credentials = mock_creds @@ -140,7 +136,6 @@ def test_grpc_client_property(self, mock_storage_client, mock_base_client): def test_constructor_with_api_key_and_client_options( self, mock_storage_client, mock_base_client ): - mock_transport_cls = mock.MagicMock() mock_storage_client.get_transport_class.return_value = mock_transport_cls mock_transport = mock_transport_cls.return_value @@ -174,7 +169,6 @@ def test_constructor_with_api_key_and_client_options( def test_constructor_with_api_key_and_dict_options( self, mock_storage_client, mock_base_client ): - mock_creds = _make_credentials() mock_base_instance = mock_base_client.return_value mock_base_instance._credentials = mock_creds From c8dd7a0b124c395b7b60189ee78f47aba8d51f7d Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 30 Jan 2026 12:09:13 +0530 Subject: [PATCH 478/509] feat: expose `DELETE_OBJECT` in `AsyncGrpcClient` (#1718) Expose `DELETE_OBJECT` in `AsyncGrpcClient` --- .../storage/asyncio/async_grpc_client.py | 52 +++++++++++++++++++ tests/system/test_zonal.py | 33 +++++++++++- tests/unit/asyncio/test_async_grpc_client.py | 45 ++++++++++++++++ 3 files changed, 129 insertions(+), 1 deletion(-) diff --git a/google/cloud/storage/asyncio/async_grpc_client.py b/google/cloud/storage/asyncio/async_grpc_client.py index 474b961b4..3ff846b5f 100644 --- a/google/cloud/storage/asyncio/async_grpc_client.py +++ b/google/cloud/storage/asyncio/async_grpc_client.py @@ -106,3 +106,55 @@ def grpc_client(self): google.cloud._storage_v2.StorageAsyncClient: The configured GAPIC client. """ return self._grpc_client + + async def delete_object( + self, + bucket_name, + object_name, + generation=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + **kwargs, + ): + """Deletes an object and its metadata. + + :type bucket_name: str + :param bucket_name: The name of the bucket in which the object resides. + + :type object_name: str + :param object_name: The name of the object to delete. + + :type generation: int + :param generation: + (Optional) If present, permanently deletes a specific generation + of an object. + + :type if_generation_match: int + :param if_generation_match: (Optional) + + :type if_generation_not_match: int + :param if_generation_not_match: (Optional) + + :type if_metageneration_match: int + :param if_metageneration_match: (Optional) + + :type if_metageneration_not_match: int + :param if_metageneration_not_match: (Optional) + + + """ + # The gRPC API requires the bucket name to be in the format "projects/_/buckets/bucket_name" + bucket_path = f"projects/_/buckets/{bucket_name}" + request = storage_v2.DeleteObjectRequest( + bucket=bucket_path, + object=object_name, + generation=generation, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + **kwargs, + ) + await self._grpc_client.delete_object(request=request) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 42164d364..9bd870860 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -19,7 +19,7 @@ from google.cloud.storage.asyncio.async_multi_range_downloader import ( AsyncMultiRangeDownloader, ) -from google.api_core.exceptions import FailedPrecondition +from google.api_core.exceptions import FailedPrecondition, NotFound pytestmark = pytest.mark.skipif( @@ -570,3 +570,34 @@ async def _run(): blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) event_loop.run_until_complete(_run()) + + +def test_delete_object_using_grpc_client(event_loop, grpc_client_direct): + """ + Test that a new writer when specifies `None` overrides the existing object. + """ + object_name = f"test_append_with_generation-{uuid.uuid4()}" + + async def _run(): + writer = AsyncAppendableObjectWriter( + grpc_client_direct, _ZONAL_BUCKET, object_name, generation=0 + ) + + # Empty object is created. + await writer.open() + await writer.append(b"some_bytes") + await writer.close() + + await grpc_client_direct.delete_object(_ZONAL_BUCKET, object_name) + + # trying to get raises raises 404. + with pytest.raises(NotFound): + # TODO: Remove this once GET_OBJECT is exposed in `AsyncGrpcClient` + await grpc_client_direct._grpc_client.get_object( + bucket=f"projects/_/buckets/{_ZONAL_BUCKET}", object_=object_name + ) + # cleanup + del writer + gc.collect() + + event_loop.run_until_complete(_run()) diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index 3d897d336..e7d649e72 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -13,6 +13,7 @@ # limitations under the License. from unittest import mock +import pytest from google.auth import credentials as auth_credentials from google.auth.credentials import AnonymousCredentials from google.api_core import client_info as client_info_lib @@ -185,6 +186,7 @@ def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): credentials=anonymous_creds, options=expected_options, ) + mock_transport_cls.assert_called_once_with(channel=channel_sentinel) @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_user_agent_with_custom_client_info(self, mock_async_storage_client): @@ -209,3 +211,46 @@ def test_user_agent_with_custom_client_info(self, mock_async_storage_client): agent_version = f"gcloud-python/{__version__}" expected_user_agent = f"custom-app/1.0 {agent_version} " assert client_info.user_agent == expected_user_agent + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + @pytest.mark.asyncio + async def test_delete_object(self, mock_async_storage_client): + # Arrange + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_gapic_client = mock.AsyncMock() + mock_async_storage_client.return_value = mock_gapic_client + + client = async_grpc_client.AsyncGrpcClient( + credentials=_make_credentials(spec=AnonymousCredentials) + ) + + bucket_name = "bucket" + object_name = "object" + generation = 123 + if_generation_match = 456 + if_generation_not_match = 789 + if_metageneration_match = 111 + if_metageneration_not_match = 222 + + # Act + await client.delete_object( + bucket_name, + object_name, + generation=generation, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + ) + + # Assert + call_args, call_kwargs = mock_gapic_client.delete_object.call_args + request = call_kwargs["request"] + assert request.bucket == "projects/_/buckets/bucket" + assert request.object == "object" + assert request.generation == generation + assert request.if_generation_match == if_generation_match + assert request.if_generation_not_match == if_generation_not_match + assert request.if_metageneration_match == if_metageneration_match + assert request.if_metageneration_not_match == if_metageneration_not_match From 2ef63396dca1c36f9b0f0f3cf87a61b5aa4bd465 Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:38:37 +0530 Subject: [PATCH 479/509] fix: receive eof while closing reads stream (#1733) When `writer.close()` is called without setting finalize_on_close flag, we need to get two responses: 1) to get the persisted_size 2) eof response That's why added a check if the first response is not eof, then again receive the response from the stream. --- .../asyncio/async_write_object_stream.py | 13 ++++- .../asyncio/test_async_write_object_stream.py | 48 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/asyncio/async_write_object_stream.py b/google/cloud/storage/asyncio/async_write_object_stream.py index 721183962..319f394dd 100644 --- a/google/cloud/storage/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/asyncio/async_write_object_stream.py @@ -13,6 +13,7 @@ # limitations under the License. from typing import List, Optional, Tuple +import grpc from google.cloud import _storage_v2 from google.cloud.storage.asyncio import _utils from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient @@ -181,9 +182,17 @@ async def close(self) -> None: async def requests_done(self): """Signals that all requests have been sent.""" - await self.socket_like_rpc.send(None) - _utils.update_write_handle_if_exists(self, await self.socket_like_rpc.recv()) + + # The server may send a final "EOF" response immediately, or it may + # first send an intermediate response followed by the EOF response depending on whether the object was finalized or not. + first_resp = await self.socket_like_rpc.recv() + _utils.update_write_handle_if_exists(self, first_resp) + + if first_resp != grpc.aio.EOF: + self.persisted_size = first_resp.persisted_size + second_resp = await self.socket_like_rpc.recv() + assert second_resp == grpc.aio.EOF async def send( self, bidi_write_object_request: _storage_v2.BidiWriteObjectRequest diff --git a/tests/unit/asyncio/test_async_write_object_stream.py b/tests/unit/asyncio/test_async_write_object_stream.py index 77e2ef091..4e952336b 100644 --- a/tests/unit/asyncio/test_async_write_object_stream.py +++ b/tests/unit/asyncio/test_async_write_object_stream.py @@ -15,6 +15,8 @@ import unittest.mock as mock from unittest.mock import AsyncMock, MagicMock import pytest +import grpc + from google.cloud.storage.asyncio.async_write_object_stream import ( _AsyncWriteObjectStream, @@ -194,11 +196,57 @@ async def test_close_success(self, mock_client): stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) stream._is_stream_open = True stream.socket_like_rpc = AsyncMock() + + stream.socket_like_rpc.send = AsyncMock() + first_resp = _storage_v2.BidiWriteObjectResponse(persisted_size=100) + stream.socket_like_rpc.recv = AsyncMock(side_effect=[first_resp, grpc.aio.EOF]) stream.socket_like_rpc.close = AsyncMock() await stream.close() stream.socket_like_rpc.close.assert_awaited_once() assert not stream.is_stream_open + assert stream.persisted_size == 100 + + @pytest.mark.asyncio + async def test_close_with_persisted_size_then_eof(self, mock_client): + """Test close when first recv has persisted_size, second is EOF.""" + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + stream._is_stream_open = True + stream.socket_like_rpc = AsyncMock() + + # First response has persisted_size (NOT EOF, intermediate) + persisted_resp = _storage_v2.BidiWriteObjectResponse(persisted_size=500) + # Second response is EOF (None) + eof_resp = grpc.aio.EOF + + stream.socket_like_rpc.send = AsyncMock() + stream.socket_like_rpc.recv = AsyncMock(side_effect=[persisted_resp, eof_resp]) + stream.socket_like_rpc.close = AsyncMock() + + await stream.close() + + # Verify two recv calls: first has persisted_size (NOT EOF), so read second (EOF) + assert stream.socket_like_rpc.recv.await_count == 2 + assert stream.persisted_size == 500 + assert not stream.is_stream_open + + @pytest.mark.asyncio + async def test_close_with_grpc_aio_eof_response(self, mock_client): + """Test close when first recv is grpc.aio.EOF sentinel.""" + stream = _AsyncWriteObjectStream(mock_client, BUCKET, OBJECT) + stream._is_stream_open = True + stream.socket_like_rpc = AsyncMock() + + # First recv returns grpc.aio.EOF (explicit sentinel from finalize) + stream.socket_like_rpc.send = AsyncMock() + stream.socket_like_rpc.recv = AsyncMock(return_value=grpc.aio.EOF) + stream.socket_like_rpc.close = AsyncMock() + + await stream.close() + + # Verify only one recv call (grpc.aio.EOF=EOF, so don't read second) + assert stream.socket_like_rpc.recv.await_count == 1 + assert not stream.is_stream_open @pytest.mark.asyncio async def test_methods_require_open_raises(self, mock_client): From 7a00dfb73696d6db98747509e9f2f2bd0c94c53a Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 2 Feb 2026 14:40:44 +0530 Subject: [PATCH 480/509] chore: Add README for running zonal buckets samples (#1734) chore: Add README for running zonal buckets samples --- samples/README.md | 9 ++- samples/snippets/zonal_buckets/README.md | 78 ++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 samples/snippets/zonal_buckets/README.md diff --git a/samples/README.md b/samples/README.md index 490af710a..118a778cb 100644 --- a/samples/README.md +++ b/samples/README.md @@ -34,8 +34,15 @@ for more detailed instructions. ``` source /bin/activate ``` +3. To run samples for [Zonal Buckets](https://github.com/googleapis/python-storage/tree/main/samples/snippets/zonal_buckets) -3. Install the dependencies needed to run the samples. + ``` + pip install "google-cloud-storage[grpc]" + python samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py --bucket_name --object_name + + ``` + +4. Install the dependencies needed to run the samples. ``` cd samples/snippets pip install -r requirements.txt diff --git a/samples/snippets/zonal_buckets/README.md b/samples/snippets/zonal_buckets/README.md new file mode 100644 index 000000000..71c17e5c3 --- /dev/null +++ b/samples/snippets/zonal_buckets/README.md @@ -0,0 +1,78 @@ +# Google Cloud Storage - Zonal Buckets Snippets + +This directory contains snippets for interacting with Google Cloud Storage zonal buckets. + +## Prerequisites + +- A Google Cloud Platform project with the Cloud Storage API enabled. +- A zonal Google Cloud Storage bucket. + +## Running the snippets + +### Create and write to an appendable object + +This snippet uploads an appendable object to a zonal bucket. + +```bash +python samples/snippets/zonal_buckets/storage_create_and_write_appendable_object.py --bucket_name --object_name +``` + +### Finalize an appendable object upload + +This snippet creates, writes to, and finalizes an appendable object. + +```bash +python samples/snippets/zonal_buckets/storage_finalize_appendable_object_upload.py --bucket_name --object_name +``` + +### Pause and resume an appendable object upload + +This snippet demonstrates pausing and resuming an appendable object upload. + +```bash +python samples/snippets/zonal_buckets/storage_pause_and_resume_appendable_upload.py --bucket_name --object_name +``` + +### Tail an appendable object + +This snippet demonstrates tailing an appendable GCS object, similar to `tail -f`. + +```bash +python samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py --bucket_name --object_name --duration +``` + + +### Download a range of bytes from an object + +This snippet downloads a range of bytes from an object. + +```bash +python samples/snippets/zonal_buckets/storage_open_object_single_ranged_read.py --bucket_name --object_name --start_byte --size +``` + + +### Download multiple ranges of bytes from a single object + +This snippet downloads multiple ranges of bytes from a single object into different buffers. + +```bash +python samples/snippets/zonal_buckets/storage_open_object_multiple_ranged_read.py --bucket_name --object_name +``` + +### Download the entire content of an object + +This snippet downloads the entire content of an object using a multi-range downloader. + +```bash +python samples/snippets/zonal_buckets/storage_open_object_read_full_object.py --bucket_name --object_name +``` + + + +### Download a range of bytes from multiple objects concurrently + +This snippet downloads a range of bytes from multiple objects concurrently. + +```bash +python samples/snippets/zonal_buckets/storage_open_multiple_objects_ranged_read.py --bucket_name --object_names +``` \ No newline at end of file From 0e5ec29bc6a31b77bcfba4254cef5bffb199095c Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Mon, 2 Feb 2026 18:07:16 +0530 Subject: [PATCH 481/509] feat: add get_object method for async grpc client (#1735) This method can be used to fetch the metadata of an object using the async grpc API. --- .../storage/asyncio/async_grpc_client.py | 63 ++++++++++++++++ tests/system/test_zonal.py | 53 +++++++++++++ tests/unit/asyncio/test_async_grpc_client.py | 75 +++++++++++++++++++ 3 files changed, 191 insertions(+) diff --git a/google/cloud/storage/asyncio/async_grpc_client.py b/google/cloud/storage/asyncio/async_grpc_client.py index 3ff846b5f..640e7fe38 100644 --- a/google/cloud/storage/asyncio/async_grpc_client.py +++ b/google/cloud/storage/asyncio/async_grpc_client.py @@ -158,3 +158,66 @@ async def delete_object( **kwargs, ) await self._grpc_client.delete_object(request=request) + + async def get_object( + self, + bucket_name, + object_name, + generation=None, + if_generation_match=None, + if_generation_not_match=None, + if_metageneration_match=None, + if_metageneration_not_match=None, + soft_deleted=None, + **kwargs, + ): + """Retrieves an object's metadata. + + In the gRPC API, this is performed by the GetObject RPC, which + returns the object resource (metadata) without the object's data. + + :type bucket_name: str + :param bucket_name: The name of the bucket in which the object resides. + + :type object_name: str + :param object_name: The name of the object. + + :type generation: int + :param generation: + (Optional) If present, selects a specific generation of an object. + + :type if_generation_match: int + :param if_generation_match: (Optional) Precondition for object generation match. + + :type if_generation_not_match: int + :param if_generation_not_match: (Optional) Precondition for object generation mismatch. + + :type if_metageneration_match: int + :param if_metageneration_match: (Optional) Precondition for metageneration match. + + :type if_metageneration_not_match: int + :param if_metageneration_not_match: (Optional) Precondition for metageneration mismatch. + + :type soft_deleted: bool + :param soft_deleted: + (Optional) If True, return the soft-deleted version of this object. + + :rtype: :class:`google.cloud._storage_v2.types.Object` + :returns: The object metadata resource. + """ + bucket_path = f"projects/_/buckets/{bucket_name}" + + request = storage_v2.GetObjectRequest( + bucket=bucket_path, + object=object_name, + generation=generation, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + soft_deleted=soft_deleted or False, + **kwargs, + ) + + # Calls the underlying GAPIC StorageAsyncClient.get_object method + return await self._grpc_client.get_object(request=request) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 9bd870860..fd5d841c3 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -601,3 +601,56 @@ async def _run(): gc.collect() event_loop.run_until_complete(_run()) + +def test_get_object_after_appendable_write( + grpc_clients, + grpc_client_direct, + event_loop, + storage_client, + blobs_to_delete, +): + """Test getting object metadata after writing with AsyncAppendableObjectWriter. + + This test: + 1. Creates a test object using AsyncAppendableObjectWriter + 2. Appends content to the object (without finalizing) + 3. Closes the write stream + 4. Fetches the object metadata using AsyncGrpcClient.get_object() + 5. Verifies the object size matches the written data + """ + + async def _run(): + grpc_client = grpc_client_direct + object_name = f"test-get-object-{uuid.uuid4().hex}" + test_data = b"Some test data bytes." + expected_size = len(test_data) + + writer = AsyncAppendableObjectWriter( + grpc_client, + _ZONAL_BUCKET, + object_name, + ) + + await writer.open() + await writer.append(test_data) + await writer.close(finalize_on_close=False) + + obj = await grpc_client.get_object( + bucket_name=_ZONAL_BUCKET, + object_name=object_name, + ) + + # Assert + assert obj is not None + assert obj.name == object_name + assert obj.bucket == f"projects/_/buckets/{_ZONAL_BUCKET}" + assert obj.size == expected_size, ( + f"Expected object size {expected_size}, got {obj.size}" + ) + + # Cleanup + blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) + del writer + gc.collect() + + event_loop.run_until_complete(_run()) diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index e7d649e72..f193acb60 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -254,3 +254,78 @@ async def test_delete_object(self, mock_async_storage_client): assert request.if_generation_not_match == if_generation_not_match assert request.if_metageneration_match == if_metageneration_match assert request.if_metageneration_not_match == if_metageneration_not_match + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + @pytest.mark.asyncio + async def test_get_object(self, mock_async_storage_client): + # Arrange + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_gapic_client = mock.AsyncMock() + mock_async_storage_client.return_value = mock_gapic_client + + client = async_grpc_client.AsyncGrpcClient( + credentials=_make_credentials(spec=AnonymousCredentials) + ) + + bucket_name = "bucket" + object_name = "object" + + # Act + await client.get_object( + bucket_name, + object_name, + ) + + # Assert + call_args, call_kwargs = mock_gapic_client.get_object.call_args + request = call_kwargs["request"] + assert request.bucket == "projects/_/buckets/bucket" + assert request.object == "object" + assert request.soft_deleted is False + + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") + @pytest.mark.asyncio + async def test_get_object_with_all_parameters(self, mock_async_storage_client): + # Arrange + mock_transport_cls = mock.MagicMock() + mock_async_storage_client.get_transport_class.return_value = mock_transport_cls + mock_gapic_client = mock.AsyncMock() + mock_async_storage_client.return_value = mock_gapic_client + + client = async_grpc_client.AsyncGrpcClient( + credentials=_make_credentials(spec=AnonymousCredentials) + ) + + bucket_name = "bucket" + object_name = "object" + generation = 123 + if_generation_match = 456 + if_generation_not_match = 789 + if_metageneration_match = 111 + if_metageneration_not_match = 222 + soft_deleted = True + + # Act + await client.get_object( + bucket_name, + object_name, + generation=generation, + if_generation_match=if_generation_match, + if_generation_not_match=if_generation_not_match, + if_metageneration_match=if_metageneration_match, + if_metageneration_not_match=if_metageneration_not_match, + soft_deleted=soft_deleted, + ) + + # Assert + call_args, call_kwargs = mock_gapic_client.get_object.call_args + request = call_kwargs["request"] + assert request.bucket == "projects/_/buckets/bucket" + assert request.object == "object" + assert request.generation == generation + assert request.if_generation_match == if_generation_match + assert request.if_generation_not_match == if_generation_not_match + assert request.if_metageneration_match == if_metageneration_match + assert request.if_metageneration_not_match == if_metageneration_not_match + assert request.soft_deleted is True From 77c1edaa6de4058e545ad1b68bde5507b75b8e37 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 2 Feb 2026 18:46:22 +0530 Subject: [PATCH 482/509] chore: librarian release pull request: 20260202T123858Z (#1736) PR created by the Librarian CLI to initialize a release. Merging this PR will auto trigger a release. Librarian Version: v1.0.2-0.20251119154421-36c3e21ad3ac Language Image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91
    google-cloud-storage: 3.9.0 ## [3.9.0](https://github.com/googleapis/python-storage/compare/v3.8.0...v3.9.0) (2026-02-02) ### Features * update generation for MRD (#1730) ([08bc7082](https://github.com/googleapis/python-storage/commit/08bc7082)) * add get_object method for async grpc client (#1735) ([0e5ec29b](https://github.com/googleapis/python-storage/commit/0e5ec29b)) * Add micro-benchmarks for reads comparing standard (regional) vs rapid (zonal) buckets. (#1697) ([1917649f](https://github.com/googleapis/python-storage/commit/1917649f)) * Add support for opening via `write_handle` and fix `write_handle` type (#1715) ([2bc15fa5](https://github.com/googleapis/python-storage/commit/2bc15fa5)) * add samples for appendable objects writes and reads ([2e1a1eb5](https://github.com/googleapis/python-storage/commit/2e1a1eb5)) * add samples for appendable objects writes and reads (#1705) ([2e1a1eb5](https://github.com/googleapis/python-storage/commit/2e1a1eb5)) * add context manager to mrd (#1724) ([5ac2808a](https://github.com/googleapis/python-storage/commit/5ac2808a)) * Move Zonal Buckets features of `_experimental` (#1728) ([74c9ecc5](https://github.com/googleapis/python-storage/commit/74c9ecc5)) * add default user agent for grpc (#1726) ([7b319469](https://github.com/googleapis/python-storage/commit/7b319469)) * expose finalized_time in blob.py applicable for GET_OBJECT in ZB (#1719) ([8e21a7fe](https://github.com/googleapis/python-storage/commit/8e21a7fe)) * expose `DELETE_OBJECT` in `AsyncGrpcClient` (#1718) ([c8dd7a0b](https://github.com/googleapis/python-storage/commit/c8dd7a0b)) * send `user_agent` to grpc channel (#1712) ([cdb2486b](https://github.com/googleapis/python-storage/commit/cdb2486b)) * integrate writes strategy and appendable object writer (#1695) ([dbd162b3](https://github.com/googleapis/python-storage/commit/dbd162b3)) * Add micro-benchmarks for writes comparing standard (regional) vs rapid (zonal) buckets. (#1707) ([dbe9d8b8](https://github.com/googleapis/python-storage/commit/dbe9d8b8)) * add support for `generation=0` to avoid overwriting existing objects and add `is_stream_open` support (#1709) ([ea0f5bf8](https://github.com/googleapis/python-storage/commit/ea0f5bf8)) * add support for `generation=0` to prevent overwriting existing objects ([ea0f5bf8](https://github.com/googleapis/python-storage/commit/ea0f5bf8)) * add `is_stream_open` property to AsyncAppendableObjectWriter for stream status check ([ea0f5bf8](https://github.com/googleapis/python-storage/commit/ea0f5bf8)) ### Bug Fixes * receive eof while closing reads stream (#1733) ([2ef63396](https://github.com/googleapis/python-storage/commit/2ef63396)) * update write handle on every recv() (#1716) ([5d9fafe1](https://github.com/googleapis/python-storage/commit/5d9fafe1)) * implement requests_done method to signal end of requests in async streams. Gracefully close streams. (#1700) ([6c160794](https://github.com/googleapis/python-storage/commit/6c160794)) * implement requests_done method to signal end of requests in async streams. Gracefully close streams. ([6c160794](https://github.com/googleapis/python-storage/commit/6c160794)) * instance grpc client once per process in benchmarks (#1725) ([721ea2dd](https://github.com/googleapis/python-storage/commit/721ea2dd)) * Fix formatting in setup.py dependencies list (#1713) ([cc4831d7](https://github.com/googleapis/python-storage/commit/cc4831d7)) * Change contructors of MRD and AAOW AsyncGrpcClient.grpc_client to AsyncGrpcClient (#1727) ([e730bf50](https://github.com/googleapis/python-storage/commit/e730bf50))
    --- .librarian/state.yaml | 2 +- CHANGELOG.md | 34 +++++++++++++++++++ google/cloud/_storage_v2/gapic_version.py | 2 +- google/cloud/storage/version.py | 2 +- .../snippet_metadata_google.storage.v2.json | 2 +- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index e20e4bc40..80e2355be 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -1,7 +1,7 @@ image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 libraries: - id: google-cloud-storage - version: 3.8.0 + version: 3.9.0 last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab apis: - path: google/storage/v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index e371dd766..4c46db115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,40 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.9.0](https://github.com/googleapis/python-storage/compare/v3.8.0...v3.9.0) (2026-02-02) + + +### Features + +* add get_object method for async grpc client (#1735) ([0e5ec29bc6a31b77bcfba4254cef5bffb199095c](https://github.com/googleapis/python-storage/commit/0e5ec29bc6a31b77bcfba4254cef5bffb199095c)) +* expose `DELETE_OBJECT` in `AsyncGrpcClient` (#1718) ([c8dd7a0b124c395b7b60189ee78f47aba8d51f7d](https://github.com/googleapis/python-storage/commit/c8dd7a0b124c395b7b60189ee78f47aba8d51f7d)) +* update generation for MRD (#1730) ([08bc7082db7392f13bc8c51511b4afa9c7b157c9](https://github.com/googleapis/python-storage/commit/08bc7082db7392f13bc8c51511b4afa9c7b157c9)) +* Move Zonal Buckets features of `_experimental` (#1728) ([74c9ecc54173420bfcd48498a8956088a035af50](https://github.com/googleapis/python-storage/commit/74c9ecc54173420bfcd48498a8956088a035af50)) +* add default user agent for grpc (#1726) ([7b319469d2e495ea0bf7367f3949190e8f5d9fff](https://github.com/googleapis/python-storage/commit/7b319469d2e495ea0bf7367f3949190e8f5d9fff)) +* expose finalized_time in blob.py applicable for GET_OBJECT in ZB (#1719) ([8e21a7fe54d0a043f31937671003630a1985a5d2](https://github.com/googleapis/python-storage/commit/8e21a7fe54d0a043f31937671003630a1985a5d2)) +* add context manager to mrd (#1724) ([5ac2808a69195c688ed42c3604d4bfadbb602a66](https://github.com/googleapis/python-storage/commit/5ac2808a69195c688ed42c3604d4bfadbb602a66)) +* integrate writes strategy and appendable object writer (#1695) ([dbd162b3583e32e6f705a51f5c3fef333a9b89d0](https://github.com/googleapis/python-storage/commit/dbd162b3583e32e6f705a51f5c3fef333a9b89d0)) +* Add support for opening via `write_handle` and fix `write_handle` type (#1715) ([2bc15fa570683ba584230c51b439d189dbdcd580](https://github.com/googleapis/python-storage/commit/2bc15fa570683ba584230c51b439d189dbdcd580)) +* Add micro-benchmarks for writes comparing standard (regional) vs rapid (zonal) buckets. (#1707) ([dbe9d8b89d975dfbed8c830a5687ccfafea51d5f](https://github.com/googleapis/python-storage/commit/dbe9d8b89d975dfbed8c830a5687ccfafea51d5f)) +* Add micro-benchmarks for reads comparing standard (regional) vs rapid (zonal) buckets. (#1697) ([1917649fac41481da1adea6c2a9f4ab1298a34c4](https://github.com/googleapis/python-storage/commit/1917649fac41481da1adea6c2a9f4ab1298a34c4)) +* send `user_agent` to grpc channel (#1712) ([cdb2486bb051dcbfbffc2510aff6aacede5e54d3](https://github.com/googleapis/python-storage/commit/cdb2486bb051dcbfbffc2510aff6aacede5e54d3)) +* add samples for appendable objects writes and reads (#1705) ([2e1a1eb5cbe1c909f1f892a0cc74fe63c8ef36ff](https://github.com/googleapis/python-storage/commit/2e1a1eb5cbe1c909f1f892a0cc74fe63c8ef36ff)) +* add samples for appendable objects writes and reads ([2e1a1eb5cbe1c909f1f892a0cc74fe63c8ef36ff](https://github.com/googleapis/python-storage/commit/2e1a1eb5cbe1c909f1f892a0cc74fe63c8ef36ff)) +* add support for `generation=0` to avoid overwriting existing objects and add `is_stream_open` support (#1709) ([ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae](https://github.com/googleapis/python-storage/commit/ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae)) +* add support for `generation=0` to prevent overwriting existing objects ([ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae](https://github.com/googleapis/python-storage/commit/ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae)) +* add `is_stream_open` property to AsyncAppendableObjectWriter for stream status check ([ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae](https://github.com/googleapis/python-storage/commit/ea0f5bf8316f4bfcff2728d9d1baa68dde6ebdae)) + + +### Bug Fixes + +* receive eof while closing reads stream (#1733) ([2ef63396dca1c36f9b0f0f3cf87a61b5aa4bd465](https://github.com/googleapis/python-storage/commit/2ef63396dca1c36f9b0f0f3cf87a61b5aa4bd465)) +* Change contructors of MRD and AAOW AsyncGrpcClient.grpc_client to AsyncGrpcClient (#1727) ([e730bf50c4584f737ab86b2e409ddb27b40d2cec](https://github.com/googleapis/python-storage/commit/e730bf50c4584f737ab86b2e409ddb27b40d2cec)) +* instance grpc client once per process in benchmarks (#1725) ([721ea2dd6c6db2aa91fd3b90e56a831aaaa64061](https://github.com/googleapis/python-storage/commit/721ea2dd6c6db2aa91fd3b90e56a831aaaa64061)) +* update write handle on every recv() (#1716) ([5d9fafe1466b5ccb1db4a814967a5cc8465148a2](https://github.com/googleapis/python-storage/commit/5d9fafe1466b5ccb1db4a814967a5cc8465148a2)) +* Fix formatting in setup.py dependencies list (#1713) ([cc4831d7e253b265b0b96e08b5479f4c759be442](https://github.com/googleapis/python-storage/commit/cc4831d7e253b265b0b96e08b5479f4c759be442)) +* implement requests_done method to signal end of requests in async streams. Gracefully close streams. (#1700) ([6c160794afded5e8f4179399f1fe5248e32bf707](https://github.com/googleapis/python-storage/commit/6c160794afded5e8f4179399f1fe5248e32bf707)) +* implement requests_done method to signal end of requests in async streams. Gracefully close streams. ([6c160794afded5e8f4179399f1fe5248e32bf707](https://github.com/googleapis/python-storage/commit/6c160794afded5e8f4179399f1fe5248e32bf707)) + ## [3.8.0](https://github.com/googleapis/python-storage/compare/v3.7.0...v3.8.0) (2026-01-13) diff --git a/google/cloud/_storage_v2/gapic_version.py b/google/cloud/_storage_v2/gapic_version.py index 4a7c666d6..0d5599e8b 100644 --- a/google/cloud/_storage_v2/gapic_version.py +++ b/google/cloud/_storage_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.8.0" # {x-release-please-version} +__version__ = "3.9.0" # {x-release-please-version} diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 8f4ba4810..0bc275357 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.8.0" +__version__ = "3.9.0" diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json index 7fcd587f3..1889f0c5d 100644 --- a/samples/generated_samples/snippet_metadata_google.storage.v2.json +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage", - "version": "3.8.0" + "version": "3.9.0" }, "snippets": [ { From 2231120ee15118d644aa508fbce48a5d27cae375 Mon Sep 17 00:00:00 2001 From: gurusai-voleti Date: Wed, 4 Feb 2026 13:50:18 +0530 Subject: [PATCH 483/509] chore: Migrate gsutil usage to gcloud storage (#1732) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated: Migrate {target_path} from gsutil to gcloud storage This CL is part of the on going effort to migrate from the legacy `gsutil` tool to the new and improved `gcloud storage` command-line interface. `gcloud storage` is the recommended and modern tool for interacting with Google Cloud Storage, offering better performance, unified authentication, and a more consistent command structure with other `gcloud` components. 🚀 ### Automation Details This change was **generated automatically** by an agent that targets users of `gsutil`. The transformations applied are based on the [gsutil to gcloud storage migration guide](http://go/gsutil-gcloud-storage-migration-guide). ### ⚠️ Action Required: Please Review and Test Carefully While we have based the automation on the migration guide, every use case is unique. **It is crucial that you thoroughly test these changes in environments appropriate to your use-case before merging.** Be aware of potential differences between `gsutil` and `gcloud storage` that could impact your workflows. For instance, the structure of command output may have changed, requiring updates to any scripts that parse it. Similarly, command behavior can differ subtly; the `gcloud storage rsync` command has a different file deletion logic than `gsutil rsync`, which could lead to unintended file deletions. Our migration guides can help guide you through a list of mappings and some notable differences between the two tools. Standard presubmit tests are run as part of this CL's workflow. **If you need to target an additional test workflow or require assistance with testing, please let us know.** Please verify that all your Cloud Storage operations continue to work as expected to avoid any potential disruptions in production. ### Support and Collaboration The `GCS CLI` team is here to help! If you encounter any issues, have a complex use case that this automated change doesn't cover, or face any other blockers, please don't hesitate to reach out. We are happy to work with you to test and adjust these changes as needed. **Contact:** `gcs-cli-hyd@google.com` We appreciate your partnership in this important migration effort! #gsutil-migration Co-authored-by: Chandra Shekhar Sirimala --- .kokoro/trampoline_v2.sh | 4 ++-- samples/snippets/notification_polling.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.kokoro/trampoline_v2.sh b/.kokoro/trampoline_v2.sh index 35fa52923..d03f92dfc 100755 --- a/.kokoro/trampoline_v2.sh +++ b/.kokoro/trampoline_v2.sh @@ -26,8 +26,8 @@ # To run this script, first download few files from gcs to /dev/shm. # (/dev/shm is passed into the container as KOKORO_GFILE_DIR). # -# gsutil cp gs://cloud-devrel-kokoro-resources/python-docs-samples/secrets_viewer_service_account.json /dev/shm -# gsutil cp gs://cloud-devrel-kokoro-resources/python-docs-samples/automl_secrets.txt /dev/shm +# gcloud storage cp gs://cloud-devrel-kokoro-resources/python-docs-samples/secrets_viewer_service_account.json /dev/shm +# gcloud storage cp gs://cloud-devrel-kokoro-resources/python-docs-samples/automl_secrets.txt /dev/shm # # Then run the script. # .kokoro/trampoline_v2.sh diff --git a/samples/snippets/notification_polling.py b/samples/snippets/notification_polling.py index 2ee6789c3..1359c9cfa 100644 --- a/samples/snippets/notification_polling.py +++ b/samples/snippets/notification_polling.py @@ -32,10 +32,10 @@ https://console.cloud.google.com/flows/enableapi?apiid=pubsub 3. Create a Google Cloud Storage bucket: - $ gsutil mb gs://testbucket + $ gcloud storage buckets create gs://testbucket 4. Create a Cloud Pub/Sub topic and publish bucket notifications there: - $ gsutil notification create -f json -t testtopic gs://testbucket + $ gcloud storage buckets notifications create gs://testbucket --topic=testtopic --payload-format=json 5. Create a subscription for your new topic: $ gcloud pubsub subscriptions create testsubscription --topic=testtopic From d9b192342d7883b31b781c0e8a23b4f90df73c0e Mon Sep 17 00:00:00 2001 From: Pulkit Aggarwal <54775856+Pulkit0110@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:41:27 +0530 Subject: [PATCH 484/509] chore: add depreciation warning for generation_number (#1740) Add a warning that generation_number will be deprecated in the next major release. --- .../asyncio/async_multi_range_downloader.py | 4 ++ tests/system/test_zonal.py | 53 ------------------- .../test_async_multi_range_downloader.py | 3 +- 3 files changed, 6 insertions(+), 54 deletions(-) diff --git a/google/cloud/storage/asyncio/async_multi_range_downloader.py b/google/cloud/storage/asyncio/async_multi_range_downloader.py index 8ad4d319f..3ee773a04 100644 --- a/google/cloud/storage/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/asyncio/async_multi_range_downloader.py @@ -208,6 +208,10 @@ def __init__( "Cannot set both 'generation' and 'generation_number'. " "Use 'generation' for new code." ) + logger.warning( + "'generation_number' is deprecated and will be removed in a future " + "major release. Please use 'generation' instead." + ) generation = kwargs.pop("generation_number") raise_if_no_fast_crc32c() diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index fd5d841c3..9bd870860 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -601,56 +601,3 @@ async def _run(): gc.collect() event_loop.run_until_complete(_run()) - -def test_get_object_after_appendable_write( - grpc_clients, - grpc_client_direct, - event_loop, - storage_client, - blobs_to_delete, -): - """Test getting object metadata after writing with AsyncAppendableObjectWriter. - - This test: - 1. Creates a test object using AsyncAppendableObjectWriter - 2. Appends content to the object (without finalizing) - 3. Closes the write stream - 4. Fetches the object metadata using AsyncGrpcClient.get_object() - 5. Verifies the object size matches the written data - """ - - async def _run(): - grpc_client = grpc_client_direct - object_name = f"test-get-object-{uuid.uuid4().hex}" - test_data = b"Some test data bytes." - expected_size = len(test_data) - - writer = AsyncAppendableObjectWriter( - grpc_client, - _ZONAL_BUCKET, - object_name, - ) - - await writer.open() - await writer.append(test_data) - await writer.close(finalize_on_close=False) - - obj = await grpc_client.get_object( - bucket_name=_ZONAL_BUCKET, - object_name=object_name, - ) - - # Assert - assert obj is not None - assert obj.name == object_name - assert obj.bucket == f"projects/_/buckets/{_ZONAL_BUCKET}" - assert obj.size == expected_size, ( - f"Expected object size {expected_size}, got {obj.size}" - ) - - # Cleanup - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - del writer - gc.collect() - - event_loop.run_until_complete(_run()) diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index c912dc995..379e6410b 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -407,7 +407,7 @@ async def close_side_effect(): ) @pytest.mark.asyncio async def test_create_mrd_with_generation_number( - self, mock_cls_async_read_object_stream + self, mock_cls_async_read_object_stream, caplog ): # Arrange mock_client = mock.MagicMock() @@ -430,6 +430,7 @@ async def test_create_mrd_with_generation_number( # Assert assert mrd.generation == _TEST_GENERATION_NUMBER + assert "'generation_number' is deprecated" in caplog.text @pytest.mark.asyncio async def test_create_mrd_with_both_generation_and_generation_number(self): From 5f1a1ead006a40f7d7589cd16d23a3e4811c7fd2 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 11 Feb 2026 20:32:57 +0530 Subject: [PATCH 485/509] chore: remove python 3.9 support. (#1748) chore: remove python 3.9 support. Details in b/483015736 --- .github/sync-repo-settings.yaml | 2 +- .kokoro/presubmit/{system-3.9.cfg => system-3.10.cfg} | 2 +- .librarian/generator-input/noxfile.py | 7 ++----- .librarian/generator-input/setup.py | 3 --- noxfile.py | 7 +------ setup.py | 5 +---- 6 files changed, 6 insertions(+), 20 deletions(-) rename .kokoro/presubmit/{system-3.9.cfg => system-3.10.cfg} (91%) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 19c1d0ba4..073e7d995 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -10,5 +10,5 @@ branchProtectionRules: - 'Kokoro' - 'cla/google' - 'Kokoro system-3.14' - - 'Kokoro system-3.9' + - 'Kokoro system-3.10' - 'OwlBot Post Processor' diff --git a/.kokoro/presubmit/system-3.9.cfg b/.kokoro/presubmit/system-3.10.cfg similarity index 91% rename from .kokoro/presubmit/system-3.9.cfg rename to .kokoro/presubmit/system-3.10.cfg index d21467d02..26958ac2a 100644 --- a/.kokoro/presubmit/system-3.9.cfg +++ b/.kokoro/presubmit/system-3.10.cfg @@ -3,7 +3,7 @@ # Only run this nox session. env_vars: { key: "NOX_SESSION" - value: "system-3.9" + value: "system-3.10" } # Credentials needed to test universe domain. diff --git a/.librarian/generator-input/noxfile.py b/.librarian/generator-input/noxfile.py index ca527decd..c9ada0739 100644 --- a/.librarian/generator-input/noxfile.py +++ b/.librarian/generator-input/noxfile.py @@ -27,8 +27,8 @@ BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] DEFAULT_PYTHON_VERSION = "3.14" -SYSTEM_TEST_PYTHON_VERSIONS = ["3.9", "3.14"] -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] +SYSTEM_TEST_PYTHON_VERSIONS = ["3.10", "3.14"] +UNIT_TEST_PYTHON_VERSIONS = ["3.10", "3.11", "3.12", "3.13", "3.14"] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.12"] CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -44,9 +44,6 @@ "lint", "lint_setup_py", "system", - # TODO(https://github.com/googleapis/python-storage/issues/1499): - # Remove or restore testing for Python 3.7/3.8 - "unit-3.9", "unit-3.10", "unit-3.11", "unit-3.12", diff --git a/.librarian/generator-input/setup.py b/.librarian/generator-input/setup.py index 89971aa33..294e63892 100644 --- a/.librarian/generator-input/setup.py +++ b/.librarian/generator-input/setup.py @@ -87,9 +87,6 @@ "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", diff --git a/noxfile.py b/noxfile.py index 1cef2a75f..d7ca4dd88 100644 --- a/noxfile.py +++ b/noxfile.py @@ -17,7 +17,6 @@ from __future__ import absolute_import import os import pathlib -import re import shutil import nox @@ -27,9 +26,8 @@ BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] DEFAULT_PYTHON_VERSION = "3.14" -SYSTEM_TEST_PYTHON_VERSIONS = ["3.9", "3.14"] +SYSTEM_TEST_PYTHON_VERSIONS = ["3.10", "3.14"] UNIT_TEST_PYTHON_VERSIONS = [ - "3.9", "3.10", "3.11", "3.12", @@ -51,9 +49,6 @@ "lint", "lint_setup_py", "system", - # TODO(https://github.com/googleapis/python-storage/issues/1499): - # Remove or restore testing for Python 3.7/3.8 - "unit-3.9", "unit-3.10", "unit-3.11", "unit-3.12", diff --git a/setup.py b/setup.py index 02cd11140..69fc2899e 100644 --- a/setup.py +++ b/setup.py @@ -123,9 +123,6 @@ "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -138,7 +135,7 @@ packages=packages, install_requires=dependencies, extras_require=extras, - python_requires=">=3.7", + python_requires=">=3.10", include_package_data=True, zip_safe=False, ) From ab62d728ac7d7be3c4fe9a99d72e35ead310805a Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 11 Feb 2026 20:50:22 +0530 Subject: [PATCH 486/509] fix: don't flush at every append, results in bad perf (#1746) fix: don't flush at every append, results in bad perf --- .../asyncio/async_appendable_object_writer.py | 51 +++++----- .../asyncio/async_write_object_stream.py | 5 +- .../retry/writes_resumption_strategy.py | 7 +- .../storage_read_appendable_object_tail.py | 12 +-- tests/perf/microbenchmarks/writes/config.py | 2 +- .../microbenchmarks/writes/test_writes.py | 4 +- tests/system/test_zonal.py | 57 ----------- .../test_async_appendable_object_writer.py | 97 +++++++++++-------- 8 files changed, 106 insertions(+), 129 deletions(-) diff --git a/google/cloud/storage/asyncio/async_appendable_object_writer.py b/google/cloud/storage/asyncio/async_appendable_object_writer.py index 3ab06f8ba..a7544c203 100644 --- a/google/cloud/storage/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/asyncio/async_appendable_object_writer.py @@ -211,6 +211,7 @@ def __init__( self.bytes_appended_since_last_flush = 0 self._routing_token: Optional[str] = None self.object_resource: Optional[_storage_v2.Object] = None + self._flush_count = 0 async def state_lookup(self) -> int: """Returns the persisted_size @@ -318,6 +319,8 @@ async def _do_open(): self.write_handle = self.write_obj_stream.write_handle if self.write_obj_stream.persisted_size is not None: self.persisted_size = self.write_obj_stream.persisted_size + # set offset while opening + self.offset = self.persisted_size self._is_stream_open = True self._routing_token = None @@ -403,28 +406,31 @@ async def generator(): write_state.user_buffer.seek(write_state.persisted_size) write_state.bytes_sent = write_state.persisted_size write_state.bytes_since_last_flush = 0 + self.bytes_appended_since_last_flush = 0 requests = strategy.generate_requests(state) - num_requests = len(requests) - for i, chunk_req in enumerate(requests): - if i == num_requests - 1: - chunk_req.state_lookup = True - chunk_req.flush = True + for chunk_req in requests: await self.write_obj_stream.send(chunk_req) - - resp = await self.write_obj_stream.recv() - if resp: - if resp.persisted_size is not None: - self.persisted_size = resp.persisted_size - state["write_state"].persisted_size = resp.persisted_size - self.offset = self.persisted_size - if resp.write_handle: - self.write_handle = resp.write_handle - state["write_state"].write_handle = resp.write_handle - self.bytes_appended_since_last_flush = 0 - - yield resp + if chunk_req.flush: + self._flush_count += 1 + + resp = None + if chunk_req.state_lookup: + # TODO: if there's error, it'll raise error + # and will be handled by `recover_state_on_failure` + resp = await self.write_obj_stream.recv() + + if resp: + if resp.persisted_size is not None: + self.persisted_size = resp.persisted_size + state["write_state"].persisted_size = resp.persisted_size + self.offset = self.persisted_size + if resp.write_handle: + self.write_handle = resp.write_handle + state["write_state"].write_handle = resp.write_handle + + yield resp return generator() @@ -432,7 +438,8 @@ async def generator(): write_state = _WriteState(_MAX_CHUNK_SIZE_BYTES, buffer, self.flush_interval) write_state.write_handle = self.write_handle write_state.persisted_size = self.persisted_size - write_state.bytes_sent = self.persisted_size + # offset is set during `open()` call. + write_state.bytes_sent = self.offset or 0 write_state.bytes_since_last_flush = self.bytes_appended_since_last_flush retry_manager = _BidiStreamRetryManager( @@ -442,11 +449,8 @@ async def generator(): await retry_manager.execute({"write_state": write_state}, retry_policy) # Sync local markers - self.write_obj_stream.persisted_size = write_state.persisted_size - self.write_obj_stream.write_handle = write_state.write_handle self.bytes_appended_since_last_flush = write_state.bytes_since_last_flush - self.persisted_size = write_state.persisted_size - self.offset = write_state.persisted_size + self.offset = write_state.bytes_sent async def simple_flush(self) -> None: """Flushes the data to the server. @@ -516,7 +520,6 @@ async def close(self, finalize_on_close=False) -> Union[int, _storage_v2.Object] await self.write_obj_stream.close() self._is_stream_open = False - self.offset = None return self.persisted_size async def finalize(self) -> _storage_v2.Object: diff --git a/google/cloud/storage/asyncio/async_write_object_stream.py b/google/cloud/storage/asyncio/async_write_object_stream.py index 319f394dd..de4be3820 100644 --- a/google/cloud/storage/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/asyncio/async_write_object_stream.py @@ -190,7 +190,10 @@ async def requests_done(self): _utils.update_write_handle_if_exists(self, first_resp) if first_resp != grpc.aio.EOF: - self.persisted_size = first_resp.persisted_size + # this persisted_size will not be upto date., also what if response + # doesn't have persisted_size? , it'll throw error. + if hasattr(first_resp, "persisted_size"): + self.persisted_size = first_resp.persisted_size second_resp = await self.socket_like_rpc.recv() assert second_resp == grpc.aio.EOF diff --git a/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py b/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py index b98b9b2e7..f7dcd1e17 100644 --- a/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py +++ b/google/cloud/storage/asyncio/retry/writes_resumption_strategy.py @@ -47,6 +47,11 @@ def __init__( self.chunk_size = chunk_size self.user_buffer = user_buffer self.persisted_size: int = 0 + # Bytes sent to the server (it may be unpersisted), + # i.e. latest object size = persisted_size + some more bytes. + # Please note: these bytes are sent from client to server, server might have also received it. + # but might not have persisted it yet (may be in memory buffer on server side). + # This variable is same as `offset variable` in the instance of `AppendableObjectWriter`. self.bytes_sent: int = 0 self.bytes_since_last_flush: int = 0 self.flush_interval: int = flush_interval @@ -91,7 +96,7 @@ def generate_requests( if write_state.bytes_since_last_flush >= write_state.flush_interval: request.flush = True - # reset counter after marking flush + request.state_lookup = True write_state.bytes_since_last_flush = 0 requests.append(request) diff --git a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py index 9e4dcd738..624898066 100644 --- a/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py +++ b/samples/snippets/zonal_buckets/storage_read_appendable_object_tail.py @@ -28,7 +28,7 @@ AsyncMultiRangeDownloader, ) -BYTES_TO_APPEND = b"fav_bytes." +BYTES_TO_APPEND = b"fav_bytes." * 100 * 1024 * 1024 NUM_BYTES_TO_APPEND_EVERY_SECOND = len(BYTES_TO_APPEND) @@ -37,14 +37,16 @@ async def appender(writer: AsyncAppendableObjectWriter, duration: int): """Appends 10 bytes to the object every second for a given duration.""" print("Appender started.") bytes_appended = 0 - for i in range(duration): + start_time = time.monotonic() + # Run the appender for the specified duration. + while time.monotonic() - start_time < duration: await writer.append(BYTES_TO_APPEND) now = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] bytes_appended += NUM_BYTES_TO_APPEND_EVERY_SECOND print( f"[{now}] Appended {NUM_BYTES_TO_APPEND_EVERY_SECOND} new bytes. Total appended: {bytes_appended} bytes." ) - await asyncio.sleep(1) + await asyncio.sleep(0.1) print("Appender finished.") @@ -67,9 +69,7 @@ async def tailer( bytes_downloaded = output_buffer.getbuffer().nbytes if bytes_downloaded > 0: now = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] - print( - f"[{now}] Tailer read {bytes_downloaded} new bytes: {output_buffer.getvalue()}" - ) + print(f"[{now}] Tailer read {bytes_downloaded} new bytes: ") start_byte += bytes_downloaded await asyncio.sleep(0.1) # Poll for new data every 0.1 seconds. diff --git a/tests/perf/microbenchmarks/writes/config.py b/tests/perf/microbenchmarks/writes/config.py index d823260f9..3f34cc789 100644 --- a/tests/perf/microbenchmarks/writes/config.py +++ b/tests/perf/microbenchmarks/writes/config.py @@ -86,7 +86,7 @@ def get_write_params() -> Dict[str, List[WriteParameters]]: num_files = num_processes * num_coros # Create a descriptive name for the parameter set - name = f"{workload_name}_{bucket_type}_{num_processes}p_{num_coros}c" + name = f"{workload_name}_{bucket_type}_{num_processes}p_{num_coros}c_{chunk_size_mib}csize" params[workload_name].append( WriteParameters( diff --git a/tests/perf/microbenchmarks/writes/test_writes.py b/tests/perf/microbenchmarks/writes/test_writes.py index 02a0f5e4f..e2a2d6f63 100644 --- a/tests/perf/microbenchmarks/writes/test_writes.py +++ b/tests/perf/microbenchmarks/writes/test_writes.py @@ -82,7 +82,9 @@ async def upload_chunks_using_grpc_async(client, filename, other_params): uploaded_bytes += bytes_to_upload await writer.close() - assert uploaded_bytes == upload_size + # print('writer flush count', writer._flush_count) + + assert writer.offset == upload_size end_time = time.monotonic_ns() elapsed_time = end_time - start_time diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 9bd870860..49c0ac7da 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -437,63 +437,6 @@ async def _read_and_verify(expected_content, generation=None): event_loop.run_until_complete(_run()) -def test_append_flushes_and_state_lookup( - storage_client, blobs_to_delete, event_loop, grpc_client -): - """ - System test for AsyncAppendableObjectWriter, verifying flushing behavior - for both small and large appends. - """ - object_name = f"test-append-flush-varied-size-{uuid.uuid4()}" - - async def _run(): - writer = AsyncAppendableObjectWriter(grpc_client, _ZONAL_BUCKET, object_name) - - # Schedule for cleanup - blobs_to_delete.append(storage_client.bucket(_ZONAL_BUCKET).blob(object_name)) - - # --- Part 1: Test with small data --- - small_data = b"small data" - - await writer.open() - assert writer._is_stream_open - - await writer.append(small_data) - persisted_size = await writer.state_lookup() - assert persisted_size == len(small_data) - - # --- Part 2: Test with large data --- - large_data = os.urandom(38 * 1024 * 1024) - - # Append data larger than the default flush interval (16 MiB). - # This should trigger the interval-based flushing logic. - await writer.append(large_data) - - # Verify the total data has been persisted. - total_size = len(small_data) + len(large_data) - persisted_size = await writer.state_lookup() - assert persisted_size == total_size - - # --- Part 3: Finalize and verify --- - final_object = await writer.close(finalize_on_close=True) - - assert not writer._is_stream_open - assert final_object.size == total_size - - # Verify the full content of the object. - full_data = small_data + large_data - mrd = AsyncMultiRangeDownloader(grpc_client, _ZONAL_BUCKET, object_name) - buffer = BytesIO() - await mrd.open() - # (0, 0) means read the whole object - await mrd.download_ranges([(0, 0, buffer)]) - await mrd.close() - content = buffer.getvalue() - assert content == full_data - - event_loop.run_until_complete(_run()) - - def test_open_with_generation_zero( storage_client, blobs_to_delete, event_loop, grpc_client ): diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 02fb3238d..0c8fe4375 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -35,11 +35,15 @@ WRITE_HANDLE = b"test-write-handle" PERSISTED_SIZE = 456 EIGHT_MIB = 8 * 1024 * 1024 +DATA_LESS_THAN_FLUSH_INTERVAL = ( + b"test-data" # 9 bytes, less than default flush interval +) class TestIsWriteRetryable: """Exhaustive tests for retry predicate logic.""" + # TODO: remove `mock_appendable_writer` param. def test_standard_transient_errors(self, mock_appendable_writer): for exc in [ exceptions.InternalServerError("500"), @@ -110,7 +114,6 @@ def mock_appendable_writer(): yield { "mock_client": mock_client, - "mock_stream_cls": mock_stream_cls, "mock_stream": mock_stream, } @@ -172,9 +175,9 @@ async def test_state_lookup(self, mock_appendable_writer): writer._is_stream_open = True writer.write_obj_stream = mock_appendable_writer["mock_stream"] - mock_appendable_writer[ - "mock_stream" - ].recv.return_value = storage_type.BidiWriteObjectResponse(persisted_size=100) + mock_appendable_writer["mock_stream"].recv.return_value = ( + storage_type.BidiWriteObjectResponse(persisted_size=100) + ) size = await writer.state_lookup() @@ -220,41 +223,59 @@ def test_on_open_error_redirection(self, mock_appendable_writer): # ------------------------------------------------------------------------- @pytest.mark.asyncio - async def test_append_basic_success(self, mock_appendable_writer): + async def test_append_data_less_than_flush_interval(self, mock_appendable_writer): """Verify append orchestrates manager and drives the internal generator.""" writer = self._make_one(mock_appendable_writer["mock_client"]) writer._is_stream_open = True + writer.persisted_size = 0 writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer.write_obj_stream.send = AsyncMock() + + data_len = len(DATA_LESS_THAN_FLUSH_INTERVAL) + await writer.append(DATA_LESS_THAN_FLUSH_INTERVAL) + + assert writer.offset == data_len + assert writer.bytes_appended_since_last_flush == data_len + + @pytest.mark.parametrize( + "data_len", + [ + _DEFAULT_FLUSH_INTERVAL_BYTES - 1, + _DEFAULT_FLUSH_INTERVAL_BYTES, + _DEFAULT_FLUSH_INTERVAL_BYTES + 1, + ], + ) + @pytest.mark.asyncio + async def test_append( + self, data_len, mock_appendable_writer + ): + """Verify append orchestrates manager and drives the internal generator.""" + # Arrange + writer = self._make_one(mock_appendable_writer["mock_client"]) + writer._is_stream_open = True writer.persisted_size = 0 + writer.write_obj_stream = mock_appendable_writer["mock_stream"] + writer.write_obj_stream.send = AsyncMock() - data = b"test-data" + # if data > flush interval then we expect 1 flush & 1 state_lookup going through + # which means we will do 1 recv() call. + writer.write_obj_stream.recv = AsyncMock( + return_value=storage_type.BidiWriteObjectResponse( + persisted_size=_DEFAULT_FLUSH_INTERVAL_BYTES + ) + ) + data = b"a" * data_len - with mock.patch( - "google.cloud.storage.asyncio.async_appendable_object_writer._BidiStreamRetryManager" - ) as MockManager: - - async def mock_execute(state, policy): - factory = MockManager.call_args[0][1] - dummy_reqs = [storage_type.BidiWriteObjectRequest()] - gen = factory(dummy_reqs, state) - - mock_appendable_writer["mock_stream"].recv.side_effect = [ - storage_type.BidiWriteObjectResponse( - persisted_size=len(data), - write_handle=storage_type.BidiWriteHandle(handle=b"h2"), - ), - None, - ] - async for _ in gen: - pass - - MockManager.return_value.execute.side_effect = mock_execute - await writer.append(data) - - assert writer.persisted_size == len(data) - sent_req = mock_appendable_writer["mock_stream"].send.call_args[0][0] - assert sent_req.state_lookup - assert sent_req.flush + # Act + await writer.append(data) + + # Assert + expected_recv_count = data_len // _DEFAULT_FLUSH_INTERVAL_BYTES + assert writer.offset == data_len + assert writer.bytes_appended_since_last_flush == data_len % _DEFAULT_FLUSH_INTERVAL_BYTES + assert writer.persisted_size == expected_recv_count*_DEFAULT_FLUSH_INTERVAL_BYTES + assert writer.write_obj_stream.send.await_count == -(-data_len // _MAX_CHUNK_SIZE_BYTES) # Ceiling division for number of chunks + assert writer.write_obj_stream.recv.await_count == expected_recv_count # Expect 1 recv per flush interval @pytest.mark.asyncio async def test_append_recovery_reopens_stream(self, mock_appendable_writer): @@ -318,9 +339,9 @@ async def test_flush_resets_counters(self, mock_appendable_writer): writer.write_obj_stream = mock_appendable_writer["mock_stream"] writer.bytes_appended_since_last_flush = 100 - mock_appendable_writer[ - "mock_stream" - ].recv.return_value = storage_type.BidiWriteObjectResponse(persisted_size=200) + mock_appendable_writer["mock_stream"].recv.return_value = ( + storage_type.BidiWriteObjectResponse(persisted_size=200) + ) await writer.flush() @@ -361,9 +382,9 @@ async def test_finalize_lifecycle(self, mock_appendable_writer): writer.write_obj_stream = mock_appendable_writer["mock_stream"] resource = storage_type.Object(size=999) - mock_appendable_writer[ - "mock_stream" - ].recv.return_value = storage_type.BidiWriteObjectResponse(resource=resource) + mock_appendable_writer["mock_stream"].recv.return_value = ( + storage_type.BidiWriteObjectResponse(resource=resource) + ) res = await writer.finalize() From 09b1d9dcb29133a21b2563856e663c2f63b85a79 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 19 Feb 2026 18:24:24 +0530 Subject: [PATCH 487/509] feat: add time based benchmarks (#1749) feat: add time based benchmarks --- tests/perf/microbenchmarks/_utils.py | 103 +++++++- .../microbenchmarks/time_based/conftest.py | 21 ++ .../time_based/reads/config.py | 106 ++++++++ .../time_based/reads/config.yaml | 28 +++ .../time_based/reads/parameters.py | 23 ++ .../time_based/reads/test_reads.py | 228 ++++++++++++++++++ 6 files changed, 501 insertions(+), 8 deletions(-) create mode 100644 tests/perf/microbenchmarks/time_based/conftest.py create mode 100644 tests/perf/microbenchmarks/time_based/reads/config.py create mode 100644 tests/perf/microbenchmarks/time_based/reads/config.yaml create mode 100644 tests/perf/microbenchmarks/time_based/reads/parameters.py create mode 100644 tests/perf/microbenchmarks/time_based/reads/test_reads.py diff --git a/tests/perf/microbenchmarks/_utils.py b/tests/perf/microbenchmarks/_utils.py index ff29b8783..edf398fe9 100644 --- a/tests/perf/microbenchmarks/_utils.py +++ b/tests/perf/microbenchmarks/_utils.py @@ -11,18 +11,24 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, List +from typing import Any, List, Optional import statistics import io import os +import socket +import psutil +_C4_STANDARD_192_NIC = "ens3" # can be fetched via ip link show def publish_benchmark_extra_info( benchmark: Any, params: Any, benchmark_group: str = "read", true_times: List[float] = [], + download_bytes_list: Optional[List[int]] = None, + duration: Optional[int] = None, ) -> None: + """ Helper function to publish benchmark parameters to the extra_info property. """ @@ -41,13 +47,23 @@ def publish_benchmark_extra_info( benchmark.extra_info["processes"] = params.num_processes benchmark.group = benchmark_group - object_size = params.file_size_bytes - num_files = params.num_files - total_uploaded_mib = object_size / (1024 * 1024) * num_files - min_throughput = total_uploaded_mib / benchmark.stats["max"] - max_throughput = total_uploaded_mib / benchmark.stats["min"] - mean_throughput = total_uploaded_mib / benchmark.stats["mean"] - median_throughput = total_uploaded_mib / benchmark.stats["median"] + if download_bytes_list is not None: + assert duration is not None, "Duration must be provided if total_bytes_transferred is provided." + throughputs_list = [x / duration / (1024 * 1024) for x in download_bytes_list] + min_throughput = min(throughputs_list) + max_throughput = max(throughputs_list) + mean_throughput = statistics.mean(throughputs_list) + median_throughput = statistics.median(throughputs_list) + + + else: + object_size = params.file_size_bytes + num_files = params.num_files + total_uploaded_mib = object_size / (1024 * 1024) * num_files + min_throughput = total_uploaded_mib / benchmark.stats["max"] + max_throughput = total_uploaded_mib / benchmark.stats["min"] + mean_throughput = total_uploaded_mib / benchmark.stats["mean"] + median_throughput = total_uploaded_mib / benchmark.stats["median"] benchmark.extra_info["throughput_MiB_s_min"] = min_throughput benchmark.extra_info["throughput_MiB_s_max"] = max_throughput @@ -165,3 +181,74 @@ def seek(self, offset, whence=io.SEEK_SET): # Clamp position to valid range [0, size] self._pos = max(0, min(new_pos, self._size)) return self._pos + + +def get_nic_pci(nic): + """Gets the PCI address of a network interface.""" + return os.path.basename(os.readlink(f"/sys/class/net/{nic}/device")) + + +def get_irqs_for_pci(pci): + """Gets the IRQs associated with a PCI address.""" + irqs = [] + with open("/proc/interrupts") as f: + for line in f: + if pci in line: + irq = line.split(":")[0].strip() + irqs.append(irq) + return irqs + + +def get_affinity(irq): + """Gets the CPU affinity of an IRQ.""" + path = f"/proc/irq/{irq}/smp_affinity_list" + try: + with open(path) as f: + return f.read().strip() + except FileNotFoundError: + return "N/A" + + +def get_primary_interface_name(): + primary_ip = None + + # 1. Determine the Local IP used for internet access + # We use UDP (SOCK_DGRAM) so we don't actually send a handshake/packet + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + # connect() to a public IP (Google DNS) to force route resolution + s.connect(('8.8.8.8', 80)) + primary_ip = s.getsockname()[0] + except Exception: + # Fallback if no internet + return None + finally: + s.close() + + # 2. Match that IP to an interface name using psutil + if primary_ip: + interfaces = psutil.net_if_addrs() + for name, addresses in interfaces.items(): + for addr in addresses: + # check if this interface has the IP we found + if addr.address == primary_ip: + return name + return None + + +def get_irq_affinity(): + """Gets the set of CPUs for a given network interface.""" + nic = get_primary_interface_name() + if not nic: + nic = _C4_STANDARD_192_NIC + + pci = get_nic_pci(nic) + irqs = get_irqs_for_pci(pci) + cpus = set() + for irq in irqs: + affinity_str = get_affinity(irq) + if affinity_str != "N/A": + for part in affinity_str.split(','): + if '-' not in part: + cpus.add(int(part)) + return cpus diff --git a/tests/perf/microbenchmarks/time_based/conftest.py b/tests/perf/microbenchmarks/time_based/conftest.py new file mode 100644 index 000000000..bcd186d7b --- /dev/null +++ b/tests/perf/microbenchmarks/time_based/conftest.py @@ -0,0 +1,21 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import pytest + + +@pytest.fixture +def workload_params(request): + params = request.param + files_names = [f'fio-go_storage_fio.0.{i}' for i in range(0, params.num_processes)] + return params, files_names diff --git a/tests/perf/microbenchmarks/time_based/reads/config.py b/tests/perf/microbenchmarks/time_based/reads/config.py new file mode 100644 index 000000000..737bb3b84 --- /dev/null +++ b/tests/perf/microbenchmarks/time_based/reads/config.py @@ -0,0 +1,106 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import itertools +import os +from typing import Dict, List + +import yaml + +try: + from tests.perf.microbenchmarks.time_based.reads.parameters import ( + TimeBasedReadParameters, + ) +except ModuleNotFoundError: + from reads.parameters import TimeBasedReadParameters + + +def _get_params() -> Dict[str, List[TimeBasedReadParameters]]: + """Generates a dictionary of benchmark parameters for time based read operations.""" + params: Dict[str, List[TimeBasedReadParameters]] = {} + config_path = os.path.join(os.path.dirname(__file__), "config.yaml") + with open(config_path, "r") as f: + config = yaml.safe_load(f) + + common_params = config["common"] + bucket_types = common_params["bucket_types"] + file_sizes_mib = common_params["file_sizes_mib"] + chunk_sizes_kib = common_params["chunk_sizes_kib"] + num_ranges = common_params["num_ranges"] + rounds = common_params["rounds"] + duration = common_params["duration"] + warmup_duration = common_params["warmup_duration"] + + bucket_map = { + "zonal": os.environ.get( + "DEFAULT_RAPID_ZONAL_BUCKET", + config["defaults"]["DEFAULT_RAPID_ZONAL_BUCKET"], + ), + "regional": os.environ.get( + "DEFAULT_STANDARD_BUCKET", config["defaults"]["DEFAULT_STANDARD_BUCKET"] + ), + } + + for workload in config["workload"]: + workload_name = workload["name"] + params[workload_name] = [] + pattern = workload["pattern"] + processes = workload["processes"] + coros = workload["coros"] + + # Create a product of all parameter combinations + product = itertools.product( + bucket_types, + file_sizes_mib, + chunk_sizes_kib, + num_ranges, + processes, + coros, + ) + + for ( + bucket_type, + file_size_mib, + chunk_size_kib, + num_ranges_val, + num_processes, + num_coros, + ) in product: + file_size_bytes = file_size_mib * 1024 * 1024 + chunk_size_bytes = chunk_size_kib * 1024 + bucket_name = bucket_map[bucket_type] + + num_files = num_processes * num_coros + + # Create a descriptive name for the parameter set + name = f"{pattern}_{bucket_type}_{num_processes}p_{file_size_mib}MiB_{chunk_size_kib}KiB_{num_ranges_val}ranges" + + params[workload_name].append( + TimeBasedReadParameters( + name=name, + workload_name=workload_name, + pattern=pattern, + bucket_name=bucket_name, + bucket_type=bucket_type, + num_coros=num_coros, + num_processes=num_processes, + num_files=num_files, + rounds=rounds, + chunk_size_bytes=chunk_size_bytes, + file_size_bytes=file_size_bytes, + duration=duration, + warmup_duration=warmup_duration, + num_ranges=num_ranges_val, + ) + ) + return params diff --git a/tests/perf/microbenchmarks/time_based/reads/config.yaml b/tests/perf/microbenchmarks/time_based/reads/config.yaml new file mode 100644 index 000000000..e739bfd2f --- /dev/null +++ b/tests/perf/microbenchmarks/time_based/reads/config.yaml @@ -0,0 +1,28 @@ +common: + bucket_types: + - "regional" + - "zonal" + file_sizes_mib: + - 10240 # 10GiB + chunk_sizes_kib: [64] # 16KiB + num_ranges: [1] + rounds: 1 + duration: 30 # seconds + warmup_duration: 5 # seconds + +workload: + ############# multi process multi coroutine ######### + - name: "read_seq_multi_process" + pattern: "seq" + coros: [1] + processes: [96] + + + - name: "read_rand_multi_process" + pattern: "rand" + coros: [1] + processes: [1] + +defaults: + DEFAULT_RAPID_ZONAL_BUCKET: "chandrasiri-benchmarks-zb" + DEFAULT_STANDARD_BUCKET: "chandrasiri-benchmarks-rb" \ No newline at end of file diff --git a/tests/perf/microbenchmarks/time_based/reads/parameters.py b/tests/perf/microbenchmarks/time_based/reads/parameters.py new file mode 100644 index 000000000..6ed2da210 --- /dev/null +++ b/tests/perf/microbenchmarks/time_based/reads/parameters.py @@ -0,0 +1,23 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from dataclasses import dataclass +from tests.perf.microbenchmarks.parameters import IOBenchmarkParameters + + +@dataclass +class TimeBasedReadParameters(IOBenchmarkParameters): + pattern: str + duration: int + warmup_duration: int + num_ranges: int diff --git a/tests/perf/microbenchmarks/time_based/reads/test_reads.py b/tests/perf/microbenchmarks/time_based/reads/test_reads.py new file mode 100644 index 000000000..f2b84158b --- /dev/null +++ b/tests/perf/microbenchmarks/time_based/reads/test_reads.py @@ -0,0 +1,228 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Microbenchmarks for time-based Google Cloud Storage read operations.""" + +import time +import asyncio +import random +import logging +import os +import multiprocessing + +import pytest + +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) +from tests.perf.microbenchmarks._utils import ( + get_irq_affinity, + publish_benchmark_extra_info, +) +from tests.perf.microbenchmarks.conftest import ( + publish_resource_metrics, +) +from io import BytesIO +import tests.perf.microbenchmarks.time_based.reads.config as config + +all_params = config._get_params() + + +async def create_client(): + """Initializes async client and gets the current event loop.""" + return AsyncGrpcClient() + + +# --- Global Variables for Worker Process --- +worker_loop = None +worker_client = None +worker_json_client = None + + +# TODO: b/479135274 close clients properly. +def _worker_init(bucket_type): + """Initializes a persistent event loop and client for each worker process.""" + cpu_affinity = get_irq_affinity() + if cpu_affinity: + os.sched_setaffinity( + 0, {i for i in range(0, os.cpu_count()) if i not in cpu_affinity} + ) + + global worker_loop, worker_client, worker_json_client + if bucket_type == "zonal": + worker_loop = asyncio.new_event_loop() + asyncio.set_event_loop(worker_loop) + worker_client = worker_loop.run_until_complete(create_client()) + else: # regional + from google.cloud import storage + + worker_json_client = storage.Client() + + +def _download_time_based_json(client, filename, params): + """Performs time-based downloads using the JSON API.""" + total_bytes_downloaded = 0 + bucket = client.bucket(params.bucket_name) + blob = bucket.blob(filename) + + offset = 0 + is_warming_up = True + start_time = time.monotonic() + warmup_end_time = start_time + params.warmup_duration + test_end_time = warmup_end_time + params.duration + + while time.monotonic() < test_end_time: + current_time = time.monotonic() + if is_warming_up and current_time >= warmup_end_time: + is_warming_up = False + total_bytes_downloaded = 0 # Reset counter after warmup + + bytes_in_iteration = 0 + # For JSON, we can't batch ranges like gRPC, so we download one by one + for _ in range(params.num_ranges): + if params.pattern == "rand": + offset = random.randint( + 0, params.file_size_bytes - params.chunk_size_bytes + ) + + data = blob.download_as_bytes( + start=offset, end=offset + params.chunk_size_bytes - 1 + ) + bytes_in_iteration += len(data) + + if params.pattern == "seq": + offset += params.chunk_size_bytes + if offset + params.chunk_size_bytes > params.file_size_bytes: + offset = 0 + + assert bytes_in_iteration == params.chunk_size_bytes * params.num_ranges + + if not is_warming_up: + total_bytes_downloaded += bytes_in_iteration + + return total_bytes_downloaded + + +async def _download_time_based_async(client, filename, params): + total_bytes_downloaded = 0 + + mrd = AsyncMultiRangeDownloader(client, params.bucket_name, filename) + await mrd.open() + + offset = 0 + is_warming_up = True + start_time = time.monotonic() + warmup_end_time = start_time + params.warmup_duration + test_end_time = warmup_end_time + params.duration + + while time.monotonic() < test_end_time: + current_time = time.monotonic() + if is_warming_up and current_time >= warmup_end_time: + is_warming_up = False + total_bytes_downloaded = 0 # Reset counter after warmup + + ranges = [] + if params.pattern == "rand": + for _ in range(params.num_ranges): + offset = random.randint( + 0, params.file_size_bytes - params.chunk_size_bytes + ) + ranges.append((offset, params.chunk_size_bytes, BytesIO())) + else: # seq + for _ in range(params.num_ranges): + ranges.append((offset, params.chunk_size_bytes, BytesIO())) + offset += params.chunk_size_bytes + if offset + params.chunk_size_bytes > params.file_size_bytes: + offset = 0 # Reset offset if end of file is reached + + await mrd.download_ranges(ranges) + + bytes_in_buffers = sum(r[2].getbuffer().nbytes for r in ranges) + assert bytes_in_buffers == params.chunk_size_bytes * params.num_ranges + + if not is_warming_up: + total_bytes_downloaded += params.chunk_size_bytes * params.num_ranges + + await mrd.close() + return total_bytes_downloaded + + +def _download_files_worker(process_idx, filename, params, bucket_type): + + if bucket_type == "zonal": + return worker_loop.run_until_complete( + _download_time_based_async(worker_client, filename, params) + ) + else: # regional + return _download_time_based_json(worker_json_client, filename, params) + + +def download_files_mp_mc_wrapper(pool, files_names, params, bucket_type): + args = [(i, files_names[i], params, bucket_type) for i in range(len(files_names))] + + results = pool.starmap(_download_files_worker, args) + return sum(results) + + +@pytest.mark.parametrize( + "workload_params", + all_params["read_seq_multi_process"] + all_params["read_rand_multi_process"], + indirect=True, + ids=lambda p: p.name, +) +def test_downloads_multi_proc_multi_coro( + benchmark, storage_client, monitor, workload_params +): + params, files_names = workload_params + logging.info(f"num files: {len(files_names)}") + + ctx = multiprocessing.get_context("spawn") + pool = ctx.Pool( + processes=params.num_processes, + initializer=_worker_init, + initargs=(params.bucket_type,), + ) + + download_bytes_list = [] + + def target_wrapper(*args, **kwargs): + download_bytes_list.append(download_files_mp_mc_wrapper(pool, *args, **kwargs)) + return + + try: + with monitor() as m: + benchmark.pedantic( + target=target_wrapper, + iterations=1, + rounds=params.rounds, + args=(files_names, params, params.bucket_type), + ) + finally: + pool.close() + pool.join() + total_bytes_downloaded = sum(download_bytes_list) + throughput_mib_s = ( + total_bytes_downloaded / params.duration / params.rounds + ) / (1024 * 1024) + benchmark.extra_info["avg_throughput_mib_s"] = f"{throughput_mib_s:.2f}" + print( + f"Avg Throughput of {params.rounds} round(s): {throughput_mib_s:.2f} MiB/s" + ) + publish_benchmark_extra_info( + benchmark, + params, + download_bytes_list=download_bytes_list, + duration=params.duration, + ) + publish_resource_metrics(benchmark, m) From a9eb82c1b9b3c6ae5717d47b76284ed0deb5f769 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Thu, 19 Feb 2026 20:25:50 +0530 Subject: [PATCH 488/509] fix: init mp pool & grpc client once, use os.sched_setaffinity (#1751) fix: init mp pool & grpc client once, use os.sched_setaffinity - mp pool is initalize once per benchmark run, otherwise time to init pool is affecting throughput calculations. - grpc client should be intialized once per process in an event loop, otherwise processes get stuck . - os.sched_setaffinity helps in pinning the process to a set of cores to avoid hard irq from nic. --- .../microbenchmarks/writes/test_writes.py | 68 ++++++++++++------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/tests/perf/microbenchmarks/writes/test_writes.py b/tests/perf/microbenchmarks/writes/test_writes.py index e2a2d6f63..f130a3f0b 100644 --- a/tests/perf/microbenchmarks/writes/test_writes.py +++ b/tests/perf/microbenchmarks/writes/test_writes.py @@ -38,10 +38,10 @@ from tests.perf.microbenchmarks._utils import ( publish_benchmark_extra_info, RandomBytesIO, + get_irq_affinity, ) from tests.perf.microbenchmarks.conftest import publish_resource_metrics import tests.perf.microbenchmarks.writes.config as config -from google.cloud import storage # Get write parameters all_params = config.get_write_params() @@ -318,10 +318,34 @@ def target_wrapper(*args, **kwargs): ) +# --- Global Variables for Worker Process --- +worker_loop = None +worker_client = None +worker_json_client = None + + +def _worker_init(bucket_type): + """Initializes a persistent event loop and client for each worker process.""" + cpu_affinity = get_irq_affinity() + if cpu_affinity: + os.sched_setaffinity( + 0, {i for i in range(1, os.cpu_count()) if i not in cpu_affinity} + ) + global worker_loop, worker_client, worker_json_client + if bucket_type == "zonal": + worker_loop = asyncio.new_event_loop() + asyncio.set_event_loop(worker_loop) + worker_client = worker_loop.run_until_complete(create_client()) + else: # regional + from google.cloud import storage + + worker_json_client = storage.Client() + + def _upload_files_worker(files_to_upload, other_params, bucket_type): """A worker function for multi-processing uploads. - Initializes a client and calls the appropriate multi-coroutine upload function. + Calls the appropriate multi-coroutine upload function using the global client. This function is intended to be called in a separate process. Args: @@ -333,41 +357,28 @@ def _upload_files_worker(files_to_upload, other_params, bucket_type): float: The maximum latency from the uploads performed by this worker. """ if bucket_type == "zonal": - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - client = loop.run_until_complete(create_client()) - try: - result = upload_files_using_grpc_multi_coro( - loop, client, files_to_upload, other_params - ) - finally: - # cleanup loop - tasks = asyncio.all_tasks(loop=loop) - for task in tasks: - task.cancel() - loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) - loop.close() - return result + return upload_files_using_grpc_multi_coro( + worker_loop, worker_client, files_to_upload, other_params + ) else: # regional - json_client = storage.Client() return upload_files_using_json_multi_threaded( - None, json_client, files_to_upload, other_params + None, worker_json_client, files_to_upload, other_params ) -def upload_files_mp_mc_wrapper(files_names, params): +def upload_files_mp_mc_wrapper(pool, files_names, params): """Wrapper for multi-process, multi-coroutine uploads. Distributes files among a pool of processes and calls the worker function. Args: + pool: The multiprocessing pool. files_names (list): The full list of filenames to upload. - params: An object containing benchmark parameters (num_processes, num_coros). + params: An object containing benchmark parameters (num_coros). Returns: float: The maximum latency observed across all processes. """ - num_processes = params.num_processes num_coros = params.num_coros filenames_per_process = [ @@ -383,9 +394,7 @@ def upload_files_mp_mc_wrapper(files_names, params): for filenames in filenames_per_process ] - ctx = multiprocessing.get_context("spawn") - with ctx.Pool(processes=num_processes) as pool: - results = pool.starmap(_upload_files_worker, args) + results = pool.starmap(_upload_files_worker, args) return max(results) @@ -414,6 +423,12 @@ def target_wrapper(*args, **kwargs): output_times.append(result) return output_times + ctx = multiprocessing.get_context("spawn") + pool = ctx.Pool( + processes=params.num_processes, + initializer=_worker_init, + initargs=(params.bucket_type,), + ) try: with monitor() as m: output_times = benchmark.pedantic( @@ -421,11 +436,14 @@ def target_wrapper(*args, **kwargs): iterations=1, rounds=params.rounds, args=( + pool, files_names, params, ), ) finally: + pool.close() + pool.join() publish_benchmark_extra_info( benchmark, params, benchmark_group="write", true_times=output_times ) From d8dd1e074d2431de9b45e0103181dce749a447a0 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 23 Feb 2026 10:33:11 +0530 Subject: [PATCH 489/509] fix: pass token correctly, '&' instead of ',' (#1756) fix: pass token correctly, '&' instead of ',' --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- google/cloud/storage/asyncio/async_appendable_object_writer.py | 2 +- google/cloud/storage/asyncio/async_read_object_stream.py | 2 +- google/cloud/storage/asyncio/async_write_object_stream.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/google/cloud/storage/asyncio/async_appendable_object_writer.py b/google/cloud/storage/asyncio/async_appendable_object_writer.py index a7544c203..56b3a0ec5 100644 --- a/google/cloud/storage/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/asyncio/async_appendable_object_writer.py @@ -310,7 +310,7 @@ async def _do_open(): ) await self.write_obj_stream.open( - metadata=current_metadata if metadata else None + metadata=current_metadata if current_metadata else None ) if self.write_obj_stream.generation_number: diff --git a/google/cloud/storage/asyncio/async_read_object_stream.py b/google/cloud/storage/asyncio/async_read_object_stream.py index d456f16cc..bde6c1651 100644 --- a/google/cloud/storage/asyncio/async_read_object_stream.py +++ b/google/cloud/storage/asyncio/async_read_object_stream.py @@ -115,7 +115,7 @@ async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: other_metadata.append((key, value)) current_metadata = other_metadata - current_metadata.append(("x-goog-request-params", ",".join(request_params))) + current_metadata.append(("x-goog-request-params", "&".join(request_params))) self.socket_like_rpc = AsyncBidiRpc( self.rpc, diff --git a/google/cloud/storage/asyncio/async_write_object_stream.py b/google/cloud/storage/asyncio/async_write_object_stream.py index de4be3820..4729cfd20 100644 --- a/google/cloud/storage/asyncio/async_write_object_stream.py +++ b/google/cloud/storage/asyncio/async_write_object_stream.py @@ -145,7 +145,7 @@ async def open(self, metadata: Optional[List[Tuple[str, str]]] = None) -> None: else: final_metadata.append((key, value)) - final_metadata.append(("x-goog-request-params", ",".join(request_param_values))) + final_metadata.append(("x-goog-request-params", "&".join(request_param_values))) self.socket_like_rpc = AsyncBidiRpc( self.rpc, From 4d98e32c82811b4925367d2fee134cb0b2c0dae7 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 26 Feb 2026 12:02:42 -0500 Subject: [PATCH 490/509] chore: replace old teams with cloud-sdk-python-team and gcs-team (#1758) This PR replaces the old yoshi-python team with cloud-sdk-python-team, gcs-fs with gcs-fs-team, and gcs-sdk-team with gcs-team. b/478003109 --- .github/CODEOWNERS | 8 +++----- .repo-metadata.json | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 77a642659..1688f0bbd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,9 +3,7 @@ # # For syntax help see: # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax +* @googleapis/cloud-sdk-python-team @googleapis/gcs-team @googleapis/gcs-fs-team -# @googleapis/yoshi-python @googleapis/gcs-sdk-team are the default owners for changes in this repo -* @googleapis/yoshi-python @googleapis/gcs-sdk-team @googleapis/gcs-fs - -# @googleapis/python-samples-reviewers @googleapis/gcs-sdk-team are the default owners for samples changes -/samples/ @googleapis/python-samples-reviewers @googleapis/gcs-sdk-team +# @googleapis/python-samples-reviewers @googleapis/gcs-team are the default owners for samples changes +/samples/ @googleapis/python-samples-reviewers @googleapis/gcs-team diff --git a/.repo-metadata.json b/.repo-metadata.json index bd870f959..59ebe7f61 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -12,7 +12,7 @@ "api_id": "storage.googleapis.com", "requires_billing": true, "default_version": "v2", - "codeowner_team": "@googleapis/yoshi-python @googleapis/gcs-sdk-team @googleapis/gcs-fs", + "codeowner_team": "@googleapis/cloud-sdk-python-team @googleapis/gcs-team @googleapis/gcs-fs", "api_shortname": "storage", "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." } From 810441c7a55ed9b9e5c1ef792685c99352f5bd1a Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 3 Mar 2026 23:53:04 +0530 Subject: [PATCH 491/509] chore: add Rapid x region sys test (#1765) feat: Add system test for cross-region buckets - Adds a new system test, test_basic_wrd_x_region, to verify functionality with cross-region GCS buckets. - Also updates the Cloud Build configuration to pass the necessary _CROSS_REGION_BUCKET environment variable to the test environment This PR is a cherry-picked from https://github.com/googleapis/python-storage/pull/1760 because that PR is blocked by b/489420625 --- cloudbuild/zb-system-tests-cloudbuild.yaml | 2 +- .../asyncio/async_multi_range_downloader.py | 9 +++- tests/system/test_zonal.py | 46 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/cloudbuild/zb-system-tests-cloudbuild.yaml b/cloudbuild/zb-system-tests-cloudbuild.yaml index 562eae175..26daa8ae9 100644 --- a/cloudbuild/zb-system-tests-cloudbuild.yaml +++ b/cloudbuild/zb-system-tests-cloudbuild.yaml @@ -68,7 +68,7 @@ steps: # Execute the script on the VM via SSH. # Capture the exit code to ensure cleanup happens before the build fails. set +e - gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="ulimit -n {_ULIMIT}; COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} _PR_NUMBER=${_PR_NUMBER} bash run_zonal_tests.sh" + gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="ulimit -n {_ULIMIT}; COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} CROSS_REGION_BUCKET=${_CROSS_REGION_BUCKET} _PR_NUMBER=${_PR_NUMBER} bash run_zonal_tests.sh" EXIT_CODE=$? set -e diff --git a/google/cloud/storage/asyncio/async_multi_range_downloader.py b/google/cloud/storage/asyncio/async_multi_range_downloader.py index 3ee773a04..d4ba6727b 100644 --- a/google/cloud/storage/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/asyncio/async_multi_range_downloader.py @@ -228,6 +228,8 @@ def __init__( self._read_id_to_download_ranges_id = {} self._download_ranges_id_to_pending_read_ids = {} self.persisted_size: Optional[int] = None # updated after opening the stream + self._open_retries: int = 0 + async def __aenter__(self): """Opens the underlying bidi-gRPC connection to read from the object.""" @@ -257,13 +259,18 @@ async def open( raise ValueError("Underlying bidi-gRPC stream is already open") if retry_policy is None: + def on_error_wrapper(exc): + self._open_retries += 1 + self._on_open_error(exc) + retry_policy = AsyncRetry( - predicate=_is_read_retryable, on_error=self._on_open_error + predicate=_is_read_retryable, on_error=on_error_wrapper ) else: original_on_error = retry_policy._on_error def combined_on_error(exc): + self._open_retries += 1 self._on_open_error(exc) if original_on_error: original_on_error(exc) diff --git a/tests/system/test_zonal.py b/tests/system/test_zonal.py index 49c0ac7da..01d9a7c01 100644 --- a/tests/system/test_zonal.py +++ b/tests/system/test_zonal.py @@ -31,6 +31,7 @@ # TODO: replace this with a fixture once zonal bucket creation / deletion # is supported in grpc client or json client client. _ZONAL_BUCKET = os.getenv("ZONAL_BUCKET") +_CROSS_REGION_BUCKET = os.getenv("CROSS_REGION_BUCKET") _BYTES_TO_UPLOAD = b"dummy_bytes_to_write_read_and_delete_appendable_object" @@ -82,6 +83,51 @@ def _get_equal_dist(a: int, b: int) -> tuple[int, int]: return a + step, a + 2 * step +@pytest.mark.parametrize( + "object_size", + [ + 256, # less than _chunk size + 10 * 1024 * 1024, # less than _MAX_BUFFER_SIZE_BYTES + 20 * 1024 * 1024, # greater than _MAX_BUFFER_SIZE + ], +) +def test_basic_wrd_x_region( + storage_client, + blobs_to_delete, + object_size, + event_loop, + grpc_client, +): + object_name = f"test_basic_wrd-{str(uuid.uuid4())}" + + async def _run(): + object_data = os.urandom(object_size) + object_checksum = google_crc32c.value(object_data) + + writer = AsyncAppendableObjectWriter(grpc_client, _CROSS_REGION_BUCKET, object_name) + await writer.open() + await writer.append(object_data) + object_metadata = await writer.close(finalize_on_close=True) + assert object_metadata.size == object_size + assert int(object_metadata.checksums.crc32c) == object_checksum + + buffer = BytesIO() + mrd = AsyncMultiRangeDownloader(grpc_client, _CROSS_REGION_BUCKET, object_name) + async with mrd: + assert mrd._open_retries == 1 + # (0, 0) means read the whole object + await mrd.download_ranges([(0, 0, buffer)]) + assert mrd.persisted_size == object_size + + assert buffer.getvalue() == object_data + + # Clean up; use json client (i.e. `storage_client` fixture) to delete. + blobs_to_delete.append(storage_client.bucket(_CROSS_REGION_BUCKET).blob(object_name)) + del writer + gc.collect() + + event_loop.run_until_complete(_run()) + @pytest.mark.parametrize( "object_size", [ From 8dd0a8088f11adf4da24f07f5becf5247a924b5e Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Tue, 10 Mar 2026 10:55:03 +0530 Subject: [PATCH 492/509] feat: Triger bidi conformance tests (#1757) feat: Triger bidi conformance tests Changes / fixes - When (read/write) stream breaks, don't do `.close` on it. (this leads to reading the same error message again and again until retry loop times out) - Bidi Conf test were ran directly as a module , change that so that they get triggered in Kokoro (done that by adding `test_` so that pytest pickup the tests) - Provide a way to create anonymous connection in grpc client. - Unit tests and other minor changes. ~blocked because of b/489420625~ --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../asyncio/async_appendable_object_writer.py | 6 +- .../storage/asyncio/async_grpc_client.py | 23 +++ .../asyncio/async_multi_range_downloader.py | 9 +- .../retry/bidi_stream_retry_manager.py | 2 +- noxfile.py | 9 +- tests/conformance/_utils.py | 32 ++++ tests/conformance/test_bidi_reads.py | 167 +++++++++++------- tests/conformance/test_bidi_writes.py | 127 +++++++------ .../test_async_appendable_object_writer.py | 65 ++++++- tests/unit/asyncio/test_async_grpc_client.py | 56 +++--- .../test_async_multi_range_downloader.py | 132 +++++++++++++- 11 files changed, 447 insertions(+), 181 deletions(-) create mode 100644 tests/conformance/_utils.py diff --git a/google/cloud/storage/asyncio/async_appendable_object_writer.py b/google/cloud/storage/asyncio/async_appendable_object_writer.py index 56b3a0ec5..c65209680 100644 --- a/google/cloud/storage/asyncio/async_appendable_object_writer.py +++ b/google/cloud/storage/asyncio/async_appendable_object_writer.py @@ -43,7 +43,6 @@ _extract_bidi_writes_redirect_proto, ) - _MAX_CHUNK_SIZE_BYTES = 2 * 1024 * 1024 # 2 MiB _DEFAULT_FLUSH_INTERVAL_BYTES = 16 * 1024 * 1024 # 16 MiB _BIDI_WRITE_REDIRECTED_TYPE_URL = ( @@ -289,8 +288,7 @@ async def _do_open(): await self.write_obj_stream.close() except Exception as e: logger.warning( - "Error closing previous write stream during open retry. Got exception: ", - {e}, + f"Error closing previous write stream during open retry. Got exception: {e}" ) self.write_obj_stream = None self._is_stream_open = False @@ -383,8 +381,6 @@ async def generator(): logger.info( f"Re-opening the stream with attempt_count: {attempt_count}" ) - if self.write_obj_stream and self.write_obj_stream.is_stream_open: - await self.write_obj_stream.close() current_metadata = list(metadata) if metadata else [] if write_state.routing_token: diff --git a/google/cloud/storage/asyncio/async_grpc_client.py b/google/cloud/storage/asyncio/async_grpc_client.py index 640e7fe38..88566b246 100644 --- a/google/cloud/storage/asyncio/async_grpc_client.py +++ b/google/cloud/storage/asyncio/async_grpc_client.py @@ -19,6 +19,8 @@ DEFAULT_CLIENT_INFO, ) from google.cloud.storage import __version__ +import grpc +from google.auth import credentials as auth_credentials class AsyncGrpcClient: @@ -52,6 +54,12 @@ def __init__( *, attempt_direct_path=True, ): + if isinstance(credentials, auth_credentials.AnonymousCredentials): + self._grpc_client = self._create_anonymous_client( + client_options, credentials + ) + return + if client_info is None: client_info = DEFAULT_CLIENT_INFO client_info.client_library_version = __version__ @@ -68,6 +76,21 @@ def __init__( attempt_direct_path=attempt_direct_path, ) + def _create_anonymous_client(self, client_options, credentials): + channel = grpc.aio.insecure_channel(client_options.api_endpoint) + transport = storage_v2.services.storage.transports.StorageGrpcAsyncIOTransport( + channel=channel, credentials=credentials + ) + return storage_v2.StorageAsyncClient(transport=transport) + + @classmethod + def _create_insecure_grpc_client(cls, client_options): + return cls( + credentials=auth_credentials.AnonymousCredentials(), + client_options=client_options, + attempt_direct_path=False, + ) + def _create_async_grpc_client( self, credentials=None, diff --git a/google/cloud/storage/asyncio/async_multi_range_downloader.py b/google/cloud/storage/asyncio/async_multi_range_downloader.py index d4ba6727b..51afd255b 100644 --- a/google/cloud/storage/asyncio/async_multi_range_downloader.py +++ b/google/cloud/storage/asyncio/async_multi_range_downloader.py @@ -41,7 +41,6 @@ from google.cloud import _storage_v2 from google.cloud.storage._helpers import generate_random_56_bit_integer - _MAX_READ_RANGES_PER_BIDI_READ_REQUEST = 100 _BIDI_READ_REDIRECTED_TYPE_URL = ( "type.googleapis.com/google.storage.v2.BidiReadObjectRedirectedError" @@ -230,7 +229,6 @@ def __init__( self.persisted_size: Optional[int] = None # updated after opening the stream self._open_retries: int = 0 - async def __aenter__(self): """Opens the underlying bidi-gRPC connection to read from the object.""" await self.open() @@ -243,6 +241,7 @@ async def __aexit__(self, exc_type, exc_val, exc_tb): def _on_open_error(self, exc): """Extracts routing token and read handle on redirect error during open.""" + logger.warning(f"Error occurred while opening MRD: {exc}") routing_token, read_handle = _handle_redirect(exc) if routing_token: self._routing_token = routing_token @@ -432,7 +431,7 @@ async def generator(): if attempt_count > 1: logger.info( - f"Resuming download (attempt {attempt_count - 1}) for {len(requests)} ranges." + f"Resuming download (attempt {attempt_count}) for {len(requests)} ranges." ) async with lock: @@ -453,11 +452,7 @@ async def generator(): logger.info( f"Re-opening stream with routing token: {current_token}" ) - # Close existing stream if any - if self.read_obj_str and self.read_obj_str.is_stream_open: - await self.read_obj_str.close() - # Re-initialize stream self.read_obj_str = _AsyncReadObjectStream( client=self.client.grpc_client, bucket_name=self.bucket_name, diff --git a/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py b/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py index 23bffb63d..947ee74c1 100644 --- a/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py +++ b/google/cloud/storage/asyncio/retry/bidi_stream_retry_manager.py @@ -58,7 +58,7 @@ async def attempt(): return except Exception as e: if retry_policy._predicate(e): - logger.info( + logger.warning( f"Bidi stream operation failed: {e}. Attempting state recovery and retry." ) await self._strategy.recover_state_on_failure(e, state) diff --git a/noxfile.py b/noxfile.py index d7ca4dd88..6bce85327 100644 --- a/noxfile.py +++ b/noxfile.py @@ -236,6 +236,7 @@ def conftest_retry(session): session.install( "pytest", "pytest-xdist", + "pytest-asyncio", "grpcio", "grpcio-status", "grpc-google-iam-v1", @@ -247,13 +248,15 @@ def conftest_retry(session): # Run #CPU processes in parallel if no test session arguments are passed in. if session.posargs: test_cmd = [ - "py.test", - "--quiet", + "pytest", + "-vv", + "-s", + # "--quiet", conformance_test_folder_path, *session.posargs, ] else: - test_cmd = ["py.test", "-n", "auto", "--quiet", conformance_test_folder_path] + test_cmd = ["pytest", "-vv", "-s", "-n", "auto", conformance_test_folder_path] # Run py.test against the conformance tests. session.run(*test_cmd, env={"DOCKER_API_VERSION": "1.39"}) diff --git a/tests/conformance/_utils.py b/tests/conformance/_utils.py new file mode 100644 index 000000000..496b1c9e0 --- /dev/null +++ b/tests/conformance/_utils.py @@ -0,0 +1,32 @@ +import time +import requests +import traceback + +def start_grpc_server(grpc_endpoint, http_endpoint): + """Starts the testbench gRPC server if it's not already running. + + this essentially makes - + + `curl -s --retry 5 --retry-max-time 40 "http://localhost:9000/start_grpc?port=8888"` + """ + start_time = time.time() + max_time = 40 + retries = 5 + port = grpc_endpoint.split(":")[-1] + url = f"{http_endpoint}/start_grpc?port={port}" + + for i in range(retries): + try: + response = requests.get(url, timeout=10) + if response.status_code == 200: + return + except requests.exceptions.RequestException: + print("Failed to create grpc server", traceback.format_exc()) + raise + + elapsed_time = time.time() - start_time + if elapsed_time >= max_time: + raise RuntimeError("Failed to start gRPC server within the time limit.") + + # backoff + time.sleep(1) diff --git a/tests/conformance/test_bidi_reads.py b/tests/conformance/test_bidi_reads.py index 4157182cb..efb9671a3 100644 --- a/tests/conformance/test_bidi_reads.py +++ b/tests/conformance/test_bidi_reads.py @@ -1,23 +1,68 @@ -import asyncio import io +import subprocess +import time +import traceback +import urllib import uuid + import grpc +import pytest import requests - -from google.api_core import exceptions +from google.api_core import client_options, exceptions from google.auth import credentials as auth_credentials + from google.cloud import _storage_v2 as storage_v2 +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from google.cloud.storage.asyncio.async_multi_range_downloader import \ + AsyncMultiRangeDownloader +from tests.conformance._utils import start_grpc_server -from google.cloud.storage._experimental.asyncio.async_multi_range_downloader import ( - AsyncMultiRangeDownloader, +# --- Configuration --- + + +TEST_BENCH_ENDPOINT = ( + "http://localhost:9001" # 9000 in VM is taken by test_conformance.py ) +_PORT = urllib.parse.urlsplit(TEST_BENCH_ENDPOINT).port +_GRPC_PORT = 8888 -# --- Configuration --- PROJECT_NUMBER = "12345" # A dummy project number is fine for the testbench. -GRPC_ENDPOINT = "localhost:8888" -HTTP_ENDPOINT = "http://localhost:9000" +GRPC_ENDPOINT = f"localhost:{_GRPC_PORT}" CONTENT_LENGTH = 1024 * 10 # 10 KB +_DEFAULT_IMAGE_NAME = "gcr.io/cloud-devrel-public-resources/storage-testbench" +_DEFAULT_IMAGE_TAG = "latest" +_DOCKER_IMAGE = f"{_DEFAULT_IMAGE_NAME}:{_DEFAULT_IMAGE_TAG}" +_PULL_CMD = ["docker", "pull", _DOCKER_IMAGE] +_RUN_CMD = [ + "docker", + "run", + "--name", + "bidi_reads_container", + "--rm", + "-d", + "-p", + f"{_PORT}:9000", + "-p", + f"{_GRPC_PORT}:{_GRPC_PORT}", + _DOCKER_IMAGE, +] +_DOCKER_STOP_CMD = [ + "docker", + "stop", + "bidi_reads_container", +] + + +@pytest.fixture(scope="module") +def testbench(): + subprocess.run(_PULL_CMD) + proc = subprocess.Popen(_RUN_CMD) + time.sleep(10) + yield GRPC_ENDPOINT, TEST_BENCH_ENDPOINT + subprocess.run(_DOCKER_STOP_CMD) + proc.kill() + def _is_retriable(exc): """Predicate for identifying retriable errors.""" @@ -32,9 +77,7 @@ def _is_retriable(exc): ) -async def run_test_scenario( - gapic_client, http_client, bucket_name, object_name, scenario -): +async def run_test_scenario(http_client, bucket_name, object_name, scenario): """Runs a single fault-injection test scenario.""" print(f"\n--- RUNNING SCENARIO: {scenario['name']} ---") @@ -45,13 +88,18 @@ async def run_test_scenario( "instructions": {scenario["method"]: [scenario["instruction"]]}, "transport": "GRPC", } - resp = http_client.post(f"{HTTP_ENDPOINT}/retry_test", json=retry_test_config) + resp = http_client.post( + f"{TEST_BENCH_ENDPOINT}/retry_test", json=retry_test_config + ) resp.raise_for_status() retry_test_id = resp.json()["id"] # 2. Set up downloader and metadata for fault injection. + grpc_client = AsyncGrpcClient._create_insecure_grpc_client( + client_options=client_options.ClientOptions(api_endpoint=GRPC_ENDPOINT), + ) downloader = await AsyncMultiRangeDownloader.create_mrd( - gapic_client, bucket_name, object_name + grpc_client, bucket_name, object_name ) fault_injection_metadata = (("x-retry-test-id", retry_test_id),) @@ -79,11 +127,17 @@ async def run_test_scenario( finally: # 4. Clean up the Retry Test resource. if retry_test_id: - http_client.delete(f"{HTTP_ENDPOINT}/retry_test/{retry_test_id}") + http_client.delete(f"{TEST_BENCH_ENDPOINT}/retry_test/{retry_test_id}") -async def main(): +@pytest.mark.asyncio +async def test_bidi_reads(testbench): """Main function to set up resources and run all test scenarios.""" + grpc_endpoint, test_bench_endpoint = testbench + print("starting grpc server", grpc_endpoint, test_bench_endpoint) + start_grpc_server( + grpc_endpoint, test_bench_endpoint + ) # Ensure the testbench gRPC server is running before this test executes. channel = grpc.aio.insecure_channel(GRPC_ENDPOINT) creds = auth_credentials.AnonymousCredentials() transport = storage_v2.services.storage.transports.StorageGrpcAsyncIOTransport( @@ -97,42 +151,12 @@ async def main(): # Define all test scenarios test_scenarios = [ - { - "name": "Retry on Service Unavailable (503)", - "method": "storage.objects.get", - "instruction": "return-503", - "expected_error": None, - }, - { - "name": "Retry on 500", - "method": "storage.objects.get", - "instruction": "return-500", - "expected_error": None, - }, - { - "name": "Retry on 504", - "method": "storage.objects.get", - "instruction": "return-504", - "expected_error": None, - }, - { - "name": "Retry on 429", - "method": "storage.objects.get", - "instruction": "return-429", - "expected_error": None, - }, { "name": "Smarter Resumption: Retry 503 after partial data", "method": "storage.objects.get", "instruction": "return-broken-stream-after-2K", "expected_error": None, }, - { - "name": "Retry on BidiReadObjectRedirectedError", - "method": "storage.objects.get", - "instruction": "redirect-send-handle-and-token-tokenval", # Testbench instruction for redirect - "expected_error": None, - }, ] try: @@ -161,9 +185,7 @@ async def write_req_gen(): # Run all defined test scenarios. for scenario in test_scenarios: - await run_test_scenario( - gapic_client, http_client, bucket_name, object_name, scenario - ) + await run_test_scenario(http_client, bucket_name, object_name, scenario) # Define and run test scenarios specifically for the open() method open_test_scenarios = [ @@ -185,16 +207,33 @@ async def write_req_gen(): "instruction": "return-401", "expected_error": exceptions.Unauthorized, }, + { + "name": "Retry on 500", + "method": "storage.objects.get", + "instruction": "return-500", + "expected_error": None, + }, + { + "name": "Retry on 504", + "method": "storage.objects.get", + "instruction": "return-504", + "expected_error": None, + }, + { + "name": "Retry on 429", + "method": "storage.objects.get", + "instruction": "return-429", + "expected_error": None, + }, ] for scenario in open_test_scenarios: await run_open_test_scenario( - gapic_client, http_client, bucket_name, object_name, scenario + http_client, bucket_name, object_name, scenario ) - except Exception: - import traceback - - traceback.print_exc() + except Exception as e: + print(f"Test failed with error: {e}. Traceback: {traceback.format_exc()}") + raise e finally: # Clean up the test bucket. try: @@ -211,11 +250,9 @@ async def write_req_gen(): print(f"Warning: Cleanup failed: {e}") -async def run_open_test_scenario( - gapic_client, http_client, bucket_name, object_name, scenario -): +async def run_open_test_scenario(http_client, bucket_name, object_name, scenario): """Runs a fault-injection test scenario specifically for the open() method.""" - print(f"\n--- RUNNING SCENARIO: {scenario['name']} ---") + print(f"\n--- RUNNING OPEN SCENARIO: {scenario['name']} ---") retry_test_id = None try: @@ -224,18 +261,22 @@ async def run_open_test_scenario( "instructions": {scenario["method"]: [scenario["instruction"]]}, "transport": "GRPC", } - resp = http_client.post(f"{HTTP_ENDPOINT}/retry_test", json=retry_test_config) + resp = http_client.post( + f"{TEST_BENCH_ENDPOINT}/retry_test", json=retry_test_config + ) resp.raise_for_status() retry_test_id = resp.json()["id"] - print(f"Retry Test created with ID: {retry_test_id}") # 2. Set up metadata for fault injection. fault_injection_metadata = (("x-retry-test-id", retry_test_id),) # 3. Execute the open (via create_mrd) and assert the outcome. try: + grpc_client = AsyncGrpcClient._create_insecure_grpc_client( + client_options=client_options.ClientOptions(api_endpoint=GRPC_ENDPOINT), + ) downloader = await AsyncMultiRangeDownloader.create_mrd( - gapic_client, + grpc_client, bucket_name, object_name, metadata=fault_injection_metadata, @@ -259,8 +300,4 @@ async def run_open_test_scenario( finally: # 4. Clean up the Retry Test resource. if retry_test_id: - http_client.delete(f"{HTTP_ENDPOINT}/retry_test/{retry_test_id}") - - -if __name__ == "__main__": - asyncio.run(main()) + http_client.delete(f"{TEST_BENCH_ENDPOINT}/retry_test/{retry_test_id}") diff --git a/tests/conformance/test_bidi_writes.py b/tests/conformance/test_bidi_writes.py index 90dfaf5f8..852f43bfc 100644 --- a/tests/conformance/test_bidi_writes.py +++ b/tests/conformance/test_bidi_writes.py @@ -1,22 +1,67 @@ -import asyncio +import subprocess +import time +import urllib import uuid + import grpc +import pytest import requests - -from google.api_core import exceptions +from google.api_core import client_options, exceptions +from google.api_core.retry_async import AsyncRetry from google.auth import credentials as auth_credentials + from google.cloud import _storage_v2 as storage_v2 +from google.cloud.storage.asyncio.async_appendable_object_writer import \ + AsyncAppendableObjectWriter +from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient +from tests.conformance._utils import start_grpc_server -from google.api_core.retry_async import AsyncRetry -from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import ( - AsyncAppendableObjectWriter, +# --- Configuration --- +TEST_BENCH_ENDPOINT = ( + "http://localhost:9002" # 9000 in VM is taken by test_conformance.py, 9001 by reads ) +_PORT = urllib.parse.urlsplit(TEST_BENCH_ENDPOINT).port +_GRPC_PORT = 8888 -# --- Configuration --- PROJECT_NUMBER = "12345" # A dummy project number is fine for the testbench. -GRPC_ENDPOINT = "localhost:8888" -HTTP_ENDPOINT = "http://localhost:9000" -CONTENT = b"A" * 1024 * 10 # 10 KB +GRPC_ENDPOINT = f"localhost:{_GRPC_PORT}" +HTTP_ENDPOINT = TEST_BENCH_ENDPOINT + +_DEFAULT_IMAGE_NAME = "gcr.io/cloud-devrel-public-resources/storage-testbench" +_DEFAULT_IMAGE_TAG = "latest" +_DOCKER_IMAGE = f"{_DEFAULT_IMAGE_NAME}:{_DEFAULT_IMAGE_TAG}" +_PULL_CMD = ["docker", "pull", _DOCKER_IMAGE] +_RUN_CMD = [ + "docker", + "run", + "--name", + "bidi_writes_container", + "--rm", + "-d", + "-p", + f"{_PORT}:9000", + "-p", + f"{_GRPC_PORT}:8888", + _DOCKER_IMAGE, +] +_DOCKER_STOP_CMD = [ + "docker", + "stop", + "bidi_writes_container", +] + + +@pytest.fixture(scope="module") +def testbench(): + subprocess.run(_PULL_CMD) + proc = subprocess.Popen(_RUN_CMD) + time.sleep(10) + yield GRPC_ENDPOINT, HTTP_ENDPOINT + subprocess.run(_DOCKER_STOP_CMD) + proc.kill() + + +CONTENT = b"A" * 1024 * 1024 * 10 # 10 MiB def _is_retryable(exc): @@ -70,10 +115,14 @@ def on_retry_error(exc): retry_test_id = resp.json()["id"] # 2. Set up writer and metadata for fault injection. + grpc_client = AsyncGrpcClient._create_insecure_grpc_client( + client_options=client_options.ClientOptions(api_endpoint=GRPC_ENDPOINT), + ) writer = AsyncAppendableObjectWriter( - gapic_client, + grpc_client, bucket_name, object_name, + writer_options={"FLUSH_INTERVAL_BYTES": 2 * 1024 * 1024}, ) fault_injection_metadata = (("x-retry-test-id", retry_test_id),) @@ -121,21 +170,20 @@ def on_retry_error(exc): ): raise - if not use_default: - assert ( - retry_count == 0 - ), f"Retry was incorrectly triggered for non-retriable error in {scenario['name']}!" - print(f"Success: caught expected exception for {scenario['name']}: {e}") - finally: # 5. Clean up the Retry Test resource. if retry_test_id: http_client.delete(f"{HTTP_ENDPOINT}/retry_test/{retry_test_id}") -async def main(): +@pytest.mark.asyncio +async def test_bidi_writes(testbench): """Main function to set up resources and run all test scenarios.""" - channel = grpc.aio.insecure_channel(GRPC_ENDPOINT) + grpc_endpoint, http_endpoint = testbench + start_grpc_server( + grpc_endpoint, http_endpoint + ) # Ensure the testbench gRPC server is running before this test executes. + channel = grpc.aio.insecure_channel(grpc_endpoint) creds = auth_credentials.AnonymousCredentials() transport = storage_v2.services.storage.transports.StorageGrpcAsyncIOTransport( channel=channel, @@ -173,10 +221,11 @@ async def main(): "instruction": "return-429", "expected_error": None, }, + # TODO: b/490280918 { "name": "Smarter Resumption: Retry 503 after partial data", "method": "storage.objects.insert", - "instruction": "return-503-after-2K", + "instruction": "return-503-after-3072K", # 3072 KiB == 3 MiB "expected_error": None, }, { @@ -185,40 +234,6 @@ async def main(): "instruction": "redirect-send-handle-and-token-tokenval", "expected_error": None, }, - { - "name": "Fail on 401", - "method": "storage.objects.insert", - "instruction": "return-401", - "expected_error": exceptions.Unauthorized, - }, - { - "name": "Default Policy: Retry on 503", - "method": "storage.objects.insert", - "instruction": "return-503", - "expected_error": None, - "use_default_policy": True, - }, - { - "name": "Default Policy: Retry on 503", - "method": "storage.objects.insert", - "instruction": "return-500", - "expected_error": None, - "use_default_policy": True, - }, - { - "name": "Default Policy: Retry on BidiWriteObjectRedirectedError", - "method": "storage.objects.insert", - "instruction": "redirect-send-handle-and-token-tokenval", - "expected_error": None, - "use_default_policy": True, - }, - { - "name": "Default Policy: Smarter Ressumption", - "method": "storage.objects.insert", - "instruction": "return-503-after-2K", - "expected_error": None, - "use_default_policy": True, - }, ] try: @@ -261,7 +276,3 @@ async def main(): await gapic_client.delete_bucket(request=delete_bucket_req) except Exception as e: print(f"Warning: Cleanup failed: {e}") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 0c8fe4375..51ce43e6e 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -218,6 +218,48 @@ def test_on_open_error_redirection(self, mock_appendable_writer): assert writer.write_handle.handle == b"h1" assert writer.generation == 777 + @pytest.mark.asyncio + async def test_open_closes_existing_stream(self, mock_appendable_writer): + """Verify proper cleanup of existing stream on re-open.""" + writer = self._make_one(mock_appendable_writer["mock_client"]) + # We simulate a state where write_obj_stream exists but we are opening (e.g. retry or stale) + writer._is_stream_open = False + # Set an existing stream + old_stream = mock.AsyncMock() + old_stream.is_stream_open = True + writer.write_obj_stream = old_stream + + # Mock the creation of NEW stream to avoid overwriting our old_stream reference too early if we needed it, + # but here we just want to verify old_stream.close() is called. + + # Act + await writer.open() + + # Assert + old_stream.close.assert_awaited_once() + assert writer.write_obj_stream != old_stream + assert writer._is_stream_open + + @pytest.mark.asyncio + async def test_open_logs_warning_on_close_error(self, mock_appendable_writer): + """Verify logging when closing existing stream fails.""" + writer = self._make_one(mock_appendable_writer["mock_client"]) + old_stream = mock.AsyncMock() + old_stream.is_stream_open = True + old_stream.close.side_effect = ValueError("close failed") + writer.write_obj_stream = old_stream + writer._is_stream_open = False + + with mock.patch( + "google.cloud.storage.asyncio.async_appendable_object_writer.logger" + ) as mock_logger: + await writer.open() + + mock_logger.warning.assert_called_once() + args, _ = mock_logger.warning.call_args + assert "Error closing previous write stream" in args[0] + assert "close failed" in args[0] + # ------------------------------------------------------------------------- # Append Tests # ------------------------------------------------------------------------- @@ -246,9 +288,7 @@ async def test_append_data_less_than_flush_interval(self, mock_appendable_writer ], ) @pytest.mark.asyncio - async def test_append( - self, data_len, mock_appendable_writer - ): + async def test_append(self, data_len, mock_appendable_writer): """Verify append orchestrates manager and drives the internal generator.""" # Arrange writer = self._make_one(mock_appendable_writer["mock_client"]) @@ -272,10 +312,19 @@ async def test_append( # Assert expected_recv_count = data_len // _DEFAULT_FLUSH_INTERVAL_BYTES assert writer.offset == data_len - assert writer.bytes_appended_since_last_flush == data_len % _DEFAULT_FLUSH_INTERVAL_BYTES - assert writer.persisted_size == expected_recv_count*_DEFAULT_FLUSH_INTERVAL_BYTES - assert writer.write_obj_stream.send.await_count == -(-data_len // _MAX_CHUNK_SIZE_BYTES) # Ceiling division for number of chunks - assert writer.write_obj_stream.recv.await_count == expected_recv_count # Expect 1 recv per flush interval + assert ( + writer.bytes_appended_since_last_flush + == data_len % _DEFAULT_FLUSH_INTERVAL_BYTES + ) + assert ( + writer.persisted_size == expected_recv_count * _DEFAULT_FLUSH_INTERVAL_BYTES + ) + assert writer.write_obj_stream.send.await_count == -( + -data_len // _MAX_CHUNK_SIZE_BYTES + ) # Ceiling division for number of chunks + assert ( + writer.write_obj_stream.recv.await_count == expected_recv_count + ) # Expect 1 recv per flush interval @pytest.mark.asyncio async def test_append_recovery_reopens_stream(self, mock_appendable_writer): @@ -318,7 +367,7 @@ async def mock_execute(state, policy): MockManager.return_value.execute.side_effect = mock_execute await writer.append(b"0123456789") - mock_appendable_writer["mock_stream"].close.assert_awaited() + # mock_appendable_writer["mock_stream"].close.assert_awaited() # Removed because open() is mocked mock_writer_open.assert_awaited() assert writer.persisted_size == 5 diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index f193acb60..06cb232d5 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -19,6 +19,7 @@ from google.api_core import client_info as client_info_lib from google.cloud.storage.asyncio import async_grpc_client from google.cloud.storage import __version__ +from google.api_core import client_options def _make_credentials(spec=None): @@ -157,36 +158,31 @@ def test_grpc_client_property(self, mock_grpc_gapic_client): assert retrieved_client is mock_grpc_gapic_client.return_value @mock.patch("google.cloud._storage_v2.StorageAsyncClient") - def test_grpc_client_with_anon_creds(self, mock_grpc_gapic_client): + @mock.patch( + "google.cloud.storage.asyncio.async_grpc_client.grpc.aio.insecure_channel" + ) + def test_grpc_client_with_anon_creds( + self, mock_insecure_channel, mock_async_storage_client + ): # Arrange - mock_transport_cls = mock.MagicMock() - mock_grpc_gapic_client.get_transport_class.return_value = mock_transport_cls - channel_sentinel = mock.sentinel.channel - - mock_transport_cls.create_channel.return_value = channel_sentinel - mock_transport_cls.return_value = mock.sentinel.transport + mock_channel = mock.MagicMock() + mock_insecure_channel.return_value = mock_channel # Act - anonymous_creds = AnonymousCredentials() - client = async_grpc_client.AsyncGrpcClient(credentials=anonymous_creds) - retrieved_client = client.grpc_client + client = async_grpc_client.AsyncGrpcClient( + client_options=client_options.ClientOptions( + api_endpoint="my-grpc-endpoint" + ), + credentials=AnonymousCredentials(), + ) # Assert - assert retrieved_client is mock_grpc_gapic_client.return_value - - kwargs = mock_grpc_gapic_client.call_args.kwargs - client_info = kwargs["client_info"] - agent_version = f"gcloud-python/{__version__}" - assert agent_version in client_info.user_agent - primary_user_agent = client_info.to_user_agent() - expected_options = (("grpc.primary_user_agent", primary_user_agent),) + assert client.grpc_client is mock_async_storage_client.return_value + mock_insecure_channel.assert_called_once_with("my-grpc-endpoint") - mock_transport_cls.create_channel.assert_called_once_with( - attempt_direct_path=True, - credentials=anonymous_creds, - options=expected_options, - ) - mock_transport_cls.assert_called_once_with(channel=channel_sentinel) + kwargs = mock_async_storage_client.call_args.kwargs + transport = kwargs["transport"] + assert isinstance(transport._credentials, AnonymousCredentials) @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_user_agent_with_custom_client_info(self, mock_async_storage_client): @@ -221,9 +217,7 @@ async def test_delete_object(self, mock_async_storage_client): mock_gapic_client = mock.AsyncMock() mock_async_storage_client.return_value = mock_gapic_client - client = async_grpc_client.AsyncGrpcClient( - credentials=_make_credentials(spec=AnonymousCredentials) - ) + client = async_grpc_client.AsyncGrpcClient(credentials=_make_credentials()) bucket_name = "bucket" object_name = "object" @@ -264,9 +258,7 @@ async def test_get_object(self, mock_async_storage_client): mock_gapic_client = mock.AsyncMock() mock_async_storage_client.return_value = mock_gapic_client - client = async_grpc_client.AsyncGrpcClient( - credentials=_make_credentials(spec=AnonymousCredentials) - ) + client = async_grpc_client.AsyncGrpcClient(credentials=_make_credentials()) bucket_name = "bucket" object_name = "object" @@ -293,9 +285,7 @@ async def test_get_object_with_all_parameters(self, mock_async_storage_client): mock_gapic_client = mock.AsyncMock() mock_async_storage_client.return_value = mock_gapic_client - client = async_grpc_client.AsyncGrpcClient( - credentials=_make_credentials(spec=AnonymousCredentials) - ) + client = async_grpc_client.AsyncGrpcClient(credentials=_make_credentials()) bucket_name = "bucket" object_name = "object" diff --git a/tests/unit/asyncio/test_async_multi_range_downloader.py b/tests/unit/asyncio/test_async_multi_range_downloader.py index 379e6410b..f813c8a39 100644 --- a/tests/unit/asyncio/test_async_multi_range_downloader.py +++ b/tests/unit/asyncio/test_async_multi_range_downloader.py @@ -27,7 +27,6 @@ from io import BytesIO from google.cloud.storage.exceptions import DataCorruption - _TEST_BUCKET_NAME = "test-bucket" _TEST_OBJECT_NAME = "test-object" _TEST_OBJECT_SIZE = 1024 * 1024 # 1 MiB @@ -93,6 +92,7 @@ async def test_create_mrd(self, mock_cls_async_read_object_stream): assert mrd.read_handle == _TEST_READ_HANDLE assert mrd.persisted_size == _TEST_OBJECT_SIZE assert mrd.is_stream_open + assert mrd._open_retries == 0 @mock.patch( "google.cloud.storage.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" @@ -446,3 +446,133 @@ async def test_create_mrd_with_both_generation_and_generation_number(self): generation=_TEST_GENERATION_NUMBER, generation_number=_TEST_GENERATION_NUMBER, ) + + @mock.patch("google.cloud.storage.asyncio.async_multi_range_downloader.AsyncRetry") + @mock.patch( + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @pytest.mark.asyncio + async def test_open_retries_increment( + self, mock_cls_async_read_object_stream, mock_async_retry + ): + # Arrange + # Configure AsyncRetry mock to return a pass-through decorator so we can await the result + mock_policy = mock.MagicMock() + mock_policy.side_effect = lambda f: f + mock_async_retry.return_value = mock_policy + + mrd, _ = await self._make_mock_mrd(mock_cls_async_read_object_stream) + # _make_mock_mrd calls create_mrd -> open. + # We need to test logic where retry happens. + + # Create fresh MRD + mock_client = mock.MagicMock() + mock_client.grpc_client = mock.AsyncMock() + mrd = AsyncMultiRangeDownloader( + mock_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + # Mock stream + mock_stream = mock_cls_async_read_object_stream.return_value + mock_stream.open = AsyncMock() + + # Action: We want to capture the on_error passed to AsyncRetry + await mrd.open() + + # Assert + # Check that AsyncRetry was initialized with a wrapper + call_args = mock_async_retry.call_args + assert call_args is not None + _, kwargs = call_args + on_error = kwargs.get("on_error") + assert on_error is not None + + # Simulate error to trigger increment + assert mrd._open_retries == 0 + on_error(ValueError("test")) + assert mrd._open_retries == 1 + + @mock.patch("google.cloud.storage.asyncio.async_multi_range_downloader.logger") + @pytest.mark.asyncio + async def test_on_open_error_logs_warning(self, mock_logger): + # Arrange + mock_client = mock.MagicMock() + mrd = AsyncMultiRangeDownloader( + mock_client, _TEST_BUCKET_NAME, _TEST_OBJECT_NAME + ) + exc = ValueError("test error") + + # Act + mrd._on_open_error(exc) + + # Assert + mock_logger.warning.assert_called_once_with( + f"Error occurred while opening MRD: {exc}" + ) + + @mock.patch("google.cloud.storage.asyncio.async_multi_range_downloader.logger") + @mock.patch( + "google.cloud.storage.asyncio.async_multi_range_downloader.generate_random_56_bit_integer" + ) + @mock.patch( + "google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream" + ) + @pytest.mark.asyncio + async def test_download_ranges_resumption_logging( + self, mock_cls_async_read_object_stream, mock_random_int, mock_logger + ): + # Arrange + mock_mrd, _ = await self._make_mock_mrd(mock_cls_async_read_object_stream) + + mock_mrd.read_obj_str.send = AsyncMock() + mock_mrd.read_obj_str.recv = AsyncMock() + + from google.api_core import exceptions as core_exceptions + + retryable_exc = core_exceptions.ServiceUnavailable("Retry me") + + # mock send to raise exception ONCE then succeed + mock_mrd.read_obj_str.send.side_effect = [ + retryable_exc, + None, # Success on second try + ] + + # mock recv for second try + mock_mrd.read_obj_str.recv.side_effect = [ + _storage_v2.BidiReadObjectResponse( + object_data_ranges=[ + _storage_v2.ObjectRangeData( + checksummed_data=_storage_v2.ChecksummedData( + content=b"data", crc32c=123 + ), + range_end=True, + read_range=_storage_v2.ReadRange( + read_offset=0, read_length=4, read_id=123 + ), + ) + ] + ), + None, + ] + + mock_random_int.return_value = 123 + + # Act + buffer = BytesIO() + # Patch Checksum where it is likely used (reads_resumption_strategy or similar), + # but actually if we use google_crc32c directly, we should patch that or provide valid CRC. + # Since we can't reliably predict where Checksum is imported/used without more digging, + # let's provide a valid CRC for b"data". + # Checksum(b"data").digest() -> needs to match crc32c=123. + # But we can't force b"data" to have crc=123. + # So we MUST patch Checksum. + # It is used in google.cloud.storage.asyncio.retry.reads_resumption_strategy + + with mock.patch( + "google.cloud.storage.asyncio.retry.reads_resumption_strategy.Checksum" + ) as mock_chk: + mock_chk.return_value.digest.return_value = (123).to_bytes(4, "big") + + await mock_mrd.download_ranges([(0, 4, buffer)]) + + # Assert + mock_logger.info.assert_any_call("Resuming download (attempt 2) for 1 ranges.") From 700fec3bf7aa37bd5ea4b163cc3f9e8e6892bd5a Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 11 Mar 2026 17:49:24 +0530 Subject: [PATCH 493/509] fix(transfer_manager): Prevent path traversal in `download_many_to_path` (#1768) fix(transfer_manager): Prevent path traversal in download_many_to_path This PR addresses a security vulnerability where `download_many_to_path` could be exploited to write files outside the intended destination directory. The fix ensures that the resolved path for each blob download remains within the bounds of the user-provided `destination_directory`. If a blob name would result in a path outside this directory (e.g., by using `../`), a warning is issued, and that specific blob download is skipped. This prevents directory traversal attacks. Absolute paths in blob names (e.g., `/etc/passwd`) are now treated as relative to the `destination_directory`, so `/etc/passwd` will be downloaded to `destination_directory/etc/passwd`. See b/449616593 for more details. BREAKING CHANGE: Blobs that would resolve to a path outside the `destination_directory` are no longer downloaded. While this is a security fix, users relying on the previous behavior to write files outside the target directory will see a change. --- google/cloud/storage/transfer_manager.py | 101 +++++++++++++--- tests/system/test_transfer_manager.py | 145 +++++++++++++++++++++++ tests/unit/test_transfer_manager.py | 121 ++++++++++++++++++- 3 files changed, 351 insertions(+), 16 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index a34419020..c655244b0 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -25,6 +25,7 @@ import struct import base64 import functools +from pathlib import Path from google.api_core import exceptions from google.cloud.storage import Client @@ -231,9 +232,11 @@ def upload_many( executor.submit( _call_method_on_maybe_pickled_blob, _pickle_client(blob) if needs_pickling else blob, - "_handle_filename_and_upload" - if isinstance(path_or_file, str) - else "_prep_and_do_upload", + ( + "_handle_filename_and_upload" + if isinstance(path_or_file, str) + else "_prep_and_do_upload" + ), path_or_file, **upload_kwargs, ) @@ -259,6 +262,16 @@ def upload_many( return results +def _resolve_path(target_dir, blob_path): + target_dir = Path(target_dir) + blob_path = Path(blob_path) + # blob_path.anchor will be '/' if `blob_path` is full path else it'll empty. + # This is useful to concatnate target_dir = /local/target , and blob_path = + # /usr/local/mybin into /local/target/usr/local/mybin + concatenated_path = target_dir / blob_path.relative_to(blob_path.anchor) + return concatenated_path.resolve() + + @_deprecate_threads_param def download_many( blob_file_pairs, @@ -384,9 +397,11 @@ def download_many( executor.submit( _call_method_on_maybe_pickled_blob, _pickle_client(blob) if needs_pickling else blob, - "_handle_filename_and_download" - if isinstance(path_or_file, str) - else "_prep_and_do_download", + ( + "_handle_filename_and_download" + if isinstance(path_or_file, str) + else "_prep_and_do_download" + ), path_or_file, **download_kwargs, ) @@ -618,7 +633,8 @@ def download_many_to_path( """Download many files concurrently by their blob names. The destination files are automatically created, with paths based on the - source blob_names and the destination_directory. + source `blob_names` and the `destination_directory`. + The destination files are not automatically deleted if their downloads fail, so please check the return value of this function for any exceptions, or @@ -629,6 +645,50 @@ def download_many_to_path( "images/icon.jpg" will be downloaded to a file named "/home/myuser/icon.jpg". + + Note1: if the path after combining `blob_name` and `destination_directory` + resolves outside `destination_directory` a warning will be issued and the + that particular blob will NOT be downloaded. This may happen in scenarios + where `blob_name` contains "../" + + For example, + consider `destination_directory` is "downloads/gcs_blobs" and + `blob_name` is '../hello.blob'. This blob will not be downloaded + because the final resolved path would be "downloads/hello.blob" + + + To give further examples, the following blobs will not be downloaded because + it "escapes" the "destination_directory" + + "../../local/target", # skips download + "../escape.txt", # skips download + "go/four/levels/deep/../../../../../somefile1", # skips download + "go/four/levels/deep/../some_dir/../../../../../invalid/path1" # skips download + + however the following blobs will be downloaded because the final resolved + destination_directory is still child of given destination_directory + + "data/../sibling.txt", + "dir/./file.txt", + "go/four/levels/deep/../somefile2", + "go/four/levels/deep/../some_dir/valid/path1", + "go/four/levels/deep/../some_dir/../../../../valid/path2", + + It is adviced to use other APIs such as `transfer_manager.download_many` or + `Blob.download_to_filename` or `Blob.download_to_file` to download such blobs. + + + Note2: + The resolved download_directory will always be relative to user provided + `destination_directory`. For example, + + a `blob_name` "/etc/passwd" will be downloaded into + "destination_directory/etc/passwd" instead of "/etc/passwd" + Similarly, + "/tmp/my_fav_blob" downloads to "destination_directory/tmp/my_fav_blob" + + + :type bucket: :class:`google.cloud.storage.bucket.Bucket` :param bucket: The bucket which contains the blobs to be downloaded @@ -646,9 +706,8 @@ def download_many_to_path( :type destination_directory: str :param destination_directory: - A string that will be prepended (with os.path.join()) to each blob_name - in the input list, in order to determine the destination path for that - blob. + A string that will be prepended to each blob_name in the input list, in + order to determine the destination path for that blob. For instance, if the destination_directory string is "/tmp/img" and a blob_name is "0001.jpg", with an empty blob_name_prefix, then the source @@ -656,8 +715,9 @@ def download_many_to_path( This parameter can be an empty string. - Note that this parameter allows directory traversal (e.g. "/", "../") - and is not intended for unsanitized end user input. + Note directory traversal may be possible as long as the final + (e.g. "/", "../") resolved path is inside "destination_directory". + See examples above. :type blob_name_prefix: str :param blob_name_prefix: @@ -755,11 +815,22 @@ def download_many_to_path( for blob_name in blob_names: full_blob_name = blob_name_prefix + blob_name - path = os.path.join(destination_directory, blob_name) + resolved_path = _resolve_path(destination_directory, blob_name) + if not resolved_path.parent.is_relative_to( + Path(destination_directory).resolve() + ): + warnings.warn( + f"The blob {blob_name} will **NOT** be downloaded. " + f"The resolved destination_directory - {resolved_path.parent} - is either invalid or " + f"escapes user provided {Path(destination_directory).resolve()} . Please download this file separately using `download_to_filename`" + ) + continue + + resolved_path = str(resolved_path) if create_directories: - directory, _ = os.path.split(path) + directory, _ = os.path.split(resolved_path) os.makedirs(directory, exist_ok=True) - blob_file_pairs.append((bucket.blob(full_blob_name), path)) + blob_file_pairs.append((bucket.blob(full_blob_name), resolved_path)) return download_many( blob_file_pairs, diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index 7a257e960..844562c90 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -121,6 +121,151 @@ def test_upload_many_from_filenames_with_attributes( assert blob.cache_control == "no-cache" +@pytest.mark.parametrize( + "blobname", + [ + "../../local/target", # skips download + "../escape.txt", # skips download + "go/four/levels/deep/../../../../../somefile1", # skips download + "go/four/levels/deep/../some_dir/../../../../../invalid/path1", # skips download + ], +) +def test_download_many_to_path_skips_download( + shared_bucket, file_data, blobs_to_delete, blobname +): + """ + Test downloading blobs with traversal skipped + """ + # Setup + BLOBNAMES = [blobname] + + FILE_BLOB_PAIRS = [ + ( + file_data["simple"]["path"], + shared_bucket.blob("folder_traversal/" + blob_name), + ) + for blob_name in BLOBNAMES + ] + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + skip_if_exists=True, + deadline=DEADLINE, + ) + for result in results: + assert result is None + + blobs = list(shared_bucket.list_blobs(prefix="folder_traversal/")) + blobs_to_delete.extend(blobs) + + # We expect 1 blob uploaded for this test parametrization + assert len(list(b for b in blobs if b.name == "folder_traversal/" + blobname)) == 1 + + # Actual Test + with tempfile.TemporaryDirectory() as tempdir: + import warnings + + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + results = transfer_manager.download_many_to_path( + shared_bucket, + BLOBNAMES, + destination_directory=tempdir, + blob_name_prefix="folder_traversal/", + deadline=DEADLINE, + create_directories=True, + ) + + path_traversal_warnings = [ + warning + for warning in w + if str(warning.message).startswith("The blob ") + and "will **NOT** be downloaded. The resolved destination_directory" + in str(warning.message) + ] + assert len(path_traversal_warnings) == 1, "---".join( + [str(warning.message) for warning in w] + ) + + # 1 total - 1 skipped = 0 results + assert len(results) == 0 + + +@pytest.mark.parametrize( + "blobname", + [ + "simple_blob", + "data/file.txt", + "data/../sibling.txt", + "/etc/passwd", + "/local/usr/a.txt", + "dir/./file.txt", + "go/four/levels/deep/../somefile2", + "go/four/levels/deep/../some_dir/valid/path1", + "go/four/levels/deep/../some_dir/../../../../valid/path2", + ], +) +def test_download_many_to_path_downloads_within_dest_dir( + shared_bucket, file_data, blobs_to_delete, blobname +): + """ + Test downloading blobs with valid traversal + """ + # Setup + BLOBNAMES = [blobname] + + FILE_BLOB_PAIRS = [ + ( + file_data["simple"]["path"], + shared_bucket.blob("folder_traversal/" + blob_name), + ) + for blob_name in BLOBNAMES + ] + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + skip_if_exists=True, + deadline=DEADLINE, + ) + for result in results: + assert result is None + + blobs = list(shared_bucket.list_blobs(prefix="folder_traversal/")) + blobs_to_delete.extend(blobs) + + assert len(list(b for b in blobs if b.name == "folder_traversal/" + blobname)) == 1 + + # Actual Test + with tempfile.TemporaryDirectory() as tempdir: + results = transfer_manager.download_many_to_path( + shared_bucket, + BLOBNAMES, + destination_directory=tempdir, + blob_name_prefix="folder_traversal/", + deadline=DEADLINE, + create_directories=True, + ) + + assert len(results) == 1 + for result in results: + assert result is None + + # Verify the file exists and contents match + from google.cloud.storage.transfer_manager import _resolve_path + from pathlib import Path + + expected_file_path = Path(_resolve_path(tempdir, blobname)) + assert expected_file_path.is_file() + + with open(file_data["simple"]["path"], "rb") as source_file: + source_contents = source_file.read() + + with expected_file_path.open("rb") as downloaded_file: + downloaded_contents = downloaded_file.read() + + assert downloaded_contents == source_contents + + def test_download_many(listable_bucket): blobs = list(listable_bucket.list_blobs()) with tempfile.TemporaryDirectory() as tempdir: diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 151cd2877..85ffd9eaa 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -525,7 +525,8 @@ def test_download_many_to_path(): WORKER_TYPE = transfer_manager.THREAD EXPECTED_BLOB_FILE_PAIRS = [ - (mock.ANY, os.path.join(PATH_ROOT, blobname)) for blobname in BLOBNAMES + (mock.ANY, os.path.join(os.getcwd(), PATH_ROOT, blobname)) + for blobname in BLOBNAMES ] with mock.patch( @@ -558,6 +559,124 @@ def test_download_many_to_path(): bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) +@pytest.mark.parametrize( + "blobname", + [ + "../../local/target", + "../mypath", + "../escape.txt", + "go/four/levels/deep/../../../../../somefile1", + "go/four/levels/deep/../some_dir/../../../../../invalid/path1", + ], +) +def test_download_many_to_path_skips_download(blobname): + bucket = mock.Mock() + BLOBNAMES = [blobname] + + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + WORKER_TYPE = transfer_manager.THREAD + + import warnings + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + with mock.patch( + "google.cloud.storage.transfer_manager.download_many" + ) as mock_download_many: + transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + create_directories=False, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=True, + ) + + path_traversal_warnings = [ + warning for warning in w + if str(warning.message).startswith("The blob ") + and "will **NOT** be downloaded. The resolved destination_directory" in str(warning.message) + ] + assert len(path_traversal_warnings) == 1, "---".join([str(warning.message) for warning in w]) + + mock_download_many.assert_called_once_with( + [], + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=True, + ) + + +@pytest.mark.parametrize( + "blobname", + [ + "simple_blob", + "data/file.txt", + "data/../sibling.txt", + "/etc/passwd", + "/local/usr/a.txt", + "dir/./file.txt", + "go/four/levels/deep/../somefile2", + "go/four/levels/deep/../some_dir/valid/path1", + "go/four/levels/deep/../some_dir/../../../../valid/path2", + ], +) +def test_download_many_to_path_downloads_within_dest_dir(blobname): + bucket = mock.Mock() + BLOBNAMES = [blobname] + + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + WORKER_TYPE = transfer_manager.THREAD + + from google.cloud.storage.transfer_manager import _resolve_path + EXPECTED_BLOB_FILE_PAIRS = [ + (mock.ANY, str(_resolve_path(PATH_ROOT, blobname))) + ] + + with mock.patch( + "google.cloud.storage.transfer_manager.download_many" + ) as mock_download_many: + transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + create_directories=False, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=True, + ) + + mock_download_many.assert_called_once_with( + EXPECTED_BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=True, + ) + bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) + + def test_download_many_to_path_creates_directories(): bucket = mock.Mock() From eee4b3c0b4a72155e7fe2c9232dbcef33b817fd6 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Wed, 11 Mar 2026 12:32:13 -0400 Subject: [PATCH 494/509] chore: clean up release please configuration files (#1667) Release please is no longer used by Python repositories in the `googleapis` Github organization. Please review the maintain guide for librarian which supersedes release-please. As an example, `librarian release stage` will create a release PR https://github.com/googleapis/librarian/blob/main/doc/library-maintainer-guide.md --- .github/release-please.yml | 6 ------ .github/release-trigger.yml | 2 -- 2 files changed, 8 deletions(-) delete mode 100644 .github/release-please.yml delete mode 100644 .github/release-trigger.yml diff --git a/.github/release-please.yml b/.github/release-please.yml deleted file mode 100644 index 8a7214bdd..000000000 --- a/.github/release-please.yml +++ /dev/null @@ -1,6 +0,0 @@ -branches: -- branch: python2 - handleGHRelease: true - releaseType: python -releaseType: python -handleGHRelease: true diff --git a/.github/release-trigger.yml b/.github/release-trigger.yml deleted file mode 100644 index 5980127a4..000000000 --- a/.github/release-trigger.yml +++ /dev/null @@ -1,2 +0,0 @@ -enabled: true -multiScmName: python-storage From 35b39b6460f4d1d7a4cd50bab38c4ab2a2dcda4a Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 13 Mar 2026 20:16:40 +0530 Subject: [PATCH 495/509] chore: don't use mtls in gcb until b/492452834 is fixed (#1769) chore: don't use mtls in gcb until b/492452834 is fixed Details in b/492452834 --- cloudbuild/run_zonal_tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/cloudbuild/run_zonal_tests.sh b/cloudbuild/run_zonal_tests.sh index 22ca8fe4b..2d42ce6d5 100644 --- a/cloudbuild/run_zonal_tests.sh +++ b/cloudbuild/run_zonal_tests.sh @@ -23,6 +23,7 @@ pip install -e . echo '--- Setting up environment variables on VM ---' export ZONAL_BUCKET=${_ZONAL_BUCKET} export RUN_ZONAL_SYSTEM_TESTS=True +export GCE_METADATA_MTLS_MODE=None CURRENT_ULIMIT=$(ulimit -n) echo '--- Running Zonal tests on VM with ulimit set to ---' $CURRENT_ULIMIT pytest -vv -s --log-format='%(asctime)s %(levelname)s %(message)s' --log-date-format='%H:%M:%S' tests/system/test_zonal.py From 141f7ac1e3448d894eee9984b39ad8535a2823cf Mon Sep 17 00:00:00 2001 From: Nidhi Date: Mon, 16 Mar 2026 17:58:55 +0000 Subject: [PATCH 496/509] chore: skip hmac tests until b/493225655 is fixed (#1771) Skipping hmac tests if they fail with a 412 PreconditionFailed. This is occurring because the testing project python-docs-samples-tests has the constraints/iam.disableServiceAccountKeyCreation Organization Policy enforced. --- samples/snippets/hmac_samples_test.py | 29 ++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/samples/snippets/hmac_samples_test.py b/samples/snippets/hmac_samples_test.py index 988b40305..fbc2e292d 100644 --- a/samples/snippets/hmac_samples_test.py +++ b/samples/snippets/hmac_samples_test.py @@ -17,7 +17,6 @@ set in order to run. """ - import os import google.api_core.exceptions @@ -51,9 +50,18 @@ def new_hmac_key(): NOTE: Due to the module scope, test order in this file is significant """ - hmac_key, secret = STORAGE_CLIENT.create_hmac_key( - service_account_email=SERVICE_ACCOUNT_EMAIL, project_id=PROJECT_ID - ) + try: + hmac_key, secret = STORAGE_CLIENT.create_hmac_key( + service_account_email=SERVICE_ACCOUNT_EMAIL, project_id=PROJECT_ID + ) + except google.api_core.exceptions.PreconditionFailed as e: + # Check if the failure is due to the Organization Policy constraint + if "constraints/iam.disableServiceAccountKeyCreation" in str(e): + pytest.skip( + "Temporary skip: HMAC key creation is disabled by organization policy " + "on project python-docs-samples-tests. See b/493225655." + ) + raise yield hmac_key # Re-fetch the key metadata in case state has changed during the test. hmac_key = STORAGE_CLIENT.get_hmac_key_metadata( @@ -77,9 +85,16 @@ def test_list_keys(capsys, new_hmac_key): def test_create_key(capsys): - hmac_key = storage_create_hmac_key.create_key( - PROJECT_ID, SERVICE_ACCOUNT_EMAIL - ) + try: + hmac_key = storage_create_hmac_key.create_key(PROJECT_ID, SERVICE_ACCOUNT_EMAIL) + except google.api_core.exceptions.PreconditionFailed as e: + if "constraints/iam.disableServiceAccountKeyCreation" in str(e): + pytest.skip( + "Temporary skip: HMAC key creation is disabled by organization policy " + "on project python-docs-samples-tests. See b/493225655." + ) + raise + hmac_key.state = "INACTIVE" hmac_key.update() hmac_key.delete() From 2a6e8b00e4e6ff57460373f8e628fd363be47811 Mon Sep 17 00:00:00 2001 From: Rajiv Podar Date: Tue, 17 Mar 2026 15:10:34 +0530 Subject: [PATCH 497/509] feat: add support for bucket encryption enforcement config (#1742) Implemented bucket encryption enforcement configuration support. Added `EncryptionEnforcementConfig` and `BucketEncryption` classes. Added `encryption` property to `Bucket`. Added unit tests. --- *PR created automatically by Jules for task [10151670798613550332](https://jules.google.com/task/10151670798613550332) started by @rajeevpodar* --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: rajeevpodar <3637722+rajeevpodar@users.noreply.github.com> Co-authored-by: Nidhi Nandwani --- google/cloud/storage/bucket.py | 267 +++++++++++++++++++++++++++++- google/cloud/storage/constants.py | 6 + tests/system/test_bucket.py | 101 +++++++++++ tests/unit/test_bucket.py | 159 ++++++++++++++++++ 4 files changed, 531 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py index 1621f879e..b4001e09d 100644 --- a/google/cloud/storage/bucket.py +++ b/google/cloud/storage/bucket.py @@ -43,7 +43,11 @@ from google.cloud.storage.acl import DefaultObjectACL from google.cloud.storage.blob import _quote from google.cloud.storage.blob import Blob -from google.cloud.storage.constants import _DEFAULT_TIMEOUT +from google.cloud.storage.constants import ( + _DEFAULT_TIMEOUT, + ENFORCEMENT_MODE_FULLY_RESTRICTED, + ENFORCEMENT_MODE_NOT_RESTRICTED, +) from google.cloud.storage.constants import ARCHIVE_STORAGE_CLASS from google.cloud.storage.constants import COLDLINE_STORAGE_CLASS from google.cloud.storage.constants import DUAL_REGION_LOCATION_TYPE @@ -65,7 +69,6 @@ from google.cloud.storage.retry import DEFAULT_RETRY_IF_ETAG_IN_JSON from google.cloud.storage.retry import DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED - _UBLA_BPO_ENABLED_MESSAGE = ( "Pass only one of 'uniform_bucket_level_access_enabled' / " "'bucket_policy_only_enabled' to 'IAMConfiguration'." @@ -2538,6 +2541,25 @@ def cors(self, entries): :rtype: bool or ``NoneType`` """ + @property + def encryption(self): + """Retrieve encryption configuration for this bucket. + + :rtype: :class:`BucketEncryption` + :returns: an instance for managing the bucket's encryption configuration. + """ + info = self._properties.get("encryption", {}) + return BucketEncryption.from_api_repr(info, self) + + @encryption.setter + def encryption(self, value): + """Set encryption configuration for this bucket. + + :type value: :class:`BucketEncryption` or dict + :param value: The encryption configuration. + """ + self._patch_property("encryption", value) + @property def default_kms_key_name(self): """Retrieve / set default KMS encryption key for objects in the bucket. @@ -3965,6 +3987,247 @@ def ip_filter(self, value): self._patch_property(_IP_FILTER_PROPERTY, value) +class EncryptionEnforcementConfig(dict): + """Map a bucket's encryption enforcement configuration. + + :type restriction_mode: str + :param restriction_mode: + (Optional) The restriction mode for the encryption type. + When set to ``FullyRestricted``, the bucket will only allow objects encrypted with the encryption type corresponding to this configuration. + When set to ``NotRestricted``, the bucket will allow objects encrypted with any encryption type. + + :type effective_time: :class:`datetime.datetime` + :param effective_time: + (Output only) The time when the encryption enforcement configuration became effective. + """ + + def __init__(self, restriction_mode=None): + data = {} + if restriction_mode is not None: + # Validate input against allowed constants + allowed = ( + ENFORCEMENT_MODE_FULLY_RESTRICTED, + ENFORCEMENT_MODE_NOT_RESTRICTED, + ) + if restriction_mode not in allowed: + raise ValueError( + f"Invalid restriction_mode: {restriction_mode}. " + f"Must be one of {allowed}" + ) + data["restrictionMode"] = restriction_mode + + super().__init__(data) + + @classmethod + def from_api_repr(cls, resource): + """Factory: construct instance from resource. + + :type resource: dict + :param resource: mapping as returned from API call. + + :rtype: :class:`EncryptionEnforcementConfig` + :returns: Instance created from resource. + """ + instance = cls() + instance.update(resource) + return instance + + @property + def restriction_mode(self): + """Get the restriction mode. + + :rtype: str or ``NoneType`` + :returns: The restriction mode or ``None`` if the property is not set. + """ + return self.get("restrictionMode") + + @restriction_mode.setter + def restriction_mode(self, value): + """Set the restriction mode. + + :type value: str + :param value: The restriction mode. + """ + self["restrictionMode"] = value + + @property + def effective_time(self): + """Get the effective time. + + :rtype: datetime.datetime or ``NoneType`` + :returns: point-in time at which the configuration is effective, + or ``None`` if the property is not set. + """ + timestamp = self.get("effectiveTime") + if timestamp is not None: + return _rfc3339_nanos_to_datetime(timestamp) + + +class BucketEncryption(dict): + """Map a bucket's encryption configuration. + + :type bucket: :class:`Bucket` + :param bucket: Bucket for which this instance is the policy. + + :type default_kms_key_name: str + :param default_kms_key_name: + (Optional) Resource name of KMS key used to encrypt bucket's content. + + :type google_managed_encryption_enforcement_config: :class:`EncryptionEnforcementConfig` + :param google_managed_encryption_enforcement_config: + (Optional) Encryption enforcement configuration for Google managed encryption. + + :type customer_managed_encryption_enforcement_config: :class:`EncryptionEnforcementConfig` + :param customer_managed_encryption_enforcement_config: + (Optional) Encryption enforcement configuration for Customer managed encryption. + + :type customer_supplied_encryption_enforcement_config: :class:`EncryptionEnforcementConfig` + :param customer_supplied_encryption_enforcement_config: + (Optional) Encryption enforcement configuration for Customer supplied encryption. + """ + + def __init__( + self, + bucket, + default_kms_key_name=None, + google_managed_encryption_enforcement_config=None, + customer_managed_encryption_enforcement_config=None, + customer_supplied_encryption_enforcement_config=None, + ): + data = {} + if default_kms_key_name is not None: + data["defaultKmsKeyName"] = default_kms_key_name + + if google_managed_encryption_enforcement_config is not None: + data["googleManagedEncryptionEnforcementConfig"] = ( + google_managed_encryption_enforcement_config + ) + + if customer_managed_encryption_enforcement_config is not None: + data["customerManagedEncryptionEnforcementConfig"] = ( + customer_managed_encryption_enforcement_config + ) + + if customer_supplied_encryption_enforcement_config is not None: + data["customerSuppliedEncryptionEnforcementConfig"] = ( + customer_supplied_encryption_enforcement_config + ) + + super().__init__(data) + self._bucket = bucket + + @classmethod + def from_api_repr(cls, resource, bucket): + """Factory: construct instance from resource. + + :type resource: dict + :param resource: mapping as returned from API call. + + :type bucket: :class:`Bucket` + :params bucket: Bucket for which this instance is the policy. + + :rtype: :class:`BucketEncryption` + :returns: Instance created from resource. + """ + instance = cls(bucket) + instance.update(resource) + return instance + + @property + def bucket(self): + """Bucket for which this instance is the policy. + + :rtype: :class:`Bucket` + :returns: the instance's bucket. + """ + return self._bucket + + @property + def default_kms_key_name(self): + """Retrieve default KMS encryption key for objects in the bucket. + + :rtype: str or ``NoneType`` + :returns: Default KMS encryption key, or ``None`` if not set. + """ + return self.get("defaultKmsKeyName") + + @default_kms_key_name.setter + def default_kms_key_name(self, value): + """Set default KMS encryption key for objects in the bucket. + + :type value: str or None + :param value: new KMS key name (None to clear any existing key). + """ + self["defaultKmsKeyName"] = value + self.bucket._patch_property("encryption", self) + + @property + def google_managed_encryption_enforcement_config(self): + """Retrieve the encryption enforcement configuration for Google managed encryption. + + :rtype: :class:`EncryptionEnforcementConfig` + :returns: The configuration instance. + """ + data = self.get("googleManagedEncryptionEnforcementConfig") + if data: + return EncryptionEnforcementConfig.from_api_repr(data) + return None + + @google_managed_encryption_enforcement_config.setter + def google_managed_encryption_enforcement_config(self, value): + """Set the encryption enforcement configuration for Google managed encryption. + + :type value: :class:`EncryptionEnforcementConfig` or dict + :param value: The configuration instance or dictionary. + """ + self["googleManagedEncryptionEnforcementConfig"] = value + self.bucket._patch_property("encryption", self) + + @property + def customer_managed_encryption_enforcement_config(self): + """Retrieve the encryption enforcement configuration for Customer managed encryption. + + :rtype: :class:`EncryptionEnforcementConfig` + :returns: The configuration instance. + """ + data = self.get("customerManagedEncryptionEnforcementConfig") + if data: + return EncryptionEnforcementConfig.from_api_repr(data) + return None + + @customer_managed_encryption_enforcement_config.setter + def customer_managed_encryption_enforcement_config(self, value): + """Set the encryption enforcement configuration for Customer managed encryption. + + :type value: :class:`EncryptionEnforcementConfig` or dict + :param value: The configuration instance or dictionary. + """ + self["customerManagedEncryptionEnforcementConfig"] = value + self.bucket._patch_property("encryption", self) + + @property + def customer_supplied_encryption_enforcement_config(self): + """Retrieve the encryption enforcement configuration for Customer supplied encryption. + + :rtype: :class:`EncryptionEnforcementConfig` + :returns: The configuration instance. + """ + data = self.get("customerSuppliedEncryptionEnforcementConfig") + if data: + return EncryptionEnforcementConfig.from_api_repr(data) + return None + + @customer_supplied_encryption_enforcement_config.setter + def customer_supplied_encryption_enforcement_config(self, value): + """Set the encryption enforcement configuration for Customer supplied encryption. + + :type value: :class:`EncryptionEnforcementConfig` or dict + :param value: The configuration instance or dictionary. + """ + self["customerSuppliedEncryptionEnforcementConfig"] = value + self.bucket._patch_property("encryption", self) + + class SoftDeletePolicy(dict): """Map a bucket's soft delete policy. diff --git a/google/cloud/storage/constants.py b/google/cloud/storage/constants.py index eba0a19df..c6c1b63c4 100644 --- a/google/cloud/storage/constants.py +++ b/google/cloud/storage/constants.py @@ -137,3 +137,9 @@ See: https://cloud.google.com/storage/docs/managing-turbo-replication """ + +ENFORCEMENT_MODE_FULLY_RESTRICTED = "FullyRestricted" +"""Bucket encryption restriction mode where encryption is fully restricted.""" + +ENFORCEMENT_MODE_NOT_RESTRICTED = "NotRestricted" +"""Bucket encryption restriction mode where encryption is not restricted.""" diff --git a/tests/system/test_bucket.py b/tests/system/test_bucket.py index 32806bd4c..cbd9d1880 100644 --- a/tests/system/test_bucket.py +++ b/tests/system/test_bucket.py @@ -22,6 +22,11 @@ PublicNetworkSource, VpcNetworkSource, ) +from google.cloud.storage.bucket import EncryptionEnforcementConfig +from google.cloud.storage.constants import ( + ENFORCEMENT_MODE_FULLY_RESTRICTED, + ENFORCEMENT_MODE_NOT_RESTRICTED, +) def test_bucket_create_w_alt_storage_class(storage_client, buckets_to_delete): @@ -1398,3 +1403,99 @@ def test_list_buckets_with_ip_filter(storage_client, buckets_to_delete): # Check that the summarized filter does not include full details. assert summarized_filter.public_network_source is None assert summarized_filter.vpc_network_sources == [] + + +def test_create_bucket_with_encryption_enforcement(storage_client, buckets_to_delete): + bucket_name = _helpers.unique_name("enforce-on-create") + + # Initialize the bucket object locally + bucket = storage_client.bucket(bucket_name) + + # Define and set the enforcement config + enforcement = EncryptionEnforcementConfig( + restriction_mode=ENFORCEMENT_MODE_FULLY_RESTRICTED + ) + # Set the config on the local object + bucket.encryption.google_managed_encryption_enforcement_config = enforcement + + # storage_client.create_bucket(bucket) sends the config in the initial POST + created_bucket = storage_client.create_bucket(bucket) + buckets_to_delete.append(created_bucket) + + # Verify backend persistence and server-generated effective_time + config = created_bucket.encryption.google_managed_encryption_enforcement_config + assert config.restriction_mode == ENFORCEMENT_MODE_FULLY_RESTRICTED + assert isinstance(config.effective_time, datetime.datetime) + + +def test_bucket_encryption_enforcement_config(storage_client, buckets_to_delete): + bucket_name = _helpers.unique_name("encryption-enforcement") + bucket = _helpers.retry_429_503(storage_client.create_bucket)(bucket_name) + buckets_to_delete.append(bucket) + + # 1. Set initial enforcement configuration + # Testing both Google-managed and Customer-managed configurations + google_config = EncryptionEnforcementConfig( + restriction_mode=ENFORCEMENT_MODE_FULLY_RESTRICTED + ) + customer_config = EncryptionEnforcementConfig( + restriction_mode=ENFORCEMENT_MODE_NOT_RESTRICTED + ) + + bucket.encryption.google_managed_encryption_enforcement_config = google_config + bucket.encryption.customer_managed_encryption_enforcement_config = customer_config + + # Patch sends the 'encryption' dict to the server + bucket.patch() + + # 2. Reload and Verify backend persistence + bucket.reload() + + # Verify Google Managed Config and the presence of effective_time + reloaded_google = bucket.encryption.google_managed_encryption_enforcement_config + assert reloaded_google.restriction_mode == ENFORCEMENT_MODE_FULLY_RESTRICTED + assert isinstance(reloaded_google.effective_time, datetime.datetime) + + # Verify Customer Managed Config + reloaded_customer = bucket.encryption.customer_managed_encryption_enforcement_config + assert reloaded_customer.restriction_mode == ENFORCEMENT_MODE_NOT_RESTRICTED + assert reloaded_customer.effective_time is None + + # 3. Test updating an existing config + update_google_config = EncryptionEnforcementConfig( + restriction_mode=ENFORCEMENT_MODE_NOT_RESTRICTED + ) + bucket.encryption.google_managed_encryption_enforcement_config = ( + update_google_config + ) + bucket.patch() + assert ( + bucket.encryption.google_managed_encryption_enforcement_config.restriction_mode + == ENFORCEMENT_MODE_NOT_RESTRICTED + ) + + +def test_delete_bucket_encryption_enforcement_config(storage_client, buckets_to_delete): + bucket_name = _helpers.unique_name("delete-encryption-config") + + # Create a bucket with an initial restricted config + enforcement = EncryptionEnforcementConfig( + restriction_mode=ENFORCEMENT_MODE_FULLY_RESTRICTED + ) + bucket = storage_client.bucket(bucket_name) + bucket.encryption.google_managed_encryption_enforcement_config = enforcement + bucket = storage_client.create_bucket(bucket) + buckets_to_delete.append(bucket) + + # Verify it exists first + assert bucket.encryption.google_managed_encryption_enforcement_config is not None + + # DELETE: Set the specific enforcement config to None + bucket.encryption.google_managed_encryption_enforcement_config = None + + # patch() sends the null value to the server to clear the field + bucket.patch() + + # Reload and verify the field is gone + bucket.reload() + assert bucket.encryption.google_managed_encryption_enforcement_config is None diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py index 850e89d04..98fc50ac8 100644 --- a/tests/unit/test_bucket.py +++ b/tests/unit/test_bucket.py @@ -2733,6 +2733,41 @@ def test_cors_setter(self): self.assertEqual(bucket.cors, [CORS_ENTRY]) self.assertTrue("cors" in bucket._changes) + def test_encryption_getter(self): + from google.cloud.storage.bucket import BucketEncryption + + NAME = "name" + KMS_RESOURCE = ( + "projects/test-project-123/" + "locations/us/" + "keyRings/test-ring/" + "cryptoKeys/test-key" + ) + ENCRYPTION_CONFIG = {"defaultKmsKeyName": KMS_RESOURCE} + bucket = self._make_one(name=NAME) + self.assertIsNone(bucket.encryption.default_kms_key_name) + bucket._properties["encryption"] = ENCRYPTION_CONFIG + encryption = bucket.encryption + self.assertIsInstance(encryption, BucketEncryption) + self.assertEqual(encryption.default_kms_key_name, KMS_RESOURCE) + + def test_encryption_setter(self): + from google.cloud.storage.bucket import BucketEncryption + + NAME = "name" + KMS_RESOURCE = ( + "projects/test-project-123/" + "locations/us/" + "keyRings/test-ring/" + "cryptoKeys/test-key" + ) + ENCRYPTION_CONFIG = {"defaultKmsKeyName": KMS_RESOURCE} + bucket = self._make_one(name=NAME) + encryption = BucketEncryption(bucket, default_kms_key_name=KMS_RESOURCE) + bucket.encryption = encryption + self.assertEqual(bucket._properties["encryption"], ENCRYPTION_CONFIG) + self.assertTrue("encryption" in bucket._changes) + def test_default_kms_key_name_getter(self): NAME = "name" KMS_RESOURCE = ( @@ -4722,3 +4757,127 @@ def test_it(self): self.assertEqual(notification._topic_name, topic) self.assertEqual(notification._topic_project, project) self.assertEqual(notification._properties, item) + + +class Test_EncryptionEnforcementConfig(unittest.TestCase): + @staticmethod + def _get_target_class(): + from google.cloud.storage.bucket import EncryptionEnforcementConfig + + return EncryptionEnforcementConfig + + def _make_one(self, **kw): + return self._get_target_class()(**kw) + + def test_ctor(self): + + from google.cloud.storage.constants import ENFORCEMENT_MODE_FULLY_RESTRICTED + + config = self._make_one(restriction_mode=ENFORCEMENT_MODE_FULLY_RESTRICTED) + + self.assertEqual(config.restriction_mode, ENFORCEMENT_MODE_FULLY_RESTRICTED) + self.assertIsNone(config.effective_time) + + def test_from_api_repr(self): + from google.cloud._helpers import _datetime_to_rfc3339 + from google.cloud.storage.constants import ENFORCEMENT_MODE_NOT_RESTRICTED + + now = _NOW(_UTC) + resource = { + "restrictionMode": ENFORCEMENT_MODE_NOT_RESTRICTED, + "effectiveTime": _datetime_to_rfc3339(now), + } + klass = self._get_target_class() + config = klass.from_api_repr(resource) + self.assertEqual(config.restriction_mode, ENFORCEMENT_MODE_NOT_RESTRICTED) + self.assertEqual(config.effective_time, now) + + def test_restriction_mode_setter(self): + config = self._make_one() + self.assertIsNone(config.restriction_mode) + config.restriction_mode = "FULLY_RESTRICTED" + self.assertEqual(config.restriction_mode, "FULLY_RESTRICTED") + self.assertEqual(config["restrictionMode"], "FULLY_RESTRICTED") + + +class Test_BucketEncryption(unittest.TestCase): + @staticmethod + def _get_target_class(): + from google.cloud.storage.bucket import BucketEncryption + + return BucketEncryption + + def _make_one(self, bucket, **kw): + return self._get_target_class()(bucket, **kw) + + @staticmethod + def _make_bucket(): + from google.cloud.storage.bucket import Bucket + + return mock.create_autospec(Bucket, instance=True) + + def test_ctor_defaults(self): + bucket = self._make_bucket() + encryption = self._make_one(bucket) + self.assertIs(encryption.bucket, bucket) + self.assertIsNone(encryption.default_kms_key_name) + # Check that the config itself is None, not its sub-property + self.assertIsNone(encryption.google_managed_encryption_enforcement_config) + self.assertIsNone(encryption.customer_managed_encryption_enforcement_config) + self.assertIsNone(encryption.customer_supplied_encryption_enforcement_config) + + def test_ctor_explicit(self): + from google.cloud.storage.bucket import EncryptionEnforcementConfig + + bucket = self._make_bucket() + kms_key = "key" + google_config = EncryptionEnforcementConfig("FullyRestricted") + encryption = self._make_one( + bucket, + default_kms_key_name=kms_key, + google_managed_encryption_enforcement_config=google_config, + ) + self.assertEqual(encryption.default_kms_key_name, kms_key) + self.assertEqual( + encryption.google_managed_encryption_enforcement_config.restriction_mode, + "FullyRestricted", + ) + + def test_from_api_repr(self): + klass = self._get_target_class() + bucket = self._make_bucket() + resource = { + "defaultKmsKeyName": "key", + "googleManagedEncryptionEnforcementConfig": { + "restrictionMode": "FullyRestricted" + }, + } + encryption = klass.from_api_repr(resource, bucket) + self.assertEqual(encryption.default_kms_key_name, "key") + self.assertEqual( + encryption.google_managed_encryption_enforcement_config.restriction_mode, + "FullyRestricted", + ) + + def test_setters_trigger_patch(self): + from google.cloud.storage.bucket import EncryptionEnforcementConfig + + bucket = self._make_bucket() + encryption = self._make_one(bucket) + + encryption.default_kms_key_name = "new-key" + config = EncryptionEnforcementConfig("NotRestricted") + encryption.google_managed_encryption_enforcement_config = config + encryption.customer_managed_encryption_enforcement_config = config + encryption.customer_supplied_encryption_enforcement_config = config + + self.assertEqual(bucket._patch_property.call_count, 4) + bucket._patch_property.assert_called_with("encryption", encryption) + + def test_bucket_encryption_getters_handle_none(self): + bucket = self._make_bucket() + encryption = self._get_target_class()(bucket) + encryption["googleManagedEncryptionEnforcementConfig"] = None + + config = encryption.google_managed_encryption_enforcement_config + self.assertIsNone(config) From 14cfd61ce35365a409650981239ef742cdf375fb Mon Sep 17 00:00:00 2001 From: Margubur Rahman <150442997+googlyrahman@users.noreply.github.com> Date: Tue, 17 Mar 2026 17:10:04 +0530 Subject: [PATCH 498/509] feat(storage): Use raw proto access for read resumption strategy (#1764) The proto-plus library provides protocol buffer message classes that behave like native Python types. While convenient, my profiling confirms this abstraction comes with a significant performance penalty in our hot paths. Every time we access a field on a proto-plus object, the library triggers dynamic lookups and wrapper instantiation. In our hot data ingestion loop, this overhead accumulates rapidly over multiple chunks. My benchmarking shows that accessing the underlying C++ Protobuf directly is ~2x faster than going through the proto-plus wrapper (measured over 30,000 iterations). While 30,000 operations might sound high, it corresponds to downloading just 60GB of data (assuming 2MB chunks) for accessing just one attribute. For high-performance workloads (e.g., downloading at 1GB/s) so it only takes 60s to complete the process. Additionally this wrapper overhead introduces measurable latency not just for data access, but for every metadata check and state update that repeats per chunk. This PR bypass proto-plus in our critical IO loops and interact directly with the underlying C++ Protobuf structures. This eliminates the "Wrapper tax" without changing the external behavior of the application. --- .../retry/reads_resumption_strategy.py | 26 ++++++++++++------- tests/perf/microbenchmarks/_utils.py | 17 ++++++------ .../microbenchmarks/time_based/conftest.py | 2 +- .../time_based/reads/test_reads.py | 1 - .../test_async_appendable_object_writer.py | 18 ++++++------- 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py b/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py index 468954332..e7003c105 100644 --- a/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py +++ b/google/cloud/storage/asyncio/retry/reads_resumption_strategy.py @@ -81,23 +81,28 @@ def update_state_from_response( self, response: storage_v2.BidiReadObjectResponse, state: Dict[str, Any] ) -> None: """Processes a server response, performs integrity checks, and updates state.""" + proto = getattr(response, "_pb", response) # Capture read_handle if provided. - if response.read_handle: - state["read_handle"] = response.read_handle + if proto.HasField("read_handle"): + state["read_handle"] = storage_v2.BidiReadHandle( + handle=proto.read_handle.handle + ) download_states = state["download_states"] - for object_data_range in response.object_data_ranges: + for object_data_range in proto.object_data_ranges: # Ignore empty ranges or ranges for IDs not in our state # (e.g., from a previously cancelled request on the same stream). - if not object_data_range.read_range: + if not object_data_range.HasField("read_range"): logger.warning( "Received response with missing read_range field; ignoring." ) continue - read_id = object_data_range.read_range.read_id + read_range_pb = object_data_range.read_range + read_id = read_range_pb.read_id + if read_id not in download_states: logger.warning( f"Received data for unknown or stale read_id {read_id}; ignoring." @@ -107,7 +112,8 @@ def update_state_from_response( read_state = download_states[read_id] # Offset Verification - chunk_offset = object_data_range.read_range.read_offset + # We must validate data before updating state or writing to buffer. + chunk_offset = read_range_pb.read_offset if chunk_offset != read_state.next_expected_offset: raise DataCorruption( response, @@ -116,11 +122,11 @@ def update_state_from_response( ) # Checksum Verification - # We must validate data before updating state or writing to buffer. - data = object_data_range.checksummed_data.content - server_checksum = object_data_range.checksummed_data.crc32c + checksummed_data = object_data_range.checksummed_data + data = checksummed_data.content - if server_checksum is not None: + if checksummed_data.HasField("crc32c"): + server_checksum = checksummed_data.crc32c client_checksum = int.from_bytes(Checksum(data).digest(), "big") if server_checksum != client_checksum: raise DataCorruption( diff --git a/tests/perf/microbenchmarks/_utils.py b/tests/perf/microbenchmarks/_utils.py index edf398fe9..9e5609500 100644 --- a/tests/perf/microbenchmarks/_utils.py +++ b/tests/perf/microbenchmarks/_utils.py @@ -18,7 +18,8 @@ import socket import psutil -_C4_STANDARD_192_NIC = "ens3" # can be fetched via ip link show +_C4_STANDARD_192_NIC = "ens3" # can be fetched via ip link show + def publish_benchmark_extra_info( benchmark: Any, @@ -28,7 +29,6 @@ def publish_benchmark_extra_info( download_bytes_list: Optional[List[int]] = None, duration: Optional[int] = None, ) -> None: - """ Helper function to publish benchmark parameters to the extra_info property. """ @@ -48,14 +48,15 @@ def publish_benchmark_extra_info( benchmark.group = benchmark_group if download_bytes_list is not None: - assert duration is not None, "Duration must be provided if total_bytes_transferred is provided." + assert ( + duration is not None + ), "Duration must be provided if total_bytes_transferred is provided." throughputs_list = [x / duration / (1024 * 1024) for x in download_bytes_list] min_throughput = min(throughputs_list) max_throughput = max(throughputs_list) mean_throughput = statistics.mean(throughputs_list) median_throughput = statistics.median(throughputs_list) - else: object_size = params.file_size_bytes num_files = params.num_files @@ -211,13 +212,13 @@ def get_affinity(irq): def get_primary_interface_name(): primary_ip = None - + # 1. Determine the Local IP used for internet access # We use UDP (SOCK_DGRAM) so we don't actually send a handshake/packet s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # connect() to a public IP (Google DNS) to force route resolution - s.connect(('8.8.8.8', 80)) + s.connect(("8.8.8.8", 80)) primary_ip = s.getsockname()[0] except Exception: # Fallback if no internet @@ -248,7 +249,7 @@ def get_irq_affinity(): for irq in irqs: affinity_str = get_affinity(irq) if affinity_str != "N/A": - for part in affinity_str.split(','): - if '-' not in part: + for part in affinity_str.split(","): + if "-" not in part: cpus.add(int(part)) return cpus diff --git a/tests/perf/microbenchmarks/time_based/conftest.py b/tests/perf/microbenchmarks/time_based/conftest.py index bcd186d7b..5c0c787f0 100644 --- a/tests/perf/microbenchmarks/time_based/conftest.py +++ b/tests/perf/microbenchmarks/time_based/conftest.py @@ -17,5 +17,5 @@ @pytest.fixture def workload_params(request): params = request.param - files_names = [f'fio-go_storage_fio.0.{i}' for i in range(0, params.num_processes)] + files_names = [f"fio-go_storage_fio.0.{i}" for i in range(0, params.num_processes)] return params, files_names diff --git a/tests/perf/microbenchmarks/time_based/reads/test_reads.py b/tests/perf/microbenchmarks/time_based/reads/test_reads.py index f2b84158b..17e6d48fd 100644 --- a/tests/perf/microbenchmarks/time_based/reads/test_reads.py +++ b/tests/perf/microbenchmarks/time_based/reads/test_reads.py @@ -159,7 +159,6 @@ async def _download_time_based_async(client, filename, params): def _download_files_worker(process_idx, filename, params, bucket_type): - if bucket_type == "zonal": return worker_loop.run_until_complete( _download_time_based_async(worker_client, filename, params) diff --git a/tests/unit/asyncio/test_async_appendable_object_writer.py b/tests/unit/asyncio/test_async_appendable_object_writer.py index 51ce43e6e..c19d6f4ad 100644 --- a/tests/unit/asyncio/test_async_appendable_object_writer.py +++ b/tests/unit/asyncio/test_async_appendable_object_writer.py @@ -175,9 +175,9 @@ async def test_state_lookup(self, mock_appendable_writer): writer._is_stream_open = True writer.write_obj_stream = mock_appendable_writer["mock_stream"] - mock_appendable_writer["mock_stream"].recv.return_value = ( - storage_type.BidiWriteObjectResponse(persisted_size=100) - ) + mock_appendable_writer[ + "mock_stream" + ].recv.return_value = storage_type.BidiWriteObjectResponse(persisted_size=100) size = await writer.state_lookup() @@ -388,9 +388,9 @@ async def test_flush_resets_counters(self, mock_appendable_writer): writer.write_obj_stream = mock_appendable_writer["mock_stream"] writer.bytes_appended_since_last_flush = 100 - mock_appendable_writer["mock_stream"].recv.return_value = ( - storage_type.BidiWriteObjectResponse(persisted_size=200) - ) + mock_appendable_writer[ + "mock_stream" + ].recv.return_value = storage_type.BidiWriteObjectResponse(persisted_size=200) await writer.flush() @@ -431,9 +431,9 @@ async def test_finalize_lifecycle(self, mock_appendable_writer): writer.write_obj_stream = mock_appendable_writer["mock_stream"] resource = storage_type.Object(size=999) - mock_appendable_writer["mock_stream"].recv.return_value = ( - storage_type.BidiWriteObjectResponse(resource=resource) - ) + mock_appendable_writer[ + "mock_stream" + ].recv.return_value = storage_type.BidiWriteObjectResponse(resource=resource) res = await writer.finalize() From c5735c377d31e9131a3c507098ef659e8112d62e Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 18 Mar 2026 17:43:27 +0530 Subject: [PATCH 499/509] feat(storage): support returning skipped items as UserWarning in download_many_to_path (#1773) This PR updates `download_many_to_path` return type in transfer_manager.py It now returns `List[None|Exception|UserWarning]` - `None` for successful download - `UserWarning` for - file skipped because `skip_if_exists=True` was provided and file exists. - Resolve path in either invalid or skips destination_directory (because of `..`) - `Exception` if error occurred during download. --- google/cloud/storage/transfer_manager.py | 33 ++++++--- tests/system/test_transfer_manager.py | 86 +++++++++++++++++++++++- tests/unit/test_transfer_manager.py | 84 ++++++++++++++++++++--- 3 files changed, 184 insertions(+), 19 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index c655244b0..b72c9ab24 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -805,43 +805,60 @@ def download_many_to_path( :raises: :exc:`concurrent.futures.TimeoutError` if deadline is exceeded. - :rtype: list + :rtype: List[None|Exception|UserWarning] :returns: A list of results corresponding to, in order, each item in the - input list. If an exception was received, it will be the result - for that operation. Otherwise, the return value from the successful - download method is used (which will be None). + input list. If an exception was received or a download was skipped + (e.g., due to existing file or path traversal), it will be the result + for that operation (as an Exception or UserWarning, respectively). + Otherwise, the result will be None for a successful download. """ + results = [None] * len(blob_names) blob_file_pairs = [] + indices_to_process = [] - for blob_name in blob_names: + for i, blob_name in enumerate(blob_names): full_blob_name = blob_name_prefix + blob_name resolved_path = _resolve_path(destination_directory, blob_name) if not resolved_path.parent.is_relative_to( Path(destination_directory).resolve() ): - warnings.warn( + msg = ( f"The blob {blob_name} will **NOT** be downloaded. " f"The resolved destination_directory - {resolved_path.parent} - is either invalid or " f"escapes user provided {Path(destination_directory).resolve()} . Please download this file separately using `download_to_filename`" ) + warnings.warn(msg) + results[i] = UserWarning(msg) continue resolved_path = str(resolved_path) + if skip_if_exists and os.path.isfile(resolved_path): + msg = f"The blob {blob_name} is skipped because destination file already exists" + results[i] = UserWarning(msg) + continue + if create_directories: directory, _ = os.path.split(resolved_path) os.makedirs(directory, exist_ok=True) blob_file_pairs.append((bucket.blob(full_blob_name), resolved_path)) + indices_to_process.append(i) - return download_many( + many_results = download_many( blob_file_pairs, download_kwargs=download_kwargs, deadline=deadline, raise_exception=raise_exception, worker_type=worker_type, max_workers=max_workers, - skip_if_exists=skip_if_exists, + skip_if_exists=False, # skip_if_exists is handled in the loop above ) + for meta_index, result in zip(indices_to_process, many_results): + results[meta_index] = result + + return results + + def download_chunks_concurrently( blob, diff --git a/tests/system/test_transfer_manager.py b/tests/system/test_transfer_manager.py index 844562c90..6bb0e03fd 100644 --- a/tests/system/test_transfer_manager.py +++ b/tests/system/test_transfer_manager.py @@ -187,8 +187,9 @@ def test_download_many_to_path_skips_download( [str(warning.message) for warning in w] ) - # 1 total - 1 skipped = 0 results - assert len(results) == 0 + # 1 total - 1 skipped = 1 result (containing Warning) + assert len(results) == 1 + assert isinstance(results[0], UserWarning) @pytest.mark.parametrize( @@ -266,6 +267,87 @@ def test_download_many_to_path_downloads_within_dest_dir( assert downloaded_contents == source_contents + +def test_download_many_to_path_mixed_results( + shared_bucket, file_data, blobs_to_delete +): + """ + Test download_many_to_path with successful downloads, skip_if_exists skips, and path traversal skips. + """ + PREFIX = "mixed_results/" + BLOBNAMES = [ + "success1.txt", + "success2.txt", + "exists.txt", + "../escape.txt" + ] + + FILE_BLOB_PAIRS = [ + ( + file_data["simple"]["path"], + shared_bucket.blob(PREFIX + name), + ) + for name in BLOBNAMES + ] + + results = transfer_manager.upload_many( + FILE_BLOB_PAIRS, + skip_if_exists=True, + deadline=DEADLINE, + ) + for result in results: + assert result is None + + blobs = list(shared_bucket.list_blobs(prefix=PREFIX)) + blobs_to_delete.extend(blobs) + assert len(blobs) == 4 + + # Actual Test + with tempfile.TemporaryDirectory() as tempdir: + existing_file_path = os.path.join(tempdir, "exists.txt") + with open(existing_file_path, "w") as f: + f.write("already here") + + import warnings + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + results = transfer_manager.download_many_to_path( + shared_bucket, + BLOBNAMES, + destination_directory=tempdir, + blob_name_prefix=PREFIX, + deadline=DEADLINE, + create_directories=True, + skip_if_exists=True, + ) + + assert len(results) == 4 + + path_traversal_warnings = [ + warning + for warning in w + if str(warning.message).startswith("The blob ") + and "will **NOT** be downloaded. The resolved destination_directory" + in str(warning.message) + ] + assert len(path_traversal_warnings) == 1, "---".join( + [str(warning.message) for warning in w] + ) + + assert results[0] is None + assert results[1] is None + assert isinstance(results[2], UserWarning) + assert "skipped because destination file already exists" in str(results[2]) + assert isinstance(results[3], UserWarning) + assert "will **NOT** be downloaded" in str(results[3]) + + assert os.path.exists(os.path.join(tempdir, "success1.txt")) + assert os.path.exists(os.path.join(tempdir, "success2.txt")) + + with open(existing_file_path, "r") as f: + assert f.read() == "already here" + + def test_download_many(listable_bucket): blobs = list(listable_bucket.list_blobs()) with tempfile.TemporaryDirectory() as tempdir: diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 85ffd9eaa..799bfd314 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -530,9 +530,10 @@ def test_download_many_to_path(): ] with mock.patch( - "google.cloud.storage.transfer_manager.download_many" + "google.cloud.storage.transfer_manager.download_many", + return_value=[FAKE_RESULT] * len(BLOBNAMES), ) as mock_download_many: - transfer_manager.download_many_to_path( + results = transfer_manager.download_many_to_path( bucket, BLOBNAMES, destination_directory=PATH_ROOT, @@ -553,11 +554,71 @@ def test_download_many_to_path(): raise_exception=True, max_workers=MAX_WORKERS, worker_type=WORKER_TYPE, - skip_if_exists=True, + skip_if_exists=False, ) + assert results == [FAKE_RESULT] * len(BLOBNAMES) for blobname in BLOBNAMES: bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) +def test_download_many_to_path_with_skip_if_exists(): + bucket = mock.Mock() + + BLOBNAMES = ["file_a.txt", "file_b.txt", "dir_a/file_c.txt"] + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + WORKER_TYPE = transfer_manager.THREAD + + from google.cloud.storage.transfer_manager import _resolve_path + + existing_file = str(_resolve_path(PATH_ROOT, "file_a.txt")) + + def isfile_side_effect(path): + return path == existing_file + + EXPECTED_BLOB_FILE_PAIRS = [ + (mock.ANY, str(_resolve_path(PATH_ROOT, "file_b.txt"))), + (mock.ANY, str(_resolve_path(PATH_ROOT, "dir_a/file_c.txt"))), + ] + + with mock.patch("os.path.isfile", side_effect=isfile_side_effect): + with mock.patch( + "google.cloud.storage.transfer_manager.download_many", + return_value=[FAKE_RESULT, FAKE_RESULT], + ) as mock_download_many: + results = transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + create_directories=False, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=True, + ) + + mock_download_many.assert_called_once_with( + EXPECTED_BLOB_FILE_PAIRS, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=False, + ) + + assert len(results) == 3 + assert isinstance(results[0], UserWarning) + assert str(results[0]) == "The blob file_a.txt is skipped because destination file already exists" + assert results[1] == FAKE_RESULT + assert results[2] == FAKE_RESULT + + @pytest.mark.parametrize( "blobname", @@ -584,9 +645,10 @@ def test_download_many_to_path_skips_download(blobname): with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") with mock.patch( - "google.cloud.storage.transfer_manager.download_many" + "google.cloud.storage.transfer_manager.download_many", + return_value=[], ) as mock_download_many: - transfer_manager.download_many_to_path( + results = transfer_manager.download_many_to_path( bucket, BLOBNAMES, destination_directory=PATH_ROOT, @@ -614,8 +676,10 @@ def test_download_many_to_path_skips_download(blobname): raise_exception=True, max_workers=MAX_WORKERS, worker_type=WORKER_TYPE, - skip_if_exists=True, + skip_if_exists=False, ) + assert len(results) == 1 + assert isinstance(results[0], UserWarning) @pytest.mark.parametrize( @@ -649,9 +713,10 @@ def test_download_many_to_path_downloads_within_dest_dir(blobname): ] with mock.patch( - "google.cloud.storage.transfer_manager.download_many" + "google.cloud.storage.transfer_manager.download_many", + return_value=[FAKE_RESULT], ) as mock_download_many: - transfer_manager.download_many_to_path( + results = transfer_manager.download_many_to_path( bucket, BLOBNAMES, destination_directory=PATH_ROOT, @@ -672,8 +737,9 @@ def test_download_many_to_path_downloads_within_dest_dir(blobname): raise_exception=True, max_workers=MAX_WORKERS, worker_type=WORKER_TYPE, - skip_if_exists=True, + skip_if_exists=False, ) + assert results == [FAKE_RESULT] bucket.blob.assert_any_call(BLOB_NAME_PREFIX + blobname) From 558198823ed51918db9c0137715d1e7f5b593975 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 18 Mar 2026 19:10:42 +0530 Subject: [PATCH 500/509] fix(storage): skip downloading blobs whose name contain `":" ` eg: `C:` `D:` etc when application runs in Windows. (#1774) skip downloading blobs whose name contain `":" ` eg: `C:` `D:` etc when application runs in Windows. --- google/cloud/storage/exceptions.py | 6 +++ google/cloud/storage/transfer_manager.py | 12 +++++- tests/unit/test_transfer_manager.py | 51 ++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/google/cloud/storage/exceptions.py b/google/cloud/storage/exceptions.py index 4eb05cef7..12f69071b 100644 --- a/google/cloud/storage/exceptions.py +++ b/google/cloud/storage/exceptions.py @@ -33,6 +33,12 @@ DataCorruptionDynamicParent = Exception +class InvalidPathError(Exception): + """Raised when the provided path string is malformed.""" + + pass + + class InvalidResponse(InvalidResponseDynamicParent): """Error class for responses which are not in the correct state. diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index b72c9ab24..3741fd0b6 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -39,7 +39,7 @@ from google.cloud.storage._media.requests.upload import XMLMPUContainer from google.cloud.storage._media.requests.upload import XMLMPUPart -from google.cloud.storage.exceptions import DataCorruption +from google.cloud.storage.exceptions import DataCorruption, InvalidPathError TM_DEFAULT_CHUNK_SIZE = 32 * 1024 * 1024 DEFAULT_MAX_WORKERS = 8 @@ -263,6 +263,8 @@ def upload_many( def _resolve_path(target_dir, blob_path): + if os.name == "nt" and ":" in blob_path: + raise InvalidPathError(f"{blob_path} cannot be downloaded into {target_dir}") target_dir = Path(target_dir) blob_path = Path(blob_path) # blob_path.anchor will be '/' if `blob_path` is full path else it'll empty. @@ -818,7 +820,13 @@ def download_many_to_path( for i, blob_name in enumerate(blob_names): full_blob_name = blob_name_prefix + blob_name - resolved_path = _resolve_path(destination_directory, blob_name) + try: + resolved_path = _resolve_path(destination_directory, blob_name) + except InvalidPathError as e: + msg = f"The blob {blob_name} will **NOT** be downloaded. {e}" + warnings.warn(msg) + results[i] = UserWarning(msg) + continue if not resolved_path.parent.is_relative_to( Path(destination_directory).resolve() ): diff --git a/tests/unit/test_transfer_manager.py b/tests/unit/test_transfer_manager.py index 799bfd314..90c5c478a 100644 --- a/tests/unit/test_transfer_manager.py +++ b/tests/unit/test_transfer_manager.py @@ -513,6 +513,57 @@ def test_upload_many_from_filenames_additional_properties(): assert getattr(blob, attrib) == value + +def test__resolve_path_raises_invalid_path_error_on_windows(): + from google.cloud.storage.transfer_manager import _resolve_path, InvalidPathError + + with mock.patch("os.name", "nt"): + with pytest.raises(InvalidPathError) as exc_info: + _resolve_path("C:\\target", "C:\\target\\file.txt") + assert "cannot be downloaded into" in str(exc_info.value) + + # Test that it DOES NOT raise on non-windows + with mock.patch("os.name", "posix"): + # Should not raise + _resolve_path("/target", "C:\\target\\file.txt") + + +def test_download_many_to_path_raises_invalid_path_error(): + bucket = mock.Mock() + + BLOBNAMES = ["C:\\target\\file.txt"] + PATH_ROOT = "mypath/" + BLOB_NAME_PREFIX = "myprefix/" + DOWNLOAD_KWARGS = {"accept-encoding": "fake-gzip"} + MAX_WORKERS = 7 + DEADLINE = 10 + WORKER_TYPE = transfer_manager.THREAD + + with mock.patch("os.name", "nt"): + import warnings + + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + results = transfer_manager.download_many_to_path( + bucket, + BLOBNAMES, + destination_directory=PATH_ROOT, + blob_name_prefix=BLOB_NAME_PREFIX, + download_kwargs=DOWNLOAD_KWARGS, + deadline=DEADLINE, + create_directories=False, + raise_exception=True, + max_workers=MAX_WORKERS, + worker_type=WORKER_TYPE, + skip_if_exists=True, + ) + + assert len(w) == 1 + assert "will **NOT** be downloaded" in str(w[0].message) + assert len(results) == 1 + assert isinstance(results[0], UserWarning) + + def test_download_many_to_path(): bucket = mock.Mock() From 21bb20f4f3fe428388a9339841c68b2dcad029af Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 18 Mar 2026 20:28:49 +0530 Subject: [PATCH 501/509] feat(samples): add argparse and clarify traversal support in download_many snippet (#1775) This PR adds argparse support to the download_many snippet for CLI testing, and updates the description containing traversal safety. --- google/cloud/storage/transfer_manager.py | 1 - .../storage_transfer_manager_download_many.py | 78 ++++++++++++++++--- 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/google/cloud/storage/transfer_manager.py b/google/cloud/storage/transfer_manager.py index 3741fd0b6..7f4173690 100644 --- a/google/cloud/storage/transfer_manager.py +++ b/google/cloud/storage/transfer_manager.py @@ -867,7 +867,6 @@ def download_many_to_path( return results - def download_chunks_concurrently( blob, filename, diff --git a/samples/snippets/storage_transfer_manager_download_many.py b/samples/snippets/storage_transfer_manager_download_many.py index 02cb9b887..447d0869c 100644 --- a/samples/snippets/storage_transfer_manager_download_many.py +++ b/samples/snippets/storage_transfer_manager_download_many.py @@ -12,9 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Example usage: +# python samples/snippets/storage_transfer_manager_download_many.py \ +# --bucket_name \ +# --blobs \ +# --destination_directory \ +# --blob_name_prefix + + # [START storage_transfer_manager_download_many] def download_many_blobs_with_transfer_manager( - bucket_name, blob_names, destination_directory="", workers=8 + bucket_name, blob_names, destination_directory="", blob_name_prefix="", workers=8 ): """Download blobs in a list by name, concurrently in a process pool. @@ -36,11 +44,11 @@ def download_many_blobs_with_transfer_manager( # blob_names = ["myblob", "myblob2"] # The directory on your computer to which to download all of the files. This - # string is prepended (with os.path.join()) to the name of each blob to form - # the full path. Relative paths and absolute paths are both accepted. An - # empty string means "the current working directory". Note that this - # parameter allows accepts directory traversal ("../" etc.) and is not - # intended for unsanitized end user input. + # string is prepended to the name of each blob to form the full path using + # pathlib. Relative paths and absolute paths are both accepted. An empty + # string means "the current working directory". Note that this parameter + # will NOT allow files to escape the destination_directory and will skip + # downloads that attempt directory traversal outside of it. # destination_directory = "" # The maximum number of processes to use for the operation. The performance @@ -56,15 +64,63 @@ def download_many_blobs_with_transfer_manager( bucket = storage_client.bucket(bucket_name) results = transfer_manager.download_many_to_path( - bucket, blob_names, destination_directory=destination_directory, max_workers=workers + bucket, + blob_names, + destination_directory=destination_directory, + blob_name_prefix=blob_name_prefix, + max_workers=workers, ) for name, result in zip(blob_names, results): - # The results list is either `None` or an exception for each blob in + # The results list is either `None`, an exception, or a warning for each blob in # the input list, in order. - - if isinstance(result, Exception): + if isinstance(result, UserWarning): + print("Skipped download for {} due to warning: {}".format(name, result)) + elif isinstance(result, Exception): print("Failed to download {} due to exception: {}".format(name, result)) else: - print("Downloaded {} to {}.".format(name, destination_directory + name)) + print( + "Downloaded {} inside {} directory.".format(name, destination_directory) + ) + + # [END storage_transfer_manager_download_many] + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser( + description="Download blobs in a list by name, concurrently in a process pool." + ) + parser.add_argument( + "--bucket_name", required=True, help="The name of your GCS bucket" + ) + parser.add_argument( + "--blobs", + nargs="+", + required=True, + help="The list of blob names to download", + ) + parser.add_argument( + "--destination_directory", + default="", + help="The directory on your computer to which to download all of the files", + ) + parser.add_argument( + "--blob_name_prefix", + default="", + help="A string that will be prepended to each blob_name to determine the source blob name", + ) + parser.add_argument( + "--workers", type=int, default=8, help="The maximum number of processes to use" + ) + + args = parser.parse_args() + + download_many_blobs_with_transfer_manager( + bucket_name=args.bucket_name, + blob_names=args.blobs, + destination_directory=args.destination_directory, + blob_name_prefix=args.blob_name_prefix, + workers=args.workers, + ) From 8b7fbde10c80337c4b4a2f6c8a860e28371a770b Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Wed, 18 Mar 2026 21:07:03 +0530 Subject: [PATCH 502/509] chore: librarian release pull request: 20260318T145147Z (#1776) PR created by the Librarian CLI to initialize a release. Merging this PR will auto trigger a release. Librarian Version: v1.0.2-0.20251119154421-36c3e21ad3ac Language Image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91
    google-cloud-storage: 3.10.0 ## [3.10.0](https://github.com/googleapis/python-storage/compare/v3.9.0...v3.10.0) (2026-03-18) ### Features * [Bucket Encryption Enforcement] add support for bucket encryption enforcement config (#1742) ([2a6e8b00e4e6ff57460373f8e628fd363be47811](https://github.com/googleapis/python-storage/commit/2a6e8b00e4e6ff57460373f8e628fd363be47811)) ### Perf Improvments * [Rapid Buckets Reads] Use raw proto access for read resumption strategy (#1764) ([14cfd61ce35365a409650981239ef742cdf375fb](https://github.com/googleapis/python-storage/commit/14cfd61ce35365a409650981239ef742cdf375fb)) * [Rapid Buckets Benchmarks] init mp pool & grpc client once, use os.sched_setaffinity (#1751) ([a9eb82c1b9b3c6ae5717d47b76284ed0deb5f769](https://github.com/googleapis/python-storage/commit/a9eb82c1b9b3c6ae5717d47b76284ed0deb5f769)) * [Rapid Buckets Writes] don't flush at every append, results in bad perf (#1746) ([ab62d728ac7d7be3c4fe9a99d72e35ead310805a](https://github.com/googleapis/python-storage/commit/ab62d728ac7d7be3c4fe9a99d72e35ead310805a)) ### Bug Fixes * [Windows] skip downloading blobs whose name contain `":" ` eg: `C:` `D:` etc when application runs in Windows. (#1774) ([558198823ed51918db9c0137715d1e7f5b593975](https://github.com/googleapis/python-storage/commit/558198823ed51918db9c0137715d1e7f5b593975)) * [Path Traversal] Prevent path traversal in `download_many_to_path` (#1768) ([700fec3bf7aa37bd5ea4b163cc3f9e8e6892bd5a](https://github.com/googleapis/python-storage/commit/700fec3bf7aa37bd5ea4b163cc3f9e8e6892bd5a)) * [Rapid Buckets] pass token correctly, '&' instead of ',' (#1756) ([d8dd1e074d2431de9b45e0103181dce749a447a0](https://github.com/googleapis/python-storage/commit/d8dd1e074d2431de9b45e0103181dce749a447a0))
    --- .librarian/state.yaml | 2 +- CHANGELOG.md | 21 +++++++++++++++++++ google/cloud/_storage_v2/gapic_version.py | 2 +- google/cloud/storage/version.py | 2 +- .../snippet_metadata_google.storage.v2.json | 2 +- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index 80e2355be..d91f3f9be 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -1,7 +1,7 @@ image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 libraries: - id: google-cloud-storage - version: 3.9.0 + version: 3.10.0 last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab apis: - path: google/storage/v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c46db115..297ef7a1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.10.0](https://github.com/googleapis/python-storage/compare/v3.9.0...v3.10.0) (2026-03-18) + + +### Features + +* [Bucket Encryption Enforcement] add support for bucket encryption enforcement config (#1742) ([2a6e8b00e4e6ff57460373f8e628fd363be47811](https://github.com/googleapis/python-storage/commit/2a6e8b00e4e6ff57460373f8e628fd363be47811)) + +### Perf Improvments + +* [Rapid Buckets Reads] Use raw proto access for read resumption strategy (#1764) ([14cfd61ce35365a409650981239ef742cdf375fb](https://github.com/googleapis/python-storage/commit/14cfd61ce35365a409650981239ef742cdf375fb)) +* [Rapid Buckets Benchmarks] init mp pool & grpc client once, use os.sched_setaffinity (#1751) ([a9eb82c1b9b3c6ae5717d47b76284ed0deb5f769](https://github.com/googleapis/python-storage/commit/a9eb82c1b9b3c6ae5717d47b76284ed0deb5f769)) +* [Rapid Buckets Writes] don't flush at every append, results in bad perf (#1746) ([ab62d728ac7d7be3c4fe9a99d72e35ead310805a](https://github.com/googleapis/python-storage/commit/ab62d728ac7d7be3c4fe9a99d72e35ead310805a)) + + +### Bug Fixes + +* [Windows] skip downloading blobs whose name contain `":" ` eg: `C:` `D:` etc when application runs in Windows. (#1774) ([558198823ed51918db9c0137715d1e7f5b593975](https://github.com/googleapis/python-storage/commit/558198823ed51918db9c0137715d1e7f5b593975)) +* [Path Traversal] Prevent path traversal in `download_many_to_path` (#1768) ([700fec3bf7aa37bd5ea4b163cc3f9e8e6892bd5a](https://github.com/googleapis/python-storage/commit/700fec3bf7aa37bd5ea4b163cc3f9e8e6892bd5a)) +* [Rapid Buckets] pass token correctly, '&' instead of ',' (#1756) ([d8dd1e074d2431de9b45e0103181dce749a447a0](https://github.com/googleapis/python-storage/commit/d8dd1e074d2431de9b45e0103181dce749a447a0)) + + ## [3.9.0](https://github.com/googleapis/python-storage/compare/v3.8.0...v3.9.0) (2026-02-02) diff --git a/google/cloud/_storage_v2/gapic_version.py b/google/cloud/_storage_v2/gapic_version.py index 0d5599e8b..af050a89f 100644 --- a/google/cloud/_storage_v2/gapic_version.py +++ b/google/cloud/_storage_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.9.0" # {x-release-please-version} +__version__ = "3.10.0" # {x-release-please-version} diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index 0bc275357..b674396b2 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.9.0" +__version__ = "3.10.0" diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json index 1889f0c5d..45582dd31 100644 --- a/samples/generated_samples/snippet_metadata_google.storage.v2.json +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage", - "version": "3.9.0" + "version": "3.10.0" }, "snippets": [ { From 17828ea316872938a98a6360b10a2495c54bbbcb Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Fri, 20 Mar 2026 16:28:43 +0530 Subject: [PATCH 503/509] fix: raise ValueError if api_endpoint is unset when using AnonymousCredentials in AsyncGrpcClient. (#1778) Added validation to ensure `api_endpoint` is provided when using `AnonymousCredentials` in `AsyncGrpcClient`. --- .../cloud/storage/asyncio/async_grpc_client.py | 4 ++++ tests/unit/asyncio/test_async_grpc_client.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/google/cloud/storage/asyncio/async_grpc_client.py b/google/cloud/storage/asyncio/async_grpc_client.py index 88566b246..90ca78bfb 100644 --- a/google/cloud/storage/asyncio/async_grpc_client.py +++ b/google/cloud/storage/asyncio/async_grpc_client.py @@ -55,6 +55,10 @@ def __init__( attempt_direct_path=True, ): if isinstance(credentials, auth_credentials.AnonymousCredentials): + if client_options is None or client_options.api_endpoint is None: + raise ValueError( + "Either client_options or `client_option.api_endpoint` is None. Please provide api_endpoint when `AnonymousCredentials` is used " + ) self._grpc_client = self._create_anonymous_client( client_options, credentials ) diff --git a/tests/unit/asyncio/test_async_grpc_client.py b/tests/unit/asyncio/test_async_grpc_client.py index 06cb232d5..09556452e 100644 --- a/tests/unit/asyncio/test_async_grpc_client.py +++ b/tests/unit/asyncio/test_async_grpc_client.py @@ -184,6 +184,23 @@ def test_grpc_client_with_anon_creds( transport = kwargs["transport"] assert isinstance(transport._credentials, AnonymousCredentials) + def test_grpc_client_with_anon_creds_no_client_options(self): + # Act & Assert + message = "Either client_options or `client_option.api_endpoint` is None. Please provide api_endpoint when `AnonymousCredentials` is used " + with pytest.raises(ValueError, match=message): + async_grpc_client.AsyncGrpcClient( + credentials=AnonymousCredentials(), + ) + + def test_grpc_client_with_anon_creds_empty_client_options(self): + # Act & Assert + message = "Either client_options or `client_option.api_endpoint` is None. Please provide api_endpoint when `AnonymousCredentials` is used " + with pytest.raises(ValueError, match=message): + async_grpc_client.AsyncGrpcClient( + client_options=client_options.ClientOptions(), + credentials=AnonymousCredentials(), + ) + @mock.patch("google.cloud._storage_v2.StorageAsyncClient") def test_user_agent_with_custom_client_info(self, mock_async_storage_client): """Test that gcloud-python user agent is appended to existing user agent. From f768af735dc8e3f44b196d0652c615d5fa3d7862 Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 23 Mar 2026 10:28:09 +0530 Subject: [PATCH 504/509] chore: run bidi_tests independently (#1781) chore: run bidi conformance tests independently. --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- noxfile.py | 53 ++++++++++++++++++++++------ tests/conformance/test_bidi_reads.py | 40 ++++++++------------- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/noxfile.py b/noxfile.py index 6bce85327..77823d28d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -44,6 +44,7 @@ nox.options.sessions = [ "blacken", "conftest_retry", + "conftest_retry_bidi", "docfx", "docs", "lint", @@ -221,10 +222,9 @@ def system(session): @nox.session(python=CONFORMANCE_TEST_PYTHON_VERSIONS) def conftest_retry(session): """Run the retry conformance test suite.""" - conformance_test_folder_path = os.path.join("tests", "conformance") - conformance_test_folder_exists = os.path.exists(conformance_test_folder_path) + json_conformance_tests = "tests/conformance/test_conformance.py" # Environment check: only run tests if found. - if not conformance_test_folder_exists: + if not os.path.exists(json_conformance_tests): session.skip("Conformance tests were not found") constraints_path = str( @@ -236,10 +236,6 @@ def conftest_retry(session): session.install( "pytest", "pytest-xdist", - "pytest-asyncio", - "grpcio", - "grpcio-status", - "grpc-google-iam-v1", "-c", constraints_path, ) @@ -251,17 +247,52 @@ def conftest_retry(session): "pytest", "-vv", "-s", - # "--quiet", - conformance_test_folder_path, + json_conformance_tests, *session.posargs, ] else: - test_cmd = ["pytest", "-vv", "-s", "-n", "auto", conformance_test_folder_path] + test_cmd = ["pytest", "-vv", "-s", "-n", "auto", json_conformance_tests] - # Run py.test against the conformance tests. + # Run pytest against the conformance tests. session.run(*test_cmd, env={"DOCKER_API_VERSION": "1.39"}) +@nox.session(python=CONFORMANCE_TEST_PYTHON_VERSIONS) +def conftest_retry_bidi(session): + """Run the retry conformance test suite.""" + + constraints_path = str( + CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" + ) + + # Install all test dependencies and pytest plugin to run tests in parallel. + # Then install this package in-place. + session.install( + "pytest", + "pytest-xdist", + "pytest-asyncio", + "grpcio", + "grpcio-status", + "grpc-google-iam-v1", + "-c", + constraints_path, + ) + session.install("-e", ".", "-c", constraints_path) + + bidi_tests = [ + "tests/conformance/test_bidi_reads.py", + "tests/conformance/test_bidi_writes.py", + ] + for test_file in bidi_tests: + session.run( + "pytest", + "-vv", + "-s", + test_file, + env={"DOCKER_API_VERSION": "1.39"}, + ) + + @nox.session(python=DEFAULT_PYTHON_VERSION) def cover(session): """Run the final coverage report. diff --git a/tests/conformance/test_bidi_reads.py b/tests/conformance/test_bidi_reads.py index efb9671a3..8f0c43c4a 100644 --- a/tests/conformance/test_bidi_reads.py +++ b/tests/conformance/test_bidi_reads.py @@ -5,16 +5,18 @@ import urllib import uuid -import grpc import pytest import requests from google.api_core import client_options, exceptions -from google.auth import credentials as auth_credentials from google.cloud import _storage_v2 as storage_v2 from google.cloud.storage.asyncio.async_grpc_client import AsyncGrpcClient -from google.cloud.storage.asyncio.async_multi_range_downloader import \ - AsyncMultiRangeDownloader +from google.cloud.storage.asyncio.async_multi_range_downloader import ( + AsyncMultiRangeDownloader, +) +from google.cloud.storage.asyncio.async_appendable_object_writer import ( + AsyncAppendableObjectWriter, +) from tests.conformance._utils import start_grpc_server # --- Configuration --- @@ -138,12 +140,11 @@ async def test_bidi_reads(testbench): start_grpc_server( grpc_endpoint, test_bench_endpoint ) # Ensure the testbench gRPC server is running before this test executes. - channel = grpc.aio.insecure_channel(GRPC_ENDPOINT) - creds = auth_credentials.AnonymousCredentials() - transport = storage_v2.services.storage.transports.StorageGrpcAsyncIOTransport( - channel=channel, credentials=creds + + grpc_client = AsyncGrpcClient._create_insecure_grpc_client( + client_options=client_options.ClientOptions(api_endpoint=GRPC_ENDPOINT), ) - gapic_client = storage_v2.StorageAsyncClient(transport=transport) + gapic_client = grpc_client.grpc_client http_client = requests.Session() bucket_name = f"grpc-test-bucket-{uuid.uuid4().hex[:8]}" @@ -166,22 +167,11 @@ async def test_bidi_reads(testbench): create_bucket_request = storage_v2.CreateBucketRequest( parent="projects/_", bucket_id=bucket_name, bucket=bucket_resource ) - await gapic_client.create_bucket(request=create_bucket_request) - - write_spec = storage_v2.WriteObjectSpec( - resource=storage_v2.Object( - bucket=f"projects/_/buckets/{bucket_name}", name=object_name - ) - ) - - async def write_req_gen(): - yield storage_v2.WriteObjectRequest( - write_object_spec=write_spec, - checksummed_data={"content": content}, - finish_write=True, - ) - - await gapic_client.write_object(requests=write_req_gen()) + _ = await gapic_client.create_bucket(request=create_bucket_request) + w = AsyncAppendableObjectWriter(grpc_client, bucket_name, object_name) + await w.open() + await w.append(content) + _ = await w.close(finalize_on_close=True) # Run all defined test scenarios. for scenario in test_scenarios: From fce6a6bf4561eabc939c972bb92282be86fb6aec Mon Sep 17 00:00:00 2001 From: Chandra Shekhar Sirimala Date: Mon, 23 Mar 2026 14:53:58 +0530 Subject: [PATCH 505/509] chore: librarian release pull request: 20260323T070628Z (#1782) PR created by the Librarian CLI to initialize a release. Merging this PR will auto trigger a release. Librarian Version: v1.0.2-0.20251119154421-36c3e21ad3ac Language Image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91
    google-cloud-storage: 3.10.1 ## [3.10.1](https://github.com/googleapis/python-storage/compare/v3.10.0...v3.10.1) (2026-03-23) ### Bug Fixes * raise ValueError if api_endpoint is unset when using AnonymousCredentials in AsyncGrpcClient. (#1778) ([17828ea3](https://github.com/googleapis/python-storage/commit/17828ea3))
    --- .librarian/state.yaml | 2 +- CHANGELOG.md | 7 +++++++ google/cloud/_storage_v2/gapic_version.py | 2 +- google/cloud/storage/version.py | 2 +- .../snippet_metadata_google.storage.v2.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index d91f3f9be..8c3daafaa 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -1,7 +1,7 @@ image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 libraries: - id: google-cloud-storage - version: 3.10.0 + version: 3.10.1 last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab apis: - path: google/storage/v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 297ef7a1d..b2c6ade30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-storage/#history +## [3.10.1](https://github.com/googleapis/python-storage/compare/v3.10.0...v3.10.1) (2026-03-23) + + +### Bug Fixes + +* raise ValueError if api_endpoint is unset when using AnonymousCredentials in AsyncGrpcClient. (#1778) ([17828ea316872938a98a6360b10a2495c54bbbcb](https://github.com/googleapis/python-storage/commit/17828ea316872938a98a6360b10a2495c54bbbcb)) + ## [3.10.0](https://github.com/googleapis/python-storage/compare/v3.9.0...v3.10.0) (2026-03-18) diff --git a/google/cloud/_storage_v2/gapic_version.py b/google/cloud/_storage_v2/gapic_version.py index af050a89f..3ffdfeb9e 100644 --- a/google/cloud/_storage_v2/gapic_version.py +++ b/google/cloud/_storage_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.10.0" # {x-release-please-version} +__version__ = "3.10.1" # {x-release-please-version} diff --git a/google/cloud/storage/version.py b/google/cloud/storage/version.py index b674396b2..8afb5b22c 100644 --- a/google/cloud/storage/version.py +++ b/google/cloud/storage/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "3.10.0" +__version__ = "3.10.1" diff --git a/samples/generated_samples/snippet_metadata_google.storage.v2.json b/samples/generated_samples/snippet_metadata_google.storage.v2.json index 45582dd31..1180a997a 100644 --- a/samples/generated_samples/snippet_metadata_google.storage.v2.json +++ b/samples/generated_samples/snippet_metadata_google.storage.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage", - "version": "3.10.0" + "version": "3.10.1" }, "snippets": [ { From bbdb510fe64852aab6daa9b912e604c70e03eb9f Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Thu, 26 Mar 2026 14:17:06 -0400 Subject: [PATCH 506/509] chore: librarian generate pull request: 20260326T175601Z (#1785) PR created by the Librarian CLI to generate Cloud Client Libraries code from protos. BEGIN_COMMIT BEGIN_NESTED_COMMIT feat: Added a new field `ComposeObjectRequest.delete_source_objects` field PiperOrigin-RevId: 863087065 Library-IDs: google-cloud-storage Source-link: [googleapis/googleapis@51ff87f4](https://github.com/googleapis/googleapis/commit/51ff87f4) END_NESTED_COMMIT BEGIN_NESTED_COMMIT docs: Updated documentation for `BidiReadObject`, `ReadObjectRequest`, and `ObjectContexts` PiperOrigin-RevId: 863087065 Library-IDs: google-cloud-storage Source-link: [googleapis/googleapis@51ff87f4](https://github.com/googleapis/googleapis/commit/51ff87f4) END_NESTED_COMMIT END_COMMIT This pull request is generated with proto changes between [googleapis/googleapis@5400ccce](https://github.com/googleapis/googleapis/commit/5400ccce473c439885bd6bf2924fd242271bfcab) (exclusive) and [googleapis/googleapis@51ff87f4](https://github.com/googleapis/googleapis/commit/51ff87f43e89246bc21b65281df66adf2ec1775f) (inclusive). Librarian Version: v1.0.2-0.20260309131826-42ac5c451239 Language Image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 --- .../generator-input/.repo-metadata.json | 2 +- .librarian/generator-input/librarian.py | 6 ++ .librarian/generator-input/noxfile.py | 92 +++++++++++++++---- .librarian/generator-input/setup.py | 38 +++++++- .librarian/state.yaml | 14 ++- .../services/storage/async_client.py | 5 +- .../services/storage/transports/grpc.py | 5 +- .../storage/transports/grpc_asyncio.py | 5 +- google/cloud/_storage_v2/types/storage.py | 29 ++++-- noxfile.py | 2 - testing/constraints-3.14.txt | 2 +- 11 files changed, 161 insertions(+), 39 deletions(-) diff --git a/.librarian/generator-input/.repo-metadata.json b/.librarian/generator-input/.repo-metadata.json index bd870f959..59ebe7f61 100644 --- a/.librarian/generator-input/.repo-metadata.json +++ b/.librarian/generator-input/.repo-metadata.json @@ -12,7 +12,7 @@ "api_id": "storage.googleapis.com", "requires_billing": true, "default_version": "v2", - "codeowner_team": "@googleapis/yoshi-python @googleapis/gcs-sdk-team @googleapis/gcs-fs", + "codeowner_team": "@googleapis/cloud-sdk-python-team @googleapis/gcs-team @googleapis/gcs-fs", "api_shortname": "storage", "api_description": "is a durable and highly available object storage service. Google Cloud Storage is almost infinitely scalable and guarantees consistency: when a write succeeds, the latest copy of the object will be returned to any GET, globally." } diff --git a/.librarian/generator-input/librarian.py b/.librarian/generator-input/librarian.py index ad0baa2a3..ce8a4b92f 100644 --- a/.librarian/generator-input/librarian.py +++ b/.librarian/generator-input/librarian.py @@ -41,6 +41,12 @@ "README.rst", # Exclude autogenerated default import `google.cloud.storage` "google/cloud/storage/*", + # Temporarily exclude google/cloud/_storage_v2/services/storage/client.py + # and tests/unit/gapic due to customization. + # This exclusion will be removed in the google-cloud-python migration PR + # When librarian.py is dropped. + "tests/unit/gapic/*", + "google/cloud/storage_v2/services/storage/client.py", # Exclude autogenerated constraints files for Python 3.7/3.9 "testing/constraints-3.7.txt", "testing/constraints-3.9.txt", diff --git a/.librarian/generator-input/noxfile.py b/.librarian/generator-input/noxfile.py index c9ada0739..a00b72040 100644 --- a/.librarian/generator-input/noxfile.py +++ b/.librarian/generator-input/noxfile.py @@ -17,7 +17,6 @@ from __future__ import absolute_import import os import pathlib -import re import shutil import nox @@ -28,7 +27,13 @@ DEFAULT_PYTHON_VERSION = "3.14" SYSTEM_TEST_PYTHON_VERSIONS = ["3.10", "3.14"] -UNIT_TEST_PYTHON_VERSIONS = ["3.10", "3.11", "3.12", "3.13", "3.14"] +UNIT_TEST_PYTHON_VERSIONS = [ + "3.10", + "3.11", + "3.12", + "3.13", + "3.14", +] CONFORMANCE_TEST_PYTHON_VERSIONS = ["3.12"] CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -39,6 +44,7 @@ nox.options.sessions = [ "blacken", "conftest_retry", + "conftest_retry_bidi", "docfx", "docs", "lint", @@ -61,9 +67,7 @@ def lint(session): Returns a failure if the linters find linting errors or sufficiently serious code quality issues. """ - # Pin flake8 to 6.0.0 - # See https://github.com/googleapis/python-storage/issues/1102 - session.install("flake8==6.0.0", BLACK_VERSION) + session.install("flake8", BLACK_VERSION) session.run( "black", "--check", @@ -116,6 +120,8 @@ def default(session, install_extras=True): session.install("-e", ".", "-c", constraints_path) + session.run("python", "-m", "pip", "freeze") + # This dependency is included in setup.py for backwards compatibility only # and the client library is expected to pass all tests without it. See # setup.py and README for details. @@ -180,7 +186,14 @@ def system(session): # 2021-05-06: defer installing 'google-cloud-*' to after this package, # in order to work around Python 2.7 googolapis-common-protos # issue. - session.install("mock", "pytest", "pytest-rerunfailures", "-c", constraints_path) + session.install( + "mock", + "pytest", + "pytest-rerunfailures", + "pytest-asyncio", + "-c", + constraints_path, + ) session.install("-e", ".", "-c", constraints_path) session.install( "google-cloud-testutils", @@ -207,30 +220,75 @@ def system(session): @nox.session(python=CONFORMANCE_TEST_PYTHON_VERSIONS) def conftest_retry(session): """Run the retry conformance test suite.""" - conformance_test_folder_path = os.path.join("tests", "conformance") - conformance_test_folder_exists = os.path.exists(conformance_test_folder_path) + json_conformance_tests = "tests/conformance/test_conformance.py" # Environment check: only run tests if found. - if not conformance_test_folder_exists: + if not os.path.exists(json_conformance_tests): session.skip("Conformance tests were not found") + constraints_path = str( + CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" + ) + # Install all test dependencies and pytest plugin to run tests in parallel. # Then install this package in-place. - session.install("pytest", "pytest-xdist") - session.install("-e", ".") + session.install( + "pytest", + "pytest-xdist", + "-c", + constraints_path, + ) + session.install("-e", ".", "-c", constraints_path) # Run #CPU processes in parallel if no test session arguments are passed in. if session.posargs: test_cmd = [ - "py.test", - "--quiet", - conformance_test_folder_path, + "pytest", + "-vv", + "-s", + json_conformance_tests, *session.posargs, ] else: - test_cmd = ["py.test", "-n", "auto", "--quiet", conformance_test_folder_path] + test_cmd = ["pytest", "-vv", "-s", "-n", "auto", json_conformance_tests] + + # Run pytest against the conformance tests. + session.run(*test_cmd, env={"DOCKER_API_VERSION": "1.39"}) + - # Run py.test against the conformance tests. - session.run(*test_cmd) +@nox.session(python=CONFORMANCE_TEST_PYTHON_VERSIONS) +def conftest_retry_bidi(session): + """Run the retry conformance test suite.""" + + constraints_path = str( + CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" + ) + + # Install all test dependencies and pytest plugin to run tests in parallel. + # Then install this package in-place. + session.install( + "pytest", + "pytest-xdist", + "pytest-asyncio", + "grpcio", + "grpcio-status", + "grpc-google-iam-v1", + "-c", + constraints_path, + ) + session.install("-e", ".", "-c", constraints_path) + + bidi_tests = [ + "tests/conformance/test_bidi_reads.py", + "tests/conformance/test_bidi_writes.py", + ] + for test_file in bidi_tests: + session.run( + "pytest", + "-vv", + "-s", + test_file, + env={"DOCKER_API_VERSION": "1.39"}, + ) @nox.session(python=DEFAULT_PYTHON_VERSION) diff --git a/.librarian/generator-input/setup.py b/.librarian/generator-input/setup.py index 294e63892..69fc2899e 100644 --- a/.librarian/generator-input/setup.py +++ b/.librarian/generator-input/setup.py @@ -43,10 +43,46 @@ "google-crc32c >= 1.1.3, < 2.0.0", ] extras = { + # TODO: Make these extra dependencies as mandatory once gRPC out of + # experimental in this SDK. More info in b/465352227 + "grpc": [ + "google-api-core[grpc] >= 2.27.0, < 3.0.0", + "grpcio >= 1.33.2, < 2.0.0; python_version < '3.14'", + "grpcio >= 1.75.1, < 2.0.0; python_version >= '3.14'", + "grpcio-status >= 1.76.0, < 2.0.0", + "proto-plus >= 1.22.3, <2.0.0; python_version < '3.13'", + "proto-plus >= 1.25.0, <2.0.0; python_version >= '3.13'", + "protobuf>=3.20.2,<7.0.0,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", + "grpc-google-iam-v1 >= 0.14.0, <1.0.0", + ], "protobuf": ["protobuf >= 3.20.2, < 7.0.0"], "tracing": [ "opentelemetry-api >= 1.1.0, < 2.0.0", ], + "testing": [ + "google-cloud-testutils", + "numpy", + "psutil", + "py-cpuinfo", + "pytest-benchmark", + "PyYAML", + "mock", + "pytest", + "pytest-cov", + "pytest-asyncio", + "pytest-rerunfailures", + "pytest-xdist", + "google-cloud-testutils", + "google-cloud-iam", + "google-cloud-pubsub", + "google-cloud-kms", + "brotli", + "coverage", + "pyopenssl", + "opentelemetry-sdk", + "flake8", + "black", + ], } @@ -99,7 +135,7 @@ packages=packages, install_requires=dependencies, extras_require=extras, - python_requires=">=3.7", + python_requires=">=3.10", include_package_data=True, zip_safe=False, ) diff --git a/.librarian/state.yaml b/.librarian/state.yaml index 8c3daafaa..7b2efe9ff 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -2,7 +2,7 @@ image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-li libraries: - id: google-cloud-storage version: 3.10.1 - last_generated_commit: 5400ccce473c439885bd6bf2924fd242271bfcab + last_generated_commit: b3f7a1f7550d68ec7d92d12eb21092930ce16ede apis: - path: google/storage/v2 service_config: storage_v2.yaml @@ -22,10 +22,18 @@ libraries: - ^renovate.json - ^setup.py - ^docs/summary_overview.md - - ^google/cloud/_storage_v2 + - ^google/cloud/_storage_v2/__init__.py + - ^google/cloud/_storage_v2/gapic + - ^google/cloud/_storage_v2/py.typed + - ^google/cloud/_storage_v2/samples/generated_samples + - ^google/cloud/_storage_v2/services/__init__.py + - ^google/cloud/_storage_v2/services/storage/transports + - ^google/cloud/_storage_v2/services/storage/__init__.py + - ^google/cloud/_storage_v2/services/storage/async_client.py + - ^google/cloud/_storage_v2/services/storage/pagers.py + - ^google/cloud/_storage_v2/types - ^samples/generated_samples - ^testing/constraints-3.8.txt - ^testing/constraints-3.1.* - ^tests/__init__.py - - ^tests/unit/gapic tag_format: v{version} diff --git a/google/cloud/_storage_v2/services/storage/async_client.py b/google/cloud/_storage_v2/services/storage/async_client.py index c71ee0472..cd376a088 100644 --- a/google/cloud/_storage_v2/services/storage/async_client.py +++ b/google/cloud/_storage_v2/services/storage/async_client.py @@ -2472,8 +2472,9 @@ def bidi_read_object( across several messages. If an error occurs with any request, the stream closes with a relevant error code. Since you can have multiple outstanding requests, the error response includes a - ``BidiReadObjectRangesError`` field detailing the specific error - for each pending ``read_id``. + ``BidiReadObjectError`` proto in its ``details`` field, + reporting the specific error, if any, for each pending + ``read_id``. **IAM Permissions**: diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc.py b/google/cloud/_storage_v2/services/storage/transports/grpc.py index fae2d7949..6497959d7 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc.py @@ -946,8 +946,9 @@ def bidi_read_object( across several messages. If an error occurs with any request, the stream closes with a relevant error code. Since you can have multiple outstanding requests, the error response includes a - ``BidiReadObjectRangesError`` field detailing the specific error - for each pending ``read_id``. + ``BidiReadObjectError`` proto in its ``details`` field, + reporting the specific error, if any, for each pending + ``read_id``. **IAM Permissions**: diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py index be54eb3b0..1c7743a72 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py @@ -971,8 +971,9 @@ def bidi_read_object( across several messages. If an error occurs with any request, the stream closes with a relevant error code. Since you can have multiple outstanding requests, the error response includes a - ``BidiReadObjectRangesError`` field detailing the specific error - for each pending ``read_id``. + ``BidiReadObjectError`` proto in its ``details`` field, + reporting the specific error, if any, for each pending + ``read_id``. **IAM Permissions**: diff --git a/google/cloud/_storage_v2/types/storage.py b/google/cloud/_storage_v2/types/storage.py index 8602610be..d1a7c5a36 100644 --- a/google/cloud/_storage_v2/types/storage.py +++ b/google/cloud/_storage_v2/types/storage.py @@ -489,6 +489,11 @@ class ComposeObjectRequest(proto.Message): Optional. The checksums of the complete object. This is validated against the combined checksums of the component objects. + delete_source_objects (bool): + Whether the source objects should be deleted + in the compose request. + + This field is a member of `oneof`_ ``_delete_source_objects``. """ class SourceObject(proto.Message): @@ -580,6 +585,11 @@ class ObjectPreconditions(proto.Message): number=10, message="ObjectChecksums", ) + delete_source_objects: bool = proto.Field( + proto.BOOL, + number=11, + optional=True, + ) class DeleteObjectRequest(proto.Message): @@ -1460,18 +1470,18 @@ class ReadRange(proto.Message): ``ReadObjectRequest`` with ``read_offset`` = -5 and ``read_length`` = 3 would return bytes 10 through 12 of the object. Requesting a negative offset with magnitude larger - than the size of the object returns the entire object. A - ``read_offset`` larger than the size of the object results - in an ``OutOfRange`` error. + than the size of the object is equivalent to ``read_offset`` + = 0. A ``read_offset`` larger than the size of the object + results in an ``OutOfRange`` error. read_length (int): Optional. The maximum number of data bytes the server is allowed to return across all response messages with the same ``read_id``. A ``read_length`` of zero indicates to read until the resource end, and a negative ``read_length`` - causes an error. If the stream returns fewer bytes than - allowed by the ``read_length`` and no error occurred, the - stream includes all data from the ``read_offset`` to the - resource end. + causes an ``OutOfRange`` error. If the stream returns fewer + bytes than allowed by the ``read_length`` and no error + occurred, the stream includes all data from the + ``read_offset`` to the resource end. read_id (int): Required. Read identifier provided by the client. When the client issues more than one outstanding ``ReadRange`` on the @@ -4364,7 +4374,10 @@ class ObjectContexts(proto.Message): Attributes: custom (MutableMapping[str, google.cloud._storage_v2.types.ObjectCustomContextPayload]): - Optional. User-defined object contexts. + Optional. User-defined object contexts. The maximum key or + value size is ``256`` characters. The maximum number of + entries is ``50``. The maximum total serialized size of all + entries is ``25KiB``. """ custom: MutableMapping[str, "ObjectCustomContextPayload"] = proto.MapField( diff --git a/noxfile.py b/noxfile.py index 77823d28d..a00b72040 100644 --- a/noxfile.py +++ b/noxfile.py @@ -67,8 +67,6 @@ def lint(session): Returns a failure if the linters find linting errors or sufficiently serious code quality issues. """ - # Pin flake8 to 6.0.0 - # See https://github.com/googleapis/python-storage/issues/1102 session.install("flake8", BLACK_VERSION) session.run( "black", diff --git a/testing/constraints-3.14.txt b/testing/constraints-3.14.txt index 62739fc5d..2ae5a677e 100644 --- a/testing/constraints-3.14.txt +++ b/testing/constraints-3.14.txt @@ -7,7 +7,7 @@ # Then this file should have google-cloud-foo>=1 google-api-core>=2 google-auth>=2 -grpcio>=1.75.1 +grpcio>=1 proto-plus>=1 protobuf>=6 grpc-google-iam-v1>=0 From b221c8e715a25eaaed437042af6568b176aa28b8 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Thu, 26 Mar 2026 14:43:04 -0400 Subject: [PATCH 507/509] chore: librarian update image pull request: 20260326T182616Z (#1786) feat: update image to us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:234b9d1f2ddb057ed7ac6a38db0bf8163d839c65c6cf88ade52530cddebce59e --- .librarian/state.yaml | 2 +- google/cloud/_storage_v2/__init__.py | 104 ++++++++++++++++++ .../services/storage/async_client.py | 22 ++-- .../services/storage/transports/README.rst | 11 +- .../services/storage/transports/base.py | 23 ++-- .../services/storage/transports/grpc.py | 14 ++- .../storage/transports/grpc_asyncio.py | 14 ++- google/cloud/_storage_v2/types/storage.py | 10 +- mypy.ini | 14 ++- noxfile.py | 4 + ..._generated_storage_get_iam_policy_async.py | 2 +- ...2_generated_storage_get_iam_policy_sync.py | 2 +- ..._generated_storage_set_iam_policy_async.py | 2 +- ...2_generated_storage_set_iam_policy_sync.py | 2 +- ...ated_storage_test_iam_permissions_async.py | 2 +- ...rated_storage_test_iam_permissions_sync.py | 2 +- setup.py | 4 + testing/constraints-3.10.txt | 2 + testing/constraints-3.11.txt | 2 + testing/constraints-3.12.txt | 2 + testing/constraints-3.8.txt | 9 -- 21 files changed, 195 insertions(+), 54 deletions(-) delete mode 100644 testing/constraints-3.8.txt diff --git a/.librarian/state.yaml b/.librarian/state.yaml index 7b2efe9ff..d1b8b3732 100644 --- a/.librarian/state.yaml +++ b/.librarian/state.yaml @@ -1,4 +1,4 @@ -image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:8e2c32496077054105bd06c54a59d6a6694287bc053588e24debe6da6920ad91 +image: us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:234b9d1f2ddb057ed7ac6a38db0bf8163d839c65c6cf88ade52530cddebce59e libraries: - id: google-cloud-storage version: 3.10.1 diff --git a/google/cloud/_storage_v2/__init__.py b/google/cloud/_storage_v2/__init__.py index de9735f8d..88cdff339 100644 --- a/google/cloud/_storage_v2/__init__.py +++ b/google/cloud/_storage_v2/__init__.py @@ -15,8 +15,18 @@ # from google.cloud._storage_v2 import gapic_version as package_version +import google.api_core as api_core +import sys + __version__ = package_version.__version__ +if sys.version_info >= (3, 8): # pragma: NO COVER + from importlib import metadata +else: # pragma: NO COVER + # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove + # this code path once we drop support for Python 3.7 + import importlib_metadata as metadata + from .services.storage import StorageClient from .services.storage import StorageAsyncClient @@ -78,6 +88,100 @@ from .types.storage import WriteObjectResponse from .types.storage import WriteObjectSpec +if hasattr(api_core, "check_python_version") and hasattr( + api_core, "check_dependency_versions" +): # pragma: NO COVER + api_core.check_python_version("google.cloud._storage_v2") # type: ignore + api_core.check_dependency_versions("google.cloud._storage_v2") # type: ignore +else: # pragma: NO COVER + # An older version of api_core is installed which does not define the + # functions above. We do equivalent checks manually. + try: + import warnings + import sys + + _py_version_str = sys.version.split()[0] + _package_label = "google.cloud._storage_v2" + if sys.version_info < (3, 9): + warnings.warn( + "You are using a non-supported Python version " + + f"({_py_version_str}). Google will not post any further " + + f"updates to {_package_label} supporting this Python version. " + + "Please upgrade to the latest Python version, or at " + + f"least to Python 3.9, and then update {_package_label}.", + FutureWarning, + ) + if sys.version_info[:2] == (3, 9): + warnings.warn( + f"You are using a Python version ({_py_version_str}) " + + f"which Google will stop supporting in {_package_label} in " + + "January 2026. Please " + + "upgrade to the latest Python version, or at " + + "least to Python 3.10, before then, and " + + f"then update {_package_label}.", + FutureWarning, + ) + + def parse_version_to_tuple(version_string: str): + """Safely converts a semantic version string to a comparable tuple of integers. + Example: "4.25.8" -> (4, 25, 8) + Ignores non-numeric parts and handles common version formats. + Args: + version_string: Version string in the format "x.y.z" or "x.y.z" + Returns: + Tuple of integers for the parsed version string. + """ + parts = [] + for part in version_string.split("."): + try: + parts.append(int(part)) + except ValueError: + # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here. + # This is a simplification compared to 'packaging.parse_version', but sufficient + # for comparing strictly numeric semantic versions. + break + return tuple(parts) + + def _get_version(dependency_name): + try: + version_string: str = metadata.version(dependency_name) + parsed_version = parse_version_to_tuple(version_string) + return (parsed_version, version_string) + except Exception: + # Catch exceptions from metadata.version() (e.g., PackageNotFoundError) + # or errors during parse_version_to_tuple + return (None, "--") + + _dependency_package = "google.protobuf" + _next_supported_version = "4.25.8" + _next_supported_version_tuple = (4, 25, 8) + _recommendation = " (we recommend 6.x)" + (_version_used, _version_used_string) = _get_version(_dependency_package) + if _version_used and _version_used < _next_supported_version_tuple: + warnings.warn( + f"Package {_package_label} depends on " + + f"{_dependency_package}, currently installed at version " + + f"{_version_used_string}. Future updates to " + + f"{_package_label} will require {_dependency_package} at " + + f"version {_next_supported_version} or higher{_recommendation}." + + " Please ensure " + + "that either (a) your Python environment doesn't pin the " + + f"version of {_dependency_package}, so that updates to " + + f"{_package_label} can require the higher version, or " + + "(b) you manually update your Python environment to use at " + + f"least version {_next_supported_version} of " + + f"{_dependency_package}.", + FutureWarning, + ) + except Exception: + warnings.warn( + "Could not determine the version of Python " + + "currently being used. To continue receiving " + + "updates for {_package_label}, ensure you are " + + "using a supported version of Python; see " + + "https://devguide.python.org/versions/" + ) + __all__ = ( "StorageAsyncClient", "AppendObjectSpec", diff --git a/google/cloud/_storage_v2/services/storage/async_client.py b/google/cloud/_storage_v2/services/storage/async_client.py index cd376a088..004b19e4a 100644 --- a/google/cloud/_storage_v2/services/storage/async_client.py +++ b/google/cloud/_storage_v2/services/storage/async_client.py @@ -50,11 +50,11 @@ from google.cloud._storage_v2.services.storage import pagers from google.cloud._storage_v2.types import storage -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore -from google.protobuf import field_mask_pb2 # type: ignore -from google.protobuf import timestamp_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore +import google.iam.v1.policy_pb2 as policy_pb2 # type: ignore +import google.protobuf.field_mask_pb2 as field_mask_pb2 # type: ignore +import google.protobuf.timestamp_pb2 as timestamp_pb2 # type: ignore from .transports.base import StorageTransport, DEFAULT_CLIENT_INFO from .transports.grpc_asyncio import StorageGrpcAsyncIOTransport from .client import StorageClient @@ -148,7 +148,8 @@ def from_service_account_info(cls, info: dict, *args, **kwargs): Returns: StorageAsyncClient: The constructed client. """ - return StorageClient.from_service_account_info.__func__(StorageAsyncClient, info, *args, **kwargs) # type: ignore + sa_info_func = StorageClient.from_service_account_info.__func__ # type: ignore + return sa_info_func(StorageAsyncClient, info, *args, **kwargs) @classmethod def from_service_account_file(cls, filename: str, *args, **kwargs): @@ -164,7 +165,8 @@ def from_service_account_file(cls, filename: str, *args, **kwargs): Returns: StorageAsyncClient: The constructed client. """ - return StorageClient.from_service_account_file.__func__(StorageAsyncClient, filename, *args, **kwargs) # type: ignore + sa_file_func = StorageClient.from_service_account_file.__func__ # type: ignore + return sa_file_func(StorageAsyncClient, filename, *args, **kwargs) from_service_account_json = from_service_account_file @@ -214,7 +216,7 @@ def transport(self) -> StorageTransport: return self._client.transport @property - def api_endpoint(self): + def api_endpoint(self) -> str: """Return the API endpoint used by the client instance. Returns: @@ -1038,7 +1040,7 @@ async def get_iam_policy( # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 - from google.iam.v1 import iam_policy_pb2 # type: ignore + import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore async def sample_get_iam_policy(): # Create a client @@ -1193,7 +1195,7 @@ async def set_iam_policy( # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 - from google.iam.v1 import iam_policy_pb2 # type: ignore + import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore async def sample_set_iam_policy(): # Create a client @@ -1352,7 +1354,7 @@ async def test_iam_permissions( # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 - from google.iam.v1 import iam_policy_pb2 # type: ignore + import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore async def sample_test_iam_permissions(): # Create a client diff --git a/google/cloud/_storage_v2/services/storage/transports/README.rst b/google/cloud/_storage_v2/services/storage/transports/README.rst index 803b98632..575429372 100644 --- a/google/cloud/_storage_v2/services/storage/transports/README.rst +++ b/google/cloud/_storage_v2/services/storage/transports/README.rst @@ -2,8 +2,9 @@ transport inheritance structure _______________________________ -`StorageTransport` is the ABC for all transports. -- public child `StorageGrpcTransport` for sync gRPC transport (defined in `grpc.py`). -- public child `StorageGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). -- private child `_BaseStorageRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). -- public child `StorageRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). +``StorageTransport`` is the ABC for all transports. + +- public child ``StorageGrpcTransport`` for sync gRPC transport (defined in ``grpc.py``). +- public child ``StorageGrpcAsyncIOTransport`` for async gRPC transport (defined in ``grpc_asyncio.py``). +- private child ``_BaseStorageRestTransport`` for base REST transport with inner classes ``_BaseMETHOD`` (defined in ``rest_base.py``). +- public child ``StorageRestTransport`` for sync REST transport with inner classes ``METHOD`` derived from the parent's corresponding ``_BaseMETHOD`` classes (defined in ``rest.py``). diff --git a/google/cloud/_storage_v2/services/storage/transports/base.py b/google/cloud/_storage_v2/services/storage/transports/base.py index b45d47623..df40865c1 100644 --- a/google/cloud/_storage_v2/services/storage/transports/base.py +++ b/google/cloud/_storage_v2/services/storage/transports/base.py @@ -28,10 +28,10 @@ import google.protobuf from google.cloud._storage_v2.types import storage -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore -from google.protobuf import empty_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore +import google.iam.v1.policy_pb2 as policy_pb2 # type: ignore +import google.protobuf.empty_pb2 as empty_pb2 # type: ignore DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( gapic_version=package_version.__version__ @@ -91,10 +91,12 @@ def __init__( your own client library. always_use_jwt_access (Optional[bool]): Whether self signed JWT should be used for service account credentials. + api_audience (Optional[str]): The intended audience for the API calls + to the service that will be set when using certain 3rd party + authentication flows. Audience is typically a resource identifier. + If not set, the host value will be used as a default. """ - scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} - # Save the scopes. self._scopes = scopes if not hasattr(self, "_ignore_credentials"): @@ -109,11 +111,16 @@ def __init__( if credentials_file is not None: credentials, _ = google.auth.load_credentials_from_file( - credentials_file, **scopes_kwargs, quota_project_id=quota_project_id + credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + default_scopes=self.AUTH_SCOPES, ) elif credentials is None and not self._ignore_credentials: credentials, _ = google.auth.default( - **scopes_kwargs, quota_project_id=quota_project_id + scopes=scopes, + quota_project_id=quota_project_id, + default_scopes=self.AUTH_SCOPES, ) # Don't apply audience if the credentials file passed from user. if hasattr(credentials, "with_gdch_audience"): @@ -137,6 +144,8 @@ def __init__( host += ":443" self._host = host + self._wrapped_methods: Dict[Callable, Callable] = {} + @property def host(self): return self._host diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc.py b/google/cloud/_storage_v2/services/storage/transports/grpc.py index 6497959d7..60566a5d4 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc.py @@ -31,10 +31,10 @@ import proto # type: ignore from google.cloud._storage_v2.types import storage -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore -from google.protobuf import empty_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore +import google.iam.v1.policy_pb2 as policy_pb2 # type: ignore +import google.protobuf.empty_pb2 as empty_pb2 # type: ignore from .base import StorageTransport, DEFAULT_CLIENT_INFO try: @@ -59,7 +59,7 @@ def intercept_unary_unary(self, continuation, client_call_details, request): elif isinstance(request, google.protobuf.message.Message): request_payload = MessageToJson(request) else: - request_payload = f"{type(request).__name__}: {pickle.dumps(request)}" + request_payload = f"{type(request).__name__}: {pickle.dumps(request)!r}" request_metadata = { key: value.decode("utf-8") if isinstance(value, bytes) else value @@ -94,7 +94,7 @@ def intercept_unary_unary(self, continuation, client_call_details, request): elif isinstance(result, google.protobuf.message.Message): response_payload = MessageToJson(result) else: - response_payload = f"{type(result).__name__}: {pickle.dumps(result)}" + response_payload = f"{type(result).__name__}: {pickle.dumps(result)!r}" grpc_response = { "payload": response_payload, "metadata": metadata, @@ -221,6 +221,10 @@ def __init__( your own client library. always_use_jwt_access (Optional[bool]): Whether self signed JWT should be used for service account credentials. + api_audience (Optional[str]): The intended audience for the API calls + to the service that will be set when using certain 3rd party + authentication flows. Audience is typically a resource identifier. + If not set, the host value will be used as a default. Raises: google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport diff --git a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py index 1c7743a72..c8d4dee4c 100644 --- a/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py +++ b/google/cloud/_storage_v2/services/storage/transports/grpc_asyncio.py @@ -34,10 +34,10 @@ from grpc.experimental import aio # type: ignore from google.cloud._storage_v2.types import storage -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore from google.longrunning import operations_pb2 # type: ignore -from google.protobuf import empty_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore +import google.iam.v1.policy_pb2 as policy_pb2 # type: ignore +import google.protobuf.empty_pb2 as empty_pb2 # type: ignore from .base import StorageTransport, DEFAULT_CLIENT_INFO from .grpc import StorageGrpcTransport @@ -65,7 +65,7 @@ async def intercept_unary_unary(self, continuation, client_call_details, request elif isinstance(request, google.protobuf.message.Message): request_payload = MessageToJson(request) else: - request_payload = f"{type(request).__name__}: {pickle.dumps(request)}" + request_payload = f"{type(request).__name__}: {pickle.dumps(request)!r}" request_metadata = { key: value.decode("utf-8") if isinstance(value, bytes) else value @@ -100,7 +100,7 @@ async def intercept_unary_unary(self, continuation, client_call_details, request elif isinstance(result, google.protobuf.message.Message): response_payload = MessageToJson(result) else: - response_payload = f"{type(result).__name__}: {pickle.dumps(result)}" + response_payload = f"{type(result).__name__}: {pickle.dumps(result)!r}" grpc_response = { "payload": response_payload, "metadata": metadata, @@ -272,6 +272,10 @@ def __init__( your own client library. always_use_jwt_access (Optional[bool]): Whether self signed JWT should be used for service account credentials. + api_audience (Optional[str]): The intended audience for the API calls + to the service that will be set when using certain 3rd party + authentication flows. Audience is typically a resource identifier. + If not set, the host value will be used as a default. Raises: google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport diff --git a/google/cloud/_storage_v2/types/storage.py b/google/cloud/_storage_v2/types/storage.py index d1a7c5a36..df474f499 100644 --- a/google/cloud/_storage_v2/types/storage.py +++ b/google/cloud/_storage_v2/types/storage.py @@ -19,11 +19,11 @@ import proto # type: ignore -from google.protobuf import duration_pb2 # type: ignore -from google.protobuf import field_mask_pb2 # type: ignore -from google.protobuf import timestamp_pb2 # type: ignore -from google.rpc import status_pb2 # type: ignore -from google.type import date_pb2 # type: ignore +import google.protobuf.duration_pb2 as duration_pb2 # type: ignore +import google.protobuf.field_mask_pb2 as field_mask_pb2 # type: ignore +import google.protobuf.timestamp_pb2 as timestamp_pb2 # type: ignore +import google.rpc.status_pb2 as status_pb2 # type: ignore +import google.type.date_pb2 as date_pb2 # type: ignore __protobuf__ = proto.module( diff --git a/mypy.ini b/mypy.ini index 574c5aed3..e0e0da2e9 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,15 @@ [mypy] -python_version = 3.7 +python_version = 3.14 namespace_packages = True +ignore_missing_imports = False + +# TODO(https://github.com/googleapis/gapic-generator-python/issues/2563): +# Dependencies that historically lacks py.typed markers +[mypy-google.iam.*] +ignore_missing_imports = True + +# Helps mypy navigate the 'google' namespace more reliably in 3.10+ +explicit_package_bases = True + +# Performance: reuse results from previous runs to speed up 'nox' +incremental = True diff --git a/noxfile.py b/noxfile.py index a00b72040..71672ba28 100644 --- a/noxfile.py +++ b/noxfile.py @@ -14,6 +14,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +# DO NOT EDIT THIS FILE OUTSIDE OF `.librarian/generator-input` +# The source of truth for this file is `.librarian/generator-input` + + from __future__ import absolute_import import os import pathlib diff --git a/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py index a7920496b..c742efba5 100644 --- a/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py +++ b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_async.py @@ -32,7 +32,7 @@ # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 -from google.iam.v1 import iam_policy_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore async def sample_get_iam_policy(): diff --git a/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py index a63fd2927..f6cc29f38 100644 --- a/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py +++ b/samples/generated_samples/storage_v2_generated_storage_get_iam_policy_sync.py @@ -32,7 +32,7 @@ # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 -from google.iam.v1 import iam_policy_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore def sample_get_iam_policy(): diff --git a/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py index 06a9c50fb..c6c72fdc6 100644 --- a/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py +++ b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_async.py @@ -32,7 +32,7 @@ # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 -from google.iam.v1 import iam_policy_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore async def sample_set_iam_policy(): diff --git a/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py index 2b3c0c6bc..a3de89a02 100644 --- a/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py +++ b/samples/generated_samples/storage_v2_generated_storage_set_iam_policy_sync.py @@ -32,7 +32,7 @@ # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 -from google.iam.v1 import iam_policy_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore def sample_set_iam_policy(): diff --git a/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py index dd4818f83..5ddac08ec 100644 --- a/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py +++ b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_async.py @@ -32,7 +32,7 @@ # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 -from google.iam.v1 import iam_policy_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore async def sample_test_iam_permissions(): diff --git a/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py index e66d50d92..b62358d02 100644 --- a/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py +++ b/samples/generated_samples/storage_v2_generated_storage_test_iam_permissions_sync.py @@ -32,7 +32,7 @@ # client as shown in: # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import storage_v2 -from google.iam.v1 import iam_policy_pb2 # type: ignore +import google.iam.v1.iam_policy_pb2 as iam_policy_pb2 # type: ignore def sample_test_iam_permissions(): diff --git a/setup.py b/setup.py index 69fc2899e..b539a316c 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +# DO NOT EDIT THIS FILE OUTSIDE OF `.librarian/generator-input` +# The source of truth for this file is `.librarian/generator-input` + + import io import os diff --git a/testing/constraints-3.10.txt b/testing/constraints-3.10.txt index ef1c92fff..1cd0c5a2c 100644 --- a/testing/constraints-3.10.txt +++ b/testing/constraints-3.10.txt @@ -6,4 +6,6 @@ google-auth grpcio proto-plus protobuf +# cryptography is a direct dependency of google-auth +cryptography grpc-google-iam-v1 diff --git a/testing/constraints-3.11.txt b/testing/constraints-3.11.txt index ef1c92fff..1cd0c5a2c 100644 --- a/testing/constraints-3.11.txt +++ b/testing/constraints-3.11.txt @@ -6,4 +6,6 @@ google-auth grpcio proto-plus protobuf +# cryptography is a direct dependency of google-auth +cryptography grpc-google-iam-v1 diff --git a/testing/constraints-3.12.txt b/testing/constraints-3.12.txt index ef1c92fff..1cd0c5a2c 100644 --- a/testing/constraints-3.12.txt +++ b/testing/constraints-3.12.txt @@ -6,4 +6,6 @@ google-auth grpcio proto-plus protobuf +# cryptography is a direct dependency of google-auth +cryptography grpc-google-iam-v1 diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt deleted file mode 100644 index ef1c92fff..000000000 --- a/testing/constraints-3.8.txt +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -google-auth -grpcio -proto-plus -protobuf -grpc-google-iam-v1 From 7ce84934205e750357e44e41456e55b20440652b Mon Sep 17 00:00:00 2001 From: Nidhi Date: Fri, 27 Mar 2026 17:31:40 +0000 Subject: [PATCH 508/509] samples: add samples for bucket encryption enforcement config (#1772) Add Python samples demonstrating how to set, get and update bucket encryption enforcement configuration. Includes an integration test. --- *PR created automatically by Jules for task [3410657303470871774](https://jules.google.com/task/3410657303470871774) started by @nidhiii-27* --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: nidhiii-27 <224584462+nidhiii-27@users.noreply.github.com> --- samples/snippets/encryption_test.py | 113 +++++++++++++++++- ...et_bucket_encryption_enforcement_config.py | 48 ++++++++ ...et_bucket_encryption_enforcement_config.py | 55 +++++++++ ...te_bucket_encryption_enforcement_config.py | 60 ++++++++++ 4 files changed, 271 insertions(+), 5 deletions(-) create mode 100644 samples/snippets/storage_get_bucket_encryption_enforcement_config.py create mode 100644 samples/snippets/storage_set_bucket_encryption_enforcement_config.py create mode 100644 samples/snippets/storage_update_bucket_encryption_enforcement_config.py diff --git a/samples/snippets/encryption_test.py b/samples/snippets/encryption_test.py index 9039b1fad..f4d857dd8 100644 --- a/samples/snippets/encryption_test.py +++ b/samples/snippets/encryption_test.py @@ -27,6 +27,10 @@ import storage_object_csek_to_cmek import storage_rotate_encryption_key import storage_upload_encrypted_file +import storage_get_bucket_encryption_enforcement_config +import storage_set_bucket_encryption_enforcement_config +import storage_update_bucket_encryption_enforcement_config +from google.cloud.storage.bucket import EncryptionEnforcementConfig BUCKET = os.environ["CLOUD_STORAGE_BUCKET"] KMS_KEY = os.environ["MAIN_CLOUD_KMS_KEY"] @@ -85,11 +89,7 @@ def test_blob(): except NotFound as e: # For the case that the rotation succeeded. print(f"Ignoring 404, detail: {e}") - blob = Blob( - blob_name, - bucket, - encryption_key=TEST_ENCRYPTION_KEY_2_DECODED - ) + blob = Blob(blob_name, bucket, encryption_key=TEST_ENCRYPTION_KEY_2_DECODED) blob.delete() @@ -126,3 +126,106 @@ def test_object_csek_to_cmek(test_blob): ) assert cmek_blob.download_as_bytes(), test_blob_content + + +@pytest.fixture +def enforcement_bucket(): + bucket_name = f"test_encryption_enforcement_{uuid.uuid4().hex}" + yield bucket_name + + storage_client = storage.Client() + try: + bucket = storage_client.get_bucket(bucket_name) + bucket.delete(force=True) + except Exception: + pass + + +def create_enforcement_bucket(bucket_name): + """Sets up a bucket with GMEK AND CSEK Restricted""" + client = storage.Client() + bucket = client.bucket(bucket_name) + + bucket.encryption.google_managed_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="FullyRestricted") + ) + bucket.encryption.customer_managed_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="NotRestricted") + ) + bucket.encryption.customer_supplied_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="FullyRestricted") + ) + + bucket.create() + return bucket + + +def test_set_bucket_encryption_enforcement_config(enforcement_bucket): + storage_set_bucket_encryption_enforcement_config.set_bucket_encryption_enforcement_config( + enforcement_bucket + ) + + storage_client = storage.Client() + bucket = storage_client.get_bucket(enforcement_bucket) + + assert ( + bucket.encryption.google_managed_encryption_enforcement_config.restriction_mode + == "FullyRestricted" + ) + assert ( + bucket.encryption.customer_managed_encryption_enforcement_config.restriction_mode + == "NotRestricted" + ) + assert ( + bucket.encryption.customer_supplied_encryption_enforcement_config.restriction_mode + == "FullyRestricted" + ) + + +def test_get_bucket_encryption_enforcement_config(enforcement_bucket, capsys): + # Pre-setup: Creating a bucket + create_enforcement_bucket(enforcement_bucket) + + storage_get_bucket_encryption_enforcement_config.get_bucket_encryption_enforcement_config( + enforcement_bucket + ) + + out, _ = capsys.readouterr() + assert f"Encryption Enforcement Config for bucket {enforcement_bucket}" in out + assert ( + "Customer-managed encryption enforcement config restriction mode: NotRestricted" + in out + ) + assert ( + "Customer-supplied encryption enforcement config restriction mode: FullyRestricted" + in out + ) + assert ( + "Google-managed encryption enforcement config restriction mode: FullyRestricted" + in out + ) + + +def test_update_encryption_enforcement_config(enforcement_bucket): + # Pre-setup: Create a bucket in a different state before update + create_enforcement_bucket(enforcement_bucket) + + storage_update_bucket_encryption_enforcement_config.update_bucket_encryption_enforcement_config( + enforcement_bucket + ) + + storage_client = storage.Client() + bucket = storage_client.get_bucket(enforcement_bucket) + + assert ( + bucket.encryption.google_managed_encryption_enforcement_config.restriction_mode + == "NotRestricted" + ) + assert ( + bucket.encryption.customer_managed_encryption_enforcement_config.restriction_mode + == "FullyRestricted" + ) + assert ( + bucket.encryption.customer_supplied_encryption_enforcement_config.restriction_mode + == "FullyRestricted" + ) diff --git a/samples/snippets/storage_get_bucket_encryption_enforcement_config.py b/samples/snippets/storage_get_bucket_encryption_enforcement_config.py new file mode 100644 index 000000000..033dcc822 --- /dev/null +++ b/samples/snippets/storage_get_bucket_encryption_enforcement_config.py @@ -0,0 +1,48 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_get_bucket_encryption_enforcement_config] +from google.cloud import storage + + +def get_bucket_encryption_enforcement_config(bucket_name): + """Gets the bucket encryption enforcement configuration.""" + # The ID of your GCS bucket + # bucket_name = "your-unique-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.get_bucket(bucket_name) + + print(f"Encryption Enforcement Config for bucket {bucket.name}:") + + cmek_config = bucket.encryption.customer_managed_encryption_enforcement_config + csek_config = bucket.encryption.customer_supplied_encryption_enforcement_config + gmek_config = bucket.encryption.google_managed_encryption_enforcement_config + + print( + f"Customer-managed encryption enforcement config restriction mode: {cmek_config.restriction_mode if cmek_config else None}" + ) + print( + f"Customer-supplied encryption enforcement config restriction mode: {csek_config.restriction_mode if csek_config else None}" + ) + print( + f"Google-managed encryption enforcement config restriction mode: {gmek_config.restriction_mode if gmek_config else None}" + ) + + +# [END storage_get_bucket_encryption_enforcement_config] + + +if __name__ == "__main__": + get_bucket_encryption_enforcement_config(bucket_name="your-unique-bucket-name") diff --git a/samples/snippets/storage_set_bucket_encryption_enforcement_config.py b/samples/snippets/storage_set_bucket_encryption_enforcement_config.py new file mode 100644 index 000000000..107564e7f --- /dev/null +++ b/samples/snippets/storage_set_bucket_encryption_enforcement_config.py @@ -0,0 +1,55 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_set_bucket_encryption_enforcement_config] +from google.cloud import storage +from google.cloud.storage.bucket import EncryptionEnforcementConfig + + +def set_bucket_encryption_enforcement_config(bucket_name): + """Creates a bucket with encryption enforcement configuration.""" + # The ID of your GCS bucket + # bucket_name = "your-unique-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + + # Setting restriction_mode to "FullyRestricted" for Google-managed encryption (GMEK) + # means objects cannot be created using the default Google-managed keys. + bucket.encryption.google_managed_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="FullyRestricted") + ) + + # Setting restriction_mode to "NotRestricted" for Customer-managed encryption (CMEK) + # ensures that objects ARE permitted to be created using Cloud KMS keys. + bucket.encryption.customer_managed_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="NotRestricted") + ) + + # Setting restriction_mode to "FullyRestricted" for Customer-supplied encryption (CSEK) + # prevents objects from being created using raw, client-side provided keys. + bucket.encryption.customer_supplied_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="FullyRestricted") + ) + + bucket.create() + + print(f"Created bucket {bucket.name} with Encryption Enforcement Config.") + + +# [END storage_set_bucket_encryption_enforcement_config] + + +if __name__ == "__main__": + set_bucket_encryption_enforcement_config(bucket_name="your-unique-bucket-name") diff --git a/samples/snippets/storage_update_bucket_encryption_enforcement_config.py b/samples/snippets/storage_update_bucket_encryption_enforcement_config.py new file mode 100644 index 000000000..9b704bc0b --- /dev/null +++ b/samples/snippets/storage_update_bucket_encryption_enforcement_config.py @@ -0,0 +1,60 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START storage_update_bucket_encryption_enforcement_config] +from google.cloud import storage +from google.cloud.storage.bucket import EncryptionEnforcementConfig + + +def update_bucket_encryption_enforcement_config(bucket_name): + """Updates the encryption enforcement policy for a bucket.""" + # The ID of your GCS bucket with GMEK and CSEK restricted + # bucket_name = "your-unique-bucket-name" + + storage_client = storage.Client() + bucket = storage_client.get_bucket(bucket_name) + + # Update a specific type (e.g., change GMEK to NotRestricted) + bucket.encryption.google_managed_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="NotRestricted") + ) + + # Update another type (e.g., change CMEK to FullyRestricted) + bucket.encryption.customer_managed_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="FullyRestricted") + ) + + # Keeping CSEK unchanged + bucket.encryption.customer_supplied_encryption_enforcement_config = ( + EncryptionEnforcementConfig(restriction_mode="FullyRestricted") + ) + + bucket.patch() + + print(f"Encryption enforcement policy updated for bucket {bucket.name}.") + + gmek = bucket.encryption.google_managed_encryption_enforcement_config + cmek = bucket.encryption.customer_managed_encryption_enforcement_config + csek = bucket.encryption.customer_supplied_encryption_enforcement_config + + print(f"GMEK restriction mode: {gmek.restriction_mode if gmek else 'None'}") + print(f"CMEK restriction mode: {cmek.restriction_mode if cmek else 'None'}") + print(f"CSEK restriction mode: {csek.restriction_mode if csek else 'None'}") + + +# [END storage_update_bucket_encryption_enforcement_config] + + +if __name__ == "__main__": + update_bucket_encryption_enforcement_config(bucket_name="your-unique-bucket-name") From ab4997ce0f7b85947e84b226bd0edf6d714a946a Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 31 Mar 2026 17:05:01 -0400 Subject: [PATCH 509/509] build: update README to indicate that source has moved (#1788) Towards https://github.com/googleapis/google-cloud-python/issues/10956 --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index a7db13a25..6263989f5 100644 --- a/README.rst +++ b/README.rst @@ -1,3 +1,8 @@ +:**NOTE**: **This github repository is archived. The repository contents and history have moved to** `google-cloud-python`_. + +.. _google-cloud-python: https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-storage + + Python Client for Google Cloud Storage ======================================

    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
    #YZCpH(&=V*fn@# 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�@JOa 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
    R;u3+qL>R6YFu%MF`FS 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

    d^m>o_jUTC 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%0A1$PnBdCt#wV2* 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%0A9RF3e}5V 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⁡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 sUR$PwFwDt{{#T)Szp6iNG%fHQ3|!{taH% z<9v?z?b|5ujl~swxn@NZU~(^+!E@yYD3qSh;4t^6OAqk~FTKu%I-d}Kp?(&_7+dn+ zoypCQ@JU^`%C3IWaUck#ZYG5lwy5e-jZ^YNcntQKN#B{1+Q){ahsii~O;hy%u{JjB z(ohQwIySs^Ofew14&*_p)PP|@_{Nlt(Z}jqOzF<2D8TF0U|qQ@8QTx#-`RtSDVFup z9?v;qk7+PQYQ=P)q92z6R?c@Y^7v>`wZ@e51)BXRakbh)Jh8^QJQ}t^W)Oh*{Ao4> z6I3Ltkty#XR&L#w{-pScAkrmXZDs#cAQlV^{Y2MdAzFCJIqF1pvA}B$T8evy^Y)f- z@;`r9ee#vXe_nMK2q*?9aTB%=uoo*%KuPxZGPo3K52#ZK6Zt7zEXL1s9Ec>H!MAWl zo&}{9JQ*MO?$W9ChFz*CKz;1(o`(1HOF{M0b?}PVI2MZ0hM7?aAx%My-0x)bv{nBW zIe2yRk@0R>eqD=US}(4&pKqsEboiS!-_62`z)2VjoA79}YQZU&-CBK2n5S)TSCz4b zL?{e3#_~!ubDuJ)?HQArTTBP4CPvIFgsMK+4@DX8*BcsX=BueM5HX0UhSEZ20!9+h4dOrh_oC05I|Ql!MrU^@3B(6tV3Qc^A@|vKV9b>%rx0j z0i9nfLXjG;D6NgoHq9os=;ZCJ4*HvlAs>kXgXn&);E7?q6b^*U?p3bI*P_a11& zq6i6`{MoQAicq^DxT+5q;%aL*fhNX$VU?HyITN7KVKrF2yJ`(Gz(q&E*&fPDzXr`U zq2BX+Qvv1LcF_+p&8@@-wpaR_A3?@f09&(SRGkx3(DXJ#w7}lAfVyGye8Y&mn1YUJ z)K-^@p2X)og)C8#LVU<~7iL-rC7;F5oaF8!m(hKMcb!!-MPZZf0XvRk*04r5GazCM z$7v^@*M51|k6Ajk?a_quci7<7xoA~{Hu*!J`&zBW%1zCH@yxO$wwKK0F3+N|DV$DG zcdz#szYVwWXsuB7plD{k2abs;0Egdj$p>*dRjAYFf4L0b8h?kxz3tr(=oLnrzDD^|FZVMVq-gVy zoFiE%Pwge)&~D;5%P1QnAA4Wk>3~%&woYi5+2wB8iJkHe;ed~p6#3p0P(SEMxEwn zCkbu*PwXXMF8!|DbIiWzfp$$FJ~3LJnzJPF8~rTGFVy%Bkz

fsU-3E4kawC1_wz}qHmF$|OVCxlpuOIa_ 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 z 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 z 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�)c2+y?OXml?|pz`pkW69Jii1-8I zP=b?d?Fz41iG|H^cn=t0np>{G*v4>V2eK#oe>!m?|bVaCP#5D+p8s=@WioYUmVeAy|Wn@}~lz|YyF}qi>4pB*9 zGd0sWw^0|)E3k8(NFY^OP6ed>Ue8s80e zDc2%Lf{iC0Am8~GM~Vb__LXp1YN=ee&5=NInOUs?BGp-OO0Y#aYaT_uLsqmMYumn- z--XG?Tl*;;7V8^oL0A`sr!|hO(rch{qv!6V5l<9FHV5JGsSa1;yK)5(XNN1Lqi?r)-tPhva zvgIay;}MKneKi3lYoBXDlFpewrV8RBbGY{$;kcAein@Ts!&TExeH^Z(@h3dOa0TQ@ zs>tr`t!(hE#^pRy9y>&l@LuQfxf7z&@c$l0ox_;>pOy0XKn5QVKa8?o*cLO>`d0EE z#-FS|3i^-j_k8uHeRL@bn|G3naM}87Ks`%$25c0yP(7c(oe!Cz;b-C%MC{ zjZ|1q6`!S{LmnGF?~7jUDJCd@K@35aIUu3E2^fz1N1T;_{_B?WyH zmx>P*$h&kqb)Z$-ARv|qN5E|yf*Mplcbr3!54a9 zh6?@llKHcPb5Uryk(5Q8Ludt7Q|X{KHs0?b$wL%zZg{=lMkcR&gC{IMZ*67nk4vZ+ z)?t7~X%sFH1fpI}6;6iH=u+WyamTW&Ii&hGkJ84HQW;z2H<+hOB%4{}e7kCht{03g z%^<8JhhTuHVdD&hI*z>FNr>oI3$ub27rUg3*bstlpreC+IXtV+_K@D52vVHT(;C4S zEDW^|W1U?XCpFk>i^HOH8c`5E#bSa+>(39klX5^uXO!lQ8)9NWSYbl9QGwuZVD5=4 z=5hN&fsPSOt|YR?3(k3fx&_`LI_pzbJ2cvz=wv|r#XvV1T(q=p99eACn8z_e!2sgG za`QXXL!t-L<&1KLqNRGCtJ9!cvQ(PWDgV?@(CqbhN#Nz8T&*?hLRZV>GHXC`)>?2a zobQIg=NYqJq%_q%1Kx6976!StKx36ij*z)F6~hGQ)xt6wJFl6iRag$ma4< z{iM2LgFk`Upw(Q}^98Og9$Q`lclC%v=ZmAchERUHcOVN<+D{Q$TDRc^FE3=NA_;Vy z-Lz8T#^|>Dqo3|B+4y_o3t|QSG1(;JFS(gW&|MQpZ~x8M3LDg}bb&1p!Kj6qhyV%o zzNYj z2SvOp>?x8P0vQaHK$`6wr0$JsLw*EP3Jz!7J>K6lYf~Shbj@H!PK1Y))xGF{=r0kj zOgZ-N-P;Pre);$wTR{a>8|VeX%v;xBujhvvoDedVXj%WmKmXwU$Q$HlDVO7n3So$( zHRW~N4AV#N-XMLg%G!d3d6LiW5DGXLEOj|%5V}Mm9J~jKLSx)x_!jT%bRc{Tom$P1 zc*HC>J;_2<>#}dlf@7;$*JzZdbBxJ*VQx|uF3k0@+n?s6GZ1r~4Vz6I2QLFP{@|uORu|vT<()9W)5t{$XqfF$1DQA5 z<;)63B6~^e+$ot6vHazW=!S8I)DN1)`e`oV;vesIEC=hE0Z|3hYJM%pG^%vcp}nRz zfHwj4)pR5kIsGrFP#y7p0Y^Y4C|d%%H;X&Vt~};0?x+=)j^+) zgOj(?MA@5y%9b@6SMH6Ym*}zOAB>C{ncjZaLINDEwyUlNH&@c z04IG$1qZJ{Wa|ai%BB9l-r-vegeBN%7kq3yx*)IWLCRunF&J{})^&&u^sF5>89)@9 zg@~9ywrScS@jy!>*Es(PxxW7v zd@^hHgWMv*#7yBeCMsg+t7{zy5pPHhBl%|QcygI5Ta-#Ph1QqP)u5-{cDVNrGrlCP z{ZHn-)w?GS6!_nd9kFmmZX`+l;j19Aie5#kULpNn4Wyw>Sj>ra1k^>ZRvw3fw{c7z z0}sx_3#Uv1U76+*+o_Q5d!x&!Px7)Y!Oc$p5~jkB31`aYTG1j~(-s4kCEHsbp>vme z5dnjTlwSkaOAk=fXZbkYz*wyg+!?&8N+i9RPHT28tZ%#%2=|zQ*mp9pq&mjU9-MAD zwY;(p>$-9{30ir)BF9V3u^*PzQfTGuYtVhM9hQ%Ud;<%9JW_g~zqs=(;NZB_ToqGg z*j2#CK`7HeQ2Bf!P*1UlSm)5`5A-!o15}5HV#GyJ1NqBA`41gO^?J6hHw94zB3z@`4(=?Xlg z?A5Rj&T$W~>r$8CZ!-~+iR1ez6e5*wh?SoE447$f3&YTYRg`$UG!SjgAzdX|@)(VK zyYu03(?s7v4cQp<6Tkt_N8WysR9g|<_pi&JGR@uq35c&9CJ{uw>VCw^pGn5|=33Ks zwT&D&vsZSJQW8~NLzV9?2}=w;+FPFsBq;2=Y9B#nk$ zqdh}$^|rQx1eGk+$8X4c;Ds^@sYwVX5#wi1%C9%mj(FxoBN!+h7R&vRp{wrA{w}eHpO1{xvuuzQ^uHB&xJV+?%u3G1mG{h+v82zZrblo zgP1EpCL!b8gb|eGpO*CNeRr55b#7kaRIEl*RRNWI|6GKv(yg!nQ5WN@{b%G2RVbu} zX}|k?(_)PAL6=C_@vd&tO@4eJcj2Q^hZGcEu$A6eh4z)s*n||MU827kYEK9UIps>i zQ#SfZN~JoMZFB)Bo^EmGjqZry!skAvK>F(5-TkE9o6E@Nq*c+keYPhied&0QQQQ%8 zDGE+vG$uv1eU1DwP#CX!uS(`q)ll@teYRXKzwxjy@12gDsAiVUW!E#+@aK?76N)fe zy4$N-=j$MQYwk=kFi7!U#kO56AO&owY_+q+CHFxgfa#^kNolSSx3Yrt(pj_%vw4?~ z85^|X0L!joSJ}@4Zqkmky$T5jWo%v<=>E`(S^=ZK)6*RAWf<0hht7({T3x`4fLkeW znT6(w(eQSELkjfKXJdKc*c*I}6xk!H+_{$Io^;0i6z*IY(T zC&jl^1E@TqF?EanC4)ia)Bu4&-jvihOy!1_iMYYVIQqO@_mE_f6;QG2G02oQsH2fb zP7Ym&KW5Ev@f$IjcoPDFna z)PP7YlOf*Z*%N`(*4sQvt0|g$K`6s1I-78mWx=7%o4 zJH*{(T%|SqGVaaQL9}%$m;)<&-iY}qeWP%|beIcVeIQSHtDq@>E>GHon0xA`?b*83 zUy~6RY~-S7le!<)L^xCOE}g4Q+A47{(R0FPpbWzzS!$LxN$zsHeU0#}E40tf8}x8) z%c9Fo2K1di#~zr2(|o@U&AgLduu(Zhm+|&Tmjw*~GeFG0qcLGna&VAMP!JFd=S$cD zq*!>uSpGz*+(~%4SXug**ky-^Ut^Kc3@Vj9QiRmyHk0QSp7M&k{{xW?$6kXTON$s_ zQw}gZ;R_|@10tmZ^1P3wUQwcLbw?T}rL4F3lRrDCLG4%!j33o8G6Pk6=^LB{1I?ONJZ0Jq|O&)=2( ze4tS9RJS6a^YDq+dmkWgc=^~=JrB85 zkoC&jhovZ}mhe7^sKQg#eBbJHP7qp(d{rsM`oRyb9S_4xjQdn2f$R4n&2JXEDc|_#l9MFz9o5kZ5@^jnXj+tOLtL`n5*bI zrOr)b!1&))aQooN7-vM^MRjy1Ew{9}Y+^o z+|Nrvz+9uUp(XD|IuWFUV(Rpu6EIn5r@RX$m#H1%CZdH?+rn-KPM?SPWZ%~c0l1Ep zg1V?eQlc^RHyzGULd5x#C=3D6fdGC)_aRFyx2ya?vAj89CtjFfJb-9b!wif7A0EOd zGhp*}Nv9t}X`Wbi(YO;d+H@5$ALeSB&CWRpQAAY1qi1hCmv}lTw z3$*Ejp#lW_v;PF$xJp=F+SZAHA_lu~d27_ndlSaDxWASePbO~Wd|5tq_EwPL#mYkG zXHyI?>A0oL=Gu;J5!Ry_jaDmmduLEV=LYt2*;=w{23Byjr_$wEPs+{;IJ9%IQz26y zy(8Vvf*f#L&Q0z&rl+9xobxv^#Wm(0^U{L>IhrM8N`hr-bws2xJy>lazq(q5{|Sn- zc`dMF_$9GB5jvhS;&A3nfJkBwKD7b^Gqa1t1Bly41petHvPHSLY@8{i;i>aAZX7(t zG}^G|`IF}W%Xf!jZOw5ewzhmkTb(D>gVYcNo&&gHt2xm=*TXf$;dAYEwS>5m>)!@b z*sqeaQmuTRA=V5NQ}&Blx%z_z&5==Z>l@I|eIup3jE+ zKatCts{JpY3ukg)VAq?Kl_eq>tI${iX;8@*hF|Tv4p-4Aa`=0>!wMWyD@ikPD+tq+R%VPYE`qNDDnvwxn- zN|OHPQ-3s4{3J9(U&=T}5*2iG#lGAU2l&n^7daK*395xje%%{#d-Wv$j%9?5`KX%Q z-!@V>GF&t~>DXnM&Ye{(D?A12g209sCh8;ODp|8Two^Gxm`rf$e6mG-|DjDfiev4tsQf# zn9WL4H@%znu0QXAz+=-8x$|H6grQBt=Nc}noYpn&V(jO_S}AQ;FpXk?iMG=2rGAq# zuM%B&&d$w(>g+p|xB7V$KCYTL&Ryo!N54D{94l@korlY&FMjn(l4wYUrezPn5?PlSX1KE2m%**uI1g$w{*Ezo7UzFs zri0rr6{AX!GICo;hph?^RrW1t?n@;N)X9W2h!NVpFR$=WJEV>I55P~V%2*vZ!FH;wOMIVI6H}^ksLL41kj?=DTzkxirPPEO3HA%Dci(EUDqXiAG0=A z{VvgNU6bYq%%+^{XWOywvf)#YaW&f0@dBK6Swcx?ZNE$PlgJsEzx;NJHW0f6IKPBq ze^Aar*e`|OC3;DM{fnk)*gv_J!FJ;2tzoMJ9y+m7Cgc8*MHvl#zv9D*;rwh)MbM%Y zelFs4dmS_ImxS|E@kmWCT>ZKlxizsaC_(0tY~pu2@RSWpyb#&o zKepOLWxFAAR?7Pwi`pqe)JE3N$_ZGF%NHt?g$yo-E#j7Fv~q{0O`EtW1l z@Hel~5z+uHjb-ULo38jEsRmY0*JtaMgNcuD-WkflA5X8bT_Da2XNw{SAA994q6Z*r zZb#zvr)#9`75NZ|Gbb&0hN_BmRse2}0CT_&4?RDkuAERqi7P{^;B=aR0}YsBkK3dt zm6m0xa)L$S5-O+xeO1yWh#S6Xihzra$xK%DESn&p+SdkCr6n28DQ)7_wB|>tL%?|b zN$G^sKA@_hlv*dBeouSq19H49<4zQ?Cj+_L&zu@Yt4nu+waKkJ-IA+4e2bP7h|QeZ zbe4Taja*78r2jb#<&Rq}C_YpH;2wBS9i(8_roZ)L3L5QQmI$esD}SsY5TjnN#B|ck zZY+2C0Cs)FC3k^>kEj!pSC{1f>M&C=V5lXdufPzq#1v$;pI{yaP z0(nvs{*P|_)L%atM!CI*#Yim_Y+Il3c4zBlY^VLgVn0=yBfVy5ZPlYv>JzpiK>2X$ zNi7CKMB+)~82!8u8e_w>4c-a#^ukSvsCO~ty}$OT)HXtS*f2A^Hmy8wZ@)%$^VkBp zh*fUpdFSs)PY!tSu_``WY7|GLp&c1#=Yz(WC5n6I=~cwXg*`;|(byYA(li2VdAI}r zXM6E-tubtyCB-y1OkMJ~uuXj>q+Xn8HzxadPm^ccTLWJ@K2nsN)Fl!W?xSgMfEFGbu3(y`u?c406v!M$W2V@Q7!fH9wE8>`NE#rMHfphH|U0LJ!tSocbUexHx5 zfGLb7Hj}U&dQq&n*A4qHY?(l~HVTXmH-Z8ziLwlx-Gk$?G-GWPNZJIq327HR9=2S%=m(#zkYHM~J;)G3lmrvu8e*c0?NKdl# zaEA41jTES*fXd6tT{y2M&Oplbfdmuv#l*+NQ6hXiPz!`(?;251lgFB3Fm+x)j&O_J zLnos}y%dg=DxVw9iu8Y0ci@wC)?Dady{^|Nt;F%M%P~{e#DnETLHfbI1G7e=jP^D> zwyyAfci&^A-RIJ1DyMQg$sji&!`X1*Eodw`9BpweLG6CqhIs7BK_UpLV>-mg>AV6^ z$}K6a{FoE}40zhq|Xf89(=b*5yde-|MiP|) z9W@kGKfr>x>xbi%p5Oq-X=)TYcpU1_k$lua(bD~kMluo+RWdfjW3T*J4HQ}bG4ygy z$^0sXeFCalBnE&AK14mT9FbXr3_Q zt!$Qw_Ff3=CjS;0QW15q5u0>fm&2DV!>%$pObuJ&BU9$|&lw5Gr}1gI5dQh-A7y|sKSX>qlxOMBMDp!ifHA7*_kDB#dMEln-q~wEUhZ#K z^f!WnRK9tGPQ$BgS9ge56Cu8qx)GT$&nd+7?{+1@ZZ`dDt zLy*Y%J8Bl}MAZq0_{Tn&IU0>^pyxj7ZHnlw}CsQ|9ZCP?L9b@7}*M*=PT&>Qh}wGKUkN5Yw+L?K|%8-WCho`Kng zf-SIyXm&aMhaTO9icq6=B9cK7t;It>HqzM`I;7MC@LHnGFvp7>HM`=(`v}>Gg+%KL z+LfK|#ee-z#}_w}h5--wD?I@19mxImVXAiO zQ)&K^(fd$wmrlDRGDRX~Vml(uh_Qu2jk}+iSn$o9Lcp9w?Lz*eQ%SfSPV&Efq&69f zBv)biG6hP8l+plbBH{K=)CwuD!?YCW6%ZTK%9GPlRy#MRbj01q+*U+5j#m4d8D7=G z*EGv*wWN3DVa?m4Jh$-PH%ge|BEB>H8uIJDM!o;c~ggonA}+W+7;Xeuy_G zztBw8L^VKfWZE^w51vi)XDYT5%tY|N=oVtc zkX?H=&CVok8x(Yum5uFMbQ@^~cz|(GiiMPTqf;%oWHDOL8EGYG19PWOF!@88x{Bvn*ZqXOTNZZX9?)By~1ifxiTa?4}3|-eHLy#h!u`RsO#g zd*eaTzjok5If=BHVu8EUBj4Q9rdA9N(G&S^n<#jwJ4tNWEUboH%=I-al8X$(mQzEM zo~oFXA}bg}gB`iNBkgSu)2ni%)W? zEJwQI_%3Nukcvin@S zn$V-bRugW}A2U@4@H-B&R)6WcuXtlqD$F?bV52E^47|I_OI7LXpY#JzUIF)nt~3o7 zHCvhXGfcG}KtbrWzko=-p3O&cf0hN|GF0WXR+gmrVuoFrBw@RkA=lWaQqc$fBF->x z9BLS^U=j!3-4yxk%evYSTuu{wwPU(0d=Od)Q_4D}&jShko|yC*QqxT-#fC9Gw?gDb zBNcGqbUtUu0B=ITDDd=#WPOgsJMdWXT-FKDNL;W;73lSuqW3Cp)|7^m@m`LYCzy9K zzuIA^&&WSyzq!a3=Z8;vg%Dm)-k02Yzb>qVp^i@cR%y%GhC z&+YrEub4Q~gatsy3qmV)BjZ^iV+V zJ=gF0I(pf?{ZG1}!2sJlQmy%=_ujr+KiWKDSSV{Fh-3NbW3GyI zKTwLBpa-Z`{svM#2d&tR*~2+Neb`&{&Ewcw94$lN&Ih|B4M<6*P{fdjZEhtG&F6XS z)@5Go1OrFc(yqX7dkDl!!URl&Oapz;C^fH`lxB>VfXw!@2{XEV60x;Il83uoO7r7K z5L`!1VXCK!P~H!PbgPHEoFJOmqaziFuJn9xu!@TQy6(OicwwT5H$N$L`+vSX#b)Lda{ix{ zK?mI;ZAp_1!!v1lH3j~ZJ-9rjfj4 z{rM6!yaeLAAwHs7Qlv)$C1wEuI1EhU2D!G6!Q;j(!6gFV9-5FUc=Jh3x8mjIF}!OQ z=H)F9$u}$~N+-{cE?r4szs~*Vfr8B(scz3YJrx185w2sf52(v%A{g*DWhbWj$)Xr4 zF6ozt^tG#S+b{-pVGk4Nxx7yk1{>h#ruh9@8%MMJ63W3UnHq8hMws6Dqeg=#nZ=^o ztJHULz0!i~!{t9p9F<0Y>Tv-=b#r?7Cb$yrV>)B-!z-oQa>XC zH)CHIc2BLFnue7Z{*#yJ00}jM(7w`^DlfPJrROQfLrF9#i_U0G-g3d3RC3!lW}Y)4 zIBM~(L_e>3arD5E7qtvGOW4a)(>`|<(49=ia^oG$O+Pi~jHnmGbw2143lH$vvw*$sBei; z0KQ`!#_oXId>ghc--^A=IO@t(U`U^Ap+yr08I zUM+!p4L{b6>{q+fK;|kg!u4_NF+_Y4;$9=h1rQw#KoY|&9nQsa31=)Mc+ujY z{{5it6^iUOE$12y-G?q}hf9L%t0h=TC$N(8Za~mH5ab^I7<|mrQ~vrYLl-63kc)j5 zrQ?TRjHCtbdbqhg6GQwYN>IuIyd#P^(NRQq=QewAKpwG#P`JoI26$}}`T>e*62$E5 zIMLs;zd?(($gGftf@W_YIq{YAViL`9sZs24=tFFRfZTpFH~Fh2Nn|$7hgO@)pB0f( zC0!0CED-DPYFXaK55Dx!jWf1`gg83L*F5(e7z)RPFI*!-a6hGWB` zT4NwV-vr#q?Fm9d<78XX64>zeNPI zxu8I5M3eWjSLeh6B4?bv4h9=sC5bpwC-@VZq$Can&+xBGeTeD&NgqfbM{>-J!;_+t z3`R+`=zJz3I_K*j84QKo3`g-Khhv)HEF4EcthUgHM0TGv^}rF5UV4V{q;lSbp}7I3 zwgm;+5;@gnvbK6b}D+lA?&usmh>LXaM?sW>?R2Du!r|zdHjj z24qc%xyAv~-pibBb{*!iId(17_Zi#H&PE9J1 zj?O;-2B6cBI-zj>55Um;hskBzBDaO(imnt9?v|F%Kbe9bdkH!oz{1L|0JM)#6d=XNlvlE3 z58ByUcB1Cz3%O?zKE94vXsqsefKc{}SsiYTgXS*esFP*hI-0krep=SCw|vWO2E2#0 zOgWqyE$lr)QZ4rtQ;e+?l$B#ME-kHA4$KAKS$E-~+U3YHeZ4DNgp6wiITnLW(~#pu zS;z7;W1iqQ&H7@$o2NPvpDl3|$t(N9o-AeJaH75&YB*+eD+DQQy zl~af}q+^4#@jbm1PZ3m0=9iybuHg?FEcj$|ZrKT>V6Oh^C5OJskHRiXSvlj8{+!F> z`3UyE76H>gGX`0f&EhF}qa-9!m-A4o=;yzFy*o=i-avw0f{ZZ?KlEp$S}8MJ4%wl7 zTEL-~_`B(hHM<{3j0t5LhHYO%mh=2?6`B1T+*(!W3Xtk82%8^uQ)H9<7w#Uzlgg^r zLH5yHV79o_M^FFcOXse__|!dilFL8ND>p3cpavn9uzDvz*$7f4R=0C0y zS>H?U4B6xKXuzLkK=Ana+()aqTS~%x^d!HLB?Eox1q%E|ZPDBXM5ab`&cL(_=nB6% zw*6_qUrrHp{srN=N^&&Lmk zt8O}RH+q#VUCn5eH;*`h_(DtBR?xHR$uvW70mhF3G&665>1hl290HwzZF}8!;m+H5 z)L53kf+L8w7C^@4{fM9N6tZU00NYUyp#`&Bsru*KItGe395lJ&E`7VC%TZqJmwVIb z(AOy;?k@n(g(-S)$m+?piCHOH?_i?e0TsT;*5fDJxk<=rI-UUFv&odC-6~MO&YDfU zT{DTJmBE)GJFE+f{nAn+p#>=PnK}$G86po+Y9dc(^KB5^lM#<#^*G|jRxEg`mLQI- zpEG{xk9hsBpM?k8T-pe69~LFs<3g33N2E>X586yI6Q0Tcuu_|i?f7stzW*udJ>G9~ z4sOD!)$=C&Db14m--BV<)4ODbR4L;jZzKqJMVv!XKC`)o-&B19_&>qlsY@41n^dqK>MN ziQK|Y3nPryov)*SQBk@ReHW8kiVC&Z|4yRRBS?|38;5jtZPxL$NlEQiWc=AJ6!0Go zdC5@Y2%oSkJP}~qkf?oxf%kTF;4`@;^|@KD{R7nX>lA$>HQ>m#4|$;>U%8plQsscT z^Om4Ve+S&*T+?Co2P&u+QunC9m{6rihG=Zwsi})u&R78;0!tVFc<0Yxy!`>AvbS6q z;Gb;VccIVGKg|x#=yV3kEVyy6s% zRU)yr$g!mv$+lp;G{9Glo!cmE2=q6$BuunA#=zIUsVcy0lzY_?7h(zSNMv#C^$9Vg zg?vq_4ezM}4YIgCpA9FI&(2jOb!UEB5^K9b@{k9PN#n!;Bwt(R+v^3&x`n+z0a2Fk zTfpxg(5|~b%<(J;(v^=SMxY|ot0ewJUb7QCWG_i5qIy=HVXg2js!s)ghLZ2bf_{EuEi7RP(dMluYyNCh4vj^bZFxbj zupA|}sF`t)iEq=QG_Q?=>^!;TuSt5!^HW}4keV+7$i4mjdUdZ6y74)kR6WyosKw0W zr7)KfPy>-iS4!Q;GVAg|Odo-H*X~*tJ>6?252l{q5@#lufn)t#JtJ z=QjT}_SVa?^(-CIZo#Z8$oz+6{dOFRMjC>@_#IrDi1A5zz^@*LS%<;2Or<0*vKj6^ z7I3ceBHs=v3WL_4sPtY0G@KuR=`><;^QjqnFw?kS7uvGxLk((lPe4fN+}2%U2L zH>Hw(mU$wFbDA=o7qm9>0}No4j-9&)NYn4tpTYoiptyJbRpp-fcrh#z>#01DtT<#y zy3=O&P^H$P)u1&>7tqYq1^h*wTvd(;14k{qPnZ!I2a(+u9{n$JsqMfdC^oTSa_jSNgiN=B^S2It`S?Mtf3YLu%wn z^Im)lB5HTBsx@_IAg>k7#PfNIeI7?DUix9GD+B+PdXHW&fF3uL6w%4O8X$%)FE_xn z{K(Y#O?n8R%~7<|heBpjfpnXju4yY~0P46?!}7Co^yh;|(l&@((KA=)WtwAdQ8gXy zZ5Sm_pFox%7ScY}`#iXHNwS?Zx?9hWW3+WI_J7H{?MF!)jDM8fQu(N62HYe;@Pag~ z_+X_1#6%V-tX2*qjK1a3q`7nnR7>mOg|&p1WtW=-C#PyoYONN%T%TVPe&>;&=D_B6 zpl|)re>I044y?&ZW!4!l2G*T**#BPmOI?Yu@}#IIc9I<=*BwLQx`fUddDoU*V!>CA z-1??ih;5RC&2e5J_mRv(2B!xVoUXV=eadJcv!gPJu`K%TOIv|Q;KPEQ*)uN&QtcFg z?P{(YKEZ|Jue9@)`1Nbv!{y*DuSRIqJW=-Lac8xoF3z5N_2_u8En2- zt^}kzdDGR$VS5(D{@3%xwEEByGnSPYBh~l1K>>%kbIITJUnzzC)Rp8#TXx;K!WW~i zYvuvSF9^4^jXEP4DA&9B*(f9dzF29=jc0<={ACtV*35FL4H=*+MGam*QYCfXAZ#kU zMXZr&3u!AZs2^=`%-!GOPw7s^rqV{V75QFNuue-q-r7$cjf;Zg0&|^KbDRXul;ADo zrNG)(D=R(ZGB1`OKU^eJB0rkCJGIc+^(Cq$W0;`Rioh^p4oTPz-{f?%%vbBFsbe^d zno%wtidqq|i3rb90M}v#R`T2 zo1K_#!d>VgC7Id<^CoJ|A_<=$cJLQR4Mn-x?#PQN87-R)IDW+JxR5rQI>@rMj31-d zIC(;>!k=JMq=zT$?!~v#vKYw z{?9OdIF#ry*tClLvdvHDT!>D=(I)MoVU5l5$|-(m$i=e#DHI7-Q9$Bg>xo z*z3dSrO~tzr2Vm;?kf=Dk$C?OMqlGXVpyS=VK<9$lhsq4mrO%vixQ@PKfyA^(<79d zO&+wUH_4ODQ(w+yM3fq1PI<^ba|CBUmwWo7Q|d6VHu~5hAPD075M@Zn2Ag+dEev-y?i?RXolpUbkxLIs}P z|7{LZqu}ol=gRp&6#eaKptb~^=w(>~c~Zy-CtR@NarHnfpkW4}AG>luT3B4&Hi_5+ zA+(^)nR>BiFY&sNfUdsTN+Sx2zo-$*WGf`(a1xSv@=^C5120tPJsPCjny|MU<9%Q( zCHmRoXZ5UQTZgV-{_Du^Bt>uz!fW355B-TuTTF+pAY`I6S1`bYI<9`n^BK!;Dh|#` zkB2h*O4tx8hv6S;Mi}+vJqi*QUz5sQ6ldrN+<~*mnl$41P^bP@G5zP<@MktgVw3HX zR3jkLckw4(MK6R6U#XcPk<7#NIKWr%JlmHFh)iM2k-;d!Z zMP@)@7&zuE|u*(k|$H z!~#}(d{EgQA@-z@@!SzVN1*x0~SRF0p2XLJ1(qk=?5C1-!m$@K(}m9FLr{27CnqD+L#O7_)hFCsJ{> zOBLbE-ESKtZLvjsR*&LmVo`fpHpWkxchR~T$HSyM-Zj#Em6FOj5z9T_2o(S@0*tOd zHSZb4$vou$ty{O;n|q0EBtB-`eEv6b{1T3$P@5_nkK;t5vLy_?b&+Bop4nDeRE{cG z;hBTo1WonF!nNLCw|yAnWy&}BiNCvJQ5#SOXv<^R+@CC%ce8DC9N}`By7`m1Li5RE zzq-I*%L8lTu;@`Zwdg&@-DoHSkzY4;FU0T1+x03CM%U}sW4KW0p{o`d88&t0qnlB~ zMM29Gi36kwv(|AvaC6o1E>h%J&rVlxgBn<`sCTf++#`x7 zig2u^Epe5+$#|oQCV=BQ8IiN7;B2{JX}pf0Jf;1p8LL+8`*9V+f;jB=zovpzcKXA~ zHF(8P5sBvzA4uOkZz{~k^7z?xd4K{GO=7}2_N`ztx!d1Mi9Y%{7m^L5aF$N}LbT8< z-|3`hWZgU)sh>|Uajj6}k^lbPE`T$W;6OW_1mmL)#h;BKt(@NaTC7W`C?%sx8K)F}YsiN*+0{z=xRn{CKHY z62ehO1!&*=K3Ox-+VR3I|6(pxfW-*yOV*`*C*5h?j6Sf(k-Al3#-j+V1)G3FY@}RR zK=ua$lz;C9V37MgTq9{XHsKV(#ygxH*e)9486v#MqHx;OkM*Y*J6~m3u)_`NLa4t( zoJ?o7KFdIXF42ET1kPWQ>O;4=Gc!;P3l5Z9VY{#YEj*V2y5&!O1)LDA`;y?Uzhz1# z_m(bfN#^;bn2**N3vm5fCo0xo-Ph$?sC|S2!i-Ha?SmBad;FzRs^y-Vf1TAo2j8w+j10EN% zMnN00x!-X?j^6p%(VSUR^g>X-t0^uFL#eG9;=Vc|tyP4cI3i>@7b^{Xv{0UyW;=s* zy$hWJ--$LjO(|aRxnm_tl9;tJ5B%ZzbC5luwvGPQkU9sa82dY~faQW78za96x4qI6 z(sFqTc4C7ZEu48zHIWGsJ-zozV;yDO1k!_f3A3$ z5^CDoo@-25`1>Q&-8lVD1V5HT9)gnnmgh!77W)RqXOWs1RRK1L;>oTu+}m}b5uQjE z!8aF++sY+jER~kdx0t>l=R6WTE|X*~`tzGCe=iTs;u2hxgK&SX#b7B9Q!@A}$nWTp zXAg0^!%?n&hD7)2w05itP1pERDK!hV(aEm69OAAjv!X666JH4$a+Xq!KW2i6&(>^o zx%%!jQgASpIP~J#Ja_b@$-&&ZeU&_5m8$ueE+eXA=Q6t2i9wYjG-p!5VN5U;&>k_b zuAMPf7yZ!qK&jlb9!>Xt55Hy!ueB4aGJ2sT2w~nCyI

lHd`d~l-<1?l4j{2V+$rdCs8eKt84+P!6?@p0 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 z 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�E(rK46jnct#GZ9v4DH&6-1>?8$8EZe3f%*nul9fitg=D1L z&tV%&k7T2$>D)^E(FaNZN#nN;FNH1x3+jQ&vc&r4s7+T7c~d!>+bX=hthmG=)5ax~ zTG=&x(=fN$s^ zTQ~AU8vcP03Wko6{p#}qy1d1mCC%YI5FQhU$iW^PAS)p@*N;?*5sYuuQ9ef`!jgJ<7CcqE>K-*v zq_izIeE7wMjIT<4vS*nm0inVdA}m-*$Aa8F_Ct6@`#&w~O$NsPTuVUEirT5b%2K>W zRGlxF*6#By_1^Y9$6*j_ekCBr_Xy9vpyuCBh9YK&JKD1)q{)JxZxgP`5Tc1uXLwLT?7x<;TqS0rP-G(IMgpQ{+nW(&nlYTkMEWt+Rr|Gz74 z+nBHh51&t^1z-b3Y^qxmoDeI>#)_6+ivFD5y19y3XrSU?-jm0l&YRKX6b+ByPwe<# zrfe38W4TJHI*YW)Y>EUL*57EvbfZ&Wc1#Xj4o$(QA?*ZQnU}fk7ZtFc9g{ZsEqYsr zV3bC$8;v@L#@R&P=apPwYK&ZXCg7t&nD4ef7YOcS3|$=Hp#A_=`Wh zZlcQ=(Bv$PKv#5pbV7916i->38fUBw4F0hlVIcW4*O*DIQM-J@Jx&Em?#C_SA9OUZ z96bEY`Gc5hOmj`=154Q;0l~15*2&S)KzmpiQL2=Ib3?ig*gfpzBjN9Z(x?0ddFuK!pY``GOgiG$U$v1sQ{fgA)x9Gisn__fW=8`jevXs~35Hw(>rsIEN zj5i|vXR(!gvFCHr!_KBg_R_}_0l<`d2qeFM&^vQq`c|$*7+y-T{%~99+X4Pv9@U2+ z0qY+Z5|qj0N4GIG=U5HUK6o0}1ddQ`>ODMLh*u_g!MW_$dFY*K-pr*?I`Otd){V;9FV*FA+X5)3}D0l&G9@gq3@M zdSKM5uVE6Lqz7Mx=ltX;NudHKq+12}c~2SeUIlN|a;yV_G?rbUgn9MWfN$?kg>*1f z*Y7ME!*qmk-moZm;0}*Xhy2mS?jSuUEr`PiLNrz;nOkPL;BLoU&ibMOi)@b+Ehx0V zYcTphBSx#RR{2LjeY>LNUflJxhtCD=$B=CuT>$Q_EQ7AcjoU_-j5~+n&x1>kT)TZI zA{m}uwMCp`E0ZL7_UbN0s_H>^3ttkID|y5mv{G+@Fc2f0Too#h(BW_LD zHwf5jVG`qkZBpu)Ic!pQ!Egk^`^i=<9Q$%;=sJPq6EK$-u~Ou}2cP_Fq}}$(iN%q*u40so30Wsd&9}hySI}w|JUn zUrT})5S34WbbpbRMC&`A7!Yu1EO<*>+WQlIw<@4`FsMVpH)FiH6z=ven@j=C&%s3q zf#`(`|5ayni`k+GIzi>=Vh$p>dxNW{w#JEM-;T;~UCx4(uoA;0E@QHKjy=K~etMS7p}+ zI0LVcK87a+em=?-e+jZx)Z|AZL9Q{ImMJK+4X>O=!q1cLRHAx%!rBRyWBrJu zFt%+9BO(DT117|*0@$L?n8F(@+Lv}jUX1W|YoN6V+>!?54C2(OGzE!wDDqP@00i`@ z?#8CaxDmr8>dO$_uk2FursT4Fi&e_)6zdU=?gb+*Ec$k%Fs>@p1mdsg8ywlG#5)B> z>$VmN;$TU*U@8xmdZPJ2>(P36U8&P)gOneKM#uIKWxQMPF}Xe(S&`Sz6h5I3J~#2+ zPOs%2w)v?0Ql_@LQVDA>*ngJ>NS`&IW~pL02duq}Du?J4%!2{OR01mwRnn!%OP@K5 zrUn%^x^y0qG#Q~UO6|-e4wErgFiO<|_;v?(B1n*aDk4q<{huX^{U|hlF1EScI9i+N zk$b*5q@A%AOiaGn53Y<=Lyc;@sV=xQvaPX+PlsTcnoSWx^L8KwxO! zy`m{H9M;IZE{h9^txnZ7+WM{-ki)%k$Kaz4lr=%)9!oLP=4v`u7L9!xoN)+A;AtIc z$gL7KKTnSsz1OPLKri!^jbIb@_?JD9O{D4F>Bwzpdrk(3V@e8y_?@UUPTCbD0I<*` zo&}>9ZAKU|jO{4@1P9&6-C4%^O(yKaZ@&2H?FcIn@$7xX#BAjRSH0)rvQOC2vvmJo zdT3zCHavqTD_Zpr3#-L(TT+z&>#?Y&BVBFzQ%b4yi=>Y@tpnIqX%hhKh7<8i(#6o| z8m-)A&uYs~GH&g=W>V0ml0jf8z?WuQo8XM?`tysu2s#0^F=cujhL@3@du2mUbf1d2 zy=>9C`E67dm^3(94(vbZHg_)V%%I;cyDm#(cnG5lfOj3S z#F`{ObP}px93wAnDTIg6`!7wzs5`-YdfJMimO5fivP67#IT|G~n7$4=qWxS1dOR?6 zr7&H-i_B$vgqo}*G~=iH1O4hj7$%j#!(|Ms`h{msD{>U2xN3l(^mRl$=RLETwOkTq z)zoP?#EBJQnUnMkVio>UGf+P*!wvyX4)#ngfl_4pC&Yya8sT z3&3n3(QQiPLV1z&F!8874I<}byF$4+#{jp>YizaRbOceKb1UkX#PD2Z%3PCfWhPH5|{RkVGcy3T)7|n+na9Z<$dk- zIRhyjMxwgFxw0z^Lz-ObSOr(sTac3p&LzA*{%(qibxdvg1G*dL@D}TJB7FXzsHKX1 zecSMQotk>A-Vf1Vv%%+tBYgI#B_4GE+5BysyHo$8e@R%q5VUIfYk{iIxZ*{qMD-sX zbEy5`r6^pQ9|HjFwhzZJC}QoG@DbOTSozqhT7u+b8EBS!aZjvtCgQTzPF=9>v(7j{ zg4Uz$!uCB4bDQDVi^_x$DwQQ=l2Xg?)Y$=s+44Oxn(Rfabhr1F(rd(aqX@?wF}_weFxJ{4Dxe{Anu>w1;0uCgf^si-tq{)@ zpbx{}*_|&6tZa}SLeSo0g)tC%cW^IXO)|S=kY0RWQZ`DT1c)2yjFPh>Ezr8pw3@&Lo+kP~K>_0P0D9zqKXrt0pBbe@Tad+a+3` z75MZ|Xa#(Q5&yUp1-tezYt?uWVAM#lV(u;?x)svTkQNyZr(4B~MvAEATj7lB5n#nk z&7A3V_+ioR(|je=T;r!me0scu(2^)zaROfJ3EG{v(T_OqoFtTt&A}I91talp*BCJG ziZHYTqg}p%!bfk3ZIT)vn)V51Sq<@`Z8K&Xrw^I@&kL+YI1^6WKCvz&PKDDGH-Y6n zPPi_*=;=$G@Q_^%2v(o#|44Z|LEbjj`*?u8jCt}*UW`dy$nJO!DA z=iC!qLSA#;qQ*Hw#lZA3ACmo&o@+Zr$YSBA?=ca%Fskj!*vMMb{KJwp9K{TCSBp}u zKBhgrU`C?JLn5zS>au!1KHdzA@0#)+sjR_BbnQmV{$R?1f!t_Pg9>AoB~HY~Q=>?Z zs~8{gIUn~*?#FQsi8OVFMrUy zJiU;B{yEim@7etHUpsO~8755;QVy*zF`I+Vy9%7R3ynqHO0PB1YXwlR4`d^J8G>ao zR+?mnQ+qFmsfPy*bQ8b9PORlC`d#5yy$d#jvZQBTM6+GQi--J21S3_1fY3I9&Wk8y z_wl|bi#5AYJ@t>L#f!YlFK2a|$_t(X%y|Ja0Q!D@*5pf6&u6~#(ZwHX`G6U>Ln>Er zB-;gHo6z=sPiSpp5AU~VT2tB*$9gNw`Aw!i_z+8WT=)<}-YTu=Dio)q2Aj0>W>tMm z+@DOcwp_fgyNvq_t;vC$ut%FvOQh`IB=X!4fi5ebEHnylI=&aB;c)XsvS9lJ`gCjz z*c5LdlN-AbrI;hr+^bFV6)EvTA3vU7cUR(JQGM^)H)KyTy1m<9QH`fciQ4QbN6Q!G z?6_oi!9P}O&XV{MjEB(GaT0@4f9w0Ohk2tGf*!{>s+%40{E+5Td+EmC^mZuyl!greEoJ!WRSwUYk9-M~EIep!u`*8pcng)~tj!)Xd*<{r zpuU;}Vk%lI8i}$a!j_ zR657F_Vz`^YL{Pu+h3>9cA?tBQX_k78`2YzmjL5yypO=7 zu%Pi(3U~na!$K0;I-h5&QW(_j?r?yugTzzNy|8F6fCsWE@@^uf4M{sv1J8=V!Zxi+ zfqF)Fph%g2UXpj%)x}qQd!f(WAb<`k^8SdKXHr6u?cPtS#Y2Aq$NtIXkq4>%!C^qE z!w=B?qycmmy1?%Sw+PR;dcO6ixIHhoAX|6*>*SGtvZ?TFcv$<8!ZY~uaw40C6nkx) zaEquAF3WzFNSAULWOHXs0w$6G3322QtOu@=BPG#w#(SN#eSownWi6CmPkrj7-f^zv zNaUU)Euz4*f!DN!Uc77DF`InV4kn3dgl=IcB!B%XnSxBMlKWjw!Ae$A)#-en5cRRj z;(9>eR1k|eaCTCIgOGrq5%jY?FfYO(rl)-mia)kyPPRK4f2TMTF;#-h@~wEO!EdA` zNg4KIWPgh&U>l{FOSM;xt1GKghLkNE$SWk~787sf+IUHM(^uA6*;q~^r&u$RD z35wK91y3C+l|Dyrm_Af?odIx|Spa=D?+QMEDOasS_VatSrQ6wt+OClUL1=V@slxj* zgQ?r1(})^daYc>y9;FDYw*&rPzwH95mqtlvThwa2eRUUs(WSN7?Bi!e#@UaGdXcz$ zRgK;*^CHqFH73sC?@C-?Y;q=g3J?eUw7@y)$1ZhTuFMXR-58B$ZiQh1QLOI}pn6=D_<%dfp}=F>u$5L_}6i;*f{S>~FM7 zfLpQZ#~gnNq_D*Hq!B(d*mcXKSM2&-h$htXsq(T35n|PCdQJH*^{i_cFRk84Ot!H_ zl!t%32zsTv-LHR;G9A?5L5jW(`wM9JnkOFH6>gyKn_3!BdxhDzp(v%5wjLYQ5sQuQ zHV*Y9SxYbh*laz4zRtuEy~#o!OaFS%h|%;9XP#_lrAFZsHd~fDo){gDi?PEazjQ;b zV%l6030j)>--CxeWFtBhJ`Ongc2nn#FV?z(J=_^l@C`7&U8o(j@>6p0DYmjAi;N>I zn%jg^IH!*Pui^O1j9q|A zL4{=OA!b5_YY&&F16fMMf8EeGwqKw|*KT>|!PY^e z=`P(1EBQWO1^gRkQ|+6?Pias}eR8C9#34)AY=tRxbFxp|rb6XL!Iks!AHvbE8^5?pF%pJSpe3Dw+dWe{?I*SUE zcz3jqFAfR8u258u|9b(Y^DN25p(!W(w;fcDGfe_G3@mqE$}6VyMCiPi=zF-K8yjdR z7W#*Zh;3(T4g#1~cQs?bZP?*IC)&E0PN9hF`=@NCoi~xk}xL!N2^d`c3X60r=;8X`is77}!`5;)m|| zqYEe=OY8a(l%eV`Z7eb5wxpm@uA~Gv;RbCZ<3~IH%mwJdU%O*Rw0;9jn_5{5mr0Ui z&Utm|?2_`6z*;67z0egapjD+$6W;g`-7xZqcj9gt<`@w9({l>H|Ec3R)!=7ys%Tf% zX+zh_dOXl9$F1h^MgFAqUL$FKcMXiDO0RU}g>oG4kPqu(hqMsR<&52$zu-!lGNsmI zi%)pe{?OxG?SUrddM(jO`fO4kWGs5@bjGqJF;>|oRwi+PT_nT+>IKu=a2^+?RFVVD zJr&+f716RpXtBY^AfN zM_p8MAPiuhq4~q+ZeHRWE)7PDv(=Q)+VikNHCK<3t6_`BO_*lVvYf&KDJYstJm|Cp z{=cubx51#ab@JOg@ZQEKPSH|XMW_q+=zz9#SvzvLy|ans9E9tmFHi7L$~{8Md4X>>D<_$_pDq#JG}?PH@v_2<#@3|qP7 zM1vc@UgzLZ4pxvCfWMo@NY1EEE8b@uR9%6JRHMD_q$vlJ>ivK2Q5!j?FgMl+IheLl zM2}l}zNgBTugb?QBB4%mx3(z(}uAC0`v?KON19; z2`3YU6!f&zF_NH-QYoa!g&aKnkY}nyfy|hA!@u4ll(o6y9~lq?j(+A?mR`Lh`MbA6 z(}4|AzJ*jL&)&sxOuLqH-H>l^cqLOsdghuUqA=85k<%O{g!lCCP)BM$7#1uhr|$V? zcp%PGymv(3N&nWl)>wq!oH?IFckJID+SlNQ(RyLkG!$s@Zzda_jjlxjSLgNxZGc}+ z9KUK7J70>XfIiif@cnvDhgjqq==I^XGB z?!&Tqew?M1LFeaO!7xB#m^HksB+R)fxrkdpTfT~EqA8u`_&fFptCXzI+Egi}hR<90 zFXyqKAZbH9oCcJs*(KztdbcSyvVV%-7C#JrBhG2%*rV$Td+TgmS-znuVSrw=vl-qu@y;pk>syKayQ6yha#!BV4_O4ifSfW~j%!XN`q z*mM96p$M)pZTc&%wu_CQ(mJW4G!l+)#3~w~TCcZmtam2d!yj zbmzKF?Wa_~+AT+-fdfc|B8Be$`uHt~^lfT3ivh2Gb zeC<=QKrwCuELj+ zrqh+hJ|xxdnTpcY!<55TN?tWy3}V26aeg*S_HCP<({F`2s#2&WJ;$n{OWjeAQfgtG7eC>Mf;BdJ@ry zq_@BNCR|DWL4)m(xm8G7s^Sv?%i_|heiMt}We#i8I4{*6^I-9VIy42wAb!8HlSbx7 zl7xIWYx9cqiGMKGV1_H_R*GK?D!=rR#pgRxgJkPC3F*WENKj=wT@%7z#})cbTnTO7 zw3fc2IcY$;SD4Cn7T>ZyI#_IEWa}qqba|6210yaUxY}@s=j6s0BcF!x5DS;xi|K@oPyxbpKM=3$$ub@LL6K3|~d&ryGwW&3>AC zjI(}6^2ZOB&5Z~{wC44DFe}Y`OE8`?c9A;{{y)$A;v1H%Vuc)z1FGDo7X?fp1OFG9 zo)j`2Q8OpjJ@O>N$z|*&{7MME0N|bIT8yrJ>U!y4=9>P8O0l?SubeXq*tbUj|HirK z#P&v4t=GK4a<7fhE_6V^%^?3%D`?4Ah2f~AI80wCmJEkDJuxy;L@?%nx7@r>Ce91fY4$sMMhO-CrL$pqanBz5h__0$)s!f>!6y>cgC~zcu&97q z?L9O3=X2xp=8t@WE7njk(kcI*iYUb)X3iBz!DCn^XSv+edI zW9?#(p#twl7yJi;>ITh2-sSmbMnu&rX)ciQo=s9N-v6vf*{hXXo?TX+LaidIIFX|( zERdGpC(bOshnMPLMWAQA4EKW7e3^G17cnIll8f{>BwrcLU-PNzRE}UuDM`&=Caw>} zhAcwLN||c~gKGhbD$-a36k8PtI)NIR$ZKG+>lM%w)ni|seeiBr0no^m@a`4jfesEt z4z$MoY0}0&CLbRg4-zD7`_Rv@@4U4Hj%#cek+yrDz_{c*xHfO*)j!Xp1V$#`vfn6J z=G53YbDa49g>hUw3k3WHwnM>qXn-1hnpaL#vZkj4gKA5Xqy#AzC+31?3zIue2fL2Y z14fS*q%=r;+2HeDg0pM|2rA%67Qd!ilmJ5{z-)Z>hAsj<*z5z+3p9e4xmY>SGTcZ@ zZoQC%m?UU#wq8s&>sYTFy?utf8MBWn+t2P@{Pl|5=%^8KR|)UzxN%ovLmrp_i;=x9 zN9YHl>A(oWP>;>FH2V7mkW5w*|1|zE=rZr0xOfUKN(Se{raQ)C{w@X@fpLAfX=-f)L4aL*^94?r+gO6{XA!kFT{~>u zW>(8SoMG5M_es=&Qxy1S$VoJy&y}mK^A#^6aR|_c3|V|zm5TGdzDrpmE&IeHE5Uv) z_7f>43K7EjSoYpeaCq!D7afoP_Nr(Jgh7 zOdeA-6t+sPQ2GX$^9wpo7~6HC(Bt+3tNNGfptKPBH7~BrG1x1ZlT*>PJ?exTGG1!7 zVPNHH9NqGt)6dg_8(mGrsne(HiEP}}bDnrwlu0t>+e_IuQ7Dv7V)eC=G?M}?xCs0X zgcQZRR+=PQBNR4xTdVCQxU?rID06Hg^tOWN)wyXo())x`Ri!v7X(Cx)!u9bkKqo86Q(L$6U zcbTkld)y!xMm#;VGhUV8aqRK=?|bD&Jd40UKpzN)e#lV)>Ams^VKEo-4bswCCFL9* zIa}E-rwlHmkIMDJfu>(I2wKS~Cl$53^lqV%-ejyPoq8F1si967(+Dc+13qwDrt(-u zNQ?OYR4%@C+l3GKG1eIB<|8sCtT`t57!rJpokfe;em=#>H3iTW^QkTLzw9`Ru4y>>|?tK9p8 zg}Oy?dw-rZyQGFdG8HuR2E`l`yyvv>)t`4efr)6@z#;}#zJjW6F|B~Z0)e)m&RwBJ z9(>w#{F|xrCYnoaOFRm{Ka6)hJoPt|3KA^zFvlbkOYA;fyudOmpqS?Sp(y_)=k1%Y zXg$B>-#hnklJL}7U2nHM_Dea+tN=Kc){D~@QxHuI%3?0~BOP0w_9jxy%y0oOGA|v) zeS@9EQid$TIJn-v93M@hP~->sHl#OitvvU$Q4H=j;LX+8Kj(hE{o~13Z*je)Otr3^a_~^C zeS7>7L!|2rFn$>ig#@f~rNfL}VxLa3M}!QT>%BK&mmji*Q%GpLaL*>B^>11}jef}} ze#aGfUQkluW=o|@_SN6Fm+-zv%x&0Vws);UYGVc6vqKVn(vRV&{$w}7bE;>Jq82#lY9Ozb5`l|C>btlsRbCVU(0g1g zc`gh;Lj^m}N+0u77(E!?GhFs5p|Gw`kmf!dUcM$d=O<659fDC*(8 zw7N@vou?bEGQy3M#X6V_V5nGV?aeVy1+Q^tq^%mS0+f_Jg7665Y1Wo#ffx{L`gHSO zUky3hJL1s6x}J4?3qYFbV_+=5jN&aUFY9g`UHx=#nw%-k@ zABpJKRUQZ>CMQ5so9IhqPCJo8k zjLTF75fl{%EQ5(aVhMPX6>3rjHd55a4AKd+C#_G3OKHPiq!yQ00CY&RUFvDQYD0Sw z&^`KExWOHvhGzSq^y*@=sO}XS28kN))-JDA^qpz}@GoeUe!qO99ES?Qh%4&D*&@a zPC27d$P?+G;>TXntS;eXEKc3}IjGiL;7`gwV?uUQ_G({BR4r6*IA``j5o`IKuJNI6 zTm33);o=Mh%P23M>(@Zpv^Xt25m}C50nHIqWh2JA!+hkbEjLZ zhOj%NEi%|c0f((eib)&tvNGdR%e5>G+2iZI2SH>DqnQKV)ha1G6{o^>*B5MnS1^M# zno1Nne>ueDx%CIl3bI--(}Cx(foMr~@?`sUv4UtfHxJtWy5?#%QzRf$eGCkCMA7~{ zNba-ckJmb1Sa`ewYV!kc!~)o!yHv;jNdHna+VoC;KXM1mQ-QtUAgY;-b3^w3ilD16 z#wH^;+vLO!dc$m^u^AfPg_h${{*=Cq6Nq@z0o4T65rRTW+VC)rPGFZ@*DK%P67-Ok zw&W}7b7YXoo@Mj_t8Y!8%9{KCXmU2hp?T=O+v^gpoImlCb#$u^z=LgtvU>CsFPO#O zP)-8r@UA%y+{bXg9A9@{M*+WzH`$;U=U&7-K(U+PgWG;_h`Vr)6NH_MTVQ6?-DsTk z6UI$?KUahYy6zk0NL)w04v5nvKSf3Py%Br0f1r1zPaBraRT1FR8@#*(Wb7h z;tW5C7U{3W2rP>v*$Kkj(;~7zV6u*h~#^m8k%b-l5^feX338-qILv zwI9Oib)sP+{z?|;A{fX?9N=ZUg!=^q(TUt$|1rpkx3KcU=@IKkC%*k%Ssp<^gpVBU zFF(<;Hg&!!5W)H`U0od!K!`_zMY1^LS)|6h018o(7}WFiCDs(e-yiyLpL#7kfI-!0l;X_K6XRA6evi;y8NKBTT|+ z9MZB}>$o4$XTX_k)H(SV`&{{%>GIhjUrf_~xWiAKux`S}I(PS!0N4HoLy)L5sVIo~ zv@#Z}=(ECV)Ih$u8cO9bTM!*e(RnK7o-@y*WXg3S4=SiX5%_s308RefHN-s20ca`r zxp6pCc!ljUM^B~93}^da3mWwCXMzG5gN8Xq-r7g?#URH0l`^$@XduV(1Q2h}nruyA zO)n}7BXVY4CN@UP10X>H|F6$ z4%3aUHfkByyb%u9JE*VimuX1&P-&wh?a8?(|5GyITyxl!r9<|hs(iJ)hOMzm#`5X!*f>RJBQ(wQ=y|rM>_i$WcUmpf*f~TM^?lHc#@_2*Iv$A;E#)M#_vJ#n zEug}aSiys+jvVG}7*$)K1rA3G zb{{GBdu0=`OK2m$?A)Nkxjx1a#1T>BeG+yXEBTf8WEkEfN?-G>PYzQ#IA4SrPGT=+K$CltMzP)FgD+GStKxw1{7{4d=dpU8RV(Fugmez1z;!!acD2H6UbG(sl( z%3Nlxu{YUL?V48p-2AunY35F61UWhUHl3P%JxA9EMp)3Kmya5|==}pe=DiRtBH32j z3BUNWQ!WVv2mfpRr-$R|Q2~#g%aPV9`6spfvZIDLvJaIuqvLze8GG~Q6;7m!lzdG! zh&enutkh8jv-1DA;5f3}#K`*($4J>1o#eR4bD`P4U<}FrGG4-3H9c*2zjPJRGppi+ zfb?W?$pT!7lkUDQ06ZtAZ$;^f7#NnOD~!&(!dO@eOY!@{V+$)k;uv2`>9xCndXF=n zrJ$6{iHP`or!KDLNCeRsc#dDnEf~gzoy}i(Le`$(hRVCIz>zATw7u5QiR)h~Y0Wrp zvUWQ=@vPj0BE7a`ek=n))0`HFVC_n#_as4vyL)jaudUuXqqkyXWe}RD);#7vM{chL z&|b>nhXWB3Te@M60m;=5_PDpti^Tus`l~WSFRlysEsl;Y@tnFqJmq-C-L1ZuknTWW zb91D1&WJ7Hk20hg1@B@|X5Nsa?2S4J?R$^=Z_sJ~`xg4_LbNBOiN6u4T+D19TNdiQ z{=o(%sK(3lmREr1=GM`v@(VSLlrOxnIf_O!XYsl=g0K0ae(&jOvslL}_%W`*E_(|K z;=v+ADL!O-Y9$dhrT>?SNIba`x1{f1LD0bG8;Zchyj}`o#-4ir{C{L~G?U}LsPusa zxvN$05dRof1k2i-J^kfE>n44}?sSw=wr}=iROG!T{x|TDl=M>=7>8S%Az*b{<8oS^ zJM`RWZQvb5E39_&BQd5el*qsP6Cu#`j)>?h@u$&}I6;9#^Qmr{sZ+*hL1Tr+BE zVRC)zPCN9C8s=x;io6iW>kuMJ;77wNUGptl(-DVq5dGq`V&g%yB-u63?!Rn2mZxOj zF_d<|Wm%JuEezehDldjhbre#-D^0G0K1uSZ!I0p-y0KUkS3O>7*)HLYz}&h{Ewas4 zQG`}EU=>bvn3zp&g$ zqhZKW9z~_XmkOkinVePdUr0RooHSj%HyuU!qt8~?v~D*z+ohmB%e8CM=K{>rAzI)( z4rL~DQ6rh~2S(u4|8N~{#*pyD{v(CPFx_%Gy03V#9&j9u(O%M3)t^2K9n>p&Ygk_0 zhll}(9G$gJobsSk((zr%ez;+7<{W4bSBb~^@I9?IZfF5wUOGMpvaN|elS&3ZI4N&G z#rW%&7X#4XB~IHCX-6Ep0_=uc=R3RpL?lqWW-1=+o^h?#i zK)-QJzbj%Nscd3ki`dp!SnX{-_9fR#C((%ydqz#l2x098wn-f0Q6>QNE z977bgNM|qOXq`d)KnLPvUnI{@XV2ceJvIq~qLjctvCu~RET7KR1$jQAArYvG0K7R#dG`!iFGPELVG=N-Yn)O-d2o_R&xN1UZQ%cV`eSg$uLt_Pb#r$qG(5eRSbS$g zXSgE`1jg2Zs?OVdEs3vkq2yJ^Mz6UC_Q=HS5*urEX$1~WbZX_MXqEuwUQR3h3jZ@Z zkuD!`Yh$n;fzj^bM!Tv$P32w3oHdR0-V?{NBga29WiOO@4^Oqw!r5(%=-#ZBl?77D zx^gCR&A(=k6$@q%3!nyXT)CDHs^p>(T!6SpKz`(#`&+B5w;ExxCL1e@0V7IQsErRuNcvJXF7?3rO zXn(%@UFmacu8+yiB6`OTS<>Sy44zlX)Cdh^sWuTnGi?%^hT957KTzSV^Fo9U1-_B_ zHm7%IESLrXa((i+dqLV452z8Ya!kL7%d8r3>32&;c6GF`IFg^r-mPg^Nb0V6u0rKV);D#ehNv13SgY zzr_|YU~@Z24Ex5#wQU@Ji$Jw(%GC&LoL8n;ZA*$#b76U>(`wI6%%bT&6CF5 z`{8?XcUm%TUOi`&G?`msQ$cB?I)RbXWLaJauswlkmOwOqo?HM9Pvh+u6;Re{+BrBe z?euny;sZKyDWcKgz!V^Rm9Y}diVoku&8AI#b8T$RPFrsBSayr-X=dI}Hv}C5pS!Ka z>|FsRBaZc!VDz6t44{*Z_6u2o1#MMvqmJD0YqWC>DU#>I%~O<iy8bms`J>YjgW z%UzH8an|wZL!#IQ#ENVF{~m43D6JD?9*ra%N9hS^0XLxm+!&rB1RPg94(34X6ku)g zy$%e$ID(o6+0Ir30Cgo0HVd5SV2uMFEy$o>E6y?vNg0xE8U8hL^#cAmzIe_LNZDum zb~>2x+q7ikxe1m{v))n%=AW=u(L@DkA=I}=`4|m|eNHv-*l& zS~Imsh|pvzi)qSA)jXz?yunmkA6VRwYWtr$x$9ZMPz^ATle89ozD4+Hc{Y#E@t!Ht zfgP6s{*64`iss6a7k$GG}%)1 zxbJ)mP)kstTX%c#5oiG(8pBhXXoSxL!|FRMuE;QQlgFsZC~6=s{5}YU$b55^a{%|` z4CXK);dy#9uyNHIt3e6^m$n*7xm$FhXwddXL8L@anIbs2wDY~R zKWT+MEUtJ*yENWCAj8vp0Ia3IFI+*xd-av!&4a0p*W1}sAsLP5T5xh}oA=AyFmMLD zlDXc+PNrJF8=U@Wun4J1Da3Nh%=UbR=nRLDEK-ue`s|*EN%{|;VwE1;1f&qy(evS^ z3Jwo(7M{lY)HM}ls|>k7sD#>d9575UaScJeu#|F_`W+Fwtg_!!c_Z#X@vS@9bQ@Z_ zEK7C;+0#u6a7bdAX+A(qryn6Vc|_iJg*a0`yq7(}eJ_CUQ`Nh{|5?GmenXW17~7zf zn1D}{iyz${l=V(HUnH_42*}#nCXH_0glu|Tm@%62TbIiBwnUOH(%@|Xe+<43r0jxB zNF5>_4nCJ`B{(87v8|vHnMfulm#&XC}ryW*z_TUM}O)xF7b#qPU#f7=B5PH z6{@)03rFQd%QSlL5JP9x#FZGTgOF~PI}q?14HX=J>_XyvknL3ge$;z93kse4%Lr+^ z0!4Du$+qYD!rF(|pm$=sG#0eqNOa9&zA!{?cg{7f>sM&GmZYSNo~HivZ2G_+tjjcB z?RAX3Ak?w?l5tuK0tRnpVqv3U@vC zo04vqx47UT{gRCPc>tCfEF8kxh?pr}(H)%)?-Ag;ca;;;Uh>h9`EGEGm6Ptio?m>D z6N3TkaD$jF?0cY|YZkjM2m`jnH@Bi9^3gr;9pGZDVgAi8?U1c|hR4bzIk@ZY+O|xP z9JH`*Gkf{3ehW(dvQvFH03@$)O?@k@mJ|lWIRkGNdJ+kkR=kYbXoVC>vp94{U0(Q-gbe3~70TSsHz*9(_8+G#z$1N^bQRL;nS-b93 zA?6T`KVK`Y0c6v?EIyp=t*sugt)7b-mP>aeabQwAVzKlw9RdyIV(7OZSAGLM2pGGH zkPoqUh5V4`@)#3FGa{t9EMTgfukX4N?skw^yZQ&V*H=*@6MF;!_^N0|W0&H#$;we&Sk%ar1o z3946Jt8S;s1)UlX*9l7i&v{d>sg0r7FPu{(*RE72? z)f!i$-!5A0plM$$4PP_gkB4vH9!uvy`yt*yWiZd`d)pIot4w7-0V=_>?@qPq*d`_= z4om)Ds?m^<%X=~-iG$dQ>Q%WwmMJ%`*fCB*O##>`50T$bbO`L^D-1T9^5Vgz+}r`Q zo$c_FvzA?6gan^Q$iF5n@qEIf7C5KhfJD*K5l@{V0Bkl`^FZyB!Bw|*UDe8o=uDKb zES$i5Fh@u=$nCLmg5Vesq5DdWItc-?ol_ zutS@}A8N)W_Ic{;R2}cRou)cV)5b4RU;z+wCDmYdWn*`-WR8tAOLx49)O#Lcnr10p z&Ob$Iv${$!laky~e8XV^>X>F^lcg_(vw4;|d7S9288g#3CFz^9EPqd5G6#eROn$mQ zQ&?<;WEi?y`~gNhg`r(w!%HO->IRl=5|T6|lsT(|v^)N^8MES{G*1VNa%v4LQOYntOJXNwMC0#zeOU!5j=sWO_rlD?{(!1qwJXQ;B=zf{>dz^zNaWB*o z?|~88%S{OmfC&#L5xo z(4BHUJy*OwrYo5W`T{msH|_rv)SKmd7m@i1`~2J?X_sTSTo-~@>L0^oyP=l@Oa&<7 z*LEhwAmCm7tndaeG84!sf;J4R9tH9SgsdW@O>b+0#9e2yA&IfYD$qX4RKOPOoYw0( zom}R1sm-4Wr{w6vSG4Ev^eDDgi6y;aNUyh#!OpmLe5B?I2E2iAH>wk_OeBQ?oBgS} z&jdJy_!Eq^F}$cTjeVU3D#f{n{>WeqiZ*4SUoq`=9;o(0(@hnDRzli=fWFcd3Ny6X zP>NGDI8bie`|kUyh+q*mru0_GW?Ip@@BtCCL(BmCAFj7$(#NFKnef(iy|)qE7|(0` ziYiT@Rk7gDR*b7|1q1BGAG;R>Lj%KUDjJ!X#qdn1i&gV)=|U6R7X%u|GUEQv`5(sQ z-yUeOcT1JREEN977lE7p#2O2^<*H>P{*uAg_1bhOae_wUNqV`m*EcrA+*HJ*0{F@-a1()6@ zx}6!I`In!E+n|6z6V}n6|F+({+JkNJt?oK;P1;t~!Vnjdwbea9u&PkZluTGR!r1av(PG|5-3WZwSBQu* zGQryyTDM^^wk4BiHBfM139faUz8k%sXe|dZk$NR-kAAkKbhhLGgOh~P-m1aRdHA9e zR^w!R&i&k>DD5@2T%(ih<=PVSOY~TCBD?01J^1ix(<6WFJKZ}t1*|}sq+Rm)p9%fO z6rRd)T|HVHAElOyV4VJOLmfOstByB``=sU<=!O(NDOUJn3%?X^AmvnWohIb`j*|+$ z985QN%VVF_>(M4DMV_5qI(WlPmLAv)W2ca6QGdv&dZZ?`+m)4-s&P@EZ(Lq+ZljNAo%p z1V^N%Icws7Fu~kR8V33a(7FKEX5Jm-Dt>>qngnBe2rSWVwf72N7~t=SR1s^n3e;TU zkc}&J-lYbYDWhGn>*XEv?tJ>$d}KsKW6u5`C;0H|^5+^7dl1tbb`XemVp)rev(&DO&=}66L7x82f=$! z>g1`bc*68UIydo5*TiwE<_OOM(1c7#`^UCNC*E{n^;kk=KCCVvOr|8&gh^A zu_HJC7m+Y7Q6lBHZ#}I#$Vep(cQa?v^hyg9xI;Z%Mk$NaRu zo`aBUDqIoAEd8g%s%Jc4e>e~+om=Io8@weDNk9V=bisGgDr4b+l>S)G9mbvBYu&&Y zYFkb*XVYzc*0c^h%$ZgoA^+niFeWPk;*|htIi5SBUfz>PDqV zahNkjdxHCDhz!2vnpZQs@p>j}FT66zqZ*F$un65?E-PMrf{yQWF1}o-HSfMFZ&F-a zLW3VCmzxdICfuKuHnjzGB@pxHpsQnSdLasS66_D+t7mM}yK2Knhc~k4ym-@3%@F&P*LMAzS^u-aV9<7q;L%JgZ zKa4yIh=Mg>38fF3>?%7cq|^KSv!?c7+Xq(_MJRyW3Z4cl>L;o4RWib4RMtkG5@1~T^vr18fxz404CAspbOC<2x1ZUn69oAonYr-GHYbMpWHrK~ z>S|4p$wU$6>vQ_vlyQ2xu^A%vx~Rc%0UZ*yQ4MKYdz^7F%gPhnh6 z>@FxyP0^2+f!wr`ot8*)2;V1j-$^v2z+pb@!p*LvQ@)i=(XXWEfhzM z;TwB6--0j*GD6ZpQQEhg(58XtgU2o0VeZA~!2OR@Bq1Z8hEQV9&Fc#>@x|d4`SHf20*K||V46OfCU*eg}03N2a?S7$f@iz({ zP}VAG|>kWr5SR0y{9q|sUL(&<^l0;55|MI}? z@e%ugquCri{b7Lzj>H}JkakCgWRvz)qI0lP3aEl-BkQ?v-o>akdhWB;PiA|R71;;+ zDJM$$iV=1PpTLCl0X?&g{d^rHMWhvN+v8vM-Jd;Ke-&ZKASR#zRyTr3-9r+ab07`k zbj8=Wj8Opl7b)7FV8Ze6c>nFp?DoI5j1E($JX%x(@dD`$A@)$WXWzfv@fu&-SB{@q z=Why-@|~Fz1&$v45JR5jMa&~^b0s&Kc;>d8N}=TykHW~t>hr8ossS*Y!>q$4N$F$B zd+CEknx(~}AJ@ldPer2lMJe&VeFPb22B48rQ7D5{cd)RH+;Ij~G=(5gAU->(u zBe^{@a12geEuBc!ov=f+GCZAj{0oBozA=jG{HE+oD&H=~J~xy)$D`B>UoD>V>qa2< za3(%bHmaHjYZ+&C&)?f{Tr@W z_hyg%^OdyeQ5iTE0f3w%R+fWZeht5;8?fPmXh`$e-T{&Ji9*x1)_)qv1frlVJgme@3=5y$%eQ*XG>DNs=!kNp{2=0%FdV zWTeeHK5o5FRVnhRfNkw`O7%vN&;fr9(^Dh)eOJFzI=t(nBh%)IS~^R}?Oe%;Wx%@< zg@J%|ZvdRNnMJ3%GOc(+5Kg`ubz=9;hJFw!yT;2;$Ak8W!E(@*o`5hDvh7ptqimw9 z{W=KB7D=!1BP;M5dne``us3wNZ>7)19zs}+%}_6FW+)rP77C@=2|HnXbN^A2B_?G@#|7!|; zUoXf9oX$cftulRvbHr{DcH%fq@%IBaG!0B7#kr8~4$vU+Pu_M@IC>@kl=u-_B@>yF zcyrJ81_U1KlRNoLg-XxO!vxhO9>`i*!nvIImY@32qG^k?y-a^=8|X*KgC)R z%#ak}@LLUUdsi;?JCI^@N#RWgd-Ek&DR?9H*(p6v_oRfV7`vm+qWoy?1s zAs>#%@}43D;qA<6CEC%x#&pr^OcMhC$n)=ixg7Q9vL&3$Awbc4iRy15-%8d-4#0yc zc5h^S+SoyT(=U=hI_NrFMLUA)@{cEsL0WbuoalWcCcPTI7LqTnR~$#5>9Bhl-(E&B zSu>oQc)P?Abm5F5KWW_wc2fJ5FxM~t-m5|qmnPQFX~+Iq_l1&?uSulX8sE=g@dmh! z*fJ^li5Iyc{4~!D$ z3OjSBlokmrdGKzB-I#qbVwZ>J?=y@jSgDsq|4{CY|JR-RovFG{xhdzXq!GogY+o8& zey8-yxMkwg97l+C=f9f-{5xp{2V(-h^U@w0AFw_{)yu*vV+YAEBG1Gz{t2gH7%%6q zUydk3#yOzCBop=ezX`$t4Y|wgytNZRu3$YUM98-f#s<2;$BWb2uQKU$k} z%t+D*5Jn(PcAVhvD0brh{bx|)USdD{{({QP_~q7cv9xIE!WxbXl* z{omzbse{LOuh@5xMYHxks|t|Fxigo+rDZR6_*?AXS}t=fg)9oiEA&h?La zu~!dnt=~A@YKUNO=>RVT(D9-CX1!XtZY|OK9gegsNJ(|Ox0_P%l>#%1F8Nywh_%l( z{^I0(wx6^{y8>zzamV!$b&bc~B5%E7E;L}({yeyVdcn~GarF8-^C1tw*H+MjCb$j8 z+J`w4_n7s;gH5JJZeaj#1rzEH>;SkMfk}x&-~mPFKa)bi4840Ih)6i}Y2jYiH<)cFkW?8>c!=;#Qqq7=!C_D>4NcSv`UufcmDg zyW7uT#f+0w7KcU(mYb@4X_RK1nMIaj`ru3`$E2_S9$MJ|TAVQj!ph~In;@IFAMRA} zdiXE?YW*Otao#0~`?~hV50mBhxtep%4qZ5IiJVtdtLt&9*4zf=2V$GI`7ozBu zztrnm=6PGafGkH)t?I7XQD6!k#&+IC7oybkV@7~;U^eX=0B;7pn?%2_L*=r9-l-L7 ze-y+WYX`|%wd(g|6qaf|YKTwZxjhC~m$x^erSE}aZsyNNSMEYYz!u2x4oS|}L}qhG zG(o9K>anq(MASmiu&m(@p=XG)L|ScF4s)F@qcmF+=FjioIh*?1E!lGrCBqmBcYy}w z{$^c!5il6yhGSB1v|I>Og@&|(7rd1W{`K-9-bzb&qwPccFi_PzpURb2AAPm8*`tjT zI5l!qiv*T?!Klg8;An{|0GcI0VzAr|jJ3HrID1sVG(emdJGz&Grp|z}I@G?=_gUH> zk#eGos{wdFja&Tk>6CqABV8gA@_=_hr0o}w8_l5^Gj;mt+Yqj-cR7ESF;NabOL{GC zig?%i+&Hh6+jP;-K|E6G(zV3I2m1x*p{M5lNAjH)I2~yE6sPd10#($o|9F4-9-kRQ7xrK% z0{PkizhWKzwCCRkX{PMQ>u|VwuY-yqN`l|m@^~XvdovQp?6Wv`7(=~E77hV5+A)D} zV;#;Y+M-U|J@70oeR=Kqn(zc18ek8;TXro(CM>Z8(nC)K93}f*(9$FWjdxwp;aFti zq(*KUqiE7T_%9Dolid>GPEUvW1~l@wmRl(73g6ce=c0h-Td;jS%})bAG9fpFIE4x+ z=wj>cjFY4Se@Bh4nmwM@`;vrNu`*3;!yiU-kR#Nlb?RLFsEN{-MkbvG2T~wPQ?h0-x=z&rgsd(zX_4$)w3q=VJN6x-#)=U(#Gu0E&#a>SMS8QhW44*$b*9p7Q|6vT2Y7ukav zc@mr>A4h94EAqQUAS|1FUO7nLbuHqDhq_J`Oxz{XvrigC3+YvJqQNaOdG`tA(` zH6TuSvaV`nd-4{ILHJKjT-R#3pEyW|&s2z?=E_S58avJX;7mjTVLg2cGO~+`VqTZN z%@x_n+Lugf06J9rr7Jz`y)#p(8lc<>w7&#?+1FuzEBR7aH-S4uSa$Loz??gWdrEPD z_o8TaIgeC@pAw=1?GCXl⁣6E*&hVjn}q+ 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 z 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

3fn?*t#uPJ79i_rfe0$A1eR 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