
    4                     8   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlZddl	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!Z!ddl"Z"ddl#m$Z%  G d d      Z&y)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                       e Zd ZdZej
                  j                  fdZd Zd Z	d Z
ddZd Zd Zdd	Zdd
Zd Zd Zd Zd Zy)Workstationsz9The Workstations set of Cloud Workstations API functions.c                     t        j                  |      | _        t        |      | _        t        |      | _        | j                  j                  | _        t        j                         | _        d| _        y )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__zWorkstations.__init__4   sS    "}5D#M2DK%m4DMKKffDM$??,D D    c                     | j                   j                  |j                  j                  j	                         j                               }| j                  j                  |      j                  S )N)parent)	r   _WorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsListUsableRequestCONCEPTSconfigParseRelativeNamer   
ListUsableworkstations)r"   argslist_usable_reqs      r$   ListUsableWorkstationsz#Workstations.ListUsableWorkstations<   s^    mm  D  D}}##))+88: D O ==##O4AAAr&   c                    |j                   j                  j                         j                         }t	        j
                  |dd      }| j                  j                  |      }| j                  t        j                  t        j                  j                        k7  rM|j                  rA| j                  j                  || j                  j                  |j                              }| j                   j#                  |      }t$        j&                  j)                  dj+                  |             |j,                  r:t$        j&                  j)                  dj+                  |j.                               |S t0        j2                  j5                  |j.                  d	| j                  
      }t7        j8                  | j                   | j:                  j<                        }t7        j>                  ||dj+                  |j.                               t$        j&                  j)                  dj+                  |             y)zStart a workstation.workstationTuse_defaultsname)boostConfig)r8   startWorkstationRequestzStarting workstation: [{}] Check operation [{}] for status.*workstations.projects.locations.operations
collectionr   &Waiting for operation [{}] to completezStarted workstation [{}].N) r*   r4   r,   r-   r   GetFromNamespacer   ZWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsStartRequestr   r   r   r   ReleaseTrackGAboostStartWorkstationRequestr   Startr   statusPrintformatasync_r8   r   REGISTRYParseRelativeNamer   CloudOperationPollerr   projects_locations_operationsWaitFor)r"   r0   workstation_nameworkstation_id	start_reqop_refop_resourcepollers           r$   rF   z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                 ~   |j                   j                  j                         j                         }t	        j
                  |dd      }| j                  j                  |      }| j                  j                  |      }t        j                  j                  dj                  |             |j                  r:t        j                  j                  dj                  |j                               |S t         j"                  j%                  |j                  d| j&                        }t)        j*                  | j                  | j,                  j.                        }t)        j0                  ||d	j                  |j                               t        j                  j                  d
j                  |             y)zStop a workstation.r4   Tr5   r7   zStopping workstation: [{}]r;   r<   r=   r?   zStopped workstation [{}].N)r*   r4   r,   r-   r   r@   r   YWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsStopRequestr   Stopr   rG   rH   rI   rJ   r8   r   rK   rL   r   r   rM   r   rN   rO   )r"   r0   rP   rQ   stop_reqrS   rT   rU   s           r$   rX   zWorkstations.Stoph   sS   }}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                 x	   |j                   j                  j                         j                         j	                         }	 | j
                  j                  j                  | j                  j                  |            }t        |d      r6|j                  r*t        j                  d       t        j                  d       |j                   j                  j                         j	                         }	 | j
                  j"                  j                  | j                  j%                  |            }j*                  | _        |j,                  | _        |j0                  | j                  j2                  j4                  j6                  k7  rF|r| j&                  j)                          t        j                  d       t        j                  d       | j9                  ||       | j;                  ||       | j=                  |      \  }}	t?        j>                  t>        j@                  t>        jB                        | _        | j>                  jE                  t>        jF                  t>        jH                  d       | j>                  jK                  ||	f       | j>                  jM                  d       |	dk(  rIt        jN                  jQ                  djS                  | j>                  jU                         d                t        jN                  jQ                  d	jS                  | j>                  jU                         d                |rjd
| _+        | j&                  j)                          | jV                  r| j>                  jY                         \  }
}| j[                  |
|       | jV                  r<nG	 t]        j^                         5  	 | j>                  jY                         \  }
}| j[                  |
|       0t        jN                  jQ                  d       y# t         $ r Y gw xY w# t         $ rQ}|r| j&                  j)                          t        j                  |       t        j                  d       Y d}~Nd}~ww xY w# 1 sw Y   nxY w# t`        $ r t        jb                  d       Y w xY w)z$Start a TCP tunnel to a workstation.r7   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*   r4   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listenrG   rH   rI   getsocknamer!   accept_AcceptConnectionr   RaisesKeyboardInterruptKeyboardInterruptinfo)r"   r0   threadedconfig_namer+   rP   r4   erg   ri   connaddrs               r$   StartTcpTunnelzWorkstations.StartTcpTunnel   s   --++113::<IIKK{{TTXX
--
d
d e f &1
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 	+X6-x8 ))$/LT4--0B0BCDKKK6,,f.A.A1EKKdD\"KKqqy	jj
,
3
3kk%%'* JJ"))$++*A*A*CA*FG !d
   [['')
dtT*   1446++-JD$""4.  JJ01O   	  	  "	iil	hhqkkb 766  1/01sP   BP 6?P. 8R 2R	P+*P+.	R7ARRRR R98R9c           	         t         j                  j                         | _        | j                  j	                          t         j
                  j                         }|j                  d       | j                  |      \  }}t        j                  ||j                        }t        |j                  j                        dk7  r|j                  j                  n/t        j                  | j                   j#                         d         }dddd	}| j%                  |      }g }|j&                  r|j)                  |j&                         |j*                   }	|j*                  r|j*                  j-                  d
      nd}
t/        j0                  d|
      }t        j2                  |||||	||      }|j5                  | j                        S )zSSH's to a workstation.F)	overwrite)rg   userr   r\   z	/dev/nullno0)UserKnownHostsFileStrictHostKeyCheckingServerAliveInterval N)remoteri   optionsextra_flagstty	remainderremote_command)r   EnvironmentCurrentenv
RequireSSHKeysFromFilenameEnsureKeysExistrp   Remoter   intlocal_host_portri   six	text_typerq   ry   _ParseSshFlagsssh_argsextendcommandsplitr   GetRemoteCommand
SSHCommandRun)r"   r0   keysrg   ri   r   r   r   r   r   command_listr   cmds                r$   SshzWorkstations.Ssh   st   &&(DHHH88  "D5)))$/LT4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                     g }|j                   r@|j                   D ]1  }|s|dk7  s|j                         D ]  }|j                  |        3 |S )z.Obtain extra flags from the command arguments.z--)ssh_flagr   append)r"   r0   r   flag	flag_parts        r$   r   zWorkstations._ParseSshFlags  sK    K}}--$DDL::<iy) (   r&   c                 x   	 | j                   j                  j                  | j                  j	                  |            j
                  | _        y # t        $ r_}|r| j                  j                          t        j                  dj                  |             t        j                  d       Y d }~y d }~ww xY w)N)r4   z Error fetching access token: {0}r\   )r   r   GenerateAccessTokenr   hWorkstationsProjectsLocationsWorkstationClustersWorkstationConfigsWorkstationsGenerateAccessTokenRequestaccessTokenaccess_tokenr   r    rf   r   rb   rI   rc   rd   )r"   r4   r   r   s       r$   rn   zWorkstations._FetchAccessToken  s    
++ll  A  A
--  A  A% A  		 
  	  "	ii299!<=	hhqkk	s   AA 	B9AB44B9c                 r      fd}t        j                  |      }d|_        |j                          y )Nc                  V    	 t        j                  d        j                         ()Ni
  )timesleeprn   )r"   r   r4   s   r$   Refreshz1Workstations._RefreshAccessToken.<locals>.Refresh$  s'    

4{H5 r&   targetTr   Threaddaemonstart)r"   r4   r   r   ts   ```  r$   ro   z Workstations._RefreshAccessToken#  s*    6
 	(AAHGGIr&   c                     |j                   j                  xs d}|j                   j                  xs d}|t        |      fS )N	localhostr   )r   rg   ri   r   )r"   r0   rg   ri   s       r$   rp   zWorkstations._GetLocalHostPort-  s<    $$3D$$+DT?r&   c                 X   	 t         j                  t        j                         t        j
                  j                  j                  j                         }t        j
                  j                  j                  j                         xs d}|rdt         j                  |r|t        j                  d j                   j                   fz  dd j"                  z  i fdfd fd	      		fd
}t%        j&                  |      }d|_        |j+                          y)zOpens a WebSocket connection.FNzwss://%s/_workstation/tcp/%dAuthorizationz	Bearer %sc                 (    j                  |       S N)_ForwardClientToServer)wsr   r"   s    r$   <lambda>z0Workstations._AcceptConnection.<locals>.<lambda>E  s    466vrBr&   c                 &    j                  |      S r   )send)r   dataopfinishedr   s       r$   r   z0Workstations._AcceptConnection.<locals>.<lambda>F  s    v{{4/@r&   c                 (    j                  |      S r   )_OnWebsocketError)r   r   r   r"   s     r$   r   z0Workstations._AcceptConnection.<locals>.<lambda>G  s    t55fa@r&   )headeron_openon_dataon_errorc                  n   t         j                  j                  j                  j	                         } | dk(  s| dk(  rt         j                  j                  j
                  j	                         }t         j                  j                  j                  j	                         }t         j                  j                  j                  j	                         t         j                  j                  j                  j	                         f}j                  dd|||       y j                  d|        y )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   r_   addressri   usernamepasswordrun_forever)r   r   r   r   r   r   servers       r$   r   z+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_filer_   authdisable_ssl_validationGetBool	CERT_NONE	websocketWebSocketApprg   ri   r   r   r   r   r   )
r"   r   _custom_ca_certsno_validater   r   r   r   r   s
   ``     @@@r$   r{   z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                 n    fd}t        j                  |      }d|_        |j                          y)z,Forwards data from the client to the server.c                      	 j                  d      } | sy 	 j                  |        '# t        j                  $ r t	        j
                  d       Y y w xY w)Ni   z%Connection to Cloud Workstation lost.)recvr   websocket_exceptions"WebSocketConnectionClosedExceptionr   rb   )r   r   r   s    r$   Forwardz4Workstations._ForwardClientToServer.<locals>.Forwardm  sW    {{4 
	
++d
  $FF 	
));
<
	s   * (AAr   TNr   )r"   r   r   r   r   s    ``  r$   r   z#Workstations._ForwardClientToServerk  s*    	 	(AAHGGIr&   c                 R   t        |t        j                        rN|j                  dk(  r?t	        j
                  dj                  | j                               |j                          yt        |t        j                        ryt	        j
                  dj                  |             y)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   rb   rI   ri   closer   )r"   r   rb   s      r$   r   zWorkstations._OnWebsocketError|  s     	5.JJK$	ii
G
N
Nii
 lln	#FF
 	ii6==eDEr&   N)F)__name__
__module____qualname____doc__r   rB   BETAr%   r2   rF   rX   r   r   r   rn   ro   rp   r{   r   r    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   rq   r   rc   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&   