
    )                        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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r\R,                  \R.                  " \R0                  R2                  \R0                  R4                  \R0                  R6                  5      \R8                   " S S\R:                  5      5       5       5       rg)zRepair cluster command.    )absolute_import)division)unicode_literals)dataproc)util)arg_parsers)base)
exceptions)flags)	arg_utils)log)
console_ioNc                       \ rS rSrSrSS0r\S 5       r\S 5       r\S 5       r	\S 5       r
\S	 5       rS
 rS rS rS rS rSrg)Repair"   zRepair a cluster.EXAMPLESa  
          To repair an ERROR_DUE_TO_UPDATE cluster back to RUNNING state, run:

            $ {command} my-cluster --region=us-central1                --cluster-repair-action=REPAIR_ERROR_DUE_TO_UPDATE_CLUSTER

          To repair a cluster by deleting faulty primary worker nodes, run:

            $ {command} my-cluster --region=us-central1               --node-pool id=PRIMARY_WORKER_POOL,repair-action=delete,instance-names="w-1;w-10"

          To repair a cluster by deleting faulty secondary worker nodes, run:

            $ {command} my-cluster --region=us-central1               --node-pool id=SECONDARY_WORKER_POOL,repair-action=delete,instance-names="sw-1;sw-10"

          To repair a cluster by deleting faulty nodes from different pools, run:

            $ {command} my-cluster --region=us-central1               --node-pool id=PRIMARY_WORKER_POOL,repair-action=delete,instance-names="w-1;w-10"               --node-pool id=SECONDARY_WORKER_POOL,repair-action=delete,instance-names="sw-1;sw-10"
          c                    [         R                  " U R                  5       5      n[        R                  R                  U5        [        R                  " U5        [        R                  " USUR                  5        UR                  S[        SSSS9  UR                  SSS9nUR                  SS	R                  U R                  U5      5      S
9  UR                  SS
9nUR                  S[        R                   " / SQ["        U R%                  U5      [        R&                  " SS9S.S9S/ SSR                  U R)                  5       U R+                  U5      5      S9  UR                  S[        R,                  " SSS9SS9  g)z#Parse arguments for repair command.repairz--dataproc-super-userFzWhether to use Dataproc superuser permissions. If true, IAM checks for `dataproc.googleapis.com/clusters.repair` permission, otherwise `dataproc.googleapis.com/clusters.update`T)typedefaulthelphidden)mutexrequiredz--cluster-repair-actionz
          `--cluster-repair-action` flag indicates the repair operation is at
          the cluster level. `--node-pool` flag should not be specified with
          this flag. Valid values : {}.
          )r   zNode pool flags--node-pool)idrepair-actioninstance-names;)custom_delim_char)required_keysspecappendzRid=ID,repair-action=REPAIR_ACTION,instance-names="INSTANCE_NAME1[;INSTANCE_NAME2]"a  
          Each `--node-pool` flag represents either the primary or secondary
          worker pool associated with the cluster and an action on specified
          nodes.
          *id:*::: Valid values : {}.
          *repair-action:*::: Valid values : {}.
          )r   actionr   metavarr   z--graceful-decommission-timeout0s1d)lower_boundupper_bounda  
              The graceful decommission timeout for decommissioning Node Managers
              in the cluster, used when removing nodes. Graceful decommissioning
              allows removing nodes from the cluster without interrupting jobs in
              progress. Timeout specifies how long to wait for jobs in progress to
              finish before forcefully removing nodes (and potentially
              interrupting jobs). Timeout defaults to 0 if not set (for forceful
              decommission), and the maximum allowed timeout is 1 day.
              See $ gcloud topic datetimes for information on duration formats.
              )r   r   N)dpDataprocReleaseTrackr	   
ASYNC_FLAGAddToParserr   AddTimeoutFlagAddClusterResourceArgapi_versionadd_argumentbooladd_argument_groupformat#_GetValidClusterRepairActionChoicesr   ArgDictstr!_GetParseNodePoolRepairActionFuncArgList_GetValidNodePoolIdChoices$_GetValidNodePoolRepairActionChoicesDuration)clsparserr   repair_target	node_pools        'lib/surface/dataproc/clusters/repair.pyArgsRepair.ArgsC   s    {{3++-.HOO'	 	(2F2FG
C   
 --D4-HM! fS<<XFG   006G0HI  C!$!F!F" #."5"5"L	
 d f**,44X>
+  4 )!!dE	      c                    ^ ^ SU U4S jjnU$ )z:Get the function to verify node pool repair-action values.c                    > [         R                  " U TR                  R                  R                  STR                  T5      S9$ )NNODE_POOL_REPAIR_ACTION	item_typevalid_choices)r   ChoiceToEnummessagesNodePoolRepairActionValueValuesEnumr<   )repair_actionr>   r   s    rB   _ParseNodePoolRepairActionFuncPRepair._GetParseNodePoolRepairActionFunc.<locals>._ParseNodePoolRepairActionFunc   s?    ##




$
$
@
@-@@J	 rE   )N )r>   r   rQ   s   `` rB   r9   (Repair._GetParseNodePoolRepairActionFunc   s      *)rE   c                 
    SS/$ )z&Get list of valid node-pool id values.PRIMARY_WORKER_POOLSECONDARY_WORKER_POOLrS   )r>   s    rB   r;   !Repair._GetValidNodePoolIdChoices   s     "#:;;rE   c                     UR                   R                  R                  nUR                  5        Vs/ s H!  nUS:w  d  M  [        R
                  " U5      PM#     sn$ s  snf )'Get list of valid REPAIR_ACTION values.REPAIR_ACTION_UNSPECIFIED)rM   rN   rO   namesr   ChoiceToEnumNamer>   r   repair_action_enumsns       rB   r<   +Repair._GetValidNodePoolRepairActionChoices   sb     #++44PP %**,,A++ 	&	""1%,     
AAc                     UR                   R                  R                  nUR                  5        Vs/ s H!  nUS:w  d  M  [        R
                  " U5      PM#     sn$ s  snf )rZ   !CLUSTER_REPAIR_ACTION_UNSPECIFIED)rM   ClusterToRepair"ClusterRepairActionValueValuesEnumr\   r   r]   r^   s       rB   r6   *Repair._GetValidClusterRepairActionChoices   sd     	))LL 
 %**,,A33 	&	""1%,  rb   c                     [         R                  " UUR                  R                  R                  SU R                  U5      S9$ )z8Get the function to verify cluster repair-action values.CLUSTER_REPAIR_ACTIONrI   )r   rL   rM   re   rf   r6   )selfr   cluster_repair_actions      rB   _ParseClusterRepairAction Repair._ParseClusterRepairAction   s>    !!))LL)>>xH	 rE   c                 J    UR                   R                  US   US   US   S9$ )z9Parses a single --node-pool flag into a NodePool message.r   r   r   )r   repairActioninstanceNames)rM   rN   )rj   r   rA   s      rB   _ParseNodePoolRepair._ParseNodePool   s8    %%T?/ 01 & 3 3rE   c                 t    U Vs/ s H  nU R                  X5      PM     nnU R                  U5        U$ s  snf )z>Parses all --node-pool flags into a list of NodePool messages.)rq   _ValidateNodePoolIds)rj   r   args_node_poolsrA   poolss        rB   _ParseNodePoolsRepair._ParseNodePools   sI     )(I 	H0( 
  	e$Ls   5c                 \   U R                  5       nU H;  nUR                  nXB;  d  M  [        R                  " SSR	                  UU5      5      e   [        5       nU HK  nUR                  nXE;   a&  [        R                  " SSR	                  U5      5      eUR                  U5        MM     g)z'Validates whether node-pools are valid.r   z"Node pool ID "{}" is not one of {}z&Node pool id "{}" used more than once.N)r;   r   r
   InvalidArgumentExceptionr5   setadd)rj   
node_pools	valid_idsrA   node_pool_id
unique_idss         rB   rt   Repair._ValidateNodePoolIds   s    //1I	\\l		&110778ACD 	D   J	\\l		#114;;LIK 	K nn\"  rE   c           	         [         R                  " U R                  5       5      nUR                  R                  R                  5       nS nUR                  (       a  UR                  R                  [        R                  " 5       U R                  X!R                  5      UR                  S9nUR                  b(  [        R                  " UR                  5      S-   Ul        ["        R$                  " SR'                  UR(                  5      SSS9  UR*                  (       ah  UR                  R                  [        R                  " 5       UR                  R-                  U R/                  X!R*                  5      S9UR                  S9nUR                  R1                  UR(                  UR2                  UR4                  US	9nUR6                  R8                  R;                  U5      nUR<                  (       a:  [>        R@                  RC                  S
R'                  X6RD                  5      5        U$ [        RF                  " UUSR'                  UR(                  5      URH                  S9$ )N)	requestId	nodePoolsdataprocSuperUserszLThe specified nodes in cluster '{0}' and all attached disks will be deleted.TzRepair canceled by user.)messagecancel_on_nocancel_string)clusterRepairAction)r   clusterr   )clusterNameregion	projectIdrepairClusterRequestz%Repairing [{0}] with operation [{1}].z+Waiting for cluster '{0}' repair to finish.)r   	timeout_s)%r*   r+   r,   CONCEPTSr   ParserA   rM   RepairClusterRequestr   GetUniqueIdrw   dataproc_super_usergraceful_decommission_timeoutsix	text_typegracefulDecommissionTimeoutr   PromptContinuer5   r   rk   re   rl   ,DataprocProjectsRegionsClustersRepairRequestr   r   clientprojects_regions_clustersr   async_r   statuswritenameWaitForOperationtimeout)rj   argsr   cluster_refrepair_cluster_requestrequest	operations          rB   Run
Repair.Run   s   {{4,,./H--''--/K!~~'00EE$$&((>>B 44  F   
	+	+	7MM$<<=C 	: 1178O8O1P2 !!'00EE$$&##33"&"@"@66# 4 
 !44  F   LL++!!''3	 M G 99@@II{{	jj>EE
~~' (  =DD##%,,   rE   rS   N)__name__
__module____qualname____firstlineno____doc__detailed_helpclassmethodrC   r9   r;   r<   r6   rl   rq   rw   rt   r   __static_attributes__rS   rE   rB   r   r   "   s       -2 B BH * * < <   	 	3#(7 rE   r   )r   
__future__r   r   r   googlecloudsdk.api_lib.dataprocr   r*   r   googlecloudsdk.callioper   r	   r
   #googlecloudsdk.command_lib.dataprocr   $googlecloudsdk.command_lib.util.apisr   googlecloudsdk.corer   googlecloudsdk.core.consoler   r   UniverseCompatibleReleaseTracksr,   ALPHABETAGAHiddenCommandr   rS   rE   rB   <module>r      s      &  ' : 0 / ( . 5 : # 2 
 T..33T5F5F5I5I n T\\ n   
n rE   