
    7B                        S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKrS	\S
\4S jrS	\S
\4S jrS rSS jr SS jrSS jrS rSS jrSS jrS S jrSS jrS S jrS rS rS rSS jr  SS jrSS jr SS jr!g)!z"Helper functions for DNS commands.    )absolute_import)division)unicode_literals)util)apis)flagsNipreturnc                 R     [         R                  " U 5        g! [         a     gf = f)zReturns True if ip is an IPv4.TF)ipaddrIPv4Address
ValueErrorr	   s    *lib/googlecloudsdk/command_lib/dns/util.pyIsIPv4r      *    
r	     
&&c                 R     [         R                  " U 5        g! [         a     gf = f)zReturns True if ip is an IPv6.TF)r   IPv6Addressr   r   s    r   IsIPv6r   %   r   r   c                     SnU c  UbG  0 nX%S'   U b  UR                   R                  U 5      US'   Ub  XS'   U(       a  UR                   " S0 UD6nU$ )aY  Generate a keyspec from the given (unparsed) command line arguments.

Args:
  algorithm: (str) String mnemonic for the DNSSEC algorithm to be specified in
      the keyspec; must be a value from AlgorithmValueValuesEnum.
  key_length: (int) The key length value to include in the keyspec.
  key_type: (KeyTypeValueValuesEnum) Enum value for whether to create a
      keyspec for a KSK or a ZSK.
  messages: (module) Module (generally auto-generated by the API build rules)
      containing the API client's message classes.

Returns:
  A messages.DnsKeySpec instance created from the given arguments.
NkeyType	algorithm	keyLength )
DnsKeySpecAlgorithmValueValuesEnum)r   
key_lengthkey_typemessageskey_spec	spec_argss         r   ParseKeyr#   .   sn      (j4I#i'22KK
 i)$$1y1h	/    c                 (   Sn/ nSnU R                   (       a0  [        R                  " SU5      R                  U R                   5      nSnU R                  (       a0  [        R                  " SU5      R                  U R                  5      nUS:X  a!  UR
                  R                  R                  nO UR
                  R                  R                  n[        XPR                  Xq5      nUb  UR                  U5        US:X  a!  UR
                  R                  R                  nO UR
                  R                  R                  n[        X`R                  Xq5      n	U	b  UR                  U	5        0 n
U(       a  XJS'   [        U SS5      b2  [        R                   " U5      R                  U R"                  5      U
S'   U R$                  b2  [        R&                  " X5      R                  U R$                  5      U
S'   U
(       a  UR(                  " S	0 U
D6nU$ )
a  Parse all relevant command line arguments and generate a DNSSEC config.

Args:
  args: (dict{str,(str|int)}) Dict of command line arguments; value type
    dependent on particular command line argument.
  messages: (module) Module (generally auto-generated by the API build rules)
    containing the API client's message classes.
  api_version: api_version that this function should use.

Returns:
  A messages.ManagedZoneDnsSecConfig instance populated from the given
  command line arguments.
Nkskzskv2defaultKeySpecsdenial_of_existencenonExistencestater   )ksk_algorithmr   GetKeyAlgorithmFlagMapperGetEnumForChoicezsk_algorithmr   KeyTypeValueValuesEnumKEY_SIGNING
keySigningr#   ksk_key_lengthappendZONE_SIGNINGzoneSigningzsk_key_lengthgetattrGetDoeFlagMapperr*   dnssec_stateGetDnsSecStateFlagMapperManagedZoneDnsSecConfig)argsr    api_versiondnssec_config	key_specsr-   r0   key_enumksk_keyzsk_keydnssec_config_argss              r   ParseDnssecConfigArgsrF   O   s     -)-	33 t))*  -	33 t))* 
 D""99EEH""99DDH]$7$7L'WD""99FFH""99EEH]$7$7L'W,5()T($/;x(99$$	& ~& 
""'"@"@#t(() w 44J7IJM	r$   c           
         / nU R                   R                  S5      nU R                   R                  S5      nUb  U H  n[        U5      (       a"  UR                  U R                  USUS95        M5  [	        U5      (       a!  UR                  U R                  SXdS95        Mf  UR                  U R                  SSUUS95        M     Ub  U H  n[        U5      (       a"  UR                  U R                  USUS95        M5  [	        U5      (       a"  UR                  U R                  SUUS95        Mg  UR                  U R                  SSUUS95        M     U R                  US9$ )av  Parses list of forwarding nameservers into ManagedZoneForwardingConfig.

Args:
  messages: (module) Module (generally auto-generated by the API build rules)
    containing the API client's message classes.
  server_list: (list) List of IP addresses to use as forwarding targets for
    the DNS Managed Zone that uses default forwarding logic (based on RFC1918
    check).
  private_server_list: (list) List of IP addresses to use as forwarding
    targets for the DNS Managed Zone that always use the private VPC path.

Returns:
  A messages.ManagedZoneForwardingConfig instance populated from the given
  command line arguments.
r      Nipv4Addressipv6AddressforwardingPath)rJ   rK   
domainNamerL   targetNameServers)+ManagedZoneForwardingConfigNameServerTargetForwardingPathValueValuesEnumr   r5   r   ManagedZoneForwardingConfig)r    server_listprivate_server_listtarget_serversdefault_enumprivate_enumnames          r   2ParseManagedZoneForwardingConfigWithForwardingPathrY      s   " .EEcc	,EEcc	,	@@ d< A 	

 $<<@@ d A 	
 	@@  +	 A 	
 , $#	@@ d+ A -	. $<<@@ d+ A -	.
 	@@  +	 A 	
 $* 
	-	-	-	OOr$   c                     [        U5      nU (       d  / $ U  Vs/ s H   nUR                  UR                  5       S9PM"     sn$ s  snf z.Build PolicyNetwork message from parsed_value.)
networkUrl)GetMessagesPolicyNetworkSelfLinkparsed_valueversionr    network_refs       r   PolicyNetworkProcessorrd      sT     !(	I &
%+ (<(<(>?%
  
   'Ac                     [        U SS9$ )z3Build Beta PolicyNetwork message from parsed_value.v1beta2rb   )rd   )ra   s    r   BetaPolicyNetworkProcessorri      s     
 i	@@r$   c                     [        U5      nU (       d  / $ U  Vs/ s H   nUR                  UR                  5       S9PM"     sn$ s  snf r[   )r]   ResponsePolicyNetworkr_   r`   s       r   ResponsePolicyNetworkProcessorrl      sT     !(	I &
%+ $$0D0D0F$G%
  
re   c                     [        U5      n[        U 5      (       a*  UR                  U SUR                  R                  S5      S9$ UR                  SU UR                  R                  S5      S9$ )a  Build a single TargetNameServer based on 'value'.

Args:
  value: (str) A string representation of an IPV4 ip address representing the
    PrivateTargetNameServer.
  version: (str) A string indicating the version of the API to be used, should
    be 'v1' only before removing BetaTargetNameServerType.

Returns:
  A messages.PolicyAlternativeNameServerConfigTargetNameServer instance
  populated from the given ip address.
Nr   rI   r]   r   1PolicyAlternativeNameServerConfigTargetNameServerrQ   valuerb   r    s      r   TargetNameServerTyperr           !(E]]EEQQoo
 F   EEQQoo
 F  r$   c                     [        U5      n[        U 5      (       a*  UR                  U SUR                  R                  S5      S9$ UR                  SU UR                  R                  S5      S9$ )a  Build a single TargetNameServer based on 'value'.

Args:
  value: (str) A string representation of an IPV4 ip address representing the
    PrivateTargetNameServer.
  version: (str) A string indicating the version of the API to be used, should
    be one of 'v1beta2' or 'v1alpha2'. This function will be removed after
    promoting v6 address to GA.

Returns:
  A messages.PolicyAlternativeNameServerConfigTargetNameServer instance
  populated from the given ip address.
Nr   rI   rn   rp   s      r   BetaTargetNameServerTyperu          !(E]]EE	:	:	&	&q	) F + + EE	:	:	&	&q	) F + +r$   c                     [        U5      n[        U 5      (       a*  UR                  U SUR                  R                  S5      S9$ UR                  SU UR                  R                  S5      S9$ )a  Build a single PrivateTargetNameServer based on 'value'.

Args:
  value: (str) A string representation of an IPV4 ip address representing the
    PrivateTargetNameServer.
  version: (str) A string indicating the version of the API to be used, should
    be 'v1' only before removing BetaPrivateTargetNameServerType.

Returns:
  A messages.PolicyAlternativeNameServerConfigTargetNameServer instance
  populated from the given ip address.
NrH   rI   rn   rp   s      r   PrivateTargetNameServerTyperx   6  rs   r$   c                     [        U5      n[        U 5      (       a*  UR                  U SUR                  R                  S5      S9$ UR                  SU UR                  R                  S5      S9$ )a  Build a single PrivateTargetNameServer based on 'value'.

Args:
  value: (str) A string representation of an IPV4 ip address representing the
    PrivateTargetNameServer.
  version: (str) A string indicating the version of the API to be used, should
    be one of 'v1beta2' or 'v1alpha2'. This function will be removed after
    promoting v6 address to GA.

Returns:
  A messages.PolicyAlternativeNameServerConfigTargetNameServer instance
  populated from the given ip address.
NrH   rI   rn   rp   s      r   BetaPrivateTargetNameServerTyperz   V  rv   r$   c                 0    [        XU5      n[        X25      $ )z6Build a list of PolicyNetworks from command line args.)ParseNetworksrd   rq   projectrb   networkss       r   ParsePolicyNetworksr   u  s    573(		22r$   c           	          U (       d  / $ [         R                  " U5      nU  Vs/ s H  nUR                  USSU0S9PM     nnU$ s  snf )zPBuild a list of PolicyNetworks or ResponsePolicyNetworks from command line args.zcompute.networksr~   )
collectionparams)api_utilGetRegistryParse)rq   r~   rb   registrynetwork_namer   s         r   r|   r|   {  sk    	I!!'*(
 <A	 <A< nn
'W%  ' <A	   
/s   Ac                 0    [        XU5      n[        X25      $ )z>Build a list of ResponsePolicyNetworks from command line args.)r|   rl   r}   s       r   ParseResponsePolicyNetworksr     s    573(	'	::r$   c                    U(       d  U(       d  g[        U 5      n/ nU(       a  XA Vs/ s H  n[        XP5      PM     sn-  nU(       a  UU Vs/ s H  n[        XP5      PM     sn-  nUR                  US9$ s  snf s  snf )a  Parses list of alternative nameservers into AlternativeNameServerConfig.

Args:
  version: (str) A string indicating the version of the API to be used, should
    be 'v1' only before removing BetaParseAltNameServers.
  server_list: (Sequence) List of IP addresses to use as forwarding targets
    for the DNS managed zone that uses default forwarding logic.
  private_server_list: (Sequence) List of IP addresses to use as forwarding
    targets for the DNS Managed Zone that always uses the private VPC path.

Returns:
  A messages.PolicyAlternativeNameServerConfig instance populated from the
  given command line arguments.Only the not none server list will be parsed
  and
  an empty list will be returned if both are none.
NrN   )r]   rr   rx   !PolicyAlternativeNameServerConfigrb   rS   rT   r    result_listr	   s         r   ParseAltNameServersr     s    " 
0!(+L"(5LLK;N;NR#B0;N K 
	3	3# 
4 
% % M   A7A<c                    U(       d  U(       d  g[        U 5      n/ nU(       a  XA Vs/ s H  n[        XP5      PM     sn-  nU(       a  UU Vs/ s H  n[        XP5      PM     sn-  nUR                  US9$ s  snf s  snf )a  Parses list of alternative nameservers into AlternativeNameServerConfig.

Args:
  version: (str) A string indicating the version of the API to be used, should
    be one of 'v1beta2' or 'v1alpha2'. This function will be moved after
    promoting v6 address to GA.
  server_list: (Sequence) List of IP addresses to use as forwarding targets
    for the DNS Managed Zone that uses default forwarding logic.
  private_server_list: (Sequence) List of IP addresses to use as forwarding
    targets for the DNS Managed Zone that always uses the private VPC path.

Returns:
  A messages.PolicyAlternativeNameServerConfig instance populated from the
  given command line arguments.Only the not none server list will be parsed
  and
  an empty list will be returned if both are none.
NrN   )r]   ru   rz   r   r   s         r   BetaParseAltNameServersr     s    ( 
0!(+KPKb,R9KPPK%%B 	(4% K 
	3	3# 
4 
% % Qr   c                     [        U5      nU R                  S:X  aF  US:X  a   UR                  R                  R                  $ UR                  R                  R
                  $ g)z%Parses response policy rule behavior.bypassResponsePolicyr(   N)r]   behaviorResponsePolicyRuleBehaviorValueValuesEnumBYPASS_RESPONSE_POLICYr   )r>   rb   ms      r    ParseResponsePolicyRulesBehaviorr     sj    '!	]],,RY]aRa177NN  ighg{g{  hT  hT  hi  hi  ir$   c                 0    [         R                  " SU 5      $ )Ndns)r   GetMessagesModulerh   s    r   r]   r]     s    			w	//r$   )v1)NN)rg   )"__doc__
__future__r   r   r   googlecloudsdk.api_lib.dnsr   r   googlecloudsdk.api_lib.utilr   googlecloudsdk.command_lib.dnsr   r   strboolr   r   r#   rF   rY   rd   ri   rl   rr   ru   rx   rz   r   r|   r   r   r   r   r]   r   r$   r   <module>r      s    ) &  ' 7 , 0 s t s t B@H 59CPL
A
@+>@+>3;%@ )-04 %F0r$   