in gslib/gcs_json_api.py [0:0]
def CopyObject(self,
src_obj_metadata,
dst_obj_metadata,
src_generation=None,
canned_acl=None,
preconditions=None,
progress_callback=None,
max_bytes_per_call=None,
encryption_tuple=None,
decryption_tuple=None,
provider=None,
fields=None):
"""See CloudApi class for function doc strings."""
ValidateDstObjectMetadata(dst_obj_metadata)
predefined_acl = None
if canned_acl:
predefined_acl = (apitools_messages.StorageObjectsRewriteRequest.
DestinationPredefinedAclValueValuesEnum(
self._ObjectCannedAclToPredefinedAcl(canned_acl)))
if src_generation:
src_generation = long(src_generation)
if not preconditions:
preconditions = Preconditions()
projection = (apitools_messages.StorageObjectsRewriteRequest.
ProjectionValueValuesEnum.noAcl)
if self._FieldsContainsAclField(fields):
projection = (apitools_messages.StorageObjectsRewriteRequest.
ProjectionValueValuesEnum.full)
global_params = apitools_messages.StandardQueryParameters()
if fields:
# Rewrite returns the resultant object under the 'resource' field.
new_fields = set([
'done',
'objectSize',
'rewriteToken',
'totalBytesRewritten',
])
for field in fields:
new_fields.add('resource/' + field)
global_params.fields = ','.join(set(new_fields))
dec_key_sha256 = None
if decryption_tuple and decryption_tuple.crypto_type == CryptoKeyType.CSEK:
dec_key_sha256 = decryption_tuple.crypto_key_sha256
enc_key_sha256 = None
if encryption_tuple:
if encryption_tuple.crypto_type == CryptoKeyType.CSEK:
enc_key_sha256 = encryption_tuple.crypto_key_sha256
elif encryption_tuple.crypto_type == CryptoKeyType.CMEK:
dst_obj_metadata.kmsKeyName = encryption_tuple.crypto_key
# Check to see if we are resuming a rewrite.
tracker_file_name = GetRewriteTrackerFilePath(src_obj_metadata.bucket,
src_obj_metadata.name,
dst_obj_metadata.bucket,
dst_obj_metadata.name, 'JSON')
rewrite_params_hash = HashRewriteParameters(
src_obj_metadata,
dst_obj_metadata,
projection,
src_generation=src_generation,
gen_match=preconditions.gen_match,
meta_gen_match=preconditions.meta_gen_match,
canned_acl=predefined_acl,
max_bytes_per_call=max_bytes_per_call,
src_dec_key_sha256=dec_key_sha256,
dst_enc_key_sha256=enc_key_sha256,
fields=global_params.fields)
resume_rewrite_token = ReadRewriteTrackerFile(tracker_file_name,
rewrite_params_hash)
crypto_headers = self._RewriteCryptoHeadersFromTuples(
decryption_tuple=decryption_tuple, encryption_tuple=encryption_tuple)
progress_cb_with_timeout = None
try:
last_bytes_written = long(0)
while True:
with self._ApitoolsRequestHeaders(crypto_headers):
apitools_request = apitools_messages.StorageObjectsRewriteRequest(
sourceBucket=src_obj_metadata.bucket,
sourceObject=src_obj_metadata.name,
destinationBucket=dst_obj_metadata.bucket,
# TODO(KMS): Remove the destinationKmsKeyName parameter once the
# API begins pulling key name from the dest obj metadata.
destinationKmsKeyName=dst_obj_metadata.kmsKeyName,
destinationObject=dst_obj_metadata.name,
projection=projection,
object=dst_obj_metadata,
sourceGeneration=src_generation,
ifGenerationMatch=preconditions.gen_match,
ifMetagenerationMatch=preconditions.meta_gen_match,
destinationPredefinedAcl=predefined_acl,
rewriteToken=resume_rewrite_token,
maxBytesRewrittenPerCall=max_bytes_per_call,
userProject=self.user_project)
rewrite_response = self.api_client.objects.Rewrite(
apitools_request, global_params=global_params)
bytes_written = long(rewrite_response.totalBytesRewritten)
if progress_callback and not progress_cb_with_timeout:
progress_cb_with_timeout = ProgressCallbackWithTimeout(
long(rewrite_response.objectSize), progress_callback)
if progress_cb_with_timeout:
progress_cb_with_timeout.Progress(bytes_written - last_bytes_written)
if rewrite_response.done:
break
elif not resume_rewrite_token:
# Save the token and make a tracker file if they don't already exist.
resume_rewrite_token = rewrite_response.rewriteToken
WriteRewriteTrackerFile(tracker_file_name, rewrite_params_hash,
rewrite_response.rewriteToken)
last_bytes_written = bytes_written
DeleteTrackerFile(tracker_file_name)
return rewrite_response.resource
except TRANSLATABLE_APITOOLS_EXCEPTIONS as e:
not_found_exception = CreateNotFoundExceptionForObjectWrite(
self.provider,
dst_obj_metadata.bucket,
src_provider=self.provider,
src_bucket_name=src_obj_metadata.bucket,
src_object_name=src_obj_metadata.name,
src_generation=src_generation)
self._TranslateExceptionAndRaise(e,
bucket_name=dst_obj_metadata.bucket,
object_name=dst_obj_metadata.name,
not_found_exception=not_found_exception)