
    %F                     .   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddl	mZ dd	l	mZ dd
l	mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z"  G d dejF                        Z$y)z@Client for interacting with Google Cloud Storage using gRPC API.    )absolute_import)division)unicode_literals)	cloud_api)errors)download)	grpc_util)metadata_util)upload)client)apis)encryption_util)	gzip_util)tracker_file_util)user_request_args_factory)	copy_util)download_util)
exceptions)log)
properties)scaled_integerc                       e Zd ZdZdZdZ fdZddZdej                  j                  dfdZ	 	 dd	Z	 	 	 dd
Zd Zd Zddej                   j"                  dddfdZddddej&                  j(                  fdZ xZS )GrpcClientWithJsonFallbackzBClient for Google Cloud Storage API using gRPC with JSON fallback.)authenticatedReadbucketOwnerFullControlbucketOwnerReadprivateprojectPrivate
publicRead    c                 8    t         t        |           d | _        y N)superr   __init___gapic_client)self	__class__s    5lib/googlecloudsdk/api_lib/storage/gcs_grpc/client.pyr$   z#GrpcClientWithJsonFallback.__init__9   s    	
$d46D    Nc                 n    | j                   t        j                  ddd|      | _         | j                   S )Nstoragev2T)attempt_direct_pathredact_request_body_reason)r%   	core_apisGetGapicClientInstance)r&   r.   s     r(   _get_gapic_clientz,GrpcClientWithJsonFallback._get_gapic_client=   s=    
 !$;;

"%?	d r)   Fc                    |t        d      |rt        d      |t        j                  j                  k7  rt        d      | j	                          | j
                  j                  j                  | j
                  j                  j                  t        j                  |                  }t        j                  |      S )See super class.z(generation is not supported in gRPC API.z*soft_deleted is not supported in gRPC API.z*fields_scope is not supported in gRPC API.name)
ValueErrorr   FieldsScopeFULLr1   r%   r+   
get_buckettypesGetBucketRequestr	   get_full_bucket_namer
   !get_bucket_resource_from_metadata)r&   bucket_name
generationfields_scopesoft_deletedmetadatas         r(   r9   z%GrpcClientWithJsonFallback.get_bucketK   s     ABBCDDy,,111CDD!!))44  11//< 	2 	
H
 ::8DDr)   c                 &   |st        j                  d      t        |      | j                  kD  r/t        j                  dt        |       d| j                   d      | j	                          g }|D ]  }| j
                  j                  j                  j                  |j                  j                        }|j                  j                  $t        |j                  j                        |_        |j                  |        t        j                  |j                  | j
                  j                        }	t!        |d   dd      %t        j"                  |d   j$                  |	|      }
n|	}
t        j&                  |
|||	       t)        j*                  |j                  j,                        |
_        |j                  j                  |
_        | j
                  j                  j                  ||
|j2                  |j4                  
      }|j6                  rc|j6                  j8                  }|rK|t:        j<                  k7  r8|j>                  t@        jB                  jD                  k(  r|jF                  |_$        |jJ                  |jJ                  |_&        t!        |j6                  dd      }| jO                  |      5  t        jP                  | j
                  jR                  jU                  |            cddd       S # 1 sw Y   yxY w)a  Concatenates a list of objects into a new object.

    Args:
      source_resources (list[ObjectResource|UnknownResource]): The objects to
        compose.
      destination_resource (resource_reference.UnknownResource): Metadata for
        the resulting composite object.
      request_config (RequestConfig): Object containing general API function
        arguments. Subclasses for specific cloud providers are available.
      original_source_resource (Resource|None): Useful for finding metadata to
        apply to final object. For instance, if doing a composite upload, this
        would represent the pre-split local file.
      posix_to_set (PosixAttributes|None): Set as custom metadata on target.

    Returns:
      resource_reference.ObjectResource with composite object's metadata.

    Raises:
      CloudApiError: API returned an error.
      NotImplementedError: This function was not implemented by a class using
        this interface.
    z/Compose requires at least one component object.zCompose was called with z objects. The limit is .r4   Nr   rB   )attributes_resourceposix_to_set)source_objectsdestinationif_generation_matchif_metageneration_matchencryption_key)+cloud_errorsGcsApiErrorlen_MAX_OBJECTS_PER_COMPOSE_CALLr1   r%   r:   ComposeObjectRequestSourceObjectstorage_urlresource_namer?   intappendr
   get_grpc_metadata_from_urlgetattrcopy_object_metadatarB   *update_object_metadata_from_request_configr	   r<   r>   bucketr5   precondition_generation_match!precondition_metageneration_matchresource_argsrK   r   CLEARtyper   KeyTypeCMEKkeykms_keypredefined_acl_stringdestination_predefined_acl_encryption_headers_context$get_object_resource_from_grpc_objectr+   compose_object)r&   source_resourcesdestination_resourcerequest_configoriginal_source_resourcerF   source_messagessourcesource_messagebase_destination_metadatafinal_destination_metadatacompose_requestrK   s                r(   compose_objectsz*GrpcClientWithJsonFallback.compose_objectsd   s   < $$
;  tAAA$$$S)9%:$; <334A7 
 	O"



"
"
7
7
D
D%%33 E  
 
			&	&	2$'(:(:(E(E$F!^, # !. H H(($*<*<*B*B! "J5A#0#E#E
1

&
&
#
$  $= <<"4!	 )2(F(F((44)% 	((66 # ((..CC&.*HH . P P	 D O ##%33BBn
 9 ? ??!!_%<%<%A%AA"0"4"4++7

.
. 0 $$&6N 
	)	).	9??



$
$
3
3O
D 
:	9	9s   8LLc                 J   | j                          t        |dd      }|s4t        j                  |j                  | j
                  j                        }|j                  r#t        j                  |j                  |||      }t        j                  |||       |j                  r%|j                  | j                  v r|j                  }nd}|j                  d}	nt        |j                        }	t        j                  |j                  t        j                   j"                  |j                        }
t        j$                  ||||      }t        j&                  |
|      }|rt)        j*                  d       nt)        j*                  d       t-        j.                  t0        j2                  j4                  j6                  j9                               }| j;                  |      5  	 | j
                  j                  j=                  t?        j@                  |j                  jB                        |j                  jD                  t?        j@                  |j                  jB                        |j                  jD                  ||	tG        jH                  |      |jJ                  |||	      }t        |jL                  d
d      }|rK|tN        jP                  k7  r8|jR                  tT        jV                  jX                  k(  r|jZ                  |_.        | j
                  j4                  j_                  |      }|j`                  }|r ||       |jb                  rn|s|jd                  }|jf                  t-        j.                  t0        j2                  j4                  jh                  j9                               k\  r!t        jj                  |
||jd                         	 ddd       t        jl                  |
       t        jn                  jp                        S # 1 sw Y   =xY w)r3   rB   N)source_metadatadestination_metadatark   should_deep_copy)rF   )
source_url)source_object_resourcedestination_object_resourcerv   rk   z#Found rewrite token. Resuming copy.z3No rewrite token found. Starting copy from scratch.)source_bucketsource_objectdestination_bucketdestination_namerH   source_generationrI   rJ   re   rewrite_tokenmax_bytes_rewritten_per_callrK   )9r1   rW   r
   rV   rR   r%   r:   rB   rX   rY   rd   (ALLOWED_PREDFINED_DESTINATION_ACL_VALUESr?   rT   r   get_tracker_file_pathTrackerFileTypeREWRITE,hash_gcs_rewrite_parameters_for_tracker_file#get_rewrite_token_from_tracker_filer   debugr   ParseIntegerr   VALUESr+   copy_chunk_sizeGet,_encryption_headers_for_rewrite_call_contextRewriteObjectRequestr	   r<   r>   rS   r   get_generation_match_valuer\   r]   r   r^   r_   r   r`   ra   rb   destination_kms_keyrewrite_objecttotal_bytes_rewrittendoner   sizeresumable_thresholdwrite_rewrite_tracker_filedelete_tracker_filerg   resource)r&   source_resourcerj   rk   rF   progress_callbackshould_deep_copy_metadatarv   predefined_aclr   tracker_file_pathrewrite_parameters_hashresume_rewrite_tokenmax_bytes_per_callrequestrK   rewrite_responseprocessed_bytess                     r(   copy_objectz&GrpcClientWithJsonFallback.copy_object   s    	"#7TJ*EE

*
*D,>,>,D,D *??)223'4	 <<n< ++,,88	9 &;;nn!!)o889)??(())11".. 	FF#2(<!5)		
  	==6	
 
 	ii56	iiEF'44!!11557 
	:	:>	J$$**??#88++77 *55CC(==$00<<  2==KK,/ ) D D! %3$T$T'5.);# @ 
( !((*:D
 ";"A"AA##'>'>'C'CC )7(:(:'
%--55DDWM*@@
O
,  
#!1!?!?
!!^%@%@'';;??A&  88!' ..a R U 
Kn ))*;<==!! q 
K	Js   (G4PP"c                    |j                   t        |j                         }nd}| j                          | j                  j                  j                  t        j                  |j                        |j                  ||j                  |j                        }| j                  j                  j                  |       y)r3   N)rZ   objectr?   rI   rJ   )r?   rT   r1   r%   r:   DeleteObjectRequestr	   r<   r>   rS   r[   r\   r+   delete_object)r&   
object_urlrk   r?   r   s        r(   r   z(GrpcClientWithJsonFallback.delete_objectO  s     (z,,-jj  &&::--j.D.DE''*HH . P P ; G 	,,W5r)   c           
         |j                   r|j                   j                  }nd}| j                          | j                  j                  j                  | j                  j                  j                  t        j                  |j                        |j                  t        |j                        |j                  |j                  |            }t!        j"                  |      S )r3   N)rZ   r   r?   rI   rJ   copy_source_acl)r]   preserve_aclr1   r%   r+   restore_objectr:   RestoreObjectRequestr	   r<   r>   rS   rT   r?   r[   r\   r
   rg   )r&   urlrk   r   object_metadatas        r(   r   z)GrpcClientWithJsonFallback.restore_objectc  s    ###11>>ll((00??  5511#//B$$3>>* . L L@@( 	6 		
O ==oNNr)   r   c
                     t        j                  ||      ry|j                  -|j                  j                  |j                  j                  }
nd}
t	        j
                  | j                         ||||	||||
	      }|j                          y)r3   N)	gapic_clientcloud_resourcedownload_stream
start_byteend_byte	digestersr   download_strategydecryption_key)r   (return_and_report_if_nothing_to_downloadr]   r   r   GrpcDownloadr1   run)r&   r   r   rk   r   do_not_decompressr   r   r   r   r   
downloaders               r(   download_objectz*GrpcClientWithJsonFallback.download_object{  s     ==)  	$$0((77C%33BBnn&&++-%'++%	'J NN r)   c	           	      ,   | j                  d      }	| j                  |      }
t        j                  |j                  |
      }|rt        j                  d      |t        j                  j                  k(  rt        j                  |	||||      }nT|t        j                  j                  k(  rt        j                  |	||||||      }nt        j                  |	||||      }|j                         }t!        j"                  |j$                        S )r3   zObject data is not displayed to keep the log output clean. Set log_http_show_request_body property to True to print the body of this request.)r.   zGzip transport encoding is not supported with GRPC API, please use the JSON API instead, changing the storage/preferred_api config value to json.)r   source_streamrj   rk   r   )r   r   rj   rk   serialization_datar   tracker_callback)r1   _get_source_pathr   should_gzip_in_flightgzip_settingscore_exceptionsInternalErrorr   UploadStrategySIMPLEr   SimpleUpload	RESUMABLEResumableUploadStreamingUploadr   r
   rg   r   )r&   r   rj   rk   rF   r   r   r   upload_strategyr   source_pathr   uploaderresponses                 r(   upload_objectz(GrpcClientWithJsonFallback.upload_object  s#    ##% $ F ''8K%;;$$k3 ))  )22999$$%3')h 
I44>>	>''%3'/)+h ''%3')h ||~H== r)   r"   )NN)NNF)__name__
__module____qualname____doc__r   rO   r$   r1   r   r7   r8   r9   rs   r   r   r   DownloadStrategyr   r   r   r   r   __classcell__)r'   s   @r(   r   r   )   s    J.* #%" ((--E<  $i`  %~@6(O: !22<<'\ ..55=r)   r   N)%r   
__future__r   r   r   googlecloudsdk.api_lib.storager   r   rL   'googlecloudsdk.api_lib.storage.gcs_grpcr   r	   r
   r   'googlecloudsdk.api_lib.storage.gcs_jsonr   gcs_json_clientgooglecloudsdk.api_lib.utilr   r/   "googlecloudsdk.command_lib.storager   r   r   r   +googlecloudsdk.command_lib.storage.tasks.cpr   r   googlecloudsdk.corer   r   r   r   googlecloudsdk.core.utilr   
JsonClientr    r)   r(   <module>r      s^    G &  ' 4 A < = A : M 9 > 8 @ H A E = # * 3x!;!; xr)   