
    #?                     N   d Z ddlmZ ddlmZ ddlm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Z G d dej(                        Zd Zd Zd Z	 dd ed      j2                  fdZd Zd Zd Zd Zd Zd Z d Z!d Z" G d de#      Z$y) z8Utility file that contains helpers for Queued Resources.    )absolute_import)division)unicode_literalsN)metadata_utils)apis)base)
exceptions)
properties)	resources)timesc                       e Zd ZdZy)BootDiskConfigurationErrorz0Error if the boot disk configuration is invalid.N)__name__
__module____qualname____doc__     Dlib/googlecloudsdk/command_lib/compute/tpus/queued_resources/util.pyr   r   !   s    8r   r   c                 .    t        j                  d|       S )Ntpu)r   GetMessagesModule)versions    r   r   r   %   s    			w	//r   c                 ^   t        j                  | j                  | j                        }t	        |      }|j
                  j                         }t        j                  |      D ]E  \  }}|j                  j                  |j
                  j                  j                  ||             G |S )zCreates the metadata for the Node.

  Based on googlecloudsdk.command_lib.compute.tpus.tpu_vm.util.MergeMetadata.

  Args:
    args:  The gcloud args
    api_version: The api version (e.g. v2 or v2alpha1)

  Returns:
    The constructed MetadataValue.
  keyvalue)r   ConstructMetadataDictmetadatametadata_from_filer   NodeMetadataValuesix	iteritemsadditionalPropertiesappendAdditionalProperty)argsapi_versionmetadata_dicttpu_messagesr   r   r   s          r   MergeMetadatar,   ,   s     !66
mmT,,- #;/,,,.(MM-0jc5!!((''::s%:P 1 
/r   c                       fd}|S )z2Creates the repeated structure nodeSpec from args.c                 V   t        	      }|j                  |j                         |_        |j                  j                  |j	                         |j                  _        |j                  j                  j
                  r$|j                  j                  j
                  d   }n@g |j                  j                  _        |j                         }|j                         |_        | j                         j                         |_        |j                  r|j                  |j                  _        |j                  |j                  _        |j                   rng |j                  _        |j                   D ]N  }|j%                  |j&                  |j(                        }|j                  j"                  j+                  |       P |j,                  r|j,                  |j                  _        |j.                  r|j                  j1                         |j                  _        g |j                  j.                  _        |j.                  j5                         D ]Y  \  }}|j                  j.                  j2                  j+                  |j                  j0                  j7                  ||             [ |j8                  r|j8                  |j                  _        |j<                  r!|j?                  d      |j                  _         	dk(  r|jB                  rd|j                  _"        |jG                         |j                  _$        |jK                         |j                  _&        |jN                  r%|jN                  |j                  jH                  _'        |jP                  r%|jP                  |j                  jH                  _(        |jR                  r%|jR                  |j                  jL                  _*        |jV                  r%|jV                  |j                  jL                  _,        |jZ                  r|jZ                  |j                  _-        |j\                   |j                  jH                  _/        |j`                  r%tc        |j`                  	      |j                  _2        tg        |	      |j                  _4        |jj                  r!|jl                  sto        jp                  d      |jr                  r|jr                  |_:        n|jl                  r	dk(  r|jw                         |_<        |jl                  |jx                  _=        |jj                  r|jj                  |jx                  _>        |j~                  dk(  r|jv                  j                  j                  |jx                  _B        nW|j                         |_D        |jl                  |j                  _=        |jj                  r|jj                  |j                  _>        |g|j                  j                  _        |S )	Nr   )
sourceDiskmoder   T)enableSecureBootv2alpha1zACan only specify --node-prefix if --node-count is also specified.AVAILABILITY_OPTIMIZED)Er   queuedResourceQueuedResourcer   TpunodeSpecNodeSpecr!   nodeParentRelativeNameparentaccelerator_typeacceleratorTyperuntime_versionruntimeVersion	data_disk	dataDisksAttachedDiskr/   r0   r&   descriptionlabelsLabelsValuer%   itemsr'   range	cidrBlockshielded_secure_bootShieldedInstanceConfigshieldedInstanceConfigautocheckpoint_enabledautocheckpointEnabledNetworkConfignetworkConfigServiceAccountserviceAccountnetwork
subnetworkservice_accountemailscopesscopetagsinternal_ipsenableExternalIps	boot_diskParseBootDiskConfigbootDiskConfigr,   r   node_prefix
node_countr	   ConflictingArgumentsExceptionnode_idnodeIdMultiNodeParamsmultiNodeParams	nodeCountnodeIdPrefixworkload_typeWorkloadTypeValueValuesEnumr3   workloadTypeMultisliceParamsmultisliceParams)
refr(   requestr+   	node_specrA   attached_diskr   r   r)   s
            r   ProcesszCreateNodeSpec.<locals>.ProcessG   s   $[1L%+::<g!!)#/#3#3#5g !!**((,,55a8i,.g  )'')i#((*inzz|002I'+'<'<inn$$($8$8INN!~~!#inn~~)$11 ++).. 2 
 	  ''6	 &
 #'#3#3inn {{*//;;=inn35inn0))+*#u2299))<<u = 	
 , zz!%inn  

-
-t
-
D nn+ j T%@%@-1inn*#/#=#=#?INN $0$?$?$AINN!||-1\\inn""*04inn""-,0,@,@inn##){{,0KKinn##)yy IIinn9=9J9J5JINN  2~~&9
..+''inn# ,D+>INN44
M  ||i		
	"$0$@$@$B	!.2oo	!!+373C3C)
#
#
0!99**FF]] 
#
#
0 &2%B%B%D	"/3	"",484D4D)
$
$
1+4+G'Nr   r   r)   rq   s   ` r   CreateNodeSpecrs   D   s    Zx 
.r   r2   returnc                    t        |      }d}d}| j                         D ]#  }|||fvs
t        dj                  ||             | j	                  |d      j                         dk(  }| j	                  |d      }|r8|dk7  rt        j                  dd	      |t        d
j                  ||            i }|r|j                  |      }	|	|d<   |dk(  r|r||d<   |r |j                  di |S y)z$Parses configurations for boot disk.zkms-keyzconfidential-computez.--boot-disk only supports arguments: {} and {}FalsetrueNr2   z--boot-diskzBconfidential-compute is only available in the alpha release track.zQargument --boot-disk: with confidential-compute={} requires kms-key; received: {})
kmsKeyNamecustomerEncryptionKeyenableConfidentialComputer   )
r   keysr   formatgetlowerr	   InvalidArgumentExceptionCustomerEncryptionKeyBootDiskConfig)
boot_disk_argsr)   r+   kms_key_arg_nameconfidential_compute_arg_namearg_nameenable_confidential_computekms_keyboot_disk_config_kwargscustomer_encryption_keys
             r   r]   r]      sR    #;/,"8 %%'h(*GHH&
:
A
A+-=  ( 6@FFH	  /6' j //

NP P &++16)7,4  *@@ A 7N34J#># 78 &<&&A)@AA	r   c                 j    ~ |j                   r%|j                   dk  rt        j                  dd      |S )N   z--node-countz!Node count must be greater than 1)r`   r	   r   rm   r(   rn   s      r   VerifyNodeCountr      s7    		__A-

-
-;  
.r   c                     ~ |j                   rat        d      }|j                  |j                         |_        |j                  j                  |j                         |j                  _        |S )zECreates an empty BestEffort structure if best-effort arg flag is set.r2   )best_effortr   r4   r5   
bestEffort
BestEffort)rm   r(   rn   r+   s       r   SetBestEffortr      sc    		$Z0L%+::<g((0*6*A*A*Cg'	.r   c                       fd}|S )z4Creates an empty Spot structure if spot flag is set.c                    ~ t              }|j                  |j                         |_        |j                  r5|j                  j                  |j	                         |j                  _        dk(  r|j
                  r|j
                  j                  dd      j                         }|j                  j                  j                  }||k(  r5|j                  j                  |j	                         |j                  _        |S )Nr2   -_)
r   r4   r5   spotSpotprovisioning_modelreplaceupper ProvisioningModelValueValuesEnumSPOT)rm   r(   rn   r+   r   r   r)   s         r   rq   zSetSpot.<locals>.Process   s    $[1L%+::<gyyW++008$0$5$5$7g!j T%<%<22::3DJJL((IINNd	t	#(>(>(C(C(K&2&7&7&9#Nr   r   rr   s   ` r   SetSpotr      s     
.r   c                       fd}|S )z9Creates an empty Guaranteed structure if arg flag is set.c                     ~ |j                   rat              }|j                  |j                         |_        |j                  j                   |j	                         |j                  _         |S N)
guaranteedr   r4   r5   
Guaranteed)rm   r(   rn   r+   r)   s       r   rq   zSetGuaranteed.<locals>.Process  sb    &{3l				'!-!<!<!>				*	*	2,8,C,C,E)Nr   r   rr   s   ` r   SetGuaranteedr      s    	 
.r   c                       fd}|S )z'Sets the provisioning model enum value.c                 j   ~ t              }|j                  |j                         |_        |j                  sl|j                  r/|j                  j
                  j                  |j                  _        |j                  j
                  j                  |j                  _        |S 	 |j                  j                  dd      j                         }|j                  j                  |      }||j                  _        |S # t        $ r)}t        j                  d|j                   d      |d }~ww xY w)Nr   r   z--provisioning-modelzb is not a valid provisioning model, must be one of [standard, spot, reservation-bound, flex-start])r   r4   r5   r   r   r   r   provisioningModelSTANDARDr   r   	TypeErrorr	   r   )rm   r(   rn   r+   normalized_candidatecandidate_enumer)   s          r   rq   z%SetProvisioningModel.<locals>.Process  s+   $[1L%+::<g""	''HHMM 	0 
%
%
F
F
O
O . n "44<<S#FLLN

%
%
F
F"  0>G,N  //
 $$% &G G 	s   (AD   	D2	$D--D2r   rr   s   ` r   SetProvisioningModelr     s     B 
.r   c                       fd}|S )z:Combine multiple timing constraints into a valid_interval.c                     ~ |j                   r|j                  s|j                  r!|j                  rt	        j
                  d      t              }t        j                         }d }|j                  r|j                  }n'|j                   r|j                   j                  |      }d }|j                  r|j                  }n'|j                  r|j                  j                  |      }|r|r|j                         }t        j                  |      |_        t        j                  |      |_        |j                  |j                         |_        |j!                         |j                  _        ||j                  j"                  _        |S )NzEOnly one timing constraint for each of (start, end) time is permitted)valid_after_durationvalid_after_timevalid_until_durationvalid_until_timer	   ra   r   r   NowGetRelativeDateTimeIntervalFormatDateTime	startTimeendTimer4   r5   QueueingPolicyqueueingPolicyvalidInterval)	rm   r(   rn   r+   current_time
start_timeend_timevalid_intervalr)   s	           r   rq   z!SetValidInterval.<locals>.Process:  sM   !!d&;&;!!d&;&;44  %[1L99;LJ((j		"	",,@@NjH&&h		"	"**>>|Lhh#,,.n!&!5!5j!An$33H=n				'!-!<!<!>.:.I.I.Kg+<Jg++9Nr   r   rr   s   ` r   SetValidIntervalr   7  s    "H 
.r   c                       fd}|S )zCreates the target reservation name from args.

  Args:
    api_version: The api version (e.g. v2 or v2alpha1)

  Returns:
    Handler which sets request.queuedResource.reservationName
  c                 2   ~ |j                   r|j                  s0|j                  r|j                  s|j                  r!|j                   rt        j                  d      d}d}d}d }|j                   r)|j                  d|j                   |j                        }ng|j                  r)|j                  d|j                  |j                        }n2|j                  r(|j                  d|j                  |j                        }ndk(  rht        |d	      r\|j                  rPt        j                  j                  j                  j                         }|j                  d||j                        }nt        |d
      r|j                  ryt        j                   ||j                        rYt        j                  j                  j                  j                         }|j                  ||j                  |j                        }|r||j"                  _        |S )Nz&Only one reservation host is permittedz!{}/{}/locations/{}/reservations/-z^[a-zA-Z0-9-]+$z(projects/{}/locations/{}/reservations/{}projectsfoldersorganizationsv2reservedreservation)reservation_host_projectreservation_host_folderreservation_host_organizationr	   ra   r|   zonehasattrr   r
   VALUEScoreproject	GetOrFailr   rematchr4   reservationName)	rm   r(   rn   patternshort_reservation_name_patternfull_reservation_name_patternreservation_namer   r)   s	           r   rq   z&CreateReservationName.<locals>.Processk  s   		&	&4+G+G((T-O-O..43P3P 44
2  2G%6"$N!$$ 
d33TYY 
	%	% 
T11499 
	+	+ 
4==tyy 
	z!:t}}!!&&..88:g 
GTYYG	}	%$*:*:rxx&(8(8@ !!&&..88:g6==
499d.. /?g,Nr   r   rr   s   ` r   CreateReservationNamer   a  s    (T 
.r   c                 F    ~ t        |d      r|j                  rd|_        |S )z&Sets force arg to true if flag is set.forceT)r   r   r   s      r   SetForcer     s!    	T7

GM	.r   c                   "    e Zd ZdZd Zd Zd Zy)TPUQueuedResourcez#Helper to get TPU Queued Resources.c                     |t         j                  j                  k(  rd| _        nd| _        t	        j
                  d| j                        | _        t	        j                  d| j                        | _        y )Nr2   r   r   )	r   ReleaseTrackALPHA_api_versionr   GetClientInstanceclientr   messages)selfrelease_tracks     r   __init__zTPUQueuedResource.__init__  sZ    ))///$dd((0A0ABDK**5$2C2CDDMr   c                     | j                   S r   )r   )r   s    r   GetMessageszTPUQueuedResource.GetMessages  s    ==r   c                 h   t         j                  j                  j                  j	                  d      }t
        j                  j                  |||dd| j                        }| j                  j                  |j                               }| j                  j                  j	                  |      S )z<Retrieves the Queued Resource in the given project and zone.T)required)locationsId
projectsIdz&tpu.projects.locations.queuedResources)params
collectionr)   )name)r
   r   r   r   Getr   REGISTRYParser   r   -TpuProjectsLocationsQueuedResourcesGetRequestr;   r   "projects_locations_queuedResources)r   r   r   r   (fully_qualified_queued_resource_name_refrn   s         r   r   zTPUQueuedResource.Get  s    $$,,00$0?G/8/A/A/G/G#7;;%%	 0H 0, mmII5BBD J G ;;99==gFFr   N)r   r   r   r   r   r   r   r   r   r   r   r     s    +EGr   r   )r2   )%r   
__future__r   r   r   r   googlecloudsdk.api_lib.computer   googlecloudsdk.api_lib.utilr   googlecloudsdk.callioper   r	   googlecloudsdk.coresdk_core_exceptionsr
   r   googlecloudsdk.core.utilr   r#   Errorr   r   r,   rs   r   r]   r   r   r   r   r   r   r   r   objectr   r   r   r   <module>r     s    ? &  ' 	 9 , ( . A * ) * 
9!4!:!: 900_F !+-z"11-`
("#L'T4nG Gr   