From f0ed84611b9043653d4f8e84cfbeef8b5eb02746 Mon Sep 17 00:00:00 2001 From: Nitin Garg Date: Mon, 6 Apr 2026 11:45:25 +0000 Subject: [PATCH 1/4] fix: Correct TypeError in database.py already_exists() calls The insert_folder and rename_folder methods were incorrectly passing a custom string message to testbench.error.already_exists(), which only accepts a single 'context' argument. This caused the testbench to crash with a TypeError instead of returning a gRPC ALREADY_EXISTS status. Also fixes a NoneType error in GetStorageLayout during mocked unit tests by ensuring a default test bucket is initialized in setUp(). --- testbench/database.py | 9 +++------ tests/test_storage_control_stall.py | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/testbench/database.py b/testbench/database.py index f47f9081..cd884df2 100644 --- a/testbench/database.py +++ b/testbench/database.py @@ -804,9 +804,7 @@ def insert_folder(self, folder_name, folder, context): """Insert a folder into the database.""" with self._folders_lock: if folder_name in self._folders: - testbench.error.already_exists( - "Folder %s already exists" % folder_name, context - ) + testbench.error.already_exists(context) self._folders[folder_name] = folder return folder @@ -845,10 +843,9 @@ def rename_folder(self, src_folder_name, dst_folder_name, context): if src_folder_name not in self._folders: testbench.error.notfound("Source folder %s" % src_folder_name, context) if dst_folder_name in self._folders: - testbench.error.already_exists( - "Destination folder %s already exists" % dst_folder_name, context - ) + testbench.error.already_exists(context) folder = self._folders[src_folder_name] del self._folders[src_folder_name] + folder.name = dst_folder_name self._folders[dst_folder_name] = folder return folder diff --git a/tests/test_storage_control_stall.py b/tests/test_storage_control_stall.py index 9a5d5210..9b10c31b 100644 --- a/tests/test_storage_control_stall.py +++ b/tests/test_storage_control_stall.py @@ -129,7 +129,7 @@ def test_no_stall_behaviors(self): ), verify_func=lambda self, res: self.assertEqual( res.name, - "projects/_/buckets/test-bucket/folders/rename-src-no-stall", + "projects/_/buckets/test-bucket/folders/rename-dst-no-stall", ), ), ApiTestCase( @@ -232,7 +232,7 @@ def test_stall_behaviors(self): ), verify_func=lambda self, res: self.assertEqual( res.name, - "projects/_/buckets/test-bucket/folders/rename-src-stall-1s", + "projects/_/buckets/test-bucket/folders/rename-dst-stall-1s", ), ), ApiTestCase( From 911389d87a4e4f58cc6e102a6a086478cc8dff81 Mon Sep 17 00:00:00 2001 From: Nitin Garg Date: Tue, 7 Apr 2026 04:48:34 +0000 Subject: [PATCH 2/4] feat: Return LRO for RenameFolder and support longrunning protos - Updated `update-protos.sh` to fetch `google/longrunning/operations.proto` - Regenerated Python protobuf bindings - Updated `grpc_server.py`'s `RenameFolder` to pack the resulting `Folder` into a `google.longrunning.Operation` to match production API behavior and resolve mismatched message type errors. - Added and updated comprehensive unit tests in `test_storage_control_stall.py` to verify LRO extraction. --- google/longrunning/operations_pb2.py | 87 ++++++ google/longrunning/operations_pb2_grpc.py | 340 ++++++++++++++++++++++ google/storage/v2/storage_pb2.py | 238 +++++++-------- testbench/grpc_server.py | 25 +- tests/test_storage_control_stall.py | 20 +- update-protos.sh | 1 + 6 files changed, 582 insertions(+), 129 deletions(-) create mode 100644 google/longrunning/operations_pb2.py create mode 100644 google/longrunning/operations_pb2_grpc.py diff --git a/google/longrunning/operations_pb2.py b/google/longrunning/operations_pb2.py new file mode 100644 index 00000000..e456ec20 --- /dev/null +++ b/google/longrunning/operations_pb2.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +# 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. + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: google/longrunning/operations.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'google/longrunning/operations.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 +from google.api import client_pb2 as google_dot_api_dot_client__pb2 +from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#google/longrunning/operations.proto\x12\x12google.longrunning\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/protobuf/any.proto\x1a google/protobuf/descriptor.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x17google/rpc/status.proto\"\xa8\x01\n\tOperation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12&\n\x08metadata\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12#\n\x05\x65rror\x18\x04 \x01(\x0b\x32\x12.google.rpc.StatusH\x00\x12(\n\x08response\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x42\x08\n\x06result\"#\n\x13GetOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"|\n\x15ListOperationsRequest\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x1e\n\x16return_partial_success\x18\x05 \x01(\x08\"~\n\x16ListOperationsResponse\x12\x31\n\noperations\x18\x01 \x03(\x0b\x32\x1d.google.longrunning.Operation\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x18\n\x0bunreachable\x18\x03 \x03(\tB\x03\xe0\x41\x06\"&\n\x16\x43\x61ncelOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"&\n\x16\x44\x65leteOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"P\n\x14WaitOperationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\x07timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"=\n\rOperationInfo\x12\x15\n\rresponse_type\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t2\xaa\x05\n\nOperations\x12\x94\x01\n\x0eListOperations\x12).google.longrunning.ListOperationsRequest\x1a*.google.longrunning.ListOperationsResponse\"+\xda\x41\x0bname,filter\x82\xd3\xe4\x93\x02\x17\x12\x15/v1/{name=operations}\x12\x7f\n\x0cGetOperation\x12\'.google.longrunning.GetOperationRequest\x1a\x1d.google.longrunning.Operation\"\'\xda\x41\x04name\x82\xd3\xe4\x93\x02\x1a\x12\x18/v1/{name=operations/**}\x12~\n\x0f\x44\x65leteOperation\x12*.google.longrunning.DeleteOperationRequest\x1a\x16.google.protobuf.Empty\"\'\xda\x41\x04name\x82\xd3\xe4\x93\x02\x1a*\x18/v1/{name=operations/**}\x12\x88\x01\n\x0f\x43\x61ncelOperation\x12*.google.longrunning.CancelOperationRequest\x1a\x16.google.protobuf.Empty\"1\xda\x41\x04name\x82\xd3\xe4\x93\x02$\"\x1f/v1/{name=operations/**}:cancel:\x01*\x12Z\n\rWaitOperation\x12(.google.longrunning.WaitOperationRequest\x1a\x1d.google.longrunning.Operation\"\x00\x1a\x1d\xca\x41\x1alongrunning.googleapis.com:Z\n\x0eoperation_info\x12\x1e.google.protobuf.MethodOptions\x18\x99\x08 \x01(\x0b\x32!.google.longrunning.OperationInfoB\xa2\x01\n\x16\x63om.google.longrunningB\x0fOperationsProtoP\x01ZCcloud.google.com/go/longrunning/autogen/longrunningpb;longrunningpb\xa2\x02\x05GLRUN\xaa\x02\x12Google.LongRunning\xca\x02\x12Google\\LongRunningb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.longrunning.operations_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\026com.google.longrunningB\017OperationsProtoP\001ZCcloud.google.com/go/longrunning/autogen/longrunningpb;longrunningpb\242\002\005GLRUN\252\002\022Google.LongRunning\312\002\022Google\\LongRunning' + _globals['_LISTOPERATIONSRESPONSE'].fields_by_name['unreachable']._loaded_options = None + _globals['_LISTOPERATIONSRESPONSE'].fields_by_name['unreachable']._serialized_options = b'\340A\006' + _globals['_OPERATIONS']._loaded_options = None + _globals['_OPERATIONS']._serialized_options = b'\312A\032longrunning.googleapis.com' + _globals['_OPERATIONS'].methods_by_name['ListOperations']._loaded_options = None + _globals['_OPERATIONS'].methods_by_name['ListOperations']._serialized_options = b'\332A\013name,filter\202\323\344\223\002\027\022\025/v1/{name=operations}' + _globals['_OPERATIONS'].methods_by_name['GetOperation']._loaded_options = None + _globals['_OPERATIONS'].methods_by_name['GetOperation']._serialized_options = b'\332A\004name\202\323\344\223\002\032\022\030/v1/{name=operations/**}' + _globals['_OPERATIONS'].methods_by_name['DeleteOperation']._loaded_options = None + _globals['_OPERATIONS'].methods_by_name['DeleteOperation']._serialized_options = b'\332A\004name\202\323\344\223\002\032*\030/v1/{name=operations/**}' + _globals['_OPERATIONS'].methods_by_name['CancelOperation']._loaded_options = None + _globals['_OPERATIONS'].methods_by_name['CancelOperation']._serialized_options = b'\332A\004name\202\323\344\223\002$\"\037/v1/{name=operations/**}:cancel:\001*' + _globals['_OPERATION']._serialized_start=295 + _globals['_OPERATION']._serialized_end=463 + _globals['_GETOPERATIONREQUEST']._serialized_start=465 + _globals['_GETOPERATIONREQUEST']._serialized_end=500 + _globals['_LISTOPERATIONSREQUEST']._serialized_start=502 + _globals['_LISTOPERATIONSREQUEST']._serialized_end=626 + _globals['_LISTOPERATIONSRESPONSE']._serialized_start=628 + _globals['_LISTOPERATIONSRESPONSE']._serialized_end=754 + _globals['_CANCELOPERATIONREQUEST']._serialized_start=756 + _globals['_CANCELOPERATIONREQUEST']._serialized_end=794 + _globals['_DELETEOPERATIONREQUEST']._serialized_start=796 + _globals['_DELETEOPERATIONREQUEST']._serialized_end=834 + _globals['_WAITOPERATIONREQUEST']._serialized_start=836 + _globals['_WAITOPERATIONREQUEST']._serialized_end=916 + _globals['_OPERATIONINFO']._serialized_start=918 + _globals['_OPERATIONINFO']._serialized_end=979 + _globals['_OPERATIONS']._serialized_start=982 + _globals['_OPERATIONS']._serialized_end=1664 +# @@protoc_insertion_point(module_scope) diff --git a/google/longrunning/operations_pb2_grpc.py b/google/longrunning/operations_pb2_grpc.py new file mode 100644 index 00000000..d4bfabae --- /dev/null +++ b/google/longrunning/operations_pb2_grpc.py @@ -0,0 +1,340 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +# 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. + +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from google.longrunning import operations_pb2 as google_dot_longrunning_dot_operations__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 + +GRPC_GENERATED_VERSION = '1.70.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in google/longrunning/operations_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class OperationsStub(object): + """Manages long-running operations with an API service. + + When an API method normally takes long time to complete, it can be designed + to return [Operation][google.longrunning.Operation] to the client, and the + client can use this interface to receive the real response asynchronously by + polling the operation resource, or pass the operation resource to another API + (such as Pub/Sub API) to receive the response. Any API service that returns + long-running operations should implement the `Operations` interface so + developers can have a consistent client experience. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.ListOperations = channel.unary_unary( + '/google.longrunning.Operations/ListOperations', + request_serializer=google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.SerializeToString, + response_deserializer=google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.FromString, + _registered_method=True) + self.GetOperation = channel.unary_unary( + '/google.longrunning.Operations/GetOperation', + request_serializer=google_dot_longrunning_dot_operations__pb2.GetOperationRequest.SerializeToString, + response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString, + _registered_method=True) + self.DeleteOperation = channel.unary_unary( + '/google.longrunning.Operations/DeleteOperation', + request_serializer=google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.SerializeToString, + response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, + _registered_method=True) + self.CancelOperation = channel.unary_unary( + '/google.longrunning.Operations/CancelOperation', + request_serializer=google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.SerializeToString, + response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, + _registered_method=True) + self.WaitOperation = channel.unary_unary( + '/google.longrunning.Operations/WaitOperation', + request_serializer=google_dot_longrunning_dot_operations__pb2.WaitOperationRequest.SerializeToString, + response_deserializer=google_dot_longrunning_dot_operations__pb2.Operation.FromString, + _registered_method=True) + + +class OperationsServicer(object): + """Manages long-running operations with an API service. + + When an API method normally takes long time to complete, it can be designed + to return [Operation][google.longrunning.Operation] to the client, and the + client can use this interface to receive the real response asynchronously by + polling the operation resource, or pass the operation resource to another API + (such as Pub/Sub API) to receive the response. Any API service that returns + long-running operations should implement the `Operations` interface so + developers can have a consistent client experience. + """ + + def ListOperations(self, request, context): + """Lists operations that match the specified filter in the request. If the + server doesn't support this method, it returns `UNIMPLEMENTED`. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetOperation(self, request, context): + """Gets the latest state of a long-running operation. Clients can use this + method to poll the operation result at intervals as recommended by the API + service. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteOperation(self, request, context): + """Deletes a long-running operation. This method indicates that the client is + no longer interested in the operation result. It does not cancel the + operation. If the server doesn't support this method, it returns + `google.rpc.Code.UNIMPLEMENTED`. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CancelOperation(self, request, context): + """Starts asynchronous cancellation on a long-running operation. The server + makes a best effort to cancel the operation, but success is not + guaranteed. If the server doesn't support this method, it returns + `google.rpc.Code.UNIMPLEMENTED`. Clients can use + [Operations.GetOperation][google.longrunning.Operations.GetOperation] or + other methods to check whether the cancellation succeeded or whether the + operation completed despite cancellation. On successful cancellation, + the operation is not deleted; instead, it becomes an operation with + an [Operation.error][google.longrunning.Operation.error] value with a + [google.rpc.Status.code][google.rpc.Status.code] of `1`, corresponding to + `Code.CANCELLED`. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WaitOperation(self, request, context): + """Waits until the specified long-running operation is done or reaches at most + a specified timeout, returning the latest state. If the operation is + already done, the latest state is immediately returned. If the timeout + specified is greater than the default HTTP/RPC timeout, the HTTP/RPC + timeout is used. If the server does not support this method, it returns + `google.rpc.Code.UNIMPLEMENTED`. + Note that this method is on a best-effort basis. It may return the latest + state before the specified timeout (including immediately), meaning even an + immediate response is no guarantee that the operation is done. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_OperationsServicer_to_server(servicer, server): + rpc_method_handlers = { + 'ListOperations': grpc.unary_unary_rpc_method_handler( + servicer.ListOperations, + request_deserializer=google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.FromString, + response_serializer=google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.SerializeToString, + ), + 'GetOperation': grpc.unary_unary_rpc_method_handler( + servicer.GetOperation, + request_deserializer=google_dot_longrunning_dot_operations__pb2.GetOperationRequest.FromString, + response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString, + ), + 'DeleteOperation': grpc.unary_unary_rpc_method_handler( + servicer.DeleteOperation, + request_deserializer=google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.FromString, + response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + ), + 'CancelOperation': grpc.unary_unary_rpc_method_handler( + servicer.CancelOperation, + request_deserializer=google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.FromString, + response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + ), + 'WaitOperation': grpc.unary_unary_rpc_method_handler( + servicer.WaitOperation, + request_deserializer=google_dot_longrunning_dot_operations__pb2.WaitOperationRequest.FromString, + response_serializer=google_dot_longrunning_dot_operations__pb2.Operation.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'google.longrunning.Operations', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('google.longrunning.Operations', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class Operations(object): + """Manages long-running operations with an API service. + + When an API method normally takes long time to complete, it can be designed + to return [Operation][google.longrunning.Operation] to the client, and the + client can use this interface to receive the real response asynchronously by + polling the operation resource, or pass the operation resource to another API + (such as Pub/Sub API) to receive the response. Any API service that returns + long-running operations should implement the `Operations` interface so + developers can have a consistent client experience. + """ + + @staticmethod + def ListOperations(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/google.longrunning.Operations/ListOperations', + google_dot_longrunning_dot_operations__pb2.ListOperationsRequest.SerializeToString, + google_dot_longrunning_dot_operations__pb2.ListOperationsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetOperation(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/google.longrunning.Operations/GetOperation', + google_dot_longrunning_dot_operations__pb2.GetOperationRequest.SerializeToString, + google_dot_longrunning_dot_operations__pb2.Operation.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteOperation(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/google.longrunning.Operations/DeleteOperation', + google_dot_longrunning_dot_operations__pb2.DeleteOperationRequest.SerializeToString, + google_dot_protobuf_dot_empty__pb2.Empty.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CancelOperation(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/google.longrunning.Operations/CancelOperation', + google_dot_longrunning_dot_operations__pb2.CancelOperationRequest.SerializeToString, + google_dot_protobuf_dot_empty__pb2.Empty.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def WaitOperation(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/google.longrunning.Operations/WaitOperation', + google_dot_longrunning_dot_operations__pb2.WaitOperationRequest.SerializeToString, + google_dot_longrunning_dot_operations__pb2.Operation.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/google/storage/v2/storage_pb2.py b/google/storage/v2/storage_pb2.py index f26e3b24..c31e56bc 100644 --- a/google/storage/v2/storage_pb2.py +++ b/google/storage/v2/storage_pb2.py @@ -50,7 +50,7 @@ from google.type import date_pb2 as google_dot_type_dot_date__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fgoogle/storage/v2/storage.proto\x12\x11google.storage.v2\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x18google/api/routing.proto\x1a\x1egoogle/iam/v1/iam_policy.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\x1a\x16google/type/date.proto\"\xd6\x01\n\x13\x44\x65leteBucketRequest\x12\x33\n\x04name\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x95\x02\n\x10GetBucketRequest\x12\x33\n\x04name\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x02\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\x83\x02\n\x13\x43reateBucketRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12.\n\x06\x62ucket\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.BucketB\x03\xe0\x41\x01\x12\x16\n\tbucket_id\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12\x1b\n\x0epredefined_acl\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12*\n\x1dpredefined_default_object_acl\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12$\n\x17\x65nable_object_retention\x18\t \x01(\x08\x42\x03\xe0\x41\x01\"\xf8\x01\n\x12ListBucketsRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06prefix\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x12#\n\x16return_partial_success\x18\t \x01(\x08\x42\x03\xe0\x41\x01\x42\x0c\n\n_read_mask\"o\n\x13ListBucketsResponse\x12*\n\x07\x62uckets\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Bucket\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x13\n\x0bunreachable\x18\x03 \x03(\t\"\x7f\n LockBucketRetentionPolicyRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03\x42\x03\xe0\x41\x02\"\xd0\x02\n\x13UpdateBucketRequest\x12.\n\x06\x62ucket\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.BucketB\x03\xe0\x41\x02\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x1b\n\x0epredefined_acl\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12*\n\x1dpredefined_default_object_acl\x18\t \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0bupdate_mask\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\xd4\x06\n\x14\x43omposeObjectRequest\x12\x33\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12Q\n\x0esource_objects\x18\x02 \x03(\x0b\x32\x34.google.storage.v2.ComposeObjectRequest.SourceObjectB\x03\xe0\x41\x01\x12\'\n\x1a\x64\x65stination_predefined_acl\x18\t \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12:\n\x07kms_key\x18\x06 \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12W\n\x1c\x63ommon_object_request_params\x18\x07 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x41\n\x10object_checksums\x18\n \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x12\"\n\x15\x64\x65lete_source_objects\x18\x0b \x01(\x08H\x02\x88\x01\x01\x1a\xf8\x01\n\x0cSourceObject\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x02 \x01(\x03\x42\x03\xe0\x41\x01\x12k\n\x14object_preconditions\x18\x03 \x01(\x0b\x32H.google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditionsB\x03\xe0\x41\x01\x1aO\n\x13ObjectPreconditions\x12 \n\x13if_generation_match\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_metageneration_matchB\x18\n\x16_delete_source_objects\"\xdb\x03\n\x13\x44\x65leteObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x05 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x06 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x07 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x08 \x01(\x03H\x03\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\xaa\x04\n\x14RestoreObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12\x1a\n\rrestore_token\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x03\x88\x01\x01\x12\x1c\n\x0f\x63opy_source_acl\x18\t \x01(\x08H\x04\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x12\n\x10_copy_source_acl\"5\n\x1b\x43\x61ncelResumableWriteRequest\x12\x16\n\tupload_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\"\x1e\n\x1c\x43\x61ncelResumableWriteResponse\"\xce\x04\n\x11ReadObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x01\x12\x18\n\x0bread_offset\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01\x12\x17\n\nread_limit\x18\x05 \x01(\x03\x42\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x06 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x07 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x08 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\t \x01(\x03H\x03\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x04\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xe2\x04\n\x10GetObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x01\x12\x19\n\x0csoft_deleted\x18\x0b \x01(\x08H\x00\x88\x01\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x04\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\n \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x05\x88\x01\x01\x12\x1a\n\rrestore_token\x18\x0c \x01(\tB\x03\xe0\x41\x01\x42\x0f\n\r_soft_deletedB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xf5\x01\n\x12ReadObjectResponse\x12<\n\x10\x63hecksummed_data\x18\x01 \x01(\x0b\x32\".google.storage.v2.ChecksummedData\x12<\n\x10object_checksums\x18\x02 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x36\n\rcontent_range\x18\x03 \x01(\x0b\x32\x1f.google.storage.v2.ContentRange\x12+\n\x08metadata\x18\x04 \x01(\x0b\x32\x19.google.storage.v2.Object\"\x9b\x05\n\x12\x42idiReadObjectSpec\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x03\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x36\n\tread_mask\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x02\x18\x01H\x04\x88\x01\x01\x12;\n\x0bread_handle\x18\r \x01(\x0b\x32!.google.storage.v2.BidiReadHandleH\x05\x88\x01\x01\x12\x1a\n\rrouting_token\x18\x0e \x01(\tH\x06\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_maskB\x0e\n\x0c_read_handleB\x10\n\x0e_routing_token\"\x95\x01\n\x15\x42idiReadObjectRequest\x12\x44\n\x10read_object_spec\x18\x01 \x01(\x0b\x32%.google.storage.v2.BidiReadObjectSpecB\x03\xe0\x41\x01\x12\x36\n\x0bread_ranges\x18\x08 \x03(\x0b\x32\x1c.google.storage.v2.ReadRangeB\x03\xe0\x41\x01\"\xbd\x01\n\x16\x42idiReadObjectResponse\x12>\n\x12object_data_ranges\x18\x06 \x03(\x0b\x32\".google.storage.v2.ObjectRangeData\x12+\n\x08metadata\x18\x04 \x01(\x0b\x32\x19.google.storage.v2.Object\x12\x36\n\x0bread_handle\x18\x07 \x01(\x0b\x32!.google.storage.v2.BidiReadHandle\"\x85\x01\n\x1d\x42idiReadObjectRedirectedError\x12\x36\n\x0bread_handle\x18\x01 \x01(\x0b\x32!.google.storage.v2.BidiReadHandle\x12\x1a\n\rrouting_token\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x10\n\x0e_routing_token\"\xc6\x01\n\x1e\x42idiWriteObjectRedirectedError\x12\x1a\n\rrouting_token\x18\x01 \x01(\tH\x00\x88\x01\x01\x12=\n\x0cwrite_handle\x18\x02 \x01(\x0b\x32\".google.storage.v2.BidiWriteHandleH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x03 \x01(\x03H\x02\x88\x01\x01\x42\x10\n\x0e_routing_tokenB\x0f\n\r_write_handleB\r\n\x0b_generation\"S\n\x13\x42idiReadObjectError\x12<\n\x11read_range_errors\x18\x01 \x03(\x0b\x32!.google.storage.v2.ReadRangeError\"E\n\x0eReadRangeError\x12\x0f\n\x07read_id\x18\x01 \x01(\x03\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"U\n\tReadRange\x12\x18\n\x0bread_offset\x18\x01 \x01(\x03\x42\x03\xe0\x41\x02\x12\x18\n\x0bread_length\x18\x02 \x01(\x03\x42\x03\xe0\x41\x01\x12\x14\n\x07read_id\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\"\x94\x01\n\x0fObjectRangeData\x12<\n\x10\x63hecksummed_data\x18\x01 \x01(\x0b\x32\".google.storage.v2.ChecksummedData\x12\x30\n\nread_range\x18\x02 \x01(\x0b\x32\x1c.google.storage.v2.ReadRange\x12\x11\n\trange_end\x18\x03 \x01(\x08\"%\n\x0e\x42idiReadHandle\x12\x13\n\x06handle\x18\x01 \x01(\x0c\x42\x03\xe0\x41\x02\"&\n\x0f\x42idiWriteHandle\x12\x13\n\x06handle\x18\x01 \x01(\x0c\x42\x03\xe0\x41\x02\"\xba\x03\n\x0fWriteObjectSpec\x12\x30\n\x08resource\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12\x1b\n\x0epredefined_acl\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x03 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12\x18\n\x0bobject_size\x18\x08 \x01(\x03H\x04\x88\x01\x01\x12\x17\n\nappendable\x18\t \x01(\x08H\x05\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0e\n\x0c_object_sizeB\r\n\x0b_appendable\"\x95\x03\n\x12WriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x19\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12\x41\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x12\x19\n\x0c\x66inish_write\x18\x07 \x01(\x08\x42\x03\xe0\x41\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"n\n\x13WriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\x81\x03\n\x10\x41ppendObjectSpec\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12$\n\x17if_metageneration_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12\x1a\n\rrouting_token\x18\x06 \x01(\tH\x02\x88\x01\x01\x12=\n\x0cwrite_handle\x18\x07 \x01(\x0b\x32\".google.storage.v2.BidiWriteHandleH\x03\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x10\n\x0e_routing_tokenB\x0f\n\r_write_handle\"\x8b\x04\n\x16\x42idiWriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x41\n\x12\x61ppend_object_spec\x18\x0b \x01(\x0b\x32#.google.storage.v2.AppendObjectSpecH\x00\x12\x19\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12\x41\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x12\x19\n\x0cstate_lookup\x18\x07 \x01(\x08\x42\x03\xe0\x41\x01\x12\x12\n\x05\x66lush\x18\x08 \x01(\x08\x42\x03\xe0\x41\x01\x12\x19\n\x0c\x66inish_write\x18\t \x01(\x08\x42\x03\xe0\x41\x01\x12W\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"\xc2\x01\n\x17\x42idiWriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x12=\n\x0cwrite_handle\x18\x03 \x01(\x0b\x32\".google.storage.v2.BidiWriteHandleH\x01\x88\x01\x01\x42\x0e\n\x0cwrite_statusB\x0f\n\r_write_handle\"\xe0\x03\n\x12ListObjectsRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x16\n\tdelimiter\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\'\n\x1ainclude_trailing_delimiter\x18\x05 \x01(\x08\x42\x03\xe0\x41\x01\x12\x13\n\x06prefix\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12\x15\n\x08versions\x18\x07 \x01(\x08\x42\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x12 \n\x13lexicographic_start\x18\n \x01(\tB\x03\xe0\x41\x01\x12\x1e\n\x11lexicographic_end\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12\x19\n\x0csoft_deleted\x18\x0c \x01(\x08\x42\x03\xe0\x41\x01\x12(\n\x1binclude_folders_as_prefixes\x18\r \x01(\x08\x42\x03\xe0\x41\x01\x12\x17\n\nmatch_glob\x18\x0e \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x66ilter\x18\x0f \x01(\tB\x03\xe0\x41\x01\x42\x0c\n\n_read_mask\"\x8a\x01\n\x17QueryWriteStatusRequest\x12\x16\n\tupload_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12W\n\x1c\x63ommon_object_request_params\x18\x02 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\"s\n\x18QueryWriteStatusResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\xdd\n\n\x14RewriteObjectRequest\x12 \n\x10\x64\x65stination_name\x18\x18 \x01(\tB\x06\xe0\x41\x02\xe0\x41\x05\x12\x44\n\x12\x64\x65stination_bucket\x18\x19 \x01(\tB(\xe0\x41\x02\xe0\x41\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x46\n\x13\x64\x65stination_kms_key\x18\x1b \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x33\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x01\x12<\n\rsource_bucket\x18\x02 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x1a\n\rsource_object\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12\x1e\n\x11source_generation\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01\x12\x1a\n\rrewrite_token\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\'\n\x1a\x64\x65stination_predefined_acl\x18\x1c \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x07 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x08 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\t \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\n \x01(\x03H\x03\x88\x01\x01\x12\'\n\x1aif_source_generation_match\x18\x0b \x01(\x03H\x04\x88\x01\x01\x12+\n\x1eif_source_generation_not_match\x18\x0c \x01(\x03H\x05\x88\x01\x01\x12+\n\x1eif_source_metageneration_match\x18\r \x01(\x03H\x06\x88\x01\x01\x12/\n\"if_source_metageneration_not_match\x18\x0e \x01(\x03H\x07\x88\x01\x01\x12)\n\x1cmax_bytes_rewritten_per_call\x18\x0f \x01(\x03\x42\x03\xe0\x41\x01\x12-\n copy_source_encryption_algorithm\x18\x10 \x01(\tB\x03\xe0\x41\x01\x12-\n copy_source_encryption_key_bytes\x18\x15 \x01(\x0c\x42\x03\xe0\x41\x01\x12\x34\n\'copy_source_encryption_key_sha256_bytes\x18\x16 \x01(\x0c\x42\x03\xe0\x41\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x13 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x41\n\x10object_checksums\x18\x1d \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x1d\n\x1b_if_source_generation_matchB!\n\x1f_if_source_generation_not_matchB!\n\x1f_if_source_metageneration_matchB%\n#_if_source_metageneration_not_match\"\x97\x01\n\x0fRewriteResponse\x12\x1d\n\x15total_bytes_rewritten\x18\x01 \x01(\x03\x12\x13\n\x0bobject_size\x18\x02 \x01(\x03\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12\x15\n\rrewrite_token\x18\x04 \x01(\t\x12+\n\x08resource\x18\x05 \x01(\x0b\x32\x19.google.storage.v2.Object\"\xf7\x05\n\x11MoveObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x1a\n\rsource_object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x1f\n\x12\x64\x65stination_object\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12,\n\x1aif_source_generation_match\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01H\x00\x88\x01\x01\x12\x30\n\x1eif_source_generation_not_match\x18\x05 \x01(\x03\x42\x03\xe0\x41\x01H\x01\x88\x01\x01\x12\x30\n\x1eif_source_metageneration_match\x18\x06 \x01(\x03\x42\x03\xe0\x41\x01H\x02\x88\x01\x01\x12\x34\n\"if_source_metageneration_not_match\x18\x07 \x01(\x03\x42\x03\xe0\x41\x01H\x03\x88\x01\x01\x12%\n\x13if_generation_match\x18\x08 \x01(\x03\x42\x03\xe0\x41\x01H\x04\x88\x01\x01\x12)\n\x17if_generation_not_match\x18\t \x01(\x03\x42\x03\xe0\x41\x01H\x05\x88\x01\x01\x12)\n\x17if_metageneration_match\x18\n \x01(\x03\x42\x03\xe0\x41\x01H\x06\x88\x01\x01\x12-\n\x1bif_metageneration_not_match\x18\x0b \x01(\x03\x42\x03\xe0\x41\x01H\x07\x88\x01\x01\x42\x1d\n\x1b_if_source_generation_matchB!\n\x1f_if_source_generation_not_matchB!\n\x1f_if_source_metageneration_matchB%\n#_if_source_metageneration_not_matchB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\xfc\x01\n\x1aStartResumableWriteRequest\x12\x42\n\x11write_object_spec\x18\x01 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecB\x03\xe0\x41\x02\x12W\n\x1c\x63ommon_object_request_params\x18\x03 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x41\n\x10object_checksums\x18\x05 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\"0\n\x1bStartResumableWriteResponse\x12\x11\n\tupload_id\x18\x01 \x01(\t\"\xa3\x04\n\x13UpdateObjectRequest\x12.\n\x06object\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12 \n\x13if_generation_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x04 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x05 \x01(\x03H\x03\x88\x01\x01\x12\x1b\n\x0epredefined_acl\x18\n \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12(\n\x1boverride_unlocked_retention\x18\x0b \x01(\x08\x42\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x8b\x01\n\x19\x43ommonObjectRequestParams\x12!\n\x14\x65ncryption_algorithm\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12!\n\x14\x65ncryption_key_bytes\x18\x04 \x01(\x0c\x42\x03\xe0\x41\x01\x12(\n\x1b\x65ncryption_key_sha256_bytes\x18\x05 \x01(\x0c\x42\x03\xe0\x41\x01\"\xca\x05\n\x10ServiceConstants\"\xb5\x05\n\x06Values\x12\x16\n\x12VALUES_UNSPECIFIED\x10\x00\x12\x1b\n\x14MAX_READ_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x1c\n\x15MAX_WRITE_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x19\n\x12MAX_OBJECT_SIZE_MB\x10\x80\x80\xc0\x02\x12)\n$MAX_CUSTOM_METADATA_FIELD_NAME_BYTES\x10\x80\x08\x12*\n%MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES\x10\x80 \x12)\n$MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES\x10\x80@\x12*\n$MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES\x10\x80\xa0\x01\x12\'\n#MAX_NOTIFICATION_CONFIGS_PER_BUCKET\x10\x64\x12\"\n\x1eMAX_LIFECYCLE_RULES_PER_BUCKET\x10\x64\x12&\n\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTES\x10\x05\x12\x31\n,MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\x10\x80\x02\x12\x33\n.MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH\x10\x80\x08\x12\x1c\n\x18MAX_LABELS_ENTRIES_COUNT\x10@\x12\x1f\n\x1bMAX_LABELS_KEY_VALUE_LENGTH\x10?\x12\x1f\n\x1aMAX_LABELS_KEY_VALUE_BYTES\x10\x80\x01\x12.\n)MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\x10\xe8\x07\x12\x1e\n\x1aSPLIT_TOKEN_MAX_VALID_DAYS\x10\x0e\x1a\x02\x10\x01\"\xba,\n\x06\x42ucket\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x08\x12\x16\n\tbucket_id\x18\x02 \x01(\tB\x03\xe0\x41\x03\x12\x0c\n\x04\x65tag\x18\x1d \x01(\t\x12\x44\n\x07project\x18\x03 \x01(\tB3\xe0\x41\x05\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x1b\n\x0emetageneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x03\x12\x15\n\x08location\x18\x05 \x01(\tB\x03\xe0\x41\x05\x12\x1a\n\rlocation_type\x18\x06 \x01(\tB\x03\xe0\x41\x03\x12\x1a\n\rstorage_class\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12\x10\n\x03rpo\x18\x1b \x01(\tB\x03\xe0\x41\x01\x12\x38\n\x03\x61\x63l\x18\x08 \x03(\x0b\x32&.google.storage.v2.BucketAccessControlB\x03\xe0\x41\x01\x12G\n\x12\x64\x65\x66\x61ult_object_acl\x18\t \x03(\x0b\x32&.google.storage.v2.ObjectAccessControlB\x03\xe0\x41\x01\x12;\n\tlifecycle\x18\n \x01(\x0b\x32#.google.storage.v2.Bucket.LifecycleB\x03\xe0\x41\x01\x12\x34\n\x0b\x63reate_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x31\n\x04\x63ors\x18\x0c \x03(\x0b\x32\x1e.google.storage.v2.Bucket.CorsB\x03\xe0\x41\x01\x12\x34\n\x0bupdate_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12%\n\x18\x64\x65\x66\x61ult_event_based_hold\x18\x0e \x01(\x08\x42\x03\xe0\x41\x01\x12:\n\x06labels\x18\x0f \x03(\x0b\x32%.google.storage.v2.Bucket.LabelsEntryB\x03\xe0\x41\x01\x12\x37\n\x07website\x18\x10 \x01(\x0b\x32!.google.storage.v2.Bucket.WebsiteB\x03\xe0\x41\x01\x12=\n\nversioning\x18\x11 \x01(\x0b\x32$.google.storage.v2.Bucket.VersioningB\x03\xe0\x41\x01\x12\x37\n\x07logging\x18\x12 \x01(\x0b\x32!.google.storage.v2.Bucket.LoggingB\x03\xe0\x41\x01\x12,\n\x05owner\x18\x13 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x03\xe0\x41\x03\x12=\n\nencryption\x18\x14 \x01(\x0b\x32$.google.storage.v2.Bucket.EncryptionB\x03\xe0\x41\x01\x12\x37\n\x07\x62illing\x18\x15 \x01(\x0b\x32!.google.storage.v2.Bucket.BillingB\x03\xe0\x41\x01\x12H\n\x10retention_policy\x18\x16 \x01(\x0b\x32).google.storage.v2.Bucket.RetentionPolicyB\x03\xe0\x41\x01\x12<\n\niam_config\x18\x17 \x01(\x0b\x32#.google.storage.v2.Bucket.IamConfigB\x03\xe0\x41\x01\x12\x1a\n\rsatisfies_pzs\x18\x19 \x01(\x08\x42\x03\xe0\x41\x01\x12U\n\x17\x63ustom_placement_config\x18\x1a \x01(\x0b\x32/.google.storage.v2.Bucket.CustomPlacementConfigB\x03\xe0\x41\x01\x12;\n\tautoclass\x18\x1c \x01(\x0b\x32#.google.storage.v2.Bucket.AutoclassB\x03\xe0\x41\x01\x12T\n\x16hierarchical_namespace\x18 \x01(\x0b\x32/.google.storage.v2.Bucket.HierarchicalNamespaceB\x03\xe0\x41\x01\x12K\n\x12soft_delete_policy\x18\x1f \x01(\x0b\x32*.google.storage.v2.Bucket.SoftDeletePolicyB\x03\xe0\x41\x01\x12H\n\x10object_retention\x18! \x01(\x0b\x32).google.storage.v2.Bucket.ObjectRetentionB\x03\xe0\x41\x01\x12?\n\tip_filter\x18& \x01(\x0b\x32\".google.storage.v2.Bucket.IpFilterB\x03\xe0\x41\x01H\x00\x88\x01\x01\x1a&\n\x07\x42illing\x12\x1b\n\x0erequester_pays\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x1al\n\x04\x43ors\x12\x13\n\x06origin\x18\x01 \x03(\tB\x03\xe0\x41\x01\x12\x13\n\x06method\x18\x02 \x03(\tB\x03\xe0\x41\x01\x12\x1c\n\x0fresponse_header\x18\x03 \x03(\tB\x03\xe0\x41\x01\x12\x1c\n\x0fmax_age_seconds\x18\x04 \x01(\x05\x42\x03\xe0\x41\x01\x1a\xae\t\n\nEncryption\x12\x42\n\x0f\x64\x65\x66\x61ult_kms_key\x18\x01 \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x8d\x01\n,google_managed_encryption_enforcement_config\x18\x02 \x01(\x0b\x32M.google.storage.v2.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfigB\x03\xe0\x41\x01H\x00\x88\x01\x01\x12\x91\x01\n.customer_managed_encryption_enforcement_config\x18\x03 \x01(\x0b\x32O.google.storage.v2.Bucket.Encryption.CustomerManagedEncryptionEnforcementConfigB\x03\xe0\x41\x01H\x01\x88\x01\x01\x12\x93\x01\n/customer_supplied_encryption_enforcement_config\x18\x04 \x01(\x0b\x32P.google.storage.v2.Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfigB\x03\xe0\x41\x01H\x02\x88\x01\x01\x1a\xaa\x01\n(GoogleManagedEncryptionEnforcementConfig\x12\x1d\n\x10restriction_mode\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x13\n\x11_restriction_modeB\x11\n\x0f_effective_time\x1a\xac\x01\n*CustomerManagedEncryptionEnforcementConfig\x12\x1d\n\x10restriction_mode\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x13\n\x11_restriction_modeB\x11\n\x0f_effective_time\x1a\xad\x01\n+CustomerSuppliedEncryptionEnforcementConfig\x12\x1d\n\x10restriction_mode\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x13\n\x11_restriction_modeB\x11\n\x0f_effective_timeB/\n-_google_managed_encryption_enforcement_configB1\n/_customer_managed_encryption_enforcement_configB2\n0_customer_supplied_encryption_enforcement_config\x1a\x80\x02\n\tIamConfig\x12\x66\n\x1buniform_bucket_level_access\x18\x01 \x01(\x0b\x32<.google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccessB\x03\xe0\x41\x01\x12%\n\x18public_access_prevention\x18\x03 \x01(\tB\x03\xe0\x41\x01\x1a\x64\n\x18UniformBucketLevelAccess\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x12\x32\n\tlock_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x1a\xaa\x06\n\tLifecycle\x12;\n\x04rule\x18\x01 \x03(\x0b\x32(.google.storage.v2.Bucket.Lifecycle.RuleB\x03\xe0\x41\x01\x1a\xdf\x05\n\x04Rule\x12\x44\n\x06\x61\x63tion\x18\x01 \x01(\x0b\x32/.google.storage.v2.Bucket.Lifecycle.Rule.ActionB\x03\xe0\x41\x01\x12J\n\tcondition\x18\x02 \x01(\x0b\x32\x32.google.storage.v2.Bucket.Lifecycle.Rule.ConditionB\x03\xe0\x41\x01\x1a\x37\n\x06\x41\x63tion\x12\x11\n\x04type\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1a\n\rstorage_class\x18\x02 \x01(\tB\x03\xe0\x41\x01\x1a\x8b\x04\n\tCondition\x12\x15\n\x08\x61ge_days\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12.\n\x0e\x63reated_before\x18\x02 \x01(\x0b\x32\x11.google.type.DateB\x03\xe0\x41\x01\x12\x14\n\x07is_live\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12num_newer_versions\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\"\n\x15matches_storage_class\x18\x05 \x03(\tB\x03\xe0\x41\x01\x12#\n\x16\x64\x61ys_since_custom_time\x18\x07 \x01(\x05H\x03\x88\x01\x01\x12\x32\n\x12\x63ustom_time_before\x18\x08 \x01(\x0b\x32\x11.google.type.DateB\x03\xe0\x41\x01\x12\'\n\x1a\x64\x61ys_since_noncurrent_time\x18\t \x01(\x05H\x04\x88\x01\x01\x12\x36\n\x16noncurrent_time_before\x18\n \x01(\x0b\x32\x11.google.type.DateB\x03\xe0\x41\x01\x12\x1b\n\x0ematches_prefix\x18\x0b \x03(\tB\x03\xe0\x41\x01\x12\x1b\n\x0ematches_suffix\x18\x0c \x03(\tB\x03\xe0\x41\x01\x42\x0b\n\t_age_daysB\n\n\x08_is_liveB\x15\n\x13_num_newer_versionsB\x19\n\x17_days_since_custom_timeB\x1d\n\x1b_days_since_noncurrent_time\x1a\x42\n\x07Logging\x12\x17\n\nlog_bucket\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1e\n\x11log_object_prefix\x18\x02 \x01(\tB\x03\xe0\x41\x01\x1a*\n\x0fObjectRetention\x12\x17\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x06\xe0\x41\x01\xe0\x41\x03\x1a\x9e\x01\n\x0fRetentionPolicy\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x12\x16\n\tis_locked\x18\x02 \x01(\x08\x42\x03\xe0\x41\x01\x12:\n\x12retention_duration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationB\x03\xe0\x41\x01\x1a\xb1\x01\n\x10SoftDeletePolicy\x12:\n\x12retention_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x15\n\x13_retention_durationB\x11\n\x0f_effective_time\x1a\"\n\nVersioning\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x1a\x45\n\x07Website\x12\x1d\n\x10main_page_suffix\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1b\n\x0enot_found_page\x18\x02 \x01(\tB\x03\xe0\x41\x01\x1a\x34\n\x15\x43ustomPlacementConfig\x12\x1b\n\x0e\x64\x61ta_locations\x18\x01 \x03(\tB\x03\xe0\x41\x01\x1a\x90\x02\n\tAutoclass\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x12\x34\n\x0btoggle_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12#\n\x16terminal_storage_class\x18\x03 \x01(\tH\x00\x88\x01\x01\x12P\n\"terminal_storage_class_update_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x01\x88\x01\x01\x42\x19\n\x17_terminal_storage_classB%\n#_terminal_storage_class_update_time\x1a\xfd\x03\n\x08IpFilter\x12\x11\n\x04mode\x18\x01 \x01(\tH\x00\x88\x01\x01\x12Z\n\x15public_network_source\x18\x02 \x01(\x0b\x32\x36.google.storage.v2.Bucket.IpFilter.PublicNetworkSourceH\x01\x88\x01\x01\x12U\n\x13vpc_network_sources\x18\x03 \x03(\x0b\x32\x33.google.storage.v2.Bucket.IpFilter.VpcNetworkSourceB\x03\xe0\x41\x01\x12!\n\x14\x61llow_cross_org_vpcs\x18\x04 \x01(\x08\x42\x03\xe0\x41\x01\x12+\n\x1e\x61llow_all_service_agent_access\x18\x05 \x01(\x08H\x02\x88\x01\x01\x1a:\n\x13PublicNetworkSource\x12#\n\x16\x61llowed_ip_cidr_ranges\x18\x01 \x03(\tB\x03\xe0\x41\x01\x1aY\n\x10VpcNetworkSource\x12\x14\n\x07network\x18\x01 \x01(\tH\x00\x88\x01\x01\x12#\n\x16\x61llowed_ip_cidr_ranges\x18\x02 \x03(\tB\x03\xe0\x41\x01\x42\n\n\x08_networkB\x07\n\x05_modeB\x18\n\x16_public_network_sourceB!\n\x1f_allow_all_service_agent_access\x1a-\n\x15HierarchicalNamespace\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:X\xea\x41U\n\x1dstorage.googleapis.com/Bucket\x12#projects/{project}/buckets/{bucket}*\x07\x62uckets2\x06\x62ucketB\x0c\n\n_ip_filter\"\xf6\x01\n\x13\x42ucketAccessControl\x12\x11\n\x04role\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x0f\n\x02id\x18\x02 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x65ntity\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x17\n\nentity_alt\x18\t \x01(\tB\x03\xe0\x41\x03\x12\x16\n\tentity_id\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04\x65tag\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12\x12\n\x05\x65mail\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x64omain\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12\x39\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeamB\x03\xe0\x41\x01\"I\n\x0f\x43hecksummedData\x12\x16\n\x07\x63ontent\x18\x01 \x01(\x0c\x42\x05\x08\x01\xe0\x41\x01\x12\x13\n\x06\x63rc32c\x18\x02 \x01(\x07H\x00\x88\x01\x01\x42\t\n\x07_crc32c\"H\n\x0fObjectChecksums\x12\x13\n\x06\x63rc32c\x18\x01 \x01(\x07H\x00\x88\x01\x01\x12\x15\n\x08md5_hash\x18\x02 \x01(\x0c\x42\x03\xe0\x41\x01\x42\t\n\x07_crc32c\"\x9c\x01\n\x1aObjectCustomContextPayload\x12\x12\n\x05value\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x34\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x34\n\x0bupdate_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\"\xb2\x01\n\x0eObjectContexts\x12\x42\n\x06\x63ustom\x18\x01 \x03(\x0b\x32-.google.storage.v2.ObjectContexts.CustomEntryB\x03\xe0\x41\x01\x1a\\\n\x0b\x43ustomEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12<\n\x05value\x18\x02 \x01(\x0b\x32-.google.storage.v2.ObjectCustomContextPayload:\x02\x38\x01\"V\n\x12\x43ustomerEncryption\x12!\n\x14\x65ncryption_algorithm\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1d\n\x10key_sha256_bytes\x18\x03 \x01(\x0c\x42\x03\xe0\x41\x01\"\x91\x0e\n\x06Object\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x05\x12\x35\n\x06\x62ucket\x18\x02 \x01(\tB%\xe0\x41\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x11\n\x04\x65tag\x18\x1b \x01(\tB\x03\xe0\x41\x01\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x05\x12\x1f\n\rrestore_token\x18# \x01(\tB\x03\xe0\x41\x03H\x00\x88\x01\x01\x12\x1b\n\x0emetageneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x03\x12\x1a\n\rstorage_class\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04size\x18\x06 \x01(\x03\x42\x03\xe0\x41\x03\x12\x1d\n\x10\x63ontent_encoding\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12 \n\x13\x63ontent_disposition\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12\x1a\n\rcache_control\x18\t \x01(\tB\x03\xe0\x41\x01\x12\x38\n\x03\x61\x63l\x18\n \x03(\x0b\x32&.google.storage.v2.ObjectAccessControlB\x03\xe0\x41\x01\x12\x1d\n\x10\x63ontent_language\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0b\x64\x65lete_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x36\n\rfinalize_time\x18$ \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x19\n\x0c\x63ontent_type\x18\r \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0b\x63reate_time\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x1c\n\x0f\x63omponent_count\x18\x0f \x01(\x05\x42\x03\xe0\x41\x03\x12:\n\tchecksums\x18\x10 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x03\x12\x34\n\x0bupdate_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12:\n\x07kms_key\x18\x12 \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x42\n\x19update_storage_class_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x1b\n\x0etemporary_hold\x18\x14 \x01(\x08\x42\x03\xe0\x41\x01\x12>\n\x15retention_expire_time\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x12>\n\x08metadata\x18\x16 \x03(\x0b\x32\'.google.storage.v2.Object.MetadataEntryB\x03\xe0\x41\x01\x12\x38\n\x08\x63ontexts\x18& \x01(\x0b\x32!.google.storage.v2.ObjectContextsB\x03\xe0\x41\x01\x12\x1d\n\x10\x65vent_based_hold\x18\x17 \x01(\x08H\x01\x88\x01\x01\x12,\n\x05owner\x18\x18 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x03\xe0\x41\x03\x12G\n\x13\x63ustomer_encryption\x18\x19 \x01(\x0b\x32%.google.storage.v2.CustomerEncryptionB\x03\xe0\x41\x01\x12\x34\n\x0b\x63ustom_time\x18\x1a \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x12>\n\x10soft_delete_time\x18\x1c \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x02\x88\x01\x01\x12>\n\x10hard_delete_time\x18\x1d \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x03\x88\x01\x01\x12;\n\tretention\x18\x1e \x01(\x0b\x32#.google.storage.v2.Object.RetentionB\x03\xe0\x41\x01\x1a\xbc\x01\n\tRetention\x12;\n\x04mode\x18\x01 \x01(\x0e\x32(.google.storage.v2.Object.Retention.ModeB\x03\xe0\x41\x01\x12:\n\x11retain_until_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\"6\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x0c\n\x08UNLOCKED\x10\x01\x12\n\n\x06LOCKED\x10\x02\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x10\n\x0e_restore_tokenB\x13\n\x11_event_based_holdB\x13\n\x11_soft_delete_timeB\x13\n\x11_hard_delete_time\"\xf6\x01\n\x13ObjectAccessControl\x12\x11\n\x04role\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x0f\n\x02id\x18\x02 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x65ntity\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x17\n\nentity_alt\x18\t \x01(\tB\x03\xe0\x41\x03\x12\x16\n\tentity_id\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04\x65tag\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12\x12\n\x05\x65mail\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x64omain\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12\x39\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeamB\x03\xe0\x41\x01\"l\n\x13ListObjectsResponse\x12*\n\x07objects\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Object\x12\x10\n\x08prefixes\x18\x02 \x03(\t\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\t\"=\n\x0bProjectTeam\x12\x1b\n\x0eproject_number\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04team\x18\x02 \x01(\tB\x03\xe0\x41\x01\"4\n\x05Owner\x12\x13\n\x06\x65ntity\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x16\n\tentity_id\x18\x02 \x01(\tB\x03\xe0\x41\x01\"C\n\x0c\x43ontentRange\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x17\n\x0f\x63omplete_length\x18\x03 \x01(\x03\x32\x9f\x1f\n\x07Storage\x12r\n\x0c\x44\x65leteBucket\x12&.google.storage.v2.DeleteBucketRequest\x1a\x16.google.protobuf.Empty\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12o\n\tGetBucket\x12#.google.storage.v2.GetBucketRequest\x1a\x19.google.storage.v2.Bucket\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12\xab\x01\n\x0c\x43reateBucket\x12&.google.storage.v2.CreateBucketRequest\x1a\x19.google.storage.v2.Bucket\"X\xda\x41\x17parent,bucket,bucket_id\x8a\xd3\xe4\x93\x02\x38\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x1e\n\x0e\x62ucket.project\x12\x0c{project=**}\x12\x85\x01\n\x0bListBuckets\x12%.google.storage.v2.ListBucketsRequest\x1a&.google.storage.v2.ListBucketsResponse\"\'\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x18\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x93\x01\n\x19LockBucketRetentionPolicy\x12\x33.google.storage.v2.LockBucketRetentionPolicyRequest\x1a\x19.google.storage.v2.Bucket\"&\xda\x41\x06\x62ucket\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xa3\x01\n\x0cGetIamPolicy\x12\".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"X\xda\x41\x08resource\x8a\xd3\xe4\x93\x02G\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12,\n\x08resource\x12 {bucket=projects/*/buckets/*}/**\x12\xaa\x01\n\x0cSetIamPolicy\x12\".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"_\xda\x41\x0fresource,policy\x8a\xd3\xe4\x93\x02G\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12,\n\x08resource\x12 {bucket=projects/*/buckets/*}/**\x12\x96\x02\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse\"\xaa\x01\xda\x41\x14resource,permissions\x8a\xd3\xe4\x93\x02\x8c\x01\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\x34\n\x08resource\x12({bucket=projects/*/buckets/*}/objects/**\x12;\n\x08resource\x12/{bucket=projects/*/buckets/*}/managedFolders/**\x12\x8a\x01\n\x0cUpdateBucket\x12&.google.storage.v2.UpdateBucketRequest\x1a\x19.google.storage.v2.Bucket\"7\xda\x41\x12\x62ucket,update_mask\x8a\xd3\xe4\x93\x02\x1c\x12\x1a\n\x0b\x62ucket.name\x12\x0b{bucket=**}\x12~\n\rComposeObject\x12\'.google.storage.v2.ComposeObjectRequest\x1a\x19.google.storage.v2.Object\")\x8a\xd3\xe4\x93\x02#\x12!\n\x12\x64\x65stination.bucket\x12\x0b{bucket=**}\x12\x98\x01\n\x0c\x44\x65leteObject\x12&.google.storage.v2.DeleteObjectRequest\x1a\x16.google.protobuf.Empty\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\x8d\x01\n\rRestoreObject\x12\'.google.storage.v2.RestoreObjectRequest\x1a\x19.google.storage.v2.Object\"8\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xba\x01\n\x14\x43\x61ncelResumableWrite\x12..google.storage.v2.CancelResumableWriteRequest\x1a/.google.storage.v2.CancelResumableWriteResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x95\x01\n\tGetObject\x12#.google.storage.v2.GetObjectRequest\x1a\x19.google.storage.v2.Object\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xa5\x01\n\nReadObject\x12$.google.storage.v2.ReadObjectRequest\x1a%.google.storage.v2.ReadObjectResponse\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}0\x01\x12\x99\x01\n\x0e\x42idiReadObject\x12(.google.storage.v2.BidiReadObjectRequest\x1a).google.storage.v2.BidiReadObjectResponse\".\x8a\xd3\xe4\x93\x02(\x12&\n\x17read_object_spec.bucket\x12\x0b{bucket=**}(\x01\x30\x01\x12\x8c\x01\n\x0cUpdateObject\x12&.google.storage.v2.UpdateObjectRequest\x1a\x19.google.storage.v2.Object\"9\xda\x41\x12object,update_mask\x8a\xd3\xe4\x93\x02\x1e\x12\x1c\n\robject.bucket\x12\x0b{bucket=**}\x12`\n\x0bWriteObject\x12%.google.storage.v2.WriteObjectRequest\x1a&.google.storage.v2.WriteObjectResponse\"\x00(\x01\x12n\n\x0f\x42idiWriteObject\x12).google.storage.v2.BidiWriteObjectRequest\x1a*.google.storage.v2.BidiWriteObjectResponse\"\x00(\x01\x30\x01\x12\x84\x01\n\x0bListObjects\x12%.google.storage.v2.ListObjectsRequest\x1a&.google.storage.v2.ListObjectsResponse\"&\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12\x98\x01\n\rRewriteObject\x12\'.google.storage.v2.RewriteObjectRequest\x1a\".google.storage.v2.RewriteResponse\":\x8a\xd3\xe4\x93\x02\x34\x12\x0f\n\rsource_bucket\x12!\n\x12\x64\x65stination_bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x13StartResumableWrite\x12-.google.storage.v2.StartResumableWriteRequest\x1a..google.storage.v2.StartResumableWriteResponse\"8\x8a\xd3\xe4\x93\x02\x32\x12\x30\n!write_object_spec.resource.bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x10QueryWriteStatus\x12*.google.storage.v2.QueryWriteStatusRequest\x1a+.google.storage.v2.QueryWriteStatusResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x96\x01\n\nMoveObject\x12$.google.storage.v2.MoveObjectRequest\x1a\x19.google.storage.v2.Object\"G\xda\x41\'bucket,source_object,destination_object\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x1a\xa7\x02\xca\x41\x16storage.googleapis.com\xd2\x41\x8a\x02https://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_writeB\xe2\x01\n\x15\x63om.google.storage.v2B\x0cStorageProtoP\x01Z>cloud.google.com/go/storage/internal/apiv2/storagepb;storagepb\xea\x41x\n!cloudkms.googleapis.com/CryptoKey\x12Sprojects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fgoogle/storage/v2/storage.proto\x12\x11google.storage.v2\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x18google/api/routing.proto\x1a\x1egoogle/iam/v1/iam_policy.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\x1a\x16google/type/date.proto\"\xd6\x01\n\x13\x44\x65leteBucketRequest\x12\x33\n\x04name\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x95\x02\n\x10GetBucketRequest\x12\x33\n\x04name\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x02\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\x83\x02\n\x13\x43reateBucketRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12.\n\x06\x62ucket\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.BucketB\x03\xe0\x41\x01\x12\x16\n\tbucket_id\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12\x1b\n\x0epredefined_acl\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12*\n\x1dpredefined_default_object_acl\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12$\n\x17\x65nable_object_retention\x18\t \x01(\x08\x42\x03\xe0\x41\x01\"\xf8\x01\n\x12ListBucketsRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06prefix\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x12#\n\x16return_partial_success\x18\t \x01(\x08\x42\x03\xe0\x41\x01\x42\x0c\n\n_read_mask\"o\n\x13ListBucketsResponse\x12*\n\x07\x62uckets\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Bucket\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\x12\x13\n\x0bunreachable\x18\x03 \x03(\t\"\x7f\n LockBucketRetentionPolicyRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03\x42\x03\xe0\x41\x02\"\xd0\x02\n\x13UpdateBucketRequest\x12.\n\x06\x62ucket\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.BucketB\x03\xe0\x41\x02\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x1b\n\x0epredefined_acl\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12*\n\x1dpredefined_default_object_acl\x18\t \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0bupdate_mask\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\xd4\x06\n\x14\x43omposeObjectRequest\x12\x33\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12Q\n\x0esource_objects\x18\x02 \x03(\x0b\x32\x34.google.storage.v2.ComposeObjectRequest.SourceObjectB\x03\xe0\x41\x01\x12\'\n\x1a\x64\x65stination_predefined_acl\x18\t \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12:\n\x07kms_key\x18\x06 \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12W\n\x1c\x63ommon_object_request_params\x18\x07 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x41\n\x10object_checksums\x18\n \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x12\"\n\x15\x64\x65lete_source_objects\x18\x0b \x01(\x08H\x02\x88\x01\x01\x1a\xf8\x01\n\x0cSourceObject\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x02 \x01(\x03\x42\x03\xe0\x41\x01\x12k\n\x14object_preconditions\x18\x03 \x01(\x0b\x32H.google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditionsB\x03\xe0\x41\x01\x1aO\n\x13ObjectPreconditions\x12 \n\x13if_generation_match\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_metageneration_matchB\x18\n\x16_delete_source_objects\"\xdb\x03\n\x13\x44\x65leteObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x05 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x06 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x07 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x08 \x01(\x03H\x03\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\xaa\x04\n\x14RestoreObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12\x1a\n\rrestore_token\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x03\x88\x01\x01\x12\x1c\n\x0f\x63opy_source_acl\x18\t \x01(\x08H\x04\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x12\n\x10_copy_source_acl\"5\n\x1b\x43\x61ncelResumableWriteRequest\x12\x16\n\tupload_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\"\x1e\n\x1c\x43\x61ncelResumableWriteResponse\"\xce\x04\n\x11ReadObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x01\x12\x18\n\x0bread_offset\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01\x12\x17\n\nread_limit\x18\x05 \x01(\x03\x42\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x06 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x07 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x08 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\t \x01(\x03H\x03\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x04\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xe2\x04\n\x10GetObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x01\x12\x19\n\x0csoft_deleted\x18\x0b \x01(\x08H\x00\x88\x01\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x04\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\n \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x05\x88\x01\x01\x12\x1a\n\rrestore_token\x18\x0c \x01(\tB\x03\xe0\x41\x01\x42\x0f\n\r_soft_deletedB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xf5\x01\n\x12ReadObjectResponse\x12<\n\x10\x63hecksummed_data\x18\x01 \x01(\x0b\x32\".google.storage.v2.ChecksummedData\x12<\n\x10object_checksums\x18\x02 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x36\n\rcontent_range\x18\x03 \x01(\x0b\x32\x1f.google.storage.v2.ContentRange\x12+\n\x08metadata\x18\x04 \x01(\x0b\x32\x19.google.storage.v2.Object\"\x9b\x05\n\x12\x42idiReadObjectSpec\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x03\x88\x01\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x36\n\tread_mask\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x02\x18\x01H\x04\x88\x01\x01\x12;\n\x0bread_handle\x18\r \x01(\x0b\x32!.google.storage.v2.BidiReadHandleH\x05\x88\x01\x01\x12\x1a\n\rrouting_token\x18\x0e \x01(\tH\x06\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_maskB\x0e\n\x0c_read_handleB\x10\n\x0e_routing_token\"\x95\x01\n\x15\x42idiReadObjectRequest\x12\x44\n\x10read_object_spec\x18\x01 \x01(\x0b\x32%.google.storage.v2.BidiReadObjectSpecB\x03\xe0\x41\x01\x12\x36\n\x0bread_ranges\x18\x08 \x03(\x0b\x32\x1c.google.storage.v2.ReadRangeB\x03\xe0\x41\x01\"\xbd\x01\n\x16\x42idiReadObjectResponse\x12>\n\x12object_data_ranges\x18\x06 \x03(\x0b\x32\".google.storage.v2.ObjectRangeData\x12+\n\x08metadata\x18\x04 \x01(\x0b\x32\x19.google.storage.v2.Object\x12\x36\n\x0bread_handle\x18\x07 \x01(\x0b\x32!.google.storage.v2.BidiReadHandle\"\x85\x01\n\x1d\x42idiReadObjectRedirectedError\x12\x36\n\x0bread_handle\x18\x01 \x01(\x0b\x32!.google.storage.v2.BidiReadHandle\x12\x1a\n\rrouting_token\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x10\n\x0e_routing_token\"\xc6\x01\n\x1e\x42idiWriteObjectRedirectedError\x12\x1a\n\rrouting_token\x18\x01 \x01(\tH\x00\x88\x01\x01\x12=\n\x0cwrite_handle\x18\x02 \x01(\x0b\x32\".google.storage.v2.BidiWriteHandleH\x01\x88\x01\x01\x12\x17\n\ngeneration\x18\x03 \x01(\x03H\x02\x88\x01\x01\x42\x10\n\x0e_routing_tokenB\x0f\n\r_write_handleB\r\n\x0b_generation\"S\n\x13\x42idiReadObjectError\x12<\n\x11read_range_errors\x18\x01 \x03(\x0b\x32!.google.storage.v2.ReadRangeError\"E\n\x0eReadRangeError\x12\x0f\n\x07read_id\x18\x01 \x01(\x03\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"U\n\tReadRange\x12\x18\n\x0bread_offset\x18\x01 \x01(\x03\x42\x03\xe0\x41\x02\x12\x18\n\x0bread_length\x18\x02 \x01(\x03\x42\x03\xe0\x41\x01\x12\x14\n\x07read_id\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\"\x94\x01\n\x0fObjectRangeData\x12<\n\x10\x63hecksummed_data\x18\x01 \x01(\x0b\x32\".google.storage.v2.ChecksummedData\x12\x30\n\nread_range\x18\x02 \x01(\x0b\x32\x1c.google.storage.v2.ReadRange\x12\x11\n\trange_end\x18\x03 \x01(\x08\"%\n\x0e\x42idiReadHandle\x12\x13\n\x06handle\x18\x01 \x01(\x0c\x42\x03\xe0\x41\x02\"&\n\x0f\x42idiWriteHandle\x12\x13\n\x06handle\x18\x01 \x01(\x0c\x42\x03\xe0\x41\x02\"\xba\x03\n\x0fWriteObjectSpec\x12\x30\n\x08resource\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12\x1b\n\x0epredefined_acl\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x03 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12\x18\n\x0bobject_size\x18\x08 \x01(\x03H\x04\x88\x01\x01\x12\x17\n\nappendable\x18\t \x01(\x08H\x05\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0e\n\x0c_object_sizeB\r\n\x0b_appendable\"\x95\x03\n\x12WriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x19\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12\x41\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x12\x19\n\x0c\x66inish_write\x18\x07 \x01(\x08\x42\x03\xe0\x41\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"\xb4\x01\n\x13WriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x12\x44\n\x18persisted_data_checksums\x18\x03 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x0e\n\x0cwrite_status\"\x81\x03\n\x10\x41ppendObjectSpec\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12$\n\x17if_metageneration_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12\x1a\n\rrouting_token\x18\x06 \x01(\tH\x02\x88\x01\x01\x12=\n\x0cwrite_handle\x18\x07 \x01(\x0b\x32\".google.storage.v2.BidiWriteHandleH\x03\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x10\n\x0e_routing_tokenB\x0f\n\r_write_handle\"\x8b\x04\n\x16\x42idiWriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x41\n\x12\x61ppend_object_spec\x18\x0b \x01(\x0b\x32#.google.storage.v2.AppendObjectSpecH\x00\x12\x19\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12\x41\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x12\x19\n\x0cstate_lookup\x18\x07 \x01(\x08\x42\x03\xe0\x41\x01\x12\x12\n\x05\x66lush\x18\x08 \x01(\x08\x42\x03\xe0\x41\x01\x12\x19\n\x0c\x66inish_write\x18\t \x01(\x08\x42\x03\xe0\x41\x01\x12W\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x42\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"\x88\x02\n\x17\x42idiWriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x12\x44\n\x18persisted_data_checksums\x18\x04 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12=\n\x0cwrite_handle\x18\x03 \x01(\x0b\x32\".google.storage.v2.BidiWriteHandleH\x01\x88\x01\x01\x42\x0e\n\x0cwrite_statusB\x0f\n\r_write_handle\"\xe0\x03\n\x12ListObjectsRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x16\n\tdelimiter\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\'\n\x1ainclude_trailing_delimiter\x18\x05 \x01(\x08\x42\x03\xe0\x41\x01\x12\x13\n\x06prefix\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12\x15\n\x08versions\x18\x07 \x01(\x08\x42\x03\xe0\x41\x01\x12\x32\n\tread_mask\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x12 \n\x13lexicographic_start\x18\n \x01(\tB\x03\xe0\x41\x01\x12\x1e\n\x11lexicographic_end\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12\x19\n\x0csoft_deleted\x18\x0c \x01(\x08\x42\x03\xe0\x41\x01\x12(\n\x1binclude_folders_as_prefixes\x18\r \x01(\x08\x42\x03\xe0\x41\x01\x12\x17\n\nmatch_glob\x18\x0e \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x66ilter\x18\x0f \x01(\tB\x03\xe0\x41\x01\x42\x0c\n\n_read_mask\"\x8a\x01\n\x17QueryWriteStatusRequest\x12\x16\n\tupload_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12W\n\x1c\x63ommon_object_request_params\x18\x02 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\"\xb9\x01\n\x18QueryWriteStatusResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x12\x44\n\x18persisted_data_checksums\x18\x03 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x0e\n\x0cwrite_status\"\xdd\n\n\x14RewriteObjectRequest\x12 \n\x10\x64\x65stination_name\x18\x18 \x01(\tB\x06\xe0\x41\x02\xe0\x41\x05\x12\x44\n\x12\x64\x65stination_bucket\x18\x19 \x01(\tB(\xe0\x41\x02\xe0\x41\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x46\n\x13\x64\x65stination_kms_key\x18\x1b \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x33\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x01\x12<\n\rsource_bucket\x18\x02 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x1a\n\rsource_object\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12\x1e\n\x11source_generation\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01\x12\x1a\n\rrewrite_token\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\'\n\x1a\x64\x65stination_predefined_acl\x18\x1c \x01(\tB\x03\xe0\x41\x01\x12 \n\x13if_generation_match\x18\x07 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x08 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\t \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\n \x01(\x03H\x03\x88\x01\x01\x12\'\n\x1aif_source_generation_match\x18\x0b \x01(\x03H\x04\x88\x01\x01\x12+\n\x1eif_source_generation_not_match\x18\x0c \x01(\x03H\x05\x88\x01\x01\x12+\n\x1eif_source_metageneration_match\x18\r \x01(\x03H\x06\x88\x01\x01\x12/\n\"if_source_metageneration_not_match\x18\x0e \x01(\x03H\x07\x88\x01\x01\x12)\n\x1cmax_bytes_rewritten_per_call\x18\x0f \x01(\x03\x42\x03\xe0\x41\x01\x12-\n copy_source_encryption_algorithm\x18\x10 \x01(\tB\x03\xe0\x41\x01\x12-\n copy_source_encryption_key_bytes\x18\x15 \x01(\x0c\x42\x03\xe0\x41\x01\x12\x34\n\'copy_source_encryption_key_sha256_bytes\x18\x16 \x01(\x0c\x42\x03\xe0\x41\x01\x12W\n\x1c\x63ommon_object_request_params\x18\x13 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x41\n\x10object_checksums\x18\x1d \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x1d\n\x1b_if_source_generation_matchB!\n\x1f_if_source_generation_not_matchB!\n\x1f_if_source_metageneration_matchB%\n#_if_source_metageneration_not_match\"\x97\x01\n\x0fRewriteResponse\x12\x1d\n\x15total_bytes_rewritten\x18\x01 \x01(\x03\x12\x13\n\x0bobject_size\x18\x02 \x01(\x03\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12\x15\n\rrewrite_token\x18\x04 \x01(\t\x12+\n\x08resource\x18\x05 \x01(\x0b\x32\x19.google.storage.v2.Object\"\xf7\x05\n\x11MoveObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x1a\n\rsource_object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x1f\n\x12\x64\x65stination_object\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12,\n\x1aif_source_generation_match\x18\x04 \x01(\x03\x42\x03\xe0\x41\x01H\x00\x88\x01\x01\x12\x30\n\x1eif_source_generation_not_match\x18\x05 \x01(\x03\x42\x03\xe0\x41\x01H\x01\x88\x01\x01\x12\x30\n\x1eif_source_metageneration_match\x18\x06 \x01(\x03\x42\x03\xe0\x41\x01H\x02\x88\x01\x01\x12\x34\n\"if_source_metageneration_not_match\x18\x07 \x01(\x03\x42\x03\xe0\x41\x01H\x03\x88\x01\x01\x12%\n\x13if_generation_match\x18\x08 \x01(\x03\x42\x03\xe0\x41\x01H\x04\x88\x01\x01\x12)\n\x17if_generation_not_match\x18\t \x01(\x03\x42\x03\xe0\x41\x01H\x05\x88\x01\x01\x12)\n\x17if_metageneration_match\x18\n \x01(\x03\x42\x03\xe0\x41\x01H\x06\x88\x01\x01\x12-\n\x1bif_metageneration_not_match\x18\x0b \x01(\x03\x42\x03\xe0\x41\x01H\x07\x88\x01\x01\x42\x1d\n\x1b_if_source_generation_matchB!\n\x1f_if_source_generation_not_matchB!\n\x1f_if_source_metageneration_matchB%\n#_if_source_metageneration_not_matchB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\xfc\x01\n\x1aStartResumableWriteRequest\x12\x42\n\x11write_object_spec\x18\x01 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecB\x03\xe0\x41\x02\x12W\n\x1c\x63ommon_object_request_params\x18\x03 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12\x41\n\x10object_checksums\x18\x05 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x01\"0\n\x1bStartResumableWriteResponse\x12\x11\n\tupload_id\x18\x01 \x01(\t\"\xa3\x04\n\x13UpdateObjectRequest\x12.\n\x06object\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12 \n\x13if_generation_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x04 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x05 \x01(\x03H\x03\x88\x01\x01\x12\x1b\n\x0epredefined_acl\x18\n \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02\x12W\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x03\xe0\x41\x01\x12(\n\x1boverride_unlocked_retention\x18\x0b \x01(\x08\x42\x03\xe0\x41\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x8b\x01\n\x19\x43ommonObjectRequestParams\x12!\n\x14\x65ncryption_algorithm\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12!\n\x14\x65ncryption_key_bytes\x18\x04 \x01(\x0c\x42\x03\xe0\x41\x01\x12(\n\x1b\x65ncryption_key_sha256_bytes\x18\x05 \x01(\x0c\x42\x03\xe0\x41\x01\"\xca\x05\n\x10ServiceConstants\"\xb5\x05\n\x06Values\x12\x16\n\x12VALUES_UNSPECIFIED\x10\x00\x12\x1b\n\x14MAX_READ_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x1c\n\x15MAX_WRITE_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x19\n\x12MAX_OBJECT_SIZE_MB\x10\x80\x80\xc0\x02\x12)\n$MAX_CUSTOM_METADATA_FIELD_NAME_BYTES\x10\x80\x08\x12*\n%MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES\x10\x80 \x12)\n$MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES\x10\x80@\x12*\n$MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES\x10\x80\xa0\x01\x12\'\n#MAX_NOTIFICATION_CONFIGS_PER_BUCKET\x10\x64\x12\"\n\x1eMAX_LIFECYCLE_RULES_PER_BUCKET\x10\x64\x12&\n\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTES\x10\x05\x12\x31\n,MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\x10\x80\x02\x12\x33\n.MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH\x10\x80\x08\x12\x1c\n\x18MAX_LABELS_ENTRIES_COUNT\x10@\x12\x1f\n\x1bMAX_LABELS_KEY_VALUE_LENGTH\x10?\x12\x1f\n\x1aMAX_LABELS_KEY_VALUE_BYTES\x10\x80\x01\x12.\n)MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\x10\xe8\x07\x12\x1e\n\x1aSPLIT_TOKEN_MAX_VALID_DAYS\x10\x0e\x1a\x02\x10\x01\"\xba,\n\x06\x42ucket\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x08\x12\x16\n\tbucket_id\x18\x02 \x01(\tB\x03\xe0\x41\x03\x12\x0c\n\x04\x65tag\x18\x1d \x01(\t\x12\x44\n\x07project\x18\x03 \x01(\tB3\xe0\x41\x05\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x1b\n\x0emetageneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x03\x12\x15\n\x08location\x18\x05 \x01(\tB\x03\xe0\x41\x05\x12\x1a\n\rlocation_type\x18\x06 \x01(\tB\x03\xe0\x41\x03\x12\x1a\n\rstorage_class\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12\x10\n\x03rpo\x18\x1b \x01(\tB\x03\xe0\x41\x01\x12\x38\n\x03\x61\x63l\x18\x08 \x03(\x0b\x32&.google.storage.v2.BucketAccessControlB\x03\xe0\x41\x01\x12G\n\x12\x64\x65\x66\x61ult_object_acl\x18\t \x03(\x0b\x32&.google.storage.v2.ObjectAccessControlB\x03\xe0\x41\x01\x12;\n\tlifecycle\x18\n \x01(\x0b\x32#.google.storage.v2.Bucket.LifecycleB\x03\xe0\x41\x01\x12\x34\n\x0b\x63reate_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x31\n\x04\x63ors\x18\x0c \x03(\x0b\x32\x1e.google.storage.v2.Bucket.CorsB\x03\xe0\x41\x01\x12\x34\n\x0bupdate_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12%\n\x18\x64\x65\x66\x61ult_event_based_hold\x18\x0e \x01(\x08\x42\x03\xe0\x41\x01\x12:\n\x06labels\x18\x0f \x03(\x0b\x32%.google.storage.v2.Bucket.LabelsEntryB\x03\xe0\x41\x01\x12\x37\n\x07website\x18\x10 \x01(\x0b\x32!.google.storage.v2.Bucket.WebsiteB\x03\xe0\x41\x01\x12=\n\nversioning\x18\x11 \x01(\x0b\x32$.google.storage.v2.Bucket.VersioningB\x03\xe0\x41\x01\x12\x37\n\x07logging\x18\x12 \x01(\x0b\x32!.google.storage.v2.Bucket.LoggingB\x03\xe0\x41\x01\x12,\n\x05owner\x18\x13 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x03\xe0\x41\x03\x12=\n\nencryption\x18\x14 \x01(\x0b\x32$.google.storage.v2.Bucket.EncryptionB\x03\xe0\x41\x01\x12\x37\n\x07\x62illing\x18\x15 \x01(\x0b\x32!.google.storage.v2.Bucket.BillingB\x03\xe0\x41\x01\x12H\n\x10retention_policy\x18\x16 \x01(\x0b\x32).google.storage.v2.Bucket.RetentionPolicyB\x03\xe0\x41\x01\x12<\n\niam_config\x18\x17 \x01(\x0b\x32#.google.storage.v2.Bucket.IamConfigB\x03\xe0\x41\x01\x12\x1a\n\rsatisfies_pzs\x18\x19 \x01(\x08\x42\x03\xe0\x41\x01\x12U\n\x17\x63ustom_placement_config\x18\x1a \x01(\x0b\x32/.google.storage.v2.Bucket.CustomPlacementConfigB\x03\xe0\x41\x01\x12;\n\tautoclass\x18\x1c \x01(\x0b\x32#.google.storage.v2.Bucket.AutoclassB\x03\xe0\x41\x01\x12T\n\x16hierarchical_namespace\x18 \x01(\x0b\x32/.google.storage.v2.Bucket.HierarchicalNamespaceB\x03\xe0\x41\x01\x12K\n\x12soft_delete_policy\x18\x1f \x01(\x0b\x32*.google.storage.v2.Bucket.SoftDeletePolicyB\x03\xe0\x41\x01\x12H\n\x10object_retention\x18! \x01(\x0b\x32).google.storage.v2.Bucket.ObjectRetentionB\x03\xe0\x41\x01\x12?\n\tip_filter\x18& \x01(\x0b\x32\".google.storage.v2.Bucket.IpFilterB\x03\xe0\x41\x01H\x00\x88\x01\x01\x1a&\n\x07\x42illing\x12\x1b\n\x0erequester_pays\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x1al\n\x04\x43ors\x12\x13\n\x06origin\x18\x01 \x03(\tB\x03\xe0\x41\x01\x12\x13\n\x06method\x18\x02 \x03(\tB\x03\xe0\x41\x01\x12\x1c\n\x0fresponse_header\x18\x03 \x03(\tB\x03\xe0\x41\x01\x12\x1c\n\x0fmax_age_seconds\x18\x04 \x01(\x05\x42\x03\xe0\x41\x01\x1a\xae\t\n\nEncryption\x12\x42\n\x0f\x64\x65\x66\x61ult_kms_key\x18\x01 \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x8d\x01\n,google_managed_encryption_enforcement_config\x18\x02 \x01(\x0b\x32M.google.storage.v2.Bucket.Encryption.GoogleManagedEncryptionEnforcementConfigB\x03\xe0\x41\x01H\x00\x88\x01\x01\x12\x91\x01\n.customer_managed_encryption_enforcement_config\x18\x03 \x01(\x0b\x32O.google.storage.v2.Bucket.Encryption.CustomerManagedEncryptionEnforcementConfigB\x03\xe0\x41\x01H\x01\x88\x01\x01\x12\x93\x01\n/customer_supplied_encryption_enforcement_config\x18\x04 \x01(\x0b\x32P.google.storage.v2.Bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfigB\x03\xe0\x41\x01H\x02\x88\x01\x01\x1a\xaa\x01\n(GoogleManagedEncryptionEnforcementConfig\x12\x1d\n\x10restriction_mode\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x13\n\x11_restriction_modeB\x11\n\x0f_effective_time\x1a\xac\x01\n*CustomerManagedEncryptionEnforcementConfig\x12\x1d\n\x10restriction_mode\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x13\n\x11_restriction_modeB\x11\n\x0f_effective_time\x1a\xad\x01\n+CustomerSuppliedEncryptionEnforcementConfig\x12\x1d\n\x10restriction_mode\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x13\n\x11_restriction_modeB\x11\n\x0f_effective_timeB/\n-_google_managed_encryption_enforcement_configB1\n/_customer_managed_encryption_enforcement_configB2\n0_customer_supplied_encryption_enforcement_config\x1a\x80\x02\n\tIamConfig\x12\x66\n\x1buniform_bucket_level_access\x18\x01 \x01(\x0b\x32<.google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccessB\x03\xe0\x41\x01\x12%\n\x18public_access_prevention\x18\x03 \x01(\tB\x03\xe0\x41\x01\x1a\x64\n\x18UniformBucketLevelAccess\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x12\x32\n\tlock_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x1a\xaa\x06\n\tLifecycle\x12;\n\x04rule\x18\x01 \x03(\x0b\x32(.google.storage.v2.Bucket.Lifecycle.RuleB\x03\xe0\x41\x01\x1a\xdf\x05\n\x04Rule\x12\x44\n\x06\x61\x63tion\x18\x01 \x01(\x0b\x32/.google.storage.v2.Bucket.Lifecycle.Rule.ActionB\x03\xe0\x41\x01\x12J\n\tcondition\x18\x02 \x01(\x0b\x32\x32.google.storage.v2.Bucket.Lifecycle.Rule.ConditionB\x03\xe0\x41\x01\x1a\x37\n\x06\x41\x63tion\x12\x11\n\x04type\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1a\n\rstorage_class\x18\x02 \x01(\tB\x03\xe0\x41\x01\x1a\x8b\x04\n\tCondition\x12\x15\n\x08\x61ge_days\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12.\n\x0e\x63reated_before\x18\x02 \x01(\x0b\x32\x11.google.type.DateB\x03\xe0\x41\x01\x12\x14\n\x07is_live\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12num_newer_versions\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\"\n\x15matches_storage_class\x18\x05 \x03(\tB\x03\xe0\x41\x01\x12#\n\x16\x64\x61ys_since_custom_time\x18\x07 \x01(\x05H\x03\x88\x01\x01\x12\x32\n\x12\x63ustom_time_before\x18\x08 \x01(\x0b\x32\x11.google.type.DateB\x03\xe0\x41\x01\x12\'\n\x1a\x64\x61ys_since_noncurrent_time\x18\t \x01(\x05H\x04\x88\x01\x01\x12\x36\n\x16noncurrent_time_before\x18\n \x01(\x0b\x32\x11.google.type.DateB\x03\xe0\x41\x01\x12\x1b\n\x0ematches_prefix\x18\x0b \x03(\tB\x03\xe0\x41\x01\x12\x1b\n\x0ematches_suffix\x18\x0c \x03(\tB\x03\xe0\x41\x01\x42\x0b\n\t_age_daysB\n\n\x08_is_liveB\x15\n\x13_num_newer_versionsB\x19\n\x17_days_since_custom_timeB\x1d\n\x1b_days_since_noncurrent_time\x1a\x42\n\x07Logging\x12\x17\n\nlog_bucket\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1e\n\x11log_object_prefix\x18\x02 \x01(\tB\x03\xe0\x41\x01\x1a*\n\x0fObjectRetention\x12\x17\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x06\xe0\x41\x01\xe0\x41\x03\x1a\x9e\x01\n\x0fRetentionPolicy\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x12\x16\n\tis_locked\x18\x02 \x01(\x08\x42\x03\xe0\x41\x01\x12:\n\x12retention_duration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationB\x03\xe0\x41\x01\x1a\xb1\x01\n\x10SoftDeletePolicy\x12:\n\x12retention_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x15\n\x13_retention_durationB\x11\n\x0f_effective_time\x1a\"\n\nVersioning\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x1a\x45\n\x07Website\x12\x1d\n\x10main_page_suffix\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1b\n\x0enot_found_page\x18\x02 \x01(\tB\x03\xe0\x41\x01\x1a\x34\n\x15\x43ustomPlacementConfig\x12\x1b\n\x0e\x64\x61ta_locations\x18\x01 \x03(\tB\x03\xe0\x41\x01\x1a\x90\x02\n\tAutoclass\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x12\x34\n\x0btoggle_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12#\n\x16terminal_storage_class\x18\x03 \x01(\tH\x00\x88\x01\x01\x12P\n\"terminal_storage_class_update_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x01\x88\x01\x01\x42\x19\n\x17_terminal_storage_classB%\n#_terminal_storage_class_update_time\x1a\xfd\x03\n\x08IpFilter\x12\x11\n\x04mode\x18\x01 \x01(\tH\x00\x88\x01\x01\x12Z\n\x15public_network_source\x18\x02 \x01(\x0b\x32\x36.google.storage.v2.Bucket.IpFilter.PublicNetworkSourceH\x01\x88\x01\x01\x12U\n\x13vpc_network_sources\x18\x03 \x03(\x0b\x32\x33.google.storage.v2.Bucket.IpFilter.VpcNetworkSourceB\x03\xe0\x41\x01\x12!\n\x14\x61llow_cross_org_vpcs\x18\x04 \x01(\x08\x42\x03\xe0\x41\x01\x12+\n\x1e\x61llow_all_service_agent_access\x18\x05 \x01(\x08H\x02\x88\x01\x01\x1a:\n\x13PublicNetworkSource\x12#\n\x16\x61llowed_ip_cidr_ranges\x18\x01 \x03(\tB\x03\xe0\x41\x01\x1aY\n\x10VpcNetworkSource\x12\x14\n\x07network\x18\x01 \x01(\tH\x00\x88\x01\x01\x12#\n\x16\x61llowed_ip_cidr_ranges\x18\x02 \x03(\tB\x03\xe0\x41\x01\x42\n\n\x08_networkB\x07\n\x05_modeB\x18\n\x16_public_network_sourceB!\n\x1f_allow_all_service_agent_access\x1a-\n\x15HierarchicalNamespace\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x03\xe0\x41\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:X\xea\x41U\n\x1dstorage.googleapis.com/Bucket\x12#projects/{project}/buckets/{bucket}*\x07\x62uckets2\x06\x62ucketB\x0c\n\n_ip_filter\"\xf6\x01\n\x13\x42ucketAccessControl\x12\x11\n\x04role\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x0f\n\x02id\x18\x02 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x65ntity\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x17\n\nentity_alt\x18\t \x01(\tB\x03\xe0\x41\x03\x12\x16\n\tentity_id\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04\x65tag\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12\x12\n\x05\x65mail\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x64omain\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12\x39\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeamB\x03\xe0\x41\x01\"I\n\x0f\x43hecksummedData\x12\x16\n\x07\x63ontent\x18\x01 \x01(\x0c\x42\x05\x08\x01\xe0\x41\x01\x12\x13\n\x06\x63rc32c\x18\x02 \x01(\x07H\x00\x88\x01\x01\x42\t\n\x07_crc32c\"H\n\x0fObjectChecksums\x12\x13\n\x06\x63rc32c\x18\x01 \x01(\x07H\x00\x88\x01\x01\x12\x15\n\x08md5_hash\x18\x02 \x01(\x0c\x42\x03\xe0\x41\x01\x42\t\n\x07_crc32c\"\x9c\x01\n\x1aObjectCustomContextPayload\x12\x12\n\x05value\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x34\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x34\n\x0bupdate_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\"\xb2\x01\n\x0eObjectContexts\x12\x42\n\x06\x63ustom\x18\x01 \x03(\x0b\x32-.google.storage.v2.ObjectContexts.CustomEntryB\x03\xe0\x41\x01\x1a\\\n\x0b\x43ustomEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12<\n\x05value\x18\x02 \x01(\x0b\x32-.google.storage.v2.ObjectCustomContextPayload:\x02\x38\x01\"V\n\x12\x43ustomerEncryption\x12!\n\x14\x65ncryption_algorithm\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x1d\n\x10key_sha256_bytes\x18\x03 \x01(\x0c\x42\x03\xe0\x41\x01\"\x91\x0e\n\x06Object\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x05\x12\x35\n\x06\x62ucket\x18\x02 \x01(\tB%\xe0\x41\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x11\n\x04\x65tag\x18\x1b \x01(\tB\x03\xe0\x41\x01\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x05\x12\x1f\n\rrestore_token\x18# \x01(\tB\x03\xe0\x41\x03H\x00\x88\x01\x01\x12\x1b\n\x0emetageneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x03\x12\x1a\n\rstorage_class\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04size\x18\x06 \x01(\x03\x42\x03\xe0\x41\x03\x12\x1d\n\x10\x63ontent_encoding\x18\x07 \x01(\tB\x03\xe0\x41\x01\x12 \n\x13\x63ontent_disposition\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12\x1a\n\rcache_control\x18\t \x01(\tB\x03\xe0\x41\x01\x12\x38\n\x03\x61\x63l\x18\n \x03(\x0b\x32&.google.storage.v2.ObjectAccessControlB\x03\xe0\x41\x01\x12\x1d\n\x10\x63ontent_language\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0b\x64\x65lete_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x36\n\rfinalize_time\x18$ \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x19\n\x0c\x63ontent_type\x18\r \x01(\tB\x03\xe0\x41\x01\x12\x34\n\x0b\x63reate_time\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x1c\n\x0f\x63omponent_count\x18\x0f \x01(\x05\x42\x03\xe0\x41\x03\x12:\n\tchecksums\x18\x10 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x03\x12\x34\n\x0bupdate_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12:\n\x07kms_key\x18\x12 \x01(\tB)\xe0\x41\x01\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x42\n\x19update_storage_class_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x1b\n\x0etemporary_hold\x18\x14 \x01(\x08\x42\x03\xe0\x41\x01\x12>\n\x15retention_expire_time\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x12>\n\x08metadata\x18\x16 \x03(\x0b\x32\'.google.storage.v2.Object.MetadataEntryB\x03\xe0\x41\x01\x12\x38\n\x08\x63ontexts\x18& \x01(\x0b\x32!.google.storage.v2.ObjectContextsB\x03\xe0\x41\x01\x12\x1d\n\x10\x65vent_based_hold\x18\x17 \x01(\x08H\x01\x88\x01\x01\x12,\n\x05owner\x18\x18 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x03\xe0\x41\x03\x12G\n\x13\x63ustomer_encryption\x18\x19 \x01(\x0b\x32%.google.storage.v2.CustomerEncryptionB\x03\xe0\x41\x01\x12\x34\n\x0b\x63ustom_time\x18\x1a \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\x12>\n\x10soft_delete_time\x18\x1c \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x02\x88\x01\x01\x12>\n\x10hard_delete_time\x18\x1d \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x03\x88\x01\x01\x12;\n\tretention\x18\x1e \x01(\x0b\x32#.google.storage.v2.Object.RetentionB\x03\xe0\x41\x01\x1a\xbc\x01\n\tRetention\x12;\n\x04mode\x18\x01 \x01(\x0e\x32(.google.storage.v2.Object.Retention.ModeB\x03\xe0\x41\x01\x12:\n\x11retain_until_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x01\"6\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x0c\n\x08UNLOCKED\x10\x01\x12\n\n\x06LOCKED\x10\x02\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x10\n\x0e_restore_tokenB\x13\n\x11_event_based_holdB\x13\n\x11_soft_delete_timeB\x13\n\x11_hard_delete_time\"\xf6\x01\n\x13ObjectAccessControl\x12\x11\n\x04role\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x0f\n\x02id\x18\x02 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x65ntity\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x17\n\nentity_alt\x18\t \x01(\tB\x03\xe0\x41\x03\x12\x16\n\tentity_id\x18\x04 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04\x65tag\x18\x08 \x01(\tB\x03\xe0\x41\x01\x12\x12\n\x05\x65mail\x18\x05 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x64omain\x18\x06 \x01(\tB\x03\xe0\x41\x01\x12\x39\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeamB\x03\xe0\x41\x01\"l\n\x13ListObjectsResponse\x12*\n\x07objects\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Object\x12\x10\n\x08prefixes\x18\x02 \x03(\t\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\t\"=\n\x0bProjectTeam\x12\x1b\n\x0eproject_number\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x11\n\x04team\x18\x02 \x01(\tB\x03\xe0\x41\x01\"4\n\x05Owner\x12\x13\n\x06\x65ntity\x18\x01 \x01(\tB\x03\xe0\x41\x01\x12\x16\n\tentity_id\x18\x02 \x01(\tB\x03\xe0\x41\x01\"C\n\x0c\x43ontentRange\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x17\n\x0f\x63omplete_length\x18\x03 \x01(\x03\x32\x9f\x1f\n\x07Storage\x12r\n\x0c\x44\x65leteBucket\x12&.google.storage.v2.DeleteBucketRequest\x1a\x16.google.protobuf.Empty\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12o\n\tGetBucket\x12#.google.storage.v2.GetBucketRequest\x1a\x19.google.storage.v2.Bucket\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12\xab\x01\n\x0c\x43reateBucket\x12&.google.storage.v2.CreateBucketRequest\x1a\x19.google.storage.v2.Bucket\"X\xda\x41\x17parent,bucket,bucket_id\x8a\xd3\xe4\x93\x02\x38\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x1e\n\x0e\x62ucket.project\x12\x0c{project=**}\x12\x85\x01\n\x0bListBuckets\x12%.google.storage.v2.ListBucketsRequest\x1a&.google.storage.v2.ListBucketsResponse\"\'\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x18\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x93\x01\n\x19LockBucketRetentionPolicy\x12\x33.google.storage.v2.LockBucketRetentionPolicyRequest\x1a\x19.google.storage.v2.Bucket\"&\xda\x41\x06\x62ucket\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xa3\x01\n\x0cGetIamPolicy\x12\".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"X\xda\x41\x08resource\x8a\xd3\xe4\x93\x02G\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12,\n\x08resource\x12 {bucket=projects/*/buckets/*}/**\x12\xaa\x01\n\x0cSetIamPolicy\x12\".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"_\xda\x41\x0fresource,policy\x8a\xd3\xe4\x93\x02G\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12,\n\x08resource\x12 {bucket=projects/*/buckets/*}/**\x12\x96\x02\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse\"\xaa\x01\xda\x41\x14resource,permissions\x8a\xd3\xe4\x93\x02\x8c\x01\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\x34\n\x08resource\x12({bucket=projects/*/buckets/*}/objects/**\x12;\n\x08resource\x12/{bucket=projects/*/buckets/*}/managedFolders/**\x12\x8a\x01\n\x0cUpdateBucket\x12&.google.storage.v2.UpdateBucketRequest\x1a\x19.google.storage.v2.Bucket\"7\xda\x41\x12\x62ucket,update_mask\x8a\xd3\xe4\x93\x02\x1c\x12\x1a\n\x0b\x62ucket.name\x12\x0b{bucket=**}\x12~\n\rComposeObject\x12\'.google.storage.v2.ComposeObjectRequest\x1a\x19.google.storage.v2.Object\")\x8a\xd3\xe4\x93\x02#\x12!\n\x12\x64\x65stination.bucket\x12\x0b{bucket=**}\x12\x98\x01\n\x0c\x44\x65leteObject\x12&.google.storage.v2.DeleteObjectRequest\x1a\x16.google.protobuf.Empty\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\x8d\x01\n\rRestoreObject\x12\'.google.storage.v2.RestoreObjectRequest\x1a\x19.google.storage.v2.Object\"8\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xba\x01\n\x14\x43\x61ncelResumableWrite\x12..google.storage.v2.CancelResumableWriteRequest\x1a/.google.storage.v2.CancelResumableWriteResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x95\x01\n\tGetObject\x12#.google.storage.v2.GetObjectRequest\x1a\x19.google.storage.v2.Object\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xa5\x01\n\nReadObject\x12$.google.storage.v2.ReadObjectRequest\x1a%.google.storage.v2.ReadObjectResponse\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}0\x01\x12\x99\x01\n\x0e\x42idiReadObject\x12(.google.storage.v2.BidiReadObjectRequest\x1a).google.storage.v2.BidiReadObjectResponse\".\x8a\xd3\xe4\x93\x02(\x12&\n\x17read_object_spec.bucket\x12\x0b{bucket=**}(\x01\x30\x01\x12\x8c\x01\n\x0cUpdateObject\x12&.google.storage.v2.UpdateObjectRequest\x1a\x19.google.storage.v2.Object\"9\xda\x41\x12object,update_mask\x8a\xd3\xe4\x93\x02\x1e\x12\x1c\n\robject.bucket\x12\x0b{bucket=**}\x12`\n\x0bWriteObject\x12%.google.storage.v2.WriteObjectRequest\x1a&.google.storage.v2.WriteObjectResponse\"\x00(\x01\x12n\n\x0f\x42idiWriteObject\x12).google.storage.v2.BidiWriteObjectRequest\x1a*.google.storage.v2.BidiWriteObjectResponse\"\x00(\x01\x30\x01\x12\x84\x01\n\x0bListObjects\x12%.google.storage.v2.ListObjectsRequest\x1a&.google.storage.v2.ListObjectsResponse\"&\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12\x98\x01\n\rRewriteObject\x12\'.google.storage.v2.RewriteObjectRequest\x1a\".google.storage.v2.RewriteResponse\":\x8a\xd3\xe4\x93\x02\x34\x12\x0f\n\rsource_bucket\x12!\n\x12\x64\x65stination_bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x13StartResumableWrite\x12-.google.storage.v2.StartResumableWriteRequest\x1a..google.storage.v2.StartResumableWriteResponse\"8\x8a\xd3\xe4\x93\x02\x32\x12\x30\n!write_object_spec.resource.bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x10QueryWriteStatus\x12*.google.storage.v2.QueryWriteStatusRequest\x1a+.google.storage.v2.QueryWriteStatusResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x96\x01\n\nMoveObject\x12$.google.storage.v2.MoveObjectRequest\x1a\x19.google.storage.v2.Object\"G\xda\x41\'bucket,source_object,destination_object\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x1a\xa7\x02\xca\x41\x16storage.googleapis.com\xd2\x41\x8a\x02https://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_writeB\xe2\x01\n\x15\x63om.google.storage.v2B\x0cStorageProtoP\x01Z>cloud.google.com/go/storage/internal/apiv2/storagepb;storagepb\xea\x41x\n!cloudkms.googleapis.com/CryptoKey\x12Sprojects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -704,122 +704,122 @@ _globals['_WRITEOBJECTSPEC']._serialized_end=7691 _globals['_WRITEOBJECTREQUEST']._serialized_start=7694 _globals['_WRITEOBJECTREQUEST']._serialized_end=8099 - _globals['_WRITEOBJECTRESPONSE']._serialized_start=8101 - _globals['_WRITEOBJECTRESPONSE']._serialized_end=8211 - _globals['_APPENDOBJECTSPEC']._serialized_start=8214 - _globals['_APPENDOBJECTSPEC']._serialized_end=8599 - _globals['_BIDIWRITEOBJECTREQUEST']._serialized_start=8602 - _globals['_BIDIWRITEOBJECTREQUEST']._serialized_end=9125 - _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_start=9128 - _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_end=9322 - _globals['_LISTOBJECTSREQUEST']._serialized_start=9325 - _globals['_LISTOBJECTSREQUEST']._serialized_end=9805 - _globals['_QUERYWRITESTATUSREQUEST']._serialized_start=9808 - _globals['_QUERYWRITESTATUSREQUEST']._serialized_end=9946 - _globals['_QUERYWRITESTATUSRESPONSE']._serialized_start=9948 - _globals['_QUERYWRITESTATUSRESPONSE']._serialized_end=10063 - _globals['_REWRITEOBJECTREQUEST']._serialized_start=10066 - _globals['_REWRITEOBJECTREQUEST']._serialized_end=11439 - _globals['_REWRITERESPONSE']._serialized_start=11442 - _globals['_REWRITERESPONSE']._serialized_end=11593 - _globals['_MOVEOBJECTREQUEST']._serialized_start=11596 - _globals['_MOVEOBJECTREQUEST']._serialized_end=12355 - _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_start=12358 - _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_end=12610 - _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_start=12612 - _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_end=12660 - _globals['_UPDATEOBJECTREQUEST']._serialized_start=12663 - _globals['_UPDATEOBJECTREQUEST']._serialized_end=13210 - _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_start=13213 - _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_end=13352 - _globals['_SERVICECONSTANTS']._serialized_start=13355 - _globals['_SERVICECONSTANTS']._serialized_end=14069 - _globals['_SERVICECONSTANTS_VALUES']._serialized_start=13376 - _globals['_SERVICECONSTANTS_VALUES']._serialized_end=14069 - _globals['_BUCKET']._serialized_start=14072 - _globals['_BUCKET']._serialized_end=19762 - _globals['_BUCKET_BILLING']._serialized_start=15742 - _globals['_BUCKET_BILLING']._serialized_end=15780 - _globals['_BUCKET_CORS']._serialized_start=15782 - _globals['_BUCKET_CORS']._serialized_end=15890 - _globals['_BUCKET_ENCRYPTION']._serialized_start=15893 - _globals['_BUCKET_ENCRYPTION']._serialized_end=17091 - _globals['_BUCKET_ENCRYPTION_GOOGLEMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_start=16418 - _globals['_BUCKET_ENCRYPTION_GOOGLEMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_end=16588 - _globals['_BUCKET_ENCRYPTION_CUSTOMERMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_start=16591 - _globals['_BUCKET_ENCRYPTION_CUSTOMERMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_end=16763 - _globals['_BUCKET_ENCRYPTION_CUSTOMERSUPPLIEDENCRYPTIONENFORCEMENTCONFIG']._serialized_start=16766 - _globals['_BUCKET_ENCRYPTION_CUSTOMERSUPPLIEDENCRYPTIONENFORCEMENTCONFIG']._serialized_end=16939 - _globals['_BUCKET_IAMCONFIG']._serialized_start=17094 - _globals['_BUCKET_IAMCONFIG']._serialized_end=17350 - _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_start=17250 - _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_end=17350 - _globals['_BUCKET_LIFECYCLE']._serialized_start=17353 - _globals['_BUCKET_LIFECYCLE']._serialized_end=18163 - _globals['_BUCKET_LIFECYCLE_RULE']._serialized_start=17428 - _globals['_BUCKET_LIFECYCLE_RULE']._serialized_end=18163 - _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_start=17582 - _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_end=17637 - _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_start=17640 - _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_end=18163 - _globals['_BUCKET_LOGGING']._serialized_start=18165 - _globals['_BUCKET_LOGGING']._serialized_end=18231 - _globals['_BUCKET_OBJECTRETENTION']._serialized_start=18233 - _globals['_BUCKET_OBJECTRETENTION']._serialized_end=18275 - _globals['_BUCKET_RETENTIONPOLICY']._serialized_start=18278 - _globals['_BUCKET_RETENTIONPOLICY']._serialized_end=18436 - _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_start=18439 - _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_end=18616 - _globals['_BUCKET_VERSIONING']._serialized_start=18618 - _globals['_BUCKET_VERSIONING']._serialized_end=18652 - _globals['_BUCKET_WEBSITE']._serialized_start=18654 - _globals['_BUCKET_WEBSITE']._serialized_end=18723 - _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_start=18725 - _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_end=18777 - _globals['_BUCKET_AUTOCLASS']._serialized_start=18780 - _globals['_BUCKET_AUTOCLASS']._serialized_end=19052 - _globals['_BUCKET_IPFILTER']._serialized_start=19055 - _globals['_BUCKET_IPFILTER']._serialized_end=19564 - _globals['_BUCKET_IPFILTER_PUBLICNETWORKSOURCE']._serialized_start=19345 - _globals['_BUCKET_IPFILTER_PUBLICNETWORKSOURCE']._serialized_end=19403 - _globals['_BUCKET_IPFILTER_VPCNETWORKSOURCE']._serialized_start=19405 - _globals['_BUCKET_IPFILTER_VPCNETWORKSOURCE']._serialized_end=19494 - _globals['_BUCKET_HIERARCHICALNAMESPACE']._serialized_start=19566 - _globals['_BUCKET_HIERARCHICALNAMESPACE']._serialized_end=19611 - _globals['_BUCKET_LABELSENTRY']._serialized_start=19613 - _globals['_BUCKET_LABELSENTRY']._serialized_end=19658 - _globals['_BUCKETACCESSCONTROL']._serialized_start=19765 - _globals['_BUCKETACCESSCONTROL']._serialized_end=20011 - _globals['_CHECKSUMMEDDATA']._serialized_start=20013 - _globals['_CHECKSUMMEDDATA']._serialized_end=20086 - _globals['_OBJECTCHECKSUMS']._serialized_start=20088 - _globals['_OBJECTCHECKSUMS']._serialized_end=20160 - _globals['_OBJECTCUSTOMCONTEXTPAYLOAD']._serialized_start=20163 - _globals['_OBJECTCUSTOMCONTEXTPAYLOAD']._serialized_end=20319 - _globals['_OBJECTCONTEXTS']._serialized_start=20322 - _globals['_OBJECTCONTEXTS']._serialized_end=20500 - _globals['_OBJECTCONTEXTS_CUSTOMENTRY']._serialized_start=20408 - _globals['_OBJECTCONTEXTS_CUSTOMENTRY']._serialized_end=20500 - _globals['_CUSTOMERENCRYPTION']._serialized_start=20502 - _globals['_CUSTOMERENCRYPTION']._serialized_end=20588 - _globals['_OBJECT']._serialized_start=20591 - _globals['_OBJECT']._serialized_end=22400 - _globals['_OBJECT_RETENTION']._serialized_start=22082 - _globals['_OBJECT_RETENTION']._serialized_end=22270 - _globals['_OBJECT_RETENTION_MODE']._serialized_start=22216 - _globals['_OBJECT_RETENTION_MODE']._serialized_end=22270 - _globals['_OBJECT_METADATAENTRY']._serialized_start=22272 - _globals['_OBJECT_METADATAENTRY']._serialized_end=22319 - _globals['_OBJECTACCESSCONTROL']._serialized_start=22403 - _globals['_OBJECTACCESSCONTROL']._serialized_end=22649 - _globals['_LISTOBJECTSRESPONSE']._serialized_start=22651 - _globals['_LISTOBJECTSRESPONSE']._serialized_end=22759 - _globals['_PROJECTTEAM']._serialized_start=22761 - _globals['_PROJECTTEAM']._serialized_end=22822 - _globals['_OWNER']._serialized_start=22824 - _globals['_OWNER']._serialized_end=22876 - _globals['_CONTENTRANGE']._serialized_start=22878 - _globals['_CONTENTRANGE']._serialized_end=22945 - _globals['_STORAGE']._serialized_start=22948 - _globals['_STORAGE']._serialized_end=26947 + _globals['_WRITEOBJECTRESPONSE']._serialized_start=8102 + _globals['_WRITEOBJECTRESPONSE']._serialized_end=8282 + _globals['_APPENDOBJECTSPEC']._serialized_start=8285 + _globals['_APPENDOBJECTSPEC']._serialized_end=8670 + _globals['_BIDIWRITEOBJECTREQUEST']._serialized_start=8673 + _globals['_BIDIWRITEOBJECTREQUEST']._serialized_end=9196 + _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_start=9199 + _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_end=9463 + _globals['_LISTOBJECTSREQUEST']._serialized_start=9466 + _globals['_LISTOBJECTSREQUEST']._serialized_end=9946 + _globals['_QUERYWRITESTATUSREQUEST']._serialized_start=9949 + _globals['_QUERYWRITESTATUSREQUEST']._serialized_end=10087 + _globals['_QUERYWRITESTATUSRESPONSE']._serialized_start=10090 + _globals['_QUERYWRITESTATUSRESPONSE']._serialized_end=10275 + _globals['_REWRITEOBJECTREQUEST']._serialized_start=10278 + _globals['_REWRITEOBJECTREQUEST']._serialized_end=11651 + _globals['_REWRITERESPONSE']._serialized_start=11654 + _globals['_REWRITERESPONSE']._serialized_end=11805 + _globals['_MOVEOBJECTREQUEST']._serialized_start=11808 + _globals['_MOVEOBJECTREQUEST']._serialized_end=12567 + _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_start=12570 + _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_end=12822 + _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_start=12824 + _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_end=12872 + _globals['_UPDATEOBJECTREQUEST']._serialized_start=12875 + _globals['_UPDATEOBJECTREQUEST']._serialized_end=13422 + _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_start=13425 + _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_end=13564 + _globals['_SERVICECONSTANTS']._serialized_start=13567 + _globals['_SERVICECONSTANTS']._serialized_end=14281 + _globals['_SERVICECONSTANTS_VALUES']._serialized_start=13588 + _globals['_SERVICECONSTANTS_VALUES']._serialized_end=14281 + _globals['_BUCKET']._serialized_start=14284 + _globals['_BUCKET']._serialized_end=19974 + _globals['_BUCKET_BILLING']._serialized_start=15954 + _globals['_BUCKET_BILLING']._serialized_end=15992 + _globals['_BUCKET_CORS']._serialized_start=15994 + _globals['_BUCKET_CORS']._serialized_end=16102 + _globals['_BUCKET_ENCRYPTION']._serialized_start=16105 + _globals['_BUCKET_ENCRYPTION']._serialized_end=17303 + _globals['_BUCKET_ENCRYPTION_GOOGLEMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_start=16630 + _globals['_BUCKET_ENCRYPTION_GOOGLEMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_end=16800 + _globals['_BUCKET_ENCRYPTION_CUSTOMERMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_start=16803 + _globals['_BUCKET_ENCRYPTION_CUSTOMERMANAGEDENCRYPTIONENFORCEMENTCONFIG']._serialized_end=16975 + _globals['_BUCKET_ENCRYPTION_CUSTOMERSUPPLIEDENCRYPTIONENFORCEMENTCONFIG']._serialized_start=16978 + _globals['_BUCKET_ENCRYPTION_CUSTOMERSUPPLIEDENCRYPTIONENFORCEMENTCONFIG']._serialized_end=17151 + _globals['_BUCKET_IAMCONFIG']._serialized_start=17306 + _globals['_BUCKET_IAMCONFIG']._serialized_end=17562 + _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_start=17462 + _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_end=17562 + _globals['_BUCKET_LIFECYCLE']._serialized_start=17565 + _globals['_BUCKET_LIFECYCLE']._serialized_end=18375 + _globals['_BUCKET_LIFECYCLE_RULE']._serialized_start=17640 + _globals['_BUCKET_LIFECYCLE_RULE']._serialized_end=18375 + _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_start=17794 + _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_end=17849 + _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_start=17852 + _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_end=18375 + _globals['_BUCKET_LOGGING']._serialized_start=18377 + _globals['_BUCKET_LOGGING']._serialized_end=18443 + _globals['_BUCKET_OBJECTRETENTION']._serialized_start=18445 + _globals['_BUCKET_OBJECTRETENTION']._serialized_end=18487 + _globals['_BUCKET_RETENTIONPOLICY']._serialized_start=18490 + _globals['_BUCKET_RETENTIONPOLICY']._serialized_end=18648 + _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_start=18651 + _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_end=18828 + _globals['_BUCKET_VERSIONING']._serialized_start=18830 + _globals['_BUCKET_VERSIONING']._serialized_end=18864 + _globals['_BUCKET_WEBSITE']._serialized_start=18866 + _globals['_BUCKET_WEBSITE']._serialized_end=18935 + _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_start=18937 + _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_end=18989 + _globals['_BUCKET_AUTOCLASS']._serialized_start=18992 + _globals['_BUCKET_AUTOCLASS']._serialized_end=19264 + _globals['_BUCKET_IPFILTER']._serialized_start=19267 + _globals['_BUCKET_IPFILTER']._serialized_end=19776 + _globals['_BUCKET_IPFILTER_PUBLICNETWORKSOURCE']._serialized_start=19557 + _globals['_BUCKET_IPFILTER_PUBLICNETWORKSOURCE']._serialized_end=19615 + _globals['_BUCKET_IPFILTER_VPCNETWORKSOURCE']._serialized_start=19617 + _globals['_BUCKET_IPFILTER_VPCNETWORKSOURCE']._serialized_end=19706 + _globals['_BUCKET_HIERARCHICALNAMESPACE']._serialized_start=19778 + _globals['_BUCKET_HIERARCHICALNAMESPACE']._serialized_end=19823 + _globals['_BUCKET_LABELSENTRY']._serialized_start=19825 + _globals['_BUCKET_LABELSENTRY']._serialized_end=19870 + _globals['_BUCKETACCESSCONTROL']._serialized_start=19977 + _globals['_BUCKETACCESSCONTROL']._serialized_end=20223 + _globals['_CHECKSUMMEDDATA']._serialized_start=20225 + _globals['_CHECKSUMMEDDATA']._serialized_end=20298 + _globals['_OBJECTCHECKSUMS']._serialized_start=20300 + _globals['_OBJECTCHECKSUMS']._serialized_end=20372 + _globals['_OBJECTCUSTOMCONTEXTPAYLOAD']._serialized_start=20375 + _globals['_OBJECTCUSTOMCONTEXTPAYLOAD']._serialized_end=20531 + _globals['_OBJECTCONTEXTS']._serialized_start=20534 + _globals['_OBJECTCONTEXTS']._serialized_end=20712 + _globals['_OBJECTCONTEXTS_CUSTOMENTRY']._serialized_start=20620 + _globals['_OBJECTCONTEXTS_CUSTOMENTRY']._serialized_end=20712 + _globals['_CUSTOMERENCRYPTION']._serialized_start=20714 + _globals['_CUSTOMERENCRYPTION']._serialized_end=20800 + _globals['_OBJECT']._serialized_start=20803 + _globals['_OBJECT']._serialized_end=22612 + _globals['_OBJECT_RETENTION']._serialized_start=22294 + _globals['_OBJECT_RETENTION']._serialized_end=22482 + _globals['_OBJECT_RETENTION_MODE']._serialized_start=22428 + _globals['_OBJECT_RETENTION_MODE']._serialized_end=22482 + _globals['_OBJECT_METADATAENTRY']._serialized_start=22484 + _globals['_OBJECT_METADATAENTRY']._serialized_end=22531 + _globals['_OBJECTACCESSCONTROL']._serialized_start=22615 + _globals['_OBJECTACCESSCONTROL']._serialized_end=22861 + _globals['_LISTOBJECTSRESPONSE']._serialized_start=22863 + _globals['_LISTOBJECTSRESPONSE']._serialized_end=22971 + _globals['_PROJECTTEAM']._serialized_start=22973 + _globals['_PROJECTTEAM']._serialized_end=23034 + _globals['_OWNER']._serialized_start=23036 + _globals['_OWNER']._serialized_end=23088 + _globals['_CONTENTRANGE']._serialized_start=23090 + _globals['_CONTENTRANGE']._serialized_end=23157 + _globals['_STORAGE']._serialized_start=23160 + _globals['_STORAGE']._serialized_end=27159 # @@protoc_insertion_point(module_scope) diff --git a/testbench/grpc_server.py b/testbench/grpc_server.py index 7a408469..9ab5cc4c 100644 --- a/testbench/grpc_server.py +++ b/testbench/grpc_server.py @@ -39,6 +39,7 @@ import gcs import testbench from google.iam.v1 import iam_policy_pb2 +from google.longrunning import operations_pb2 from google.storage.control.v2 import storage_control_pb2, storage_control_pb2_grpc from google.storage.v2 import storage_pb2, storage_pb2_grpc @@ -1236,10 +1237,30 @@ def ListFolders(self, request, context): def RenameFolder(self, request, context): self._apply_stall(context) src_folder = request.name - dst_folder = request.destination_folder_id + + # request.destination_folder_id only contains the relative folder ID + # e.g., src_folder: "projects/_/buckets/my-bucket/folders/my-folder" + # We need to prepend the project/bucket/folders/ prefix. + prefix = src_folder.split("/folders/")[0] + "/folders/" + + # Ensure we don't prepend prefix if the client incorrectly passed a full path + if request.destination_folder_id.startswith("projects/"): + dst_folder = request.destination_folder_id + else: + dst_folder = prefix + request.destination_folder_id folder = self.db.rename_folder(src_folder, dst_folder, context) - return folder + + any_msg = any_pb2.Any() + any_msg.Pack(folder) + + # RenameFolder is an LRO in the production API + op = operations_pb2.Operation( + name=f"projects/_/locations/global/operations/{uuid.uuid4().hex}", + done=True, + response=any_msg, + ) + return op @retry_test(method="storage.storageLayout.get") def GetStorageLayout(self, request, context): diff --git a/tests/test_storage_control_stall.py b/tests/test_storage_control_stall.py index 9b10c31b..42af7585 100644 --- a/tests/test_storage_control_stall.py +++ b/tests/test_storage_control_stall.py @@ -127,10 +127,12 @@ def test_no_stall_behaviors(self): name="projects/_/buckets/test-bucket/folders/rename-src-no-stall", destination_folder_id="projects/_/buckets/test-bucket/folders/rename-dst-no-stall", ), - verify_func=lambda self, res: self.assertEqual( - res.name, - "projects/_/buckets/test-bucket/folders/rename-dst-no-stall", - ), + verify_func=lambda self, res: [ + self.assertTrue(res.done), + self.assertTrue( + res.response.Is(storage_control_pb2.Folder.DESCRIPTOR) + ), + ], ), ApiTestCase( name="get_storage_layout_no_stall", @@ -230,10 +232,12 @@ def test_stall_behaviors(self): name="projects/_/buckets/test-bucket/folders/rename-src-stall-1s", destination_folder_id="projects/_/buckets/test-bucket/folders/rename-dst-stall-1s", ), - verify_func=lambda self, res: self.assertEqual( - res.name, - "projects/_/buckets/test-bucket/folders/rename-dst-stall-1s", - ), + verify_func=lambda self, res: [ + self.assertTrue(res.done), + self.assertTrue( + res.response.Is(storage_control_pb2.Folder.DESCRIPTOR) + ), + ], ), ApiTestCase( name="get_storage_layout_stall_1s", diff --git a/update-protos.sh b/update-protos.sh index 073767e5..a1450c7b 100755 --- a/update-protos.sh +++ b/update-protos.sh @@ -32,6 +32,7 @@ readonly INPUTS=( google/iam/v1/policy.proto google/storage/v2/storage.proto google/storage/control/v2/storage_control.proto + google/longrunning/operations.proto ) readonly INPUTS From e7abae29142f610d53afb0569a8f2b154be3fb12 Mon Sep 17 00:00:00 2001 From: Nitin Garg Date: Tue, 7 Apr 2026 07:25:44 +0000 Subject: [PATCH 3/4] address review comments from PR#776 --- testbench/grpc_server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testbench/grpc_server.py b/testbench/grpc_server.py index 9ab5cc4c..12e70e1a 100644 --- a/testbench/grpc_server.py +++ b/testbench/grpc_server.py @@ -20,6 +20,7 @@ import json import re import sys +import time import types import uuid from collections.abc import Iterable @@ -1179,7 +1180,6 @@ def __init__(self, db, echo_metadata=False): def _apply_stall(self, context): """Check for stall instructions and apply delay if needed.""" - import time instruction = testbench.common.extract_instruction(None, context) if instruction and "stall" in instruction: @@ -1228,7 +1228,7 @@ def ListFolders(self, request, context): self._apply_stall(context) # Extract bucket from parent (format: "projects/_/buckets/{bucket}") bucket_name = request.parent - prefix = request.prefix if hasattr(request, "prefix") else "" + prefix = getattr(request, "prefix", "") folders = self.db.list_folders(bucket_name, prefix, context) return storage_control_pb2.ListFoldersResponse(folders=folders) From 70bb72c519226073e10c3eecc6557d135362b0db Mon Sep 17 00:00:00 2001 From: Nitin Garg Date: Wed, 8 Apr 2026 10:38:12 +0000 Subject: [PATCH 4/4] remove None bucket check from GetStorageLayout as that's never needed --- testbench/grpc_server.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/testbench/grpc_server.py b/testbench/grpc_server.py index 12e70e1a..2ef8443f 100644 --- a/testbench/grpc_server.py +++ b/testbench/grpc_server.py @@ -1270,9 +1270,6 @@ def GetStorageLayout(self, request, context): bucket_path = request.name.replace("/storageLayout", "") bucket = self.db.get_bucket(bucket_path, context) - if bucket is None: - return None - # Create a simple storage layout response layout = storage_control_pb2.StorageLayout() layout.name = request.name