
    +                       S 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\R*                  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.    )annotationsN)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__/   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'   r5   s    r   r+   Kubeconfig.filename@   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 )Nr3    )r&   popr#   r%   r(   get)r)   keys     r   ClearKubeconfig.ClearD   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)   _fprK    gke_gcloud_auth_plugin_file_paths        r   
SaveToFileKubeconfig.SaveToFileK   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 r2   r4   )r)   r.   s     r   SetCurrentContextKubeconfig.SetCurrentContextf   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   
isinstancerD   formattypeKeyError)clsdatar?   errors       r   	_ValidateKubeconfig._Validatei   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   rZ   inner_errorr`   )r]   r+   r^   r_   s       r   LoadFromFileKubeconfig.LoadFromFilev   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   rd   r`   DefaultPath)r]   r*   rJ   r^   r_   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)re   r   IOErrorr   debugrZ   rG   MakeDirrI   rJ   rK   EmptyKubeconfigrS   )r]   r+   r_   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      $ r9   )rq   r    ri   )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   GetEncodedValuerI   environsplitpathseprJ   abspathr   OperatingSystem	IsWindowsrL   r   rZ   )r   home_dir
home_drive	home_paths       r   ri   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)rV   r6   dictrD   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+   strr9   )r*   bytesrJ   r   returnr    )F)r   r    r   boolr   None)r   r   r   r   r   r/   propertyr6   r+   r@   rS   rV   classmethodr`   re   rj   rq   rt   staticmethodri   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   r_   SDK_BIN_PATH_NOT_FOUNDr   rI   rJ   rL   )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,   r-   	namespace)r$   r.   r   )r$   r,   r-   r   ctxs        r   Contextr   5  s.     	#  
 r   c                     S/ / SS0 / S.$ )Nv1r<   Config)
apiVersionr&   r#   r3   kindpreferencesr%   r   r   r   r   rp   rp   C  s!    
 r   r9   )r   ) r   
__future__r   rI   typingr    googlecloudsdk.api_lib.containerr   r   googlecloudsdk.corer   r   core_exceptionsr   r	   r
   googlecloudsdk.core.utilr   r   rG   r   r   r   rM   objectr    r   r   r   r   r   rp   r   r   r   <module>r      s     M " 	  O & = # * $ - 8 .9O!! 9M M *H &pD pDf&H -`	r   