
    o                     |   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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ZdZdZdZdZdZddgZ dZ!e!dz   Z"dZ#dZ$ddddZ% G d d ejL                        Z'e'jP                  Z)d! Z* G d" d#e	jV                        Z+ G d$ d%e+      Z, G d& d'e+      Z-d( Z.d) Z/d* Z0 G d+ d,e+      Z1d- Z2d. Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:	 dDd6Z;	 	 dEd7Z<d8 Z=	 	 dEd9Z>	 	 dEd:Z?	 	 dEd;Z@d< ZAd= ZBd> ZCd? ZD	 	 dEd@ZEdA ZF	 dFdBZGdC ZHy)Gz:Functions for creating GCE container (Docker) deployments.    )absolute_import)division)unicode_literalsN)
exceptions)metadata_utils)poller)waiter)
properties)yaml)universe_descriptor)files)timesa  #cloud-config
runcmd:
- ['/usr/bin/kubelet',
   '--allow-privileged=%s',
   '--manifest-url=http://metadata.google.internal/computeMetadata/v1/instance/attributes/google-container-manifest',
   '--manifest-url-header=Metadata-Flavor:Google',
   '--config=/etc/kubernetes/manifests']
a  # DISCLAIMER:
# The option to deploy a container during VM creation using the container
# startup agent is deprecated. Use alternative services to run containers on
# your VMs. Learn more at https://cloud.google.com/compute/docs/containers/migrate-containers.

zgoogle-container-manifestzgce-container-declarationzgoogle-logging-enabledzgci-ensure-gke-dockerTCPUDPzcos-stable-55z	cos-cloud?   Never	OnFailureAlways)neverz
on-failurealwaysc                       e Zd ZdZdZd Zy)MountVolumeMode)   )   c                 (    | t         j                  k(  S N)r   	READ_ONLY)selfs    6lib/googlecloudsdk/api_lib/compute/containers_utils.py
isReadOnlyzMountVolumeMode.isReadOnlyV   s    ?,,,,    N)__name__
__module____qualname__r   
READ_WRITEr!    r"   r    r   r   R   s    )*-r"   r   c                      | rdnd}t         |z  S )z,Gets user-init metadata value for COS image.truefalse)USER_INIT_TEMPLATE)allow_privilegedallow_privileged_vals     r    _GetUserInitr.   ]   s    #3	3	44r"   c                       e Zd ZdZy)ErrorzBase exception for containers.N)r#   r$   r%   __doc__r'   r"   r    r0   r0   c   s    &r"   r0   c                   "     e Zd ZdZ fdZ xZS )InvalidMetadataKeyExceptionz=InvalidMetadataKeyException is for not allowed metadata keys.c                 J    t         t        |   dj                  |             y )Nz@Metadata key "{0}" is not allowed when running containerized VM.)superr3   __init__format)r   metadata_key	__class__s     r    r6   z$InvalidMetadataKeyException.__init__j   s     	
%t5J		r"   r#   r$   r%   r1   r6   __classcell__r9   s   @r    r3   r3   g   s    E r"   r3   c                   "     e Zd ZdZ fdZ xZS )$NoGceContainerDeclarationMetadataKeyzERaised on attempt to update-container on instance without containers.c                 R    t         t        |   dj                  t                     y )Nz>Instance doesn't have {} metadata key - it is not a container.)r5   r>   r6   r7   GCE_CONTAINER_DECLARATIONr   r9   s    r    r6   z-NoGceContainerDeclarationMetadataKey.__init__t   s$    	
.>HOO%	
r"   r:   r<   s   @r    r>   r>   q   s    M r"   r>   c                     | j                   D ]/  }|j                  t        t        fv st	        |j                         y)a	  Validates if user-specified metadata.

  Checks if it contains values which may conflict with container deployment.
  Args:
    metadata: user-specified VM metadata.

  Raises:
    InvalidMetadataKeyException: if there is conflict with user-provided
    metadata
  N)itemskeyCONTAINER_MANIFEST_KEY
GKE_DOCKERr3   )metadataentrys     r    ValidateUserMetadatarI   |   s3     ~~eyy+Z88'		22 r"   c                 ,    |r| j                  |      S y)zECreate tags message with parameters for container VM or VM templates.)rC   N)Tags)messagestagss     r    CreateTagsMessagerN      s    	==t=$$ 
r"   c                 <   |j                  |d      j                         j                  dd      }| i } || d<   t        t	        j
                  |             D cg c]"  \  }}|j                  j                  ||      $ }}}|j                  |      S c c}}w )a  Returns message with labels for instance / instance template.

  Args:
    labels: dict, labels to assign to the resource.
    image_uri: URI of image used as a base for the resource. The function
      extracts COS version from the URI and uses it as a value of `container-vm`
      label.
    resources: object that can parse image_uri.
    resource_class: class of the resource to which labels will be assigned. Must
      contain LabelsValue class and resource_class.LabelsValue must contain
      AdditionalProperty class.
  zcompute.images
collection/-zcontainer-vm)rD   value)additionalProperties)ParseNamereplacesortedsix	iteritemsLabelsValueAdditionalProperty)labels	image_uri	resourcesresource_classcos_versionkvadditional_propertiess           r    GetLabelsMessageWithCosVersionrf      s      ooi,<o=tvwsC 
 ^F&& v.//$!Q   333C/   
	#	#9N	#	OO	s   'Bc                   "     e Zd ZdZ fdZ xZS )NoCosImageExceptionz)Raised when COS image could not be found.c                 R    t         t        |   dj                  t                     y )Nz6Could not find COS (Cloud OS) for release family '{0}')r5   rh   r6   r7   COS_MAJOR_RELEASErA   s    r    r6   zNoCosImageException.__init__   s$    	
t-@GG	
r"   r:   r<   s   @r    rh   rh      s    1 r"   rh   c                     t        j                         r| S t        j                         j	                  t        j
                               j                  }|dz   | z   S )N:)r
   IsDefaultUniverser   UniverseDescriptorGetGetUniverseDomainproject_prefix)project_nameprefixs     r    _AddUniversePrefixrt      sP    !!# 	..0	Z))+	,	 
 C<,&&r"   c           	          | j                   }| j                  |j                  d| j                  j	                  t        t                    fg      }t        |      S )z!Select a COS image to run Docker.Listproject)apitools_clientMakeRequestsimagesrL   ComputeImagesListRequestrt   COS_PROJECT_SelectNewestCosImage)compute_clientcomputer{   s      r    ExpandCosImageFlagr      s_    **'&&nn66$[1 7 ) ( & 
v	&&r"   c                     t        | D cg c]$  }|j                  j                  t              s#|& c}d       }|s
t	               |d   j
                  S c c}w )z'Selects newest COS image from the list.c                 @    t        j                  | j                        S r   )r   ParseDateTimecreationTimestamp)xs    r    <lambda>z'_SelectNewestCosImage.<locals>.<lambda>   s    E''(;(;<r"   rD   )rY   name
startswithrj   rh   selfLink)r{   image
cos_imagess      r    r~   r~      sW     M&EJJ$9$9:K$Lu&M
<* 


	B	 	   Ns
   $AAc           	      j   g }| D ]  }t        j                  d|      }|st        j                  dd      |j	                         \  }}}|t
        vr8t        j                  ddj                  dj                  t
                          |j                  t        |      t        |      |d        |S )z"Parses and validates port mapping.z^(\d+):(\d+):(\S+)$z--port-mappingsz=Port mappings should follow PORT:TARGET_PORT:PROTOCOL format.zProtocol should be one of [{0}]z, )containerPorthostPortprotocol)
rematchcalliope_exceptionsInvalidArgumentExceptiongroupsALLOWED_PROTOCOLSr7   joinappendint)port_mappingsports_configport_mappingmapping_matchporttarget_portr   s          r    _ValidateAndParsePortMappingr      s    ,#lHH3\BM88

I  #0"6"6"8D+x((88

+
2
2ii)*  [)I  $( 
r"   c           
         | j                   }| j                  |j                  d| j                  j	                  t        t                    fg      }d}g d}|D ]  }|j                  |      }d }t        |D cg c]%  }t        j                  ||j                        s$|' c} ||            }	|	s\  ||      |	d         d   t        k\  sx|	d   j                  c S  t               c c}w )	a  Select a COS image to run Konlet.

  This function scans three families in order:
  - stable
  - beta
  - dev
  looking for the first image with version at least _MIN_PREFERRED_COS_VERSION.

  Args:
    compute_client: ClientAdapter, The Compute API client adapter

  Returns:
    COS image at version _MIN_PREFERRED_COS_VERSION or later.

  Raises:
    NoCosImageException: No COS image at version at least
    _MIN_PREFERRED_COS_VERSION was found. This should not happen if backend is
    healthy.
  rv   rw   zcos-{}-(\d+)-.*)stablebetadevc                       fd}|S )Nc                     t        t        j                  | j                        j	                  d            }t        j                  | j                        }||fS )Nr   )r   r   r   r   groupr   r   r   )r   version	timestampname_res      r    CreateComparisonKeyzVExpandKonletCosImageFlag.<locals>.MakeCreateComparisonKey.<locals>.CreateComparisonKey  sH    bhhw

399!<=''(?(?@		!!r"   r'   )r   r   s   ` r    MakeCreateComparisonKeyz9ExpandKonletCosImageFlag.<locals>.MakeCreateComparisonKey  s    "
 ! r"   r   r   r   )ry   rz   r{   rL   r|   rt   r}   r7   rY   r   r   r   _MIN_PREFERRED_COS_VERSIONr   rh   )
r   r   r{   name_re_templateimage_familiesfamilyr   r   r   r   s
             r    ExpandKonletCosImageFlagr      s    ( **'&&nn66$[1 7 ) ( & (,.f%%f-G! "DF5bhhw

&CFD#G,J
 	,#G,Z^<Q?%& ^$$$) , 	 	Es   ;%C/
!C/
c           	         i }| s|S t        j                  |       5 }t        |      D ]  \  }}|j                         }t	        |      dk  s|d   dk(  r-|j                  d      }|dk(  r&t        j                  dj                  | ||            |d| }||dz   d }d|v sd	|v r&t        j                  d
j                  | ||            |||<    	 ddd       |S # 1 sw Y   |S xY w)a  Read environment variable from file.

  File format:

  It is intended (but not guaranteed) to follow standard docker format
  [](https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file)
  but without capturing environment variables from host machine.
  Lines starting by "#" character are comments.
  Empty lines are ignored.
  Below grammar production follow in EBNF format.

  file = (whitespace* statement '\n')*
  statement = comment
            | definition
  whitespace = ' '
             | '\t'
  comment = '#' [^\n]*
  definition = [^#=\n] [^= \t\n]* '=' [^\n]*

  Args:
    filename: str, name of the file to read

  Returns:
    A dictionary mapping environment variable names to their values.
  r   r   #=r   z/Syntax error in {}:{}: Expected VAR=VAL, got {}N 	zHSyntax error in {}:{} Variable name cannot contain whitespaces, got "{}")	r   
FileReader	enumeratestriplenfindr   BadFileExceptionr7   )filenameenv_varsfilineassignment_op_locenvvals           r    _ReadDictionaryr   1  s   6 (	O!QQ<4ZZ\d	Ta47c>))C.	b	 !22=DD!T
 	

 ##$c"Q&()c	ts{!22xC0
 	
 hsm+   ". 
// ". 
/s   B7CC(c                 $    dj                  |       S )Nzhost-path-{}r7   idxs    r    _GetHostPathDiskNamer   i  s    			s	##r"   c                 $    dj                  |       S )Nztmpfs-{}r   r   s    r    _GetTmpfsDiskNamer   m  s    			3	r"   c                 $    dj                  |       S )Nzpd-{}r   r   s    r    _GetPersistentDiskNamer   q  s    		r"   c           	         |xs g }|xs g }d}| D ]t  }t        |      |v r|dz  }t        |      |v r|j                  d      }|j                  d      }fd}	 |	||      }
|
r|
d   }nt        |      }|j                  |       |st        |      dk7  rt	        j
                  dd      |d   j                  d      }|d   j                  d|      |k7  r7t        j
                  dd	j                  |d   j                  d                  |j                  ||d
   |j                  dt              j                         d       |
r?||ddd}|r|d   j                  d|i       j                  |       |dz  }w y)z-Add volume specs from --container-mount-disk.r   r   r   	partitionc                     D ]A  }|j                  di       }|j                  d      | k(  s*|j                  d      |k(  s?|c S  y )NgcePersistentDiskpdNamer   )get)device_namer   volume_specpdvolumess       r    _GetMatchingVolumez6_AddMountedDisksToManifest.<locals>._GetMatchingVolume  sE     +__0"566({*rvvk/Bi/O
 !r"   z--container-mount-diskzdMust specify the name of the disk to be mounted unless exactly one disk is attached to the instance.device-namezMust not have a device-name that is different from disk name if disk is being attached to the instance and mounted to a container: [{}]
mount-pathmoder   	mountPathreadOnlyext4)r   fsType)r   r   r   N)r   r   r   r   r   r   r   r7   _DEFAULT_MODEr!   update)container_mount_diskr   volume_mounts
used_namesdisksr   
mount_diskr   r   r   repeatedr   r   s    `           r    _AddMountedDisksToManifestr   u  s    R*
+2%	#(j
 
%
3	Qhc !
%
3 ..(K{+I "+y9Hfd#C(d 
Uq!::$4
 	

 !HLL(k	qm[	1[	@11$F58<<67	
 	
 -NN6=9DDF  (3vFK %&--{I.FGNN;1HCm )r"   c           	      v   | j                   |d}| j                  | j                  g|d<   | j                  | j                  |d<   | j                  |d<   | j                  |d<   d| j
                  i|d<   t        | j                        }| j                  xs g D ]$  }t        j                  |      D ]
  \  }}|||<    & |r.t        j                  |      D cg c]
  \  }}||d c}}|d	<   g }	g }
t        | j                  xs g       D ]j  \  }}|	j                  t        |      d
|d   id       |
j                  t        |      |d   |j                  dt               j#                         d       l t        | j$                  xs g       D ]D  \  }}|	j                  t'        |      ddid       |
j                  t'        |      |d   d       F |r6|xs g }| j(                  xs g | j*                  xs g z   }t-        ||	|
|       |
|d<   d|g|	t.        | j0                     di}|S c c}}w )zDCreate container manifest from argument namespace and instance name.)r   r   commandargsstdintty
privilegedsecurityContextr   rT   r   path	host-pathr   hostPathr   r   r   mediumMemoryr   emptyDirr   r   )r   volumeMountsspec)
containersr   restartPolicy)container_imagecontainer_commandcontainer_argcontainer_stdincontainer_ttycontainer_privilegedr   container_env_filecontainer_envrZ   r[   r   container_mount_host_pathr   r   r   r   r!   container_mount_tmpfsr   diskcreate_diskr   RESTART_POLICY_APIcontainer_restart_policy)r   instance_namecontainer_mount_disk_enabledr   	containerr   env_var_dictr   r   r   r   r   volumetmpfsr   manifests                   r    _CreateContainerManifestr    so    ,,mD)	' 223Ii	#**If++)G'')E".0I0I!J)T445(((.B.lMM,/Shsm 0 / 47MM(4K4KSs#4KIe '-t==CDkc6NN$S)VK01  $S)L)JJv}5@@B  E d88>B?jc5NN"3'h5IJ "3'eL6IJ	 @ "/52YY_"!1!1!7R8Eg}E ,)N "-d.K.KL( 
/Ws   H5c                 :    t         t        j                  |       z   S )z5Dumps data dict to YAML in format expected by Konlet.)MANIFEST_DISCLAIMERr   dump)datas    r    DumpYamlr    s    	tyy	..r"   c                 2    t        t        | |||            S )z(Helper to create the container manifest.r  r   )r  r  )r   r  r  r   s       r    _CreateYamlContainerManifestr     s%     


'C3	
 r"   c                 h    t         t        ||||      t        di}t        j                  | ||      S )z)Helper to create the metadata for konlet.r  r)   )rG   existing_metadata)r@   r  'STACKDRIVER_LOGGING_AGENT_CONFIGURATIONr   ConstructMetadataMessage)rL   r   r  user_metadatar  r   konlet_metadatas          r    CreateKonletMetadataMessager&    sE      !=

'C3	" .v
/ 
	0	0M
 r"   c           	         t        j                  |j                  j                        }t	        | ||||      }t        | ||||      xs |}|j                  j                  D ]  }	|	j                  t        k(  st        | |	||||       |j                  j                  j                   |j                  j                  dd|j                  i|j                               }
| j                  j!                  |
j"                  d      }t%        j&                  ||dj)                  |j+                                     }|j,                  |j                  j.                  j0                  j2                  k(  r|xs |c S |j,                  |j                  j.                  j0                  j4                  k(  rt7        | ||      xs |c S t7        | ||       t9        | ||      xs |c S  t;               )z.Update an instance and its container metadata.r  rG   compute.zoneOperationsrP   z)Updating specification of container [{0}]r'   )r   Pollerry   	instances_UpdateShieldedInstanceConfig#_SetShieldedInstanceIntegrityPolicyrG   rC   rD   r@   UpdateMetadataSetMetadatarL   "ComputeInstancesSetMetadataRequestAsDictr`   rV   r   r	   WaitForr7   rW   statusInstanceStatusValueValuesEnum
TERMINATED	SUSPENDED_StopVm_StartVmr>   )holderclientinstance_refinstancer   r  r   operation_pollerresultrG   	operationoperation_refset_metadata_waiters                r    UpdateInstancerB  *  s    ]]6#9#9#C#CD(f&d&
 *
&*L$  
	 	 ##))h||00



'C3 ((22>>
<&//
<
< ((,8,?,?,Ai &&,,


)A - m #NN


5
<
<! //__%%;;FFG #,f,
//__%%;;EEF vv|4>>-5??U *X 	-..r"   c                 F   |j                   |j                  |j                  y|j                  j	                  |j                   |j                  |j                        }|j                  j                  |j                         |j                  ||j                        }|j                  j                  j                  |      }| j                  j                  |j                  d      }t        j                   ||dj#                  |j                                     S )z$Update the Shielded Instance Config.N)enableSecureBoot
enableVtpmenableIntegrityMonitoring)r<  rx   shieldedInstanceConfigzoner(  rP   z0Setting shieldedInstanceConfig of instance [{0}])shielded_vm_secure_bootshielded_vm_vtpm shielded_vm_integrity_monitoringrL   ShieldedInstanceConfig3ComputeInstancesUpdateShieldedInstanceConfigRequestrW   rx   rH  ry   r*  UpdateShieldedInstanceConfigr`   rV   r   r	   r1  r7   )	r9  r:  r=  r;  r   shielded_config_msgrequestr?  r@  s	            r    r+  r+  q  s   
 ""*



'

/
/
7>>33&& $ E E ? 
 OOOO  """0	 P ' $$..KK) ""((%= ) - 
8??




 r"   c                    |j                   j                  d      }|j                  d      sy|j                   j                  |j	                         |j
                  ||j                        }|j                  j                  j                  |      }| j                  j                  |j                  d      }t        j                  ||dj                  |j	                                     S )	z+Set the Shielded Instance Integrity Policy.T)updateAutoLearnPolicy"shielded_vm_learn_integrity_policyN)r<  rx   shieldedInstanceIntegrityPolicyrH  r(  rP   z9Setting shieldedInstanceIntegrityPolicy of instance [{0}])rL   ShieldedInstanceIntegrityPolicyIsSpecified9ComputeInstancesSetShieldedInstanceIntegrityPolicyRequestrW   rx   rH  ry   r*  "SetShieldedInstanceIntegrityPolicyr`   rV   r   r	   r1  r7   )	r9  r:  r=  r;  r   shielded_integrity_policy_msgrP  r?  r@  s	            r    r,  r,    s    
 oo55 $ 6    
		>	?ooOO$$&&&*G  	 P  
 &&II
 
 ""((%= ) - 
AHH




 r"   c                    |j                   j                  j                   |j                  j                  di |j                               }| j                  j                  |j                  d      }t        j                  |j                   j                        }t        j                  ||dj                  |j                                     S )zStop the Virtual Machine.r(  rP   zStopping instance [{0}]r'   )ry   r*  StoprL   ComputeInstancesStopRequestr0  r`   rV   r   r   r)  r	   r1  r7   rW   r9  r:  r;  r?  r@  r=  s         r    r7  r7    s    $$..331foo11JL4G4G4IJ) ""((%= ) - ]]6#9#9#C#CD	&&|'8'8':;
 r"   c                    |j                   j                  j                   |j                  j                  di |j                               }| j                  j                  |j                  d      }t        j                  |j                   j                        }t        j                  ||dj                  |j                                     S )zStart the Virtual Machine.r(  rP   zStarting instance [{0}]r'   )ry   r*  StartrL   ComputeInstancesStartRequestr0  r`   rV   r   r   r)  r	   r1  r7   rW   r]  s         r    r8  r8    s    $$..442foo22K\5H5H5JK) ""((%= ) - ]]6#9#9#C#CD	&&|'8'8':;
 r"   c           	         t        j                  |j                        }|j                  d      r|j                  |d   d   d   d<   |j                  d      r|j
                  g|d   d   d   d<   |j                  d      r|d   d   d   j                  dd	       |j                  d
      r|j                  |d   d   d   d<   |j                  d      r|d   d   d   j                  dd	       |j                  du rd|d   d   d   d   d<   |j                  du rd|d   d   d   d   d<   |r|xs g }|j                  }ng }g }t        | ||j                  xs g |j                  xs g |j                  xs g ||       t        |t        j                   j#                  |j$                  xs g       |j&                  |j(                  xs g        |j*                  du rd|d   d   d   d<   |j*                  du rd|d   d   d   d<   |j,                  du rd|d   d   d   d<   |j,                  du rd|d   d   d   d<   |j                  d      rt.        |j0                     |d   d<   t3        |      |_        y	)z6Update konlet metadata entry using user-supplied data.r  r   r   r   r   r  r   clear_container_commandNr  r   clear_container_argsTr   r   Fr   r   r  r  )r   loadrT   rV  r  r  popr  r  r   _UpdateMountsremove_container_mountsr
  r  
_UpdateEnv	itertoolschainfrom_iterableremove_container_envr  r	  r  r  r  r  r  )r9  rG   r   r<  r  r   r  r   s           r    r-  r-    s    YYx~~&(	'(151E1EHV\"1%g.	)*484J4J3KHV\"1%i0	/0V\"1%)))T:	o&040B0BHV\"1%f-	,-V\"1%))&$7	$&IMHV\"1%&78F	%'INHV\"1%&78F!/52NNEE
""(b
$$*
  &B oo##D$=$=$CD

B	 
T!15HV\"1%g.	U"16HV\"1%g.	4/3HV\"1%e,	5 /4HV\"1%e,	01(:%%)HV_% H%(.r"   c           	      v   t        |||||       |d   d   D cg c]  }|d   	 }}g }	g }
d}|D ]  }t        |      |v r|dz  }t        |      |v rt        |      }|dz  }|	j                  |d|d   id	       |
j                  ||d
   |j                  dt              j                         d        |D ]_  }t        |      |v r|dz  }t        |      |v rt        |      }|dz  }|	j                  |ddid       |
j                  ||d
   d       a |r]|D cg c]B  }|j                  | j                  j                  |j                        j                         dD }}t        ||	|
||       |d   d   d   d   j                  |
       |d   d   j                  |	       yc c}w c c}w )z%Updates mounts in container manifest.)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )r   r   r   r   N)_CleanupMountsr   r   r   r   r!   r   
deviceNamer`   rV   sourcerW   r   extend)r9  r  rg  r
  r  r   r   r  r   r   r   next_volume_indexr   r  r  s                  r    rf  rf  /  s!    / .6f-=i-HI-H6v-H*I'-)f
0
1Z
?1 0
1Z
? 12DNNVK01  L)JJv}5@@B  * %e
-
.*
<1 -
.*
<./DNNDx.BCD$U<5HIJ %  
 D  ??$$**4;;7<<>	
  
   6< #N3::=I
69$$W-] J<s   F1#AF6c                 .   |xs g }|dd }|D ]  }|j                  |d           |D ]  }|j                  |d           |D ]  }|j                  |d           g }	g }
g }| d   d   d   j                  dg       D ]C  }|d   |vr&|	j                  |       |
j                  |d          0|j                  |d          E |	| d   d   d   d<   g }| d   j                  d	g       D ]"  }|d   |
v s|d   |vs|j                  |       $ || d   d	<   y)
z4Remove all specified mounts from container manifest.Nr   r   r   r   r   r   r   r   )r   r   )r  rg  r
  r  r   mount_paths_to_remove	host_pathr  r  used_mountsused_mounts_namesremoved_mount_namesmountused_volumesr  s                  r    rn  rn  s  se    .3 2!4,i  <!89 -$e  |!45 %"d  l!34 # +-a044^RHe[!66uV}-  v/ I 7B(6< #N3 , $$Y3fv++&>!44&! 4 !-(69r"   c                    i }| d   d   d   j                  dg       D ]  }|j                  d      ||d   <    |D ]  }|j                  |d        |j                  t        |             |D ]$  }t	        j
                  |      D ]
  \  }}|||<    & |r8t	        j
                  |      D cg c]
  \  }}||d c}}| d   d   d   d<   yyc c}}w )	z3Update environment variables in container manifest.r   r   r   r   rT   r   Nr   )r   re  r   r   rZ   r[   )	r  rl  r  r	  current_envenv_valr   r  r   s	            r    rh  rh    s    
 +&!,/266ubAg#*;;w#7K  B "cOOC " _%789#lMM,/Sk# 0 $ 47MM+4N04NSs#4N0HV\"1%e, 0s   0C)NN)FNr   )Ir1   
__future__r   r   r   enumri  r   googlecloudsdk.api_lib.computer   r   )googlecloudsdk.api_lib.compute.operationsr   googlecloudsdk.api_lib.utilr	   googlecloudsdk.callioper   googlecloudsdk.corer
   r   'googlecloudsdk.core.universe_descriptorr   googlecloudsdk.core.utilr   r   rZ   r+   r  rE   r@   r"  rF   r   COS_MAJOR_RELEASE_PREFIXrj   r}   r   r  Enumr   r&   r   r.   r0   r3   r>   rI   rN   rf   rh   rt   r   r~   r   r   r   r   r   r   r   r  r  r  r&  rB  r+  r,  r7  r8  r-  rf  rn  rh  r'   r"   r    <module>r     s   A &  '   	 5 9 < . E * $ G * * 
   5 7 *B '$
EN  )  -t3    -dii -  **5'J '% 5 3 %P<% 	'
'!45p5p$ 
 JN=F "'	CL/ "'	, "'> "'D/N"J$N$. "'K&\A.R +-\r"   