
    58                         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mZ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  G d de      Z G d de      Zy)z1Utilities for Backup and DR restore command apis.    )absolute_import)division)unicode_literalsN)AnyDictList)encoding)alias_ip_range_utils)	constants)
exceptions)yaml)filesc            	       d   e Zd ZdZedeeef   defd       Z	edeeef   defd       Z
edej                  fd       Zedej                  ded	ee   fd
       Zedej                  deeeef      fd       Zedej                  deeef   fd       Zedej                  deeef   fd       Zedej                  dededefd       Zedej                  deeef   fd       Z G d dej.                        Zedej                  defd       ZdZedej                  dedefd       Zy) ComputeUtilz1Util class for Restoring Compute Engine Instance.network_interfacereturnc                 
    d| v S )Nexternal-ipv6-address r   s    3lib/googlecloudsdk/api_lib/backupdr/restore_util.py_HasIpV6AccessConfigz ComputeUtil._HasIpV6AccessConfig$   s    "&777    c                 
    d| v S )Naddressr   r   s    r   _HasIpV4AccessConfigz ComputeUtil._HasIpV4AccessConfig(   s    )))r   client_messagesc                    |yt               }|D ]f  }| j                         }| j                         }| j                         }d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        d|v r/|d   |_        d|v r|d   |_        nt        j                  dd      d|v r
|d   |_
        d	|v r/|d	   |_        d
|v r|d
   |_        nt        j                  d
d      d|v rF| j                  j                  |d         |_        | j                  j                  |d         |_        d|v rt        j                   | d|d         |_        d|v r#| j                  j%                  |d         |_        d|v r
|d   |_        d|v r#| j                  j+                  |d         |_        d|v r
|d   |_        t0        j3                  |      rB| j                  j4                  j6                  |_        |j:                  j=                  |g       nVt0        j?                  |      rA| j                  j4                  j@                  |_        |jB                  j=                  |g       |jE                  |       i |S )a!  Parses the network interface data into client messages.

    Args:
      client_messages:
      network_interfaces: A dictionary containing the network interface data

    Returns:
      List of parsed client messages for Network Interface

    Raises:
      InvalidArgumentException:
    Nnetworksubnetzprivate-network-ipzinternal-ipv6-addresszinternal-ipv6-prefix-lengthzDPrefix length of the provided IPv6 address is expected but not foundr   r   zexternal-ipv6-prefix-lengthznetwork-tieraliasesTz
stack-typezqueue-countznic-typeznetwork-attachment)#listNetworkInterfaceAccessConfigr   
subnetwork	networkIPipv6AddressinternalIpv6PrefixLengthr   InvalidArgumentExceptionnatIPexternalIpv6externalIpv6PrefixLengthNetworkTierValueValuesEnumnetworkTierr
   $CreateAliasIpRangeMessagesFromStringaliasIpRangesStackTypeValueValuesEnum	stackType
queueCountNicTypeValueValuesEnumnicTypenetworkAttachmentr   r   TypeValueValuesEnumDIRECT_IPV6typeipv6AccessConfigsextendr   ONE_TO_ONE_NATaccessConfigsappend)r   network_interfacesmessagesr   messageaccess_configaccess_config_ipv6s          r   ParserNetworkInterfacez"ComputeUtil.ParserNetworkInterface,   s     !vH/002g%224m*779	'	'+I6	&	&.x8	!2	2-.BC	 $5	5/0GH(,==->+.'
* 33+ 
 
'	'/	:	 $5	5*;#+
' ),==8I+9

5 33+ 
 
,	,((CC!.1 	! ((CC!.1 	&
 
'	' EE!), 	 
*	*,,EE!,/ 	
 
+	+.}=	(	(,,CC!*- 	
 
!2	2$56J$K!		)	)*;	<((<<HH 	 	!!((*<)=>++,=>((<<KK 	 	$$m_5oogi 0j Or   service_accountscopesc                 h    d }|d}|t         j                  }| j                  | ||            gS )a  Parses the service account data into client messages.

    Args:
      client_messages:
      service_account: An email id of the service account
      scopes: A list containing the scopes

    Returns:
      List of parsed client messages for Service Account
    c                     t               }| D ]4  }t        j                  j                  ||g      }|j	                  |       6 |S )N)r"   compute_constantsSCOPESgetr;   )rF   converted_scopesscopes      r   _ConvertAliasToScopesz?ComputeUtil.ParserServiceAccount.<locals>._ConvertAliasToScopes   sD    %!((,,UUG<&  r   default)emailrF   )rI   DEFAULT_SCOPESServiceAccount)r   rE   rF   rN   s       r   ParserServiceAccountz ComputeUtil.ParserServiceAccount   sL     !o~ //f&&!*?*G 	' 	
 r   disksc                    |yt               }|D ]v  }| j                         }| j                         |_        d|v r
|d   |_        d|v r|d   |j                  _        d|v r|d   |j                  _        |j                  |       x |S )zParses the disk data into client messages.

    Args:
      client_messages:
      disks: A list of dictionaries containing the disk data

    Returns:
      List of parsed client messages for Disk
    Nzdevice-namenamezreplica-zones)r"   AttachedDiskInitializeParamsinitializeParams
deviceNamediskNamereplicaZonesr>   )r   rT   r@   diskrA   s        r   ParserDiskszComputeUtil.ParserDisks   s     }vH,,.g!0!A!A!Cg	$	!-0	4,0L  )	D	 04_0E  -oog  Or   metadatac           
          | j                  |j                         D cg c]  \  }}| j                  ||       c}}      S c c}}w )zParses the metadata data into client messages.

    Args:
      client_messages:
      metadata: A dictionary containing the metadata

    Returns:
      List of parsed client messages for Metadata
    keyvalue)items)Metadatard   Entry)r   r_   rb   rc   s       r   ParseMetadatazComputeUtil.ParseMetadata   sY     ## 'nn.
.
U !!c!7.
 $  
s   A
labelsc           
          | j                   j                  |j                         D cg c],  \  }}| j                   j                  j                  ||      . c}}      S c c}}w zParses the labels data into client messages.

    Args:
      client_messages:
      labels: A dictionary containing the labels

    Returns:
      List of parsed client messages for Labels
    ra   )additionalProperties) ComputeInstanceRestorePropertiesLabelsValuerd   AdditionalPropertyr   rh   rb   rc   s       r   ParseLabelszComputeUtil.ParseLabels   su     ;;GG
 %lln	
 -
U <<HH[[u \  -	
 H  
   1A#
enable_uefi_networkingthreads_per_corevisible_core_countc                 j    |||y| j                         }|||_        |||_        |||_        |S )a  Parses the advanced machine features data into client messages.

    Args:
      client_messages:
      enable_uefi_networking:
      threads_per_core:
      visible_core_count:

    Returns:
      List of parsed client messages for AdvancedMachineFeatures
    N)AdvancedMachineFeaturesenableUefiNetworkingthreadsPerCorevisibleCoreCount)r   rr   rs   rt   rA   s        r   ParseAdvancedMachineFeaturesz(ComputeUtil.ParseAdvancedMachineFeatures   sV    & 	&$&557G)%;g"#/g%!3gNr   acceleratorc                 ^    |d|vry| j                  |d   |j                  dd            gS )zParses the accelerator data into client messages.

    Args:
      client_messages:
      accelerator: A dictionaries containing the accelerator data

    Returns:
      List of parsed client messages for Accelerator
    Nr9   count   )acceleratorTypeacceleratorCount)AcceleratorConfigrK   )r   r{   s     r   ParseAcceleratorzComputeUtil.ParseAccelerator  sI     fK7 	))'/(__Wa8 	* 	
 r   c                       e Zd ZdZy)&ComputeUtil.NodeAffinityFileParseErrorz6Error raised when node affinity file cannot be parsed.N)__name__
__module____qualname____doc__r   r   r   NodeAffinityFileParseErrorr   2  s    @r   r   	file_pathc                 z   |yt        j                  |      }t        j                  |      }|st        j                  d      g }|D ]  }|st        j                  d      	 t        j                  | j                  |      }|j                  st        j                  d      |j                         r=t        j                  dj                  |j                  |j                                     |j                  |        |S # t        $ r*}t        j                  dj                  |            |d}~ww xY w)a  Parses the node affinity data from file into client messages.

    Args:
      client_messages:
      file_path: A path to the file containing the node affinity data.

    Returns:
      List of parsed client messages for NodeAffinity

    Raises:
      NodeAffinityFileParseError:
    NziNo node affinity labels specified. You must specify at least one label to create a sole tenancy instance.z"Empty list item in JSON/YAML file.z6Failed to parse node affinity values from the file {}.z6A key must be specified for every node affinity label.z,Key [{0}] has invalid field formats for: {1})r   ReadFileContentsr   loadr   r   r	   PyValueToMessageNodeAffinity	Exceptionformatrb   all_unrecognized_fieldsr>   )r   r   node_affinities_fileaffinities_yamlnode_affinitiesaffinitynode_affinityes           r   GetNodeAffinitiesFromFilez%ComputeUtil.GetNodeAffinitiesFromFile5  sI   "  11)<ii 45O225 
 O#440
 	
	 11(((
 44D
 	
 
	.	.	044:AA!!=#H#H#J
 	

 ]+3 $4 #  44DKK
 		s   $ D	D:%D55D:z'compute.googleapis.com/reservation-namereservation_affinityreservationc                    |y|dk(  r0| j                  | j                   j                  j                        S |dk(  r0| j                  | j                   j                  j                        S |dk(  rY|t	        j
                  dd      | j                  | j                   j                  j                  t        j                  |g      S y)	aF  Parses the reservation affinity data into client messages.

    Args:
      client_messages:
      reservation_affinity: type of reservation affinity
      reservation: name of the specific reservation

    Returns:
      List of parsed client messages for ReservationAffinity

    Raises:
      InvalidArgumentException:
    Nany)consumeReservationTypenonespecificr   z9Reservation is required for specific reservation affinity)r   rb   values)	AllocationAffinity%ConsumeReservationTypeValueValuesEnumANY_RESERVATIONNO_RESERVATIONr   r)   SPECIFIC_RESERVATIONr   RESERVATION_AFFINITY_KEY)r   r   r   s      r   ParseReservationAffinityz$ComputeUtil.ParseReservationAffinityp  s    & #u$//!0!C!C!i!i!y!y 0   v%//!0!C!C!i!i!x!x 0   z)		11G
 	
 //!0!C!C!i!i!~!~22 0  
 r   N)r   r   r   r   staticmethodr   strr   boolr   r   types
ModuleTyperD   r   rS   r^   rg   rp   intrz   r   core_exceptionsErrorr   r   r   r   r   r   r   r   r   !   s7   98d38n 8 8 8 *d38n * * * g''g gR '':=GKCy > ''04T#s(^0D 6 ''37S> & 5#3#3 T#s(^  & ''"  	 @ ''6:38n ,A?#8#8 A 6''6476 6p G*''** * *r   r   c                   H    e Zd ZdZedej                  deee	f   fd       Z
y)DiskUtilzUtil class for Restoring Disk.r   rh   c           
          | j                   j                  |j                         D cg c],  \  }}| j                   j                  j                  ||      . c}}      S c c}}w rj   )DiskRestorePropertiesrm   rd   rn   ro   s       r   rp   zDiskUtil.ParseLabels  st     00<<
 %lln	
 -
U 11==PPu Q  -	
 =  
rq   N)r   r   r   r   r   r   r   r   r   r   rp   r   r   r   r   r     s3    &5#3#3 T#s(^  r   r   )r   
__future__r   r   r   r   typingr   r   r   apitools.base.pyr	   googlecloudsdk.api_lib.computer
   r   rI   googlecloudsdk.callioper   googlecloudsdk.corer   r   googlecloudsdk.core.utilr   objectr   r   r   r   r   <module>r      sL    8 &  '  " " % ? I . = $ *z& zzv r   