
    &s                        S 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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  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* " S S\+5      r, " S S\+5      r- " S S\R\                  5      r/ " S S\+5      r0 " S S \+5      r1 " S! S"\+5      r2 " S# S$\+5      r3g)%zFUtility file that contains helpers for the Cloud TPU Execution groups.    )absolute_import)division)unicode_literalsN)
list_pager)HttpNotFoundError)base_classes)poller)apis)waiter)base)scope)	ssh_utils)flags)util)ssh)log)
properties)	resources)retry)timesc                   8    \ rS rSrSr\S 5       r\S 5       rSrg)DefaultArgs/   zCHelper to check if required flags are set and sets defaults if not.c                     [         R                  R                  R                  R	                  SS9nUR                  S5      S:X  a  UnOUSUR                  S5       nU R                  =(       d    UU l        g)z?Validates the name arg and sets defaults if values are not set.Trequired@r   N)r   VALUEScoreaccountGetfindname)argsr!   usernames      Dlib/googlecloudsdk/command_lib/compute/tpus/execution_groups/util.pyValidateNameDefaultArgs.ValidateName2   sd     $$,,00$0?G||CBh7<<,-h		%XDI    c                     U R                   =(       d1    [        R                  R                  R                   R	                  SS9U l         g)z?Validates the zone arg and sets defaults if values are not set.Tr   N)zoner   r   computer"   )r%   s    r'   ValidateZoneDefaultArgs.ValidateZone=   s4     		NZ..66;;???NDIr*    N)	__name__
__module____qualname____firstlineno____doc__staticmethodr(   r.   __static_attributes__r0   r*   r'   r   r   /   s-    K& & O Or*   r   c                   `    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)TPUNodeC   z&Helper to create and modify TPU nodes.c                     U[         R                  R                  :X  a  SU l        OSU l        [        R
                  " SU R                  5      U l        [        R                  " SU R                  5      U l        g )Nv1alpha1v1tpu)	r   ReleaseTrackALPHA_api_versionr
   GetClientInstanceclientGetMessagesModulemessages)selfrelease_tracks     r'   __init__TPUNode.__init__F   sZ    ))///$dd((0A0ABDK**5$2C2CDDMr*   c                     U R                   R                  5       nXl        XEl        X%l        U R                   R                  US9Ul        U$ )Npreemptible)rE   NodeacceleratorTypenetworktensorflowVersionSchedulingConfigschedulingConfig)rF   accelerator_type
tf_versionrL   rO   nodes         r'   _CreateDefaultNodeTPUNode._CreateDefaultNodeN   sI    ==D+L' MM:: ; !DKr*   c                 R    [         R                  R                  UR                  SS9$ )5Get a resource reference to a long running operation.z!tpu.projects.locations.operations
collection)r   REGISTRYParseRelativeNamer$   rF   	operations     r'   _GetTpuOperationRefTPUNode._GetTpuOperationRefX   s,    //#F 0 H Hr*   c           
         [         R                  R                  R                  R	                  SS9n[
        R                  R                  USU0SS9nU R                  R                  UR                  5       UU R                  X#XV5      S9n	U R                  R                  R                  U	5      n
U R                  U
5      $ )a  Create builds and issues a request to create a TPU node.

Args:
  name: Name of the TPU Node to be created.
  accelerator_type: Slice type of TPU accelerator like 'v2-8', 'v2-32'.
  tf_version: Tensorflow Version like '1.1', '1.5'.
  zone: Zone to create the TPU Node in.
  preemptible: Boolean argument, to create a Preemptible node.
  network: The network to create the node in
Returns:
  A TPU Create response which needs to be polled on.
Tr   
projectsIdtpu.projects.locationsparamsr[   )parentnodeIdrU   )r   r   r    projectr"   r   r\   ParserE   &TpuProjectsLocationsNodesCreateRequestRelativeNamerV   rC   projects_locations_nodesCreater`   )rF   r$   rS   rT   r,   rL   rO   ri   
parent_refrequestr_   s              r'   rn   TPUNode.Create]   s     $$,,00$0?G##))g&+ * -J mmBB&&($$+@ C AG
 44;;GDI##I..r*   c                     [         R                  " U R                  R                  U R                  R                  5      n[         R
                  " X1U5      $ N)r   CloudOperationPollerrC   rm   projects_locations_operationsWaitForrF   operation_refmessageoperation_pollers       r'   WaitForOperationTPUNode.WaitForOperationx   sA    22,,113 >>*7CCr*   c                     [         R                  " U R                  R                  5      n[         R                  " X1U5      $ rs   )r   CloudOperationPollerNoResourcesrC   ru   rv   rw   s       r'   WaitForOperationNoResources#TPUNode.WaitForOperationNoResources~   s2    ==113>>*7CCr*   c                 b   [         R                  R                  R                  R	                  SS9n[
        R                  R                  UUUS.SS9nU R                  R                  UR                  5       S9nU R                  R                  R                  U5      nU R                  U5      $ )z)Deletes the TPU node with the given name.Tr   locationsIdrc   tpu.projects.locations.nodesre   r$   )r   r   r    ri   r"   r   r\   rj   rE   &TpuProjectsLocationsNodesDeleteRequestrl   rC   rm   Deleter`   )rF   r$   r,   ri   fully_qualified_node_name_refrp   r_   s          r'   r   TPUNode.Delete   s    $$,,00$0?G$-$6$6$<$<!
 2 %= %
! mmBB*779 C ;G44;;GDI##I..r*   c                 L   [         R                  R                  R                  R	                  SS9n[
        R                  R                  USU0SS9nU R                  R                  UR                  5       S9n[        R                  " U R                  R                  USSS	S
9$ )zRetrieves all TPU Nodes.Tr   rc   rd   re   rg   ListpageSizenodes)servicerp   methodbatch_size_attributefield)r   r   r    ri   r"   r   r\   rj   rE   $TpuProjectsLocationsNodesListRequestrl   r   YieldFromListrC   rm   )rF   r,   ri   ro   rp   s        r'   r   TPUNode.List   s    $$,,00$0?G##))g&+ * -J mm@@&&( A *G##44'
 
r*   c                 @   [         R                  R                  R                  R	                  SS9n[
        R                  R                  UUUS.SS9nU R                  R                  UR                  5       S9nU R                  R                  R	                  U5      $ )z)Retrieves the TPU node in the given zone.Tr   r   r   re   r   )r   r   r    ri   r"   r   r\   rj   rE   #TpuProjectsLocationsNodesGetRequestrl   rC   rm   )rF   r$   r,   ri   r   rp   s         r'   r"   TPUNode.Get   s    $$,,00$0?G$-$6$6$<$<!
 2 %= %
! mm??*779 @ ;G;;//33G<<r*   c                    [         R                  R                  R                  R	                  SS9n[
        R                  R                  USU0SS9nU R                  R                  UR                  5       S9n[        R                  " U R                  R                  USSS	9n/ nU H1  nUR                  [         R#                  UR$                  5      5        M3     ['        U5      nU HD  n	U	R(                  (       a  [+        S
SS5      eU	R,                  (       a  M4  U	R/                  5       s  $    [+        S
SS5      e)zEParses available Tensorflow versions to find the most stable version.Tr   rc   rd   re   r   r   tensorflowVersions)r   rp   r   r   zNo stable release foundN)r   r   r    ri   r"   r   r\   rj   rE   1TpuProjectsLocationsTensorflowVersionsListRequestrl   r   r   rC   %projects_locations_tensorflowVersionsappendTensorflowVersionParserParseVersionversionsorted
is_nightlyr   modifierVersionString)
rF   r,   ri   ro   rp   tf_versionsparsed_tf_versionsrT   sorted_tf_versionsr   s
             r'   LatestStableTensorflowVersion%TPUNode.LatestStableTensorflowVersion   s3   $$,,00$0?G##))g&+ * -J mmMM&&( N 
G **AA'"	$K
 !

!
.
.z/A/A
BD "   23%			 94FF$$&& & 5tT
BBr*   c                    UR                   U R                  R                  R                  R                  :H  =(       dJ    UR                   U R                  R                  R                  R
                  :H  =(       a    UR                  $ rs   )staterE   rM   StateValueValuesEnumREADYCREATING	ipAddress)rF   rU   s     r'   	IsRunningTPUNode.IsRunning   s\    ::++@@FFF 

dmm((==FFF 	r*   c                     Sn[         R                  " X!R                  [         R                  5      nU(       a  UR	                  S5      $ g)Nz'projects/(.*)/locations/(.*)/nodes/(.*)    )researchr$   
IGNORECASEgroup)rF   rU   patternmatchs       r'   NodeNameTPUNode.NodeName   s3    7GIIgyy"--8E[[^r*   rA   rC   rE   N)r1   r2   r3   r4   r5   rH   rV   r`   rn   r{   r   r   r   r"   r   r   r   r7   r0   r*   r'   r9   r9   C   sF    .EH
/6DD
/ 
"=C<
r*   r9   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ComputePollerNoResources   z:Compute operations poller that does not create a resource.c                 (   > [         [        U ]  XS9  g )N)resource_service
target_ref)superr   rH   )rF   r   r   	__class__s      r'   rH   !ComputePollerNoResources.__init__   s    	
"D2) 3 Br*   c                     g)z
Overrides.Nr0   r^   s     r'   	GetResult"ComputePollerNoResources.GetResult   s    r*   r0   rs   )	r1   r2   r3   r4   r5   rH   r   r7   __classcell__)r   s   @r'   r   r      s    BB r*   r   c                       \ rS rSrSr " S S\5      r " S S\5      r\	R                  " S5      r\	R                  " S5      r\	R                  " S	5      r\S
 5       rSrg)r      z$Helper to parse tensorflow versions.c                       \ rS rSrSrSrg)"TensorflowVersionParser.ParseError   z?Error raised with input is unabled to be parse as a TF version.r0   N)r1   r2   r3   r4   r5   r7   r0   r*   r'   
ParseErrorr      s    Ir*   r   c                   J    \ rS rSrSr     SS jrS rS rS rS r	S r
S	rg
)TensorflowVersionParser.Result   z3Helper to capture result of parsing the TF version.c                 @    Xl         X l        X0l        X@l        XPl        g rs   majorminorpatchr   r   )rF   r   r   r   r   r   s         r'   rH   'TensorflowVersionParser.Result.__init__   s     jjj"omr*   c                 |    U R                   S:H  =(       a'    U R                  S:H  =(       a    U R                  (       + $ )Nr   )r   r   r   rF   s    r'   	IsUnknown(TensorflowVersionParser.Result.IsUnknown   s)    ZZ1_HqH5HHr*   c                    U R                   (       a  SR                  U R                  5      $ U R                  S:X  a  U R                  S:X  a  U R                  $ SR                  U R                  U R                  U R                  5      $ )Nz	nightly{}r   z{}.{}{})r   formatr   r   r   r   s    r'   r   ,TensorflowVersionParser.Result.VersionString  s^    	!!$--00	qTZZ1_}}djj$**dmmDDr*   c                     [        U R                  5      [        U R                  5      -   [        U R                  5      -   [        U R                  5      -   [        U R
                  5      -   $ rs   )hashr   r   r   r   r   r   s    r'   __hash__'TensorflowVersionParser.Result.__hash__	  sT    $**TZZ 004

3CCd
//G !$--01 1r*   c                 4   U R                   UR                   :H  =(       ay    U R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rs   r   rF   others     r'   __eq__%TensorflowVersionParser.Result.__eq__  sq    jjEKK' .jjEKK'.jjEKK'. oo!1!11. mmu~~-	/r*   c                    U R                   (       d  UR                   (       d  U R                  5       (       d  UR                  5       (       d  U R                  UR                  :w  a  U R                  UR                  :  $ U R                  UR                  :w  a  U R                  UR                  :  $ U R                  UR                  :w  a  U R                  UR                  :  $ U R
                  (       d  gUR
                  (       d  gU R                   (       a5  UR                   (       a$  U R
                  (       d  gUR
                  (       d  gU R                  5       (       a.  UR                  5       (       a  U R
                  UR
                  :  $ U R                  5       (       a  gUR                  5       (       a  gU R                   (       a  gg)NTF)r   r   r   r   r   r   r   s     r'   __lt__%TensorflowVersionParser.Result.__lt__  s-   __U%5%5dnn ? ?!!::$ekk)
)::$ekk)
)::$ekk)
)}}~~ 
U--}}~~ 
		eoo//}}u~~-- 
						r*   )r   r   r   r   r   N)r   r   r   Fr   )r1   r2   r3   r4   r5   rH   r   r   r   r   r   r7   r0   r*   r'   Resultr      s6    = !
IE1/#r*   r   z^(\d+)\.(\d+)(.*)$z^nightly(.*)$z	^\.(\d+)$c                    U (       d  [         R                  S5      e[         R                  R                  U 5      n[         R                  R                  U 5      nUc  Uc  [         R                  U S9$ Ub'  Ub$  [         R                  SR                  U 5      5      eU(       a  [        UR                  S5      5      n[        UR                  S5      5      n[         R                  X4S9nUR                  S5      (       at  [         R                  R                  UR                  S5      5      nU(       a)  [        UR                  S5      5      nU(       a  Xul
        U$ UR                  S5      Ul        U$ U(       aA  [         R                  S	S
9nUR                  S5      (       a  UR                  S5      Ul        U$ g)z?Helper to parse the tensorflow version into it's subcomponents.z!Bad argument: tf_version is emptyN)r   z!TF version error: bad version: {}      )r   r   r   T)r   )r   r   _VERSION_REGEXr   _NIGHTLY_REGEXr   r   intr   _PATCH_NUMBER_REGEXr   r   )rT   version_matchnightly_matchr   r   resultpatch_matchmatched_patchs           r'   r   $TensorflowVersionParser.ParseVersion=  s    #.. 0E F F ,::@@LM+::@@LM!6$++Z+@@ ]%>#..
-
4
4Z
@B B-%%a()e-%%a()e&--E-Gf			Q		-AAGG"$k//23-(L m *//2&/m&--->f			Q		'--a0m	 r*   r0   N)r1   r2   r3   r4   r5   	Exceptionr   objectr   r   compiler   r   r   r6   r   r7   r0   r*   r'   r   r      sb    ,J9 JGv GR ::56.::o..

=1" "r*   r   c                   x    \ rS rSrSrS rS rS r SS jrS r	S	 r
S
 rS rS rS rS rS rS rS rS rSrg)Instanceic  z?Helper to create the GCE VM required to work with the TPU Node.c                     [         R                  " U5      nUR                  R                  U l        UR                  R                  U l        g rs   )r   ComputeApiHolderrC   apitools_clientrE   rF   rG   holders      r'   rH   Instance.__init__f  s4    **=9F--//DKMM**DMr*   c                 z   US:X  a  g[         R                  U5      nUR                  (       a$  [         R                  SR	                  U5      5      eU(       a\  UR
                  S:X  a&  SR	                  UR
                  UR                  5      $ SR	                  UR
                  UR                  5      $ UR                  (       d   UR
                  S:  aA  UR                  S:  a1  SR	                  UR
                  UR                  UR                  5      $ S	R	                  UR
                  UR                  5      $ )
z7Generates the image family from the tensorflow version.nightlyz
tf-nightlyzSInvalid tensorflow version:{} (non-empty modifier); please set the --gce-image flagr   ztf2-{}-{}-cpuztf-{}-{}-cpu   ztf-{}-{}-{}ztf-{}-{})r   r   r   r   r   r   r   r   )rF   rT   use_dl_imageparseds       r'   !_ImageFamilyFromTensorflowVersion*Instance._ImageFamilyFromTensorflowVersionk  s    Y$11*=F#.. 06 7=fZ6HJ J
 		%%fllFLLAA$$V\\6<<@@ ||)flla.?!!&,,fllKKV\\6<<88r*   c                     SnU(       a  SnU R                  X5      nU R                  R                  XCS9nU R                  R                  R                  U5      nU=(       a    UR                  $ )z=Queries GCE to find the right image for the given TF version.z	ml-imageszdeeplearning-platform-release)familyri   )r  rE   !ComputeImagesGetFromFamilyRequestrC   imagesGetFromFamilyselfLink)rF   rT   r	  ri   image_familyrp   images          r'   !ResolveImageFromTensorflowVersion*Instance.ResolveImageFromTensorflowVersion  sg    G/g99"Lmm== > .GKK,,W5E#U^^#r*   Nc	                    U R                   R                  SSU R                   R                  UUS9S9n	[        R                  " [
        R                  R                  R                  R                  SS95      n
U R                   R                  SR                  X5      U R                   R                  SU R                   R                  R                  R                  S9/S9nU R                   R                  R!                  S	US
9/nU(       a3  UR#                  U R                   R                  R!                  SSS
95        U R                   R%                  S/ SQS9nU R                   R&                  R)                  U R                   R&                  R(                  R+                  S	US
9/S9nU R                   R'                  UU R                   R                  US9SR                  X#5      U	/U R                   R-                  US9U/UU/S9$ )z9Builds an instance spec to be used for Instance creation.T)sourceImage
diskSizeGb)boot
autoDeleteinitializeParamsr   zprojects/{}/global/networks/{}zExternal NAT)r$   type)rO   accessConfigsctpu)keyvaluez
proxy-modeproject_editorsdefault)z5https://www.googleapis.com/auth/devstorage.read_writez-https://www.googleapis.com/auth/logging.writez0https://www.googleapis.com/auth/monitoring.writez.https://www.googleapis.com/auth/cloud-platform)emailscopes)additionalProperties)itemszzones/{}/machineTypes/{}rK   )r$   metadatamachineTypedisks
schedulingnetworkInterfaceslabelsserviceAccounts)rE   AttachedDiskAttachedDiskInitializeParamsp_utilGetProjectNumberr   r   r    ri   r"   NetworkInterfacer   AccessConfigTypeValueValuesEnumONE_TO_ONE_NATMetadataItemsValueListEntryr   ServiceAccountr   LabelsValueAdditionalProperty
Scheduling)rF   r$   r,   machine_type	disk_sizerL   rO   use_with_notebooksource_imagediskproject_numbernetwork_interfacer(  service_accountr-  s                  r'   BuildInstanceSpecInstance.BuildInstanceSpec  s    ==%%CC$  D 
 & D ,,&&**D*9;N66077%}}11++??NN 2 P Q 7 
 &&:: ;  H oo
--
 
 
4
4&7 5 9: mm22
 3 O ]]##//**==d 	> 	$F/ F
 ==!!''h'7.55dIf==+++D,-() " + +r*   c                 R    [         R                  R                  UR                  SS9$ )rY   zcompute.zoneOperationsrZ   )r   r\   rj   r  r^   s     r'   _GetComputeZoneOperationRef$Instance._GetComputeZoneOperationRef  s.    ##'? $ A Ar*   c	                 &   U R                   R                  [        R                  R                  R
                  R                  SS9UU R                  XX4XWX5      S9n	U R                  R                  R                  U	5      n
U R                  U
5      $ )z$Issue request to create an Instance.Tr   ri   r,   instance)rE   ComputeInstancesInsertRequestr   r   r    ri   r"   rE  rC   	instancesInsertrH  )rF   r$   r,   r=  r>  rL   	gce_imagerO   r?  rp   r_   s              r'   rn   Instance.Create  s     mm99!!&&..22D2A''* : +G %%,,W5I++I66r*   c                    [         R                  R                  R                  R	                  SS9nU R
                  R                  UUUS9nU R                  R                  R                  U5      nU R                  U5      $ )z#Issue request to stop the Instance.Tr   rL  ri   r,   )r   r   r    ri   r"   rE   ComputeInstancesStopRequestrC   rN  StoprH  rF   r$   r,   ri   rp   r_   s         r'   rU  Instance.Stop  sv    $$,,00$0?Gmm77 8 
G
 %%**73I++I66r*   c                    [         R                  R                  R                  R	                  SS9nU R
                  R                  UUUS9nU R                  R                  R                  U5      nU R                  U5      $ )z$Issue request to start the Instance.Tr   rS  )r   r   r    ri   r"   rE   ComputeInstancesStartRequestrC   rN  StartrH  rV  s         r'   rZ  Instance.Start  sv    $$,,00$0?Gmm88 9 
G
 %%++G4I++I66r*   c                     [         R                  " U R                  R                  5      n[        R
                  " X1U5      $ )z(Wait for Instance operation to complete.)r	   PollerrC   rN  r   rv   rw   s       r'   r{   Instance.WaitForOperation  s-    }}T[[%:%:;>>*7CCr*   c                 n    [        U R                  R                  5      n[        R                  " X1U5      $ rs   )r   rC   rN  r   rv   rw   s       r'   r   $Instance.WaitForOperationNoResources  s)    /0E0EF>>*7CCr*   c                 X   [         R                  R                  R                  R	                  SS9nU R
                  R                  XS9n[        R                  " U R                  R                  USSS9n/ nU H,  nU R                  U5      (       d  M  UR                  U5        M.     U$ )z3Retrieves all Instances created by Execution Group.Tr   )r,   ri   r   r'  )r   rp   r   r   )r   r   r    ri   r"   rE   ComputeInstancesListRequestr   r   rC   rN  _VMCreatedByExecGroupr   )rF   r,   ri   rp   rN  
result_setrL  s          r'   r   Instance.List  s    $$,,00$0?Gmm77 8 $G((%%	I J		#	#H	-	-(#  r*   c                 J   [         R                  R                  R                  R	                  SS9nU R
                  R                  X#US9nU R                  R                  R	                  U5      nU R                  U5      (       a  U$ [        SR                  U5      SS5      e)zRetrieves the Instance data.Tr   )r,   ri   rL  zInstance:{} not foundN)r   r   r    ri   r"   rE   ComputeInstancesGetRequestrC   rN  rc  r   r   )rF   instance_namer,   ri   rp   rL  s         r'   r"   Instance.Get  s    $$,,00$0?Gmm66] 7 <G{{$$((1H!!(++o
&&}5tTC Cr*   c                     U(       a@  UR                   (       a/  UR                   R                   H  nUR                  S:X  d  M    g   g)Nr  TF)r-  r&  r   )rF   rL  labels      r'   rc  Instance._VMCreatedByExecGroup  s3    HOO??77%99 8 r*   c                 p    UR                   U R                  R                  R                  R                  :H  $ rs   )statusrE   r   StatusValueValuesEnumRUNNING)rF   rL  s     r'   r   Instance.IsRunning!  s'    ??dmm44JJRRRRr*   c                    U R                   R                  [        R                  R                  R
                  R                  SS9UUS9nU R                  R                  R                  U5      nU R                  U5      $ )z=Deletes the specified instance in the given zone and project.Tr   rK  )rE   ComputeInstancesDeleteRequestr   r   r    ri   r"   rC   rN  r   rH  )rF   r$   r,   rp   r_   s        r'   r   Instance.Delete$  sq    mm99!!&&..22D2A : 
G
 %%,,W5I++I66r*   )rC   rE   rs   )r1   r2   r3   r4   r5   rH   r  r  rE  rH  rn   rU  rZ  r{   r   r   r"   rc  r   r   r7   r0   r*   r'   r   r   c  s[    G+
94$* &*9+vA

7	7	7D
D$	CS7r*   r   c                   B    \ rS rSrSrS rS rS rS r SS jr	S r
S	rg
)SSHi/  z;Helper class to SSH to the VM associated with the TPU node.c                     [         R                  " U5      nXl        UR                  U l        UR                  U l        g rs   )r   r  rG   rC   r   r  s      r'   rH   SSH.__init__2  s0    **=9F&--DK%%DNr*   c                 >    S Ul         SUl        S Ul        S Ul        U$ )Nno)plainstrict_host_key_checkingforce_key_file_overwritessh_key_file)rF   r%   s     r'   _DefaultArgsForSSHSSH._DefaultArgsForSSH8  s(     DJ$(D!$(D!DKr*   c           	         [         R                  R                  UR                  /[        R
                  R                  UU R                  [         R                  " U R                  5      S9S   nUR                  U R                  UR                  5      nUR                  U R                  XCU5      nUb&  U(       d  [        R                  R                  S5        U$ )z6Wrapper around SSH Utils to get the host keys for SSH.)scope_listerr   z@Unable to retrieve host keys from instance metadata. Continuing.)instance_flagsSSH_INSTANCE_RESOLVERResolveResourcesr$   compute_scope	ScopeEnumZONEr   GetInstanceZoneScopeListerrC   
GetProjectri   GetHostKeysFromGuestAttributesr   rn  Print)rF   r,   
ssh_helperrL  instance_refri   	host_keyss          r'   _GetHostKeyFromInstanceSSH._GetHostKeyFromInstanceA  s    !77HH	0055t#>>t{{K I M NOPL ##DKK1E1EFG99\W6I Y 
jj % &r*   c                     UR                  [        R                  " U5      SUS9nU[        R                  S'   SUS'   U$ )Nrz  )r|  host_keys_to_addTPU_NAMESendEnv)	GetConfigr   HostKeyAliasosenviron)rF   r$   r  rL  r  optionss         r'   _GetSSHOptionsSSH._GetSSHOptionsS  sI    ""9#9#9(#C<@4= # ?G "BJJz#GINr*   c                    UR                  U R                  XEUR                  U R                  [        R                  R
                  R                  R                  SS95      [        R                  " 5       [        R                  " SS9-   5        [        R                  " UX6SS9n UR                  UR                  US9  g! [         R"                   a    [$        R&                  " 5       ef = f)	z@Waits for SSH keys to propagate in order to SSH to the instance.Tr   i,  )secondsi )remoteidentity_filer  max_wait_msputty_force_connectN)EnsureSSHKeyExistsrC   r  r   r   r    ri   r"   r   Nowdatetime	timedeltar   	SSHPollerPollenvr   WaitExceptionr   NetworkError)	rF   r  r  r  userrL  r  r  
ssh_pollers	            r'   _WaitForSSHKeysToPropagateSSH._WaitForSSHKeysToPropagate[  s     !!TKK**//77;;T;J	L		h((55	7
 #(LJ%oo
..1  3  %""$$%s   'C *C,c                    U R                  U5      n[        R                  " U5      n[        R                  R                  SR                  U5      5        [        R                  R                  Ul
        [        R                  " 5       nUR                  U5        UR                  R                  n[        R                  " UR                   5      u  pgU R#                  UR$                  XB5      nU R'                  UR                   UX(5      n	UR                  R)                  5       R+                  SS9n
[        R,                  " UUR/                  U R0                  [2        R4                  R6                  R8                  R;                  SS95      UU
SU R<                  SU R0                  R>                  S9nUR@                  n[        RB                  " X65      nURD                  (       + =(       a2    [2        R4                  R                  RF                  RI                  5       nURJ                  (       d  U RM                  XLXVX)U5        / nURN                  (       a  URQ                  / SQ5        UUU	US	.n[        RR                  " S0 UD6nS
nSn[U        U5       Hi  n [        R                  R                  SR                  U5      5        UR                  URV                  US9nU(       a  [X        RZ                  " U5          g   g! [        R\                   an  nUUS-
  :X  a  Ue[        R                  R                  SR                  [^        R`                  " U5      5      5        [b        Rd                  " U5         SnAM  SnAff = f)z@Helper to manage authentication followed by SSH to the instance.z"Trying to SSH to VM with NAT IP:{}T)include_commentr   NF)username_requestedrE   )z-A-Lz6006:localhost:6006r  z8888:localhost:8888)r  r  r  extra_flags
      zSSH Attempt #{}...r  r   zRetrying: SSH command error: {}r0   )3r  r   GetExternalIPAddressr   rn  r  r   r   KeysDEFAULT_KEY_FILEr~  BaseSSHCLIHelperRunkeyskey_fileGetUserAndInstancer$   r  r,   r  GetPublicKeyToEntryGetOsloginStater  rC   r   r   r    ri   r"   rG   rE   r  Remoteoslogin_2fa_enabledr  GetBooloslogin_enabledr  forward_portsextend
SSHCommandranger  sysexitCommandErrorsix	text_typetimesleep)rF   r%   rL  external_natr  r  r  _r  r  
public_keyoslogin_stater  r  r  ssh_cmd_argscmdmax_attemptssleep_intervalireturn_codees                         r'   SSHToInstanceSSH.SSHToInstancen  s   ""4(D11(;LJJ,33LAC11D++-JNN4OO,,M**4995GD,,TYY
MI!!$))Z"*7G --/777MJ''KK**//77;;T;J	L %%	'M DZZ+F --- 	<1199;  ((
%%j-&.9LN K 
JL &"	L ..
(<
(CLN
 < 

-44Q78ggNN 3  5  ((;
 ' !  q  '

-44S]]15EF	H

>"s   A%LNA#NN)rC   rG   r   N)F)r1   r2   r3   r4   r5   rH   r  r  r  r  r  r7   r0   r*   r'   rv  rv  /  s)    C&$  %&Rr*   rv  c                   6    \ rS rSrSrSrSrSrS rS r	S r
S	rg
)ResourceManageri  z@Helper to interact with Cloud Resource Manager and related ACLs.zroles/logging.logWriterzroles/storage.adminzroles/tpu.serviceAgentc                     SU l         [        R                  " SU R                   5      U l        [        R                  " SU R                   5      U l        g )Nr=   cloudresourcemanager)rA   r
   rB   rC   rD   rE   r   s    r'   rH   ResourceManager.__init__  sD    D(( 1 13DK** 1 13DMr*   c                 p   [         R                  R                  R                  R	                  SS9nU R
                  R                  US9nU R                  R                  R                  U5      nU R                  XA5      nUc/  [        R                  R                  SR                  U5      5        gU R
                  R                  UU R
                  R!                  US9S9nU R                  R                  R#                  U5        [        R                  R                  SR                  U5      5        g)	zXAddTPUUserAgent adds the TPU user agent to enable Cloud Storage access and send logging.Tr   )resourceNz/TPU Service account:{} has already been enabled)policy)r  setIamPolicyRequestz?Added Storage and Logging permissions to TPU Service Account:{})r   r   r    ri   r"   rE   /CloudresourcemanagerProjectsGetIamPolicyRequestrC   projectsGetIamPolicy_AddAgentToPolicyr   rn  r  r   /CloudresourcemanagerProjectsSetIamPolicyRequestSetIamPolicyRequestSetIamPolicy)rF   tpu_user_agentri   get_iam_policy_requestr  set_iam_policy_requests         r'   AddTpuUserAgentResourceManager.AddTpuUserAgent  s	   $$,,00$0?G!]]ZZ [ [[!!../EFF##F;F~	jjH~.0  $}}\\"mm?? @   ]  
 kk''(>?	jj
K6.!#r*   c                    SnSnSR                  U5      nUR                   Hr  nUR                  U R                  :X  a  UnUR                  U R                  :X  a  UnUR                  U R
                  :w  d  MW  UR                   H  nXu:X  d  M
      g   Mt     Uc>  U R                  R                  U R                  S9nUR                  R                  U5        Uc>  U R                  R                  U R                  S9nUR                  R                  U5        UR                  R                  U5        UR                  R                  U5        U$ )z2Adds the tpuUserAgent to the policy and return it.NzserviceAccount:{})role)
r   bindingsr  logging_rolestorage_roletpu_service_agentmembersrE   Bindingr   )rF   r  r  logging_bindingstorage_bindingtpu_member_strbindingmembers           r'   r  !ResourceManager._AddAgentToPolicy  s   OO(//?N??	**	*!	**	*! 
//	/ooF% 	 & # --43D3D-Eooo_---43D3D-Eooo_-"">2"">2Mr*   r   N)r1   r2   r3   r4   r5   r  r  r  rH   r  r  r7   r0   r*   r'   r  r    s&    H*,&, /3#* r*   r  )4r5   
__future__r   r   r   r  r  r   r  r  apitools.base.pyr   apitools.base.py.exceptionsr   googlecloudsdk.api_lib.computer   )googlecloudsdk.api_lib.compute.operationsr	   googlecloudsdk.api_lib.utilr
   r   googlecloudsdk.callioper   "googlecloudsdk.command_lib.computer   r  r   ,googlecloudsdk.command_lib.compute.instancesr   r  #googlecloudsdk.command_lib.projectsr   r1  #googlecloudsdk.command_lib.util.sshr   googlecloudsdk.corer   r   r   googlecloudsdk.core.utilr   r   r  r   r   r9   r]  r   r   r   rv  r  r0   r*   r'   <module>r     s    M &  '  	 	 
  ' 9 7 < , . ( E 8 P > 3 # * ) * * 
O& O(Xf Xv	v}} 	vf vrI7v I7XQ& QhEf Er*   