
    *                     D   d 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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Z G d de      Zd Z G d de      Z G d de      Zd Z G d dej4                        ZdZdZdZdZdddZ  e!dg      Z"ejF                  jI                         ejF                  jJ                  k7  re d xx   d!z  cc<   d2d"Z&d# Z'd$ Z(d% Z)d2d&Z*d' Z+ G d( d)e      Z, G d* d+e      Z-d, Z.d3d-Z/d3d.Z0d3d/Z1 G d0 d1e      Z2y)4zCLibrary for generating the files for local development environment.    )absolute_import)division)print_function)unicode_literalsN)run_subprocess)
exceptions)
properties)
console_io)	platforms)timeszgcloud-local-devc                   &    e Zd ZdZd Zed        Zy)_KubeClusterzA kubernetes cluster.

  Attributes:
    context_name: Kubernetes context name.
    env_vars: Docker env vars.
    shared_docker: Whether the kubernetes cluster shares a docker instance with
      the developer's machine.
  c                      || _         || _        y)zInitializes KubeCluster with cluster name.

    Args:
      context_name: Kubernetes context.
      shared_docker: Whether the kubernetes cluster shares a docker instance
        with the developer's machine.
    N)context_nameshared_docker)selfr   r   s      1lib/googlecloudsdk/command_lib/code/kubernetes.py__init__z_KubeCluster.__init__-   s     %D&D    c                     i S N r   s    r   env_varsz_KubeCluster.env_vars8   s    Ir   N)__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   #   s     	'  r   r   c                  f    t        j                  t        j                  t	               dg            S )z(Returns the current version of minikube.version)sixensure_text
subprocesscheck_output_FindMinikuber   r   r   GetMinikubeVersionr'   =   s#    	00-/91MN	OOr   c                        e Zd ZdZed        Zy)MinikubeClusterzA cluster on minikube.

  Attributes:
    context_name: Kubernetes context name.
    env_vars: Docker environment variables.
    shared_docker: Whether the kubernetes cluster shares a docker instance with
      the developer's machine.
  c                 ,    t        | j                        S r   )_GetMinikubeDockerEnvsr   r   s    r   r   zMinikubeCluster.env_varsL   s    !$"3"344r   N)r   r   r   r   r   r   r   r   r   r)   r)   B   s     5 5r   r)   c                   *    e Zd ZdZ	 	 	 ddZd Zd Zy)Minikubez$Starts and stops a minikube cluster.Nc                 <    || _         || _        || _        || _        y r   )_cluster_name_stop_cluster
_vm_driver_debug)r   cluster_namestop_cluster	vm_driverdebugs        r   r   zMinikube.__init__T   s"    
 &D%DDODKr   c                     t        | j                  | j                  | j                         t	        | j                  | j                  dk(        S )Ndocker)_StartMinikubeClusterr/   r1   r2   r)   r   s    r   	__enter__zMinikube.__enter__^   s8    $,,doot{{K4--t(/JKKr   c                 ^    | j                   r!t        | j                  | j                         y y r   )r0   _StopMinikuber/   r2   r   exc_type	exc_valuetbs       r   __exit__zMinikube.__exit__b   s$    D&&4 r   )TNFr   r   r   r   r   r:   rA   r   r   r   r-   r-   Q   s     , !	L5r   r-   c                      t         j                  j                  j                  j	                         xs t        j                  d      S )Nminikube)r	   VALUEScodeminikube_path_overrideGetr   GetGcloudPreferredExecutabler   r   r   r&   r&   g   s:    



 
 
7
7
;
;
= B

5
5j
ACr   c                       e Zd ZdZy)MinikubeStartErrorz!Error if minikube fails to start.N)r   r   r   r   r   r   r   rK   rK   l   s    )r   rK   zio.k8s.sigs.minikube.stepz&io.k8s.sigs.minikube.download.progresszio.k8s.sigs.minikube.errorzThe minimum allowed is 2 CPUs.z4Not enough CPUs. Cloud Run Emulator requires 2 CPUs.zCannot reach docker daemon.)2969HOST_HOME_PERMISSIONrL   z Increase Docker VM CPUs to 2.c           	         	 t        |       st               dd| dddddg	}|r*|j                  d|z          |d	k(  r|j                  d
       |r|j                  ddg       d| z  }t	        j
                  t        j                  j                  j                  j                  d            j                  }t        j                  |      5 }t        j                  |||      D ]  }|rt!        d|       t#        ||        	 ddd       yy# 1 sw Y   yxY w# t$        $ r:}t'        j(                  t*        |t-        j.                         d          Y d}~yd}~ww xY w)zStarts a minikube cluster.start-pz--keep-contextz--interactive=falsez--delete-on-failurez--install-addons=falsez--output=jsonz--vm-driver=r8   z--container-runtime=dockerz--alsologtostderrz-v8z)Starting development environment '%s' ...T)required)event_timeout_secshow_stderrrD   N   )_IsMinikubeClusterUpr&   appendextendr   ParseDurationr	   rE   rF   minikube_event_timeoutrH   total_secondsr
   ProgressBarr   StreamOutputJsonprint_HandleMinikubeStatusEvent	Exceptionr"   reraiserK   sysexc_info)	r3   r5   r6   cmd	start_msgevent_timeoutprogress_barjson_objes	            r   r9   r9      sJ   ":-
/






"

c 


>I-. 
**1
2	

'/0=Li))



 
 
7
7
;
; < +m  !!),&77=eEH*h'
$\8
<E -,3 .2 -, 
 :KK"As||~a'899:s6   CD 8DD DD D 	E%0EEc                    |d   t         k(  rm|d   }|j                  dd      dk7  rR|j                  dd      dk7  r<t        |d         }t        |d         }|t        |      z  }| j	                  |       yyy|d   t
        k(  rz|d   }|j                  dd      dk7  r_|j                  dd      dk7  rId|v rDt        |d         }t        |d         }t        |d         }||z   |z  }| j	                  |       yyyy|d   t        k(  rTd|d   v rL|d   }d|v rd	|v r|d   t        v rt        |d	         |d   }t        j                  |d
      }t        |      yy)zHandle a minikube json event.typedatacurrentstep 
totalstepsprogressexitcodeidadvicez#Unable to start Cloud Run Emulator.N)
_MINIKUBE_STEPgetintfloatSetProgress_MINIKUBE_DOWNLOAD_PROGRESS_MINIKUBE_ERROR _MINIKUBE_PASSTHROUGH_ADVICE_IDSrK   _MINIKUBE_ERROR_MESSAGES)	rg   rh   rl   current_steptotal_stepscompletion_fractiondownload_progress	exit_codemsgs	            r   r_   r_      s   f'FD xxr"b(TXXlB-G2-Mm,-l\*+k(5+==23	 .N(
 66FD 	#r)r"b(Z4-?m,-l\*+kZ 01),==L23 .@( 	* 	O+
hv>N0NFDT)T
66tH~..z"i$(()NPcs## 1O+r   c                 r    t               dd| dg}t        j                  |d      }t        d |D              S )z8Get the docker environment settings for a given cluster.z
docker-envrQ   z--shell=none   )timeout_secc              3   j   K   | ]+  }|s|j                  d       r|j                  dd       - yw)#=   N)
startswithsplit).0lines     r   	<genexpr>z)_GetMinikubeDockerEnvs.<locals>.<genexpr>   s-      Q%*Td4??3;OdjjaUs   333)r&   r   GetOutputLinesdict)r3   rd   liness      r   r+   r+      sD    	,lNK#

'
'
<%	 Q%*Q 
Q Qr   c                     t               dd| ddg}	 t        j                  |dd      }d|v xr |d   j                         d	k(  S # t        t
        j                  f$ r Y yw xY w)
z(Checks if a minikube cluster is running.statusrQ   -ojsonr   Fr   rT   HostRunning)r&   r   GetOutputJsonstrip
ValueErrorr$   CalledProcessError)r3   rd   r   s      r   rV   rV      sq    	(D,fE#))0FVCv 4 4 6) CC
j33	4 s   3A A"!A"c                     t               dd| g}t        d| z         t        j                  |d|       t        d       y)zStop a minikube cluster.stoprQ   z)Stopping development environment '%s' ...   r   show_output Development environment stopped.Nr&   r^   r   Run)r3   r6   rd   s      r   r<   r<      s;    	&$5#3lBCScu=*+r   c                     t               dd| g}t        d| z         t        j                  |dd       t        d       y)	zDelete a minikube cluster.deleterQ   z)Deleting development environment '%s' ...r   Fr   r   Nr   )r3   rd   s     r   DeleteMinikuber      s;    	(D,7#3lBCScu=*+r   c                   "     e Zd ZdZ fdZ xZS )ExternalClusterzA external kubernetes cluster.

  Attributes:
    context_name: Kubernetes context name.
    env_vars: Docker environment variables.
    shared_docker: Whether the kubernetes cluster shares a docker instance with
      the developer's machine.
  c                 .    t         t        |   |d       y)zgInitializes ExternalCluster with profile name.

    Args:
      cluster_name: Name of the cluster.
    FN)superr   r   )r   r3   	__class__s     r   r   zExternalCluster.__init__
  s     
/4),>r   )r   r   r   r   r   __classcell__)r   s   @r   r   r      s    ? ?r   r   c                   "    e Zd ZdZd Zd Zd Zy)ExternalClusterContextz1Do nothing context manager for external clusters.c                     || _         y r   )_kube_context)r   kube_contexts     r   r   zExternalClusterContext.__init__  s
    %Dr   c                 ,    t        | j                        S r   )r   r   r   s    r   r:   z ExternalClusterContext.__enter__  s    4--..r   c                      y r   r   r=   s       r   rA   zExternalClusterContext.__exit__  s    r   NrB   r   r   r   r   r     s    9&/	r   r   c                  ,    t        j                  d      S )Nkubectl)r   rI   r   r   r   _FindKubectlr      s    		4	4Y	??r   c                 v    t               g}|r|d|gz  }|g dz  }t        j                  |dd      }d| z   |v S )N	--context)ru   
namespacesr   namer   Fr   z
namespace/)r   r   r   )	namespacer   rd   r   s       r   _NamespaceExistsr   $  sP    	#K&&C	,,#,,	ru.*			!Z	//r   c                 l    t               g}|r|d|gz  }|dd| gz  }t        j                  |dd       y )Nr   creater   r   Fr   r   r   r   r   r   rd   s      r   _CreateNamespacer   .  A    	#K&&C(K	++#Sbe<r   c                 l    t               g}|r|d|gz  }|dd| gz  }t        j                  |dd       y )Nr   r   r   r   Fr   r   r   s      r   _DeleteNamespacer   6  r   r   c                   $    e Zd ZdZddZd Zd Zy)KubeNamespacez5Context to create and tear down kubernetes namespace.Nc                 .    || _         || _        d| _        y)zInitialize KubeNamespace.

    Args:
      namespace: (str) Namespace name.
      context_name: (str) Kubernetes context name.
    FN)
_namespace_context_name_delete_namespace)r   r   r   s      r   r   zKubeNamespace.__init__A  s      DO%D"Dr   c                     t        | j                  | j                        s(t        | j                  | j                         d| _        y y )NT)r   r   r   r   r   r   s    r   r:   zKubeNamespace.__enter__L  s8    DOOT-?-?@t(:(:;#d Ar   c                 ^    | j                   r!t        | j                  | j                         y y r   )r   r   r   r   r=   s       r   rA   zKubeNamespace.__exit__Q  s$    t(:(:; r   r   rB   r   r   r   r   r   >  s    =	#$
<r   r   )Fr   )3r   
__future__r   r   r   r   r$   rb   googlecloudsdk.command_lib.coder   googlecloudsdk.corer   r	   googlecloudsdk.core.consoler
   googlecloudsdk.core.utilr   r   r"   DEFAULT_CLUSTER_NAMEobjectr   r'   r)   r-   r&   ErrorrK   rt   ry   rz   !_MINIKUBE_NOT_ENOUGH_CPU_FRAGMENTr|   	frozensetr{   OperatingSystemCurrentLINUXr9   r_   r+   rV   r<   r   r   r   r   r   r   r   r   r   r   r   <module>r      sB   J &  % '  
 : * * 2 . * 
) 6 4P
5l 55v 5,C
*)) * -F .$D ! A
' 
 $-.D-E#F  $$&)*C*C*I*II4 $DD %:P,$^Q,,?l ?&
	V 
	@0==<F <r   