
    4                     8   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!r!SSK"r"SSK#J$r%   " S S5      r&g)z.Cloud Workstations workstations API utilities.    )absolute_import)division)unicode_literalsN)Error)	HttpError)waiter)GetClientInstance)GetMessagesModule)VERSION_MAP)base)	arg_utils)
containers)ssh)execution_utils)log)
properties)	resources)certsc                       \ rS rSrSr\R                  R                  4S jrS r	S r
S rSS jrS rS	 rSS
 jrSS jrS rS rS rS rSrg)Workstations1   z9The Workstations set of Cloud Workstations API functions.c                     [         R                  " U5      U l        [        U5      U l        [        U5      U l        U R                  R                  U l        [        R                  " 5       U l        SU l        g )NF)r   getapi_versionr	   clientr
   messagesFprojects_locations_workstationClusters_workstationConfigs_workstations_service	threadingEventthreading_eventtcp_tunnel_open)selfrelease_tracks     7lib/googlecloudsdk/api_lib/workstations/workstations.py__init__Workstations.__init__4   sS    "}5D#M2DK%m4DMKKffDM$??,D D    c                     U R                   R                  UR                  R                  R	                  5       R                  5       S9nU R                  R                  U5      R                  $ )N)parent)	r   _WorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsListUsableRequestCONCEPTSconfigParseRelativeNamer   
ListUsableworkstations)r#   argslist_usable_reqs      r%   ListUsableWorkstations#Workstations.ListUsableWorkstations<   s^    mm  D  D}}##))+88: D O ==##O4AAAr(   c                    UR                   R                  R                  5       R                  5       n[        R
                  " USSS9nU R                  R                  US9nU R                  [        R                  " [        R                  R                  5      :w  aL  UR                  (       a;  U R                  R                  UU R                  R                  UR                  S9S9nU R                   R#                  U5      n[$        R&                  R)                  SR+                  U5      5        UR,                  (       a:  [$        R&                  R)                  SR+                  UR.                  5      5        U$ [0        R2                  R5                  UR.                  S	U R                  S
9n[6        R8                  " U R                   U R:                  R<                  5      n[6        R>                  " XvSR+                  UR.                  5      5        [$        R&                  R)                  SR+                  U5      5        g)zStart a workstation.workstationTuse_defaultsname)boostConfig)r;   startWorkstationRequestzStarting workstation: [{}] Check operation [{}] for status.*workstations.projects.locations.operations
collectionr   &Waiting for operation [{}] to completezStarted workstation [{}].N) r,   r7   r.   r/   r   GetFromNamespacer   ZWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsStartRequestr   r   r   r   ReleaseTrackGAboostStartWorkstationRequestr   Startr   statusPrintformatasync_r;   r   REGISTRYParseRelativeNamer   CloudOperationPollerr   projects_locations_operationsWaitFor)r#   r2   workstation_nameworkstation_id	start_reqop_refop_resourcepollers           r%   rI   Workstations.StartB   s   }}00668EEG//m$0Nxx y I 	KOOD,=,=,@,@AAJJ--zz"&--"G"G** #H # { i ]]  +FJJ$++N;= {{	jj9@@MNm$$66?$$ 7 &K ((t{{@@BF NN6;BB6;;OQJJ077GHr(   c                 z   UR                   R                  R                  5       R                  5       n[        R
                  " USSS9nU R                  R                  US9nU R                  R                  U5      n[        R                  R                  SR                  U5      5        UR                  (       a:  [        R                  R                  SR                  UR                  5      5        U$ [         R"                  R%                  UR                  SU R&                  S9n[(        R*                  " U R                  U R,                  R.                  5      n[(        R0                  " XvS	R                  UR                  5      5        [        R                  R                  S
R                  U5      5        g)zStop a workstation.r7   Tr8   r:   zStopping workstation: [{}]r>   r?   r@   rB   zStopped workstation [{}].N)r,   r7   r.   r/   r   rC   r   YWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsStopRequestr   Stopr   rJ   rK   rL   rM   r;   r   rN   rO   r   r   rP   r   rQ   rR   )r#   r2   rS   rT   stop_reqrV   rW   rX   s           r%   r\   Workstations.Stoph   sQ   }}00668EEG//m$0N}}vv w H]])FJJ$++N;= {{	jj9@@MNm$$66?$$ 7 &K ((t{{@@BF NN6;BB6;;OQJJ077GHr(   c                 	   UR                   R                  R                  5       R                  5       R	                  5       n U R
                  R                  R                  U R                  R                  US95      n[        US5      (       a=  UR                  (       a,  [        R                  " S5        [        R                  " S5        UR                   R                  R                  5       R	                  5       n U R
                  R"                  R                  U R                  R%                  US95      nWR*                  U l        UR,                  U l        UR0                  U R                  R2                  R4                  R6                  :w  aM  U(       a  U R&                  R)                  5         [        R                  " S5        [        R                  " S5        U R9                  XR5        U R;                  XR5        U R=                  U5      u  p[>        R>                  " [>        R@                  [>        RB                  5      U l        U R>                  RE                  [>        RF                  [>        RH                  S5        U R>                  RK                  X45        U R>                  RM                  S5        U	S:X  aI  [        RN                  RQ                  SRS                  U R>                  RU                  5       S   5      5        [        RN                  RQ                  S	RS                  U R>                  RU                  5       S   5      5        U(       as  S
U l+        U R&                  R)                  5         U RV                  (       a@  U R>                  RY                  5       u  pU R[                  X5        U RV                  (       a  M@  OG [\        R^                  " 5           U R>                  RY                  5       u  pU R[                  X5        M/  [        RN                  RQ                  S5        g! [          a     GNyf = f! [          aX  nU(       a  U R&                  R)                  5         [        R                  " U5        [        R                  " S5         SnAGNkSnAff = f! , (       d  f       N= f! [`         a    [        Rb                  " S5         Nf = f)z$Start a TCP tunnel to a workstation.r:   disableTcpConnectionszDTCP tunneling is disabled for workstations under this configuration.   NzWorkstation is not running.r   z Picking local unused port [{0}].zListening on port [{0}].TzKeyboard interrupt received.zServer shutdown complete.)2r,   r7   r.   Parentr/   r   9projects_locations_workstationClusters_workstationConfigsGetr   LWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsGetRequesthasattrr`   r   errorsysexitr   r   XWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsGetRequestr!   sethostworkstation_portportstateWorkstationStateValueValuesEnumSTATE_RUNNING_FetchAccessToken_RefreshAccessToken_GetLocalHostPortsocketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindlistenrJ   rK   rL   getsocknamer"   accept_AcceptConnectionr   RaisesKeyboardInterruptKeyboardInterruptinfo)r#   r2   threadedconfig_namer-   rS   r7   erl   rn   connaddrs               r%   StartTcpTunnelWorkstations.StartTcpTunnel   s   --++113::<IIKK{{TTXX
--
d
d e f &1
2
2**			
 	 }}00668EEGKKffjj
--
p
p# q k   DI%%DI==$$99GG	H 
  "	ii-.	hhqk 	+6-8 ))$/LT--0B0BCDKKK6,,f.A.A1EKKd\"KKqqy	jj
,
3
3kk%%'* JJ"))$++*A*A*CA*FG !d
   [['')
t*    1446++-JD""4.  JJ01O   	  	  "	iil	hhqkkb 76  1/01sV   B
P8 ?<Q	 R? '1R.8
QQ	
R+AR&&R+.
R<8R? <R? ? S"!S"c           
         [         R                  R                  5       U l        U R                  R	                  5         [         R
                  R                  5       nUR                  SS9  U R                  U5      u  p4[         R                  " X1R                  S9n[        UR                  R                  5      S:w  a  UR                  R                  O0[        R                  " U R                   R#                  5       S   5      nSSSS	.nU R%                  U5      n/ nUR&                  (       a  UR)                  UR&                  5        UR*                  (       + n	UR*                  (       a  UR*                  R-                  S
5      OSn
[.        R0                  " SU
5      n[         R2                  " UUUUU	UUS9nUR5                  U R                  5      $ )zSSH's to a workstation.F)	overwrite)rl   userr   ra   z	/dev/nullno0)UserKnownHostsFileStrictHostKeyCheckingServerAliveInterval N)remotern   optionsextra_flagstty	remainderremote_command)r   EnvironmentCurrentenv
RequireSSHKeysFromFilenameEnsureKeysExistru   Remoter   intlocal_host_portrn   six	text_typerv   r~   _ParseSshFlagsssh_argsextendcommandsplitr   GetRemoteCommand
SSHCommandRun)r#   r2   keysrl   rn   r   r   r   r   r   command_listr   cmds                r%   SshWorkstations.Ssh   sp   &&(DHHH88  "D5)))$/LTZZT		2F t##(()Q. 	!!]]4;;224Q78 	 *!%"G %%d+KI}}t}}%ll
C.2ll4<<%%c*L00|DN
..%C 77488r(   c                     / nUR                   (       aL  UR                    H<  nU(       d  M  US:w  d  M  UR                  5        H  nUR                  U5        M     M>     U$ )z.Obtain extra flags from the command arguments.z--)ssh_flagr   append)r#   r2   r   flag	flag_parts        r%   r   Workstations._ParseSshFlags  sM    K}}--$4DDL::<iy) (   r(   c                     U R                   R                  R                  U R                  R	                  US95      R
                  U l        g ! [         af  nU(       a  U R                  R                  5         [        R                  " SR                  U5      5        [        R                  " S5         S nAg S nAff = f)N)r7   z Error fetching access token: {0}ra   )r   r   GenerateAccessTokenr   hWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsGenerateAccessTokenRequestaccessTokenaccess_tokenr   r!   rk   r   rg   rL   rh   ri   )r#   r7   r   r   s       r%   rs   Workstations._FetchAccessToken  s    
++ll  A  A
--  A  A% A  		 
  	  "	ii299!<=	hhqkk	s   AA 
B>AB99B>c                 p   ^ ^^ U UU4S jn[         R                  " US9nSUl        UR                  5         g )Nc                  Z   >  [         R                  " S5        T R                  TT5        M*  )Ni
  )timesleeprs   )r#   r   r7   s   r%   Refresh1Workstations._RefreshAccessToken.<locals>.Refresh$  s'    

4{H5 r(   targetTr   Threaddaemonstart)r#   r7   r   r   ts   ```  r%   rt    Workstations._RefreshAccessToken#  s*    6
 	(AAHGGIr(   c                     UR                   R                  =(       d    SnUR                   R                  =(       d    SnU[        U5      4$ )N	localhostr   )r   rl   rn   r   )r#   r2   rl   rn   s       r%   ru   Workstations._GetLocalHostPort-  s<    $$3D$$+DT?r(   c                 x  ^ ^^^^	 [         R                  m[        R                  " 5       m[        R
                  R                  R                  R                  5       n[        R
                  R                  R                  R                  5       =(       d    SnU(       a  Sm[         R                  mU(       a  Um[        R                  " ST R                  T R                   4-  SST R"                  -  0UU 4S jU4S jUU 4S jS	9m	UUU	4S
 jn[$        R&                  " US9nSUl        UR+                  5         g)zOpens a WebSocket connection.FNzwss://%s/_workstation/tcp/%dAuthorizationz	Bearer %sc                 (   > TR                  TU 5      $ N)_ForwardClientToServer)wsr   r#   s    r%   <lambda>0Workstations._AcceptConnection.<locals>.<lambda>E  s    466vrBr(   c                 &   > TR                  U5      $ r   )send)r   dataopfinishedr   s       r%   r   r   F  s    v{{4/@r(   c                 (   > TR                  TU5      $ r   )_OnWebsocketError)r   r   r   r#   s     r%   r   r   G  s    t55fa@r(   )headeron_openon_dataon_errorc                  f  > [         R                  R                  R                  R	                  5       n U S:X  d  U S:X  a  [         R                  R                  R
                  R	                  5       n[         R                  R                  R                  R	                  5       n[         R                  R                  R                  R	                  5       [         R                  R                  R                  R	                  5       4nTR                  TTS.SUUUS9  g TR                  TTS.U S9  g )Nhttphttp_no_tunnel)	cert_reqsca_certs)sslopt
proxy_typehttp_proxy_hosthttp_proxy_porthttp_proxy_auth)r   r   )
r   VALUESproxyr   rd   addressrn   usernamepasswordrun_forever)r   r   r   r   r   r   servers       r%   r   +Workstations._AcceptConnection.<locals>.RunJ  s	   $$**5599;j	v	/?!?$++1199==?$++1166::<##,,002##,,002

 	&$ +++ 	 		
 	&$ " 	 	
r(   r   T)sslCERT_REQUIREDr   wherer   r   corecustom_ca_certs_filerd   authdisable_ssl_validationGetBool	CERT_NONE	websocketWebSocketApprl   rn   r   r   r   r   r   )
r#   r   _custom_ca_certsno_validater   r   r   r   r   s
   ``     @@@r%   r   Workstations._AcceptConnection2  s    !!I{{}H '',,AAEEGO55==?H5  h--i h##&$))TYY)??t/@/@!@AB@@F
: 	$AAHGGIr(   c                 l   ^^ UU4S jn[         R                  " US9nSUl        UR                  5         g)z,Forwards data from the client to the server.c                     >  TR                  S5      n U (       d  g  TR                  U 5        M-  ! [        R                   a    [        R
                  " S5         g f = f)Ni   z%Connection to Cloud Workstation lost.)recvr   websocket_exceptions"WebSocketConnectionClosedExceptionr   rg   )r   r   r   s    r%   Forward4Workstations._ForwardClientToServer.<locals>.Forwardm  sW    {{4 
	
++d
  $FF 	
));
<
	s   0 *AAr   TNr   )r#   r   r   r	  r   s    ``  r%   r   #Workstations._ForwardClientToServerk  s*    	 	(AAHGGIr(   c                 l   [        U[        R                  5      (       aP  UR                  S:X  a@  [        R
                  " SR                  U R                  5      5        UR                  5         g[        U[        R                  5      (       a  g[        R
                  " SR                  U5      5        g)zHandles WebSocket errors.i  z;The workstation does not have a server running on port {0}.z$Error connecting to workstation: {0}N)

isinstancer  WebSocketBadStatusExceptionstatus_coder   rg   rL   rn   closer  )r#   r   rg   s      r%   r   Workstations._OnWebsocketError|  s     	5.JJKK$	ii
G
N
Nii
 lln	#FF
 
 	ii6==eDEr(   )r   r   r   r   r   rl   r   rn   rv   r"   r!   N)F)__name__
__module____qualname____firstlineno____doc__r   rE   BETAr&   r4   rI   r\   r   r   r   rs   rt   ru   r   r   r   __static_attributes__ r(   r%   r   r   1   s^    A#'#4#4#9#9 !B$ILI6Y2v,\
7r"Fr(   r   )'r  
__future__r   r   r   rv   r   rh   r   r   apitools.base.py.exceptionsr   r   googlecloudsdk.api_lib.utilr   (googlecloudsdk.api_lib.workstations.utilr	   r
   r   googlecloudsdk.callioper   $googlecloudsdk.command_lib.util.apisr   #googlecloudsdk.command_lib.util.sshr   r   googlecloudsdk.corer   r   r   r   requestsr   r   r   websocket._exceptions_exceptionsr  r   r  r(   r%   <module>r%     sf    5 &  '  
 
   - 1 . F F @ ( : : 3 / # * )  
  4\F \Fr(   