
    ;B                        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	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 ddiZ ejB                  jD                  jF                  dejB                  jH                  jF                  dejB                  jJ                  jF                  ejL                  jO                  dddd      iZ(d(dZ) G d dejT                        Z+d Z, G d dejZ                        Z.d)dZ/ G d  d!ejZ                        Z0d" Z1d# Z2d$ Z3d*d%Z4	 	 	 d+d&Z5d)d'Z6y),zHAnthos command library functions and utilities for the anthoscli binary.    )absolute_import)division)unicode_literalsN)flags)file_parsers)messages)binary_operations)
exceptions)log)
console_io)store)files)	platforms)urllibCOBRA_SILENCE_USAGEtruez2~/.config/google/anthos/kubectl-anthos-config.yamlz>~/Library/Preferences/google/anthos/kubectl-anthos-config.yamlz	%APPDATA%googleanthoszkubectl-anthos-config.yamlc                     t        j                  t        j                        }|j	                  t
               | r|j	                  |        |r|D ]  }|j                  |        |S )z6Return an env dict to be passed on command invocation.)copydeepcopyosenvironupdateDEFAULT_ENV_ARGSpop)
extra_varsexclude_varsenvks       :lib/googlecloudsdk/command_lib/anthos/anthoscli_backend.pyGetEnvArgsForCommandr"   5   sM    bjj!#**JJz	ggaj 	*    c                       e Zd ZdZy)AnthosAuthExceptionz?Base Exception for auth issues raised by gcloud anthos surface.N)__name__
__module____qualname____doc__ r#   r!   r%   r%   A   s    Gr#   r%   c                     t         j                  j                  |       }t         j                  j                  |      }t         j                  j	                  |      xs |}||fS )z=Splits full path into relative(basename) path and parent dir.)r   pathnormpathbasenamedirname)r,   r-   rel_path
parent_dirs       r!   RelativePkgPathFromFullPathr2   E   sL    WWd#(WWh'(wwx(4H*	:	r#   c                   h     e Zd ZdZ fdZddZ	 	 	 	 ddZd Zd Z	 	 	 	 ddZ	d Z
d	 Zd
 Z xZS )AnthosCliWrapper0Binary operation wrapper for anthoscli commands.c                 v    dt         j                  j                  d      i}t        t        |   dd|d| y )NMISSING_EXEC	anthosclibinaryr:   custom_errorsr*   )r   MISSING_BINARYformatsuperr4   __init__selfkwargsr<   	__class__s      r!   r@   zAnthosCliWrapper.__init__P   sJ    //66k6JM 

D* C-C;ACr#   c                 <    ~d||g}|r|j                  d|g       |S )Ngetz	--patternextend)rB   repo_uri
local_destfile_patternrC   	exec_argss         r!   _ParseGetArgszAnthosCliWrapper._ParseGetArgsW   s-    *-I\23r#   c                     ~d|g}|r|j                  d|g       |r|j                  d       |r|j                  d|g       |r|j                  d       |S )Nr   z--repo	--dry-runz
--strategyz	--verbose)rH   append)rB   	local_dirrI   strategydry_runverboserC   rL   s           r!   _ParseUpdateArgsz!AnthosCliWrapper._ParseUpdateArgs`   se     	9%I(+,{#h/0{#r#   c                     ~d|gS )Ndescr*   )rB   rQ   rC   s      r!   _ParseDescribeArgsz#AnthosCliWrapper._ParseDescribeArgsx   s    Ir#   c           
          dj                  t        j                  |      D cg c]  \  }}dj                  ||       c}}      S c c}}w )N,z{}={})joinsix	iteritemsr>   )rB   tagsxys       r!   
_ParseTagszAnthosCliWrapper._ParseTags|   s=    88cmmD6IJ6IdaW^^Aq)6IJKKJs   A
c                    ~|}|j                  d      s|dz  }d|g}|r|j                  d|g       |r|j                  d|g       |r"|j                  d| j                  |      g       |r|j                  d|g       |S )N/initz--descriptionz--namez--tagz--url)endswithrH   ra   )	rB   rQ   descriptionnamer^   info_urlrC   package_pathrL   s	            r!   _ParseInitArgszAnthosCliWrapper._ParseInitArgs   s     	L  %cl&I56$'(!678*+r#   c                     ~dd|d|g}|S )Napplyz-f	--projectr*   )rB   	apply_dirprojectrC   rL   s        r!   _ParseApplyArgsz AnthosCliWrapper._ParseApplyArgs   s    $	;@Ir#   c                 j    ~dd|d|g}|r|j                  d|g       |r|j                  d|g       |S )Nexportz-crm   z
--locationz--output-directoryrG   )rB   clusterro   location
output_dirrC   rL   s          r!   _ParseExportArgsz!AnthosCliWrapper._ParseExportArgs   sH    4+w?Ih/0,j9:r#   c                 ^   |dk(  r | j                   di |S |dk(  r | j                  di |S |dk(  r | j                  di |S |dk(  r | j                  di |S |dk(  r | j                  di |S |dk(  r | j
                  di |S t        j                  dj                  |            )	NrF   r   rW   rd   rl   rr   z$Invalid Operation [{}] for anthosclir*   )	rM   rU   rX   rj   rp   rv   r	   InvalidOperationForBinaryr>   rB   commandrC   s      r!   _ParseArgsForCommandz%AnthosCliWrapper._ParseArgsForCommand   s    %T)&))("T"",V,,&$T$$.v..& T  *6**'!T!!+F++("T"",V,,

5
5.55g>@ @r#   N)NNFF)NNNN)r&   r'   r(   r)   r@   rM   rU   rX   ra   rj   rp   rv   r{   __classcell__rD   s   @r!   r4   r4   M   sR    8C !% $$$0L
 "&"4
@r#   r4   c                     	 t        j                  | |      }d|i}t        j                  |d      S # t        $ r!}t        dj	                  ||            d}~ww xY w)z@Generate a JSON object containing the current gcloud auth token.)allow_account_impersonation
auth_tokenz<Error retrieving auth credentials for {operation}: {error}. )	operationerrorNT)	sort_keys)c_storeGetFreshAccessToken	Exceptionr%   r>   jsondumps)accountr   impersonatedaccess_tokenoutputes         r!   GetAuthTokenr      su    	+..\;L 	lF 
Fd	++	 
 +
FMMq 	N 	*+ ++s   4 	AAAc                   h     e Zd ZdZ fdZed        Z	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	dZd Z	d Z
 xZS )
AnthosAuthWrapperr5   c                 v    dt         j                  j                  d      i}t        t        |   dd|d| y )Nr7   zkubectl-anthosr9   r;   r*   )r   MISSING_AUTH_BINARYr>   r?   r   r@   rA   s      r!   r@   zAnthosAuthWrapper.__init__   sL    ((//7G/HM 

T+ H}H@FHr#   c                     t        j                  t        t        j                  j                         j                           S r|   )r   ExpandHomeAndVarsDEFAULT_LOGIN_CONFIG_PATHr   OperatingSystemCurrentid)rB   s    r!   default_config_pathz%AnthosAuthWrapper.default_config_path   s4    ""!)";";"C"C"E"H"HIK Kr#   c                    ~dg}|r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  dg       |r|r|j                  d|d	|g       |	r|j                  d
|	g       |
r|j                  d|
g       |r|j                  dg       |r|j                  d|g       |S )Nlogin	--cluster--kubeconfigz--login-configz--login-config-cert--userrO   z--ldap-usernamez--ldap-passwordz--preferred-authz--serverz--remote-loginz--remote-bootstraprG   )rB   rs   kube_configlogin_configlogin_config_certuser	ldap_user	ldap_passrS   preferred_auth
server_url
no_browserremote_bootstraprC   rL   s                  r!   _ParseLoginArgsz!AnthosAuthWrapper._ParseLoginArgs   s     		IW-.45(,78-/@AB$'(}%Yi):I
FH*N;<
J/0()*,.>?@r#   c                     ~dg}|j                  d|g       |r|j                  d|g       |r|j                  d|g       |S )Ncreate-login-configr   z--outputz--merge-fromrG   )rB   r   output_file
merge_fromrC   rL   s         r!   _ParseCreateLoginConfigArgsz-AnthosAuthWrapper._ParseCreateLoginConfigArgs  sT    
 	&'Ink23
K01
34r#   c                 0   ~dg}|r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |r|j                  d	|g       |	r|j                  d
|	g       |
r|j                  d|
g       |r|j                  d|g       |r|j                  d|g       |r|j                  d|g       |S )Ntokenz--typer   z--aws-sts-regionz
--id-tokenz--access-tokenz--access-token-expiryz--refresh-tokenz--client-idz--client-secretz --idp-certificate-authority-dataz--idp-issuer-urlz--kubeconfig-pathr   rG   )rB   
token_typers   aws_sts_regionid_tokenr   access_token_expiryrefresh_token	client_idclient_secretidp_certificate_authority_dataidp_issuer_urlkubeconfig_pathr   rC   rL   s                   r!   _ParseTokenArgsz!AnthosAuthWrapper._ParseTokenArgs  s?    		I*-.W-.*N;<h/0(,78/1DEF)=9:y12)=9:%-/M
NP*N;<+_=>$'(r#   c                     |dk(  r | j                   di |S |dk(  r | j                  di |S |dk(  rdgS |dk(  r | j                  di |S t        j                  dj                  |            )Nr   r   versionr   z)Invalid Operation [{}] for kubectl-anthosr*   )r   r   r   r	   rx   r>   ry   s      r!   r{   z&AnthosAuthWrapper._ParseArgsForCommand:  s    '!T!!+F++	)	)-T--777	I	[	G	!T!!+F++77
5
<
<W
EG Gr#   )NNNNNNNNNNNNN)r&   r'   r(   r)   r@   propertyr   r   r   r   r{   r}   r~   s   @r!   r   r      sd    8H K K *\ /3-1"HGr#   r   c                     | j                  t        j                  j                  |      }t	        |      dk7  r%t        dj                  || j                              |j                         S )N   z+Cluster [{}] not found for config path [{}])	FindMatchingItemr   LoginConfigObjectCLUSTER_NAME_KEYlenr%   r>   	file_pathr   )all_configsrs   found_clusterss      r!   _GetClusterConfigr   H  sh    //$$55w@.A
5<<[**	,- - 
			r#   c                 (    d } ||        ||      fS )z)Base64 Encode Ldap username and password.c                 x    t        j                  t        j                  t        j                  |                   S r|   )r\   ensure_textbase64	b64encodeensure_binary)ss    r!   <lambda>z#_Base64EncodeLdap.<locals>.<lambda>T  s#    #//&"2"233D3DQ3G"HIr#   r*   )usernamepasswdencs      r!   _Base64EncodeLdapr   R  s    I#	XF	##r#   c                     d}d}| j                         sydj                  ||      }dj                  ||      }t        j                  d d|      }t        j                  |d 	      }t        ||      S )
z+Prompt User for Ldap Username and Password.Nr   z5Please enter the ldap user for [{}] on cluster [{}]: z9Please enter the ldap password for [{}] on cluster [{}]: c                     t        |       dkD  S Nr   r   r_   s    r!   r   z%_GetLdapUserAndPass.<locals>.<lambda>d  s    #a&1*r#   z*Error: Invalid username, please try again.)	validatorerror_messageprompt_stringc                     t        |       dkD  S r   r   r   s    r!   r   z%_GetLdapUserAndPass.<locals>.<lambda>h  s    #a&1*r#   )validation_callable)IsLdapr>   r   PromptWithValidatorPromptPasswordr   )cluster_config	auth_namers   r   r   user_messagepass_messages          r!   _GetLdapUserAndPassr   X  s    ))				 ++16)W+E ++16)W+E ,,$@ ") ''(<>)	9i	00r#   c                    | syt         j                  j                  |       }|j                  dk(  xs |j                  dk(  }|rt	        j
                  | |xs d      }|j                  t        j                  j                  k7  r/t        dj                  |j                  |j                              | |j                  |fS t        j                  |       }t        j                  |      }|||fS )a  Parses config input to determine whether URL or File logic should execute.

     Determines whether the cluster_config is a file or URL. If it's a URL, it
     then pulls the contents of the file using a GET request. If it's a
     file, then it expands the file path and returns its contents.

  Args:
    cluster_config: str, A file path or URL for the login-config.
    certificate_file: str, Optional file path to the CA certificate to use with
      the GET request to the URL.

  Raises:
    AnthosAuthException: If the data could not be pulled from the URL.

  Returns:
    parsed_config_fileOrURL, config_contents, and is_url
    parsed_config_fileOrURL: str, returns either the URL that was passed or an
      expanded file path if a file was passed.
      config_contents: str, returns the contents of the file or URL.
    is_url: bool, True if the provided cluster_config input was a URL.
  NNNhttphttpsT)verifyzIRequest to login-config URL failed withresponse code [{}] and text [{}]: )r   parseurlparseschemerequestsrF   status_codecodesokr%   r>   textr   ExpandLocalDirAndVersionr   ReadFileContents)r   certificate_file
config_urlis_urlresponseexpanded_config_pathcontentss          r!   GetFileOrURLr   l  s    . 
 ||$$^4*&F**;*;w*F&||N3C3KtLHx~~000 !EEKV$,$8$8(--FIJ J 8==&00 77G##$89(	x	//r#   c                 l   | r|syd}|rB|st        dj                  |            t        j                  |t        j                        }n&t        j                  ||t        j                        }t        ||       }	 |j                         }|r|r|j                         }|st        dj                  |            t        |      dk(  r|j                         }nJdj                  |       }	d	}
|r|r|s|	|
j                  |      z   }	t        j                  ||	d
      }||   }t        j                  j!                  dj                  |             |j#                  |       |r|s|j%                          t'        |||       \  }}|||fS # t        $ r d}Y t        j                  $ r Y yw xY w)z.Get preferredAuthentication value for cluster.r   Nz-Config contents were not passed with URL [{}])file_contents	item_type)r   r   r  z)No Authentication Providers found in [{}]r   zCPlease select your preferred authentication option for cluster [{}]zN. Note: This will overwrite current preferred auth method [{}] in config file.T)messagecancel_optionz/Setting Preferred Authentication option to [{}])r%   r>   r   YamlConfigFiler   r   GetPreferredAuthKeyErrorYamlConfigObjectFieldErrorGetAuthProvidersr   r   r   PromptChoicer   statusPrintSetPreferredAuthWriteToDiskr   )rs   r   config_contentsforce_updater   configsr   auth_method	providersprompt_messageoverride_warningindexr   r   s                 r!   GetPreferredAuthForClusterr    s    l'
9
@
@
NP P))%1O1OQG ))%002G
 %Wg6. 113K 
//1I
5
<
<\
JL L
9~MMOk++16'? 8 
f'*:*A*A+*NN%%
^4Aee$kJJ9@@MO##K0F,^[-46)Y	i	**E 
 K		0	0  s   ?F F3F32F3c                    | j                   r)t        j                  j                  | j                          | j                  r)t        j                  j                  | j                         | j
                  r=t        j                  t        j                  j                  | j                               y|s-t        j                  j                  t        j                         | j                   S )zHandle Login Responses.N)stdoutr   r
  r  stderrfailedr   r   LOGIN_CONFIG_FAILED_MESSAGEr>   LOGIN_CONFIG_SUCCESS_MESSAGE)r   list_clusters_onlys     r!   LoginResponseHandlerr    s    __JJX__%__JJX__%__IIh2299(//JK	JJX::;	r#   r   )F)T)NFF)7r)   
__future__r   r   r   r   r   r   r   !googlecloudsdk.command_lib.anthosr   (googlecloudsdk.command_lib.anthos.commonr   r   &googlecloudsdk.command_lib.util.anthosr	   googlecloudsdk.corer
   c_exceptr   googlecloudsdk.core.consoler   googlecloudsdk.core.credentialsr   r   googlecloudsdk.core.utilr   r   r   r\   	six.movesr   r   r   LINUXr   MACOSXWINDOWSr,   r[   r   r"   Errorr%   r2   StreamingBinaryBackedOperationr4   r   r   r   r   r   r   r  r  r*   r#   r!   <module>r.     s6   O &  '    	 3 A = D 6 # 2 < * .  
 )62  ##&&<$$''H%%((
[(H1	3 	H(.. Hm@(GG m@`,yG)HH yGx$1((0Z 04,1&+	>+Br#   