
    _o                        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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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Z ej@                  ddd      ejB                   ejD                  ejF                  jH                         G d dejJ                                             Z& ejD                  ejF                  jN                         G d de&             Z( ejD                  ejF                  jR                         G d de(             Z*dddde&_+        y )"z>Command for creating instance templates running Docker images.    )absolute_import)division)unicode_literals)base_classes)containers_utils)image_utils)instance_template_utils)instance_utils)metadata_utils)utils)base)
exceptions)
completers)flags)labels_util)logFc                 L   | j                   j                  t        j                         t	        j
                  |        t        j                  | |       t        j                  | |||       |t        j                  j                  k(  rt        j                  |        n2|t        j                  j                  k(  rt        j                  |        t        j                  |        t        j                   |        t        j"                  | dd|       t        j$                  |        |t        j                  j                  fv }t        j&                  | |       t        j(                  |        t        j*                  |        t        j,                  | d       t        j.                  |        t        j0                  |        t        j2                  |        t        j4                  |        t        j6                  |        t        j8                  | |       t        j:                  | d       t        j<                  |        t        j>                  |        t        j@                  |        t        jB                  |        tE        jF                  |        t        jH                  |        t        jJ                  | |       t        jL                  |        t        jN                  |        t        jP                  |        tS        jT                  | dd       t        jV                  | d	d
|       t        jX                  | |	       |rt        jZ                  |        t]        j^                  | dd       |r| ja                  dd       | ja                  dd       t        jb                         td        _3        td        jf                  ji                  | d       | j                   jk                  tl        jn                         |
rt        jp                  |        yy)z'Add flags shared by all release tracks.)container_mount_enabled)r   support_multi_writersupport_disk_labelsFT)	instances
containerssupport_ipv6_only)instancezadded tozinstance-templatezCSpecifies the reservation for instances created from this template.zAThe type of reservation for instances created from this template.)
group_textaffinity_text support_specific_then_x_affinity)support_flex_startzinstance templatecreate)resource_typeoperation_typez--subnet-regionz'Specifies the region of the subnetwork.)helpz--descriptionz:Specifies a textual description for the instance template.)r!   N)9display_info	AddFormatinstance_templates_flagsDEFAULT_LIST_FORMATr   AddMetadataArgsinstances_flagsAddDiskArgsAddCreateDiskArgsr   ReleaseTrackALPHAAddLocalSsdArgsWithSizeBETAAddLocalSsdArgsAddCanIpForwardArgsAddContainerMountDiskFlagAddAddressArgsAddMachineTypeArgsAddMaintenancePolicyArgsAddNoRestartOnFailureArgsAddPreemptibleVmArgsAddServiceAccountAndScopeArgsAddTagsArgsAddCustomMachineTypeArgsAddNetworkArgsAddKonletArgsAddImageArgsAddMinCpuPlatformArgsAddNetworkTierArgsAddConfidentialComputeArgsAddShieldedInstanceConfigArgsAddIPv6AddressArgsAddIPv6PrefixLengthArgsr   AddCreateLabelsFlagsAddPrivateNetworkIpArgsAddStackTypeArgsAddIpv6NetworkTierArgsAddInternalIPv6AddressArgsAddInternalIPv6PrefixLengthArgsmaintenance_flagsAddResourcePoliciesArgsAddReservationAffinityGroupAddProvisioningModelVmArgsAddAcceleratorArgsr   AddRegionFlagadd_argumentMakeInstanceTemplateArgCreateWithContainerInstanceTemplateArgAddArgumentAddCacheUpdaterr   InstanceTemplatesCompleterAddSkipGuestOsShutdownArgs)parserrelease_trackr   enable_guest_acceleratorsr    support_region_instance_templater   r   r   r   support_skip_guest_os_shutdowndeprecate_maintenance_policys               ?lib/surface/compute/instance_templates/create_with_container.py_Argsr^   (   sG    	 8 L LM  (&= ##5/-	 d''---++F3))...##F+%%f-++F3  )	 $$V,!.43D3D3J3J2K!K**63OP++F3&&v.//>f%**62  ('v&''>$$Vd;,,V4//7$$V,))&1""6*))&1""6+<=((0,,V411&9++j- --Z['G	 ,,!3 &&v./ &
 I   	G   668 ) ))55X 6  	%%j&K&KL#..v6 $    zThe 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.)
is_removedwarningerrorc                   x    e Zd ZdZdZdZdZed        Zd Z	d Z
d Z	 	 dd	Zd
 Zd Zd Zd Zd Z	 ddZd Zy)rQ   ACommand for creating VM instance templates hosting Docker images.FTc                     t        | t        j                  j                  ddddddd	       t	        j
                  | t        j                         y )NTF)r   r   rZ   r   r   r   r[   )r^   r   r+   GAr(   (AddPrivateIpv6GoogleAccessArgForTemplater   COMPUTE_GA_API_VERSIONrW   s    r]   ArgszCreateWithContainer.Args   sL    	 $").).!'+
 <<,,r_   c                 H   t        j                  |       t        j                  |       t        j                  |       t        j                  |       t        j
                  |       t        j                  |j                  xs g       rt        j                  dd      y )Nz--diskz)Boot disk specified for containerized VM.)r(   ValidateKonletArgsValidateDiskCommonFlags"ValidateServiceAccountAndScopeArgsValidateNicFlags ValidateReservationAffinityGroupr
   UseExistingBootDiskdiskr   InvalidArgumentExceptionselfargss     r]   _ValidateArgsz!CreateWithContainer._ValidateArgs   s|    &&t,++D166t<$$T*44T:))$))/r://
?  ;r_   c                     t        j                  |j                        }t        j                  ||j                         |S N)r   	BytesToGbboot_disk_sizeWarnIfDiskSizeIsTooSmallboot_disk_type)ru   rv   boot_disk_size_gbs      r]   _GetBootDiskSizez$CreateWithContainer._GetBootDiskSize   s4    (;(;<	""#4d6I6IJr_   c                 V    t         j                  j                  ||j                        S ry   )rQ   rR   ResolveAsResource	resources)ru   rv   holders      r]   _GetInstanceTemplateRefz+CreateWithContainer._GetInstanceTemplateRef   s&    22DDf r_   Nc                     t        j                  ||      }t        j                  |j                  ||j                         |||      S ry   )r
   GetValidatedMetadatar   CreateKonletMetadataMessagemessagesName)ru   rv   clientinstance_template_refcontainer_mount_disk_enabledcontainer_mount_diskuser_metadatas          r]   _GetUserMetadataz$CreateWithContainer._GetUserMetadata   sH     #77fEM77""$$ r_   c           
      :   |j                   rUt        j                  |j                  t	        j
                  |      |j                  |j                   |j                        S t        |dd       }t        |dd       }t        |dd       }t        |dd       }t        |dd       }t        |dd       }	t        |dd       }
t        |d	d       }t        j                  di d
|j                  dt	        j
                  |      d|j                  d|j                  d|j                  d|j                  d|j                  d|j                  s|j                  st        j                  n|j                  dt        |dd       d|d|d|d|d|d|	d|
d	|gS )N)r   scope_listerr   network_interface_argsubnet_region
stack_typeipv6_network_tieripv6_addressipv6_prefix_lengthexternal_ipv6_addressexternal_ipv6_prefix_lengthinternal_ipv6_addressinternal_ipv6_prefix_lengthr   r   r   network
private_ipr   subnetaddressnetwork_tier )network_interfacer	   CreateNetworkInterfaceMessagesr   r   GetDefaultScopeListerr   regiongetattrCreateNetworkInterfaceMessager   private_network_ipr   
no_addressr   EPHEMERAL_ADDRESS)ru   rv   r   r   r   r   r   r   r   r   r   r   s               r]   _GetNetworkInterfacesz)CreateWithContainer._GetNetworkInterfaces   s   $CC$$226:?? $ 6 6  |T2J&94@46L ';TB#D*A4H")+T# $D*A4H")+T# 	 == 	
&&	
44V<	
 __	
 LL		

 ..	
 ++	
 ;;	
 t|| (99\\	
 !~t<	
 "	
 0	
  &!	
"  2#	
$ #8%	
& )D'	
( #8)	
* )D+	
 r_   c                     d }| j                   r|j                  d      r|j                  }t        j                  |j
                  |j                  |j                  |j                  |j                  |      S )Nskip_guest_os_shutdown)r   maintenance_policypreemptibleprovisioning_modelrestart_on_failurer   )
_support_skip_guest_os_shutdownIsKnownAndSpecifiedr   r
   CreateSchedulingMessager   r   r   r   r   )ru   rv   r   r   s       r]   _GetSchedulingz"CreateWithContainer._GetScheduling  sp    !++0H0H 1  $::1122$$22225 r_   c                     |j                   rd }n|j                  }t        j                  |j                  |j
                  rg |      S |j                  |      S )N)r   scopesservice_account)no_service_accountr   r
   CreateServiceAccountMessagesr   	no_scopesr   )ru   rv   r   r   s       r]   _GetServiceAccountsz'CreateWithContainer._GetServiceAccounts  sU    o,,o66^^r' )-' r_   c                    |j                  d      s"|j                  d      s|j                  d      rt        j                  ||j                        }|j	                  |j
                  |j                  |j                  |j                        \  }}|j                  j                  |      j
                  dk7  rt        j                  d       |S t        j                  |      }|S )Nimageimage_familyimage_project)user_projectr   r   r   z	cos-cloudzThis container deployment mechanism requires a Container-Optimized OS image in order to work. Select an image from a cos-cloud project (cos-stable, cos-beta, cos-dev image families).)IsSpecifiedr   ImageExpanderr   ExpandImageFlagprojectr   r   r   Parser   ra   r   ExpandKonletCosImageFlag)ru   rv   r   r   r   image_expander	image_uri_s           r]   _GetImageUriz CreateWithContainer._GetImageUri*  s    !N+O,"009I9IJn#33,44

((**	 4 li 
						*	2	2k	A'	
  #;;FCir_   c                     t        j                  |j                  |j                  |j                  t        |dd       t        |dd             S )Ncustom_extensionscustom_vm_type)machine_type
custom_cpucustom_memoryextvm_type)r
   InterpretMachineTyper   r   r   r   rt   s     r]   _GetMachineTypez#CreateWithContainer._GetMachineTypeB  sH    ..&&??((D-t4.5 r_   c                    | j                  |      }t        j                  |j                  xs g |j                  xs g z          }t        j                  |||j                  |j                  ||||| j                  	      S )N)create_boot_diskmatch_container_mount_disksr   )
r   r
   rq   rr   create_diskr	   CreateDiskMessagesr   r   _support_disk_labels)	ru   rv   r   r   r   r   r   r~   r   s	            r]   	_GetDiskszCreateWithContainer._GetDisksK  s     --d3 	**YY_"!1!1!7R8	

 #55%%)$? 55
 
r_   c                    | j                  |       t        j                  |       t        j                  | j                               }t        j                  ||j                  |j                  |j                        }|j                  }| j                  ||      }| j                  ||||      }t        j                  d||j                  |j                   j"                        }t%        j&                  ||j                   j"                  j(                        }|r%|j*                  j-                  |j*                         | j/                  |||d|      }	| j1                  |||      }
| j3                  ||      }| j5                  ||      }| j7                  |      }| j9                  |||||d      }t;        j<                  |j                   |dd      }|j                   j#                  |||j>                  |||	|j@                  |
||t        jB                  |j                   |jD                              }|jF                  r|jF                  |_$        |jJ                  =t        jL                  |j                         jO                  |jJ                        |_(        t;        jR                  |j                   |      }|r||_*        tW        jX                  ||| jZ                        |_.        |j                   j_                  |j                   ja                  ||jb                  |je                         	      |jf                  
      }|ji                  |jj                  jl                  d|fg      S )Issues an InstanceTemplates.Insert request.

    Args:
      args: the argparse arguments that this command was invoked with.

    Returns:
      an InstanceTemplate message object
    NTr   r   r   r   rv   !support_confidential_compute_type%support_confidential_compute_type_tdx)machineTypediskscanIpForwardconfidentialInstanceConfiglabelsmetadataminCpuPlatformnetworkInterfacesserviceAccounts
schedulingtagsr   rv   r   
propertiesdescriptionnameinstanceTemplater   Insert)7rw   r(   ValidateNetworkTierArgsr   ComputeApiHolderr+   GetValidatedContainerMountDiskr   rr   r   r   r   r   r   GetLabelsMessageWithCosVersionr   r   InstancePropertiesr   ParseCreateArgsLabelsValueadditionalPropertiesextendr   r   r   r   r   r   create_utils&BuildConfidentialInstanceConfigMessagecan_ip_forwardmin_cpu_platformCreateTagsMessager   resource_policiesresourcePoliciesprivate_ipv6_google_access_type3GetPrivateIpv6GoogleAccessTypeFlagMapperForTemplateGetEnumForChoiceprivateIpv6GoogleAccess"BuildShieldedInstanceConfigMessageshieldedInstanceConfigr
   GetReservationAffinity!_support_specific_then_x_affinityreservationAffinity%ComputeInstanceTemplatesInsertRequestInstanceTemplater   r   r   MakeRequestsapitools_clientinstanceTemplates)ru   rv   r   r   r   r   r   r   argument_labelsr   network_interfacesr   service_accountsr   r   confidential_instance_configr    shielded_instance_config_messagerequests                      r]   RunzCreateWithContainer.Rung  sB    	t++D1**4+<+<+>?F*II))499d6F6F ]]F 88vF!!$8MNI<<i))6??+M+MF "11foo00<<O !!(()M)MN$$%)1 % H 33D&&I$$T62J//f=''-LNN$(  E 	;;__.226		
 ! 33 ((#?,,,(//K 4 J $($:$:j!++7

M
MooTAAB ( 	77__4	
 %
 (*Jj'%3%J%J)-)O)O&J" ooCC99!((&++- : 

 &-- D G 

 
 
2
2Hg	FG r_   )FN)F)__name__
__module____qualname____doc__r  r   r   staticmethodrj   rw   r   r   r   r   r   r   r   r   r   r  r   r_   r]   rQ   rQ      sr    * J&+#$(!  	
 $)$-^	0  #(8ir_   rQ   c                   D     e Zd ZdZdZdZdZed        Z fdZ	d Z
 xZS )CreateWithContainerBetard   Tc                     t        | t        j                  j                  dddddddd
       t	        j
                  | t        j                         y )NTFr   rY   rZ   r   r   r   r   r[   )r^   r   r+   r.   r(   rg   r   COMPUTE_BETA_API_VERSIONri   s    r]   rj   zCreateWithContainerBeta.Args  sO    	 $"&).)- '+ <<..r_   c                 V    t         t        |   |       t        j                  |       y ry   )superr#  rw   r(   ValidateLocalSsdFlags)ru   rv   	__class__s     r]   rw   z%CreateWithContainerBeta._ValidateArgs  s!    	
!46t<))$/r_   c                 H   | j                  |       t        j                  |       t        j                  | j                               }t        j                  ||j                  |j                  |j                        }|j                  }| j                  ||      }| j                  ||||      }t        j                  d||j                  |j                   j"                        }t%        j&                  ||j                   j"                  j(                        }|r%|j*                  j-                  |j*                         | j/                  |||d|      }	| j1                  |||      }
| j3                  ||      }| j5                  ||      }| j7                  |      }| j9                  |||||d      }t;        j<                  |j                   |dd      }t?        j@                  |j                   tC        |dd            }|j                   j#                  |||jD                  |||	|jF                  |
||t        jH                  |j                   |jJ                        |      }|jL                  r|jL                  |_'        |jP                  =t        jR                  |j                         jU                  |jP                        |_+        t;        jX                  |j                   |      }|r||_-        t]        j^                  ||| j`                  	      |_1        |j                   je                  |j                   jg                  ||jh                  |jk                         
      |jl                        }|jo                  |jp                  jr                  d|fg      S r   NTr   r   r   accelerator)r   r   r   r   r   r   r   r   r   r   r   guestAcceleratorsr   r   r   r   r   :rw   r(   r   r   r   r+   r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	   CreateAcceleratorConfigMessagesr   r  r  r  r   r  r  r  r	  r
  r  r  r  r
   r  r  r  r  r  r   r   r   r  r  r  ru   rv   r   r   r   r   r   r   r  r   r  r   r  r   r   r  guest_acceleratorsr   r  r  s                       r]   r  zCreateWithContainerBeta.Run  sl    	t++D1**4+<+<+>?F*II))499d6F6F ]]F 88vF!!$8MNI<<i))6??+M+MF "11foo00<<O !!(()M)MN$$%)1 % H 33D&&I$$T62J//f=''-LNN$(  E 	;;__.226		
 ! 	 ??OOWT=$?	
  33 ((#?,,,(//K, 4 J $($:$:j!++7

M
MooTAAB ( 	77__4	
 %
 (*Jj'%3%J%J)-)O)O&J" ooCC99!((&++- : 

 &-- D G 

 
 
2
2Hg	FG r_   )r  r  r  r   r  r   r   r!  rj   rw   r  __classcell__)r*  s   @r]   r#  r#    s5    I&*#$(! "0or_   r#  c                   6    e Zd ZdZdZdZdZdZed        Z	d Z
y)CreateWithContainerAlphard   Tc                 $   t        | t        j                  j                  dddddddd
       t	        j
                  |        t	        j                  | t        j                         t	        j                  |        t	        j                  |        y )NTr%  )r^   r   r+   r,   r(   AddLocalNvdimmArgsrg   r   COMPUTE_ALPHA_API_VERSIONAddIPv6AddressAlphaArgsAddIPv6PrefixLengthAlphaArgsri   s    r]   rj   zCreateWithContainerAlpha.Argsl  s{    	 $"&)-)- '+ &&v.<<// ++F3008r_   c                 H   | j                  |       t        j                  |       t        j                  | j                               }t        j                  ||j                  |j                  |j                        }|j                  }| j                  ||      }| j                  ||||      }t        j                  d||j                  |j                   j"                        }t%        j&                  ||j                   j"                  j(                        }|r%|j*                  j-                  |j*                         | j/                  |||d|      }	| j1                  |||      }
| j3                  ||      }| j5                  ||      }| j7                  |      }| j9                  |||||d      }t;        j<                  |j                   |dd      }t?        j@                  |j                   tC        |dd            }|j                   j#                  |||jD                  |||	|jF                  |
||t        jH                  |j                   |jJ                        |      }|jL                  |jL                  |_'        |jP                  =t        jR                  |j                         jU                  |jP                        |_+        t;        jX                  |j                   |      }|r||_-        t]        j^                  ||| j`                  	      |_1        |j                   je                  |j                   jg                  ||jh                  |jk                         
      |jl                        }|jo                  |jp                  jr                  d|fg      S r,  r/  r1  s                       r]   r  zCreateWithContainerAlpha.Run  so    	t++D1**4+<+<+>?F*II))499d6F6F ]]F 88vF!!$8MNI<<i))6??+M+MF "11foo00<<O !!(()M)MN$$%)1 % H 33D&&I$$T62J//f=''-LNN$(  E 	;;__.226		
 ! 	 ??OOWT=$?	
  33 ((#?,,,(//K, 4 J )$($:$:j!++7

M
MooTAAB ( 	77__4	
 %
 (*Jj'%3%J%J)-)O)O&J" ooCC99!((&++- : 

 &-- D G 

 
 
2
2Hg	FG r_   N)r  r  r  r   r  r   _support_ipv6_onlyr   r!  rj   r  r   r_   r]   r5  r5  c  s5    I&*#$(!9 9(pr_   r5  zg    Creates a Compute Engine a virtual machine instance template that runs
    a Docker container.
    a          *{command}* creates a Compute Engine virtual
        machine instance template that runs a container image. To create
        an instance template named 'instance-template-1' that runs the
        'busybox' image, run:

          $ {command} instance-template-1              --container-image=gcr.io/google-containers/busybox

        For more examples, refer to the *EXAMPLES* section below.
        aO          To create a template named 'instance-template-1' that runs the
        gcr.io/google-containers/busybox image and executes 'echo "Hello world"'
        as a command, run:

          $ {command} instance-template-1             --container-image=gcr.io/google-containers/busybox             --container-command='echo "Hello world"'

        To create a template running gcr.io/google-containers/busybox in
        privileged mode, run:

          $ {command} instance-template-1             --container-image=gcr.io/google-containers/busybox             --container-privileged
        )briefDESCRIPTIONEXAMPLESN)	FFTFFFFFF),r   
__future__r   r   r   googlecloudsdk.api_lib.computer   r   r   r	   r
   r   r   /googlecloudsdk.api_lib.compute.instances.creater  googlecloudsdk.callioper   r   "googlecloudsdk.command_lib.computer   r   5googlecloudsdk.command_lib.compute.instance_templatesr%   ,googlecloudsdk.command_lib.compute.instancesr(   4googlecloudsdk.command_lib.compute.resource_policiesrI   $googlecloudsdk.command_lib.util.argsr   googlecloudsdk.corer   r^   	DeprecateDefaultUniverseOnlyReleaseTracksr+   rf   CreateCommandrQ   r.   r#  r,   r5  detailed_helpr   r_   r]   <module>rO     sg   E &  ' 7 ; 6 B 9 9 0 Q ( . 9 4 c Q [ < # "#%*%*#(c7L 	P	P$ D%%(()n$,, n * %(nb	 D%%**+L1 L ,L^ D%%++,M6 M -Mb
! %  !r_   