
                              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ZdZdZd Ze	j8                  j:                  fdZd Z e	j@                  e	j8                  j:                        e	jB                   G d de	jD                                      Z# e	j@                  e	j8                  jH                         G d de#             Z%y)zFImplementation of objects update command for updating object settings.    )absolute_import)division)unicode_literals)	cloud_api)arg_parsers)base)encryption_util)errors)flags)name_expansion)stdin_iterator)user_request_args_factory)task_executor)task_graph_executor)task_status)patch_object_task)rewrite_object_taskz
Update Cloud Storage objects.
a  
Update a Google Cloud Storage object's custom-metadata:

  $ {command} gs://bucket/my-object --custom-metadata=key1=value1,key2=value2

One can use [wildcards](https://cloud.google.com/storage/docs/wildcards)
to update multiple objects in a single command. for instance to update
all objects to have a custom-metadata key:

  $ {command} gs://bucket/** --custom-metadata=key1=value1,key2=value2

Rewrite all JPEG images to the NEARLINE storage class:

  $ {command} gs://bucket/*.jpg --storage-class=NEARLINE

You can also provide a precondition on an object's metageneration in
order to avoid potential race conditions:

  $ {command} gs://bucket/*.jpg --storage-class=NEARLINE --if-metageneration-match=123456789

c              #   \  K   |j                   xs |j                  xs |j                  }|rt        j                  }nt
        j                  }t        j                  |t        j                  j                        }t        j                  |      }t        |dd      xs t        |dd      }t        |dd      xs: t        |dd      xs+ t        |dd      xs t        |dd      xs t        |d	d      }|s|rt        j                  j                  }n9|s|rt        j                  j                   }nt        j                  j"                  }|j$                  r/|j&                  s#|j(                  s|st+        j,                  d
      |j.                  rt0        j2                  j4                  }	nt0        j2                  j6                  }	t1        j8                  | |t0        j:                  j<                  t?        j@                  |      |	      D ]  }
 ||
jB                  |        yw)z0Yields PatchObjectTask's or RewriteObjectTask's.)metadata_typeretain_untilNretention_modecustom_contextscustom_contexts_fileremove_custom_contextsupdate_custom_contextsclear_custom_contextsz;--all_versions flag is only allowed for ACL modifier flags.)fields_scopeinclude_bucketsobject_staterecursion_requested)user_request_args)"encryption_keyclear_encryption_keystorage_classr   RewriteObjectTaskr   PatchObjectTaskr   'get_user_request_args_from_command_argsMetadataTypeOBJECTadds_or_removes_aclsgetattrr   FieldsScopeFULLNO_ACLSHORTall_versionspredefined_aclacl_filer
   Error	recursiver   RecursionSettingYESNONameExpansionIteratorBucketSettingNO_WITH_ERRORr   get_object_state_from_flagsresource)urlsargsrequires_rewrite	task_typer"   r+   updates_retentionupdates_custom_contextsr   recursion_settingname_expansion_results              %lib/surface/storage/objects/update.py_get_task_iteratorrG   A   s      LT66L$:L:L #55I!11I  GG
7DDKKM  3GG dND9 W
d> d%t, 6	-t	46	/	66 
/	66 
.	5  -((--L3((//L((..L	
T]].B ,,EG G 
^^&77;;&77::-CC
$22@@44T:+  &&:K  s   H*H,c                    | j                  ddd       | j                  ddd       | j                         }t        j                  |       t        j                  |       | j                  d	t
        j                  d
       | j                  ddddd       | j                  ddd       | j                  dt
        j                  d       t        j                  |        t        j                  |        t        j                  | d       t        j                  |        t        j                  | d|       t        j                  | d       t        j                  | d       y)zRegister flags for this command.

  Args:
    parser (argparse.ArgumentParser): The parser to add the arguments to.
    release_track (ReleaseTrack): The release track to add flags for.

  Returns:
    objects update flag group
  url*z$Specifies URLs of objects to update.)nargshelpz--all-versions
store_truez-Perform the operation on all object versions.)actionrL   z--event-based-holdz3Enables or disables an event-based hold on objects.z-Rz-rz--recursivezZRecursively update objects under any buckets or directories that match the URL expression.z-sz--storage-classzfSpecify the storage class of the object. Using this flag triggers a rewrite of underlying object data.)rL   z--temporary-holdz0Enables or disables a temporary hold on objects.T)allow_patch)rO   release_track)	is_updatezRead the list of objects to update from stdin. No need to enter a source argument if this flag is present.
Example: "storage objects update -I --content-type=new-type")	help_textN)add_argument	add_groupr   add_acl_modifier_flagsadd_preserve_acl_flagr   StoreTrueFalseActionadd_additional_headers_flagadd_continue_on_error_flagadd_encryption_flagsadd_precondition_flagsadd_object_metadata_flagsadd_per_object_retention_flagsadd_read_paths_from_stdin_flag)parserrP   acl_flags_groups      rF   _add_common_argsra   z   sq    	3C  E 	:   $$&//o.--@  B 	

#  $ 	
.  /
 	--=  ?
 ##F+""6*V6v&!!$m &&v>&&A    c                      ~ y)zRegister flags for the alpha version of this command.

  Args:
    parser (argparse.ArgumentParser): The parser to add the arguments to.

  Returns:
    objects update flag group
  N r_   s    rF   _add_alpha_argsrf      s     rb   c                   0    e Zd ZdZeedZed        Zd Z	y)UpdateUpdate Cloud Storage objects.DESCRIPTIONEXAMPLESc                     t        |        y N)ra   re   s    rF   ArgszUpdate.Args   s
    Vrb   c           	         t        j                  |       |j                  s|j                  d|_        t	        j
                  |j                  |j                        }t        ||      }t        j                  j                         }t        j                  |d|t        j                  t        j                   j"                  d       |j$                        | _        y )NT)increment_typemanifest_path)parallelizabletask_status_queueprogress_manager_argscontinue_on_error)r	   initialize_key_storer2   preserve_aclr   get_urls_iterablerI   read_paths_from_stdinrG   r   multiprocessing_contextQueuer   execute_tasksr   ProgressManagerArgsIncrementTypeINTEGERrv   	exit_code)selfr?   r>   task_iteratorrt   s        rF   Runz
Update.Run   s    ((.4#4#4#<d++$,,D 'tT2M+CCIIK"00+)==&44<<  00DNrb   N)
__name__
__module____qualname____doc___COMMAND_DESCRIPTION_GA_EXAMPLESdetailed_helpstaticmethodro   r   rd   rb   rF   rh   rh      s/     & *-
  rb   rh   c                   0    e Zd ZdZeeez   dZed        Z	y)UpdateAlphari   rj   c                 b    t        | t        j                  j                         t	        |        y rn   )ra   r   ReleaseTrackALPHArf   re   s    rF   ro   zUpdateAlpha.Args   s     VT..445Frb   N)
r   r   r   r   r   r   _ALPHA_EXAMPLESr   r   ro   rd   rb   rF   r   r      s-    % *0-
  rb   r   N)&r   
__future__r   r   r   googlecloudsdk.api_lib.storager   googlecloudsdk.callioper   r   "googlecloudsdk.command_lib.storager	   r
   r   r   r   r   (googlecloudsdk.command_lib.storage.tasksr   r   r   0googlecloudsdk.command_lib.storage.tasks.objectsr   r   r   r   r   rG   r   GAra   rf   ReleaseTracksUniverseCompatibleCommandrh   r   r   rd   rb   rF   <module>r      s    M &  ' 4 / ( > 5 4 = = H B H @ N P *6r ,0+<+<+?+? ;|	 D%%(() T\\    * F D%%++,&  -rb   