
    ,                    @   S r SSKJr  SSKJr  SSKJr  SSKJr  SSK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\R0                  5      r " S S\5      rSr " S S\5      rS rSS jrSrSS jr SS jr!S r"g) zFUtilities for loading and parsing kubeconfig used for Connect Gateway.    )absolute_import)annotations)division)unicode_literalsN)Any)
kubeconfig)config)
exceptions)log)
properties)yaml)encoding)files)	platformsc                      \ rS rSrSrSrg)Error%   z0Class for errors raised by kubeconfig utilities. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       Clib/googlecloudsdk/command_lib/container/fleet/gwkubeconfig_util.pyr   r   %   s    8r   r   c                      \ rS rSrSrSrg)MissingEnvVarError)   zDAn exception raised when required environment variables are missing.r   Nr   r   r   r   r   r   )   s    Lr   r   gke_gcloud_auth_plugin_cachec                      \ rS rSrSrSS jr\S 5       r\S 5       rS r	S r
S r\S	 5       r\S
 5       r\SSS jj5       r\S 5       r\S 5       r\S 5       rSSS jjrSrg)
Kubeconfig/   z1Interface for interacting with a kubeconfig file.c                0   X l         Xl        0 U l        0 U l        0 U l        U R                  S    H  nX0R                  US   '   M     U R                  S    H  nX@R                  US   '   M     U R                  S    H  nXPR                  US   '   M     g )Nclustersnameuserscontexts)	_filename_datar&   r(   r)   )selfraw_datafilenameclusterusercontexts         r   __init__Kubeconfig.__init__2   s    NJDMDJDM::j)'.mmGFO$ *

7#!%jjf $::j)'.mmGFO$ *r   c                     U R                   S   $ Ncurrent-contextr+   r,   s    r   current_contextKubeconfig.current_context?   s    ::'((r   c                    U R                   $ N)r*   r8   s    r   r.   Kubeconfig.filenameC   s    >>r   c                
   U R                   R                  US 5        U R                  R                  US 5        U R                  R                  US 5        U R                  R                  S5      U:X  a  SU R                  S'   g g )Nr6    )r)   popr&   r(   r+   get)r,   keys     r   ClearKubeconfig.ClearG   sf    MMc4 MMc4 JJNN3zz~~'(C/&(djj"# 0r   c                ,   [        U R                  R                  5       5      U R                  S'   [        U R                  R                  5       5      U R                  S'   [        U R
                  R                  5       5      U R                  S'   [        R                  " U R                  S5      n[        R                  " U R                  SS9 n[        R                  " U R                  U5        SSS5        [        R                  R                  U R                  5      n[        R                  R                  U[        5      n[        R                  R!                  U5      (       a  [        R"                  " US5        gg! , (       d  f       N= f)z^Save kubeconfig to file.

Raises:
  Error: don't have the permission to open kubeconfig file.
r&   r(   r)   NT)privater?   )listr&   valuesr+   r(   r)   r   dump
file_utils
FileWriterr*   ospathdirnamejoin&GKE_GCLOUD_AUTH_PLUGIN_CACHE_FILE_NAMEexistsWriteFileAtomically)r,   _fprN    gke_gcloud_auth_plugin_file_paths        r   
SaveToFileKubeconfig.SaveToFileN   s    "$--"6"6"89DJJztzz0023DJJw!$--"6"6"89DJJz
 			$**d#A			t~~t	<
ii

B 
= ggoodnn-G')ww||7(9$	ww~~677$$%ErJ 8 
=	<s   "F
Fc                     XR                   S'   g r5   r7   )r,   r1   s     r   SetCurrentContextKubeconfig.SetCurrentContexti   s    $+JJ !r   c           
        U(       d  [        S5      e S HB  n[        X   [        5      (       a  M  [        SR                  X   [	        X   5      5      5      e   g! [
         a  n[        SR                  U5      5      eSnAff = f)z2Make sure we have the main fields of a kubeconfig.z
empty file)r&   r(   r)   zinvalid type for {0}: {1}zexpected key {0} not foundN)r   
isinstancerG   formattypeKeyError)clsdatarB   errors       r   	_ValidateKubeconfig._Validatel   s     ,>2#$)T**)00DOLN N 3  >.55e<==>s   A *A 
B'BBc                     [         R                  " U5      nU R                  U5        U " X!5      $ ! [         R                   a)  n[        SR                  XR                  5      5      eS nAff = f)Nz&unable to load kubeconfig for {0}: {1})r   	load_pathr   r]   inner_errorrc   )r`   r.   ra   rb   s       r   LoadFromFileKubeconfig.LoadFromFiley   sh    (^^H%d MM$t	 :: (:AA
%%' ( ((s   1 A.$A))A.Nc                     [         R                  " U5      nU R	                  U5        U(       d  U R                  5       nU " X25      $ ! [         R                   a  n[        SUR                   35      eSnAff = f)zParse a YAML kubeconfig.

Args:
  raw_data: The YAML data to parse
  path: The path to associate with the data. Defaults to calling
    `Kubeconfig.DefaultPath()`.

Returns:
  A `Kubeconfig` instance.

Raises:
  Error: The data is not valid YAML.
z"unable to parse kubeconfig bytes: N)r   loadr   rg   rc   DefaultPath)r`   r-   rM   ra   rb   s        r   LoadFromBytesKubeconfig.LoadFromBytes   so    LYYx d MM$__dt? :: L6u7H7H6IJKKLs   A A9A44A9c                V    U R                  U5      $ ! [        [        4 a  n[        R                  " SR                  X!5      5        [        R                  " [        R                  R                  U5      5        U " [        5       U5      nUR                  5         Us SnA$ SnAff = f)zARead in the kubeconfig, and if it doesn't exist create one there.z6unable to load default kubeconfig: {0}; recreating {1}N)rh   r   IOErrorr   debugr]   rJ   MakeDirrL   rM   rN   EmptyKubeconfigrV   )r`   r.   rb   r   s       r   LoadOrCreateKubeconfig.LoadOrCreate   s    h''7 	iiHOO
 23((3js    B(A:B#B(#B(c                H    U R                  [        R                  5       5      $ r<   )rt   r#   rl   )r`   s    r   DefaultKubeconfig.Default   s    J22455r   c                    [         R                  " [        R                  S5      n U (       aA  U R	                  [        R
                  5      S   n [        R                  R                  U 5      $ [         R                  " [        R                  S5      nU(       d  [        R                  R                  5       (       a  [         R                  " [        R                  S5      n[         R                  " [        R                  S5      nU(       a&  U(       a  [        R                  R                  X#5      nU(       d%  [         R                  " [        R                  S5      nU(       dC  [        SR                  [        R                  R                  5       (       a  SS	95      eSS	95      e[        R                  R                  US
S5      $ )z(Return default path for kubeconfig file.
KUBECONFIGr   HOME	HOMEDRIVEHOMEPATHUSERPROFILEzVenvironment variable {vars} or KUBECONFIG must be set to store credentials for kubectlz&HOMEDRIVE/HOMEPATH, USERPROFILE, HOME,)varsz.kuber	   )r   GetEncodedValuerL   environsplitpathseprM   abspathr   OperatingSystem	IsWindowsrO   r   r]   )r   home_dir
home_drive	home_paths       r   rl   Kubeconfig.DefaultPath   sK    ))"**lCJ##BJJ/2jWW__Z(( ''

F;H	11;;==++BJJDj**2::zBi		77<<
6++BJJF$$*F**4466 < %+ %DE E =C %+ %DE E
 77<<'844r   c                t   XpCU(       a  XCpCU R                  UR                  =(       d    UR                  5        [        [        UR                  R                  5       5      [        UR                  R                  5       5      -   5      U l        [        [        UR                  R                  5       5      [        UR                  R                  5       5      -   5      U l        [        [        UR                  R                  5       5      [        UR                  R                  5       5      -   5      U l        g)a&  Merge another kubeconfig into self.

By default, in case of overlapping keys, the value in self is kept and the
value in the other kubeconfig is lost.

Args:
  kubeconfig: a Kubeconfig instance
  overwrite: whether to overwrite overlapping keys in self with data from
    the other kubeconfig.
N)rY   r9   dictrG   r&   itemsr(   r)   )r,   r   	overwriteleftrights        r   MergeKubeconfig.Merge   s     %E4//H53H3HIU^^!!#$tDMM,?,?,A'BBDDMU[[ !D)9)9);$<<>DJU^^!!#$tDMM,?,?,A'BBDDMr   )r+   r*   r&   r)   r(   )r-   zdict[str, Any]r.   strr<   )r-   bytesrM   r   returnr#   )F)r   r#   r   boolr   None)r   r   r   r   r   r2   propertyr9   r.   rC   rV   rY   classmethodrc   rh   rm   rt   rw   staticmethodrl   r   r   r   r   r   r#   r#   /   s    9/ ) )  )K6, 
> 
>    2 
 
 6 6 5 54D Dr   r#   c                    SU0nU US.$ )z0Generate and return a cluster kubeconfig object.server)r'   r/   r   )r'   r   r/   s      r   Clusterr      s"     ' 
 r   c                ,    [         R                  " U US9$ )ac  Generate and return a user kubeconfig object.

Args:
  name: str, nickname for this user entry.
  auth_provider: str, authentication provider if not using `exec`. `exec` may
    still be used regardless of this parameter's value.
Returns:
  dict, valid kubeconfig user entry.

Raises:
  Error: if no auth_provider is not provided when `exec` is not used.
r'   auth_provider)container_kubeconfigUserr   s     r   r   r      s     
	"	"!
 r   zPath to sdk installation not found. Please switch to application default
credentials using one of

$ gcloud config set container/use_application_default_credentials true
$ export CLOUDSDK_CONTAINER_USE_APPLICATION_DEFAULT_CREDENTIALS=truec                   SU 0nU S:X  a  [         R                  R                  R                  R	                  5       (       d  Sn[
        R                  R                  5       (       a  Sn[        R                  " 5       R                  nUc)  [        R                  " [        5        [        [        5      e[        R                   R#                  X25      SSSS.nXAS	'   U$ )
a  Generate and return an auth provider config.

Constructs an auth provider config entry readable by kubectl. This tells
kubectl to call out to a specific gcloud command and parse the output to
retrieve access tokens to authenticate to the kubernetes master.
Kubernetes gcp auth provider plugin at
https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp

Args:
  name: auth provider name
Returns:
  dict, valid auth provider config entry.
Raises:
  Error: Path to sdk installation not found. Please switch to application
  default credentials using one of

  $ gcloud config set container/use_application_default_credentials true
  $ export CLOUDSDK_CONTAINER_USE_APPLICATION_DEFAULT_CREDENTIALS=true.
r'   gcpgcloudz
gcloud.cmdz"config config-helper --format=jsonz{.credential.access_token}z{.credential.token_expiry})zcmd-pathzcmd-argsz	token-keyz
expiry-keyr	   )r   VALUES	containeruse_app_default_credentialsGetBoolr   r   r   r	   Pathssdk_bin_pathr   rb   SDK_BIN_PATH_NOT_FOUNDr   rL   rM   rO   )r'   providerbin_namer   cfgs        r   _AuthProviderr     s    ( d^(
em!!==EEGGH  **,,h<<>..L	ii&'()) GGLL8812C X	/r   c                ,    UUS.nU(       a  X4S'   U US.$ )z0Generate and return a context kubeconfig object.)r/   r0   	namespace)r'   r1   r   )r'   r/   r0   r   ctxs        r   Contextr   8  s.     	#  
 r   c                     S/ / SS0 / S.$ )Nv1r?   Config)
apiVersionr)   r&   r6   kindpreferencesr(   r   r   r   r   rs   rs   F  s!    
 r   r<   )r   )#r   
__future__r   r   r   r   rL   typingr    googlecloudsdk.api_lib.containerr   r   googlecloudsdk.corer	   r
   core_exceptionsr   r   r   googlecloudsdk.core.utilr   r   rJ   r   r   r   rP   objectr#   r   r   r   r   r   rs   r   r   r   <module>r      s     M & "  ' 	  O & = # * $ - 8 .9O!! 9M M *H &pD pDf&H -`	r   