
    B                       S r SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr   \R2                  R4                  S:X  a   \R2                  R6                  S:  a  SSKJr  \" S5      r S r!S r"S r# SS jr$S r%S r&S r'  SS jr(SS.     S S jjr)g! \ a     N>f = f)!z0Utility functions for normalizing gRPC messages.    )absolute_import)annotations)division)unicode_literalsN)json_format)metadata_util)encryption_util)errors)	hash_util)storage_url)user_request_args_factory)gcs_resource_reference)crc32c      )routing_headerzprojects/_/buckets/c                ~    U (       d  gU  Vs/ s H#  n[         R                  " UR                  5      PM%     sn$ s  snf )z0Converts a sequence of proto messages to a dict.N)r   MessageToDict_pb)messageis     <lib/googlecloudsdk/api_lib/storage/gcs_grpc/metadata_util.py!_convert_repeated_message_to_dictr   3   s1    	
 5<	<Gq+
#
#AEE
*G	<<	<s   *:c                    U (       d  g[         R                   R                  U R                  5       U R                  5      $ )zHConverts the proto.datetime_helpers.DatetimeWithNanoseconds to datetime.N)datetimefromtimestamp	timestamptzinfo)proto_datetimes    r   _convert_proto_to_datetimer    =   s5    	
				(	( ."7"7
9 9    c                    U (       a  U $ g)a+  Returns None if value is falsy, else the value itself.

Unlike Apitools messages, gRPC messages do not return None for fields that
are not set. It will instead be set to a falsy value.

Args:
  value (proto.Message): The proto message.

Returns:
  None if the value is falsy, else the value itself.
N )values    r   _get_value_or_noner%   E   s     L	r!   c                   U(       ad  UR                   nUR                  n[        R                  " U 5      nXAl         XQl        SUl        UR
                  R                  S:X  a  / Ul        U$ UR
                  R                  (       ai  U R                  (       d  [        R                  " S5      eU R                   H2  nUR                  R                  [        R                  " U5      5        M4     U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        U R                   (       aJ  U R                   R"                  UR                   l        U R                   R$                  UR                   l        U R&                  Ul        [        R                  " U R(                  5      Ul        U$ )a  Copies specific metadata from source_metadata to destination_metadata.

The API manually generates metadata for destination objects most of the time,
but there are some fields that may not be populated.

Args:
  source_metadata (gapic_clients.storage_v2.types.storage.Object): Metadata
    from source object.
  destination_metadata (gapic_clients.storage_v2.types.storage.Object):
    Metadata for destination object.
  request_config (request_config_factory.RequestConfig): Holds context info
    about the copy operation.
  should_deep_copy (bool): Copy all metadata, removing fields the backend must
    generate and preserving destination address.

Returns:
  New destination metadata with data copied from source (messages.Object).
NFz5Attempting to preserve ACLs but found no source ACLs.)bucketnamecopydeepcopy
generationresource_argspreserve_aclaclr
   Errorappendcache_controlcontent_dispositioncontent_encodingcontent_languagecontent_type	checksumsr   md5_hashcustom_timemetadata)source_metadatadestination_metadatarequest_configshould_deep_copydestination_bucketdestination_name
source_acls          r   copy_object_metadatarA   V   s   0 -44+00==9"4 0&*# ##00E9!#2 
/ ##00  llC
 	
 (++*  ''j(AB ,)8)F)F&++ , -<,L,L),;,L,L)(7(D(D%  .=.G.G.N.N$$+

#
#
,
, $$- (7'B'B$$(MM/2J2J$K!	r!   c                $   U R                  5       (       a  UR                  U R                  S9$ U R                  5       (       aM  U R                  (       a  [        U R                  5      OSnUR                  U R                  U R                  US9$ g)zATakes storage_url.CloudUrl and returns appropriate Types message.)r(   N)r(   r'   r+   )	is_bucketBucketbucket_name	is_objectr+   intObjectresource_name)	cloud_url
grpc_typesr+   s      r   get_grpc_metadata_from_urlrL      s    )"7"788.7.B.BY))*J$$$$    r!   c                   U R                   [        S n[        R                  " [        R                  R
                  U5      n[        U R                  R                  5      nU R                  R                  UU R                  R                  [        U R                  R                  5      S.n[        U R                  SS5      nU R                  R                  SU R                  R                   R"                  0[%        U R                  R&                  5      U R                  R(                  S.nS[%        U R*                  R,                  5      0n[        U R.                  R0                  5      U R.                  R2                  R5                  5       U R.                  R6                  S.n[        U R8                  R0                  5      U R8                  R2                  R5                  5       S.n	U R:                  R<                  U R:                  R>                  S	.n
[@        RB                  " U40 S
U_S[%        U RD                  5      _SU_S[%        U RF                  5      _S[        U RH                  5      _SSU RJ                  RL                  0_S[%        U RN                  5      _SU RP                  _SU_SU RR                  _SU RT                  _SU_SU RV                  _SU_SU RX                  _SU RZ                  _SU R\                  R^                  U R\                  R`                  S._SU _SU Rb                  _SSU Rd                  R                  (       a  S OS0_S!U Rf                  Rh                  _S"U Rj                  Rl                  _S#U_S$U Rn                  _S%U Rp                  _S&U	_S'U Rf                  Rr                  R                  _S([        U Rt                  5      _S)U Rv                  R                  _S*U
_6$ )+zHelper method to generate a BucketResource instance from GCS metadata.

Args:
  metadata (messages.Bucket): Extract resource properties from this.

Returns:
  BucketResource with properties populated by metadata.
N)enabled
toggleTimeterminalStorageClassterminalStorageClassUpdateTimedefault_kms_keyallowedIpCidrRanges)modepublicNetworkSourcevpcNetworkSourcesallowCrossOrgVpcsrule)effectiveTimeretentionDurationisLocked)rY   rZ   )mainPageSuffixnotFoundPage	autoclassr.   autoclass_enabled_timecors_configcreation_timecustom_placement_configdataLocationsdefault_acldefault_event_based_holddefault_storage_classetagip_filter_configlabelslifecycle_configlocationlocation_typelogging_config)	logBucketlogObjectPrefixr9   metagenerationper_object_retentionrT   Enabledpublic_access_preventionrequester_paysretention_policyrposatisfies_pzssoft_delete_policyuniform_bucket_level_accessupdate_timeversioning_enabledwebsite_config)<r(   GRPC_URL_BUCKET_OFFSETr   CloudUrlProviderPrefixGCSr    r^   toggle_timerN   terminal_storage_class"terminal_storage_class_update_timegetattr
encryption	ip_filterrT   public_network_sourceallowed_ip_cidr_rangesr   vpc_network_sourcesallow_cross_org_vpcs	lifecyclerX   ru   effective_timeretention_durationtotal_seconds	is_lockedrx   websitemain_page_suffixnot_found_pager   GcsBucketResourcer.   corscreate_timerb   data_locationsdefault_object_aclre   storage_classrg   ri   rk   rl   logging
log_bucketlog_object_prefixrp   object_retention
iam_configrs   billingrt   rv   rw   ry   rz   
versioning)r9   rE   urlr_   r^   rR   r   rj   ru   rx   r|   s              r   !get_bucket_resource_from_metadatar      s
    456+[77;;[I#5$$ ##++*&00GG(B



?
?)	) H//1BDI/  %%
  66MM
 =



0
0 $--BB) /0B0B0G0GH 2

#
#
2
2 
#
#
6
6
D
D
F++55 2

%
%
4
4 
%
%
8
8
F
F
H !((99&&55.
 
 	1	1	)
)
 ,HLL
9)
 4	)

 4HMMB)
 /x/C/CD)
 8;;JJ)
 4

%
%)
  (@@)
 &)
 %22)
  ==!)
" !#)
$ __%)
& (')
(   ))
* **+)
.  ''22%--??-)
4 5)
6 ,,7)
: x88@@)d9)
>  (22KK?)
@ %%44A)
B (C)
D ,,E)
F **G)
H ,I)
J #+"5"5"Q"Q"Y"YK)
L -X-A-ABM)
N ",,44O)
P $Q)
 )r!   c                   U R                   b  [        U R                   5      nOSn[        R                  " [        R                  R
                  U R                  [        S U R                  US9nU R                  (       a\  U R                  R                  (       aA  [        R                  " U R                  R                  5      nU R                  R                  nOS=p4U R                  R                  b+  [        R                   " U R                  R                  5      nOSnU R                  R"                  (       a+  [        R                  " U R                  R"                  5      nOSn[$        R&                  " U40 S[)        U R*                  5      _S[-        U R.                  5      _S[-        U R0                  5      _S[-        U R2                  5      _S[-        U R4                  5      _S[-        U R6                  5      _S	[-        U R8                  5      _S
U_S[;        U R<                  5      _S[-        U R>                  5      _S[;        U R@                  5      _SU_SU_S[-        U RB                  5      _SU RD                  (       a  U RD                  OS_S[-        U RF                  5      _SU_SU _SU RH                  _S[;        U RJ                  5      _S[;        U RL                  5      _SU RN                  _S[-        U RP                  5      _S[;        U RR                  5      _SU RT                  (       a  U RT                  OS_S[;        U RV                  5      _6$ )z;Returns the GCSObjectResource based off of the gRPC Object.N)schemerE   rI   r+   r.   r1   component_countr2   r3   r4   r5   crc32c_hashra   custom_fieldsr8   decryption_key_hash_sha256encryption_algorithmrg   event_based_holdkms_keyr7   r9   rp   noncurrent_timeretention_expirationsizer   storage_class_update_timetemporary_holdrz   ),r+   strr   r~   r   r   r'   r}   r(   customer_encryptionkey_sha256_bytesr   get_base64_stringr   r6   r   $get_crc32c_hash_string_from_checksumr7   r   GcsObjectResourcer   r.   r%   r1   r   r2   r3   r4   r5   r    r   r9   r8   rg   r   r   rp   delete_timeretention_expire_timer   r   update_storage_class_timer   rz   )grpc_objectr+   r   r   r   r   r7   s          r   $get_object_resource_from_grpc_objectr     s(   '[++,JJ''++$$%;%<=$$	# %%

)
)
:
:!*!<!<''88" '::OO8<<!!-==$$K K##**;+@+@+I+IJHH		1	1	$

+KOO
<$
 '{'@'@A$
 ))D)DE	$

 -[-L-LM$
 *+*F*FG$
 *+*F*FG$
 &k&>&>?$
 $
 /{/F/FG$
 '{';';<$
 -[-D-DE$
 "<$
 0$
 k../$
" +6*F*F+
&
&D#$
& !!4!45'$
( )$
* +$
, !//-$
. 11H1HI/$
0 6

+
+1$
6 7$
8 '{'@'@A9$
: !;

/
/!;$
B )4(B(B+
$
$C$
F -[-D-DEG$
 $r!   c                   UR                   n[        R                  " U R                  UUUS9n[        R
                  " U SU5        [        R                  " X!5      n[        R                  " Xd5      n[        R                  " Xd5      n[        R
                  " U SU5        [        R
                  " U SU5        U(       d  g[        R
                  " U SUR                  5        [        R
                  " U SUR                  5        [        R
                  " U SUR                  5        [        R
                  " U S	UR                  5        UR                  (       a  UR                  [        R                  :X  d1  UR                  R                   ["        R$                  R&                  L a  SU l        SU l        gUR                  R                   ["        R$                  R,                  L a  UR                  R.                  U l        ggg)
au  Sets GRPC Storage Object fields based on values in request config.

Checksums such as md5 are not set because they are ignored if they are
provided.

Args:
  object_metadata (gapic_clients.storage_v2.types.storage.Object): Existing
    object metadata.
  request_config (request_config_factory._GcsRequestConfig): May contain data
    to add to object_metadata.
  attributes_resource (FileObjectResource|ObjectResource|None): Contains the
    source StorageUrl and source object metadata for daisy chain transfers.
    Can be None if source is pure stream
  posix_to_set (PosixAttributes|None): Set as custom metadata on target.
)known_posixr9   r1   r3   Nr2   r4   r5   r8   )r,   r   get_updated_custom_fieldsr9   json_metadata_utilprocess_value_or_clear_flagget_should_gzip_locallyget_content_encodingget_cache_controlr2   r4   r5   r8   encryption_keyr   CLEARtyper	   KeyTypeCSEKr   r   CMEKkey)	object_metadatar<   attributes_resourceposix_to_setr,   custom_fields_dictshould_gzip_locallyr3   r1   s	            r   *update_object_metadata_from_request_configr   a  s   . !..-$>>	 00z#5 +BB (<< %66- 00 00)+; 

00,m.O.O 00)=+I+I 00~}'A'A 00}m&?&?
 !!$$(A(G(GG'',,0G0G0L0LL $o,0o)		%	%	*	*o.E.E.J.J	J - < < @ @o 
K "r!   )routing_tokenc               l    Uc  [         R                  " SU 05      /$ [         R                  " XS.5      /$ )zGets routing header with bucket.

Args:
  bucket_name (str): Name of the bucket.
  routing_token (str): Token for routing requests.

Returns:
  (List[Tuple[str, str]]) List with metadata.
r'   )r'   r   )r   to_grpc_metadata)rE   r   s     r   get_bucket_name_routing_headerr     sA     ++X{,CDEE%% 
A
 r!   )F)NN)rE   r   r   z
str | Nonereturnzlist[tuple[str, str]])*__doc__
__future__r   r   r   r   r)   r   syscloudsdk.google.protobufr   googlecloudsdk.api_lib.storager   'googlecloudsdk.api_lib.storage.gcs_jsonr   "googlecloudsdk.command_lib.storager	   r
   r   r   r   ,googlecloudsdk.command_lib.storage.resourcesr   googlecloudsdk.command_lib.utilr   version_infomajorminorgoogle.api_core.gapic_v1r   ImportErrorlenr}   r   r    r%   rA   rL   r   r   r   r   r#   r!   r   <module>r      s    7 & "  '   
 0 8 W > 5 8 : H O 2q S%5%5%;%;a%?7 23 =9* 	AH
iXKb 	PAh 6:(2S  s   $:C CC